Replies: 1 comment
|
Thanks — I spent a while on this one. One half of your report is fully reproducible and much wider than Failure 2 (stale
|
| package | latest | next | alpha |
|---|---|---|---|
@deepseek-ai/dsh |
0.1.5-rc.2 | 0.1.5-rc.2 | 0.1.6-alpha.2 |
@deepseek-ai/dsh-session |
0.0.1-rc.1 | 0.1.5-rc.2 | 0.1.6-alpha.2 |
@deepseek-ai/dsh-app-boot |
0.1.0-rc.6 | 0.1.5-rc.2 | 0.1.6-alpha.2 |
@deepseek-ai/dsh-session-format-v0-to-v1 |
0.1.3-alpha.2 | 0.1.5-rc.2 | 0.1.6-alpha.2 |
dsh itself is the exception; every sibling still resolves by bare name to a 0.0.1/0.1.0-era build. So the exported-symbol mismatch is not specific to this loader path: anything that resolves a @deepseek-ai/dsh-* dependency by bare name gets an ancient build while dsh is 0.1.5-rc.2. The mechanism is in the release code: distTagForVersion returns next for any version containing -, so a prerelease-only line never advances latest — 0.0.1-rc.1 is simply the last thing that ever landed there. This shape has been reported about a dozen times in this repo. The practical rule for consumers: never resolve a sibling by bare name, mirror dsh's own version or use the next tag.
Failure 1 I could not reproduce as written — and the mechanism matters
In an empty prefix, on npm 11.17.0 / Node 26.5.0:
npm install @deepseek-ai/dsh@0.1.5-rc.2 # 520 packages
dsh --version # 0.1.5-rc.2, exit 0
All 18 packages you list are present in that tree. Your observation about the manifests is still correct, and it is stronger than it looks: I walked every installed package.json, and none of the 18 is a dependencies entry of any package in the tree — each is a non-optional peerDependencies entry of an internal package (@deepseek-ai/cordis-plugin-group is a peer of dsh-app-boot and of nothing else). That is deliberate: peers keep one instance per process and let the composition choose the implementation, so the plugin packages are intentionally not dependencies. They appear in my tree only because npm ≥ 7 installs non-optional peers automatically.
Same result on your own npm: I repeated the clean-prefix install with npm@10.9.8 into an empty directory — added 522 packages in 1m, and all 18 packages are present again. So this is not an npm-major difference; the non-optional peers are installed either way.
So ERR_MODULE_NOT_FOUND on your machine means peer installation was disabled in that environment: --legacy-peer-deps, --omit=peer, or a package manager that does not auto-install peers. Worth re-running pinned, which also removes the latest variable:
npx --yes @deepseek-ai/dsh@0.1.5-rc.2 web
npm ls @deepseek-ai/cordis-plugin-group
Why the two halves are one bug
The only reason you had to install those 18 packages by name is that nothing declares them as a dependency. And installing them by name is exactly what hands you 0.0.1-rc.1: the missing-declaration half forces the consumer onto the stale-latest half. Fixing either one alone still leaves the README's only documented install command broken.
Also checked, to rule it out: there is no publish-time manifest drift. apps/cli/package.json at tag dsh-v0.1.5-rc.2 declares exactly the 72 packages that the published dsh@0.1.5-rc.2 declares (0 added, 0 dropped). The fix belongs in the runtime-plugin declaration and in dist-tag promotion, not in the publish step.
Suggested fixes
- Promote
latestas part of the release (or stop treating a prerelease-only line as somethinglatestshould serve), so a bare-name resolution never yields a build that predates the API being asked of it. - Declare the profile's runtime plugin set as real
dependencies(of the profile bundle), or document the peer-only contract loudly — a barenpxmust not depend on peer auto-install. - Add a release gate that installs the packed tarball into an empty prefix and boots the shipped profile. That is exactly what the README's single documented install command promises, and it would have caught both halves of this report.
Uh oh!
There was an error while loading. Please reload this page.
npx @deepseek-ai/dsh webfails out-of-the-box —@deepseek-ai/dsh@0.1.5-rc.2ships with incompletedependenciesand staledist-tags.latestTL;DR
Running
npx @deepseek-ai/dsh webon a clean machine (Node 22) crashes during plugin load with two distinct packaging bugs in the published@deepseek-ai/dsh@0.1.5-rc.2bundle:@deepseek-ai/*packages required at runtime are not declared asdependencies(only as peer deps of internal sub-packages), so a freshnpxinstall never fetches them —ERR_MODULE_NOT_FOUNDoncordis-plugin-group,dsh-session-persistence,dsh-jobs,dsh-bash-local, etc.SyntaxError: The requested module '@deepseek-ai/dsh-session' does not provide an export named 'snapshotJsonValue'— because thelatestdist-tag of@deepseek-ai/dsh-session(and many siblings) is stuck at0.0.1-rc.1whiledsh@0.1.5-rc.2was built against0.1.5-rc.2.Both bugs are reproducible on a brand-new machine in under two minutes. The README's only documented install command (
npx @deepseek-ai/dsh web) does not work.Environment
v22.22.0, npm10.9.8@deepseek-ai/dsh@0.1.5-rc.2(the version currently on thelatestnpm dist-tag)@deepseek-ai/*package (cleannpxcache)Reproduction
Failure 1 — missing peer dependencies
@deepseek-ai/dsh-app-boot@0.1.5-rc.2declares@deepseek-ai/cordis-plugin-group@^1.0.2as apeerDependency, but the top-level@deepseek-ai/dsh@0.1.5-rc.2package.json lists it under neitherdependenciesnorpeerDependencies— onlycordis-plugin-hmr,cordis-plugin-include,cordis-plugin-loader,cordis-plugin-timerare direct deps. Same pattern for 17 other packages that the loader needs butdshnever asks npm to fetch:Failure 2 — API mismatch from stale
dist-tags.latestAfter installing every missing dep above (pinned to
0.1.5-rc.2), the loader still fails:Cause:
@deepseek-ai/dsh-session's npmdist-tags.latestis0.0.1-rc.1, which predates thesnapshotJsonValueexport. The version the rest ofdsh@0.1.5-rc.2was built against (0.1.5-rc.2) only exists ondist-tags.next/dist-tags.alpha. Same staleness for@deepseek-ai/dsh-session-persistence,@deepseek-ai/dsh-jobs,@deepseek-ai/dsh-settings, etc. —npm install <name>resolves to the oldlatestand silently picks an incompatible API surface.Working workaround (for anyone stuck)
After that the server starts cleanly on
http://127.0.0.1:3080and the token-URL flow works.Suggested fix
@deepseek-ai/*peer-only packages frompeerDependenciestodependenciesinapps/cli/package.json. They are hard runtime requirements, not "host-provided" peers. (pnpm-lock.yamlalready records them as resolvable —npxjust doesn't reach the transitive peers.)next/alpharelease and re-pointlatest, or (b) republish0.1.5-rc.2across the whole tree solatestmatches. Otherwisenpm install <pkg>@latestwill keep picking0.0.1-rc.1.scripts/release.shor equivalent) should either pin explicit versions inapps/cli/package.jsonor refuse to publish ifdist-tags.latestlags behind the CLI's release commit.Notes
npx @deepseek-ai/dsh web, which currently fails. The dev path (git clone+pnpm install) is unaffected because pnpm resolves transitives through the workspace.dshinstall involved.Thanks for the project — happy to send a PR with the dep-list patch if maintainers are open to it.
All reactions