Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
f0de6cd
refactor(deepnote): re-key notebook manager per (projectId, notebookI…
tkislan Jun 23, 2026
005accf
refactor(deepnote): render single notebook + serialize by metadata, d…
tkislan Jun 23, 2026
0ee7f53
feat(deepnote): split legacy multi-notebook files into single-noteboo…
tkislan Jun 23, 2026
8e27889
feat(deepnote): propagate project metadata across sibling files on disk
tkislan Jun 23, 2026
3995237
feat(deepnote): group the explorer by project and add a notebook stat…
tkislan Jun 24, 2026
3e16e20
refactor(deepnote): key the Jupyter server and environment per notebook
tkislan Jun 24, 2026
83d4e91
feat(deepnote): scope snapshots per notebook with a backward-compatib…
tkislan Jun 24, 2026
faa8432
feat(deepnote): run the init notebook per kernel from its sibling file
tkislan Jun 24, 2026
4a43a7d
fix(deepnote): satisfy lint and spell-check on the migration branch
tkislan Jun 24, 2026
f92d173
test(deepnote): use the real @deepnote/convert in unit tests instead …
tkislan Jun 24, 2026
6532d96
fix(deepnote): address code-review findings on the snapshot/serialize…
tkislan Jun 24, 2026
6d46725
fix(deepnote): exact snapshot lookup in the file watcher + close-canc…
tkislan Jun 26, 2026
21611db
refactor(deepnote): remove metadata propagation and project-level exp…
tkislan Jun 30, 2026
7814c6b
Merge origin/main into tk/single-notebook
tkislan Jun 30, 2026
663d31d
Revert unnecessary renamings
tkislan Jun 30, 2026
1643ef5
fix(deepnote): trim indented bullet content before stripping markdown
tkislan Jun 30, 2026
be64263
refactor(deepnote): import convert helpers directly, drop snapshotFil…
tkislan Jun 30, 2026
589845d
refactor(deepnote): update buildSnapshotPath to use object destructuring
tkislan Jun 30, 2026
3a910c1
test(deepnote): remove redundant subagent-written tests
tkislan Jun 30, 2026
dc0b2dd
Merge remote-tracking branch 'origin/main' into tk/single-notebook
tkislan Jul 1, 2026
ee38cf6
feat(deepnote): retire the split-away original as a .legacy backup
tkislan Jul 1, 2026
8c341e0
test(e2e): add multi-notebook split test with per-spec screenshots
tkislan Jul 1, 2026
c0cb36a
test(e2e): add single-notebook-open and init-notebook split/runner su…
tkislan Jul 1, 2026
9395179
test(e2e): add Explorer project-grouping suite
tkislan Jul 1, 2026
05fc076
fix(e2e): open the workspace folder reliably across multiple suites
tkislan Jul 1, 2026
4615f56
test(e2e): add active-notebook status bar suite
tkislan Jul 1, 2026
97e433a
test(e2e): add notebook-management command suite
tkislan Jul 1, 2026
7fba16e
test(e2e): add integrations UI suite
tkislan Jul 1, 2026
ebef08b
test(e2e): add project-rename fan-out suite
tkislan Jul 1, 2026
fc7c4eb
test(e2e): add init-only file edge-case suite
tkislan Jul 1, 2026
f38f3b0
test(e2e): add split-prompt safety suite
tkislan Jul 1, 2026
e6cfcda
test(e2e): add snapshots suite
tkislan Jul 1, 2026
892c625
test(e2e): add environment suite
tkislan Jul 1, 2026
af467d4
test(e2e): implement G2 — env delete stops a closed notebook's server
tkislan Jul 2, 2026
54b5592
fix(deepnote): honour files.enableTrash when deleting a notebook
tkislan Jul 2, 2026
683b87d
test(e2e): strengthen assertions flagged by review (F1-F3, F6-F7)
tkislan Jul 2, 2026
d82c185
docs(deepnote): trim redundant comments across the PR
tkislan Jul 2, 2026
743b1af
test(e2e): add file-watcher suite
tkislan Jul 2, 2026
f8065e1
refactor(deepnote): update file key handling and clean up comments
tkislan Jul 2, 2026
5502f34
test(deepnote): stub isServerRunning with sinon instead of manual rea…
tkislan Jul 2, 2026
81399f8
fix(deepnote): render init-only files as openable leaves and reveal t…
tkislan Jul 2, 2026
96f4b10
fix(deepnote): key the tree file caches by uri.toString() for cross-p…
tkislan Jul 2, 2026
54cc7e6
fix(deepnote): harden Jupyter import and report partial rename failures
tkislan Jul 2, 2026
ffc3ff8
fix(deepnote): clean up orphaned sibling files when a split write fails
tkislan Jul 2, 2026
c49d234
fix(deepnote): harden kernel and snapshot lifecycle
tkislan Jul 2, 2026
ac49c7d
fix(deepnote): mention notebook ID in the integrations error message
tkislan Jul 2, 2026
f9b4874
test(e2e): extract magic delays and dedup shared helpers
tkislan Jul 2, 2026
2bd8f3e
test(e2e): assert init-only file renders as an openable notebook leaf
tkislan Jul 3, 2026
8994093
fix(deepnote): unregister the old server handle only after a switch s…
tkislan Jul 3, 2026
9534176
fix(deepnote): resolve the init notebook for init-only leaf commands
tkislan Jul 3, 2026
cd0d8e2
fix(deepnote): implement getParent so Reveal in Explorer works
tkislan Jul 3, 2026
36fc854
fix(deepnote): report the accurate imported-notebook count on partial…
tkislan Jul 3, 2026
cc43096
test(e2e): use NOTEBOOK_NAME in the init-only delete toast assertion
tkislan Jul 3, 2026
854c6cb
docs(deepnote): trim comments in the latest review-fix changes
tkislan Jul 7, 2026
f5d7b08
docs: sweep comments across the full PR diff
tkislan Jul 8, 2026
b306773
chore: restore preLaunchTask in launch.json
tkislan Jul 8, 2026
d9c313e
chore(cspell): drop the PR's dictionary additions and reword instead
tkislan Jul 8, 2026
67ca8e7
docs: revert comment churn on unchanged code
tkislan Jul 8, 2026
14769f9
test(deepnote): type the server-starter test's private access through…
tkislan Jul 8, 2026
5c74813
test(deepnote): replace force casts with typed seams across the PR's …
tkislan Jul 8, 2026
a90c632
refactor(deepnote): shrink test mirrors — publicize helper, extract b…
tkislan Jul 9, 2026
951daf6
refactor(deepnote): extract ExecutionMetadataTracker from SnapshotSer…
tkislan Jul 9, 2026
ea42807
refactor(deepnote): extract IServerHandleRegistry from the kernel aut…
tkislan Jul 9, 2026
72677c4
test(deepnote): use deepStrictEqual for tracker summary assertions
tkislan Jul 9, 2026
ffd1bc7
test(deepnote): replace runtime-core inline mock with a typed mock mo…
tkislan Jul 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ vscode.d.ts
vscode.proposed.*.d.ts
xunit-test-results.xml
tsconfig.tsbuildinfo
/testing

# ExTester (vscode-extension-tester) E2E artifacts
test-resources
Expand Down
50 changes: 7 additions & 43 deletions build/mocha-esm-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const projectRoot = path.join(__dirname, '..');
const projectOutUrl = pathToFileURL(path.join(projectRoot, 'out')).href + '/';
const vscodeMockPath = pathToFileURL(path.join(projectRoot, 'out/test/vscode-mock.js')).href;
const telemetryMockPath = pathToFileURL(path.join(projectRoot, 'out/test/mocks/vsc/telemetryReporter.js')).href;
const runtimeCoreMockPath = pathToFileURL(path.join(projectRoot, 'out/test/mocks/deepnoteRuntimeCore.js')).href;

// Mock source for @vscode/python-extension - used in multiple places
const PYTHON_EXTENSION_MOCK = `
Expand Down Expand Up @@ -104,11 +105,12 @@ export async function resolve(specifier, context, nextResolve) {
};
}

// Intercept @deepnote/convert - needed because the real package performs file I/O
// that we need to control in tests
if (specifier === '@deepnote/convert') {
// Intercept @deepnote/runtime-core - the real startServer/stopServer spawn/kill Python
// processes. Resolves to the compiled typed mock (src/test/mocks/deepnoteRuntimeCore.ts)
// so the code under test and tests importing its __ helpers share one module instance.
if (specifier === '@deepnote/runtime-core') {
return {
url: 'vscode-mock:///deepnote-convert',
url: runtimeCoreMockPath,
shortCircuit: true
};
}
Expand Down Expand Up @@ -328,6 +330,7 @@ export async function load(url, context, nextLoad) {
export const NotebookRendererMessaging = createClassProxy('NotebookRendererMessaging');
export const NotebookRendererScript = createClassProxy('NotebookRendererScript');
export const NotebookVariableProvider = createClassProxy('NotebookVariableProvider');
export const TabInputNotebook = createClassProxy('TabInputNotebook');
export const ColorThemeKind = createClassProxy('ColorThemeKind');
export const UIKind = createClassProxy('UIKind');
export const ThemeIcon = createClassProxy('ThemeIcon');
Expand All @@ -352,45 +355,6 @@ export async function load(url, context, nextLoad) {
};
}

// Handle deepnote convert mock - needed because the real package performs file I/O
if (moduleName === 'deepnote-convert') {
return {
format: 'module',
source: `
export const convertIpynbFilesToDeepnoteFile = async () => {
// Mock implementation - does nothing in tests
};

export const convertDeepnoteToJupyterNotebooks = (deepnoteFile) => {
// Mock implementation that converts Deepnote notebooks to Jupyter format
const notebooks = deepnoteFile?.project?.notebooks || [];
return notebooks.map(nb => ({
filename: nb.name.replace(/[<>:"/\\\\|?*]/g, '_').replace(/\\s+/g, '-') + '.ipynb',
notebook: {
cells: (nb.blocks || []).map(block => ({
cell_type: block.type === 'markdown' ? 'markdown' : 'code',
source: block.content || '',
metadata: {
deepnote_cell_type: block.type,
cell_id: block.id
},
outputs: block.outputs || []
})),
metadata: {
deepnote_notebook_id: nb.id,
deepnote_notebook_name: nb.name,
deepnote_execution_mode: nb.executionMode
},
nbformat: 4,
nbformat_minor: 5
}
}));
};
`,
shortCircuit: true
};
}

// Handle @vscode/python-extension mock - needed because it requires VS Code runtime
if (moduleName === 'python-extension') {
return {
Expand Down
Loading
Loading