René's URL Explorer Experiment


Title: fix(cli,skill): let sync and publish share one baseline, and add an app-models reference by jamesbhobbs · Pull Request #508 · deepnote/deepnote · GitHub

Open Graph Title: fix(cli,skill): let sync and publish share one baseline, and add an app-models reference by jamesbhobbs · Pull Request #508 · deepnote/deepnote

X Title: fix(cli,skill): let sync and publish share one baseline, and add an app-models reference by jamesbhobbs · Pull Request #508 · deepnote/deepnote

Description: Two strands, both about the same confusion: which command owns a project's files, and which app model a given deliverable actually is. packages/ — sync and publish stop overwriting each other's writes to the project file store. skills/ — a canonical reference for Deepnote's app models, and a corrected skill sync map in AGENTS.md. deepnote static-site access — change a published site's sharing and viewer API access without republishing (section at the end). 1. Sync and publish share one baseline The conflict deepnote publish deploys into _deepnote_static/**, which is a subtree of the project file store that deepnote sync --all-files mirrors. Neither command knew the other existed — STATIC_ROOT was a private const in publish.ts, and sync claimed the entire inventory. Four consequences: Guaranteed churn. Publish never touched sync's manifest, so after every publish the whole static subtree looked changed and the next sync --all-files re-downloaded the built site into .files/. Push could regress a live site. uploadProjectFiles never fetched the inventory at all — it was documented "last-write-wins, no staleness check", with no equivalent of the baseModifiedAt/baseContentHash protection the notebook path gets. --prune produced ghosts. publish --prune removed a remote asset; sync's local copy still hash-matched the manifest so push skipped it, leaving it on disk forever and resurrecting it in the cloud on the next edit. Round-trip loop. dist/ → publish → cloud → sync pull → .files/ → git → sync push → cloud. The fix Coordination, not partition — both commands keep writing the same paths. Sync gains per-file lost-update protection on push. Every candidate is now checked against the cloud inventory, and a file that moved since the manifest baseline goes through the existing --on-conflict override-or-skip choice instead of being overwritten. Reported as N file(s) kept from Deepnote / filesSkipped. This is the load-bearing part: publish often runs from CI where no manifest exists, and the Deepnote app can write these paths too. It also fixes the same silent overwrite for ordinary working files (requirements.txt edited in the app was clobbered before). Publish updates the sync mirror when the published directory sits inside a synced workspace: it writes each file into the project's .files/ mirror and records size, hash, and server updatedAt, exactly as a sync download would. Manifest, mirror, and cloud then agree, so sync sees the deploy as already in step. --prune drops pruned paths from both. --sync-root

/ --no-sync-root control discovery, which otherwise walks up from the published directory. Publish stops before mutating anything if a path it would write has moved on in Deepnote since that workspace last synced — the mirror holds no copy of that content. --force overrides. Its check is deliberately narrower than sync's: sync is a mirror where both sides are authoritative, publish is a deploy where the local build is authoritative, so a path with no baseline is not flagged (that's the normal state of a static root written by earlier publishes, and flagging it would break the first publish in every workspace). PROJECT_STATIC_ROOT moves to @deepnote/cloud so every writer agrees on where the boundary is. Edge cases handled A pending replacement is exempt from the conflict check — that missing cloud copy is sync's own unfinished delete, not another writer's deletion. Without this, every interrupted upload would become a false conflict. The mirror is only updated when the tracked project directory already exists. Creating it would flip readLocalNotebookFiles from null to [], which sync reads as "every notebook was deleted locally" and pushes. Leaving the baseline stale is safe: the next sync pulls once and converges. A record written before updatedAt was tracked has no baseline to compare, so it still overwrites (rather than manufacturing conflicts for existing users) and becomes verifiable after the next pull. Mirror failures are warnings, not errors — the deploy already succeeded, and a stale manifest is safe because the next sync brings the mirror back in step (a pull re-downloads the published files, a push surfaces them as a conflict). Push hashes files in one pass and re-reads them at upload time, so one prompt can cover a whole project without buffering every file in memory. Known limitation The file API has no conditional write (POST /v2/files refuses to overwrite at all, which is why writes are delete-then-upload), so this is optimistic concurrency over the inventory: a small time-of-check/time-of-use window remains, and each replaced file has a brief 404 window on the live site. Both need a server-side atomic replace to close, tracked separately. Review rounds (takeover, 2026-09-03) Live-tested against the real CLI with a mock server (--contract strict|echo) and re-reviewed in five rounds. Changes on top of the original design: Server dependency made explicit. The per-file updatedAt baseline that publish records comes from the upload response, which the server only started echoing in deepnote-internal#20773 (in production since v0.16.997, 2026-09-03). On servers without it — self-hosted or older — publish-written baselines are unverifiable; the docs say so, and the CLI degrades to the pre-baseline overwrite rather than failing. The publish stop needs a usable baseline. Only an entry carrying the server's updatedAt is compared: --all-files syncs always record one, publishes do since #20773. A path without one is overwritten like any deploy. A per-path warning for that case was tried and removed — its only remedy, a pull, records the cloud copy as the baseline so the next publish passes the stop anyway. Pull keeps the baseline of a cloud-deleted file that stays on disk (no --prune), and warns. Previously the record was dropped, so an edited copy silently resurrected a file someone had removed (e.g. via publish --prune). An edited push now surfaces the deletion as a conflict; --prune still removes file and record together. Pending uploads. Publish clears a path from pendingFileUploads when it writes or prunes it, so an interrupted sync replacement that publish already settled cannot brick later syncs. A pending path whose cloud copy exists again is a conflict ("re-created in Deepnote after an interrupted upload"), not a silent retry — the "our own unfinished delete" premise is disproven when the copy is back. Sync persists each settled upload immediately, so a run interrupted later cannot leave its own upload looking pending; if a kept re-created conflict does occur, skipping it drops the retry so the next pull resolves it instead of the conflict sticking. Explicit --sync-root failures are exit 2 consistently, including a tracked project directory that is missing; a manifest that exists but cannot be read (or is a symlink) also exits 2 with a pointer at --no-sync-root. Kept-files warning is honest about pull: it says pulling replaces the local copies; the download-side dirty check itself is a follow-up. Token handling unified: every command resolves --token/DEEPNOTE_TOKEN through one trimming helper (a pasted token with a stray space used to fail only in publish). Dry run honours an explicit --on-conflict instead of always reporting a skip; the upload loop re-checks the 100 MiB cap on the bytes it actually uploads. Shared sha256/baselineDiverged helpers so publish and sync cannot drift on what "changed" means; apps.md states the static site's URL-to-file mapping. Gates at head: pnpm test 3147 passed, typecheck, biome, prettier, spell-check clean; CI green including codecov patch/project. 2. App models reference (#509) The skill had no canonical account of Deepnote's app models, so an agent choosing between them had to infer the differences from cli-publish.md, two example READMEs, and the local-runner package docs — and the one place that mentioned app tokens covered only the CLI flag. skills/deepnote/references/apps.md states the five models, what each is made of, where it runs, and which credentials it gets: data apps, Streamlit apps, published static sites, published browser apps with viewer API access, and local Node-backed serveStatic apps. It leads with a decision table keyed on the questions that actually change the plan — including whether an agent can create the underlying files at all, which is where hosted-only workflows quietly fail. It also records the failure mode worth knowing before it bites: code developed against a local preview with a personal token keeps working there and does nothing once embedded, with no error, because the viewer token is limited to one run loop. AGENTS.md — the skill sync map claimed MCP tools mirror the CLI and should be recorded in cli-*.md. They do not: @deepnote/mcp (local files), hosted MCP at deepnote.com/mcp, and the codex-plugin consumer are three separate surfaces. The map now routes each to its own home and adds a row for app models, publishing ownership, and token boundaries. skills/deepnote/SKILL.md — an Apps section pointing at the new reference. Ownership documented consistently Both strands land the same rule, which is why they read better together than apart. apps.md states it for agents and the cli-*.md references carry the mechanics: deepnote publish is the deploying writer for _deepnote_static/** — build output goes through publish, not through a synced workspace. The two commands share one baseline rather than splitting the namespace: sync mirrors those paths and surfaces a republished site as a conflict instead of reverting it. Publish updates a surrounding workspace's mirror unless told not to (--no-sync-root, which is what CI wants), and exits 1 without touching the project when Deepnote holds unsynced changes. A follow-up commit on this branch dropped an earlier "publish owns the namespace" line from apps.md, which read as a split now that the implementation deliberately shares a baseline. Branch history #509 was merged into this branch (its base was worktree-sync-publish-coordination), bringing apps.md, the AGENTS.md map fix, and the SKILL.md pointer. main was merged in to pick up #507. That is why #507 appears in this branch's log but not in the diff — it is already on main. One follow-up commit states the publish/sync coordination in apps.md now that the mechanism ships in this PR. Testing The merged commits touch only AGENTS.md, SKILL.md, and skills/deepnote/references/apps.md — no code, so the gate results for the implementation still stand: pnpm test (3127 passed, 1 skipped), pnpm typecheck, pnpm biome:check, pnpm prettier:check, pnpm spell-check all clean. New test coverage in this PR: publish.test.ts — mirror writes and manifest records, the divergence stop and --force, --prune clearing the mirror, --no-sync-root, both --sync-root error cases, the missing-project-directory case, and the warn-not-fail mirror failure. sync.test.ts — a diverged cloud copy kept vs. overridden, a deleted cloud copy treated as a conflict, an unchanged copy not flagged, a pending retry finishing when the cloud copy is gone, plus unit coverage of describeCloudFileDivergence. publish-mirror.test.ts — findDivergedPublishPaths (including the deliberate mirror/deploy asymmetry) and resolvePublishMirror discovery. Docs updated per AGENTS.md: packages/cli/README.md, skills/deepnote/references/cli-publish.md, skills/deepnote/references/cli-sync.md, and both commands' --help. Stacked on this #510 adds the public docs/ pages for deepnote publish and deepnote sync, and distinguishes the CLI deepnote sync command from the in-product "Deepnote file sync" feature. It is based on this branch and will retarget to main when this merges. 🤖 Generated with Claude Code Summary by CodeRabbit New Features Added static-site access to manage published-site sharing and viewer API access without republishing. publish now supports sync-workspace coordination, conflict detection, pruning, and force overrides. Sync now detects changed, deleted, or recreated cloud files and reports uploaded and skipped files more clearly. Bug Fixes Prevented publishing and syncing from silently overwriting newer or deleted cloud files. Improved validation for workspaces, paths, authentication, and mirror updates. Documentation Expanded guidance for apps, publishing, syncing, access controls, and MCP surfaces. Static-site access lifecycle This draft now also adds deepnote static-site access, a settings-only command that reuses the existing PATCH /v2/projects/{projectId} contract. It can disable or re-enable sharing and change viewer API access without uploading or deleting _deepnote_static/**. Disabling sharing also disables viewer API access; re-enabling serves the retained files again. The CLI README, cli-publish.md, apps.md, and the installed Deepnote skill describe the same publish → change access lifecycle. Six command tests cover combined settings, sharing-only and API-only updates, invalid empty/contradictory requests, and API failures. Latest local verification: pnpm typecheck, pnpm biome:check, pnpm prettier:check, pnpm spell-check, and pnpm test (3133 passed, 1 skipped).

Open Graph Description: Two strands, both about the same confusion: which command owns a project's files, and which app model a given deliverable actually is. packages/ — sync and publish stop overwriting each other&...

X Description: Two strands, both about the same confusion: which command owns a project's files, and which app model a given deliverable actually is. packages/ — sync and publish stop overwriting each ot...

Opengraph URL: https://github.com/deepnote/deepnote/pull/508

X: @github

direct link

Domain: github.com

react-profiling0
react-import-mapreact,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf
route-pattern/:user_id/:repository/pull/:id/files/:range(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:cbe9155d-78fe-dc6c-a58e-e56ad20d75ef
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idD652:8C5E3:6D7AB9:95D059:6AEDC0AD
html-safe-noncebedc2cd6efb2f8af23aadf6318a52890aec453c1052e50ad0d15e3b03111cc39
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJENjUyOjhDNUUzOjZEN0FCOTo5NUQwNTk6NkFFREMwQUQiLCJ2aXNpdG9yX2lkIjoiNzkyNzc2NTA3NjE1NDM2ODE3MyIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacc752f2c1fe65b95c4a8101ab37bc37b1c320f0b3a76168ea492d6287440ba9de
hovercard-subject-tagpull_request:4414289787
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
twitter:imagehttps://avatars.githubusercontent.com/u/15235276?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/15235276?s=400&v=4
og:image:altTwo strands, both about the same confusion: which command owns a project's files, and which app model a given deliverable actually is. packages/ — sync and publish stop overwriting each other&...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None1eb5f7cedbc707472687eab1a30e6c4619c00791815622ceaba9694eb161930f
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/deepnote/deepnote git https://github.com/deepnote/deepnote.git
octolytics-dimension-user_id45339858
octolytics-dimension-user_logindeepnote
octolytics-dimension-repository_id1066509034
octolytics-dimension-repository_nwodeepnote/deepnote
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1066509034
octolytics-dimension-repository_network_root_nwodeepnote/deepnote
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasef31f9c89203c022acdb651c34ae048cf41764208
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#start-of-content
https://github.com/
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fdeepnote%2Fdeepnote%2Fpull%2F508%2Ffiles%2Fafd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
GitHubRepository hosting, code review, and collaborationhttps://github.com/platform
CopilotAI coding agent for tasks, projects, and automated workhttps://github.com/features/copilot
ActionsCI/CD and automationhttps://github.com/features/actions
Code QualityQuality analysis, fixes, and enforcementhttps://github.com/features/code-quality
CodespacesCloud development environmentshttps://github.com/features/codespaces
Code SecurityVulnerability detection and remediationhttps://github.com/security/advanced-security/code-security
Secret ProtectionSecret scanning and leak preventionhttps://github.com/security/advanced-security/secret-protection
All Featureshttps://github.com/features
Documentationhttps://docs.github.com/en
Traininghttps://learn.github.com/skills
Certificationshttps://learn.github.com/credentials
Build with Copilothttps://github.com/features/ai
Customize Copilothttps://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-copilot-overview
Integrationshttps://github.com/marketplace
Trending reposhttps://github.com/trending
GitHub Sponsorshttps://github.com/open-source/sponsors
Developer articleshttps://github.com/resources/articles
ChangelogYour source for the latest features, improvements, and fixes across GitHub products, all in one place.https://github.blog/changelog/
Enterpriseshttps://github.com/enterprise
Teamhttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
See all industrieshttps://github.com/solutions/industry
Why GitHubhttps://github.com/why-github
Customer Storieshttps://github.com/customer-stories
Business insightshttps://github.com/solutions/executive-insights
Trust Centerhttps://github.com/trust-center
GitHub Advanced SecurityEnterprise-grade code securityhttps://github.com/security/advanced-security
Copilot for businessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Documentationhttps://docs.github.com/en
Resource centerhttps://github.com/resources
Bloghttps://github.blog/
Events & webinarshttps://github.com/resources/events
Community Forumhttps://github.com/orgs/community/discussions
Customer Storieshttps://github.com/customer-stories
Integrationshttps://github.com/marketplace
Customer supporthttps://help.github.com/
Traininghttps://learn.github.com/skills
GitHub Statushttps://www.githubstatus.com/
Abouthttps://github.com/about
Partnershttps://github.com/partners
Changeloghttps://github.blog/changelog/
GitHub UniverseThe event for developers, by developers — talks, workshops, and what’s next for GitHub.https://githubuniverse.com/
Pricinghttps://github.com/pricing
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fdeepnote%2Fdeepnote%2Fpull%2F508%2Ffiles%2Fafd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
Sign uphttps://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=deepnote%2Fdeepnote
Reloadhttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
Reloadhttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
Reloadhttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
deepnotehttps://github.com/deepnote
deepnotehttps://github.com/deepnote/deepnote
Codehttps://github.com/deepnote/deepnote
Issues14 (14)https://github.com/deepnote/deepnote/issues
Pull requests24 (24)https://github.com/deepnote/deepnote/pulls
Discussionshttps://github.com/deepnote/deepnote/discussions
Actionshttps://github.com/deepnote/deepnote/actions
Security and qualityhttps://github.com/deepnote/deepnote/security
Insightshttps://github.com/deepnote/deepnote/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fdeepnote%2Fdeepnote%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fdeepnote%2Fdeepnote%2Fissues%2Fnew%2Fchoose
tkislanhttps://github.com/tkislan
mainhttps://github.com/deepnote/deepnote/tree/main
worktree-sync-publish-coordinationhttps://github.com/deepnote/deepnote/tree/worktree-sync-publish-coordination
Conversation 33 https://github.com/deepnote/deepnote/pull/508
Commits 22 https://github.com/deepnote/deepnote/pull/508/commits
Checks 20 https://github.com/deepnote/deepnote/pull/508/checks
Files changed https://github.com/deepnote/deepnote/pull/508/files
Please reload this pagehttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
fix(cli,skill): let sync and publish share one baseline, and add an app-models reference https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#top
Show all changes 22 commits https://github.com/deepnote/deepnote/pull/508/files
558e4bf fix(cli): let sync and publish share one baseline for project files jamesbhobbs Sep 1, 2026 https://github.com/deepnote/deepnote/pull/508/commits/558e4bf4a10e16ebe05b402d447aba1fef4e1b9c
9e653a4 Merge branch 'main' into worktree-sync-publish-coordination jamesbhobbs Sep 1, 2026 https://github.com/deepnote/deepnote/pull/508/commits/9e653a446b94c16fe8cbae25158b46d6c50d0332
89c54e3 docs(skill): add an app-models reference and fix the skill sync map (… jamesbhobbs Sep 1, 2026 https://github.com/deepnote/deepnote/pull/508/commits/89c54e3af2c942c515a7cf5da78884cad0de0046
afd296a docs(skill): state the publish/sync coordination now that it ships here jamesbhobbs Sep 1, 2026 https://github.com/deepnote/deepnote/pull/508/commits/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
170a7b9 feat(cli): manage static-site access jamesbhobbs Sep 1, 2026 https://github.com/deepnote/deepnote/pull/508/commits/170a7b9e0f6eecd07074ff0f67add8a9704f9e7c
ab0811a refactor(cli,cloud): cut publish/sync comments back to the why tkislan Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/ab0811a19c9e26da76270aeba5541f6f803641bb
083f86c Cleanup code comments tkislan Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/083f86c9151768c360e65795275737027d93d363
542b96c Remove unnecessary tests tkislan Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/542b96c07a832641daf5e20000e764b14625b192
7e0c316 Use path.join and path.sep tkislan Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/7e0c316c4e167b9ca919fa757fa58bb5c1354371
f8b00b3 Revert "Use path.join and path.sep" tkislan Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/f8b00b381bb2219fd258c89236263bdfe3565463
c8ed543 docs(skill): state the static site's URL-to-file mapping voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/c8ed543aea1841bb9a77e46d5c89846a2abb96bb
1a7dc9a fix(cli): close pending-upload gaps, fail explicit --sync-root loudly… voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/1a7dc9a06d24d482445283cb22a5d6057df49f29
61c83fb test(cli): pin the POSIX invariant of the mirror path voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/61c83fb83f5f638a5419722d8edb571ad4db8a92
857a878 fix(cli): keep cloud-deleted baselines, guard plain-synced publishes,… voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/857a8781b315d75b732e23705133d541fa730f28
e5d162a fix(cli): warn per unchecked overwrite in publish and state the usabl… voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/e5d162ad036b81747fa81d6cb4b5951c63d41fa6
06c964a fix(cli): settle each upload on disk and let a kept re-created confli… voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/06c964acc80c8084cbe4038a627df39ed76a1647
c3c034b test(cli): pin that each uploaded baseline is settled on disk before … voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/c3c034b18d85f34ddb902ca50075d0c415f8ce5e
494e6ad fix(cli): keep read-only pulls off the stale-path symlink guard and s… voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/494e6ad00413f0489ce80779ab63b74a9e75ad87
63c6177 Merge branch 'main' into worktree-sync-publish-coordination voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/63c6177d595b9a6800d821b590402ac119ad1b2a
c87cde5 refactor(cli): drop publish's unchecked-overwrite warning and the dup… voyti Sep 3, 2026 https://github.com/deepnote/deepnote/pull/508/commits/c87cde5a30016a29c4a69493c34fdf41ef053e24
08277fa docs(skill): state how the next sync recovers from a failed publish m… voyti Sep 4, 2026 https://github.com/deepnote/deepnote/pull/508/commits/08277faefed93c6f364efa36dc27485d2f5d320d
d1c104d refactor(cli): address review — real cloud module in test mocks, keep… voyti Sep 4, 2026 https://github.com/deepnote/deepnote/pull/508/commits/d1c104d8884a170a6da79b33c2ccee72f874cd21
Clear filters https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
Please reload this pagehttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
Please reload this pagehttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
AGENTS.md https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-a54ff182c7e8acf56acfd6e4b9c3ff41e2c41a31c9b211b2deb9df75d9a478f9
README.md https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-15986190ef9581ab59bcd5483b2c09e7fd0bd439d6f6cddbc94b0b1de094ee51
cli.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-7a02f7d6513a60a87cae3086768db219f1908f2594dc77cd1a13a0107cbb24e3
publish.test.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-3ce6d065350d4f39389d8d8576f4143cc427f1f7c5ab1bccc148976a4ffd44f9
publish.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-4f2e16ef182a35dca0fc6c04db7cd2a0a9fef31fb0f477648b7f81f9307267e2
sync.test.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-2a59c8310bdb5c4d6494a25d2883680fe8bdfde40d5f89972489b163af967308
sync.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-68b4ae21aa7b700f48f2376946eddfbe1c73e3412bd4bfa480be174ff4e54a12
publish-mirror.test.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-6ab3a460dfc88dac572461cdbd85348229223c3c81fe505ca50e5580cf10ab38
publish-mirror.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-28b1f9d6f738dac28cf6292c5bb1c5dbef3156e4dce7d62bf6dcac4f59b11faa
sync-manifest.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-f1ac82a2ba1fa4d258f635e1be37c58488606bcd2cff82256414aab26a7f08ac
sync-paths.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-b0b3fb081f537b851871a84b2e27174e73e96be5b3e0bd8b8cadfc321e7e691e
index.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-dc95094deb531afd39a3b08907ebdb34301105d0bd95bf43f6a2a0ce5701a034
sync.test.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-4883f1c51f1e6fca6c80fe65f4cb471fa29bb96243aa0886499a2d2fa5ee0753
sync.ts https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-404348e9a69abbc2108d745a5bb9c71b0f8af19e60fe7b3aebbfeb0aa380a186
SKILL.md https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-fc910ff9af653863a4d56f42ab43df86a18730c7df959926af99800c102c21db
apps.md https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-6b758c65bc61424114f90007c9eec4b80eebdf0ec9e078e85343f2916d13b69a
cli-publish.md https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-d97713b281c10cbe88143a49f2527b2ce4ebc0e12353c4eda152bd1de014f130
cli-sync.md https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-18e97201b1242f8be00836a2d975ead3ddeebc50611ec034853c6dde8205197a
https://github.com/deepnote/deepnote/blob/main/.github/CODEOWNERS#L2
AGENTS.mdhttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-a54ff182c7e8acf56acfd6e4b9c3ff41e2c41a31c9b211b2deb9df75d9a478f9
View file https://github.com/deepnote/deepnote/blob/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb/AGENTS.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/deepnote/deepnote/pull/508/files/{{ revealButtonHref }}
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-a54ff182c7e8acf56acfd6e4b9c3ff41e2c41a31c9b211b2deb9df75d9a478f9
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-a54ff182c7e8acf56acfd6e4b9c3ff41e2c41a31c9b211b2deb9df75d9a478f9
https://github.com/deepnote/deepnote/blob/main/.github/CODEOWNERS#L2
packages/cli/README.mdhttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-15986190ef9581ab59bcd5483b2c09e7fd0bd439d6f6cddbc94b0b1de094ee51
View file https://github.com/deepnote/deepnote/blob/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb/packages/cli/README.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/deepnote/deepnote/pull/508/files/{{ revealButtonHref }}
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-15986190ef9581ab59bcd5483b2c09e7fd0bd439d6f6cddbc94b0b1de094ee51
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-15986190ef9581ab59bcd5483b2c09e7fd0bd439d6f6cddbc94b0b1de094ee51
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-15986190ef9581ab59bcd5483b2c09e7fd0bd439d6f6cddbc94b0b1de094ee51
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-15986190ef9581ab59bcd5483b2c09e7fd0bd439d6f6cddbc94b0b1de094ee51
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-15986190ef9581ab59bcd5483b2c09e7fd0bd439d6f6cddbc94b0b1de094ee51
https://github.com/deepnote/deepnote/blob/main/.github/CODEOWNERS#L2
packages/cli/src/cli.tshttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-7a02f7d6513a60a87cae3086768db219f1908f2594dc77cd1a13a0107cbb24e3
View file https://github.com/deepnote/deepnote/blob/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb/packages/cli/src/cli.ts
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/deepnote/deepnote/pull/508/files/{{ revealButtonHref }}
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-7a02f7d6513a60a87cae3086768db219f1908f2594dc77cd1a13a0107cbb24e3
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-7a02f7d6513a60a87cae3086768db219f1908f2594dc77cd1a13a0107cbb24e3
https://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb#diff-7a02f7d6513a60a87cae3086768db219f1908f2594dc77cd1a13a0107cbb24e3
Please reload this pagehttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
Please reload this pagehttps://github.com/deepnote/deepnote/pull/508/files/afd296add1c8b0a7e184d9bc5ded86ab1fe7edfb
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.