Repository navigation
feat(cloud): publish a folder as a Deepnote app - #609
Draft
Conversation
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## tomaskislan/blu-6519-sync-a-local-folder-with-deepnote-cloud-from-the-extension #609 +/- ##
================================================================================================================
Coverage 38% 38%
================================================================================================================
Files 826 829 +3
Lines 41427 41631 +204
Branches 9115 9152 +37
================================================================================================================
+ Hits 15952 16140 +188
- Misses 23395 23407 +12
- Partials 2080 2084 +4
🚀 New features to boost your workflow:
|
Add "Deepnote: Publish App…", from the Command Palette and the file
explorer's folder context menu. It publishes a folder with publishApp
from @deepnote/cloud-sync into a project's app folder and shows the app
URL with Open and Copy. The project comes from the sync manifest when
the folder is inside a synced project, and from the workspace's project
list otherwise. The project and the API-access choice are saved per
folder in workspace state.
When app files changed in Deepnote since the last sync, a modal offers
Force, which publishes again with force, and Sync First, which runs
"Sync with Deepnote Cloud" for the sync root with working files. For
this, deepnote.syncWithDeepnoteCloud takes an optional { root, allFiles }
argument and resolves its result.
A lock shared by sync and every publish into a synced folder replaces
the sync command's private in-progress flag, so the two never write
the sync manifest at the same time.
The mock serves the routes publishApp calls: GET and PATCH
/v2/projects/{id}, and POST and DELETE /v2/files. Working files live in
each project's files/ directory; sharing settings are kept in memory.
An upload to a taken path is stored at a new path, as Deepnote does.
The new suite publishes a folder from the explorer context menu,
republishes it with the saved settings, and resolves an app file edited
in the mock with Force. setApiToken moves to a shared helper.
tkislan
force-pushed
the
tomaskislan/blu-6520-publish-a-folder-as-a-deepnote-app
branch
from
November 7, 2026 16:24
bb5748f to
61f9311
Compare
tkislan
added a commit
to deepnote/deepnote
that referenced
this pull request
Nov 8, 2026
…hing
The mock now stores a project's static-file sharing and API access
settings in memory, and GET /v2/projects/{projectId} reports them, so
publishApp runs against it end to end. Enabling API access without
sharing gets a 400, and disabling sharing disables API access, as in
vscode-deepnote's e2e mock (deepnote/vscode-deepnote#609).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Y9ynBkZNNHhdxuKcXL5Es
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
@coderabbitai ignore
Summary
Adds "Deepnote: Publish App…", run from the Command Palette or from a folder's context menu in the file explorer. It publishes the folder with
publishAppfrom@deepnote/cloud-syncinto a Deepnote project's app folder, then shows the app URL with "Open" and "Copy".showCloudError.PublishDivergedError): a modal lists the paths and offers two choices; dismissing it changes nothing.force: true..files/_deepnote_staticfolder that now holds Deepnote's versions. If the sync did not download the project's files, it says so instead.deepnote.syncWithDeepnoteCloudtakes an optional{ root, allFiles }argument.WorkspaceSyncResult.allFiles: false.IDeepnoteCloudOperationLock) replaces the sync command's private in-progress flag..deepnote-sync.jsonat the same time.test/e2e/helpers/mockDeepnoteCloud.tsnow serves the routespublishAppcalls:GETandPATCH /v2/projects/{id}, andPOSTandDELETE /v2/files. Multipart is parsed with Node's built-inRequest.formData(), so no new dependency.publishApp.e2e.test.tsin thecloudgroup:Closes #608
Builds on #601 (BLU-6519, sync), which builds on #563 (BLU-6518, the token service). Both must merge first.
Deviations from the issue
syncWorkspacehas no per-project filter, so a project with a working file over 100 MiB makes that sync fail. The issue's wording implied only the app files come down..env.*files are refused too;.envtoken wins over the saved one.](in the project name before it goes into the non-modal warning, as the token service does for workspace names. Notifications render[label](command:…)as runnable links, and the name comes from the API.working-files-changedconflicts: they are still skipped, but no longer logged as "unexpected". Sync already warns which files it kept.PATCHvalidation errors with 400, as the API spec does, not 422.result.errorsare not logged a second time, because each one already arrived as a loggedoperation-failedevent.commandPaletteentry:enablementalready hides the command there, as for "Sync with Deepnote Cloud".finally.skipped-conflictSync First case was cut, because it covers the same code path as thepushedcase.Team/SalesArchive), an unreadable manifest, exactly ten changed paths, and the link neutralization.explorer.compactFolders, because a compactedSales/approw publishesSales.Verification
npm run typecheck,npm run lint(no findings in the changed files),npm run formatandnpm run spell-checkall pass.npm test: 3025 passing, 0 failing.cloudgroup (19 tests, 3 of them new publish tests) passed in two consecutive runs with the final code, under Xvfb. The publish suite alone passed four more runs in a row.Not verified
!deepnote.webExtensionis true until the extension activates. So in vscode.dev the context-menu entry can show before activation, and clicking it fails with "command not found". The existing commands use the same condition.publishApp's message. That message suggests the CLI flag--no-sync-root.