chore(#604): rename get-shit-done/ runtime directory to gsd-core/ (#615)

* chore(#604): rename get-shit-done/ runtime directory to gsd-core/

Renames the installed runtime directory `get-shit-done/` to `gsd-core/` so the
on-disk name matches the package (`@opengsd/gsd-core`), repo, and binary
(`gsd-tools`). The npm package name and binary are unchanged; npx/npm consumers
are unaffected.

Mechanical (bulk, ~90% of the diff):
- `git mv get-shit-done gsd-core`
- Swept path/identifier references across the repo via
  `perl -pe 's/get-shit-done(?!-\w)/gsd-core/g'`. The negative lookahead
  preserves the five legitimate slug variants that are NOT the directory:
  get-shit-done-{OLD,cc,classic,cli,redux} (old package/repo names).
- Build/manifest wiring: package.json (bin, files, coverage globs),
  tsconfig.build.json (outDir), ~86 .gitignore build-output entries,
  stryker.config.mjs, scan-ignore files, install.js path strings.
- Frozen (not rewritten): CHANGELOG.md history; translated docs
  (README.<locale>.md and docs/{ja-JP,ko-KR,pt-BR,zh-CN}/).

New logic (review here):
- src/installer-migrations/003-rename-get-shit-done-to-gsd-core.cts: a proper
  ADR-0008 installer migration. On upgrade it walks the legacy
  `~/.claude/get-shit-done/` tree, classifies each file via the prior install
  manifest, and emits remove-managed / backup-and-remove for managed files
  while PRESERVING unknown user-added files. Symlink-safe (skips a symlinked
  root and symlinked entries; bounds-checks every path under configDir). The
  framework rolls back on install failure. Emptied dirs may remain (framework
  has no recursive dir-removal primitive) — documented.
- scripts/lint-legacy-dir-name.cjs: CI regression guard forbidding the bare
  `get-shit-done` directory token (split token to avoid self-match; case-
  insensitive; `(?!-\w)` lookahead allows the slug variants; allowlists
  CHANGELOG, translated docs, and `gsd-allow-legacy-name` marker lines).
  Wired into the lint-tests CI job.
- Restored scripts/lint-package-identity-drift.cjs detection regexes (the
  mechanical sweep had wrongly rewritten the old-name patterns it exists to
  detect) and marked them as intentional legacy references.
- TDD tests for the migration and the guard; do.md slash-command guard regex
  tightened so a `/gsd-core/bin` path segment is not mistaken for a command;
  changeset + docs/installer-migrations.md row added.

Breaking: the installed runtime path moves `~/.claude/get-shit-done/` ->
`~/.claude/gsd-core/`. Migration 003 removes the stale legacy dir's managed
files (preserving user files) on upgrade. Users with custom hooks/configs
hardcoding the old path must update them.

Closes #604

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): unsweep pending changesets + allowlist injection-example docs

CI fixes for the rename PR:
- Do not sweep pending .changeset/*.md (ephemeral release-note fragments,
  like CHANGELOG); reverted those body edits so 5 pre-existing malformed
  fragments (missing type/pr) no longer enter the PR diff and trip docs-lint.
  Allowlisted .changeset/ in the legacy-name guard accordingly.
- Allowlisted TEST-EXAMPLES.md and docs/explanation/security-model.md in
  prompt-injection-scan.sh: they contain intentional injection examples /
  security-model prose; the path-reference rewrites are kept.

CodeQL alerts on this PR are pre-existing (alert lines unchanged by this PR;
none in the new migration/guard) and are out of scope for the rename.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): resolve CodeQL alerts surfaced on this PR

The rename diff touched files carrying pre-existing CodeQL findings; per the
no-pre-existing-dismissal rule, fixing every surfaced alert rather than waving
them off. All behavior-preserving:

- scripts/ci-test-scope.cjs: build the config-path match from string
  .includes() instead of a RegExp over an arg-derived value (js/regex-injection).
- src/profile-output.cts: escape backslashes before pipe-escaping desc/safeName
  so the table-cell escape is complete (js/incomplete-sanitization).
- tests/{bug-2643,bug-2808,docs-parity-live-registry}: two-pass HTML-comment
  strip so a bare/unclosed `<!--` cannot survive (js/incomplete-multi-character-sanitization).
- tests/inline-plan-threshold: drop the no-op `\s`->`\s` identity replace,
  keep the meaningful POSIX-class conversion (js/identity-replacement).

Verified: build:lib green; the touched test files + ci-test-scope + profile-output
suites pass; lint:legacy-name clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): correctly resolve remaining CodeQL alerts (regex-injection + sanitization)

The prior commit's fixes for two alerts were ineffective:
- ci-test-scope.cjs js/regex-injection: the alert is the CLI-arg-derived `file`
  reaching static regex `.test(file)` calls (not the config rule). Removed ALL
  regex over file/t — startsWith/includes/=== string checks + an isWindowsHint
  helper — so there is no regex sink for the tainted value.
- js/incomplete-multi-character-sanitization (3 test files): a single
  `.replace(/<!--...-->/g,'')` can let `<!--` re-form. Replaced with a fixpoint
  loop (replace until stable) plus a final bare-opener strip.

Verified: no regex over file/t remains; ci-test-scope + the 3 test suites pass;
lint:legacy-name clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): make ci-test-scope + comment-strippers regex-free to clear CodeQL

CodeQL flags the regex PATTERNS syntactically (regex-injection on the
--files arg split; incomplete-multi-character-sanitization on the <!--...-->
replace), so loop fixes do not satisfy it. Made these paths regex-free:
- ci-test-scope.cjs splitFiles: char-by-char separator tokenizer (no /[,\\s]+/).
- 3 test files: indexOf/slice HTML-comment stripper (no .replace(/<!--/)).
Behavior preserved; ci-test-scope + the 3 suites pass; guard clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): unblock security base64 scan on the large rename diff

The security job hit its 10m timeout: base64-scan.sh choked on the binary
test fixture tests/feat-3594-parser-property-style.test.cjs (embedded NUL/
non-UTF8 bytes -> thousands of bogus blobs + "ignored null byte" warnings),
and the ~800-file rename diff is slow to scan regardless.

- scripts/base64-scan.sh: skip binary-by-content files (grep -Iq .) — they
  can't carry base64-obfuscated *text* and feeding NUL bytes through the
  per-line scanner is pathologically slow. collect_files already filtered
  binary *extensions*; this catches binary *content* in text extensions.
- .github/workflows/security-scan.yml: raise the security job timeout 10m->30m
  to accommodate very large diffs (the scan itself is unchanged).

Verified locally: scan skips the fixture, 0 "ignored null byte" warnings,
0 findings, exit 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): sweep get-shit-done refs introduced by merging next

The branch was updated with next (#614/#384/#618 etc.), which reference the
get-shit-done/ dir (still named that on next). Swept the stale references in
the merged files to gsd-core so the rename stays consistent and lint:legacy-name
passes:
- commands/gsd/discuss-phase.md (runtime-launcher shim paths)
- src/core.cts (getAgentsDir layout comments)
- tests/bug-384-agents-runtime-aware.test.cjs (require path to runtime lib)

Verified: guard 0 violations; build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): exclude gsd-core/ path segments from bug-3683 command cross-ref invariant

The #614 runtime-launcher shim added to discuss-phase.md references
`${_GSD_RUNTIME_ROOT}/gsd-core/bin/...`. bug-3683's REF_PATTERN excluded path-y
refs only via lookbehind, but `}` precedes `/gsd-core/` in the shim, so it
mis-read the directory path as a dangling `/gsd-core` command ref (same class as
the #604 bug-2954 fix). Added a trailing `(?![\w-]*\/)` so `/gsd-<x>/...` path
segments are not treated as slash-command references.

Verified locally on BOTH platforms before pushing:
- mac (node 26) full suite: 0 failures
- gsd-test-runner (linux, node22 image) full suite: 0 failures
- bug-3683 + bug-2954 pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): lazily resolve findProjectRoot in gsd-tools (harden flaky CI)

CI intermittently failed state.test's gsd-tools subprocess with
"findProjectRoot is not a function" (flip-flopping across legs; not reproducible
on mac full suite, gsd-test linux full suite, test:unit, or state.test x8).
findProjectRoot is a re-export from core.cjs (sourced from project-root.cjs);
binding it via destructure at module-load can be undefined under a load-ordering
edge. Resolve it lazily at call time via a small wrapper so the lookup happens
after core.cjs is fully initialized.

Verified green on BOTH platforms before pushing:
- mac (node 26) full suite: 0 failures
- gsd-test-runner (linux, node22) full suite: 0 failures
- state.test.cjs: 106/106; gsd-tools loads cleanly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(#604): allowlist verification-patterns.md placeholder examples in secret scan

The rename git-mv'd references/verification-patterns.md into gsd-core/, pulling
it into the secret-scan diff. It documents stub/placeholder RED-FLAG env-var
examples (illustrative Stripe test-key / database-URL / API-key placeholders) —
not real credentials. Added it to .secretscanignore with the strict annotation,
mirroring the existing gsd-core/workflows/plan-phase.md exception.

Verified locally: secret-scan-lint --strict OK; secret-scan --diff origin/next
exits 0 with 0 findings.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-06-02 18:35:29 -04:00
committed by GitHub
parent b177c1704f
commit 463cffd894
845 changed files with 3316 additions and 2373 deletions

View File

@@ -0,0 +1,7 @@
---
type: Changed
pr: 604
---
**Installer migration 003 removes stale legacy runtime directory files on upgrade** — the installed runtime config subdirectory was renamed from `~/.claude/get-shit-done/` to `~/.claude/gsd-core/` in #604. <!-- gsd-allow-legacy-name -->
Installer migration `2026-06-02-rename-get-shit-done-to-gsd-core` now removes managed files from the stale legacy directory once `gsd-core/` is confirmed present, preserving any user-added files under the old path. Emptied subdirectory shells may remain on disk (the migration framework operates per-file, not per-directory). The npm package name and binary entrypoints are unchanged.

View File

@@ -10,8 +10,8 @@ Do not make direct repo edits. All changes must go through a GSD workflow:
- `/gsd:verify-work` → verify results
## Architecture
- `get-shit-done/bin/lib/` — Core Node.js library (CommonJS .cjs, no external deps)
- `get-shit-done/workflows/` — Workflow definition files (.md)
- `gsd-core/bin/lib/` — Core Node.js library (CommonJS .cjs, no external deps)
- `gsd-core/workflows/` — Workflow definition files (.md)
- `agents/` — Agent definition files (.md)
- `commands/gsd/` — Slash command definitions (.md)
- `tests/` — Test files (.test.cjs, node:test + node:assert)
@@ -24,4 +24,4 @@ Do not make direct repo edits. All changes must go through a GSD workflow:
## Safety
- Use `execFileSync` (array args) not `execSync` (string interpolation)
- Validate user-provided paths with `validatePath()` from `get-shit-done/bin/lib/security.cjs`
- Validate user-provided paths with `validatePath()` from `gsd-core/bin/lib/security.cjs`

View File

@@ -4,7 +4,7 @@
#
# Project context: GSD ships a CLI tool + an agent runtime, not a documented
# public library. We carry rich JSDoc on internal helpers that warrant it
# (see bin/install.js, get-shit-done/bin/lib/*.cjs) but we do not enforce a
# (see bin/install.js, gsd-core/bin/lib/*.cjs) but we do not enforce a
# blanket docstring coverage bar — see issue #2932 for rationale.
reviews:

View File

@@ -6,42 +6,42 @@ set -euo pipefail
GIT_CMD="${GIT_OVERRIDE:-git}"
NPM_CMD="${NPM_OVERRIDE:-npm}"
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/command-manifest\.|^sdk/src/query/command-aliases\.generated\.ts$|^get-shit-done/bin/lib/command-aliases\.cjs$|^sdk/scripts/gen-command-aliases\.ts$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/command-manifest\.|^sdk/src/query/command-aliases\.generated\.ts$|^gsd-core/bin/lib/command-aliases\.cjs$|^sdk/scripts/gen-command-aliases\.ts$"; then
"$NPM_CMD" run check:alias-drift
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/state-document\.|^get-shit-done/bin/lib/state-document\.generated\.cjs$|^sdk/scripts/gen-state-document\.ts$|^sdk/scripts/check-state-document-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/state-document\.|^gsd-core/bin/lib/state-document\.generated\.cjs$|^sdk/scripts/gen-state-document\.ts$|^sdk/scripts/check-state-document-fresh\.mjs$"; then
"$NPM_CMD" run check:state-document-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/configuration/|^sdk/shared/config-(defaults|schema)\.manifest\.json$|^get-shit-done/bin/lib/configuration\.generated\.cjs$|^sdk/scripts/gen-configuration\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/configuration/|^sdk/shared/config-(defaults|schema)\.manifest\.json$|^gsd-core/bin/lib/configuration\.generated\.cjs$|^sdk/scripts/gen-configuration\.mjs$"; then
"$NPM_CMD" run check:configuration-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/workstream-inventory/|^get-shit-done/bin/lib/workstream-inventory-builder\.generated\.cjs$|^sdk/scripts/gen-workstream-inventory-builder\.mjs$|^sdk/scripts/check-workstream-inventory-builder-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/workstream-inventory/|^gsd-core/bin/lib/workstream-inventory-builder\.generated\.cjs$|^sdk/scripts/gen-workstream-inventory-builder\.mjs$|^sdk/scripts/check-workstream-inventory-builder-fresh\.mjs$"; then
"$NPM_CMD" run check:workstream-inventory-builder-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/project-root/|^get-shit-done/bin/lib/project-root\.generated\.cjs$|^sdk/scripts/gen-project-root\.mjs$|^sdk/scripts/check-project-root-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/project-root/|^gsd-core/bin/lib/project-root\.generated\.cjs$|^sdk/scripts/gen-project-root\.mjs$|^sdk/scripts/check-project-root-fresh\.mjs$"; then
"$NPM_CMD" run check:project-root-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/plan-scan\.ts$|^get-shit-done/bin/lib/plan-scan\.generated\.cjs$|^sdk/scripts/gen-plan-scan\.mjs$|^sdk/scripts/check-plan-scan-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/plan-scan\.ts$|^gsd-core/bin/lib/plan-scan\.generated\.cjs$|^sdk/scripts/gen-plan-scan\.mjs$|^sdk/scripts/check-plan-scan-fresh\.mjs$"; then
"$NPM_CMD" run check:plan-scan-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/secrets\.ts$|^get-shit-done/bin/lib/secrets\.generated\.cjs$|^sdk/scripts/gen-secrets\.mjs$|^sdk/scripts/check-secrets-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/secrets\.ts$|^gsd-core/bin/lib/secrets\.generated\.cjs$|^sdk/scripts/gen-secrets\.mjs$|^sdk/scripts/check-secrets-fresh\.mjs$"; then
"$NPM_CMD" run check:secrets-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/schema-detect\.ts$|^get-shit-done/bin/lib/schema-detect\.generated\.cjs$|^sdk/scripts/gen-schema-detect\.mjs$|^sdk/scripts/check-schema-detect-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/schema-detect\.ts$|^gsd-core/bin/lib/schema-detect\.generated\.cjs$|^sdk/scripts/gen-schema-detect\.mjs$|^sdk/scripts/check-schema-detect-fresh\.mjs$"; then
"$NPM_CMD" run check:schema-detect-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/decisions\.ts$|^get-shit-done/bin/lib/decisions\.generated\.cjs$|^sdk/scripts/gen-decisions\.mjs$|^sdk/scripts/check-decisions-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/query/decisions\.ts$|^gsd-core/bin/lib/decisions\.generated\.cjs$|^sdk/scripts/gen-decisions\.mjs$|^sdk/scripts/check-decisions-fresh\.mjs$"; then
"$NPM_CMD" run check:decisions-fresh
fi
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/workstream-name-policy\.ts$|^get-shit-done/bin/lib/workstream-name-policy\.generated\.cjs$|^sdk/scripts/gen-workstream-name-policy\.mjs$|^sdk/scripts/check-workstream-name-policy-fresh\.mjs$"; then
if "$GIT_CMD" diff --cached --name-only | grep -Eq "^sdk/src/workstream-name-policy\.ts$|^gsd-core/bin/lib/workstream-name-policy\.generated\.cjs$|^sdk/scripts/gen-workstream-name-policy\.mjs$|^sdk/scripts/check-workstream-name-policy-fresh\.mjs$"; then
"$NPM_CMD" run check:workstream-name-policy-fresh
fi

View File

@@ -216,8 +216,8 @@ body:
**Useful diagnostics to include (if applicable):**
- `npm list -g @opengsd/gsd-core` — confirms installed version
- `ls -la ~/.claude/get-shit-done/` — confirms installation files (Claude Code)
- `cat ~/.claude/get-shit-done/gsd-file-manifest.json` — file manifest for debugging install issues
- `ls -la ~/.claude/gsd-core/` — confirms installation files (Claude Code)
- `cat ~/.claude/gsd-core/gsd-file-manifest.json` — file manifest for debugging install issues
- `ls -la .planning/` — confirms planning directory state
**⚠️ PII Warning:** File listings and manifests contain your home directory path. Replace your username with `REDACTED`.

View File

@@ -105,8 +105,8 @@ body:
An enhancement should have a narrow, well-defined scope. If your list is long, this might be a feature, not an enhancement.
placeholder: |
Files modified:
- `get-shit-done/commands/gsd/status.md` — update output format description
- `get-shit-done/bin/lib/state.cjs` — expose phase name in status() return value
- `gsd-core/commands/gsd/status.md` — update output format description
- `gsd-core/bin/lib/state.cjs` — expose phase name in status() return value
- `tests/status.test.cjs` — update snapshot and add test for phase name in output
- `CHANGELOG.md` — user-facing change entry

View File

@@ -105,11 +105,11 @@ body:
If you cannot fill this out, you do not understand the codebase well enough to propose this feature yet.
placeholder: |
Files that would be created:
- `get-shit-done/commands/gsd/rollback.md` — new slash command definition
- `gsd-core/commands/gsd/rollback.md` — new slash command definition
Files that would be modified:
- `get-shit-done/bin/lib/state.cjs` — add rollback() function
- `get-shit-done/bin/lib/phases.cjs` — expose phase snapshot API
- `gsd-core/bin/lib/state.cjs` — add rollback() function
- `gsd-core/bin/lib/phases.cjs` — expose phase snapshot API
- `tests/rollback.test.cjs` — new test file
- `docs/COMMANDS.md` — document new command
- `CHANGELOG.md` — entry for this feature

View File

@@ -20,8 +20,8 @@ on:
- main
paths:
- 'bin/install.js'
- 'get-shit-done/bin/gsd-tools.cjs'
- 'get-shit-done/bin/**'
- 'gsd-core/bin/gsd-tools.cjs'
- 'gsd-core/bin/**'
- 'src/**'
- 'tsconfig.build.json'
- 'package.json'

View File

@@ -15,7 +15,7 @@ on:
paths:
# Only run when lib source, property/unit tests, or mutation config change
- 'src/**/*.cts'
- 'get-shit-done/bin/lib/**/*.cjs'
- 'gsd-core/bin/lib/**/*.cjs'
- 'tests/**/*.property.test.cjs'
- 'tests/**/*.unit.test.cjs'
- 'tests/adr-parser.test.cjs'

View File

@@ -8,7 +8,7 @@ on:
- 'release/**'
- 'hotfix/**'
paths:
- 'get-shit-done/**'
- 'gsd-core/**'
- 'agents/**'
- 'commands/**'
- 'hooks/**'
@@ -25,7 +25,10 @@ concurrency:
jobs:
security:
runs-on: ubuntu-latest
timeout-minutes: 10
# 30m (was 10m): the base64 scan is O(changed-files); a very large diff
# (e.g. the #604 repo-wide rename, ~800 changed files) can exceed 10m. The
# scan itself is unchanged; this only raises the ceiling for big diffs.
timeout-minutes: 30
steps:
- name: Checkout

View File

@@ -111,6 +111,8 @@ jobs:
run: node scripts/lint-command-contract.cjs
- name: Lint — PR checks use projectDir
run: node scripts/lint-pr-check-project-dir.cjs
- name: Lint — legacy directory name guard (#604)
run: npm run lint:legacy-name
test:
name: test (${{ matrix.os }}, ${{ matrix.node-version }})

177
.gitignore vendored
View File

@@ -42,8 +42,8 @@ philosophy.md
# Installed skills
.github/agents/gsd-*
.github/skills/gsd-*
.github/get-shit-done/*
.github/skills/get-shit-done
.github/gsd-core/*
.github/skills/gsd-core
.github/copilot-instructions.md
.bg-shell/
@@ -66,92 +66,93 @@ build/
# ADR-457 build-at-publish: TS-generated runtime artifacts (compiled from src/*.cts
# by `npm run build:lib`). Source of truth is src/; these are emitted, never edited.
# Published via prepublishOnly; built before test via pretest. Grows as modules migrate.
/get-shit-done/bin/lib/semver-compare.cjs
/get-shit-done/bin/lib/config-types.cjs
/get-shit-done/bin/lib/code-review-flags.cjs
/get-shit-done/bin/lib/context-utilization.cjs
/get-shit-done/bin/lib/artifacts.cjs
/get-shit-done/bin/lib/command-arg-projection.cjs
/get-shit-done/bin/lib/clock.cjs
/get-shit-done/bin/lib/ui-safety-gate.cjs
/get-shit-done/bin/lib/review-reviewer-selection.cjs
/get-shit-done/bin/lib/clusters.cjs
/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs
/get-shit-done/bin/lib/observability/redaction.cjs
/get-shit-done/bin/lib/installer-migration-report.cjs
/get-shit-done/bin/lib/prompt-budget.cjs
/get-shit-done/bin/lib/secrets.cjs
/get-shit-done/bin/lib/phase-lifecycle.cjs
/get-shit-done/bin/lib/workstream-name-policy.cjs
/get-shit-done/bin/lib/decisions.cjs
/get-shit-done/bin/lib/validate.cjs
/get-shit-done/bin/lib/schema-detect.cjs
/get-shit-done/bin/lib/runtime-name-policy.cjs
/get-shit-done/bin/lib/runtime-slash.cjs
/get-shit-done/bin/lib/observability/event.cjs
/get-shit-done/bin/lib/workstream-inventory-builder.cjs
/get-shit-done/bin/lib/plan-scan.cjs
/get-shit-done/bin/lib/fallow-runner.cjs
/get-shit-done/bin/lib/project-root.cjs
/get-shit-done/bin/lib/installer-migration-authoring.cjs
/get-shit-done/bin/lib/update-context.cjs
/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs
/get-shit-done/bin/lib/runtime-homes.cjs
/get-shit-done/bin/lib/model-catalog.cjs
/get-shit-done/bin/lib/configuration.cjs
/get-shit-done/bin/lib/state-document.cjs
/get-shit-done/bin/lib/shell-command-projection.cjs
/get-shit-done/bin/lib/security.cjs
/get-shit-done/bin/lib/command-aliases.cjs
/get-shit-done/bin/lib/config-schema.cjs
/get-shit-done/bin/lib/model-profiles.cjs
/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs
/get-shit-done/bin/lib/observability/logger.cjs
/get-shit-done/bin/lib/active-workstream-store.cjs
/get-shit-done/bin/lib/adr-parser.cjs
/get-shit-done/bin/lib/graphify.cjs
/get-shit-done/bin/lib/install-profiles.cjs
/get-shit-done/bin/lib/intel.cjs
/get-shit-done/bin/lib/installer-migrations.cjs
/get-shit-done/bin/lib/worktree-safety.cjs
/get-shit-done/bin/lib/planning-workspace.cjs
/get-shit-done/bin/lib/runtime-artifact-layout.cjs
/get-shit-done/bin/lib/command-routing-hub.cjs
/get-shit-done/bin/lib/core.cjs
/get-shit-done/bin/lib/drift.cjs
/get-shit-done/bin/lib/cjs-command-router-adapter.cjs
/get-shit-done/bin/lib/phase-command-router.cjs
/get-shit-done/bin/lib/surface.cjs
/get-shit-done/bin/lib/gap-checker.cjs
/get-shit-done/bin/lib/docs.cjs
/get-shit-done/bin/lib/check-command-router.cjs
/get-shit-done/bin/lib/frontmatter.cjs
/get-shit-done/bin/lib/learnings.cjs
/get-shit-done/bin/lib/gsd2-import.cjs
/get-shit-done/bin/lib/profile-pipeline.cjs
/get-shit-done/bin/lib/roadmap-upgrade.cjs
/get-shit-done/bin/lib/phases-command-router.cjs
/get-shit-done/bin/lib/verify-command-router.cjs
/get-shit-done/bin/lib/init-command-router.cjs
/get-shit-done/bin/lib/agent-command-router.cjs
/get-shit-done/bin/lib/task-command-router.cjs
/get-shit-done/bin/lib/validate-command-router.cjs
/get-shit-done/bin/lib/workstream-inventory.cjs
/get-shit-done/bin/lib/roadmap-command-router.cjs
/get-shit-done/bin/lib/state-command-router.cjs
/get-shit-done/bin/lib/config.cjs
/get-shit-done/bin/lib/profile-output.cjs
/get-shit-done/bin/lib/template.cjs
/get-shit-done/bin/lib/commands.cjs
/get-shit-done/bin/lib/state.cjs
/get-shit-done/bin/lib/milestone.cjs
/get-shit-done/bin/lib/phase.cjs
/get-shit-done/bin/lib/verify.cjs
/get-shit-done/bin/lib/init.cjs
/get-shit-done/bin/lib/uat.cjs
/get-shit-done/bin/lib/workstream.cjs
/get-shit-done/bin/lib/roadmap.cjs
/get-shit-done/bin/lib/audit.cjs
/gsd-core/bin/lib/semver-compare.cjs
/gsd-core/bin/lib/config-types.cjs
/gsd-core/bin/lib/code-review-flags.cjs
/gsd-core/bin/lib/context-utilization.cjs
/gsd-core/bin/lib/artifacts.cjs
/gsd-core/bin/lib/command-arg-projection.cjs
/gsd-core/bin/lib/clock.cjs
/gsd-core/bin/lib/ui-safety-gate.cjs
/gsd-core/bin/lib/review-reviewer-selection.cjs
/gsd-core/bin/lib/clusters.cjs
/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs
/gsd-core/bin/lib/observability/redaction.cjs
/gsd-core/bin/lib/installer-migration-report.cjs
/gsd-core/bin/lib/prompt-budget.cjs
/gsd-core/bin/lib/secrets.cjs
/gsd-core/bin/lib/phase-lifecycle.cjs
/gsd-core/bin/lib/workstream-name-policy.cjs
/gsd-core/bin/lib/decisions.cjs
/gsd-core/bin/lib/validate.cjs
/gsd-core/bin/lib/schema-detect.cjs
/gsd-core/bin/lib/runtime-name-policy.cjs
/gsd-core/bin/lib/runtime-slash.cjs
/gsd-core/bin/lib/observability/event.cjs
/gsd-core/bin/lib/workstream-inventory-builder.cjs
/gsd-core/bin/lib/plan-scan.cjs
/gsd-core/bin/lib/fallow-runner.cjs
/gsd-core/bin/lib/project-root.cjs
/gsd-core/bin/lib/installer-migration-authoring.cjs
/gsd-core/bin/lib/update-context.cjs
/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs
/gsd-core/bin/lib/runtime-homes.cjs
/gsd-core/bin/lib/model-catalog.cjs
/gsd-core/bin/lib/configuration.cjs
/gsd-core/bin/lib/state-document.cjs
/gsd-core/bin/lib/shell-command-projection.cjs
/gsd-core/bin/lib/security.cjs
/gsd-core/bin/lib/command-aliases.cjs
/gsd-core/bin/lib/config-schema.cjs
/gsd-core/bin/lib/model-profiles.cjs
/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs
/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs
/gsd-core/bin/lib/observability/logger.cjs
/gsd-core/bin/lib/active-workstream-store.cjs
/gsd-core/bin/lib/adr-parser.cjs
/gsd-core/bin/lib/graphify.cjs
/gsd-core/bin/lib/install-profiles.cjs
/gsd-core/bin/lib/intel.cjs
/gsd-core/bin/lib/installer-migrations.cjs
/gsd-core/bin/lib/worktree-safety.cjs
/gsd-core/bin/lib/planning-workspace.cjs
/gsd-core/bin/lib/runtime-artifact-layout.cjs
/gsd-core/bin/lib/command-routing-hub.cjs
/gsd-core/bin/lib/core.cjs
/gsd-core/bin/lib/drift.cjs
/gsd-core/bin/lib/cjs-command-router-adapter.cjs
/gsd-core/bin/lib/phase-command-router.cjs
/gsd-core/bin/lib/surface.cjs
/gsd-core/bin/lib/gap-checker.cjs
/gsd-core/bin/lib/docs.cjs
/gsd-core/bin/lib/check-command-router.cjs
/gsd-core/bin/lib/frontmatter.cjs
/gsd-core/bin/lib/learnings.cjs
/gsd-core/bin/lib/gsd2-import.cjs
/gsd-core/bin/lib/profile-pipeline.cjs
/gsd-core/bin/lib/roadmap-upgrade.cjs
/gsd-core/bin/lib/phases-command-router.cjs
/gsd-core/bin/lib/verify-command-router.cjs
/gsd-core/bin/lib/init-command-router.cjs
/gsd-core/bin/lib/agent-command-router.cjs
/gsd-core/bin/lib/task-command-router.cjs
/gsd-core/bin/lib/validate-command-router.cjs
/gsd-core/bin/lib/workstream-inventory.cjs
/gsd-core/bin/lib/roadmap-command-router.cjs
/gsd-core/bin/lib/state-command-router.cjs
/gsd-core/bin/lib/config.cjs
/gsd-core/bin/lib/profile-output.cjs
/gsd-core/bin/lib/template.cjs
/gsd-core/bin/lib/commands.cjs
/gsd-core/bin/lib/state.cjs
/gsd-core/bin/lib/milestone.cjs
/gsd-core/bin/lib/phase.cjs
/gsd-core/bin/lib/verify.cjs
/gsd-core/bin/lib/init.cjs
/gsd-core/bin/lib/uat.cjs
/gsd-core/bin/lib/workstream.cjs
/gsd-core/bin/lib/roadmap.cjs
/gsd-core/bin/lib/audit.cjs
__pycache__/
*.pyc
.venv/

View File

@@ -100,5 +100,5 @@ This may be revisited if a contributor:
precedent for deterministic compile-time embedding into agent files)
- v1.37.0 release notes — shared-boilerplate extraction (reference files for
mandatory-initial-read, project-skills-discovery)
- `get-shit-done/workflows/` — workflow-level config embedding before subagent
- `gsd-core/workflows/` — workflow-level config embedding before subagent
spawn (the path of least friction for incremental deterministic gating)

View File

@@ -53,4 +53,4 @@ through to a triage decision rather than dropping an issue and moving on.
## Related
- `.planning/state/` — existing session-continuity artifacts
- `get-shit-done/references/` — where any future plugin-interface doc would live
- `gsd-core/references/` — where any future plugin-interface doc would live

View File

@@ -10,7 +10,7 @@ All changes in `bin/install.js` unless noted.
**Line 5391-5392** — After `fs.copyFileSync`, add `fs.chmodSync(destFile, 0o755)` for `.sh` files.
### Fix 2: Fix Codex hook path and filename (CRITICAL)
**Line 5485** — Change `gsd-update-check.js` to `gsd-check-update.js` and fix path from `get-shit-done/hooks/` to `hooks/`.
**Line 5485** — Change `gsd-update-check.js` to `gsd-check-update.js` and fix path from `gsd-core/hooks/` to `hooks/`.
**Line 5492** — Update dedup check to use `gsd-check-update`.
### Fix 3: Fix stale cache invalidation path (CRITICAL)

View File

@@ -23,5 +23,8 @@
# Lint: scripts/secret-scan-lint.sh --file .secretscanignore
# Strict scan: scripts/secret-scan.sh --diff origin/main --strict
# allow: get-shit-done/workflows/plan-phase.md reason="contains illustrative DATABASE_URL/REDIS_URL example strings used as documentation placeholders — not real credentials" owner="@open-gsd/maintainers" expires="2027-06-30"
get-shit-done/workflows/plan-phase.md
# allow: gsd-core/workflows/plan-phase.md reason="contains illustrative DATABASE_URL/REDIS_URL example strings used as documentation placeholders — not real credentials" owner="@open-gsd/maintainers" expires="2027-06-30"
gsd-core/workflows/plan-phase.md
# allow: gsd-core/references/verification-patterns.md reason="documents stub/placeholder RED-FLAG examples for env vars (illustrative Stripe test-key, database-URL and API-key placeholders shown as what NOT to ship) — not real credentials" owner="@open-gsd/maintainers" expires="2027-06-30"
gsd-core/references/verification-patterns.md

View File

@@ -8,7 +8,7 @@ For current work on **Grok Build compatibility** and multi-runtime synchronizati
## Project Structure & Module Organization
This repository ships GSD as a Node.js CLI and SDK. Root package entry points live in `bin/`, scripts in `scripts/`, runtime hooks in `hooks/`, command definitions in `commands/gsd/`, and workflow/template content in `get-shit-done/`. Agent role files are in `agents/`; docs are in `docs/`; logos and terminal images are in `assets/`. Root tests are in `tests/*.test.cjs`. The TypeScript SDK is isolated under `sdk/`, with source and Vitest tests in `sdk/src/`.
This repository ships GSD as a Node.js CLI and SDK. Root package entry points live in `bin/`, scripts in `scripts/`, runtime hooks in `hooks/`, command definitions in `commands/gsd/`, and workflow/template content in `gsd-core/`. Agent role files are in `agents/`; docs are in `docs/`; logos and terminal images are in `assets/`. Root tests are in `tests/*.test.cjs`. The TypeScript SDK is isolated under `sdk/`, with source and Vitest tests in `sdk/src/`.
## Build, Test, and Development Commands

View File

@@ -9,13 +9,13 @@
## Glossary — Domain modules and seams
### Milestone Module
Module owning `milestone complete` (archive roadmap/requirements/phases, build MILESTONES.md entry, update STATE.md), `requirements mark-complete` (checkbox + table update with regex-global-state fix), and `phases clear`. Key behaviors: milestone-phase scoping (extract phases from ROADMAP.md milestone slice, support project-code-prefix dirs e.g. CK-01-name, exclude prior-milestone phases), milestone-archive layout (resolve phase dirs from `.planning/milestones/v*-phases/` when `.planning/phases/` absent), fenced-code-block boundary tracking in `extractCurrentMilestone`. Source of truth: `get-shit-done/bin/lib/milestone.cjs` (query handlers for `milestone.complete`, `phases.archive`). Test consolidation: PR #3753 (10 files → 4). (The SDK milestone surface and `GSD.run()` milestone runner were retired with the SDK package per ADR-0174.)
Module owning `milestone complete` (archive roadmap/requirements/phases, build MILESTONES.md entry, update STATE.md), `requirements mark-complete` (checkbox + table update with regex-global-state fix), and `phases clear`. Key behaviors: milestone-phase scoping (extract phases from ROADMAP.md milestone slice, support project-code-prefix dirs e.g. CK-01-name, exclude prior-milestone phases), milestone-archive layout (resolve phase dirs from `.planning/milestones/v*-phases/` when `.planning/phases/` absent), fenced-code-block boundary tracking in `extractCurrentMilestone`. Source of truth: `gsd-core/bin/lib/milestone.cjs` (query handlers for `milestone.complete`, `phases.archive`). Test consolidation: PR #3753 (10 files → 4). (The SDK milestone surface and `GSD.run()` milestone runner were retired with the SDK package per ADR-0174.)
### Dispatch Pipeline Module
Module that composes Dispatch Policy Module, Query Execution Policy Module, and per-stage handlers (input-validation, plan, execution, result-builder, formatting, error-mapping, observability) into the end-to-end pipeline that produces a `QueryDispatchResult`. The SDK-era pipeline collapsed onto the Command Routing Hub per ADR-0174; current dispatch seam: `get-shit-done/bin/lib/command-routing-hub.cjs` (see Command Routing Hub below).
Module that composes Dispatch Policy Module, Query Execution Policy Module, and per-stage handlers (input-validation, plan, execution, result-builder, formatting, error-mapping, observability) into the end-to-end pipeline that produces a `QueryDispatchResult`. The SDK-era pipeline collapsed onto the Command Routing Hub per ADR-0174; current dispatch seam: `gsd-core/bin/lib/command-routing-hub.cjs` (see Command Routing Hub below).
### Phase Lifecycle Module
Module owning phase create, rename, complete, remove, list, and plan-index operations, plus phase-dir prefix validation, STATE.md staleness detection, and auto-prune behaviour. Entry point: `get-shit-done/bin/lib/phase.cjs` (CJS surface). Typed phase events: `GSDPhaseStartEvent`, `GSDPhaseStepStartEvent`, `GSDPhaseStepCompleteEvent`, `GSDPhaseCompleteEvent`. (The SDK native-query surface, the `types.ts` event definitions, `phase-runner.ts`, and `phase-prompt.ts` were retired with the SDK package per ADR-0174.)
Module owning phase create, rename, complete, remove, list, and plan-index operations, plus phase-dir prefix validation, STATE.md staleness detection, and auto-prune behaviour. Entry point: `gsd-core/bin/lib/phase.cjs` (CJS surface). Typed phase events: `GSDPhaseStartEvent`, `GSDPhaseStepStartEvent`, `GSDPhaseStepCompleteEvent`, `GSDPhaseCompleteEvent`. (The SDK native-query surface, the `types.ts` event definitions, `phase-runner.ts`, and `phase-prompt.ts` were retired with the SDK package per ADR-0174.)
### Dispatch Policy Module
Module owning dispatch error mapping, fallback policy, timeout classification, and CLI exit mapping contract.
@@ -41,7 +41,7 @@ Adapter Module that satisfies native query dispatch at the Dispatch Policy seam,
Module owning projection from dispatch results/errors to CLI `{ exitCode, stdoutChunks, stderrLines }` output contract.
### STATE.md Document Module
Module owning STATE.md parse, field extraction, field replacement, status normalization, and frontmatter reconstruction. It does not scan `.planning/phases` and does not own persistence or locking; phase/plan/summary counts arrive from inventory/progress Modules as inputs, and read-modify-write paths remain Adapters. Source of truth: `get-shit-done/bin/lib/state-document.cjs`.
Module owning STATE.md parse, field extraction, field replacement, status normalization, and frontmatter reconstruction. It does not scan `.planning/phases` and does not own persistence or locking; phase/plan/summary counts arrive from inventory/progress Modules as inputs, and read-modify-write paths remain Adapters. Source of truth: `gsd-core/bin/lib/state-document.cjs`.
### Query Execution Policy Module
Module owning query transport routing policy projection (`preferNative`, fallback policy, workstream subprocess forcing) at execution seam.
@@ -56,70 +56,70 @@ Canonical command normalization and resolution Interface (`query-command-resolut
Module owning command resolution, policy projection (`mutation`, `output_mode`), unknown-command diagnosis, and handler Adapter binding at one seam for query dispatch.
### Init Command Module
Module owning the `init.*` family of query handlers that compose atomic queries into the flat JSON bundles consumed by init workflows (`/gsd-execute-phase`, `/gsd-plan-phase`, `/gsd-verify-work`, `/gsd-new-project`, `/gsd-manager`, `/gsd-progress`, `/gsd-resume`, etc.). Source of truth: `get-shit-done/bin/lib/init.cjs` — the basic handlers (plus `withProjectRoot` project-identity injection) and the 3 heavyweight handlers (`initNewProject`, `initProgress`, `initManager`). All handlers return `{ data: <flat JSON> }`. Test seams: `tests/init.test.cjs` and `tests/init-manager.test.cjs` (cover withProjectRoot precedence, progress/manager precedence regression #2674, workstream scoping regression #3196, and cross-milestone dependency regression #2267). (The SDK `handlers/init/*.ts` sources and the `init*.test.ts` seams were retired with the SDK package per ADR-0174.)
Module owning the `init.*` family of query handlers that compose atomic queries into the flat JSON bundles consumed by init workflows (`/gsd-execute-phase`, `/gsd-plan-phase`, `/gsd-verify-work`, `/gsd-new-project`, `/gsd-manager`, `/gsd-progress`, `/gsd-resume`, etc.). Source of truth: `gsd-core/bin/lib/init.cjs` — the basic handlers (plus `withProjectRoot` project-identity injection) and the 3 heavyweight handlers (`initNewProject`, `initProgress`, `initManager`). All handlers return `{ data: <flat JSON> }`. Test seams: `tests/init.test.cjs` and `tests/init-manager.test.cjs` (cover withProjectRoot precedence, progress/manager precedence regression #2674, workstream scoping regression #3196, and cross-milestone dependency regression #2267). (The SDK `handlers/init/*.ts` sources and the `init*.test.ts` seams were retired with the SDK package per ADR-0174.)
### Command Routing Hub
Single dispatch seam (`get-shit-done/bin/lib/command-routing-hub.cjs`) that centralizes CJS routing, the no-throw pure-result contract, typed error variants, and dispatch-event emission for all command family adapters. Interface: `createHub({ cjsRegistry, manifest, logger }) → hub`; `hub.dispatch({ family, subcommand, args, cwd, raw, parentTraceId? }) → Result` where `Result = { ok: true, data } | { ok: false, kind, ...typedPayload }` and `kind ∈ { UnknownCommand, InvalidArgs, HandlerRefusal, HandlerFailure }`. The Hub is single-runtime (no mode selection, no sdkLoader), never prints, never exits, never throws. Adapters call `createHub`, dispatch, then translate the pure Result to `output()`/`error()` calls. Source: `get-shit-done/bin/lib/command-routing-hub.cjs`; ADR: `docs/adr/0174-retire-gsd-sdk-package-boundary.md`.
Single dispatch seam (`gsd-core/bin/lib/command-routing-hub.cjs`) that centralizes CJS routing, the no-throw pure-result contract, typed error variants, and dispatch-event emission for all command family adapters. Interface: `createHub({ cjsRegistry, manifest, logger }) → hub`; `hub.dispatch({ family, subcommand, args, cwd, raw, parentTraceId? }) → Result` where `Result = { ok: true, data } | { ok: false, kind, ...typedPayload }` and `kind ∈ { UnknownCommand, InvalidArgs, HandlerRefusal, HandlerFailure }`. The Hub is single-runtime (no mode selection, no sdkLoader), never prints, never exits, never throws. Adapters call `createHub`, dispatch, then translate the pure Result to `output()`/`error()` calls. Source: `gsd-core/bin/lib/command-routing-hub.cjs`; ADR: `docs/adr/0174-retire-gsd-sdk-package-boundary.md`.
### Runtime Source Layout Module
Single-runtime seam layout for this repository after SDK retirement. Runtime execution paths live under `get-shit-done/bin/lib/` and are grouped by seam concern (dispatch, manifest, handlers, runtime, observability, installer). ADR-0174 preserves the seam vocabulary and defines the canonical long-term shape as a seam-aligned TypeScript `src/` tree (`src/dispatch/`, `src/handlers/`, `src/errors/`, `src/manifest/`, `src/config/`, `src/state/`, `src/workstream/`, `src/runtime/`, `src/cli/`, `src/observability/`) compiled to CJS.
Single-runtime seam layout for this repository after SDK retirement. Runtime execution paths live under `gsd-core/bin/lib/` and are grouped by seam concern (dispatch, manifest, handlers, runtime, observability, installer). ADR-0174 preserves the seam vocabulary and defines the canonical long-term shape as a seam-aligned TypeScript `src/` tree (`src/dispatch/`, `src/handlers/`, `src/errors/`, `src/manifest/`, `src/config/`, `src/state/`, `src/workstream/`, `src/runtime/`, `src/cli/`, `src/observability/`) compiled to CJS.
### Runtime Launcher Module
Canonical space-safe shell preamble (`gsd_run`) used by every workflow bash block to invoke the GSD runtime CLI. Resolves `get-shit-done/bin/gsd-tools.cjs` via `node` when present, falls back to a `gsd-tools` binary on PATH, else errors. Single source of truth: `get-shit-done/workflows/_runtime-launcher.snippet.sh`; propagated by `scripts/sync-runtime-launcher.cjs`; enforced by `tests/runtime-launcher-parity.test.cjs`. Replaced the retired unquoted `$GSD_SDK` variable (#373).
Canonical space-safe shell preamble (`gsd_run`) used by every workflow bash block to invoke the GSD runtime CLI. Resolves `gsd-core/bin/gsd-tools.cjs` via `node` when present, falls back to a `gsd-tools` binary on PATH, else errors. Single source of truth: `gsd-core/workflows/_runtime-launcher.snippet.sh`; propagated by `scripts/sync-runtime-launcher.cjs`; enforced by `tests/runtime-launcher-parity.test.cjs`. Replaced the retired unquoted `$GSD_SDK` variable (#373).
### Dispatch Observability Module
Module owning dispatch-event creation, redaction, and logger behavior for the Command Routing Hub. Core files: `get-shit-done/bin/lib/observability/event.cjs`, `get-shit-done/bin/lib/observability/logger.cjs`, `get-shit-done/bin/lib/observability/redaction.cjs`. Contract: silent on success by default, structured JSON to stderr on error, and opt-in audit trail at `.planning/.gsd-trace.jsonl` via `GSD_AUDIT=1` or config (`audit.enabled`). Each dispatch carries a `traceId`; composed dispatches set `parentTraceId` for correlation.
Module owning dispatch-event creation, redaction, and logger behavior for the Command Routing Hub. Core files: `gsd-core/bin/lib/observability/event.cjs`, `gsd-core/bin/lib/observability/logger.cjs`, `gsd-core/bin/lib/observability/redaction.cjs`. Contract: silent on success by default, structured JSON to stderr on error, and opt-in audit trail at `.planning/.gsd-trace.jsonl` via `GSD_AUDIT=1` or config (`audit.enabled`). Each dispatch carries a `traceId`; composed dispatches set `parentTraceId` for correlation.
### Query Pre-Project Config Policy Module
Module policy that defines query-time behavior when `.planning/config.json` is absent: use built-in defaults for parity-sensitive query Interfaces, and emit parity-aligned empty model ids for pre-project model resolution surfaces.
### Configuration Module
Module owning config load, legacy-key normalization, defaults merge, and explicit on-disk migration for `.planning/config.json`. Interface: `loadConfig(cwd) → MergedConfig` (pure read, never writes disk), `normalizeLegacyKeys(parsed) → { parsed, normalizations[] }` (idempotent, pure, returns the list of normalizations applied), `mergeDefaults(parsed) → MergedConfig` (deep-merge of parsed config over canonical defaults), `migrateOnDisk(cwd) → MigrationReport` (explicit, opt-in, called by the installer and by `gsd-tools migrate-config`). Invariants: never mutates disk inside `loadConfig`; legacy top-level keys (`branching_strategy`, `sub_repos`, `multiRepo`, `depth`) are normalized into their canonical nested locations in the returned value; defaults come from the shared `get-shit-done/bin/shared/config-defaults.manifest.json`; schema (`VALID_CONFIG_KEYS`, `RUNTIME_STATE_KEYS`, `DYNAMIC_KEY_PATTERNS`) comes from `get-shit-done/bin/shared/config-schema.manifest.json`. Source of truth: `get-shit-done/bin/lib/configuration.cjs`, consumed via the thin Adapters at `bin/lib/core.cjs:loadConfig` and `bin/lib/config-schema.cjs`. Eliminates the recurring #3523-class drift bug structurally.
Module owning config load, legacy-key normalization, defaults merge, and explicit on-disk migration for `.planning/config.json`. Interface: `loadConfig(cwd) → MergedConfig` (pure read, never writes disk), `normalizeLegacyKeys(parsed) → { parsed, normalizations[] }` (idempotent, pure, returns the list of normalizations applied), `mergeDefaults(parsed) → MergedConfig` (deep-merge of parsed config over canonical defaults), `migrateOnDisk(cwd) → MigrationReport` (explicit, opt-in, called by the installer and by `gsd-tools migrate-config`). Invariants: never mutates disk inside `loadConfig`; legacy top-level keys (`branching_strategy`, `sub_repos`, `multiRepo`, `depth`) are normalized into their canonical nested locations in the returned value; defaults come from the shared `gsd-core/bin/shared/config-defaults.manifest.json`; schema (`VALID_CONFIG_KEYS`, `RUNTIME_STATE_KEYS`, `DYNAMIC_KEY_PATTERNS`) comes from `gsd-core/bin/shared/config-schema.manifest.json`. Source of truth: `gsd-core/bin/lib/configuration.cjs`, consumed via the thin Adapters at `bin/lib/core.cjs:loadConfig` and `bin/lib/config-schema.cjs`. Eliminates the recurring #3523-class drift bug structurally.
### Planning Workspace Module
Module owning `.planning` path resolution, active workstream pointer policy (`session-scoped > shared`), pointer self-heal behavior, and planning lock semantics for workstream-aware execution.
### Workstream Inventory Module
Module owning workstream directory discovery, per-workstream state projection, phase/plan/summary counting, roadmap-declared phase count, active marker projection, and active-workstream collision inputs. Command handlers render list/status/progress outputs from this inventory instead of rescanning `.planning/workstreams/*` directly. Source of truth for the pure projection is `get-shit-done/bin/lib/workstream-inventory-builder.cjs` (a Builder Module); the Reader Adapter `get-shit-done/bin/lib/workstream-inventory.cjs` collects filesystem inputs and delegates projection to the Builder.
Module owning workstream directory discovery, per-workstream state projection, phase/plan/summary counting, roadmap-declared phase count, active marker projection, and active-workstream collision inputs. Command handlers render list/status/progress outputs from this inventory instead of rescanning `.planning/workstreams/*` directly. Source of truth for the pure projection is `gsd-core/bin/lib/workstream-inventory-builder.cjs` (a Builder Module); the Reader Adapter `gsd-core/bin/lib/workstream-inventory.cjs` collects filesystem inputs and delegates projection to the Builder.
### Project-Root Resolution Module
Module owning project-root resolution from any starting directory. Walks the ancestor chain (bounded by `FIND_PROJECT_ROOT_MAX_DEPTH = 10`) applying four heuristics in order: (0) own `.planning/` guard (#1362), (1) parent `.planning/config.json` `sub_repos` traversal, (2) legacy `multiRepo: true` boolean + ancestor `.git`, (3) `.git` heuristic with parent `.planning/`. Returns `startDir` when no ancestor qualifies. Sync `node:fs` I/O. Source of truth: `get-shit-done/bin/lib/project-root.cjs`; consumed via a thin re-export at `get-shit-done/bin/lib/core.cjs`.
Module owning project-root resolution from any starting directory. Walks the ancestor chain (bounded by `FIND_PROJECT_ROOT_MAX_DEPTH = 10`) applying four heuristics in order: (0) own `.planning/` guard (#1362), (1) parent `.planning/config.json` `sub_repos` traversal, (2) legacy `multiRepo: true` boolean + ancestor `.git`, (3) `.git` heuristic with parent `.planning/`. Returns `startDir` when no ancestor qualifies. Sync `node:fs` I/O. Source of truth: `gsd-core/bin/lib/project-root.cjs`; consumed via a thin re-export at `gsd-core/bin/lib/core.cjs`.
### Planning Path Projection Module
SDK query Module owning projection from project/workstream context to concrete `.planning` paths. Policy precedence is `explicit workstream > env workstream > env project > root`. Invalid workspace context is a validation error at this seam rather than a silent fallback.
### Worktree Safety Policy Module
CJS Module owning worktree lifecycle safety policy for the GSD orchestration layer. Interface: `resolveWorktreeContext(cwd, deps) → WorktreeContext` (linked-worktree root mapping), `parseWorktreePorcelain(output) → WorktreeEntry[]` (porcelain parser, skips detached HEAD), `planWorktreePrune(repoRoot, opts, deps) → PrunePlan` (metadata-prune plan, never destructive by default), `executeWorktreePrunePlan(plan, deps) → PruneResult` (executes prune; degrades gracefully on git timeout), `listLinkedWorktreePaths(repoRoot, deps) → LinkedPathsResult`, `inspectWorktreeHealth(repoRoot, opts, deps) → HealthResult` (orphan + stale detection), `snapshotWorktreeInventory(repoRoot, opts, deps) → InventoryResult`, `planWorktreeWaveCleanup(repoRoot, manifest) → CleanupPlan` (manifest-scoped, fail-closed), `executeWorktreeWaveCleanupPlan(plan, deps) → CleanupResult`. Source of truth: `get-shit-done/bin/lib/worktree-safety.cjs`. Timeout path: all git subprocess calls are bounded; callers receive `ok:false, reason:'git_timed_out'` rather than a thrown exception. Test anchor: `tests/worktree-safety.test.cjs`.
CJS Module owning worktree lifecycle safety policy for the GSD orchestration layer. Interface: `resolveWorktreeContext(cwd, deps) → WorktreeContext` (linked-worktree root mapping), `parseWorktreePorcelain(output) → WorktreeEntry[]` (porcelain parser, skips detached HEAD), `planWorktreePrune(repoRoot, opts, deps) → PrunePlan` (metadata-prune plan, never destructive by default), `executeWorktreePrunePlan(plan, deps) → PruneResult` (executes prune; degrades gracefully on git timeout), `listLinkedWorktreePaths(repoRoot, deps) → LinkedPathsResult`, `inspectWorktreeHealth(repoRoot, opts, deps) → HealthResult` (orphan + stale detection), `snapshotWorktreeInventory(repoRoot, opts, deps) → InventoryResult`, `planWorktreeWaveCleanup(repoRoot, manifest) → CleanupPlan` (manifest-scoped, fail-closed), `executeWorktreeWaveCleanupPlan(plan, deps) → CleanupResult`. Source of truth: `gsd-core/bin/lib/worktree-safety.cjs`. Timeout path: all git subprocess calls are bounded; callers receive `ok:false, reason:'git_timed_out'` rather than a thrown exception. Test anchor: `tests/worktree-safety.test.cjs`.
### Worktree Lifecycle Module
Workflow contract seam covering agent worktree lifecycle orchestration rules. The `worktree_branch_check` block lives in one canonical fragment (`get-shit-done/references/worktree-branch-check.md`) that `execute-phase.md`, `quick.md`, `diagnose-issues.md`, and `execute-plan.md` embed at dispatch. Key invariants: `worktree_branch_check` is **verify-only and fail-closed** — the orchestrator owns worktree lifecycle and base recovery, so the sub-agent holds no state-correction primitives; HEAD attachment verified via `git symbolic-ref`; positive allow-list `^worktree-agent-*` enforced; `git update-ref` on protected refs is prohibited; on base mismatch the sub-agent halts with `exit 42` and surfaces to the orchestrator (#48); the orchestrator runs a cwd-drift guard at `execute_waves` entry that resolves the worktree root and refuses drift into an agent worktree (#48); cleanup is manifest-scoped (`WAVE_WORKTREE_MANIFEST`) not global-discovery-based; worktree spawning is sequential (one `run_in_background` at a time to avoid `config.lock` contention). Test anchor: `tests/worktree.test.cjs`.
Workflow contract seam covering agent worktree lifecycle orchestration rules. The `worktree_branch_check` block lives in one canonical fragment (`gsd-core/references/worktree-branch-check.md`) that `execute-phase.md`, `quick.md`, `diagnose-issues.md`, and `execute-plan.md` embed at dispatch. Key invariants: `worktree_branch_check` is **verify-only and fail-closed** — the orchestrator owns worktree lifecycle and base recovery, so the sub-agent holds no state-correction primitives; HEAD attachment verified via `git symbolic-ref`; positive allow-list `^worktree-agent-*` enforced; `git update-ref` on protected refs is prohibited; on base mismatch the sub-agent halts with `exit 42` and surfaces to the orchestrator (#48); the orchestrator runs a cwd-drift guard at `execute_waves` entry that resolves the worktree root and refuses drift into an agent worktree (#48); cleanup is manifest-scoped (`WAVE_WORKTREE_MANIFEST`) not global-discovery-based; worktree spawning is sequential (one `run_in_background` at a time to avoid `config.lock` contention). Test anchor: `tests/worktree.test.cjs`.
### Worktree Root Resolution Adapter Module
Adapter Module owning linked-worktree root mapping and metadata-prune policy (`git worktree prune` non-destructive default) for planning/workstream callers.
### Runtime Name Policy Module
Module owning runtime identity normalization at runtime-selection seams. Canonicalizes alias signals from env/config (`GSD_RUNTIME`, `.planning/config.json:runtime`) to supported runtime IDs so output emitters and query runtime gates stay consistent across naming variants (for example `codex-app`/`codex-cli` -> `codex`). Sources: `get-shit-done/bin/lib/runtime-name-policy.cjs`, alias manifest `get-shit-done/bin/shared/runtime-aliases.manifest.json`.
Module owning runtime identity normalization at runtime-selection seams. Canonicalizes alias signals from env/config (`GSD_RUNTIME`, `.planning/config.json:runtime`) to supported runtime IDs so output emitters and query runtime gates stay consistent across naming variants (for example `codex-app`/`codex-cli` -> `codex`). Sources: `gsd-core/bin/lib/runtime-name-policy.cjs`, alias manifest `gsd-core/bin/shared/runtime-aliases.manifest.json`.
### Installer Migration Authoring Guard Module
Module owning validation for Installer Migration Module records and planned actions. It enforces migration metadata, explicit install scopes, ownership evidence for destructive/config actions, and runtime contract citations for runtime config rewrites before a migration can enter planning or apply.
### Installer Module
Primary installer for all runtimes. Single production file: `bin/install.js` (generated). Exports: `install(isGlobal, runtime[, configDir])` → typed result `{ runtime, configDir, settingsPath, settings, statuslineCommand, updateBannerCommand }`; `uninstall(isGlobal, runtime[, configDir])`; `installRuntimeArtifacts(runtime, configDir, scope, resolvedProfile)`; `uninstallRuntimeArtifacts(runtime, configDir, scope)`; `writeManifest(configDir, runtime)`. Runtime enum: `allRuntimes` (15 values: claude, antigravity, augment, cline, codebuddy, codex, copilot, cursor, gemini, hermes, kilo, opencode, qwen, trae, windsurf). Directory helpers: `getDirName(runtime)` → local dir name; `getGlobalDir(runtime[, explicitDir])` → global path (env-var–aware per runtime); `getConfigDirFromHome(runtime, isGlobal)` → shell-quoted path fragment. Runtime-specific helpers: `resolveKiloConfigPath(configDir)`, `configureKiloPermissions(isGlobal[, explicitDir])`. Layout-driven artifact copy/removal delegates to `get-shit-done/bin/lib/runtime-artifact-layout.cjs:resolveRuntimeArtifactLayout` (throws `TypeError` for unknown runtimes). Hermes uses nested `skills/gsd/<stem>/` layout (prefix: ''); other skill-runtimes use flat `skills/gsd-<stem>/` layout. See Skill Surface Budget Module and Runtime Artifact Layout Module.
Primary installer for all runtimes. Single production file: `bin/install.js` (generated). Exports: `install(isGlobal, runtime[, configDir])` → typed result `{ runtime, configDir, settingsPath, settings, statuslineCommand, updateBannerCommand }`; `uninstall(isGlobal, runtime[, configDir])`; `installRuntimeArtifacts(runtime, configDir, scope, resolvedProfile)`; `uninstallRuntimeArtifacts(runtime, configDir, scope)`; `writeManifest(configDir, runtime)`. Runtime enum: `allRuntimes` (15 values: claude, antigravity, augment, cline, codebuddy, codex, copilot, cursor, gemini, hermes, kilo, opencode, qwen, trae, windsurf). Directory helpers: `getDirName(runtime)` → local dir name; `getGlobalDir(runtime[, explicitDir])` → global path (env-var–aware per runtime); `getConfigDirFromHome(runtime, isGlobal)` → shell-quoted path fragment. Runtime-specific helpers: `resolveKiloConfigPath(configDir)`, `configureKiloPermissions(isGlobal[, explicitDir])`. Layout-driven artifact copy/removal delegates to `gsd-core/bin/lib/runtime-artifact-layout.cjs:resolveRuntimeArtifactLayout` (throws `TypeError` for unknown runtimes). Hermes uses nested `skills/gsd/<stem>/` layout (prefix: ''); other skill-runtimes use flat `skills/gsd-<stem>/` layout. See Skill Surface Budget Module and Runtime Artifact Layout Module.
### Package Identity Module [Planned]
Single seam owning GSD's published-package coordinates so a repoint/rename is a one-line change instead of a tree-wide sweep. Source of truth is `package.json`; values are *derived*, not re-typed: `packageName` (`.name` → `@opengsd/get-shit-done-redux`), `binName` (`Object.keys(.bin)[0]` → `get-shit-done-redux`), `repoSlug` (parsed from `.repository.url` → `open-gsd/get-shit-done-redux`), plus derived `changelogRawUrl` and `manualInstallCommand({ scope, runtime })`. Generated `.cjs` per ADR-457 (generated-single-source); shipped under `get-shit-done/bin/lib/`. Three consumer worlds: **Node** consumers `require()` it at runtime (worker, `check-latest-version.cjs`, `bin/install.js`); the **bash launcher** snippet receives the literal injected by `scripts/sync-runtime-launcher.cjs` at sync time; **prose/help** literals (`update.md`, installer help) carry a committed copy. A drift-guard lint (`scripts/lint-package-identity-drift.cjs`, sibling to `check:alias-drift`) fails CI on any raw package/repo literal outside `package.json`, the generated module, and the value-checked materialization sites — this is what keeps the seam real (`two adapters`, not one). Replaces the contradictory pair it consolidates: the runtime-broken `require('../package.json').name` in `hooks/gsd-check-update-worker.js` (#378, resolves to `undefined` post-install) and the hardcoded constant in `check-latest-version.cjs` (#2992). _Avoid_: "package name string", "the npm name" (when you mean the seam). See ADR-457 and Installer Module.
Single seam owning GSD's published-package coordinates so a repoint/rename is a one-line change instead of a tree-wide sweep. Source of truth is `package.json`; values are *derived*, not re-typed: `packageName` (`.name` → `@opengsd/get-shit-done-redux`), `binName` (`Object.keys(.bin)[0]` → `get-shit-done-redux`), `repoSlug` (parsed from `.repository.url` → `open-gsd/get-shit-done-redux`), plus derived `changelogRawUrl` and `manualInstallCommand({ scope, runtime })`. Generated `.cjs` per ADR-457 (generated-single-source); shipped under `gsd-core/bin/lib/`. Three consumer worlds: **Node** consumers `require()` it at runtime (worker, `check-latest-version.cjs`, `bin/install.js`); the **bash launcher** snippet receives the literal injected by `scripts/sync-runtime-launcher.cjs` at sync time; **prose/help** literals (`update.md`, installer help) carry a committed copy. A drift-guard lint (`scripts/lint-package-identity-drift.cjs`, sibling to `check:alias-drift`) fails CI on any raw package/repo literal outside `package.json`, the generated module, and the value-checked materialization sites — this is what keeps the seam real (`two adapters`, not one). Replaces the contradictory pair it consolidates: the runtime-broken `require('../package.json').name` in `hooks/gsd-check-update-worker.js` (#378, resolves to `undefined` post-install) and the hardcoded constant in `check-latest-version.cjs` (#2992). _Avoid_: "package name string", "the npm name" (when you mean the seam). See ADR-457 and Installer Module.
### Update Context Module [Planned]
Module owning install detection for `/gsd:update`. `resolveUpdateContext({ home, cwd, env, fs, preferredConfigDir, preferredRuntime })` is a pure, injected-fs port of update.md's former ~280-line `get_installed_version` bash; it reproduces the full precedence cascade — preferred-config-dir fast path, local-over-global probe with same-path dedup, env-var overrides (`CLAUDE_CONFIG_DIR`, `OPENCODE_CONFIG`, `KILO_CONFIG`, `XDG_CONFIG_HOME`, `CODEX_HOME`, …), and semver validation — and returns the 4-field contract `{ installedVersion, scope, runtime, gsdDir }` (scope ∈ `LOCAL`/`GLOBAL`/`UNKNOWN`). Antigravity is modelled first-class (its `.gemini/antigravity{,-ide,-cli}` dirs probe before bare `.gemini`; #3608). Exposed to the workflow as `gsd-tools update-context [--config-dir <d>] [--runtime <r>] --json`; `loadUpdateContext` wires the real fs. The workflow keeps only the execution_context path → `PREFERRED_*` derivation (the one input it alone knows). Source: `get-shit-done/bin/lib/update-context.cjs`; tests: `tests/issue-498-update-context.test.cjs`. See Installer Module and Package Identity Module.
Module owning install detection for `/gsd:update`. `resolveUpdateContext({ home, cwd, env, fs, preferredConfigDir, preferredRuntime })` is a pure, injected-fs port of update.md's former ~280-line `get_installed_version` bash; it reproduces the full precedence cascade — preferred-config-dir fast path, local-over-global probe with same-path dedup, env-var overrides (`CLAUDE_CONFIG_DIR`, `OPENCODE_CONFIG`, `KILO_CONFIG`, `XDG_CONFIG_HOME`, `CODEX_HOME`, …), and semver validation — and returns the 4-field contract `{ installedVersion, scope, runtime, gsdDir }` (scope ∈ `LOCAL`/`GLOBAL`/`UNKNOWN`). Antigravity is modelled first-class (its `.gemini/antigravity{,-ide,-cli}` dirs probe before bare `.gemini`; #3608). Exposed to the workflow as `gsd-tools update-context [--config-dir <d>] [--runtime <r>] --json`; `loadUpdateContext` wires the real fs. The workflow keeps only the execution_context path → `PREFERRED_*` derivation (the one input it alone knows). Source: `gsd-core/bin/lib/update-context.cjs`; tests: `tests/issue-498-update-context.test.cjs`. See Installer Module and Package Identity Module.
### Skill Surface Budget Module
Module owning which skills and agents are written to runtime config directories at install time (Phase 1) and at runtime via cluster-level toggles (Phase 2). Phase 1: `get-shit-done/bin/lib/install-profiles.cjs` defines named profiles (`core`, `standard`, `full`), computes transitive closure over `requires:` frontmatter, stages skills/agents to runtime config dirs, and persists the chosen profile in a `.gsd-profile` marker. Profile resolution precedence: explicit `--profile=` flag > `.gsd-profile` marker > `full`. `--minimal`/`--core-only` are back-compat aliases for `--profile=core`. Phase 2: `get-shit-done/bin/lib/surface.cjs` implements the `/gsd:surface` slash command for cluster-level enable/disable without reinstall; cluster definitions live in `get-shit-done/bin/lib/clusters.cjs`; per-runtime state persists in `<runtimeConfigDir>/.gsd-surface.json` independent from the `.gsd-profile` marker. See ADR-0011.
Module owning which skills and agents are written to runtime config directories at install time (Phase 1) and at runtime via cluster-level toggles (Phase 2). Phase 1: `gsd-core/bin/lib/install-profiles.cjs` defines named profiles (`core`, `standard`, `full`), computes transitive closure over `requires:` frontmatter, stages skills/agents to runtime config dirs, and persists the chosen profile in a `.gsd-profile` marker. Profile resolution precedence: explicit `--profile=` flag > `.gsd-profile` marker > `full`. `--minimal`/`--core-only` are back-compat aliases for `--profile=core`. Phase 2: `gsd-core/bin/lib/surface.cjs` implements the `/gsd:surface` slash command for cluster-level enable/disable without reinstall; cluster definitions live in `gsd-core/bin/lib/clusters.cjs`; per-runtime state persists in `<runtimeConfigDir>/.gsd-surface.json` independent from the `.gsd-profile` marker. See ADR-0011.
### Runtime Artifact Layout Module
Module owning the per-runtime mapping from artifact kind to filesystem placement. ADR-3660 defines the typed `kinds` per runtime (`commands`, `agents`, `skills`) with destination subpath, prefix, and stage adapter (with per-runtime converters in `bin/install.js`: `convertClaudeCommandToClaudeSkill`, `…CodexSkill`, `…CopilotSkill`, `…AntigravitySkill`). Phase 1 applies this seam to the Runtime Surface Module (`surface.cjs:applySurface`). Phase 2 is planned to migrate install/uninstall in `bin/install.js` so all lifecycle sites iterate one shared layout table instead of re-encoding runtime layout logic. This design is intended to remove the #3659 class of omissions. Migrations remain under the Installer Migration Module (ADR-0008). See ADR-3660.
### Knowledge Graph Module
Module owning the graphify integration: config gate (`isGraphifyEnabled`), disabled response (`disabledResponse`), subprocess helper (`execGraphify`, typed `GRAPHIFY_REASON` enum), presence detection (`checkGraphifyInstalled`), version checking (`checkGraphifyVersion`), query surface (`graphifyQuery` — BFS seed-expand + budget trim), status surface (`graphifyStatus` — node/edge counts, mtime staleness, commit-staleness tri-state via `built_at_commit`/`commits_behind`/`commit_stale`), diff surface (`graphifyDiff` — added/removed/changed nodes+edges), build pre-flight (`graphifyBuild`), snapshot management (`writeSnapshot`). Reads `.planning/config.json:graphify.enabled` as config gate; writes to `.planning/graphs/`. Auto-update hook (`hooks/gsd-graphify-update.sh`) triggers a detached background rebuild after HEAD-advancing git operations on the default branch when `graphify.auto_update=true`. Status file `.planning/graphs/.last-build-status.json` carries `{ ts, status, exit_code, duration_ms, head_at_build, graphify_version }`. Graph IR uses `nodes[]`, `edges[]` (or `links[]` for graphify ≥0.7 compat), `hyperedges[]`, `built_at_commit`. `commit_stale` is tri-state: `false` (known fresh), `true` (stale), `null` (unknown — no git or pre-v0.7 graph). Source: `get-shit-done/bin/lib/graphify.cjs`. Skill: `commands/gsd/graphify.md`.
Module owning the graphify integration: config gate (`isGraphifyEnabled`), disabled response (`disabledResponse`), subprocess helper (`execGraphify`, typed `GRAPHIFY_REASON` enum), presence detection (`checkGraphifyInstalled`), version checking (`checkGraphifyVersion`), query surface (`graphifyQuery` — BFS seed-expand + budget trim), status surface (`graphifyStatus` — node/edge counts, mtime staleness, commit-staleness tri-state via `built_at_commit`/`commits_behind`/`commit_stale`), diff surface (`graphifyDiff` — added/removed/changed nodes+edges), build pre-flight (`graphifyBuild`), snapshot management (`writeSnapshot`). Reads `.planning/config.json:graphify.enabled` as config gate; writes to `.planning/graphs/`. Auto-update hook (`hooks/gsd-graphify-update.sh`) triggers a detached background rebuild after HEAD-advancing git operations on the default branch when `graphify.auto_update=true`. Status file `.planning/graphs/.last-build-status.json` carries `{ ts, status, exit_code, duration_ms, head_at_build, graphify_version }`. Graph IR uses `nodes[]`, `edges[]` (or `links[]` for graphify ≥0.7 compat), `hyperedges[]`, `built_at_commit`. `commit_stale` is tri-state: `false` (known fresh), `true` (stale), `null` (unknown — no git or pre-v0.7 graph). Source: `gsd-core/bin/lib/graphify.cjs`. Skill: `commands/gsd/graphify.md`.
### MVP Mode
Phase-level planning mode that frames work as a vertical slice (UI → API → DB) of one user-visible capability instead of horizontal layers. Resolved at workflow init via the precedence chain: `--mvp` CLI flag → ROADMAP.md `**Mode:** mvp` field → `workflow.mvp_mode` config → false. All-or-nothing per phase (PRD #2826 Q1). Surfaced as `MVP_MODE=true|false` to the planner, executor, verifier, and discovery surfaces (progress, stats, graphify). Canonical parser: `roadmap.cjs` `**Mode:**` field; canonical resolution chain documented in `workflows/plan-phase.md`. Concept index: `references/mvp-concepts.md`.
@@ -140,7 +140,7 @@ Predicate over a PLAN.md task: `tdd="true"` frontmatter AND `<behavior>` block n
Per-task runtime gate in `/gsd-execute-phase` that, when both `MVP_MODE` and `TDD_MODE` are true, refuses to advance a Behavior-Adding Task until a failing-test commit (`test({phase}-{plan})`) exists for it. The `tdd_review_checkpoint` end-of-phase review escalates from advisory to blocking under the same condition. Documented contract: `references/execute-mvp-tdd.md`. Reserved escape hatch `--force-mvp-gate` is documented but not implemented.
### SPIDR Splitting
Five-axis story decomposition discipline (**S**pike, **P**aths, **I**nterfaces, **D**ata, **R**ules) used by `/gsd-mvp-phase` when a User Story is too large for one phase. Full interactive flow per PRD #2826 Q3 (not a lightweight filter). Reference: `get-shit-done/references/spidr-splitting.md`.
Five-axis story decomposition discipline (**S**pike, **P**aths, **I**nterfaces, **D**ata, **R**ules) used by `/gsd-mvp-phase` when a User Story is too large for one phase. Full interactive flow per PRD #2826 Q3 (not a lightweight filter). Reference: `gsd-core/references/spidr-splitting.md`.
### Clock seam
An injectable time abstraction accepted as an optional parameter by production code (`{ clock = Date } = {}`). Test code substitutes `node:test` `mock.timers` to control time deterministically without waiting for real OS scheduler events. Canonical pattern established by ADR 456 (`docs/adr/456-test-rigor-architecture.md`).
@@ -239,7 +239,7 @@ The canonical lint infrastructure adopted in ADR 452 (`docs/adr/452-eslint-lint-
`PR.3267.POSTMORTEM.recovery=[issue#3270 created, label approved-enhancement applied, PR reopened, body includes "Closes #3270", label no-changelog applied]`
`WORKTREE.SEAM.current=Worktree Safety Policy Module`
`WORKTREE.SEAM.files=[get-shit-done/bin/lib/worktree-safety.cjs, get-shit-done/bin/lib/core.cjs]`
`WORKTREE.SEAM.files=[gsd-core/bin/lib/worktree-safety.cjs, gsd-core/bin/lib/core.cjs]`
`WORKTREE.SEAM.interface=[resolveWorktreeContext, parseWorktreePorcelain, planWorktreePrune, executeWorktreePrunePlan]`
`WORKTREE.SEAM.default-prune-policy=metadata_prune_only (non-destructive)`
`WORKTREE.SEAM.decision-1=retain non-destructive default; destructive path only as explicit future opt-in scaffold`
@@ -261,8 +261,8 @@ The canonical lint infrastructure adopted in ADR 452 (`docs/adr/452-eslint-lint-
`PLANNING.PATH.PARITY.sdk-project-scope=.planning/<project> (never .planning/projects/<project>); mirror planning-workspace.cjs planningDir()`
`PLANNING.PATH.SEAM.sdk=helpers.planningPaths delegates to workspacePlanningPaths + resolveWorkspaceContext; precedence explicit-ws > env-ws > env-project > root`
`PLANNING.PATH.SEAM.init-handlers=[initExecutePhase, initPlanPhase, initPhaseOp, initMilestoneOp] consume helpers.planningPaths().planning (no direct relPlanningPath join)`
`WORKSTREAM.NAME.POLICY.cjs-module=get-shit-done/bin/lib/workstream-name-policy.cjs owns toWorkstreamSlug + active-name/path-segment validation`
`WORKSTREAM.POINTER.SEAM.cjs-module=get-shit-done/bin/lib/active-workstream-store.cjs owns read/write self-heal for .planning/active-workstream`
`WORKSTREAM.NAME.POLICY.cjs-module=gsd-core/bin/lib/workstream-name-policy.cjs owns toWorkstreamSlug + active-name/path-segment validation`
`WORKSTREAM.POINTER.SEAM.cjs-module=gsd-core/bin/lib/active-workstream-store.cjs owns read/write self-heal for .planning/active-workstream`
`CONFIG.SEAM.loadConfig-context=loadConfig(cwd,{workstream}) replaces env-mutation fallback; no temporary process.env GSD_WORKSTREAM rewrites`
---
@@ -325,7 +325,7 @@ The canonical lint infrastructure adopted in ADR 452 (`docs/adr/452-eslint-lint-
`PRED.k320.types=Added|Changed|Deprecated|Removed|Fixed|Security`
`PRED.k320.opt-out-label=no-changelog`
`PRED.k320.ci-enforcement=scripts/changeset/lint.cjs`
`PRED.k320.ci-paths-monitored=bin/ get-shit-done/ agents/ commands/ docs/ hooks/ tests/ scripts/`
`PRED.k320.ci-paths-monitored=bin/ gsd-core/ agents/ commands/ docs/ hooks/ tests/ scripts/`
`PRED.k320.recovery=open Removed-typed cleanup PR deleting only the redundant row`
`PRED.k320.evidence=PR #3302 merge-conflict against #3308 CHANGELOG.md row 2026-05-09`
@@ -424,7 +424,7 @@ The canonical lint infrastructure adopted in ADR 452 (`docs/adr/452-eslint-lint-
`DEFECT.REMOVED-BUT-NEEDED.symptom=file/key removed because "no longer used" without verifying every consumer (workflows, docs, manifests, npm scripts)`
`DEFECT.REMOVED-BUT-NEEDED.examples=#3316 root package-lock.json (root package.json declares deps; workflows use cache:'npm' + npm ci), e3b52c70 docs referenced removed /gsd-new-workspace`
`DEFECT.REMOVED-BUT-NEEDED.detect=before deletion, grep filename across .github/workflows, get-shit-done/, docs/, package.json scripts; if any reference exists removal is incomplete`
`DEFECT.REMOVED-BUT-NEEDED.detect=before deletion, grep filename across .github/workflows, gsd-core/, docs/, package.json scripts; if any reference exists removal is incomplete`
`DEFECT.REMOVED-BUT-NEEDED.fix-forward=restore the file or update every consumer in the same commit; do not paper over with --no-package-lock or workflow workarounds that lose reproducibility`
`DEFECT.STATE-TRAMPLE.symptom=state-mutation paths overwrite curated values when body-derived computation is narrower than what's stored in frontmatter`
@@ -458,7 +458,7 @@ The canonical lint infrastructure adopted in ADR 452 (`docs/adr/452-eslint-lint-
`DEFECT.PROMPT-INJECTION-SCAN-COLLISION.detect=any new bare <system|assistant|human|user> tag in agents/*.md`
`DEFECT.PROMPT-INJECTION-SCAN-COLLISION.fix-forward=hyphenate the tag (<human-check>, <assistant-prompt>) — scanner regex matches bare names only`
`DEFECT.INVENTORY-DRIFT.symptom=new file added under get-shit-done/references/ or get-shit-done/workflows/ without updating docs/INVENTORY.md count + row AND docs/INVENTORY-MANIFEST.json`
`DEFECT.INVENTORY-DRIFT.symptom=new file added under gsd-core/references/ or gsd-core/workflows/ without updating docs/INVENTORY.md count + row AND docs/INVENTORY-MANIFEST.json`
`DEFECT.INVENTORY-DRIFT.examples=#3309 planner-human-verify-mode.md (caught by tests/inventory-counts.test.cjs + tests/inventory-manifest-sync.test.cjs)`
`DEFECT.INVENTORY-DRIFT.detect=tests/inventory-* fails with "References (N shipped) disagrees with filesystem" or "New surfaces not in manifest"`
`DEFECT.INVENTORY-DRIFT.fix-forward=update INVENTORY.md headline count + row entry + footnote count; run node scripts/gen-inventory-manifest.cjs --write to regen INVENTORY-MANIFEST.json; only families.workflows is canonical (top-level workflows key is stale)`
@@ -466,7 +466,7 @@ The canonical lint infrastructure adopted in ADR 452 (`docs/adr/452-eslint-lint-
`DEFECT.AGENT-FILE-SIZE-CAP-BREACH.symptom=adding to agents/gsd-planner.md (or other large agent files) exceeds the 45K char extraction-evidence threshold`
`DEFECT.AGENT-FILE-SIZE-CAP-BREACH.state=gsd-planner.md is already 49,121 chars on main (over 45K); test fails on main; net-new content makes it strictly worse`
`DEFECT.AGENT-FILE-SIZE-CAP-BREACH.detect=tests/planner-decomposition.test.cjs ("planner is under 45K chars (proves mode sections were extracted)") and tests/reachability-check.test.cjs ("file stays under 50000 char limit")`
`DEFECT.AGENT-FILE-SIZE-CAP-BREACH.fix-forward=mirror MVP mode pattern — extract full rules to get-shit-done/references/planner-<mode>.md, leave a slim Detection section in the agent file with @-reference to the new file`
`DEFECT.AGENT-FILE-SIZE-CAP-BREACH.fix-forward=mirror MVP mode pattern — extract full rules to gsd-core/references/planner-<mode>.md, leave a slim Detection section in the agent file with @-reference to the new file`
`DEFECT.CHANGESET-PR-FIELD-DRIFT.symptom=.changeset/*.md frontmatter pr: value is the issue number, a guess made before PR opened, or a stale stacked-PR number`
`DEFECT.CHANGESET-PR-FIELD-DRIFT.examples=#3316 (pr:3312 was the issue), #3325 (pr:3319 was a guess); already covered in CONTEXT.md L94 + L186 but recurs every cycle`
@@ -521,7 +521,7 @@ The canonical lint infrastructure adopted in ADR 452 (`docs/adr/452-eslint-lint-
## Shell Command Projection Module (expanded glossary entry, 2026-05-13)
Module owning all OS-facing I/O for the tool: runtime-aware command-text rendering (hook commands, PATH action lines, shim scripts), subprocess dispatch (run-git, run-npm, run-tool, probeTty), and platform file I/O (platformWriteSync, platformReadSync, platformEnsureDir). Single seam for platform-conditional logic — one place to fix any shell or file write regression across Windows, macOS, and Linux. Lives in `get-shit-done/bin/lib/shell-command-projection.cjs`. See ADR-0009 (superseded "does not execute" constraint) and ADR-0010 (superseded File Operation Engine).
Module owning all OS-facing I/O for the tool: runtime-aware command-text rendering (hook commands, PATH action lines, shim scripts), subprocess dispatch (run-git, run-npm, run-tool, probeTty), and platform file I/O (platformWriteSync, platformReadSync, platformEnsureDir). Single seam for platform-conditional logic — one place to fix any shell or file write regression across Windows, macOS, and Linux. Lives in `gsd-core/bin/lib/shell-command-projection.cjs`. See ADR-0009 (superseded "does not execute" constraint) and ADR-0010 (superseded File Operation Engine).
Invariants:
- Result shape: all run-* return `{ exitCode, stdout, stderr }`; never throw on non-zero exit code.
@@ -590,8 +590,8 @@ Migration plan: Phase 1 (#3465) seam additions complete; Phase 2 (#3466) targets
## Executor failure classification (#3095 / PR #3490)
`EXEC.CLASSIFY.handler=get-shit-done/bin/lib/agent-command-router.cjs:classifyAgentFailure (registered via command-aliases.cjs; mutation:false outputMode:json)`
`EXEC.CLASSIFY.workflow=get-shit-done/workflows/execute-phase.md step 7; class-distinct prompts (quota-to-wait-for-reset; classify-handoff-bug-to-spot-check; unknown-to-continue/stop)`
`EXEC.CLASSIFY.handler=gsd-core/bin/lib/agent-command-router.cjs:classifyAgentFailure (registered via command-aliases.cjs; mutation:false outputMode:json)`
`EXEC.CLASSIFY.workflow=gsd-core/workflows/execute-phase.md step 7; class-distinct prompts (quota-to-wait-for-reset; classify-handoff-bug-to-spot-check; unknown-to-continue/stop)`
`EXEC.CLASSIFY.classes={class:'quota-exceeded'|'classify-handoff-bug'|'unknown-failure', sentinel?, retryAfterSeconds?}`
`EXEC.CLASSIFY.sentinel-order=most specific first: 429 beats too-many-requests; quota beats resource_exhausted; case-insensitive; canonical sentinel value is lower-cased form`
`EXEC.CLASSIFY.cross-runtime=Anthropic/CC: usage limit|rate limit|quota|429|retry-after; Copilot CLI: rate_limit (stem); Codex CLI: 429|usage_limit_reached|too many requests; Gemini CLI: RESOURCE_EXHAUSTED|exceeded your`
@@ -602,7 +602,7 @@ Migration plan: Phase 1 (#3465) seam additions complete; Phase 2 (#3466) targets
`DEFECT.GSD-TEST-MIRROR-POISONED.symptom=gsd-test-summary --both exits docker=23 (rsync partial transfer) with mkstemp Permission denied on remote mirror files; mirror has root-owned artifacts from prior cold runs`
`DEFECT.GSD-TEST-MIRROR-POISONED.detect=docker stderr shows rsync: [generator] delete_file: unlink(...) failed: Permission denied (13) OR [receiver] mkstemp ".gsd-*.<suffix>" failed`
`DEFECT.GSD-TEST-MIRROR-POISONED.root-cause=container ran without --user; build:hooks wrote into bind-mount as root; chown-back-before-exec patch closes forward path but not legacy hosts`
`DEFECT.GSD-TEST-MIRROR-POISONED.recovery=ssh <host> 'docker run --rm -v ~/gsd-mirror-get-shit-done:/work gsd-test:node22 chown -R <remote-uid>:<remote-gid> /work'; remote-uid is the SSH user's uid on the remote (1000 on holodeck, NOT local Mac 501)`
`DEFECT.GSD-TEST-MIRROR-POISONED.recovery=ssh <host> 'docker run --rm -v ~/gsd-mirror-gsd-core:/work gsd-test:node22 chown -R <remote-uid>:<remote-gid> /work'; remote-uid is the SSH user's uid on the remote (1000 on holodeck, NOT local Mac 501)`
`DEFECT.GSD-TEST-MIRROR-POISONED.upstream=trek-e/gsd-test-runner#1 — proposes self-healing init-time chown probe`
`DEFECT.HOOK-OVER-ENFORCEMENT.read-tool-tracking=gh-templates-first PreToolUse hook tracks Read tool invocations specifically; Bash cat/head of the same file does NOT satisfy the hook; future-self must use Read tool from the first contact with template files`

View File

@@ -203,7 +203,7 @@ This writes `.changeset/<adjective>-<noun>-<noun>.md`. Three random words → co
Fragments are consolidated into `CHANGELOG.md` at release time by the release workflow. See [`.changeset/README.md`](.changeset/README.md) for the format spec and [#2975](https://github.com/open-gsd/gsd-core/issues/2975) for the rationale.
**CI enforcement:** the `Changeset Required` workflow (`scripts/changeset/lint.cjs`) fails any PR that touches `bin/`, `get-shit-done/`, `agents/`, `commands/`, `hooks/`, or `sdk/src/` without a `.changeset/*.md` fragment.
**CI enforcement:** the `Changeset Required` workflow (`scripts/changeset/lint.cjs`) fails any PR that touches `bin/`, `gsd-core/`, `agents/`, `commands/`, `hooks/`, or `sdk/src/` without a `.changeset/*.md` fragment.
**Opt-out:** PRs with no user-facing impact (test refactors, lint config changes, CI tweaks, formatting-only changes) can add the `no-changelog` label. The lint honors it. When unsure whether a change is user-facing, **add the fragment**.
@@ -716,7 +716,7 @@ cat > .githooks/pre-commit <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
if git diff --cached --name-only | grep -Eq "^sdk/src/query/command-manifest\.|^sdk/src/query/command-aliases\.generated\.ts$|^get-shit-done/bin/lib/command-aliases\.generated\.cjs$|^sdk/scripts/gen-command-aliases\.ts$"; then
if git diff --cached --name-only | grep -Eq "^sdk/src/query/command-manifest\.|^sdk/src/query/command-aliases\.generated\.ts$|^gsd-core/bin/lib/command-aliases\.generated\.cjs$|^sdk/scripts/gen-command-aliases\.ts$"; then
npm run check:alias-drift
fi
EOF
@@ -821,7 +821,7 @@ Defensive normalization at trust boundaries must validate both the value's type
```
bin/install.js — Installer (multi-runtime)
get-shit-done/
gsd-core/
bin/lib/ — Core library modules (.cjs)
workflows/ — Workflow definitions (.md)
Large workflows split per progressive-disclosure

View File

@@ -57,7 +57,7 @@ for (const scenario of cases) {
const result = spawnSync(
process.execPath,
[path.join(__dirname, '..', 'get-shit-done', 'bin', 'gsd-tools.cjs'), ...scenario.args, '--json'],
[path.join(__dirname, '..', 'gsd-core', 'bin', 'gsd-tools.cjs'), ...scenario.args, '--json'],
{ cwd: projectDir, encoding: 'utf8' },
);

View File

@@ -40,7 +40,7 @@ works via Bash and produces equivalent output.
</documentation_lookup>
<required_reading>
Read `~/.claude/get-shit-done/references/ai-frameworks.md` for framework profiles and known pitfalls before fetching docs.
Read `~/.claude/gsd-core/references/ai-frameworks.md` for framework profiles and known pitfalls before fetching docs.
</required_reading>
<input>

View File

@@ -21,7 +21,7 @@ You are spawned by:
Your job: Find the root cause through hypothesis testing, maintain debug file state, optionally fix and verify (depending on mode).
@~/.claude/get-shit-done/references/mandatory-initial-read.md
@~/.claude/gsd-core/references/mandatory-initial-read.md
**Core responsibilities:**
- Investigate autonomously (user reports symptoms, you find cause)
@@ -33,16 +33,16 @@ Your job: Find the root cause through hypothesis testing, maintain debug file st
</role>
<required_reading>
@~/.claude/get-shit-done/references/common-bug-patterns.md
@~/.claude/gsd-core/references/common-bug-patterns.md
</required_reading>
**Project skills:** @~/.claude/get-shit-done/references/project-skills-discovery.md
**Project skills:** @~/.claude/gsd-core/references/project-skills-discovery.md
- Load `rules/*.md` as needed during **investigation and fix**.
- Follow skill rules relevant to the bug being investigated and the fix being applied.
<philosophy>
@~/.claude/get-shit-done/references/debugger-philosophy.md
@~/.claude/gsd-core/references/debugger-philosophy.md
</philosophy>
@@ -433,8 +433,8 @@ Check code says: hooksDir = path.join(configDir, 'hooks')
→ checks ~/.claude/hooks/
Installer says: hooksDest = path.join(targetDir, 'hooks')
targetDir = ~/.claude/get-shit-done
→ writes to ~/.claude/get-shit-done/hooks/
targetDir = ~/.claude/gsd-core
→ writes to ~/.claude/gsd-core/hooks/
MISMATCH: Checker looks in wrong directory → hooks "not found" → reported as stale
```
@@ -959,7 +959,7 @@ Gather symptoms through questioning. Update file after EACH answer.
<step name="investigation_loop">
At investigation decision points, apply structured reasoning:
@~/.claude/get-shit-done/references/thinking-models-debug.md
@~/.claude/gsd-core/references/thinking-models-debug.md
**Autonomous investigation. Update file continuously.**
@@ -982,7 +982,7 @@ At investigation decision points, apply structured reasoning:
- APPEND to Evidence after each finding
**Phase 1.5: Check common bug patterns**
- Read @~/.claude/get-shit-done/references/common-bug-patterns.md
- Read @~/.claude/gsd-core/references/common-bug-patterns.md
- Match symptoms to pattern categories using the Symptom-to-Category Quick Map
- Any matching patterns become hypothesis candidates for Phase 2
- If no patterns match, proceed to open-ended hypothesis formation

View File

@@ -40,7 +40,7 @@ works via Bash and produces equivalent output.
</documentation_lookup>
<required_reading>
Read `~/.claude/get-shit-done/references/ai-evals.md` — specifically the rubric design and domain expert sections.
Read `~/.claude/gsd-core/references/ai-evals.md` — specifically the rubric design and domain expert sections.
</required_reading>
<input>

View File

@@ -33,7 +33,7 @@ Every planned eval dimension must resolve to COVERED, PARTIAL (WARNING), or MISS
</adversarial_stance>
<required_reading>
Read `~/.claude/get-shit-done/references/ai-evals.md` before auditing. This is your scoring framework.
Read `~/.claude/gsd-core/references/ai-evals.md` before auditing. This is your scoring framework.
</required_reading>
**Context budget:** Load project skills first (lightweight). Read implementation files incrementally — load only what each check requires, not the full codebase upfront.

View File

@@ -17,7 +17,7 @@ Turn domain rubric ingredients into measurable, tooled evaluation criteria. Writ
</role>
<required_reading>
Read `~/.claude/get-shit-done/references/ai-evals.md` before planning. This is your evaluation framework.
Read `~/.claude/gsd-core/references/ai-evals.md` before planning. This is your evaluation framework.
</required_reading>
<input>

View File

@@ -18,7 +18,7 @@ Spawned by `/gsd:execute-phase` orchestrator.
Your job: Execute the plan completely, commit each task, create SUMMARY.md, update STATE.md.
@~/.claude/get-shit-done/references/mandatory-initial-read.md
@~/.claude/gsd-core/references/mandatory-initial-read.md
</role>
<documentation_lookup>
@@ -60,7 +60,7 @@ Before executing, discover project context:
**Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions.
**Project skills:** @~/.claude/get-shit-done/references/project-skills-discovery.md
**Project skills:** @~/.claude/gsd-core/references/project-skills-discovery.md
- Load `rules/*.md` as needed during **implementation**.
- Follow skill rules relevant to the task you are about to commit.
@@ -116,10 +116,10 @@ grep -n "type=\"checkpoint" [plan-path]
<step name="execute_tasks">
At execution decision points, apply structured reasoning:
@~/.claude/get-shit-done/references/thinking-models-execution.md
@~/.claude/gsd-core/references/thinking-models-execution.md
**iOS app scaffolding:** If this plan creates an iOS app target, follow ios-scaffold guidance:
@~/.claude/get-shit-done/references/ios-scaffold.md
@~/.claude/gsd-core/references/ios-scaffold.md
For each task:
@@ -239,7 +239,7 @@ Track auto-fix attempts per task. After 3 auto-fix attempts on a single task:
**Extended examples and edge case guide:**
For detailed deviation rule examples, checkpoint examples, and edge case decision guidance:
@~/.claude/get-shit-done/references/executor-examples.md
@~/.claude/gsd-core/references/executor-examples.md
</deviation_rules>
<analysis_paralysis_guard>
@@ -285,7 +285,7 @@ Auto mode is active if either `AUTO_CHAIN` or `AUTO_CFG` is `"true"`. Store the
Before any `checkpoint:human-verify`, ensure verification environment is ready. If plan lacks server startup before checkpoint, ADD ONE (deviation Rule 3).
For full automation-first patterns, server lifecycle, CLI handling:
**See @~/.claude/get-shit-done/references/checkpoints.md**
**See @~/.claude/gsd-core/references/checkpoints.md**
**Quick reference:** Users NEVER run CLI commands. Users ONLY visit URLs, click UI, evaluate visuals, provide secrets. Claude does all automation.
@@ -385,7 +385,7 @@ If RED or GREEN gate commits are missing, add a warning to SUMMARY.md under a `#
## MVP+TDD Gate
**When the orchestrator passes both `MVP_MODE=true` and `TDD_MODE=true`:** Before running the implementation step of any task with `tdd="true"`, run the runtime gate from `@~/.claude/get-shit-done/references/execute-mvp-tdd.md`. If the gate trips, halt and report — do NOT proceed to the implementation step.
**When the orchestrator passes both `MVP_MODE=true` and `TDD_MODE=true`:** Before running the implementation step of any task with `tdd="true"`, run the runtime gate from `@~/.claude/gsd-core/references/execute-mvp-tdd.md`. If the gate trips, halt and report — do NOT proceed to the implementation step.
**Halt-and-report protocol:**
@@ -602,7 +602,7 @@ This file is the canonical output of this step. The orchestrator reads `.plannin
- On the final section, replace the sentinel with the closing content and no trailing sentinel.
5. **If writing still fails, surface the actual error in your return message.** **Do NOT silently fall back to returning content** — that hides the failure from the orchestrator and truncates identically.
**Use template:** @~/.claude/get-shit-done/templates/summary.md
**Use template:** @~/.claude/gsd-core/templates/summary.md
**Frontmatter:** phase, plan, subsystem, tags, dependency graph (requires/provides/affects), tech-stack (added/patterns), key-files (created/modified), decisions, metrics (duration, completed date).

View File

@@ -11,7 +11,7 @@ Run a ≤6-question interview, score frameworks, return a ranked recommendation
</role>
<required_reading>
Read `~/.claude/get-shit-done/references/ai-frameworks.md` before asking questions. This is your decision matrix.
Read `~/.claude/gsd-core/references/ai-frameworks.md` before asking questions. This is your decision matrix.
</required_reading>
<project_context>

View File

@@ -64,7 +64,7 @@ The /gsd:map-codebase --query command has already confirmed that intel.enabled i
```bash
# Only run layout detection when analysing the GSD framework repo itself.
if [[ "$(jq -r '.name // ""' package.json 2>/dev/null)" == "@opengsd/gsd-core" ]]; then
ls -d .kilo 2>/dev/null && echo "kilo" || (ls -d .claude/get-shit-done 2>/dev/null && echo "claude") || echo "unknown"
ls -d .kilo 2>/dev/null && echo "kilo" || (ls -d .claude/gsd-core 2>/dev/null && echo "claude") || echo "unknown"
fi
```
@@ -76,9 +76,9 @@ Use the detected root (when applicable) to resolve all canonical paths below:
|-------------|--------------------------|----------------|
| Agent files | `agents/*.md` | `.kilo/agents/*.md` |
| Command files | `commands/gsd/*.md` | `.kilo/command/*.md` |
| CLI tooling | `get-shit-done/bin/` | `.kilo/get-shit-done/bin/` |
| Workflow files | `get-shit-done/workflows/` | `.kilo/get-shit-done/workflows/` |
| Reference docs | `get-shit-done/references/` | `.kilo/get-shit-done/references/` |
| CLI tooling | `gsd-core/bin/` | `.kilo/gsd-core/bin/` |
| Workflow files | `gsd-core/workflows/` | `.kilo/gsd-core/workflows/` |
| Reference docs | `gsd-core/references/` | `.kilo/gsd-core/references/` |
| Hook files | `hooks/*.js` | `.kilo/hooks/*.js` |
When analyzing this project, use ONLY the canonical source locations matching the detected layout. Do not fall back to the standard layout paths if the `.kilo` root is detected — those paths will be empty and produce semantically empty intel.

View File

@@ -16,7 +16,7 @@ You are a GSD phase researcher. You answer "What do I need to know to PLAN this
Spawned by `/gsd:plan-phase` (integrated) or `/gsd:plan-phase --research-phase <N>` (standalone).
@~/.claude/get-shit-done/references/mandatory-initial-read.md
@~/.claude/gsd-core/references/mandatory-initial-read.md
**Core responsibilities:**
- Investigate the phase's technical domain
@@ -72,7 +72,7 @@ Before researching, discover project context:
**Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions.
**Project skills:** @~/.claude/get-shit-done/references/project-skills-discovery.md
**Project skills:** @~/.claude/gsd-core/references/project-skills-discovery.md
- Load `rules/*.md` as needed during **research**.
- Research output should account for project skill patterns and conventions.
@@ -586,7 +586,7 @@ Verified patterns from official sources:
<execution_flow>
At research decision points, apply structured reasoning:
@~/.claude/get-shit-done/references/thinking-models-research.md
@~/.claude/gsd-core/references/thinking-models-research.md
## Step 1: Receive Scope and Load Context
@@ -632,7 +632,7 @@ ls .planning/graphs/graph.json 2>/dev/null
If graph.json exists, check freshness:
```bash
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" graphify status
node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" graphify status
```
If the status response has `stale: true`, note for later: "Graph is {age_hours}h old -- treat semantic relationships as approximate." Include this annotation inline with any graph context injected below.
@@ -640,7 +640,7 @@ If the status response has `stale: true`, note for later: "Graph is {age_hours}h
Query the graph for each major capability in the phase scope (2-3 queries per D-05, discovery-focused):
```bash
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" graphify query "<capability-keyword>" --budget 1500
node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" graphify query "<capability-keyword>" --budget 1500
```
Derive query terms from the phase goal and requirement descriptions. Examples:

View File

@@ -43,7 +43,7 @@ Issues without a severity classification are not valid output.
</adversarial_stance>
<required_reading>
@~/.claude/get-shit-done/references/gates.md
@~/.claude/gsd-core/references/gates.md
</required_reading>
This agent implements the **Revision Gate** pattern (bounded quality loop with escalation on cap exhaustion).
@@ -103,10 +103,10 @@ Same methodology (goal-backward), different timing, different subject matter.
<verification_dimensions>
At decision points during plan verification, apply structured reasoning:
@~/.claude/get-shit-done/references/thinking-models-planning.md
@~/.claude/gsd-core/references/thinking-models-planning.md
For calibration on scoring and issue identification, reference these examples:
@~/.claude/get-shit-done/references/few-shot-examples/plan-checker.md
@~/.claude/gsd-core/references/few-shot-examples/plan-checker.md
## Dimension 1: Requirement Coverage

View File

@@ -22,7 +22,7 @@ Spawned by:
Your job: Produce PLAN.md files that Claude executors can implement without interpretation. Plans are prompts, not documents that become prompts.
@~/.claude/get-shit-done/references/mandatory-initial-read.md
@~/.claude/gsd-core/references/mandatory-initial-read.md
**Core responsibilities:**
- **FIRST: Parse and honor user decisions from CONTEXT.md** (locked decisions are NON-NEGOTIABLE)
@@ -43,7 +43,7 @@ Before planning, discover project context:
**Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions.
**Project skills:** @~/.claude/get-shit-done/references/project-skills-discovery.md
**Project skills:** @~/.claude/gsd-core/references/project-skills-discovery.md
- Load `rules/*.md` as needed during **planning**.
- Ensure plans account for project skill patterns and conventions.
</project_context>
@@ -97,7 +97,7 @@ Do NOT silently omit features. Instead:
## Multi-Source Coverage Audit (MANDATORY in every plan set)
@~/.claude/get-shit-done/references/planner-source-audit.md for full format, examples, and gap-handling rules.
@~/.claude/gsd-core/references/planner-source-audit.md for full format, examples, and gap-handling rules.
Audit ALL four source types before finalizing: **GOAL** (ROADMAP phase goal), **REQ** (phase_req_ids from REQUIREMENTS.md), **RESEARCH** (RESEARCH.md features/constraints), **CONTEXT** (D-XX decisions from CONTEXT.md).
@@ -109,7 +109,7 @@ Exclusions (not gaps): Deferred Ideas in CONTEXT.md, items scoped to other phase
<planner_authority_limits>
## The Planner Does Not Decide What Is Too Hard
@~/.claude/get-shit-done/references/planner-source-audit.md for constraint examples.
@~/.claude/gsd-core/references/planner-source-audit.md for constraint examples.
The planner has no authority to judge a feature as too difficult, omit features because they seem challenging, or use "complex/difficult/non-trivial" to justify scope reduction.
@@ -267,11 +267,11 @@ This prevents the "scavenger hunt" anti-pattern where executors explore the code
## Specificity
**Test:** Could a different Claude instance execute without asking clarifying questions? If not, add specificity. See @~/.claude/get-shit-done/references/planner-antipatterns.md for vague-vs-specific comparison table.
**Test:** Could a different Claude instance execute without asking clarifying questions? If not, add specificity. See @~/.claude/gsd-core/references/planner-antipatterns.md for vague-vs-specific comparison table.
## TDD Detection
**When `workflow.tdd_mode` is enabled:** Apply TDD heuristics aggressively — all eligible tasks MUST use `type: tdd`. Read @~/.claude/get-shit-done/references/tdd.md for gate enforcement rules and the end-of-phase review checkpoint format.
**When `workflow.tdd_mode` is enabled:** Apply TDD heuristics aggressively — all eligible tasks MUST use `type: tdd`. Read @~/.claude/gsd-core/references/tdd.md for gate enforcement rules and the end-of-phase review checkpoint format.
**When `workflow.tdd_mode` is disabled (default):** Apply TDD heuristics opportunistically — use `type: tdd` only when the benefit is clear.
@@ -309,7 +309,7 @@ Exceptions where `tdd="true"` is not needed: `type="checkpoint:*"` tasks, config
## MVP Mode Detection
**When `MVP_MODE` is enabled (passed by the plan-phase orchestrator):** Decompose tasks as **vertical feature slices**, not horizontal layers. Required reading: `@~/.claude/get-shit-done/references/planner-mvp-mode.md` (loaded conditionally by the orchestrator).
**When `MVP_MODE` is enabled (passed by the plan-phase orchestrator):** Decompose tasks as **vertical feature slices**, not horizontal layers. Required reading: `@~/.claude/gsd-core/references/planner-mvp-mode.md` (loaded conditionally by the orchestrator).
**Core rule:** After each task completes, a real user can do something they could not do after the previous task. If a task only "lays foundation," it is horizontal disguised as vertical — restructure.
@@ -323,7 +323,7 @@ Exceptions where `tdd="true"` is not needed: `type="checkpoint:*"` tasks, config
**As a** [user role], **I want to** [capability], **so that** [outcome].
```
Format rules from `@~/.claude/get-shit-done/references/user-story-template.md`:
Format rules from `@~/.claude/gsd-core/references/user-story-template.md`:
- All three slots required. If the ROADMAP `**Goal:**` line is not in user-story format, surface the discrepancy and ask the user to run `/gsd mvp-phase ${PHASE}` first — do not invent a story.
- Bold the three keywords (`**As a**`, `**I want to**`, `**so that**`) when emitting to PLAN.md. The ROADMAP form does not use bolded keywords; the PLAN form does.
2. First task: failing end-to-end test for the happy path.
@@ -332,7 +332,7 @@ Exceptions where `tdd="true"` is not needed: `type="checkpoint:*"` tasks, config
**Mode is all-or-nothing per phase** (PRD decision Q1). Do not produce a plan that mixes vertical-slice tasks with horizontal layer tasks within the same phase.
**Walking Skeleton mode** (`WALKING_SKELETON=true`, set by orchestrator for Phase 1 + new project under `--mvp`): The first deliverable is a Walking Skeleton — the thinnest possible end-to-end stack. In addition to `PLAN.md`, produce `SKELETON.md` using the template at `@~/.claude/get-shit-done/references/skeleton-template.md`. `SKELETON.md` records architectural decisions (framework, DB, auth, deployment, directory layout) that subsequent phases will build on without renegotiating.
**Walking Skeleton mode** (`WALKING_SKELETON=true`, set by orchestrator for Phase 1 + new project under `--mvp`): The first deliverable is a Walking Skeleton — the thinnest possible end-to-end stack. In addition to `PLAN.md`, produce `SKELETON.md` using the template at `@~/.claude/gsd-core/references/skeleton-template.md`. `SKELETON.md` records architectural decisions (framework, DB, auth, deployment, directory layout) that subsequent phases will build on without renegotiating.
**Compatibility with TDD detection:** When both `MVP_MODE=true` and `workflow.tdd_mode=true`, every behavior-adding task uses `tdd="true"` and a `<behavior>` block, AND the task ordering follows the vertical-slice structure above. The first task is always a failing end-to-end test.
@@ -447,8 +447,8 @@ Output: [Artifacts created]
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/execute-plan.md
@~/.claude/get-shit-done/templates/summary.md
@~/.claude/gsd-core/workflows/execute-plan.md
@~/.claude/gsd-core/templates/summary.md
</execution_context>
<context>
@@ -520,7 +520,7 @@ Wave numbers are pre-computed during planning. Execute-phase reads `wave` direct
## Interface Context for Executors
See `get-shit-done/references/planner-interface-context.md` for the full interface extraction guide.
See `gsd-core/references/planner-interface-context.md` for the full interface extraction guide.
## Context Section Rules
@@ -700,7 +700,7 @@ When Claude tries CLI/API and gets auth error → creates checkpoint → user au
## Anti-Patterns and Extended Examples
For checkpoint anti-patterns, specificity comparison tables, context section anti-patterns, and scope reduction patterns:
@~/.claude/get-shit-done/references/planner-antipatterns.md
@~/.claude/gsd-core/references/planner-antipatterns.md
</checkpoints>
@@ -751,17 +751,17 @@ TDD plans target ~40% context (lower than standard 50%). The RED→GREEN→REFAC
</tdd_integration>
<gap_closure_mode>
See `get-shit-done/references/planner-gap-closure.md`. Load this file at the
See `gsd-core/references/planner-gap-closure.md`. Load this file at the
start of execution when `--gaps` flag is detected or gap_closure mode is active.
</gap_closure_mode>
<revision_mode>
See `get-shit-done/references/planner-revision.md`. Load this file at the
See `gsd-core/references/planner-revision.md`. Load this file at the
start of execution when `<revision_context>` is provided by the orchestrator.
</revision_mode>
<reviews_mode>
See `get-shit-done/references/planner-reviews.md`. Load this file at the
See `gsd-core/references/planner-reviews.md`. Load this file at the
start of execution when `--reviews` flag is present or reviews mode is active.
</reviews_mode>
@@ -787,9 +787,9 @@ If STATE.md missing but .planning/ exists, offer to reconstruct or continue with
<step name="load_mode_context">
Check the invocation mode and load the relevant reference file:
- If `--gaps` flag or gap_closure context present: Read `get-shit-done/references/planner-gap-closure.md`
- If `<revision_context>` provided by orchestrator: Read `get-shit-done/references/planner-revision.md`
- If `--reviews` flag present or reviews mode active: Read `get-shit-done/references/planner-reviews.md`
- If `--gaps` flag or gap_closure context present: Read `gsd-core/references/planner-gap-closure.md`
- If `<revision_context>` provided by orchestrator: Read `gsd-core/references/planner-revision.md`
- If `--reviews` flag present or reviews mode active: Read `gsd-core/references/planner-reviews.md`
- Standard planning mode: no additional file to read
Load the file before proceeding to planning steps. The reference file contains the full
@@ -827,7 +827,7 @@ ls .planning/graphs/graph.json 2>/dev/null
If graph.json exists, check freshness:
```bash
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" graphify status
node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" graphify status
```
If the status response has `stale: true`, note for later: "Graph is {age_hours}h old -- treat semantic relationships as approximate." Include this annotation inline with any graph context injected below.
@@ -835,7 +835,7 @@ If the status response has `stale: true`, note for later: "Graph is {age_hours}h
Query the graph for phase-relevant dependency context (single query per D-06):
```bash
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" graphify query "<phase-goal-keyword>" --budget 2000
node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" graphify query "<phase-goal-keyword>" --budget 2000
```
(graphify is not exposed on `gsd-tools query` yet; use `gsd-tools.cjs` for graphify only.)
@@ -941,7 +941,7 @@ cat "$phase_dir"/*-DISCOVERY.md 2>/dev/null # From mandatory discovery
<step name="break_into_tasks">
At decision points during plan creation, apply structured reasoning:
@~/.claude/get-shit-done/references/thinking-models-planning.md
@~/.claude/gsd-core/references/thinking-models-planning.md
Decompose phase into tasks. **Think dependencies first, not sequence.**
@@ -1179,7 +1179,7 @@ Follow templates in checkpoints and revision_mode sections respectively.
## Chunked Mode Returns
See @~/.claude/get-shit-done/references/planner-chunked.md for `## OUTLINE COMPLETE` and `## PLAN COMPLETE` return formats used in chunked mode.
See @~/.claude/gsd-core/references/planner-chunked.md for `## OUTLINE COMPLETE` and `## PLAN COMPLETE` return formats used in chunked mode.
</structured_returns>

View File

@@ -142,7 +142,7 @@ Identify gaps that couldn't be resolved and need attention during planning.
- `Read` the file, then `Edit` it, replacing `<!-- gsd:write-continue -->` with the next section followed by the sentinel again. Repeat, one section per `Edit`.
- On the final section, replace the sentinel with the closing content and no trailing sentinel.
Use template: ~/.claude/get-shit-done/templates/research-project/SUMMARY.md
Use template: ~/.claude/gsd-core/templates/research-project/SUMMARY.md
Write to `.planning/research/SUMMARY.md`.
@@ -162,7 +162,7 @@ Return brief confirmation with key points for the orchestrator.
<output_format>
Use template: ~/.claude/get-shit-done/templates/research-project/SUMMARY.md
Use template: ~/.claude/gsd-core/templates/research-project/SUMMARY.md
Key sections:
- Executive Summary (2-3 paragraphs)

View File

@@ -374,11 +374,11 @@ This annotation is consumed by downstream workflows (`new-project`, `progress`)
| 2. Name | 0/2 | Not started | - |
```
Reference full template: `~/.claude/get-shit-done/templates/roadmap.md`
Reference full template: `~/.claude/gsd-core/templates/roadmap.md`
## STATE.md Structure
Use template from `~/.claude/get-shit-done/templates/state.md`.
Use template from `~/.claude/gsd-core/templates/state.md`.
Key sections:
- Project Reference (core value, current focus)

View File

@@ -226,7 +226,7 @@ Scan the output for suspicious patterns:
## Output: UI-SPEC.md
Use template from `~/.claude/get-shit-done/templates/UI-SPEC.md`.
Use template from `~/.claude/gsd-core/templates/UI-SPEC.md`.
Write to: `$PHASE_DIR/$PADDED_PHASE-UI-SPEC.md`
@@ -285,7 +285,7 @@ Batch questions into a single interaction where possible.
## Step 5: Compile UI-SPEC.md
Read template: `~/.claude/get-shit-done/templates/UI-SPEC.md`
Read template: `~/.claude/gsd-core/templates/UI-SPEC.md`
Fill all sections. Write to `$PHASE_DIR/$PADDED_PHASE-UI-SPEC.md`.

View File

@@ -38,7 +38,7 @@ Key characteristics of the input:
</input>
<reference>
@~/.claude/get-shit-done/references/user-profiling.md
@~/.claude/gsd-core/references/user-profiling.md
This is the detection heuristics rubric. Read it in full before analyzing any messages. It defines:
- The 8 dimensions and their rating spectrums
@@ -52,7 +52,7 @@ This is the detection heuristics rubric. Read it in full before analyzing any me
<process>
<step name="load_rubric">
Read the user-profiling reference document at `~/.claude/get-shit-done/references/user-profiling.md` to load:
Read the user-profiling reference document at `~/.claude/gsd-core/references/user-profiling.md` to load:
- All 8 dimension definitions with rating spectrums
- Signal patterns and detection heuristics per dimension
- Confidence scoring thresholds (HIGH: 10+ signals across 2+ projects, MEDIUM: 5-9, LOW: <5, UNSCORED: 0)

View File

@@ -16,7 +16,7 @@ A completed phase has been submitted for goal-backward verification. Verify that
Goal-backward verification. Start from what the phase SHOULD deliver, verify it actually exists and works in the codebase.
@~/.claude/get-shit-done/references/mandatory-initial-read.md
@~/.claude/gsd-core/references/mandatory-initial-read.md
**Critical mindset:** Do NOT trust SUMMARY.md claims. SUMMARYs document what Claude SAID it did. You verify what ACTUALLY exists in the code. These often differ.
@@ -39,8 +39,8 @@ Every truth must resolve to VERIFIED, FAILED (BLOCKER), or UNCERTAIN (WARNING wi
</adversarial_stance>
<required_reading>
@~/.claude/get-shit-done/references/verification-overrides.md
@~/.claude/get-shit-done/references/gates.md
@~/.claude/gsd-core/references/verification-overrides.md
@~/.claude/gsd-core/references/gates.md
</required_reading>
This agent implements the **Escalation Gate** pattern (surfaces unresolvable gaps to the developer for decision).
@@ -49,7 +49,7 @@ Before verifying, discover project context:
**Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions.
**Project skills:** @~/.claude/get-shit-done/references/project-skills-discovery.md
**Project skills:** @~/.claude/gsd-core/references/project-skills-discovery.md
- Load `rules/*.md` as needed during **verification**.
- Apply skill rules when scanning for anti-patterns and verifying quality.
</project_context>
@@ -71,10 +71,10 @@ Then verify each level against the actual codebase.
<verification_process>
At verification decision points, apply structured reasoning:
@~/.claude/get-shit-done/references/thinking-models-verification.md
@~/.claude/gsd-core/references/thinking-models-verification.md
At verification decision points, reference calibration examples:
@~/.claude/get-shit-done/references/few-shot-examples/verifier.md
@~/.claude/gsd-core/references/few-shot-examples/verifier.md
## Step 0: Check for Previous Verification
@@ -644,7 +644,7 @@ Deferred items are informational only — they do not require closure plans.
## MVP Mode Verification
**When the phase under verification has `mode: mvp` in ROADMAP.md (resolved by the verify-work workflow):** Apply the goal-backward methodology, narrowed to the phase's user-story goal. Required reading: `@~/.claude/get-shit-done/references/verify-mvp-mode.md`.
**When the phase under verification has `mode: mvp` in ROADMAP.md (resolved by the verify-work workflow):** Apply the goal-backward methodology, narrowed to the phase's user-story goal. Required reading: `@~/.claude/gsd-core/references/verify-mvp-mode.md`.
**Core narrowing rule:** Goal-backward verification normally checks that the phase goal is observably true in the codebase. Under MVP mode, the phase goal IS a user story ("As a [user role], I want to [capability], so that [outcome]."). Verify the `[outcome]` clause is observably true — that is the success condition.

View File

@@ -18,7 +18,7 @@ const {
projectCodexHookTomlCommand,
shellHookOmitsBashRunner,
buildLocalShellHookCommand,
} = require('../get-shit-done/bin/lib/shell-command-projection.cjs');
} = require('../gsd-core/bin/lib/shell-command-projection.cjs');
// Bidirectional GSD slash-command namespace transformer (#3583).
// Required at module scope so the command list can be computed once per install
@@ -30,7 +30,7 @@ const {
} = require(path.join(__dirname, '..', 'scripts', 'fix-slash-commands.cjs'));
const {
resolveAntigravityGlobalDir,
} = require('../get-shit-done/bin/lib/runtime-homes.cjs');
} = require('../gsd-core/bin/lib/runtime-homes.cjs');
/**
* Runtimes that register hyphen-form `name:` per #2808 AND copy agent bodies
@@ -75,7 +75,7 @@ const dim = '\x1b[2m';
const reset = '\x1b[0m';
// Codex config.toml constants
const GSD_CODEX_MARKER = '# GSD Agent Configuration \u2014 managed by get-shit-done installer';
const GSD_CODEX_MARKER = '# GSD Agent Configuration \u2014 managed by gsd-core installer';
const GSD_CODEX_HOOKS_OWNERSHIP_PREFIX = '# GSD codex_hooks ownership: ';
// Codex's hook-enabling feature flag (issue #3566). Codex itself marks
// `codex_hooks` as a `legacy_key` in codex-rs/features/src/legacy.rs; the
@@ -92,7 +92,7 @@ function isCodexHooksFeatureKey(key) {
}
// Copilot instructions marker constants
const GSD_COPILOT_INSTRUCTIONS_MARKER = '<!-- GSD Configuration \u2014 managed by get-shit-done installer -->';
const GSD_COPILOT_INSTRUCTIONS_MARKER = '<!-- GSD Configuration \u2014 managed by gsd-core installer -->';
const GSD_COPILOT_INSTRUCTIONS_CLOSE_MARKER = '<!-- /GSD Configuration -->';
// GSD-managed files under hooks/lib/ (helpers required by gsd-*.sh hooks).
@@ -136,11 +136,11 @@ const pkg = require('../package.json');
// #2517 — runtime-aware tier resolution shared with core.cjs.
// Hoisted to top with absolute __dirname-based paths so `gsd install codex` works
// when invoked via npm global install (cwd is the user's project, not the gsd repo
// root). Inline `require('../get-shit-done/...')` from inside install functions
// root). Inline `require('../gsd-core/...')` from inside install functions
// works only because Node resolves it relative to the install.js file regardless
// of cwd, but keeping the require at the top makes the dependency explicit and
// surfaces resolution failures at process start instead of at first install call.
const _gsdLibDir = path.join(__dirname, '..', 'get-shit-done', 'bin', 'lib');
const _gsdLibDir = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib');
const { MODEL_PROFILES: GSD_MODEL_PROFILES } = require(path.join(_gsdLibDir, 'model-profiles.cjs'));
const {
RUNTIME_PROFILE_MAP: GSD_RUNTIME_PROFILE_MAP,
@@ -163,7 +163,7 @@ function _getGsdEffortCatalog() {
const manifestPath = path.join(
__dirname,
'..',
'get-shit-done',
'gsd-core',
'bin',
'shared',
'config-defaults.manifest.json'
@@ -230,10 +230,10 @@ const {
const {
planLegacyCleanup,
applyLegacyCleanup,
} = require(path.join(__dirname, '..', 'get-shit-done', 'bin', 'lib', 'legacy-cleanup.cjs'));
} = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'legacy-cleanup.cjs'));
const {
updateCacheFileName,
} = require(path.join(__dirname, '..', 'get-shit-done', 'bin', 'lib', 'package-identity.cjs'));
} = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs'));
// Parse args
const args = process.argv.slice(2);
@@ -5234,14 +5234,14 @@ function installCodexConfig(targetDir, agentsSrc) {
const agents = [];
// Compute the Codex GSD install path (absolute, so subagents with empty $HOME work — #820)
const codexGsdPath = `${path.resolve(targetDir, 'get-shit-done').replace(/\\/g, '/')}/`;
const codexGsdPath = `${path.resolve(targetDir, 'gsd-core').replace(/\\/g, '/')}/`;
for (const file of agentEntries) {
let content = fs.readFileSync(path.join(agentsSrc, file), 'utf8');
// Replace full .claude/get-shit-done prefix so path resolves to the Codex
// Replace full .claude/gsd-core prefix so path resolves to the Codex
// GSD install before generic .claude → .codex conversion rewrites it.
content = content.replace(/~\/\.claude\/get-shit-done\//g, codexGsdPath);
content = content.replace(/\$HOME\/\.claude\/get-shit-done\//g, codexGsdPath);
content = content.replace(/~\/\.claude\/gsd-core\//g, codexGsdPath);
content = content.replace(/\$HOME\/\.claude\/gsd-core\//g, codexGsdPath);
// Route TOML emit through the same full Claude→Codex conversion pipeline
// used on the `.md` emit path (#2639). Covers: slash-command rewrites,
// $ARGUMENTS → {{GSD_ARGS}}, /clear removal, anchored and bare .claude/
@@ -6040,7 +6040,7 @@ function writeHermesCategoryDescription(categoryDir) {
*/
/**
* Single source of truth for user-owned artifacts inside get-shit-done/.
* Single source of truth for user-owned artifacts inside gsd-core/.
*
* These files are created/refreshed by user-facing workflows (e.g.
* /gsd-profile-user) and must be preserved across reinstalls. Critically, they
@@ -6053,7 +6053,7 @@ function writeHermesCategoryDescription(categoryDir) {
* both. Both preserveUserArtifacts call sites and writeManifest must agree on
* this list, which is why it lives here as a single constant.
*
* Paths are relative to the get-shit-done/ directory.
* Paths are relative to the gsd-core/ directory.
*/
const USER_OWNED_ARTIFACTS = ['USER-PROFILE.md'];
@@ -7186,8 +7186,8 @@ function uninstall(isGlobal, runtime = 'claude') {
}
}
// 2. Remove get-shit-done directory
const gsdDir = path.join(targetDir, 'get-shit-done');
// 2. Remove gsd-core directory
const gsdDir = path.join(targetDir, 'gsd-core');
if (fs.existsSync(gsdDir)) {
// Preserve user-generated files before wipe (#1423)
const userProfilePath = path.join(gsdDir, 'USER-PROFILE.md');
@@ -7195,14 +7195,14 @@ function uninstall(isGlobal, runtime = 'claude') {
fs.rmSync(gsdDir, { recursive: true });
removedCount++;
console.log(` ${green}✓${reset} Removed get-shit-done/`);
console.log(` ${green}✓${reset} Removed gsd-core/`);
// Restore user-generated files
if (preservedProfile) {
try {
fs.mkdirSync(gsdDir, { recursive: true });
fs.writeFileSync(userProfilePath, preservedProfile);
console.log(` ${green}✓${reset} Preserved get-shit-done/USER-PROFILE.md`);
console.log(` ${green}✓${reset} Preserved gsd-core/USER-PROFILE.md`);
} catch (err) {
console.error(` ${red}✗${reset} Failed to restore USER-PROFILE.md: ${err.message}`);
}
@@ -7359,7 +7359,7 @@ function uninstall(isGlobal, runtime = 'claude') {
if (config.permission[permType]) {
const keys = Object.keys(config.permission[permType]);
for (const key of keys) {
if (key.includes('get-shit-done')) {
if (key.includes('gsd-core')) {
delete config.permission[permType][key];
modified = true;
}
@@ -7400,7 +7400,7 @@ function uninstall(isGlobal, runtime = 'claude') {
if (config.permission[permType]) {
const keys = Object.keys(config.permission[permType]);
for (const key of keys) {
if (key.includes('get-shit-done')) {
if (key.includes('gsd-core')) {
delete config.permission[permType][key];
modified = true;
}
@@ -7509,7 +7509,7 @@ function parseJsonc(content) {
/**
* Configure OpenCode permissions to allow reading GSD reference docs
* This prevents permission prompts when GSD accesses the get-shit-done directory
* This prevents permission prompts when GSD accesses the gsd-core directory
* @param {boolean} isGlobal - Whether this is a global or local install
* @param {string|null} configDir - Resolved config directory when already known
*/
@@ -7555,8 +7555,8 @@ function configureOpencodePermissions(isGlobal = true, configDir = null) {
// Use ~ shorthand if it's in the default location, otherwise use full path
const defaultConfigDir = path.join(os.homedir(), '.config', 'opencode');
const gsdPath = opencodeConfigDir === defaultConfigDir
? '~/.config/opencode/get-shit-done/*'
: `${opencodeConfigDir.replace(/\\/g, '/')}/get-shit-done/*`;
? '~/.config/opencode/gsd-core/*'
: `${opencodeConfigDir.replace(/\\/g, '/')}/gsd-core/*`;
let modified = false;
@@ -7589,7 +7589,7 @@ function configureOpencodePermissions(isGlobal = true, configDir = null) {
/**
* Configure Kilo permissions to allow reading GSD reference docs
* This prevents permission prompts when GSD accesses the get-shit-done directory
* This prevents permission prompts when GSD accesses the gsd-core directory
* @param {boolean} isGlobal - Whether this is a global or local install
* @param {string|null} configDir - Resolved config directory when already known
*/
@@ -7629,8 +7629,8 @@ function configureKiloPermissions(isGlobal = true, configDir = null) {
// Use ~ shorthand if it's in the default location, otherwise use full path
const defaultConfigDir = path.join(os.homedir(), '.config', 'kilo');
const gsdPath = kiloConfigDir === defaultConfigDir
? '~/.config/kilo/get-shit-done/*'
: `${kiloConfigDir.replace(/\\/g, '/')}/get-shit-done/*`;
? '~/.config/kilo/gsd-core/*'
: `${kiloConfigDir.replace(/\\/g, '/')}/gsd-core/*`;
let modified = false;
@@ -7801,7 +7801,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
const isTrae = runtime === 'trae';
const isCline = runtime === 'cline';
const isHermes = runtime === 'hermes';
const gsdDir = path.join(configDir, 'get-shit-done');
const gsdDir = path.join(configDir, 'gsd-core');
const commandsDir = path.join(configDir, 'commands', 'gsd');
const opencodeCommandDir = path.join(configDir, 'command');
// Hermes nests GSD skills under skills/gsd/ as a single category (#2841).
@@ -7826,7 +7826,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
// as a "local patch" (bug #2771). Single source of truth:
// USER_OWNED_ARTIFACTS at top of file.
if (USER_OWNED_ARTIFACTS.includes(rel)) continue;
manifest.files['get-shit-done/' + rel] = hash;
manifest.files['gsd-core/' + rel] = hash;
}
// Record commands/gsd/ for any runtime that emits it (Gemini globally,
// Claude Code locally — see #2923). Manifest must reflect everything on
@@ -7931,7 +7931,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
function populatePristineDir({ packageSrc, pristineDir, modified, runtime, pathPrefix, isGlobal }) {
if (!modified || modified.length === 0) return 0;
// Modified paths come from manifest.files which can live under several
// install roots: get-shit-done/, commands/gsd/, command/, skills/, agents/,
// install roots: gsd-core/, commands/gsd/, command/, skills/, agents/,
// hooks/, plus runtime-specific root files (#3004 CR). Stage every
// top-level dir that actually contains a modified path; root-level files
// are copied directly without the transform pipeline (they don't need
@@ -8013,7 +8013,7 @@ function saveLocalPatches(configDir, pristineCtx) {
// that were incorrectly recorded so refreshes don't surface false patches warnings.
if (manifest.files) {
for (const artifact of USER_OWNED_ARTIFACTS) {
delete manifest.files[`get-shit-done/${artifact}`];
delete manifest.files[`gsd-core/${artifact}`];
}
}
@@ -8287,7 +8287,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
: targetDir.replace(process.cwd(), '.');
// Path prefix for file references in markdown content (e.g. gsd-tools.cjs).
// Replaces $HOME/.claude/ or ~/.claude/ so the result is <pathPrefix>get-shit-done/bin/...
// Replaces $HOME/.claude/ or ~/.claude/ so the result is <pathPrefix>gsd-core/bin/...
// For global installs: use $HOME/ so paths expand correctly inside double-quoted
// shell commands (~ does NOT expand inside double quotes, causing MODULE_NOT_FOUND).
// For local installs: use resolved absolute path (may be outside $HOME).
@@ -8414,7 +8414,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
// codexPreInstallAgentFiles — Set of gsd-*.{md,toml} filenames in agents/
// codexPreInstallAgentContents — Map<filename, Buffer> of pre-existing agent
// file bytes, enabling full content restore (not just deletion) on rollback.
// codexPreInstallVersionBytes — Buffer (or null) of get-shit-done/VERSION
// codexPreInstallVersionBytes — Buffer (or null) of gsd-core/VERSION
//
// These are referenced by restoreCodexSnapshot(), defined below inside the
// config block. Defining the variables here (outer scope) makes them
@@ -8466,7 +8466,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
}
}
}
const _preVersionPath = path.join(targetDir, 'get-shit-done', 'VERSION');
const _preVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
if (fs.existsSync(_preVersionPath)) {
try { codexPreInstallVersionBytes = fs.readFileSync(_preVersionPath); } catch (_) { /* best-effort */ }
}
@@ -8478,7 +8478,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
// must also trigger rollback so the caller is never left in a partially-installed state.
//
// _codexPreConfigRollback covers the four surfaces that can be mutated before
// config.toml is touched: skills/, agents/, get-shit-done/VERSION, and orphaned
// config.toml is touched: skills/, agents/, gsd-core/VERSION, and orphaned
// atomic-write temp files. It is safe to call before any writes have happened.
// The full restoreCodexSnapshot() (defined inside the config block) additionally
// handles config.toml, which is not yet touched at this point in the pipeline.
@@ -8535,8 +8535,8 @@ function install(isGlobal, runtime = 'claude', options = {}) {
}
} catch (_) { /* best-effort */ }
}
// get-shit-done/VERSION
const _earlyVersionPath = path.join(targetDir, 'get-shit-done', 'VERSION');
// gsd-core/VERSION
const _earlyVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
if (codexPreInstallVersionBytes !== null) {
try { fs.writeFileSync(_earlyVersionPath, codexPreInstallVersionBytes); } catch (_) { /* best-effort */ }
} else if (fs.existsSync(_earlyVersionPath)) {
@@ -8791,24 +8791,24 @@ function install(isGlobal, runtime = 'claude', options = {}) {
}
}
// Copy get-shit-done skill with path replacement
// Copy gsd-core skill with path replacement
// Preserve user-generated files before the wipe-and-copy so they survive re-install
const skillSrc = path.join(src, 'get-shit-done');
const skillDest = path.join(targetDir, 'get-shit-done');
const skillSrc = path.join(src, 'gsd-core');
const skillDest = path.join(targetDir, 'gsd-core');
const savedGsdArtifacts = preserveUserArtifacts(skillDest, USER_OWNED_ARTIFACTS);
copyWithPathReplacement(skillSrc, skillDest, pathPrefix, runtime, false, isGlobal);
restoreUserArtifacts(skillDest, savedGsdArtifacts);
if (verifyInstalled(skillDest, 'get-shit-done')) {
if (verifyInstalled(skillDest, 'gsd-core')) {
console.log(` ${green}✓${reset} Installed workflow assets`);
} else {
failures.push('get-shit-done');
failures.push('gsd-core');
}
// Copy shared manifests into the get-shit-done payload
// Copy shared manifests into the gsd-core payload
// at the co-located path that CJS modules resolve first:
// get-shit-done/bin/shared/*.json
// gsd-core/bin/shared/*.json
//
// This source now lives under get-shit-done/bin/shared in-repo.
// This source now lives under gsd-core/bin/shared in-repo.
const sharedPayloadFiles = [
'model-catalog.json',
'config-defaults.manifest.json',
@@ -8816,9 +8816,9 @@ function install(isGlobal, runtime = 'claude', options = {}) {
'runtime-aliases.manifest.json',
];
for (const fileName of sharedPayloadFiles) {
const sharedSrc = path.join(src, 'get-shit-done', 'bin', 'shared', fileName);
const sharedSrc = path.join(src, 'gsd-core', 'bin', 'shared', fileName);
const sharedDest = path.join(skillDest, 'bin', 'shared', fileName);
const displayPath = `get-shit-done/bin/shared/${fileName}`;
const displayPath = `gsd-core/bin/shared/${fileName}`;
if (fs.existsSync(sharedSrc)) {
fs.mkdirSync(path.dirname(sharedDest), { recursive: true });
fs.copyFileSync(sharedSrc, sharedDest);
@@ -8828,7 +8828,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
failures.push(displayPath);
}
} else {
failures.push(`get-shit-done/bin/shared/${fileName} (source missing)`);
failures.push(`gsd-core/bin/shared/${fileName} (source missing)`);
}
}
@@ -8980,7 +8980,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
// Copy CHANGELOG.md
const changelogSrc = path.join(src, 'CHANGELOG.md');
const changelogDest = path.join(targetDir, 'get-shit-done', 'CHANGELOG.md');
const changelogDest = path.join(targetDir, 'gsd-core', 'CHANGELOG.md');
if (fs.existsSync(changelogSrc)) {
fs.copyFileSync(changelogSrc, changelogDest);
if (verifyFileInstalled(changelogDest, 'CHANGELOG.md')) {
@@ -8991,7 +8991,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
}
// Write VERSION file
const versionDest = path.join(targetDir, 'get-shit-done', 'VERSION');
const versionDest = path.join(targetDir, 'gsd-core', 'VERSION');
fs.writeFileSync(versionDest, pkg.version);
if (verifyFileInstalled(versionDest, 'VERSION')) {
console.log(` ${green}✓${reset} Wrote VERSION (${pkg.version})`);
@@ -9225,7 +9225,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
// newly-created dirs (i.e. those not in the pre-install Set)
// agents/gsd-* — restore pre-existing files from content snapshot; remove
// newly-created files
// get-shit-done/VERSION — restore or remove
// gsd-core/VERSION — restore or remove
// *.tmp-* — best-effort cleanup of installer-owned atomic-write temps
//
// Safe to call multiple times (idempotent): each remove/write is guarded by
@@ -9324,8 +9324,8 @@ function install(isGlobal, runtime = 'claude', options = {}) {
} catch (_) { /* best-effort */ }
}
// 4. get-shit-done/VERSION
const _rollbackVersionPath = path.join(targetDir, 'get-shit-done', 'VERSION');
// 4. gsd-core/VERSION
const _rollbackVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
if (codexPreInstallVersionBytes !== null) {
try { fs.writeFileSync(_rollbackVersionPath, codexPreInstallVersionBytes); }
catch (_) { /* best-effort */ }
@@ -9544,7 +9544,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
if (isCopilot) {
// Generate copilot-instructions.md
const templatePath = path.join(targetDir, 'get-shit-done', 'templates', 'copilot-instructions.md');
const templatePath = path.join(targetDir, 'gsd-core', 'templates', 'copilot-instructions.md');
const instructionsPath = path.join(targetDir, 'copilot-instructions.md');
if (fs.existsSync(templatePath)) {
const template = fs.readFileSync(templatePath, 'utf8');
@@ -9580,10 +9580,10 @@ function install(isGlobal, runtime = 'claude', options = {}) {
const clinerules = [
'# GSD Core — Git. Ship. Done.',
'',
'- GSD workflows live in `get-shit-done/workflows/`. Load the relevant workflow when',
'- GSD workflows live in `gsd-core/workflows/`. Load the relevant workflow when',
' the user runs a `/gsd-*` command.',
'- GSD agents live in `agents/`. Use the matching agent when spawning subagents.',
'- GSD tools are at `get-shit-done/bin/gsd-tools.cjs`. Run with `node`.',
'- GSD tools are at `gsd-core/bin/gsd-tools.cjs`. Run with `node`.',
'- Planning artifacts live in `.planning/`. Never edit them outside a GSD workflow.',
'- Do not apply GSD workflows unless the user explicitly asks for them.',
'- When a GSD command triggers a deliverable (feature, fix, docs), offer the next',

View File

@@ -26,7 +26,7 @@ Output: Test files committed with message `test(phase-{N}): add unit and E2E tes
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/add-tests.md
@~/.claude/gsd-core/workflows/add-tests.md
</execution_context>
<context>

View File

@@ -22,9 +22,9 @@ Flow: Select Framework → Research Docs → Research Domain → Design Eval Str
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/ai-integration-phase.md
@~/.claude/get-shit-done/references/ai-frameworks.md
@~/.claude/get-shit-done/references/ai-evals.md
@~/.claude/gsd-core/workflows/ai-integration-phase.md
@~/.claude/gsd-core/references/ai-frameworks.md
@~/.claude/gsd-core/references/ai-evals.md
</execution_context>
<context>

View File

@@ -26,7 +26,7 @@ Flags:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/audit-fix.md
@~/.claude/gsd-core/workflows/audit-fix.md
</execution_context>
<process>

View File

@@ -18,7 +18,7 @@ Verify milestone achieved its definition of done. Check requirements coverage, c
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/audit-milestone.md
@~/.claude/gsd-core/workflows/audit-milestone.md
</execution_context>
<context>

View File

@@ -12,7 +12,7 @@ Scan all phases for pending, skipped, blocked, and human_needed UAT items. Cross
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/audit-uat.md
@~/.claude/gsd-core/workflows/audit-uat.md
</execution_context>
<context>

View File

@@ -26,8 +26,8 @@ Uses ROADMAP.md phase discovery and Skill() flat invocations for each phase comm
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/autonomous.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/autonomous.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>

View File

@@ -36,12 +36,12 @@ Mode routing:
</routing>
<execution_context>
@~/.claude/get-shit-done/workflows/add-todo.md
@~/.claude/get-shit-done/workflows/note.md
@~/.claude/get-shit-done/workflows/add-backlog.md
@~/.claude/get-shit-done/workflows/plant-seed.md
@~/.claude/get-shit-done/workflows/check-todos.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/add-todo.md
@~/.claude/gsd-core/workflows/note.md
@~/.claude/gsd-core/workflows/add-backlog.md
@~/.claude/gsd-core/workflows/plant-seed.md
@~/.claude/gsd-core/workflows/check-todos.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>

View File

@@ -15,7 +15,7 @@ Use when `.planning/phases/` has accumulated directories from past milestones.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/cleanup.md
@~/.claude/gsd-core/workflows/cleanup.md
</execution_context>
<process>

View File

@@ -31,7 +31,7 @@ Output: {padded_phase}-REVIEW.md in phase directory + inline summary of findings
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/code-review.md
@~/.claude/gsd-core/workflows/code-review.md
</execution_context>
<context>

View File

@@ -20,8 +20,8 @@ Output: Milestone archived (roadmap + requirements), PROJECT.md evolved, git tag
<execution_context>
**Load these files NOW (before proceeding):**
- @~/.claude/get-shit-done/workflows/complete-milestone.md (main workflow)
- @~/.claude/get-shit-done/templates/milestone-archive.md (archive template)
- @~/.claude/gsd-core/workflows/complete-milestone.md (main workflow)
- @~/.claude/gsd-core/templates/milestone-archive.md (archive template)
</execution_context>
<context>

View File

@@ -32,9 +32,9 @@ Mode routing:
</routing>
<execution_context>
@~/.claude/get-shit-done/workflows/settings.md
@~/.claude/get-shit-done/workflows/settings-advanced.md
@~/.claude/get-shit-done/workflows/settings-integrations.md
@~/.claude/gsd-core/workflows/settings.md
@~/.claude/gsd-core/workflows/settings-advanced.md
@~/.claude/gsd-core/workflows/settings-integrations.md
</execution_context>
<context>

View File

@@ -28,7 +28,7 @@ Valid GSD subagent types (use exact names — do not fall back to 'general-purpo
</available_agent_types>
<execution_context>
@~/.claude/get-shit-done/workflows/debug.md
@~/.claude/gsd-core/workflows/debug.md
</execution_context>
<context>

View File

@@ -47,19 +47,19 @@ Context files are resolved in-workflow using `init phase-op` and roadmap/state t
<process>
**Mode routing:**
```bash
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/get-shit-done/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/get-shit-done/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi
_GSD_SHIM_NAME="gsd-tools.cjs"; _GSD_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; GSD_TOOLS="${_GSD_RUNTIME_ROOT}/gsd-core/bin/${_GSD_SHIM_NAME}"; if [ -f "$GSD_TOOLS" ]; then gsd_run() { node "$GSD_TOOLS" "$@"; }; elif [ -f "${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="${_GSD_RUNTIME_ROOT}/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; elif command -v gsd-tools >/dev/null 2>&1; then GSD_TOOLS="$(command -v gsd-tools)"; gsd_run() { "$GSD_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}" ]; then GSD_TOOLS="$HOME/.claude/gsd-core/bin/${_GSD_SHIM_NAME}"; gsd_run() { node "$GSD_TOOLS" "$@"; }; else echo "ERROR: gsd-tools.cjs not found at $GSD_TOOLS and gsd-tools is not on PATH. Run: npx -y @opengsd/gsd-core@latest --claude --local" >&2; exit 1; fi
DISCUSS_MODE=$(gsd_run query config-get workflow.discuss_mode 2>/dev/null || echo "discuss")
```
If `--assumptions` is in $ARGUMENTS:
Read and execute `~/.claude/get-shit-done/workflows/list-phase-assumptions.md` end-to-end.
Read and execute `~/.claude/gsd-core/workflows/list-phase-assumptions.md` end-to-end.
Stop here.
Otherwise, if `DISCUSS_MODE` is `"assumptions"`:
Read and execute `~/.claude/get-shit-done/workflows/discuss-phase-assumptions.md` end-to-end.
Read and execute `~/.claude/gsd-core/workflows/discuss-phase-assumptions.md` end-to-end.
Otherwise (`"discuss"` / unset / any other value):
Read and execute `~/.claude/get-shit-done/workflows/discuss-phase.md` end-to-end.
Read and execute `~/.claude/gsd-core/workflows/discuss-phase.md` end-to-end.
**MANDATORY:** Read the appropriate workflow file BEFORE taking any action. The objective and success_criteria sections in this command file are summaries — the workflow file contains the complete step-by-step process with all required behaviors, config checks, and interaction patterns. Do not improvise from the summary.

View File

@@ -26,7 +26,7 @@ Flag handling rule:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/docs-update.md
@~/.claude/gsd-core/workflows/docs-update.md
</execution_context>
<context>

View File

@@ -19,8 +19,8 @@ Produces EVAL-REVIEW.md with score, verdict, gaps, and remediation plan.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/eval-review.md
@~/.claude/get-shit-done/references/ai-evals.md
@~/.claude/gsd-core/workflows/eval-review.md
@~/.claude/gsd-core/references/ai-evals.md
</execution_context>
<context>

View File

@@ -32,8 +32,8 @@ Context budget: ~15% orchestrator, 100% fresh per subagent.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/execute-phase.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/execute-phase.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<runtime_note>

View File

@@ -19,7 +19,7 @@ Accepts an optional topic argument: `/gsd:explore authentication strategy`
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/explore.md
@~/.claude/gsd-core/workflows/explore.md
</execution_context>
<process>

View File

@@ -17,7 +17,7 @@ Extract structured learnings from completed phase artifacts (PLAN.md, SUMMARY.md
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/extract-learnings.md
@~/.claude/gsd-core/workflows/extract-learnings.md
</execution_context>
Execute the extract-learnings workflow from @~/.claude/get-shit-done/workflows/extract-learnings.md end-to-end.
Execute the extract-learnings workflow from @~/.claude/gsd-core/workflows/extract-learnings.md end-to-end.

View File

@@ -23,7 +23,7 @@ you could describe in one sentence and execute in under 2 minutes.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/fast.md
@~/.claude/gsd-core/workflows/fast.md
</execution_context>
<process>

View File

@@ -20,7 +20,7 @@ Output: Forensic report saved to `.planning/forensics/`, presented inline, with
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/forensics.md
@~/.claude/gsd-core/workflows/forensics.md
</execution_context>
<context>

View File

@@ -10,7 +10,7 @@ requires: [config, fast, phase, update]
**STOP -- DO NOT READ THIS FILE. You are already reading it. This prompt was injected into your context by Claude Code's command system. Using the Read tool on this file wastes tokens. Begin executing Step 0 immediately.**
**CJS-only (graphify):** `graphify` subcommands are not registered on `gsd-tools query`. Use `node $HOME/.claude/get-shit-done/bin/gsd-tools.cjs graphify …` as documented in this command and in `docs/CLI-TOOLS.md`. Other tooling may still use `gsd-tools query` where a handler exists.
**CJS-only (graphify):** `graphify` subcommands are not registered on `gsd-tools query`. Use `node $HOME/.claude/gsd-core/bin/gsd-tools.cjs graphify …` as documented in this command and in `docs/CLI-TOOLS.md`. Other tooling may still use `gsd-tools query` where a handler exists.
## Step 0 -- Banner
@@ -41,7 +41,7 @@ GSD > GRAPHIFY
Knowledge graph is disabled. To activate:
node $HOME/.claude/get-shit-done/bin/gsd-tools.cjs config-set graphify.enabled true
node $HOME/.claude/gsd-core/bin/gsd-tools.cjs config-set graphify.enabled true
Then run /gsd:graphify build to create the initial graph.
```
@@ -79,7 +79,7 @@ Modes:
Run:
```bash
node $HOME/.claude/get-shit-done/bin/gsd-tools.cjs graphify query <term>
node $HOME/.claude/gsd-core/bin/gsd-tools.cjs graphify query <term>
```
Parse the JSON output and display results:
@@ -95,7 +95,7 @@ Parse the JSON output and display results:
Run:
```bash
node $HOME/.claude/get-shit-done/bin/gsd-tools.cjs graphify status
node $HOME/.claude/gsd-core/bin/gsd-tools.cjs graphify status
```
Parse the JSON output and display:
@@ -119,7 +119,7 @@ Surface both so the agent can choose.
Run:
```bash
node $HOME/.claude/get-shit-done/bin/gsd-tools.cjs graphify diff
node $HOME/.claude/gsd-core/bin/gsd-tools.cjs graphify diff
```
Parse the JSON output and display:
@@ -137,7 +137,7 @@ If no snapshot exists, suggest running `build` twice (first to create, second to
Run the pre-flight check first:
```bash
node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" graphify build
node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" graphify build
```
Parse the JSON output:
@@ -160,8 +160,8 @@ graphify update . \
&& cp graphify-out/graph.json .planning/graphs/graph.json \
&& cp graphify-out/graph.html .planning/graphs/graph.html \
&& cp graphify-out/GRAPH_REPORT.md .planning/graphs/GRAPH_REPORT.md \
&& node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" graphify build snapshot \
&& node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" graphify status
&& node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" graphify build snapshot \
&& node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" graphify status
```
Do NOT pass `run_in_background: true`. Typical builds complete in 15-60 seconds and the entire chain must run foreground.

View File

@@ -22,7 +22,7 @@ Validate `.planning/` directory integrity and report actionable issues. Checks f
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/health.md
@~/.claude/gsd-core/workflows/health.md
</execution_context>
<process>

View File

@@ -16,7 +16,7 @@ Output ONLY the reference content of the chosen tier. Do NOT add:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/help.md
@~/.claude/gsd-core/workflows/help.md
</execution_context>
<context>
@@ -24,5 +24,5 @@ Arguments: $ARGUMENTS
</context>
<process>
Follow ~/.claude/get-shit-done/workflows/help.md with $ARGUMENTS.
Follow ~/.claude/gsd-core/workflows/help.md with $ARGUMENTS.
</process>

View File

@@ -21,10 +21,10 @@ Import external plan files into the GSD planning system with conflict detection
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/import.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/get-shit-done/references/gate-prompts.md
@~/.claude/get-shit-done/references/doc-conflict-engine.md
@~/.claude/gsd-core/workflows/import.md
@~/.claude/gsd-core/references/ui-brand.md
@~/.claude/gsd-core/references/gate-prompts.md
@~/.claude/gsd-core/references/doc-conflict-engine.md
</execution_context>
<context>
@@ -33,7 +33,7 @@ $ARGUMENTS
<process>
If `--from-gsd2` is in $ARGUMENTS:
Run: `node "$HOME/.claude/get-shit-done/bin/gsd-tools.cjs" from-gsd2`
Run: `node "$HOME/.claude/gsd-core/bin/gsd-tools.cjs" from-gsd2`
Pass `--path <dir>` if provided. Present the migration result to the user.
Stop here (do not run the standard import workflow).

View File

@@ -21,7 +21,7 @@ and optionally applies labels or closes non-compliant submissions.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/inbox.md
@~/.claude/gsd-core/workflows/inbox.md
</execution_context>
<context>

View File

@@ -27,10 +27,10 @@ Auto-synthesizes most conflicts using the precedence rule `ADR > SPEC > PRD > DO
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/ingest-docs.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/get-shit-done/references/gate-prompts.md
@~/.claude/get-shit-done/references/doc-conflict-engine.md
@~/.claude/gsd-core/workflows/ingest-docs.md
@~/.claude/gsd-core/references/ui-brand.md
@~/.claude/gsd-core/references/gate-prompts.md
@~/.claude/gsd-core/references/doc-conflict-engine.md
</execution_context>
<context>

View File

@@ -26,8 +26,8 @@ Designed for power users who want to parallelize work across phases from one ter
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/manager.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/manager.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>
@@ -38,7 +38,7 @@ Project context, phase list, dependencies, and recommendations are resolved insi
<process>
If `--analyze-deps` is in $ARGUMENTS:
Read and execute `~/.claude/get-shit-done/workflows/analyze-dependencies.md` end-to-end.
Read and execute `~/.claude/gsd-core/workflows/analyze-dependencies.md` end-to-end.
Execute end-to-end.
Maintain the dashboard refresh loop until the user exits or all phases complete.

View File

@@ -21,7 +21,7 @@ Output: .planning/codebase/ folder with 7 structured documents about the codebas
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/map-codebase.md
@~/.claude/gsd-core/workflows/map-codebase.md
</execution_context>
<flags>

View File

@@ -19,7 +19,7 @@ Output: MILESTONE_SUMMARY written to `.planning/reports/`, presented inline, opt
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/milestone-summary.md
@~/.claude/gsd-core/workflows/milestone-summary.md
</execution_context>
<context>

View File

@@ -24,9 +24,9 @@ Phase 1 of the vertical-mvp-slice PRD shipped the planner-side machinery; this c
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/mvp-phase.md
@~/.claude/get-shit-done/references/spidr-splitting.md
@~/.claude/get-shit-done/references/user-story-template.md
@~/.claude/gsd-core/workflows/mvp-phase.md
@~/.claude/gsd-core/references/spidr-splitting.md
@~/.claude/gsd-core/references/user-story-template.md
</execution_context>
<runtime_note>
@@ -40,6 +40,6 @@ The phase must already exist in ROADMAP.md (created via `/gsd new-project`, `/gs
</context>
<process>
Execute the mvp-phase workflow from @~/.claude/get-shit-done/workflows/mvp-phase.md end-to-end.
Execute the mvp-phase workflow from @~/.claude/gsd-core/workflows/mvp-phase.md end-to-end.
Preserve all gates: phase existence, status guard (refuse in_progress/completed), user-story format validation, SPIDR splitting check, ROADMAP write confirmation, plan-phase delegation.
</process>

View File

@@ -26,11 +26,11 @@ Brownfield equivalent of new-project. Project exists, PROJECT.md has history. Ga
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/new-milestone.md
@~/.claude/get-shit-done/references/questioning.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/get-shit-done/templates/project.md
@~/.claude/get-shit-done/templates/requirements.md
@~/.claude/gsd-core/workflows/new-milestone.md
@~/.claude/gsd-core/references/questioning.md
@~/.claude/gsd-core/references/ui-brand.md
@~/.claude/gsd-core/templates/project.md
@~/.claude/gsd-core/templates/requirements.md
</execution_context>
<context>

View File

@@ -34,11 +34,11 @@ Initialize a new project through unified flow: questioning → research (optiona
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/new-project.md
@~/.claude/get-shit-done/references/questioning.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/get-shit-done/templates/project.md
@~/.claude/get-shit-done/templates/requirements.md
@~/.claude/gsd-core/workflows/new-project.md
@~/.claude/gsd-core/references/questioning.md
@~/.claude/gsd-core/references/ui-brand.md
@~/.claude/gsd-core/templates/project.md
@~/.claude/gsd-core/templates/requirements.md
</execution_context>
<process>

View File

@@ -21,7 +21,7 @@ Routes to the pause-work workflow which handles:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/pause-work.md
@~/.claude/gsd-core/workflows/pause-work.md
</execution_context>
<context>
@@ -30,7 +30,7 @@ State and phase progress are gathered in-workflow with targeted reads.
<process>
If `--report` is in $ARGUMENTS:
Read and execute `~/.claude/get-shit-done/workflows/session-report.md` end-to-end.
Read and execute `~/.claude/gsd-core/workflows/session-report.md` end-to-end.
**Follow the pause-work workflow**.

View File

@@ -31,10 +31,10 @@ Mode routing:
</routing>
<execution_context>
@~/.claude/get-shit-done/workflows/add-phase.md
@~/.claude/get-shit-done/workflows/insert-phase.md
@~/.claude/get-shit-done/workflows/remove-phase.md
@~/.claude/get-shit-done/workflows/edit-phase.md
@~/.claude/gsd-core/workflows/add-phase.md
@~/.claude/gsd-core/workflows/insert-phase.md
@~/.claude/gsd-core/workflows/remove-phase.md
@~/.claude/gsd-core/workflows/edit-phase.md
</execution_context>
<context>

View File

@@ -30,8 +30,8 @@ Create executable phase prompts (PLAN.md files) for a roadmap phase with integra
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/plan-phase.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/plan-phase.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<runtime_note>

View File

@@ -25,10 +25,10 @@ Replaces gsd-plan-phase's internal gsd-plan-checker with external AI reviewers (
</objective>
<execution_context>
@$HOME/.claude/get-shit-done/workflows/plan-review-convergence.md
@$HOME/.claude/get-shit-done/references/revision-loop.md
@$HOME/.claude/get-shit-done/references/gates.md
@$HOME/.claude/get-shit-done/references/agent-contracts.md
@$HOME/.claude/gsd-core/workflows/plan-review-convergence.md
@$HOME/.claude/gsd-core/references/revision-loop.md
@$HOME/.claude/gsd-core/references/gates.md
@$HOME/.claude/gsd-core/references/agent-contracts.md
</execution_context>
<runtime_note>

View File

@@ -18,7 +18,7 @@ changes that are irrelevant to code review.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/pr-branch.md
@~/.claude/gsd-core/workflows/pr-branch.md
</execution_context>
<process>

View File

@@ -19,8 +19,8 @@ Routes to the profile-user workflow which orchestrates the full flow: consent ga
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/profile-user.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/profile-user.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>

View File

@@ -30,10 +30,10 @@ Three modes:
</flags>
<execution_context>
@~/.claude/get-shit-done/workflows/progress.md
@~/.claude/get-shit-done/workflows/next.md
@~/.claude/get-shit-done/workflows/do.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/progress.md
@~/.claude/gsd-core/workflows/next.md
@~/.claude/gsd-core/workflows/do.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<process>

View File

@@ -40,7 +40,7 @@ Granular flags are composable: `--discuss --research --validate` gives the same
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/quick.md
@~/.claude/gsd-core/workflows/quick.md
</execution_context>
<context>

View File

@@ -22,7 +22,7 @@ Routes to the resume-project workflow which handles:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/resume-project.md
@~/.claude/gsd-core/workflows/resume-project.md
</execution_context>
<process>

View File

@@ -20,7 +20,7 @@ planning via /gsd:plan-phase --reviews.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/review.md
@~/.claude/gsd-core/workflows/review.md
</execution_context>
<context>

View File

@@ -23,7 +23,7 @@ Output: updated SECURITY.md.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/secure-phase.md
@~/.claude/gsd-core/workflows/secure-phase.md
</execution_context>
<context>

View File

@@ -21,7 +21,7 @@ Routes to the settings workflow which handles:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/settings.md
@~/.claude/gsd-core/workflows/settings.md
</execution_context>
<process>

View File

@@ -18,7 +18,7 @@ Closes the plan → execute → verify → ship loop.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/ship.md
@~/.claude/gsd-core/workflows/ship.md
</execution_context>
Execute the ship workflow from @~/.claude/get-shit-done/workflows/ship.md end-to-end.
Execute the ship workflow from @~/.claude/gsd-core/workflows/ship.md end-to-end.

View File

@@ -30,13 +30,13 @@ Does not require prior new-project setup — auto-creates `.planning/sketches/`
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/sketch.md
@~/.claude/get-shit-done/workflows/sketch-wrap-up.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/get-shit-done/references/sketch-theme-system.md
@~/.claude/get-shit-done/references/sketch-interactivity.md
@~/.claude/get-shit-done/references/sketch-tooling.md
@~/.claude/get-shit-done/references/sketch-variant-patterns.md
@~/.claude/gsd-core/workflows/sketch.md
@~/.claude/gsd-core/workflows/sketch-wrap-up.md
@~/.claude/gsd-core/references/ui-brand.md
@~/.claude/gsd-core/references/sketch-theme-system.md
@~/.claude/gsd-core/references/sketch-interactivity.md
@~/.claude/gsd-core/references/sketch-tooling.md
@~/.claude/gsd-core/references/sketch-variant-patterns.md
</execution_context>
<runtime_note>

View File

@@ -29,8 +29,8 @@ Clarify phase requirements through structured Socratic questioning with quantita
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/spec-phase.md
@~/.claude/get-shit-done/templates/spec.md
@~/.claude/gsd-core/workflows/spec-phase.md
@~/.claude/gsd-core/templates/spec.md
</execution_context>
<runtime_note>

View File

@@ -30,9 +30,9 @@ Does not require prior new-project setup — auto-creates `.planning/spikes/` if
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/spike.md
@~/.claude/get-shit-done/workflows/spike-wrap-up.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/spike.md
@~/.claude/gsd-core/workflows/spike-wrap-up.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<runtime_note>

View File

@@ -11,7 +11,7 @@ Display comprehensive project statistics including phase progress, plan executio
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/stats.md
@~/.claude/gsd-core/workflows/stats.md
</execution_context>
<process>

View File

@@ -37,7 +37,7 @@ Parse the first token of $ARGUMENTS:
## list / status
Call `listSurface(runtimeConfigDir, manifest, CLUSTERS)` from
`get-shit-done/bin/lib/surface.cjs`. Display:
`gsd-core/bin/lib/surface.cjs`. Display:
```
Enabled (N skills, ~T tokens):
@@ -144,12 +144,12 @@ All paths can be overridden by reading the `CLAUDE_CONFIG_DIR` env var if set.
- Unknown cluster name → list valid cluster names, exit without writing.
- Unknown profile name → list known profiles (`core`, `standard`, `full`), exit.
- Missing `surface.cjs` → prompt: "Run `npm i -g get-shit-done` to reinstall GSD."
- Missing `surface.cjs` → prompt: "Run `npm i -g gsd-core` to reinstall GSD."
<execution_context>
Surface state file: `~/.claude/.gsd-surface.json`
Install profile marker: `~/.claude/.gsd-profile`
Skill dirs: `~/.claude/skills/gsd-*/`
Engine module: `~/.claude/get-shit-done/bin/lib/surface.cjs`
Cluster definitions: `~/.claude/get-shit-done/bin/lib/clusters.cjs`
Engine module: `~/.claude/gsd-core/bin/lib/surface.cjs`
Cluster definitions: `~/.claude/gsd-core/bin/lib/clusters.cjs`
</execution_context>

View File

@@ -16,7 +16,7 @@ doesn't belong to any specific phase.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/thread.md
@~/.claude/gsd-core/workflows/thread.md
</execution_context>
<process>

View File

@@ -21,8 +21,8 @@ Flow: Validate → Research UI → Verify UI-SPEC → Done
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/ui-phase.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/ui-phase.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>

View File

@@ -19,8 +19,8 @@ Output: {phase_num}-UI-REVIEW.md
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/ui-review.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/ui-review.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>

View File

@@ -21,8 +21,8 @@ Requirements: Claude Code v2.1.91+, claude.ai account, GitHub repository.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/ultraplan-phase.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/ultraplan-phase.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>

View File

@@ -21,9 +21,9 @@ Three modes:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/undo.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/get-shit-done/references/gate-prompts.md
@~/.claude/gsd-core/workflows/undo.md
@~/.claude/gsd-core/references/ui-brand.md
@~/.claude/gsd-core/references/gate-prompts.md
</execution_context>
<context>

View File

@@ -25,7 +25,7 @@ Routes to the update workflow which handles:
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/update.md
@~/.claude/gsd-core/workflows/update.md
</execution_context>
<flags>
@@ -43,6 +43,6 @@ Parse the first token of $ARGUMENTS:
</process>
<execution_context_extended>
@~/.claude/get-shit-done/workflows/sync-skills.md
@~/.claude/get-shit-done/workflows/reapply-patches.md
@~/.claude/gsd-core/workflows/sync-skills.md
@~/.claude/gsd-core/workflows/reapply-patches.md
</execution_context_extended>

View File

@@ -23,7 +23,7 @@ Output: updated VALIDATION.md + generated test files.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/validate-phase.md
@~/.claude/gsd-core/workflows/validate-phase.md
</execution_context>
<context>

View File

@@ -21,8 +21,8 @@ Output: {phase_num}-UAT.md tracking all test results. If issues found: diagnosed
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/verify-work.md
@~/.claude/get-shit-done/templates/UAT.md
@~/.claude/gsd-core/workflows/verify-work.md
@~/.claude/gsd-core/templates/UAT.md
</execution_context>
<context>

View File

@@ -29,10 +29,10 @@ Mode routing:
</routing>
<execution_context>
@~/.claude/get-shit-done/workflows/new-workspace.md
@~/.claude/get-shit-done/workflows/list-workspaces.md
@~/.claude/get-shit-done/workflows/remove-workspace.md
@~/.claude/get-shit-done/references/ui-brand.md
@~/.claude/gsd-core/workflows/new-workspace.md
@~/.claude/gsd-core/workflows/list-workspaces.md
@~/.claude/gsd-core/workflows/remove-workspace.md
@~/.claude/gsd-core/references/ui-brand.md
</execution_context>
<context>

View File

@@ -613,7 +613,7 @@ Twelve additional agents ship under `agents/gsd-*.md` and are used by specialty
| **Color** | `#F59E0B` (amber) |
| **Produces** | Sections 5–7 of `AI-SPEC.md` (Evaluation Strategy, Guardrails, Production Monitoring) |
**Required reading:** `get-shit-done/references/ai-evals.md` (evaluation framework).
**Required reading:** `gsd-core/references/ai-evals.md` (evaluation framework).
**Key behaviors:**
- Turns domain-researcher rubric ingredients into measurable, tooled evaluation criteria
@@ -634,7 +634,7 @@ Twelve additional agents ship under `agents/gsd-*.md` and are used by specialty
| **Color** | `#EF4444` (red) |
| **Produces** | `EVAL-REVIEW.md` with dimension scores, findings, and remediation guidance |
**Required reading:** `get-shit-done/references/ai-evals.md`.
**Required reading:** `gsd-core/references/ai-evals.md`.
**Key behaviors:**
- Compares the implemented codebase against the planned eval strategy — never re-plans
@@ -655,7 +655,7 @@ Twelve additional agents ship under `agents/gsd-*.md` and are used by specialty
| **Color** | `#38BDF8` (sky blue) |
| **Produces** | Scored ranked recommendation (structured return to orchestrator) |
**Required reading:** `get-shit-done/references/ai-frameworks.md` (decision matrix).
**Required reading:** `gsd-core/references/ai-frameworks.md` (decision matrix).
**Key behaviors:**
- Scans `package.json`, `pyproject.toml`, `requirements*.txt` for existing AI libraries before the interview to avoid recommending a rejected framework

View File

@@ -42,7 +42,7 @@ GSD Core is a **meta-prompting framework** that sits between the user and AI cod
│
┌─────────────────────▼────────────────────────────────┐
│ WORKFLOW LAYER │
│ get-shit-done/workflows/*.md — Orchestration logic │
│ gsd-core/workflows/*.md — Orchestration logic │
│ (Reads references, spawns agents, manages state) │
└──────┬──────────────┬─────────────────┬──────────────┘
│ │ │
@@ -75,7 +75,7 @@ Every agent spawned by an orchestrator gets a clean context window (up to 200K t
### 2. Thin Orchestrators
Workflow files (`get-shit-done/workflows/*.md`) never do heavy lifting. They:
Workflow files (`gsd-core/workflows/*.md`) never do heavy lifting. They:
- Load context via `gsd-tools.cjs init <workflow>`
- Spawn specialized agents with focused prompts
@@ -130,7 +130,7 @@ The router descriptions use pipe-separated keyword tags (≤ 60 chars) per the T
The eager skill listing is one of two recurring per-turn token costs. The other is the MCP tool schema injected by every enabled MCP server in `.claude/settings.json`. Heavyweight MCP servers (browser/playwright, Mac-tools, Windows-tools) can each cost 20 k+ tokens per turn — often dwarfing what `model_profile` tuning saves. The toggle lives in the Claude Code harness (`enabledMcpjsonServers` / `disabledMcpjsonServers` in `.claude/settings.json`) and is **not** a GSD concern. Together, the two-stage routing layer (#2792) and disciplined MCP enablement are the largest cost levers per turn. See [`docs/USER-GUIDE.md`](USER-GUIDE.md) and `references/context-budget.md` for the audit checklist.
### Workflows (`get-shit-done/workflows/*.md`)
### Workflows (`gsd-core/workflows/*.md`)
Orchestration logic that commands reference. Contains the step-by-step process including:
@@ -159,7 +159,7 @@ mirrors the agent budget from #2361:
issue #2551. When a workflow grows beyond its tier, extract per-mode bodies
into `workflows/<workflow>/modes/<mode>.md`, templates into
`workflows/<workflow>/templates/`, and shared knowledge into
`get-shit-done/references/`. The parent file becomes a thin dispatcher that
`gsd-core/references/`. The parent file becomes a thin dispatcher that
Reads only the mode and template files needed for the current invocation.
`workflows/discuss-phase/` is the canonical example of this pattern —
@@ -180,7 +180,7 @@ Specialized agent definitions with frontmatter specifying:
**Total agents:** 33
### References (`get-shit-done/references/*.md`)
### References (`gsd-core/references/*.md`)
Shared knowledge documents that workflows and agents `@-reference` (see [`docs/INVENTORY.md`](INVENTORY.md#references-41-shipped) for the authoritative count and full roster):
@@ -234,7 +234,7 @@ The planner agent (`agents/gsd-planner.md`) was decomposed from a single monolit
- `planner-reviews.md` — Cross-AI review integration (reads REVIEWS.md from `/gsd-review`)
- `planner-revision.md` — Plan revision patterns for iterative refinement
### Templates (`get-shit-done/templates/`)
### Templates (`gsd-core/templates/`)
Markdown templates for all planning artifacts. Used by `gsd-tools.cjs template fill` / `phase.scaffold` (and top-level `scaffold`) to create pre-structured files:
- `project.md`, `requirements.md`, `roadmap.md`, `state.md` — Core project files
@@ -266,13 +266,13 @@ Runtime hooks that integrate with the host AI agent:
See [`docs/INVENTORY.md`](INVENTORY.md#hooks-11-shipped) for the authoritative 11-hook roster.
### Command Routing Hub (`get-shit-done/bin/lib/command-routing-hub.cjs`)
### Command Routing Hub (`gsd-core/bin/lib/command-routing-hub.cjs`)
CJS command family routers dispatch through `CommandRoutingHub`. The hub owns the no-throw pure-result contract (`hub.dispatch()` catches internal exceptions and returns `{ ok: false, kind, ...typedPayload }`) and the closed runtime error taxonomy (`UnknownCommand`, `InvalidArgs`, `HandlerRefusal`, `HandlerFailure`). Router adapters remain thin CLI translators — they build the hub, call `dispatch`, then map the Result to `output()`/`error()` calls. The runtime is single-path (no dual-runtime mode selection). See `docs/adr/0174-retire-gsd-sdk-package-boundary.md`.
### CLI Tools (`get-shit-done/bin/`)
### CLI Tools (`gsd-core/bin/`)
Node.js CLI utility (`gsd-tools.cjs`) with domain modules split across `get-shit-done/bin/lib/` (see [`docs/INVENTORY.md`](INVENTORY.md#cli-modules-33-shipped) for the authoritative roster):
Node.js CLI utility (`gsd-tools.cjs`) with domain modules split across `gsd-core/bin/lib/` (see [`docs/INVENTORY.md`](INVENTORY.md#cli-modules-33-shipped) for the authoritative roster):
| Module | Responsibility |
@@ -479,7 +479,7 @@ UI-SPEC.md (per phase) ───────────────────
~/.claude/ # Claude Code (global install)
├── skills/gsd-*/SKILL.md # Global skills (authoritative roster: docs/INVENTORY.md)
├── commands/gsd/*.md # Local Claude installs use slash commands instead of global skills
├── get-shit-done/
├── gsd-core/
│ ├── bin/gsd-tools.cjs # CLI utility
│ ├── bin/lib/*.cjs # Domain modules (authoritative roster: docs/INVENTORY.md)
│ ├── workflows/*.md # Workflow definitions (authoritative roster: docs/INVENTORY.md)

View File

@@ -1,6 +1,6 @@
# GSD CLI Tools Reference
> Reference for the `gsd-tools` CLI (`get-shit-done/bin/gsd-tools.cjs`). For slash commands and user flows, see [Command Reference](COMMANDS.md). Return to [docs index](README.md).
> Reference for the `gsd-tools` CLI (`gsd-core/bin/gsd-tools.cjs`). For slash commands and user flows, see [Command Reference](COMMANDS.md). Return to [docs index](README.md).
---
@@ -11,8 +11,8 @@
| | |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Shipped path** | `get-shit-done/bin/gsd-tools.cjs` |
| **Implementation** | 20 domain modules under `get-shit-done/bin/lib/` (the directory is authoritative) |
| **Shipped path** | `gsd-core/bin/gsd-tools.cjs` |
| **Implementation** | 20 domain modules under `gsd-core/bin/lib/` (the directory is authoritative) |
| **Status** | Primary runtime command surface for orchestration, workflows, and automation. |
@@ -489,7 +489,7 @@ Slugs are validated against `[a-zA-Z0-9_-]+`; empty or path-containing slugs are
## Secret Handling
API keys configured via `/gsd-settings` (`brave_search`, `firecrawl`, `exa_search`) are written plaintext to `.planning/config.json` but are masked (`****<last-4>`) in every `config-set` / `config-get` output, confirmation table, and interactive prompt. See `get-shit-done/bin/lib/secrets.cjs` for the masking implementation. The `config.json` file itself is the security boundary — protect it with filesystem permissions and keep it out of git (`.planning/` is gitignored by default).
API keys configured via `/gsd-settings` (`brave_search`, `firecrawl`, `exa_search`) are written plaintext to `.planning/config.json` but are masked (`****<last-4>`) in every `config-set` / `config-get` output, confirmation table, and interactive prompt. See `gsd-core/bin/lib/secrets.cjs` for the masking implementation. The `config.json` file itself is the security boundary — protect it with filesystem permissions and keep it out of git (`.planning/` is gitignored by default).
---

View File

@@ -594,7 +594,7 @@ Show GSD commands at the tier you ask for. Default fits one screen; `--full` is
/gsd-help --brief <topic> # Compact scoped lookup — signature + one-line summary
```
See `get-shit-done/workflows/help/modes/topic.md` for the full alias table. Unknown topics print the recognized list.
See `gsd-core/workflows/help/modes/topic.md` for the full alias table. Unknown topics print the recognized list.
---

Some files were not shown because too many files have changed in this diff Show More