@opengsd/gsd-core 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja-JP.md +46 -791
- package/README.ko-KR.md +44 -780
- package/README.md +42 -218
- package/README.pt-BR.md +47 -414
- package/README.zh-CN.md +46 -763
- package/agents/gsd-ai-researcher.md +2 -2
- package/agents/gsd-debug-session-manager.md +1 -1
- package/agents/gsd-debugger.md +8 -8
- package/agents/gsd-doc-writer.md +7 -6
- package/agents/gsd-domain-researcher.md +15 -2
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-eval-planner.md +2 -2
- package/agents/gsd-executor.md +21 -8
- package/agents/gsd-framework-selector.md +1 -1
- package/agents/gsd-intel-updater.md +4 -4
- package/agents/gsd-phase-researcher.md +19 -6
- package/agents/gsd-plan-checker.md +3 -3
- package/agents/gsd-planner.md +36 -23
- package/agents/gsd-project-researcher.md +13 -0
- package/agents/gsd-research-synthesizer.md +6 -2
- package/agents/gsd-roadmapper.md +6 -6
- package/agents/gsd-ui-researcher.md +16 -3
- package/agents/gsd-user-profiler.md +2 -2
- package/agents/gsd-verifier.md +8 -8
- package/assets/gsd-logo-2000-transparent.png +0 -0
- package/assets/gsd-logo-2000-transparent.svg +17 -0
- package/assets/gsd-logo-2000.png +0 -0
- package/assets/gsd-logo-2000.svg +21 -0
- package/assets/terminal.svg +68 -0
- package/bin/install.js +255 -103
- package/commands/gsd/add-tests.md +1 -1
- package/commands/gsd/ai-integration-phase.md +3 -3
- package/commands/gsd/audit-fix.md +1 -1
- package/commands/gsd/audit-milestone.md +1 -1
- package/commands/gsd/audit-uat.md +1 -1
- package/commands/gsd/autonomous.md +2 -2
- package/commands/gsd/capture.md +6 -6
- package/commands/gsd/cleanup.md +1 -1
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/complete-milestone.md +2 -2
- package/commands/gsd/config.md +3 -3
- package/commands/gsd/debug.md +1 -1
- package/commands/gsd/discuss-phase.md +5 -4
- package/commands/gsd/docs-update.md +1 -1
- package/commands/gsd/eval-review.md +2 -2
- package/commands/gsd/execute-phase.md +2 -2
- package/commands/gsd/explore.md +1 -1
- package/commands/gsd/extract-learnings.md +2 -2
- package/commands/gsd/fast.md +1 -1
- package/commands/gsd/forensics.md +1 -1
- package/commands/gsd/graphify.md +9 -9
- package/commands/gsd/health.md +1 -1
- package/commands/gsd/help.md +2 -2
- package/commands/gsd/import.md +5 -5
- package/commands/gsd/inbox.md +1 -1
- package/commands/gsd/ingest-docs.md +4 -4
- package/commands/gsd/manager.md +3 -3
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/milestone-summary.md +1 -1
- package/commands/gsd/mvp-phase.md +4 -4
- package/commands/gsd/new-milestone.md +5 -5
- package/commands/gsd/new-project.md +5 -5
- package/commands/gsd/pause-work.md +2 -2
- package/commands/gsd/phase.md +4 -4
- package/commands/gsd/plan-phase.md +2 -2
- package/commands/gsd/plan-review-convergence.md +4 -4
- package/commands/gsd/pr-branch.md +1 -1
- package/commands/gsd/profile-user.md +2 -2
- package/commands/gsd/progress.md +4 -4
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/resume-work.md +1 -1
- package/commands/gsd/review.md +3 -2
- package/commands/gsd/secure-phase.md +1 -1
- package/commands/gsd/settings.md +1 -1
- package/commands/gsd/ship.md +2 -2
- package/commands/gsd/sketch.md +7 -7
- package/commands/gsd/spec-phase.md +2 -2
- package/commands/gsd/spike.md +3 -3
- package/commands/gsd/stats.md +1 -1
- package/commands/gsd/surface.md +4 -4
- package/commands/gsd/thread.md +1 -1
- package/commands/gsd/ui-phase.md +2 -2
- package/commands/gsd/ui-review.md +2 -2
- package/commands/gsd/ultraplan-phase.md +2 -2
- package/commands/gsd/undo.md +3 -3
- package/commands/gsd/update.md +3 -3
- package/commands/gsd/validate-phase.md +1 -1
- package/commands/gsd/verify-work.md +2 -2
- package/commands/gsd/workspace.md +4 -4
- package/{get-shit-done → gsd-core}/bin/check-latest-version.cjs +1 -1
- package/{get-shit-done → gsd-core}/bin/gsd-tools.cjs +50 -4
- package/gsd-core/bin/lib/active-workstream-store.cjs +291 -0
- package/gsd-core/bin/lib/adr-parser.cjs +399 -0
- package/gsd-core/bin/lib/agent-command-router.cjs +68 -0
- package/gsd-core/bin/lib/artifacts.cjs +51 -0
- package/gsd-core/bin/lib/audit.cjs +743 -0
- package/gsd-core/bin/lib/check-command-router.cjs +342 -0
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
- package/gsd-core/bin/lib/clock.cjs +95 -0
- package/gsd-core/bin/lib/clusters.cjs +128 -0
- package/gsd-core/bin/lib/code-review-flags.cjs +59 -0
- package/gsd-core/bin/lib/command-aliases.cjs +809 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +55 -0
- package/gsd-core/bin/lib/command-routing-hub.cjs +300 -0
- package/gsd-core/bin/lib/commands.cjs +1202 -0
- package/gsd-core/bin/lib/config-schema.cjs +29 -0
- package/gsd-core/bin/lib/config-types.cjs +19 -0
- package/gsd-core/bin/lib/config.cjs +714 -0
- package/{get-shit-done → gsd-core}/bin/lib/configuration.cjs +76 -85
- package/gsd-core/bin/lib/context-utilization.cjs +48 -0
- package/gsd-core/bin/lib/core.cjs +2007 -0
- package/{get-shit-done → gsd-core}/bin/lib/decisions.cjs +9 -7
- package/gsd-core/bin/lib/docs.cjs +252 -0
- package/gsd-core/bin/lib/drift.cjs +364 -0
- package/gsd-core/bin/lib/fallow-runner.cjs +115 -0
- package/gsd-core/bin/lib/frontmatter.cjs +442 -0
- package/gsd-core/bin/lib/gap-checker.cjs +257 -0
- package/gsd-core/bin/lib/graphify.cjs +496 -0
- package/gsd-core/bin/lib/gsd2-import.cjs +456 -0
- package/gsd-core/bin/lib/init-command-router.cjs +62 -0
- package/gsd-core/bin/lib/init.cjs +1799 -0
- package/gsd-core/bin/lib/install-profiles.cjs +526 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
- package/gsd-core/bin/lib/installer-migration-report.cjs +347 -0
- package/gsd-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +218 -0
- package/gsd-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
- package/gsd-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
- package/gsd-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +784 -0
- package/gsd-core/bin/lib/intel.cjs +607 -0
- package/gsd-core/bin/lib/learnings.cjs +270 -0
- package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
- package/gsd-core/bin/lib/milestone.cjs +373 -0
- package/gsd-core/bin/lib/model-catalog.cjs +154 -0
- package/gsd-core/bin/lib/model-profiles.cjs +24 -0
- package/gsd-core/bin/lib/observability/event.cjs +51 -0
- package/gsd-core/bin/lib/observability/logger.cjs +146 -0
- package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
- package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
- package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
- package/gsd-core/bin/lib/phase.cjs +1307 -0
- package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
- package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
- package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
- package/gsd-core/bin/lib/profile-output.cjs +1120 -0
- package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
- package/gsd-core/bin/lib/project-root.cjs +119 -0
- package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
- package/gsd-core/bin/lib/roadmap.cjs +600 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
- package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
- package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
- package/gsd-core/bin/lib/secrets.cjs +34 -0
- package/gsd-core/bin/lib/security.cjs +407 -0
- package/gsd-core/bin/lib/semver-compare.cjs +42 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +524 -0
- package/gsd-core/bin/lib/state-command-router.cjs +160 -0
- package/{get-shit-done → gsd-core}/bin/lib/state-document.cjs +78 -82
- package/gsd-core/bin/lib/state.cjs +2010 -0
- package/gsd-core/bin/lib/surface.cjs +406 -0
- package/gsd-core/bin/lib/task-command-router.cjs +85 -0
- package/gsd-core/bin/lib/template.cjs +237 -0
- package/gsd-core/bin/lib/uat.cjs +297 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +98 -0
- package/gsd-core/bin/lib/update-context.cjs +218 -0
- package/gsd-core/bin/lib/validate-command-router.cjs +91 -0
- package/gsd-core/bin/lib/validate.cjs +112 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
- package/gsd-core/bin/lib/verify.cjs +1451 -0
- package/{get-shit-done → gsd-core}/bin/lib/workstream-inventory-builder.cjs +19 -12
- package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
- package/{get-shit-done → gsd-core}/bin/lib/workstream-name-policy.cjs +28 -31
- package/gsd-core/bin/lib/workstream.cjs +380 -0
- package/gsd-core/bin/lib/worktree-safety.cjs +912 -0
- package/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +1 -0
- package/{get-shit-done → gsd-core}/bin/shared/config-schema.manifest.json +17 -1
- package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +27 -0
- package/{get-shit-done → gsd-core}/references/artifact-types.md +1 -1
- package/{get-shit-done → gsd-core}/references/checkpoints.md +1 -1
- package/{get-shit-done → gsd-core}/references/few-shot-examples/plan-checker.md +2 -2
- package/{get-shit-done → gsd-core}/references/few-shot-examples/verifier.md +12 -12
- package/{get-shit-done → gsd-core}/references/model-profile-resolution.md +1 -1
- package/{get-shit-done → gsd-core}/references/mvp-concepts.md +1 -1
- package/{get-shit-done → gsd-core}/references/planner-graphify-auto-update.md +2 -2
- package/{get-shit-done → gsd-core}/references/planner-human-verify-mode.md +1 -1
- package/{get-shit-done → gsd-core}/references/planner-mvp-mode.md +1 -1
- package/{get-shit-done → gsd-core}/references/ui-brand.md +4 -2
- package/{get-shit-done → gsd-core}/references/verification-patterns.md +1 -1
- package/gsd-core/references/worktree-branch-check.md +38 -0
- package/{get-shit-done → gsd-core}/references/worktree-path-safety.md +4 -26
- package/{get-shit-done → gsd-core}/templates/README.md +2 -2
- package/{get-shit-done → gsd-core}/templates/codebase/structure.md +10 -10
- package/{get-shit-done → gsd-core}/templates/copilot-instructions.md +1 -1
- package/{get-shit-done → gsd-core}/templates/phase-prompt.md +10 -10
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
- package/{get-shit-done → gsd-core}/workflows/add-backlog.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/add-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/add-tests.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/add-todo.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/ai-integration-phase.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/audit-fix.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/autonomous.md +10 -8
- package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/cleanup.md +44 -4
- package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/code-review.md +6 -4
- package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/debug.md +7 -2
- package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +6 -2
- package/{get-shit-done → gsd-core}/workflows/discovery-phase.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/advisor.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/auto.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/chain.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/power.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/discuss-phase-assumptions.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/discuss-phase.md +6 -6
- package/{get-shit-done → gsd-core}/workflows/do.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/docs-update.md +19 -5
- package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/eval-review.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +16 -3
- package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/post-merge-gate.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/execute-phase.md +89 -57
- package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
- package/{get-shit-done → gsd-core}/workflows/explore.md +5 -3
- package/{get-shit-done → gsd-core}/workflows/extract-learnings.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/forensics.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/graduation.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/health.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/help/modes/default.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/help/modes/full.md +6 -6
- package/{get-shit-done → gsd-core}/workflows/import.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/insert-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/list-workspaces.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/manager.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/map-codebase.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/milestone-summary.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/mvp-phase.md +7 -7
- package/{get-shit-done → gsd-core}/workflows/new-milestone.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/new-project.md +8 -8
- package/{get-shit-done → gsd-core}/workflows/new-workspace.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/next.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/pause-work.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/plan-milestone-gaps.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/plan-phase.md +29 -28
- package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +10 -10
- package/{get-shit-done → gsd-core}/workflows/plant-seed.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/profile-user.md +11 -11
- package/{get-shit-done → gsd-core}/workflows/progress.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/quick.md +7 -29
- package/{get-shit-done → gsd-core}/workflows/reapply-patches.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/remove-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/remove-workspace.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/resume-project.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/review.md +110 -2
- package/{get-shit-done → gsd-core}/workflows/scan.md +3 -1
- package/{get-shit-done → gsd-core}/workflows/secure-phase.md +5 -3
- package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +196 -6
- package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/settings.md +16 -2
- package/{get-shit-done → gsd-core}/workflows/ship.md +56 -4
- package/{get-shit-done → gsd-core}/workflows/sketch-wrap-up.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/sketch.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/spec-phase.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/spike-wrap-up.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/spike.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/stats.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/sync-skills.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/thread.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/transition.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/ui-phase.md +5 -5
- package/{get-shit-done → gsd-core}/workflows/ui-review.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/ultraplan-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/undo.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/update.md +41 -16
- package/{get-shit-done → gsd-core}/workflows/validate-phase.md +5 -3
- package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/verify-work.md +7 -7
- package/hooks/dist/gsd-check-update-worker.js +16 -3
- package/hooks/dist/gsd-check-update.js +7 -5
- package/hooks/dist/gsd-context-monitor.js +2 -2
- package/hooks/dist/gsd-statusline.js +39 -21
- package/hooks/dist/gsd-update-banner.js +6 -2
- package/hooks/dist/gsd-worktree-path-guard.js +169 -0
- package/hooks/dist/managed-hooks-registry.cjs +35 -0
- package/hooks/gsd-check-update-worker.js +16 -3
- package/hooks/gsd-check-update.js +7 -5
- package/hooks/gsd-context-monitor.js +2 -2
- package/hooks/gsd-statusline.js +39 -21
- package/hooks/gsd-update-banner.js +6 -2
- package/hooks/gsd-worktree-path-guard.js +169 -0
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +17 -11
- package/scripts/affected-tests-lib.cjs +1 -1
- package/scripts/base64-scan.sh +12 -0
- package/scripts/build-hooks.js +5 -1
- package/scripts/changeset/cli.cjs +2 -2
- package/scripts/changeset/github-release-notes.cjs +1 -1
- package/scripts/changeset/lint.cjs +1 -1
- package/scripts/check-alias-drift.cjs +8 -8
- package/scripts/check-env.cjs +5 -1
- package/scripts/ci-test-scope.cjs +34 -9
- package/scripts/command-contract-helpers.cjs +1 -1
- package/scripts/fix-slash-commands.cjs +5 -5
- package/scripts/gen-inventory-manifest.cjs +3 -3
- package/scripts/generate-package-identity.cjs +28 -7
- package/scripts/lib/allowlist-ratchet.cjs +136 -0
- package/scripts/lint-command-contract.cjs +1 -1
- package/scripts/lint-legacy-dir-name.cjs +156 -0
- package/scripts/lint-package-identity-drift.cjs +8 -8
- package/scripts/lint-pr-check-project-dir.cjs +0 -1
- package/scripts/lint-shell-command-projection-drift.cjs +1 -1
- package/scripts/lint-skill-deps.cjs +1 -1
- package/scripts/lint-test-file-count.allowlist.json +129 -32
- package/scripts/lint-test-file-count.cjs +85 -30
- package/scripts/mutation-matrix.cjs +219 -0
- package/scripts/prompt-injection-scan.sh +5 -1
- package/scripts/release-notes/format-github-release-notes.cjs +256 -0
- package/scripts/release-tarball-smoke.cjs +9 -9
- package/scripts/run-tests.cjs +34 -2
- package/scripts/strip-prose-atrefs.cjs +2 -2
- package/scripts/sync-runtime-launcher.cjs +2 -2
- package/scripts/verify-npm-publish.cjs +252 -0
- package/get-shit-done/bin/lib/active-workstream-store.cjs +0 -302
- package/get-shit-done/bin/lib/adr-parser.cjs +0 -394
- package/get-shit-done/bin/lib/agent-command-router.cjs +0 -65
- package/get-shit-done/bin/lib/artifacts.cjs +0 -53
- package/get-shit-done/bin/lib/audit.cjs +0 -755
- package/get-shit-done/bin/lib/check-command-router.cjs +0 -333
- package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +0 -118
- package/get-shit-done/bin/lib/clock.cjs +0 -96
- package/get-shit-done/bin/lib/clusters.cjs +0 -135
- package/get-shit-done/bin/lib/code-review-flags.cjs +0 -74
- package/get-shit-done/bin/lib/command-aliases.cjs +0 -815
- package/get-shit-done/bin/lib/command-arg-projection.cjs +0 -62
- package/get-shit-done/bin/lib/command-routing-hub.cjs +0 -388
- package/get-shit-done/bin/lib/commands.cjs +0 -1188
- package/get-shit-done/bin/lib/config-schema.cjs +0 -31
- package/get-shit-done/bin/lib/config.cjs +0 -728
- package/get-shit-done/bin/lib/context-utilization.cjs +0 -47
- package/get-shit-done/bin/lib/core.cjs +0 -2121
- package/get-shit-done/bin/lib/docs.cjs +0 -270
- package/get-shit-done/bin/lib/drift.cjs +0 -388
- package/get-shit-done/bin/lib/fallow-runner.cjs +0 -109
- package/get-shit-done/bin/lib/frontmatter.cjs +0 -389
- package/get-shit-done/bin/lib/gap-checker.cjs +0 -205
- package/get-shit-done/bin/lib/graphify.cjs +0 -592
- package/get-shit-done/bin/lib/gsd2-import.cjs +0 -514
- package/get-shit-done/bin/lib/init-command-router.cjs +0 -58
- package/get-shit-done/bin/lib/init.cjs +0 -2112
- package/get-shit-done/bin/lib/install-profiles.cjs +0 -603
- package/get-shit-done/bin/lib/installer-migration-authoring.cjs +0 -117
- package/get-shit-done/bin/lib/installer-migration-report.cjs +0 -354
- package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +0 -220
- package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +0 -41
- package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +0 -80
- package/get-shit-done/bin/lib/installer-migrations.cjs +0 -778
- package/get-shit-done/bin/lib/intel.cjs +0 -708
- package/get-shit-done/bin/lib/learnings.cjs +0 -421
- package/get-shit-done/bin/lib/milestone.cjs +0 -314
- package/get-shit-done/bin/lib/model-catalog.cjs +0 -212
- package/get-shit-done/bin/lib/model-profiles.cjs +0 -31
- package/get-shit-done/bin/lib/observability/event.cjs +0 -82
- package/get-shit-done/bin/lib/observability/logger.cjs +0 -174
- package/get-shit-done/bin/lib/phase-command-router.cjs +0 -191
- package/get-shit-done/bin/lib/phase-lifecycle.cjs +0 -80
- package/get-shit-done/bin/lib/phase.cjs +0 -1607
- package/get-shit-done/bin/lib/phases-command-router.cjs +0 -39
- package/get-shit-done/bin/lib/planning-workspace.cjs +0 -238
- package/get-shit-done/bin/lib/profile-output.cjs +0 -1141
- package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
- package/get-shit-done/bin/lib/project-root.cjs +0 -112
- package/get-shit-done/bin/lib/prompt-budget.cjs +0 -399
- package/get-shit-done/bin/lib/review-reviewer-selection.cjs +0 -125
- package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -28
- package/get-shit-done/bin/lib/roadmap.cjs +0 -650
- package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +0 -301
- package/get-shit-done/bin/lib/runtime-homes.cjs +0 -222
- package/get-shit-done/bin/lib/runtime-name-policy.cjs +0 -83
- package/get-shit-done/bin/lib/runtime-slash.cjs +0 -112
- package/get-shit-done/bin/lib/secrets.cjs +0 -32
- package/get-shit-done/bin/lib/security.cjs +0 -600
- package/get-shit-done/bin/lib/semver-compare.cjs +0 -35
- package/get-shit-done/bin/lib/shell-command-projection.cjs +0 -500
- package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
- package/get-shit-done/bin/lib/state.cjs +0 -2038
- package/get-shit-done/bin/lib/surface.cjs +0 -470
- package/get-shit-done/bin/lib/task-command-router.cjs +0 -81
- package/get-shit-done/bin/lib/template.cjs +0 -228
- package/get-shit-done/bin/lib/uat.cjs +0 -289
- package/get-shit-done/bin/lib/update-context.cjs +0 -209
- package/get-shit-done/bin/lib/validate-command-router.cjs +0 -83
- package/get-shit-done/bin/lib/validate.cjs +0 -92
- package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
- package/get-shit-done/bin/lib/verify.cjs +0 -1511
- package/get-shit-done/bin/lib/workstream-inventory.cjs +0 -146
- package/get-shit-done/bin/lib/workstream.cjs +0 -389
- package/get-shit-done/bin/lib/worktree-safety.cjs +0 -985
- package/get-shit-done/workflows/_runtime-launcher.snippet.sh +0 -1
- package/scripts/lint-no-source-grep-extras.cjs +0 -81
- package/scripts/lint-no-source-grep.cjs +0 -174
- package/scripts/lint-shared-module-handsync.cjs +0 -388
- package/scripts/shared-module-handsync-allowlist.json +0 -183
- /package/{get-shit-done → gsd-core}/bin/shared/runtime-aliases.manifest.json +0 -0
- /package/{get-shit-done → gsd-core}/bin/verify-reapply-patches.cjs +0 -0
- /package/{get-shit-done → gsd-core}/contexts/dev.md +0 -0
- /package/{get-shit-done → gsd-core}/contexts/research.md +0 -0
- /package/{get-shit-done → gsd-core}/contexts/review.md +0 -0
- /package/{get-shit-done → gsd-core}/references/agent-contracts.md +0 -0
- /package/{get-shit-done → gsd-core}/references/ai-evals.md +0 -0
- /package/{get-shit-done → gsd-core}/references/ai-frameworks.md +0 -0
- /package/{get-shit-done → gsd-core}/references/autonomous-smart-discuss.md +0 -0
- /package/{get-shit-done → gsd-core}/references/common-bug-patterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/context-budget.md +0 -0
- /package/{get-shit-done → gsd-core}/references/continuation-format.md +0 -0
- /package/{get-shit-done → gsd-core}/references/debugger-philosophy.md +0 -0
- /package/{get-shit-done → gsd-core}/references/decimal-phase-calculation.md +0 -0
- /package/{get-shit-done → gsd-core}/references/doc-conflict-engine.md +0 -0
- /package/{get-shit-done → gsd-core}/references/domain-probes.md +0 -0
- /package/{get-shit-done → gsd-core}/references/execute-mvp-tdd.md +0 -0
- /package/{get-shit-done → gsd-core}/references/executor-examples.md +0 -0
- /package/{get-shit-done → gsd-core}/references/gate-prompts.md +0 -0
- /package/{get-shit-done → gsd-core}/references/gates.md +0 -0
- /package/{get-shit-done → gsd-core}/references/git-integration.md +0 -0
- /package/{get-shit-done → gsd-core}/references/git-planning-commit.md +0 -0
- /package/{get-shit-done → gsd-core}/references/ios-scaffold.md +0 -0
- /package/{get-shit-done → gsd-core}/references/mandatory-initial-read.md +0 -0
- /package/{get-shit-done → gsd-core}/references/model-profiles.md +0 -0
- /package/{get-shit-done → gsd-core}/references/phase-argument-parsing.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-antipatterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-chunked.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-gap-closure.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-interface-context.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-reviews.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-revision.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planner-source-audit.md +0 -0
- /package/{get-shit-done → gsd-core}/references/planning-config.md +0 -0
- /package/{get-shit-done → gsd-core}/references/project-skills-discovery.md +0 -0
- /package/{get-shit-done → gsd-core}/references/questioning.md +0 -0
- /package/{get-shit-done → gsd-core}/references/revision-loop.md +0 -0
- /package/{get-shit-done → gsd-core}/references/scout-codebase.md +0 -0
- /package/{get-shit-done → gsd-core}/references/skeleton-template.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-interactivity.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-theme-system.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-tooling.md +0 -0
- /package/{get-shit-done → gsd-core}/references/sketch-variant-patterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/spidr-splitting.md +0 -0
- /package/{get-shit-done → gsd-core}/references/tdd.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-debug.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-execution.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-planning.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-research.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-models-verification.md +0 -0
- /package/{get-shit-done → gsd-core}/references/thinking-partner.md +0 -0
- /package/{get-shit-done → gsd-core}/references/universal-anti-patterns.md +0 -0
- /package/{get-shit-done → gsd-core}/references/user-profiling.md +0 -0
- /package/{get-shit-done → gsd-core}/references/user-story-template.md +0 -0
- /package/{get-shit-done → gsd-core}/references/verification-overrides.md +0 -0
- /package/{get-shit-done → gsd-core}/references/verify-mvp-mode.md +0 -0
- /package/{get-shit-done → gsd-core}/references/workstream-flag.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/AI-SPEC.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/DEBUG.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/SECURITY.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/UAT.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/UI-SPEC.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/VALIDATION.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/claude-md.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/architecture.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/concerns.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/conventions.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/integrations.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/stack.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/codebase/testing.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/config.json +0 -0
- /package/{get-shit-done → gsd-core}/templates/context.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/continue-here.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/debug-subagent-prompt.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/dev-preferences.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/discovery.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/discussion-log.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/milestone-archive.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/milestone.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/planner-subagent-prompt.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/project.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/requirements.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/ARCHITECTURE.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/FEATURES.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/PITFALLS.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/STACK.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research-project/SUMMARY.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/research.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/retrospective.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/roadmap.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/spec.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/state.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary-complex.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary-minimal.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary-standard.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/summary.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/user-profile.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/user-setup.md +0 -0
- /package/{get-shit-done → gsd-core}/templates/verification-report.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/analyze-dependencies.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/all.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/analyze.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/batch.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/default.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/modes/text.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/checkpoint.json +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/context.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase/templates/discussion-log.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/discuss-phase-power.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/per-plan-worktree-gate.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/fast.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/help/modes/brief.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/help/modes/topic.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/help.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/inbox.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/list-phase-assumptions.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/node-repair.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/note.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/pr-branch.md +0 -0
- /package/{get-shit-done → gsd-core}/workflows/session-report.md +0 -0
package/bin/install.js
CHANGED
|
@@ -16,7 +16,9 @@ const {
|
|
|
16
16
|
projectPersistentPathExportActions,
|
|
17
17
|
projectShellCommandText,
|
|
18
18
|
projectCodexHookTomlCommand,
|
|
19
|
-
|
|
19
|
+
shellHookOmitsBashRunner,
|
|
20
|
+
buildLocalShellHookCommand,
|
|
21
|
+
} = require('../gsd-core/bin/lib/shell-command-projection.cjs');
|
|
20
22
|
|
|
21
23
|
// Bidirectional GSD slash-command namespace transformer (#3583).
|
|
22
24
|
// Required at module scope so the command list can be computed once per install
|
|
@@ -28,7 +30,7 @@ const {
|
|
|
28
30
|
} = require(path.join(__dirname, '..', 'scripts', 'fix-slash-commands.cjs'));
|
|
29
31
|
const {
|
|
30
32
|
resolveAntigravityGlobalDir,
|
|
31
|
-
} = require('../
|
|
33
|
+
} = require('../gsd-core/bin/lib/runtime-homes.cjs');
|
|
32
34
|
|
|
33
35
|
/**
|
|
34
36
|
* Runtimes that register hyphen-form `name:` per #2808 AND copy agent bodies
|
|
@@ -73,7 +75,7 @@ const dim = '\x1b[2m';
|
|
|
73
75
|
const reset = '\x1b[0m';
|
|
74
76
|
|
|
75
77
|
// Codex config.toml constants
|
|
76
|
-
const GSD_CODEX_MARKER = '# GSD Agent Configuration \u2014 managed by
|
|
78
|
+
const GSD_CODEX_MARKER = '# GSD Agent Configuration \u2014 managed by gsd-core installer';
|
|
77
79
|
const GSD_CODEX_HOOKS_OWNERSHIP_PREFIX = '# GSD codex_hooks ownership: ';
|
|
78
80
|
// Codex's hook-enabling feature flag (issue #3566). Codex itself marks
|
|
79
81
|
// `codex_hooks` as a `legacy_key` in codex-rs/features/src/legacy.rs; the
|
|
@@ -90,7 +92,7 @@ function isCodexHooksFeatureKey(key) {
|
|
|
90
92
|
}
|
|
91
93
|
|
|
92
94
|
// Copilot instructions marker constants
|
|
93
|
-
const GSD_COPILOT_INSTRUCTIONS_MARKER = '<!-- GSD Configuration \u2014 managed by
|
|
95
|
+
const GSD_COPILOT_INSTRUCTIONS_MARKER = '<!-- GSD Configuration \u2014 managed by gsd-core installer -->';
|
|
94
96
|
const GSD_COPILOT_INSTRUCTIONS_CLOSE_MARKER = '<!-- /GSD Configuration -->';
|
|
95
97
|
|
|
96
98
|
// GSD-managed files under hooks/lib/ (helpers required by gsd-*.sh hooks).
|
|
@@ -134,11 +136,11 @@ const pkg = require('../package.json');
|
|
|
134
136
|
// #2517 — runtime-aware tier resolution shared with core.cjs.
|
|
135
137
|
// Hoisted to top with absolute __dirname-based paths so `gsd install codex` works
|
|
136
138
|
// when invoked via npm global install (cwd is the user's project, not the gsd repo
|
|
137
|
-
// root). Inline `require('../
|
|
139
|
+
// root). Inline `require('../gsd-core/...')` from inside install functions
|
|
138
140
|
// works only because Node resolves it relative to the install.js file regardless
|
|
139
141
|
// of cwd, but keeping the require at the top makes the dependency explicit and
|
|
140
142
|
// surfaces resolution failures at process start instead of at first install call.
|
|
141
|
-
const _gsdLibDir = path.join(__dirname, '..', '
|
|
143
|
+
const _gsdLibDir = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib');
|
|
142
144
|
const { MODEL_PROFILES: GSD_MODEL_PROFILES } = require(path.join(_gsdLibDir, 'model-profiles.cjs'));
|
|
143
145
|
const {
|
|
144
146
|
RUNTIME_PROFILE_MAP: GSD_RUNTIME_PROFILE_MAP,
|
|
@@ -161,7 +163,7 @@ function _getGsdEffortCatalog() {
|
|
|
161
163
|
const manifestPath = path.join(
|
|
162
164
|
__dirname,
|
|
163
165
|
'..',
|
|
164
|
-
'
|
|
166
|
+
'gsd-core',
|
|
165
167
|
'bin',
|
|
166
168
|
'shared',
|
|
167
169
|
'config-defaults.manifest.json'
|
|
@@ -225,6 +227,13 @@ const {
|
|
|
225
227
|
const {
|
|
226
228
|
resolveRuntimeArtifactLayout,
|
|
227
229
|
} = require(path.join(_gsdLibDir, 'runtime-artifact-layout.cjs'));
|
|
230
|
+
const {
|
|
231
|
+
planLegacyCleanup,
|
|
232
|
+
applyLegacyCleanup,
|
|
233
|
+
} = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'legacy-cleanup.cjs'));
|
|
234
|
+
const {
|
|
235
|
+
updateCacheFileName,
|
|
236
|
+
} = require(path.join(__dirname, '..', 'gsd-core', 'bin', 'lib', 'package-identity.cjs'));
|
|
228
237
|
|
|
229
238
|
// Parse args
|
|
230
239
|
const args = process.argv.slice(2);
|
|
@@ -251,6 +260,7 @@ const hasUninstall = args.includes('--uninstall') || args.includes('-u');
|
|
|
251
260
|
const hasSkillsRoot = args.includes('--skills-root');
|
|
252
261
|
const hasPortableHooks = args.includes('--portable-hooks') || process.env.GSD_PORTABLE_HOOKS === '1';
|
|
253
262
|
const hasMinimal = args.includes('--minimal') || args.includes('--core-only');
|
|
263
|
+
const hasDryRun = args.includes('--dry-run');
|
|
254
264
|
// --profile=<name> or --profile=<n1>,<n2> (composable); mutually exclusive with --minimal
|
|
255
265
|
const _profileArgRaw = (() => {
|
|
256
266
|
for (const arg of args) {
|
|
@@ -613,9 +623,10 @@ const banner = '\n' +
|
|
|
613
623
|
' ╚██████╔╝███████║██████╔╝\n' +
|
|
614
624
|
' ╚═════╝ ╚══════╝╚═════╝' + reset + '\n' +
|
|
615
625
|
'\n' +
|
|
616
|
-
'
|
|
626
|
+
' GSD Core ' + dim + 'v' + pkg.version + reset + '\n' +
|
|
627
|
+
' Git. Ship. Done.\n' +
|
|
617
628
|
' A meta-prompting, context engineering and spec-driven\n' +
|
|
618
|
-
' development
|
|
629
|
+
' development workflows for Claude Code, OpenCode, Gemini, Kilo, Codex, Copilot, Antigravity, Cursor, Windsurf, Augment, Trae, Qwen Code, Hermes Agent, Cline and CodeBuddy.\n';
|
|
619
630
|
|
|
620
631
|
// Pure seam: parse --config-dir / -c from an arbitrary args array.
|
|
621
632
|
// Returns the path string, '' for an empty equals-form value, or null when the
|
|
@@ -1216,7 +1227,7 @@ function buildHookCommand(configDir, hookName, opts) {
|
|
|
1216
1227
|
// Windows, so wrapping `.sh` hooks with an explicit `bash.exe` path can
|
|
1217
1228
|
// trigger `bash.exe: ... cannot execute binary file`. Emit only the quoted
|
|
1218
1229
|
// script path for Claude on Windows.
|
|
1219
|
-
if (platform
|
|
1230
|
+
if (shellHookOmitsBashRunner({ platform, runtime, isShellHook })) {
|
|
1220
1231
|
if (opts.portableHooks) {
|
|
1221
1232
|
const portableBaseDir = projectPortableHookBaseDir({
|
|
1222
1233
|
configDir,
|
|
@@ -2811,6 +2822,9 @@ function convertClaudeToCodexMarkdown(content) {
|
|
|
2811
2822
|
converted = converted.replace(/\$HOME\/\.claude\//g, '$HOME/.codex/');
|
|
2812
2823
|
converted = converted.replace(/~\/\.claude\//g, '~/.codex/');
|
|
2813
2824
|
converted = converted.replace(/\.\/\.claude\//g, './.codex/');
|
|
2825
|
+
// Bare ~/.claude without trailing slash (e.g. configDir = ~/.claude)
|
|
2826
|
+
converted = converted.replace(/\$HOME\/\.claude\b/g, '$HOME/.codex');
|
|
2827
|
+
converted = converted.replace(/~\/\.claude\b/g, '~/.codex');
|
|
2814
2828
|
// Bare/project-relative .claude/... references (#2639). Covers strings like
|
|
2815
2829
|
// "check `.claude/skills/`" where there is no ~/, $HOME/, or ./ anchor.
|
|
2816
2830
|
// Negative lookbehind prevents double-replacing already-anchored forms and
|
|
@@ -5220,14 +5234,14 @@ function installCodexConfig(targetDir, agentsSrc) {
|
|
|
5220
5234
|
const agents = [];
|
|
5221
5235
|
|
|
5222
5236
|
// Compute the Codex GSD install path (absolute, so subagents with empty $HOME work — #820)
|
|
5223
|
-
const codexGsdPath = `${path.resolve(targetDir, '
|
|
5237
|
+
const codexGsdPath = `${path.resolve(targetDir, 'gsd-core').replace(/\\/g, '/')}/`;
|
|
5224
5238
|
|
|
5225
5239
|
for (const file of agentEntries) {
|
|
5226
5240
|
let content = fs.readFileSync(path.join(agentsSrc, file), 'utf8');
|
|
5227
|
-
// Replace full .claude/
|
|
5241
|
+
// Replace full .claude/gsd-core prefix so path resolves to the Codex
|
|
5228
5242
|
// GSD install before generic .claude → .codex conversion rewrites it.
|
|
5229
|
-
content = content.replace(/~\/\.claude\/
|
|
5230
|
-
content = content.replace(/\$HOME\/\.claude\/
|
|
5243
|
+
content = content.replace(/~\/\.claude\/gsd-core\//g, codexGsdPath);
|
|
5244
|
+
content = content.replace(/\$HOME\/\.claude\/gsd-core\//g, codexGsdPath);
|
|
5231
5245
|
// Route TOML emit through the same full Claude→Codex conversion pipeline
|
|
5232
5246
|
// used on the `.md` emit path (#2639). Covers: slash-command rewrites,
|
|
5233
5247
|
// $ARGUMENTS → {{GSD_ARGS}}, /clear removal, anchored and bare .claude/
|
|
@@ -6001,10 +6015,10 @@ function writeHermesCategoryDescription(categoryDir) {
|
|
|
6001
6015
|
'---',
|
|
6002
6016
|
'name: gsd',
|
|
6003
6017
|
`version: ${pkg.version}`,
|
|
6004
|
-
'description:
|
|
6018
|
+
'description: GSD Core — Git. Ship. Done. Disciplined planning, execution, and shipping workflows. Use any gsd-* skill in this category to drive a project through new-project → discuss-phase → plan-phase → execute-phase → ship.',
|
|
6005
6019
|
'---',
|
|
6006
6020
|
'',
|
|
6007
|
-
'#
|
|
6021
|
+
'# GSD Core',
|
|
6008
6022
|
'',
|
|
6009
6023
|
'GSD is a structured development workflow. Skills in this category cover',
|
|
6010
6024
|
'project initialization, phase planning, execution, code review, and shipping.',
|
|
@@ -6026,7 +6040,7 @@ function writeHermesCategoryDescription(categoryDir) {
|
|
|
6026
6040
|
*/
|
|
6027
6041
|
|
|
6028
6042
|
/**
|
|
6029
|
-
* Single source of truth for user-owned artifacts inside
|
|
6043
|
+
* Single source of truth for user-owned artifacts inside gsd-core/.
|
|
6030
6044
|
*
|
|
6031
6045
|
* These files are created/refreshed by user-facing workflows (e.g.
|
|
6032
6046
|
* /gsd-profile-user) and must be preserved across reinstalls. Critically, they
|
|
@@ -6039,7 +6053,7 @@ function writeHermesCategoryDescription(categoryDir) {
|
|
|
6039
6053
|
* both. Both preserveUserArtifacts call sites and writeManifest must agree on
|
|
6040
6054
|
* this list, which is why it lives here as a single constant.
|
|
6041
6055
|
*
|
|
6042
|
-
* Paths are relative to the
|
|
6056
|
+
* Paths are relative to the gsd-core/ directory.
|
|
6043
6057
|
*/
|
|
6044
6058
|
const USER_OWNED_ARTIFACTS = ['USER-PROFILE.md'];
|
|
6045
6059
|
|
|
@@ -7172,8 +7186,8 @@ function uninstall(isGlobal, runtime = 'claude') {
|
|
|
7172
7186
|
}
|
|
7173
7187
|
}
|
|
7174
7188
|
|
|
7175
|
-
// 2. Remove
|
|
7176
|
-
const gsdDir = path.join(targetDir, '
|
|
7189
|
+
// 2. Remove gsd-core directory
|
|
7190
|
+
const gsdDir = path.join(targetDir, 'gsd-core');
|
|
7177
7191
|
if (fs.existsSync(gsdDir)) {
|
|
7178
7192
|
// Preserve user-generated files before wipe (#1423)
|
|
7179
7193
|
const userProfilePath = path.join(gsdDir, 'USER-PROFILE.md');
|
|
@@ -7181,14 +7195,14 @@ function uninstall(isGlobal, runtime = 'claude') {
|
|
|
7181
7195
|
|
|
7182
7196
|
fs.rmSync(gsdDir, { recursive: true });
|
|
7183
7197
|
removedCount++;
|
|
7184
|
-
console.log(` ${green}✓${reset} Removed
|
|
7198
|
+
console.log(` ${green}✓${reset} Removed gsd-core/`);
|
|
7185
7199
|
|
|
7186
7200
|
// Restore user-generated files
|
|
7187
7201
|
if (preservedProfile) {
|
|
7188
7202
|
try {
|
|
7189
7203
|
fs.mkdirSync(gsdDir, { recursive: true });
|
|
7190
7204
|
fs.writeFileSync(userProfilePath, preservedProfile);
|
|
7191
|
-
console.log(` ${green}✓${reset} Preserved
|
|
7205
|
+
console.log(` ${green}✓${reset} Preserved gsd-core/USER-PROFILE.md`);
|
|
7192
7206
|
} catch (err) {
|
|
7193
7207
|
console.error(` ${red}✗${reset} Failed to restore USER-PROFILE.md: ${err.message}`);
|
|
7194
7208
|
}
|
|
@@ -7345,7 +7359,7 @@ function uninstall(isGlobal, runtime = 'claude') {
|
|
|
7345
7359
|
if (config.permission[permType]) {
|
|
7346
7360
|
const keys = Object.keys(config.permission[permType]);
|
|
7347
7361
|
for (const key of keys) {
|
|
7348
|
-
if (key.includes('
|
|
7362
|
+
if (key.includes('gsd-core')) {
|
|
7349
7363
|
delete config.permission[permType][key];
|
|
7350
7364
|
modified = true;
|
|
7351
7365
|
}
|
|
@@ -7386,7 +7400,7 @@ function uninstall(isGlobal, runtime = 'claude') {
|
|
|
7386
7400
|
if (config.permission[permType]) {
|
|
7387
7401
|
const keys = Object.keys(config.permission[permType]);
|
|
7388
7402
|
for (const key of keys) {
|
|
7389
|
-
if (key.includes('
|
|
7403
|
+
if (key.includes('gsd-core')) {
|
|
7390
7404
|
delete config.permission[permType][key];
|
|
7391
7405
|
modified = true;
|
|
7392
7406
|
}
|
|
@@ -7495,7 +7509,7 @@ function parseJsonc(content) {
|
|
|
7495
7509
|
|
|
7496
7510
|
/**
|
|
7497
7511
|
* Configure OpenCode permissions to allow reading GSD reference docs
|
|
7498
|
-
* This prevents permission prompts when GSD accesses the
|
|
7512
|
+
* This prevents permission prompts when GSD accesses the gsd-core directory
|
|
7499
7513
|
* @param {boolean} isGlobal - Whether this is a global or local install
|
|
7500
7514
|
* @param {string|null} configDir - Resolved config directory when already known
|
|
7501
7515
|
*/
|
|
@@ -7541,8 +7555,8 @@ function configureOpencodePermissions(isGlobal = true, configDir = null) {
|
|
|
7541
7555
|
// Use ~ shorthand if it's in the default location, otherwise use full path
|
|
7542
7556
|
const defaultConfigDir = path.join(os.homedir(), '.config', 'opencode');
|
|
7543
7557
|
const gsdPath = opencodeConfigDir === defaultConfigDir
|
|
7544
|
-
? '~/.config/opencode/
|
|
7545
|
-
: `${opencodeConfigDir.replace(/\\/g, '/')}/
|
|
7558
|
+
? '~/.config/opencode/gsd-core/*'
|
|
7559
|
+
: `${opencodeConfigDir.replace(/\\/g, '/')}/gsd-core/*`;
|
|
7546
7560
|
|
|
7547
7561
|
let modified = false;
|
|
7548
7562
|
|
|
@@ -7575,7 +7589,7 @@ function configureOpencodePermissions(isGlobal = true, configDir = null) {
|
|
|
7575
7589
|
|
|
7576
7590
|
/**
|
|
7577
7591
|
* Configure Kilo permissions to allow reading GSD reference docs
|
|
7578
|
-
* This prevents permission prompts when GSD accesses the
|
|
7592
|
+
* This prevents permission prompts when GSD accesses the gsd-core directory
|
|
7579
7593
|
* @param {boolean} isGlobal - Whether this is a global or local install
|
|
7580
7594
|
* @param {string|null} configDir - Resolved config directory when already known
|
|
7581
7595
|
*/
|
|
@@ -7615,8 +7629,8 @@ function configureKiloPermissions(isGlobal = true, configDir = null) {
|
|
|
7615
7629
|
// Use ~ shorthand if it's in the default location, otherwise use full path
|
|
7616
7630
|
const defaultConfigDir = path.join(os.homedir(), '.config', 'kilo');
|
|
7617
7631
|
const gsdPath = kiloConfigDir === defaultConfigDir
|
|
7618
|
-
? '~/.config/kilo/
|
|
7619
|
-
: `${kiloConfigDir.replace(/\\/g, '/')}/
|
|
7632
|
+
? '~/.config/kilo/gsd-core/*'
|
|
7633
|
+
: `${kiloConfigDir.replace(/\\/g, '/')}/gsd-core/*`;
|
|
7620
7634
|
|
|
7621
7635
|
let modified = false;
|
|
7622
7636
|
|
|
@@ -7787,7 +7801,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
|
|
|
7787
7801
|
const isTrae = runtime === 'trae';
|
|
7788
7802
|
const isCline = runtime === 'cline';
|
|
7789
7803
|
const isHermes = runtime === 'hermes';
|
|
7790
|
-
const gsdDir = path.join(configDir, '
|
|
7804
|
+
const gsdDir = path.join(configDir, 'gsd-core');
|
|
7791
7805
|
const commandsDir = path.join(configDir, 'commands', 'gsd');
|
|
7792
7806
|
const opencodeCommandDir = path.join(configDir, 'command');
|
|
7793
7807
|
// Hermes nests GSD skills under skills/gsd/ as a single category (#2841).
|
|
@@ -7812,7 +7826,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
|
|
|
7812
7826
|
// as a "local patch" (bug #2771). Single source of truth:
|
|
7813
7827
|
// USER_OWNED_ARTIFACTS at top of file.
|
|
7814
7828
|
if (USER_OWNED_ARTIFACTS.includes(rel)) continue;
|
|
7815
|
-
manifest.files['
|
|
7829
|
+
manifest.files['gsd-core/' + rel] = hash;
|
|
7816
7830
|
}
|
|
7817
7831
|
// Record commands/gsd/ for any runtime that emits it (Gemini globally,
|
|
7818
7832
|
// Claude Code locally — see #2923). Manifest must reflect everything on
|
|
@@ -7852,7 +7866,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
|
|
|
7852
7866
|
}
|
|
7853
7867
|
if (fs.existsSync(agentsDir)) {
|
|
7854
7868
|
for (const file of fs.readdirSync(agentsDir)) {
|
|
7855
|
-
if (file.startsWith('gsd-') && file.endsWith('.md')) {
|
|
7869
|
+
if (file.startsWith('gsd-') && (file.endsWith('.md') || file.endsWith('.toml'))) {
|
|
7856
7870
|
manifest.files['agents/' + file] = fileHash(path.join(agentsDir, file));
|
|
7857
7871
|
}
|
|
7858
7872
|
}
|
|
@@ -7917,7 +7931,7 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
|
|
|
7917
7931
|
function populatePristineDir({ packageSrc, pristineDir, modified, runtime, pathPrefix, isGlobal }) {
|
|
7918
7932
|
if (!modified || modified.length === 0) return 0;
|
|
7919
7933
|
// Modified paths come from manifest.files which can live under several
|
|
7920
|
-
// install roots:
|
|
7934
|
+
// install roots: gsd-core/, commands/gsd/, command/, skills/, agents/,
|
|
7921
7935
|
// hooks/, plus runtime-specific root files (#3004 CR). Stage every
|
|
7922
7936
|
// top-level dir that actually contains a modified path; root-level files
|
|
7923
7937
|
// are copied directly without the transform pipeline (they don't need
|
|
@@ -7999,7 +8013,7 @@ function saveLocalPatches(configDir, pristineCtx) {
|
|
|
7999
8013
|
// that were incorrectly recorded so refreshes don't surface false patches warnings.
|
|
8000
8014
|
if (manifest.files) {
|
|
8001
8015
|
for (const artifact of USER_OWNED_ARTIFACTS) {
|
|
8002
|
-
delete manifest.files[`
|
|
8016
|
+
delete manifest.files[`gsd-core/${artifact}`];
|
|
8003
8017
|
}
|
|
8004
8018
|
}
|
|
8005
8019
|
|
|
@@ -8273,7 +8287,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8273
8287
|
: targetDir.replace(process.cwd(), '.');
|
|
8274
8288
|
|
|
8275
8289
|
// Path prefix for file references in markdown content (e.g. gsd-tools.cjs).
|
|
8276
|
-
// Replaces $HOME/.claude/ or ~/.claude/ so the result is <pathPrefix>
|
|
8290
|
+
// Replaces $HOME/.claude/ or ~/.claude/ so the result is <pathPrefix>gsd-core/bin/...
|
|
8277
8291
|
// For global installs: use $HOME/ so paths expand correctly inside double-quoted
|
|
8278
8292
|
// shell commands (~ does NOT expand inside double quotes, causing MODULE_NOT_FOUND).
|
|
8279
8293
|
// For local installs: use resolved absolute path (may be outside $HOME).
|
|
@@ -8400,7 +8414,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8400
8414
|
// codexPreInstallAgentFiles — Set of gsd-*.{md,toml} filenames in agents/
|
|
8401
8415
|
// codexPreInstallAgentContents — Map<filename, Buffer> of pre-existing agent
|
|
8402
8416
|
// file bytes, enabling full content restore (not just deletion) on rollback.
|
|
8403
|
-
// codexPreInstallVersionBytes — Buffer (or null) of
|
|
8417
|
+
// codexPreInstallVersionBytes — Buffer (or null) of gsd-core/VERSION
|
|
8404
8418
|
//
|
|
8405
8419
|
// These are referenced by restoreCodexSnapshot(), defined below inside the
|
|
8406
8420
|
// config block. Defining the variables here (outer scope) makes them
|
|
@@ -8452,7 +8466,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8452
8466
|
}
|
|
8453
8467
|
}
|
|
8454
8468
|
}
|
|
8455
|
-
const _preVersionPath = path.join(targetDir, '
|
|
8469
|
+
const _preVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
|
|
8456
8470
|
if (fs.existsSync(_preVersionPath)) {
|
|
8457
8471
|
try { codexPreInstallVersionBytes = fs.readFileSync(_preVersionPath); } catch (_) { /* best-effort */ }
|
|
8458
8472
|
}
|
|
@@ -8464,7 +8478,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8464
8478
|
// must also trigger rollback so the caller is never left in a partially-installed state.
|
|
8465
8479
|
//
|
|
8466
8480
|
// _codexPreConfigRollback covers the four surfaces that can be mutated before
|
|
8467
|
-
// config.toml is touched: skills/, agents/,
|
|
8481
|
+
// config.toml is touched: skills/, agents/, gsd-core/VERSION, and orphaned
|
|
8468
8482
|
// atomic-write temp files. It is safe to call before any writes have happened.
|
|
8469
8483
|
// The full restoreCodexSnapshot() (defined inside the config block) additionally
|
|
8470
8484
|
// handles config.toml, which is not yet touched at this point in the pipeline.
|
|
@@ -8521,8 +8535,8 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8521
8535
|
}
|
|
8522
8536
|
} catch (_) { /* best-effort */ }
|
|
8523
8537
|
}
|
|
8524
|
-
//
|
|
8525
|
-
const _earlyVersionPath = path.join(targetDir, '
|
|
8538
|
+
// gsd-core/VERSION
|
|
8539
|
+
const _earlyVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
|
|
8526
8540
|
if (codexPreInstallVersionBytes !== null) {
|
|
8527
8541
|
try { fs.writeFileSync(_earlyVersionPath, codexPreInstallVersionBytes); } catch (_) { /* best-effort */ }
|
|
8528
8542
|
} else if (fs.existsSync(_earlyVersionPath)) {
|
|
@@ -8777,24 +8791,24 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8777
8791
|
}
|
|
8778
8792
|
}
|
|
8779
8793
|
|
|
8780
|
-
// Copy
|
|
8794
|
+
// Copy gsd-core skill with path replacement
|
|
8781
8795
|
// Preserve user-generated files before the wipe-and-copy so they survive re-install
|
|
8782
|
-
const skillSrc = path.join(src, '
|
|
8783
|
-
const skillDest = path.join(targetDir, '
|
|
8796
|
+
const skillSrc = path.join(src, 'gsd-core');
|
|
8797
|
+
const skillDest = path.join(targetDir, 'gsd-core');
|
|
8784
8798
|
const savedGsdArtifacts = preserveUserArtifacts(skillDest, USER_OWNED_ARTIFACTS);
|
|
8785
8799
|
copyWithPathReplacement(skillSrc, skillDest, pathPrefix, runtime, false, isGlobal);
|
|
8786
8800
|
restoreUserArtifacts(skillDest, savedGsdArtifacts);
|
|
8787
|
-
if (verifyInstalled(skillDest, '
|
|
8788
|
-
console.log(` ${green}✓${reset} Installed
|
|
8801
|
+
if (verifyInstalled(skillDest, 'gsd-core')) {
|
|
8802
|
+
console.log(` ${green}✓${reset} Installed workflow assets`);
|
|
8789
8803
|
} else {
|
|
8790
|
-
failures.push('
|
|
8804
|
+
failures.push('gsd-core');
|
|
8791
8805
|
}
|
|
8792
8806
|
|
|
8793
|
-
// Copy shared manifests into the
|
|
8807
|
+
// Copy shared manifests into the gsd-core payload
|
|
8794
8808
|
// at the co-located path that CJS modules resolve first:
|
|
8795
|
-
//
|
|
8809
|
+
// gsd-core/bin/shared/*.json
|
|
8796
8810
|
//
|
|
8797
|
-
// This source now lives under
|
|
8811
|
+
// This source now lives under gsd-core/bin/shared in-repo.
|
|
8798
8812
|
const sharedPayloadFiles = [
|
|
8799
8813
|
'model-catalog.json',
|
|
8800
8814
|
'config-defaults.manifest.json',
|
|
@@ -8802,9 +8816,9 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8802
8816
|
'runtime-aliases.manifest.json',
|
|
8803
8817
|
];
|
|
8804
8818
|
for (const fileName of sharedPayloadFiles) {
|
|
8805
|
-
const sharedSrc = path.join(src, '
|
|
8819
|
+
const sharedSrc = path.join(src, 'gsd-core', 'bin', 'shared', fileName);
|
|
8806
8820
|
const sharedDest = path.join(skillDest, 'bin', 'shared', fileName);
|
|
8807
|
-
const displayPath = `
|
|
8821
|
+
const displayPath = `gsd-core/bin/shared/${fileName}`;
|
|
8808
8822
|
if (fs.existsSync(sharedSrc)) {
|
|
8809
8823
|
fs.mkdirSync(path.dirname(sharedDest), { recursive: true });
|
|
8810
8824
|
fs.copyFileSync(sharedSrc, sharedDest);
|
|
@@ -8814,7 +8828,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8814
8828
|
failures.push(displayPath);
|
|
8815
8829
|
}
|
|
8816
8830
|
} else {
|
|
8817
|
-
failures.push(`
|
|
8831
|
+
failures.push(`gsd-core/bin/shared/${fileName} (source missing)`);
|
|
8818
8832
|
}
|
|
8819
8833
|
}
|
|
8820
8834
|
|
|
@@ -8966,7 +8980,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8966
8980
|
|
|
8967
8981
|
// Copy CHANGELOG.md
|
|
8968
8982
|
const changelogSrc = path.join(src, 'CHANGELOG.md');
|
|
8969
|
-
const changelogDest = path.join(targetDir, '
|
|
8983
|
+
const changelogDest = path.join(targetDir, 'gsd-core', 'CHANGELOG.md');
|
|
8970
8984
|
if (fs.existsSync(changelogSrc)) {
|
|
8971
8985
|
fs.copyFileSync(changelogSrc, changelogDest);
|
|
8972
8986
|
if (verifyFileInstalled(changelogDest, 'CHANGELOG.md')) {
|
|
@@ -8977,7 +8991,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
8977
8991
|
}
|
|
8978
8992
|
|
|
8979
8993
|
// Write VERSION file
|
|
8980
|
-
const versionDest = path.join(targetDir, '
|
|
8994
|
+
const versionDest = path.join(targetDir, 'gsd-core', 'VERSION');
|
|
8981
8995
|
fs.writeFileSync(versionDest, pkg.version);
|
|
8982
8996
|
if (verifyFileInstalled(versionDest, 'VERSION')) {
|
|
8983
8997
|
console.log(` ${green}✓${reset} Wrote VERSION (${pkg.version})`);
|
|
@@ -9086,10 +9100,17 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9086
9100
|
console.log(` ${green}✓${reset} Installed hooks/lib/ helpers (git-cmd, graphify-rebuild, ...)`);
|
|
9087
9101
|
}
|
|
9088
9102
|
|
|
9089
|
-
//
|
|
9090
|
-
//
|
|
9091
|
-
|
|
9092
|
-
|
|
9103
|
+
// Remove legacy get-shit-done-cc artifacts and stale update caches (#607).
|
|
9104
|
+
// cleanupLegacyGsdCc handles both the legacy shared cache and the per-package
|
|
9105
|
+
// cache (formerly an inline unlinkSync here). A cleanup failure must never
|
|
9106
|
+
// abort a successful install — log a warning and continue.
|
|
9107
|
+
// install() is never reached in --dry-run mode (the early-exit at the CLI
|
|
9108
|
+
// dispatch handles preview), so cleanup here always applies for real.
|
|
9109
|
+
try {
|
|
9110
|
+
cleanupLegacyGsdCc({ dryRun: false });
|
|
9111
|
+
} catch (cleanupErr) {
|
|
9112
|
+
console.warn(` ${yellow}Warning: legacy cleanup failed: ${cleanupErr.message}${reset}`);
|
|
9113
|
+
}
|
|
9093
9114
|
|
|
9094
9115
|
if (failures.length > 0) {
|
|
9095
9116
|
console.error(`\n ${yellow}Installation incomplete!${reset} Failed: ${failures.join(', ')}`);
|
|
@@ -9103,42 +9124,48 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9103
9124
|
// Report any backed-up local patches
|
|
9104
9125
|
reportLocalPatches(targetDir, runtime);
|
|
9105
9126
|
|
|
9106
|
-
// Verify no leaked .claude paths in non-Claude runtimes
|
|
9127
|
+
// Verify no leaked .claude paths in non-Claude runtimes (manifest-scoped)
|
|
9107
9128
|
if (runtime !== 'claude') {
|
|
9108
9129
|
const leakedPaths = [];
|
|
9109
|
-
|
|
9110
|
-
|
|
9111
|
-
|
|
9112
|
-
|
|
9113
|
-
|
|
9114
|
-
|
|
9115
|
-
|
|
9116
|
-
|
|
9130
|
+
// Only scan files that were written by this install (manifest-tracked).
|
|
9131
|
+
// Scanning the entire targetDir can match user-authored content that
|
|
9132
|
+
// legitimately references ~/.claude (e.g. personal notes), producing
|
|
9133
|
+
// false-positive warnings. Restricting to the manifest avoids that.
|
|
9134
|
+
let manifestFiles = null;
|
|
9135
|
+
try {
|
|
9136
|
+
const manifestPath = path.join(targetDir, MANIFEST_NAME);
|
|
9137
|
+
if (fs.existsSync(manifestPath)) {
|
|
9138
|
+
const manifestData = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
9139
|
+
if (manifestData && typeof manifestData.files === 'object') {
|
|
9140
|
+
manifestFiles = Object.keys(manifestData.files);
|
|
9117
9141
|
}
|
|
9118
|
-
throw err;
|
|
9119
9142
|
}
|
|
9120
|
-
|
|
9121
|
-
|
|
9122
|
-
|
|
9123
|
-
|
|
9124
|
-
|
|
9125
|
-
|
|
9126
|
-
|
|
9127
|
-
|
|
9128
|
-
|
|
9129
|
-
|
|
9130
|
-
|
|
9131
|
-
|
|
9132
|
-
|
|
9133
|
-
|
|
9134
|
-
|
|
9135
|
-
if (
|
|
9136
|
-
|
|
9143
|
+
} catch (_manifestParseErr) {
|
|
9144
|
+
// If we cannot read/parse the manifest, skip the scan entirely to
|
|
9145
|
+
// avoid false positives rather than falling back to a full directory walk.
|
|
9146
|
+
manifestFiles = null;
|
|
9147
|
+
}
|
|
9148
|
+
if (manifestFiles !== null) {
|
|
9149
|
+
for (const relPath of manifestFiles) {
|
|
9150
|
+
const fileName = path.basename(relPath);
|
|
9151
|
+
if (!(fileName.endsWith('.md') || fileName.endsWith('.toml'))) continue;
|
|
9152
|
+
if (fileName === 'CHANGELOG.md') continue;
|
|
9153
|
+
const fullPath = path.join(targetDir, relPath);
|
|
9154
|
+
let content;
|
|
9155
|
+
try {
|
|
9156
|
+
content = fs.readFileSync(fullPath, 'utf8');
|
|
9157
|
+
} catch (err) {
|
|
9158
|
+
if (err.code === 'EPERM' || err.code === 'EACCES' || err.code === 'ENOENT') {
|
|
9159
|
+
continue; // skip inaccessible or missing files
|
|
9137
9160
|
}
|
|
9161
|
+
throw err;
|
|
9162
|
+
}
|
|
9163
|
+
const matches = content.match(/(?:~|\$HOME)\/\.claude\b/g);
|
|
9164
|
+
if (matches) {
|
|
9165
|
+
leakedPaths.push({ file: relPath, count: matches.length });
|
|
9138
9166
|
}
|
|
9139
9167
|
}
|
|
9140
9168
|
}
|
|
9141
|
-
scanForLeakedPaths(targetDir);
|
|
9142
9169
|
if (leakedPaths.length > 0) {
|
|
9143
9170
|
const totalLeaks = leakedPaths.reduce((sum, l) => sum + l.count, 0);
|
|
9144
9171
|
console.warn(`\n ${yellow}⚠${reset} Found ${totalLeaks} unreplaced .claude path reference(s) in ${leakedPaths.length} file(s):`);
|
|
@@ -9198,7 +9225,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9198
9225
|
// newly-created dirs (i.e. those not in the pre-install Set)
|
|
9199
9226
|
// agents/gsd-* — restore pre-existing files from content snapshot; remove
|
|
9200
9227
|
// newly-created files
|
|
9201
|
-
//
|
|
9228
|
+
// gsd-core/VERSION — restore or remove
|
|
9202
9229
|
// *.tmp-* — best-effort cleanup of installer-owned atomic-write temps
|
|
9203
9230
|
//
|
|
9204
9231
|
// Safe to call multiple times (idempotent): each remove/write is guarded by
|
|
@@ -9297,8 +9324,8 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9297
9324
|
} catch (_) { /* best-effort */ }
|
|
9298
9325
|
}
|
|
9299
9326
|
|
|
9300
|
-
// 4.
|
|
9301
|
-
const _rollbackVersionPath = path.join(targetDir, '
|
|
9327
|
+
// 4. gsd-core/VERSION
|
|
9328
|
+
const _rollbackVersionPath = path.join(targetDir, 'gsd-core', 'VERSION');
|
|
9302
9329
|
if (codexPreInstallVersionBytes !== null) {
|
|
9303
9330
|
try { fs.writeFileSync(_rollbackVersionPath, codexPreInstallVersionBytes); }
|
|
9304
9331
|
catch (_) { /* best-effort */ }
|
|
@@ -9342,6 +9369,10 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9342
9369
|
}
|
|
9343
9370
|
console.log(` ${green}✓${reset} Generated config.toml with ${agentCount} agent roles`);
|
|
9344
9371
|
console.log(` ${green}✓${reset} Generated ${agentCount} agent .toml config files`);
|
|
9372
|
+
// Re-write the manifest now that .toml agent files exist on disk.
|
|
9373
|
+
// The initial writeManifest call (before Codex config generation) could
|
|
9374
|
+
// not include agents/gsd-*.toml because those files did not yet exist.
|
|
9375
|
+
writeManifest(targetDir, runtime, { mode: _effectiveInstallMode });
|
|
9345
9376
|
} else {
|
|
9346
9377
|
console.log(` ${dim}↳${reset} Skipping Codex agent config generation (minimal install)`);
|
|
9347
9378
|
}
|
|
@@ -9513,7 +9544,7 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9513
9544
|
|
|
9514
9545
|
if (isCopilot) {
|
|
9515
9546
|
// Generate copilot-instructions.md
|
|
9516
|
-
const templatePath = path.join(targetDir, '
|
|
9547
|
+
const templatePath = path.join(targetDir, 'gsd-core', 'templates', 'copilot-instructions.md');
|
|
9517
9548
|
const instructionsPath = path.join(targetDir, 'copilot-instructions.md');
|
|
9518
9549
|
if (fs.existsSync(templatePath)) {
|
|
9519
9550
|
const template = fs.readFileSync(templatePath, 'utf8');
|
|
@@ -9547,12 +9578,12 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9547
9578
|
// Cline uses .clinerules — generate a rules file with GSD system instructions
|
|
9548
9579
|
const clinerulesDest = path.join(targetDir, '.clinerules');
|
|
9549
9580
|
const clinerules = [
|
|
9550
|
-
'# GSD —
|
|
9581
|
+
'# GSD Core — Git. Ship. Done.',
|
|
9551
9582
|
'',
|
|
9552
|
-
'- GSD workflows live in `
|
|
9583
|
+
'- GSD workflows live in `gsd-core/workflows/`. Load the relevant workflow when',
|
|
9553
9584
|
' the user runs a `/gsd-*` command.',
|
|
9554
9585
|
'- GSD agents live in `agents/`. Use the matching agent when spawning subagents.',
|
|
9555
|
-
'- GSD tools are at `
|
|
9586
|
+
'- GSD tools are at `gsd-core/bin/gsd-tools.cjs`. Run with `node`.',
|
|
9556
9587
|
'- Planning artifacts live in `.planning/`. Never edit them outside a GSD workflow.',
|
|
9557
9588
|
'- Do not apply GSD workflows unless the user explicitly asks for them.',
|
|
9558
9589
|
'- When a GSD command triggers a deliverable (feature, fix, docs), offer the next',
|
|
@@ -9685,14 +9716,13 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9685
9716
|
runtime,
|
|
9686
9717
|
platform: process.platform,
|
|
9687
9718
|
});
|
|
9688
|
-
const localShellCmd = (hookFile) =>
|
|
9689
|
-
|
|
9690
|
-
|
|
9691
|
-
|
|
9692
|
-
|
|
9693
|
-
|
|
9694
|
-
|
|
9695
|
-
});
|
|
9719
|
+
const localShellCmd = (hookFile) => buildLocalShellHookCommand({
|
|
9720
|
+
localPrefix,
|
|
9721
|
+
hookFile,
|
|
9722
|
+
bashRunner: localBashRunner,
|
|
9723
|
+
runtime,
|
|
9724
|
+
platform: process.platform,
|
|
9725
|
+
});
|
|
9696
9726
|
const statuslineCommand = isGlobal
|
|
9697
9727
|
? buildHookCommand(targetDir, 'gsd-statusline.js', hookOpts)
|
|
9698
9728
|
: localCmd('gsd-statusline.js');
|
|
@@ -9930,6 +9960,33 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
9930
9960
|
console.warn(` ${yellow}⚠${reset} Skipped workflow guard hook — gsd-workflow-guard.js not found at target`);
|
|
9931
9961
|
}
|
|
9932
9962
|
|
|
9963
|
+
// Configure PreToolUse hook for worktree absolute-path safety (#260)
|
|
9964
|
+
// Hard-blocks Edit/Write/MultiEdit tool calls with absolute paths that resolve
|
|
9965
|
+
// outside the current worktree root. Prevents executor agents from
|
|
9966
|
+
// accidentally writing to the main checkout when running in isolation="worktree".
|
|
9967
|
+
const worktreePathGuardCommand = isGlobal
|
|
9968
|
+
? buildHookCommand(targetDir, 'gsd-worktree-path-guard.js', hookOpts)
|
|
9969
|
+
: localCmd('gsd-worktree-path-guard.js');
|
|
9970
|
+
const hasWorktreePathGuardHook = settings.hooks[preToolEvent].some(entry =>
|
|
9971
|
+
entry.hooks && entry.hooks.some(h => h.command && h.command.includes('gsd-worktree-path-guard'))
|
|
9972
|
+
);
|
|
9973
|
+
const worktreePathGuardFile = path.join(targetDir, 'hooks', 'gsd-worktree-path-guard.js');
|
|
9974
|
+
if (!hasWorktreePathGuardHook && fs.existsSync(worktreePathGuardFile) && worktreePathGuardCommand) {
|
|
9975
|
+
settings.hooks[preToolEvent].push({
|
|
9976
|
+
matcher: 'Write|Edit|MultiEdit',
|
|
9977
|
+
hooks: [
|
|
9978
|
+
{
|
|
9979
|
+
type: 'command',
|
|
9980
|
+
command: worktreePathGuardCommand,
|
|
9981
|
+
timeout: 5
|
|
9982
|
+
}
|
|
9983
|
+
]
|
|
9984
|
+
});
|
|
9985
|
+
console.log(` ${green}✓${reset} Configured worktree path guard hook`);
|
|
9986
|
+
} else if (!hasWorktreePathGuardHook && !fs.existsSync(worktreePathGuardFile)) {
|
|
9987
|
+
console.warn(` ${yellow}⚠${reset} Skipped worktree path guard hook — gsd-worktree-path-guard.js not found at target`);
|
|
9988
|
+
}
|
|
9989
|
+
|
|
9933
9990
|
// Configure commit validation hook (Conventional Commits enforcement, opt-in)
|
|
9934
9991
|
const validateCommitCommand = isGlobal
|
|
9935
9992
|
? buildHookCommand(targetDir, 'gsd-validate-commit.sh', hookOpts)
|
|
@@ -10655,6 +10712,86 @@ function maybeSuggestPathExport(globalBin, homeDir) {
|
|
|
10655
10712
|
console.log('');
|
|
10656
10713
|
}
|
|
10657
10714
|
|
|
10715
|
+
// Runtime subdir names to scan for legacy get-shit-done-cc artifacts (#607).
|
|
10716
|
+
// Covers both local (project-relative) and common global forms.
|
|
10717
|
+
const _LEGACY_SCAN_SUBDIR_NAMES = [
|
|
10718
|
+
'.claude',
|
|
10719
|
+
'.gemini',
|
|
10720
|
+
'.opencode',
|
|
10721
|
+
'.config/opencode',
|
|
10722
|
+
'.kilo',
|
|
10723
|
+
'.config/kilo',
|
|
10724
|
+
'.codex',
|
|
10725
|
+
'.copilot',
|
|
10726
|
+
'.github', // copilot local form
|
|
10727
|
+
'.agent', // antigravity local form
|
|
10728
|
+
'.cursor',
|
|
10729
|
+
'.windsurf',
|
|
10730
|
+
'.codeium/windsurf',
|
|
10731
|
+
'.augment',
|
|
10732
|
+
'.trae',
|
|
10733
|
+
'.qwen',
|
|
10734
|
+
'.hermes',
|
|
10735
|
+
'.codebuddy',
|
|
10736
|
+
'.cline',
|
|
10737
|
+
];
|
|
10738
|
+
|
|
10739
|
+
/**
|
|
10740
|
+
* Detect and remove leftover get-shit-done-cc artifacts across ALL known
|
|
10741
|
+
* runtime config directories (issue #607).
|
|
10742
|
+
*
|
|
10743
|
+
* Exported so tests can call it directly without spawning a subprocess.
|
|
10744
|
+
*
|
|
10745
|
+
* Scans ONLY subdirs under homeDir — never cwd — to avoid touching the
|
|
10746
|
+
* user's active-project hooks when the installer is run from a project dir.
|
|
10747
|
+
*
|
|
10748
|
+
* @param {object} [opts]
|
|
10749
|
+
* @param {string} [opts.homeDir=os.homedir()] - home directory to scan
|
|
10750
|
+
* @param {boolean} [opts.dryRun=false] - preview only; no mutations
|
|
10751
|
+
* @param {object} [opts.logger=console] - injectable logger
|
|
10752
|
+
* @returns {{ plan: {path:string,reason:string}[], result: object }}
|
|
10753
|
+
*/
|
|
10754
|
+
function cleanupLegacyGsdCc({ homeDir = os.homedir(), dryRun = false, logger = console } = {}) {
|
|
10755
|
+
// Build de-duplicated list of candidate config dirs to scan.
|
|
10756
|
+
// Only scan under homeDir — never cwd — to prevent accidental deletion of
|
|
10757
|
+
// the user's active-project hooks when the installer is invoked from a
|
|
10758
|
+
// project directory that has .claude/hooks or similar subdirs.
|
|
10759
|
+
const seen = new Set();
|
|
10760
|
+
const configDirs = [];
|
|
10761
|
+
for (const name of _LEGACY_SCAN_SUBDIR_NAMES) {
|
|
10762
|
+
const candidate = path.join(homeDir, name);
|
|
10763
|
+
if (!seen.has(candidate) && fs.existsSync(candidate)) {
|
|
10764
|
+
seen.add(candidate);
|
|
10765
|
+
configDirs.push(candidate);
|
|
10766
|
+
}
|
|
10767
|
+
}
|
|
10768
|
+
|
|
10769
|
+
// planLegacyCleanup scans each configDir and already includes the legacy
|
|
10770
|
+
// shared cache (gsd-update-check.json) as a plan entry.
|
|
10771
|
+
const plan = planLegacyCleanup(configDirs, { homeDir });
|
|
10772
|
+
|
|
10773
|
+
// Apply the plan (dryRun honors the flag).
|
|
10774
|
+
const result = applyLegacyCleanup(plan, { dryRun, logger });
|
|
10775
|
+
|
|
10776
|
+
// Also clear / preview the per-package cache so next session re-evaluates
|
|
10777
|
+
// hook versions (replaces the former inline unlinkSync on line ~9104).
|
|
10778
|
+
const perPkgCacheFile = path.join(homeDir, '.cache', 'gsd', updateCacheFileName);
|
|
10779
|
+
if (dryRun) {
|
|
10780
|
+
logger.log('[dry-run] would remove: ' + perPkgCacheFile + ' (per-package-update-cache)');
|
|
10781
|
+
} else {
|
|
10782
|
+
try { fs.unlinkSync(perPkgCacheFile); } catch (_e) { /* cache may not exist yet */ }
|
|
10783
|
+
}
|
|
10784
|
+
|
|
10785
|
+
// Concise summary
|
|
10786
|
+
if (plan.length > 0 || !dryRun) {
|
|
10787
|
+
const verb = dryRun ? 'Would remove' : 'Removed';
|
|
10788
|
+
const count = dryRun ? plan.length : result.removed.length;
|
|
10789
|
+
logger.log(`[legacy-cleanup] ${verb} ${count} legacy artifact(s).`);
|
|
10790
|
+
}
|
|
10791
|
+
|
|
10792
|
+
return { plan, result };
|
|
10793
|
+
}
|
|
10794
|
+
|
|
10658
10795
|
/**
|
|
10659
10796
|
* Install GSD for all selected runtimes
|
|
10660
10797
|
*/
|
|
@@ -10878,11 +11015,26 @@ module.exports = {
|
|
|
10878
11015
|
installRuntimeArtifacts,
|
|
10879
11016
|
uninstallRuntimeArtifacts,
|
|
10880
11017
|
parseConfigDirFromArgs,
|
|
11018
|
+
cleanupLegacyGsdCc,
|
|
10881
11019
|
};
|
|
10882
11020
|
|
|
10883
11021
|
// Main logic — only run when not loaded as a module for testing
|
|
10884
11022
|
if (require.main === module && !process.env.GSD_TEST_MODE) {
|
|
10885
|
-
if (
|
|
11023
|
+
if (hasDryRun) {
|
|
11024
|
+
// --dry-run: preview legacy cleanup and exit without installing.
|
|
11025
|
+
if (hasUninstall) {
|
|
11026
|
+
console.log('Note: --dry-run previews legacy get-shit-done-cc cleanup only; it does not preview --uninstall.');
|
|
11027
|
+
}
|
|
11028
|
+
console.log('Dry run — no files will be modified.\n');
|
|
11029
|
+
// cleanupLegacyGsdCc with dryRun:true is the single source of truth for
|
|
11030
|
+
// both the legacy artifacts and the per-package cache path — no duplicate
|
|
11031
|
+
// printing here.
|
|
11032
|
+
const { plan } = cleanupLegacyGsdCc({ dryRun: true });
|
|
11033
|
+
if (plan.length === 0) {
|
|
11034
|
+
console.log(' (no legacy get-shit-done-cc artifacts found)');
|
|
11035
|
+
}
|
|
11036
|
+
process.exit(0);
|
|
11037
|
+
} else if (hasSkillsRoot) {
|
|
10886
11038
|
// Print the skills root directory for a given runtime (used by /gsd-sync-skills).
|
|
10887
11039
|
// Usage: node install.js --skills-root <runtime>
|
|
10888
11040
|
const runtimeArg = args[args.indexOf('--skills-root') + 1];
|