TL;DR
The README's documented install command (npx get-shit-done-cc@latest …) does not put gsd-sdk on PATH on a fresh install of get-shit-done-cc@1.38.5. The installer prints ✓ GSD SDK ready (sdk/dist/cli.js) and exits 0, but every subsequent /gsd-* command fails with command not found: gsd-sdk. Root cause: the fix/2441-sdk-decouple architecture relies on npm symlinking the in-package bin/gsd-sdk.js shim into the global bin dir, which only happens for npm install -g get-shit-done-cc — npx never creates that symlink for secondary bins.
Environment
| Field |
Value |
| GSD Version |
1.38.5 |
| Runtime |
Claude Code |
| Operating System |
macOS (Darwin 25.4.0) |
| Node.js Version |
v24.14.1 |
| Node manager |
nvm |
| Shell |
zsh |
| Installation Method |
npx get-shit-done-cc@latest (fresh run) |
| npm global prefix |
~/.nvm/versions/node/v24.14.1 (already on PATH) |
Reproduce
Fresh shell, no prior global install of get-shit-done-cc:
$ which gsd-sdk
gsd-sdk not found
$ npx get-shit-done-cc@latest --claude --global
[...installer banner...]
✓ Installed 85 skills to skills/
✓ Installed get-shit-done
✓ Installed agents
✓ Wrote VERSION (1.38.5)
✓ Wrote package.json (CommonJS mode)
✓ Installed hooks (bundled)
✓ Wrote file manifest (gsd-file-manifest.json)
✓ GSD SDK ready (sdk/dist/cli.js)
Done! Open a blank directory in Claude Code and run /gsd-new-project.
$ which gsd-sdk
gsd-sdk not found
$ ls $(npm config get prefix)/bin/ | grep -E "(gsd-sdk|get-shit-done-cc)"
# (no output)
$ /gsd-new-project # in Claude Code
# workflow's first step: gsd-sdk query init.new-project
# → command not found: gsd-sdk
Expected: after the installer reports ✓ GSD SDK ready, gsd-sdk is callable from the user's shell. Actual: it isn't. The shim file is present in the npx cache (~/.npm/_npx/<hash>/node_modules/get-shit-done-cc/bin/gsd-sdk.js) but no symlink ever lands in npm's global bin dir.
Workaround that does work:
$ npm install -g get-shit-done-cc@latest
$ which gsd-sdk
/Users/<USER>/.nvm/versions/node/v24.14.1/bin/gsd-sdk
Root cause
npx <pkg> fetches the package into ~/.npm/_npx/<hash>/ and runs the package's primary bin once from that cache. It does not install the package globally and does not create symlinks for the package's secondary bins in npm's global bin dir. Only npm install -g <pkg> triggers npm's bin-linking behavior, which is what creates ~/.npm-global/bin/gsd-sdk → …/get-shit-done-cc/bin/gsd-sdk.js.
The --global flag in npx get-shit-done-cc --global is parsed by bin/install.js, not by npm — it tells the installer to write GSD configs to ~/.claude/ rather than ./.claude/. It has no effect on whether the npm package is installed globally.
Sources:
Secondary bug — README still recommends npx and claims the SDK is auto-installed
README hero command:
npx get-shit-done-cc@latest
README "Non-interactive Install" section:
# Claude Code
npx get-shit-done-cc --claude --global # Install to ~/.claude/
npx get-shit-done-cc --claude --local # Install to ./.claude/
# OpenCode
npx get-shit-done-cc --opencode --global # Install to ~/.config/opencode/
# ...
Followed by:
"The GSD SDK CLI (gsd-sdk) is installed automatically (required by /gsd-* commands). Pass --no-sdk to skip the SDK install, or --sdk to force a reinstall."
Both claims are now incorrect for the headline command path. The installer's own error path agrees: when SDK files are missing, it prints
Fix: install a version that ships sdk/dist/ globally:
npm install -g get-shit-done-cc@latest
(bin/install.js ~line 7217). The README and the installer's recommended-fix line currently disagree.
Tertiary bug — bin/gsd-sdk.js shim comment also claims npx creates the symlink
bin/gsd-sdk.js lines 4–9:
/**
* bin/gsd-sdk.js — back-compat shim for external callers of `gsd-sdk`.
*
* When the parent package is installed globally (`npm install -g get-shit-done-cc`
* or `npx get-shit-done-cc`), npm creates a `gsd-sdk` symlink in the global bin
* directory pointing at this file. […]
*/
The "or npx get-shit-done-cc" clause is the architectural assumption that breaks the README path. npx does not create global symlinks; this comment encodes the incorrect mental model that produced both this bug and the README mismatch.
Quaternary bug — installSdkIfNeeded is verify-only and prints success when the bin is off-PATH
bin/install.js, installSdkIfNeeded (around line 7170): the function checks two things and prints ✓ GSD SDK ready when both pass:
fs.existsSync(sdkCliPath) — does sdk/dist/cli.js exist inside the package directory? (passes — it's in the npx cache)
maybeSuggestPathExport(globalBin, homedir) — is npm's global bin dir on PATH? (passes via nvm — only emits a warning when missing from PATH)
The function never executes anything equivalent to which gsd-sdk / command -v gsd-sdk / spawnSync('gsd-sdk', ['--version']). So the success message is a file-presence + PATH-shape signal, not a callability signal. Combined with the README's npx recommendation, this turns the failure mode silent: users see green checkmarks, then command not found on first /gsd-* invocation.
Comment in installAllRuntimes (bin/install.js ~line 7279) makes the assumption explicit:
// gsd-sdk reaches users via the parent package's bin/gsd-sdk.js shim, so no sub-install is needed.
True for npm install -g, false for npx.
Impact
Blocker for users following the README. Every /gsd-* command fails with command not found: gsd-sdk (or its programmatic equivalent — Exit code 127 from inside Claude Code's Bash tool). The user has no signal that the install was incomplete: the final installer message says Done! Open a blank directory in Claude Code and run /gsd-new-project, and /gsd-new-project fails on the first gsd-sdk query init.new-project line of its workflow.
Affected commands include at minimum: /gsd-new-project, /gsd-health, /gsd-quick, /gsd-plan-phase, /gsd-execute-phase, /gsd-progress, /gsd-set-profile, /gsd-discuss-phase, /gsd-resume-work. (Anything calling gsd-sdk query ….)
Suggested fix
Three non-exclusive directions, in order of effort:
(A) Update the README to recommend npm install -g get-shit-done-cc@latest as the headline install command, with npx reserved for one-shot tries that don't need GSD slash commands. Update bin/gsd-sdk.js's header comment to remove the "or npx get-shit-done-cc" clause. Lowest effort, highest correctness, but breaks muscle memory for existing users and existing tutorials.
(B) Add a real callability check at the end of installSdkIfNeeded: spawn gsd-sdk --help (or equivalent) with stdio: 'ignore' and a 5-second timeout. If it exits non-zero or ENOENT, print a loud red banner with remediation instructions instead of ✓ GSD SDK ready. This catches the npx case explicitly and converts the silent failure into a loud one. Recommended as a defense-in-depth addition regardless of (A) or (C).
(C) Have the installer detect the npx-cache execution context and shell out to npm install -g get-shit-done-cc@<thisVersion> itself. The installer already detects this context (see classifySdkInstall and ctx.npxCache branches in bin/install.js). Adding an opt-in / prompted npm install -g step would make the README's headline command Just Work. Risk: nested global installs are noisy and have permission issues on some systems (#2513-class problems); needs careful handling.
Personally I'd start with (A) + (B): documentation alignment plus a callability gate, both small and unambiguous. (C) is a bigger lift but is the only option that keeps the README's npx headline accurate.
Related
Privacy Checklist
TL;DR
The README's documented install command (
npx get-shit-done-cc@latest …) does not putgsd-sdkon PATH on a fresh install ofget-shit-done-cc@1.38.5. The installer prints✓ GSD SDK ready (sdk/dist/cli.js)and exits 0, but every subsequent/gsd-*command fails withcommand not found: gsd-sdk. Root cause: the fix/2441-sdk-decouple architecture relies on npm symlinking the in-packagebin/gsd-sdk.jsshim into the global bin dir, which only happens fornpm install -g get-shit-done-cc—npxnever creates that symlink for secondary bins.Environment
1.38.5v24.14.1nvmzshnpx get-shit-done-cc@latest (fresh run)~/.nvm/versions/node/v24.14.1(already on PATH)Reproduce
Fresh shell, no prior global install of
get-shit-done-cc:Expected: after the installer reports
✓ GSD SDK ready,gsd-sdkis callable from the user's shell. Actual: it isn't. The shim file is present in the npx cache (~/.npm/_npx/<hash>/node_modules/get-shit-done-cc/bin/gsd-sdk.js) but no symlink ever lands in npm's global bin dir.Workaround that does work:
Root cause
npx <pkg>fetches the package into~/.npm/_npx/<hash>/and runs the package's primary bin once from that cache. It does not install the package globally and does not create symlinks for the package's secondary bins in npm's global bin dir. Onlynpm install -g <pkg>triggers npm's bin-linking behavior, which is what creates~/.npm-global/bin/gsd-sdk → …/get-shit-done-cc/bin/gsd-sdk.js.The
--globalflag innpx get-shit-done-cc --globalis parsed bybin/install.js, not by npm — it tells the installer to write GSD configs to~/.claude/rather than./.claude/. It has no effect on whether the npm package is installed globally.Sources:
Secondary bug — README still recommends
npxand claims the SDK is auto-installedREADME hero command:
README "Non-interactive Install" section:
Followed by:
Both claims are now incorrect for the headline command path. The installer's own error path agrees: when SDK files are missing, it prints
(
bin/install.js~line 7217). The README and the installer's recommended-fix line currently disagree.Tertiary bug —
bin/gsd-sdk.jsshim comment also claimsnpxcreates the symlinkbin/gsd-sdk.jslines 4–9:The "or
npx get-shit-done-cc" clause is the architectural assumption that breaks the README path.npxdoes not create global symlinks; this comment encodes the incorrect mental model that produced both this bug and the README mismatch.Quaternary bug —
installSdkIfNeededis verify-only and prints success when the bin is off-PATHbin/install.js,installSdkIfNeeded(around line 7170): the function checks two things and prints✓ GSD SDK readywhen both pass:fs.existsSync(sdkCliPath)— doessdk/dist/cli.jsexist inside the package directory? (passes — it's in the npx cache)maybeSuggestPathExport(globalBin, homedir)— is npm's global bin dir on PATH? (passes via nvm — only emits a warning when missing from PATH)The function never executes anything equivalent to
which gsd-sdk/command -v gsd-sdk/spawnSync('gsd-sdk', ['--version']). So the success message is a file-presence + PATH-shape signal, not a callability signal. Combined with the README'snpxrecommendation, this turns the failure mode silent: users see green checkmarks, thencommand not foundon first/gsd-*invocation.Comment in
installAllRuntimes(bin/install.js~line 7279) makes the assumption explicit:True for
npm install -g, false fornpx.Impact
Blocker for users following the README. Every
/gsd-*command fails withcommand not found: gsd-sdk(or its programmatic equivalent —Exit code 127from inside Claude Code's Bash tool). The user has no signal that the install was incomplete: the final installer message saysDone! Open a blank directory in Claude Code and run /gsd-new-project, and/gsd-new-projectfails on the firstgsd-sdk query init.new-projectline of its workflow.Affected commands include at minimum:
/gsd-new-project,/gsd-health,/gsd-quick,/gsd-plan-phase,/gsd-execute-phase,/gsd-progress,/gsd-set-profile,/gsd-discuss-phase,/gsd-resume-work. (Anything callinggsd-sdk query ….)Suggested fix
Three non-exclusive directions, in order of effort:
(A) Update the README to recommend
npm install -g get-shit-done-cc@latestas the headline install command, withnpxreserved for one-shot tries that don't need GSD slash commands. Updatebin/gsd-sdk.js's header comment to remove the "ornpx get-shit-done-cc" clause. Lowest effort, highest correctness, but breaks muscle memory for existing users and existing tutorials.(B) Add a real callability check at the end of
installSdkIfNeeded: spawngsd-sdk --help(or equivalent) withstdio: 'ignore'and a 5-second timeout. If it exits non-zero or ENOENT, print a loud red banner with remediation instructions instead of✓ GSD SDK ready. This catches the npx case explicitly and converts the silent failure into a loud one. Recommended as a defense-in-depth addition regardless of (A) or (C).(C) Have the installer detect the npx-cache execution context and shell out to
npm install -g get-shit-done-cc@<thisVersion>itself. The installer already detects this context (seeclassifySdkInstallandctx.npxCachebranches inbin/install.js). Adding an opt-in / promptednpm install -gstep would make the README's headline command Just Work. Risk: nested global installs are noisy and have permission issues on some systems (#2513-class problems); needs careful handling.Personally I'd start with (A) + (B): documentation alignment plus a callability gate, both small and unambiguous. (C) is a bigger lift but is the only option that keeps the README's
npxheadline accurate.Related
--sdkflag documented but not implemented #2385 — gsd-sdk binary missing after install —--sdkflag documented but not implemented (closed; pre-decouple architecture)command not found: gsd-sdkwhen gsd-sdk CLI is not in PATH #2334 —/gsd-quickcrashes withcommand not found: gsd-sdk(closed)/root/.npm/_npx/...after sudo install (wontfix; partial overlap)gsd-sdk query <noun>but shippedgsd-sdkonly exposesrun | auto | init#2647 — workflow docs referencegsd-sdk query <noun>but shipped binary lacks it (closed)querysubcommand fix from main (npm latest 0.1.0 still missing it) #2685 — Publish@gsd-build/sdkwithquerysubcommand fix from main (open; different code path — current 1.38.5 ships the shim in-package and no longer depends on@gsd-build/sdk)Privacy Checklist