@opengsd/gsd-core 1.3.0-rc.1 → 1.3.1
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 +44 -790
- package/README.ko-KR.md +41 -778
- package/README.md +39 -180
- package/README.pt-BR.md +45 -413
- package/README.zh-CN.md +43 -761
- package/agents/gsd-ai-researcher.md +1 -1
- package/agents/gsd-debugger.md +8 -8
- package/agents/gsd-domain-researcher.md +14 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-eval-planner.md +1 -1
- 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 +18 -5
- 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 +15 -2
- package/agents/gsd-user-profiler.md +2 -2
- package/agents/gsd-verifier.md +7 -7
- package/bin/install.js +169 -59
- 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 +1 -1
- 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 +13 -3
- 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/{get-shit-done → gsd-core}/bin/lib/config-types.cjs +1 -1
- 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 +823 -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/{get-shit-done → gsd-core}/bin/lib/semver-compare.cjs +1 -1
- 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 -78
- 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-schema.manifest.json +5 -0
- package/{get-shit-done → gsd-core}/references/artifact-types.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-mvp-mode.md +1 -1
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/audit-milestone.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/audit-uat.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/autonomous.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/check-todos.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/cleanup.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/code-review-fix.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/code-review.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/complete-milestone.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/debug.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/diagnose-issues.md +4 -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 +4 -4
- 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 +2 -2
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/edit-phase.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/eval-review.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/execute-phase/steps/codebase-drift-gate.md +15 -2
- 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 +68 -46
- package/{get-shit-done → gsd-core}/workflows/execute-plan.md +8 -8
- package/{get-shit-done → gsd-core}/workflows/explore.md +3 -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/full.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/import.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/ingest-docs.md +3 -3
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/map-codebase.md +1 -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 +3 -3
- package/{get-shit-done → gsd-core}/workflows/new-project.md +6 -6
- 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 +15 -15
- package/{get-shit-done → gsd-core}/workflows/plan-review-convergence.md +7 -7
- 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 +2 -26
- 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 +1 -1
- package/{get-shit-done → gsd-core}/workflows/scan.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/secure-phase.md +3 -3
- package/{get-shit-done → gsd-core}/workflows/settings-advanced.md +1 -1
- package/{get-shit-done → gsd-core}/workflows/settings-integrations.md +2 -2
- package/{get-shit-done → gsd-core}/workflows/settings.md +1 -1
- 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 +3 -3
- package/{get-shit-done → gsd-core}/workflows/ui-review.md +2 -2
- 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 +3 -3
- package/{get-shit-done → gsd-core}/workflows/verify-phase.md +4 -4
- package/{get-shit-done → gsd-core}/workflows/verify-work.md +5 -5
- 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/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/package.json +9 -6
- package/scripts/affected-tests-lib.cjs +1 -1
- package/scripts/base64-scan.sh +12 -0
- package/scripts/build-hooks.js +4 -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 +25 -10
- 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 +11 -3
- 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 -831
- 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 -1292
- 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 -2513
- 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 -254
- 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 -355
- 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 -372
- package/get-shit-done/bin/lib/model-catalog.cjs +0 -229
- 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 -79
- 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 -126
- package/get-shit-done/bin/lib/roadmap-command-router.cjs +0 -162
- package/get-shit-done/bin/lib/roadmap-upgrade.cjs +0 -569
- package/get-shit-done/bin/lib/roadmap.cjs +0 -651
- 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/shell-command-projection.cjs +0 -535
- package/get-shit-done/bin/lib/state-command-router.cjs +0 -252
- package/get-shit-done/bin/lib/state.cjs +0 -2073
- 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/ui-safety-gate.cjs +0 -111
- 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 -118
- package/get-shit-done/bin/lib/verify-command-router.cjs +0 -40
- package/get-shit-done/bin/lib/verify.cjs +0 -1614
- 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/{get-shit-done → gsd-core}/bin/shared/config-defaults.manifest.json +0 -0
- /package/{get-shit-done → gsd-core}/bin/shared/model-catalog.json +0 -0
- /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/checkpoints.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-human-verify-mode.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/ui-brand.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/default.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
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Runtime artifact layout module — resolves the artifact directory shapes
|
|
7
|
+
* (commands, agents, skills) for each supported runtime.
|
|
8
|
+
*
|
|
9
|
+
* grok is intentionally absent: it is in runtime-homes.cjs but not wired
|
|
10
|
+
* here. The TypeError on unknown runtime is the loud-fail signal that a
|
|
11
|
+
* runtime was added to the homes list without a layout entry.
|
|
12
|
+
*
|
|
13
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/runtime-artifact-layout.cjs
|
|
14
|
+
* collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
|
|
15
|
+
* from the prior hand-written .cjs; only types are added.
|
|
16
|
+
*/
|
|
17
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
18
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
20
|
+
const installProfiles = require("./install-profiles.cjs");
|
|
21
|
+
const { stageSkillsForProfile, stageAgentsForProfile, stageSkillsForRuntimeAsSkills, } = installProfiles;
|
|
22
|
+
// In .cts (CommonJS output) files, `require` is available as a global.
|
|
23
|
+
const _require = require;
|
|
24
|
+
/**
|
|
25
|
+
* Load bin/install.js exports in a test-safe way.
|
|
26
|
+
* Sets GSD_TEST_MODE only for the duration of the require() call and only if
|
|
27
|
+
* it was not already set, restoring the original value in a finally block so
|
|
28
|
+
* the module-level environment is never permanently mutated.
|
|
29
|
+
*/
|
|
30
|
+
function loadInstallExports() {
|
|
31
|
+
const savedTestMode = process.env['GSD_TEST_MODE'];
|
|
32
|
+
if (savedTestMode === undefined)
|
|
33
|
+
process.env['GSD_TEST_MODE'] = '1';
|
|
34
|
+
try {
|
|
35
|
+
return _require('../../../bin/install.js');
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
if (savedTestMode === undefined)
|
|
39
|
+
delete process.env['GSD_TEST_MODE'];
|
|
40
|
+
else
|
|
41
|
+
process.env['GSD_TEST_MODE'] = savedTestMode;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Cache after first successful load. */
|
|
45
|
+
let _installExports = null;
|
|
46
|
+
function getInstallExports() {
|
|
47
|
+
if (!_installExports)
|
|
48
|
+
_installExports = loadInstallExports();
|
|
49
|
+
return _installExports;
|
|
50
|
+
}
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Source root finders
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
/**
|
|
55
|
+
* Locate the GSD commands/gsd source directory.
|
|
56
|
+
*
|
|
57
|
+
* Resolution order:
|
|
58
|
+
* 1. If runtimeConfigDir provided, check <runtimeConfigDir>/.gsd-source marker.
|
|
59
|
+
* 2. Walk up from __dirname using path.dirname (no literal .. segments).
|
|
60
|
+
* 3. Throw a descriptive error if neither succeeds.
|
|
61
|
+
*/
|
|
62
|
+
function findInstallSourceRoot(runtimeConfigDir) {
|
|
63
|
+
// Step 1: marker check
|
|
64
|
+
if (runtimeConfigDir) {
|
|
65
|
+
const markerPath = node_path_1.default.join(runtimeConfigDir, '.gsd-source');
|
|
66
|
+
if (node_fs_1.default.existsSync(markerPath)) {
|
|
67
|
+
try {
|
|
68
|
+
const src = node_fs_1.default.readFileSync(markerPath, 'utf8').trim();
|
|
69
|
+
if (src && node_fs_1.default.existsSync(src))
|
|
70
|
+
return src;
|
|
71
|
+
}
|
|
72
|
+
catch { /* fall through */ }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Step 2: walk up from __dirname
|
|
76
|
+
let dir = __dirname;
|
|
77
|
+
for (let i = 0; i < 6; i++) {
|
|
78
|
+
const candidate = node_path_1.default.join(dir, 'commands', 'gsd');
|
|
79
|
+
if (node_fs_1.default.existsSync(candidate))
|
|
80
|
+
return candidate;
|
|
81
|
+
const parent = node_path_1.default.dirname(dir);
|
|
82
|
+
if (parent === dir)
|
|
83
|
+
break;
|
|
84
|
+
dir = parent;
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`findInstallSourceRoot: could not locate commands/gsd from ${__dirname}`);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Locate the GSD agents source directory.
|
|
90
|
+
*
|
|
91
|
+
* Resolution order:
|
|
92
|
+
* 1. If runtimeConfigDir provided, check <runtimeConfigDir>/.gsd-source marker.
|
|
93
|
+
* 2. Walk up from __dirname using path.dirname (no literal .. segments).
|
|
94
|
+
* 3. Throw a descriptive error if neither succeeds.
|
|
95
|
+
*/
|
|
96
|
+
function findAgentsSourceRoot(runtimeConfigDir) {
|
|
97
|
+
// Step 1: marker check
|
|
98
|
+
if (runtimeConfigDir) {
|
|
99
|
+
const markerPath = node_path_1.default.join(runtimeConfigDir, '.gsd-source');
|
|
100
|
+
if (node_fs_1.default.existsSync(markerPath)) {
|
|
101
|
+
try {
|
|
102
|
+
const src = node_fs_1.default.readFileSync(markerPath, 'utf8').trim();
|
|
103
|
+
if (src && node_fs_1.default.existsSync(src)) {
|
|
104
|
+
// Marker points to commands/gsd; agents/ is a sibling of commands/
|
|
105
|
+
const agentsCandidate = node_path_1.default.resolve(node_path_1.default.dirname(src), '..', 'agents');
|
|
106
|
+
if (node_fs_1.default.existsSync(agentsCandidate))
|
|
107
|
+
return agentsCandidate;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch { /* fall through */ }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Step 2: walk up from __dirname
|
|
114
|
+
let dir = __dirname;
|
|
115
|
+
for (let i = 0; i < 6; i++) {
|
|
116
|
+
const candidate = node_path_1.default.join(dir, 'agents');
|
|
117
|
+
if (node_fs_1.default.existsSync(candidate))
|
|
118
|
+
return candidate;
|
|
119
|
+
const parent = node_path_1.default.dirname(dir);
|
|
120
|
+
if (parent === dir)
|
|
121
|
+
break;
|
|
122
|
+
dir = parent;
|
|
123
|
+
}
|
|
124
|
+
throw new Error(`findAgentsSourceRoot: could not locate agents/ from ${__dirname}`);
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Allowlisted runtimes
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
const ALLOWED_RUNTIMES = new Set([
|
|
130
|
+
'claude', 'cursor', 'gemini', 'codex', 'copilot', 'antigravity',
|
|
131
|
+
'windsurf', 'augment', 'trae', 'qwen', 'hermes', 'codebuddy',
|
|
132
|
+
'cline', 'opencode', 'kilo',
|
|
133
|
+
]);
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Layout table builders
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
function commandsKind(destSubpath, prefix, configDir) {
|
|
138
|
+
return {
|
|
139
|
+
kind: 'commands',
|
|
140
|
+
destSubpath,
|
|
141
|
+
prefix,
|
|
142
|
+
stage: (resolved) => stageSkillsForProfile(findInstallSourceRoot(configDir), resolved),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function agentsKind(destSubpath, prefix, configDir) {
|
|
146
|
+
return {
|
|
147
|
+
kind: 'agents',
|
|
148
|
+
destSubpath,
|
|
149
|
+
prefix,
|
|
150
|
+
stage: (resolved) => stageAgentsForProfile(findAgentsSourceRoot(configDir), resolved),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Build a skills kind descriptor.
|
|
155
|
+
*
|
|
156
|
+
* @param destSubpath
|
|
157
|
+
* @param prefix
|
|
158
|
+
* @param converterName name of converter function in bin/install.js exports
|
|
159
|
+
* @param runtime canonical runtime ID (gates Hermes/Qwen branding in converter)
|
|
160
|
+
* @param configDir runtime config dir (for .gsd-source marker resolution)
|
|
161
|
+
*/
|
|
162
|
+
function skillsKind(destSubpath, prefix, converterName, runtime, configDir) {
|
|
163
|
+
return {
|
|
164
|
+
kind: 'skills',
|
|
165
|
+
destSubpath,
|
|
166
|
+
prefix,
|
|
167
|
+
stage: (resolved) => {
|
|
168
|
+
const installExports = getInstallExports();
|
|
169
|
+
const realConverter = installExports[converterName];
|
|
170
|
+
// Compute cmdNames once per stage call for performance (#3583).
|
|
171
|
+
// Extra args are ignored by converters that don't need runtime/cmdNames.
|
|
172
|
+
const cmdNames = installExports.readGsdCommandNames();
|
|
173
|
+
const wrappedConverter = (content, skillName) => realConverter(content, skillName, runtime, cmdNames);
|
|
174
|
+
return stageSkillsForRuntimeAsSkills(findInstallSourceRoot(configDir), resolved, wrappedConverter, prefix);
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Public API
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Resolve the artifact layout for a given runtime and config directory.
|
|
183
|
+
*/
|
|
184
|
+
function resolveRuntimeArtifactLayout(runtime, configDir, scope = 'global') {
|
|
185
|
+
if (typeof configDir !== 'string' || configDir === '') {
|
|
186
|
+
throw new TypeError('configDir must be a non-empty string');
|
|
187
|
+
}
|
|
188
|
+
if (scope !== 'local' && scope !== 'global') {
|
|
189
|
+
throw new TypeError('scope must be "local" or "global"');
|
|
190
|
+
}
|
|
191
|
+
if (!ALLOWED_RUNTIMES.has(runtime)) {
|
|
192
|
+
throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
|
|
193
|
+
}
|
|
194
|
+
let kinds;
|
|
195
|
+
switch (runtime) {
|
|
196
|
+
case 'claude':
|
|
197
|
+
if (scope === 'local') {
|
|
198
|
+
kinds = [
|
|
199
|
+
commandsKind('commands/gsd', 'gsd-', configDir),
|
|
200
|
+
agentsKind('agents', 'gsd-', configDir),
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'claude', configDir)];
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
case 'cursor':
|
|
208
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCursorSkill', 'cursor', configDir)];
|
|
209
|
+
break;
|
|
210
|
+
case 'gemini':
|
|
211
|
+
kinds = [commandsKind('commands/gsd', 'gsd-', configDir)];
|
|
212
|
+
break;
|
|
213
|
+
case 'codex':
|
|
214
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodexSkill', 'codex', configDir)];
|
|
215
|
+
break;
|
|
216
|
+
case 'copilot':
|
|
217
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCopilotSkill', 'copilot', configDir)];
|
|
218
|
+
break;
|
|
219
|
+
case 'antigravity':
|
|
220
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAntigravitySkill', 'antigravity', configDir)];
|
|
221
|
+
break;
|
|
222
|
+
case 'windsurf':
|
|
223
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToWindsurfSkill', 'windsurf', configDir)];
|
|
224
|
+
break;
|
|
225
|
+
case 'augment':
|
|
226
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAugmentSkill', 'augment', configDir)];
|
|
227
|
+
break;
|
|
228
|
+
case 'trae':
|
|
229
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToTraeSkill', 'trae', configDir)];
|
|
230
|
+
break;
|
|
231
|
+
case 'qwen':
|
|
232
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'qwen', configDir)];
|
|
233
|
+
break;
|
|
234
|
+
case 'hermes':
|
|
235
|
+
kinds = [skillsKind('skills/gsd', '', 'convertClaudeCommandToClaudeSkill', 'hermes', configDir)];
|
|
236
|
+
break;
|
|
237
|
+
case 'codebuddy':
|
|
238
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodebuddySkill', 'codebuddy', configDir)];
|
|
239
|
+
break;
|
|
240
|
+
case 'cline':
|
|
241
|
+
kinds = [];
|
|
242
|
+
break;
|
|
243
|
+
case 'opencode':
|
|
244
|
+
kinds = [commandsKind('command', 'gsd-', configDir)];
|
|
245
|
+
break;
|
|
246
|
+
case 'kilo':
|
|
247
|
+
kinds = [commandsKind('command', 'gsd-', configDir)];
|
|
248
|
+
break;
|
|
249
|
+
default:
|
|
250
|
+
throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
|
|
251
|
+
}
|
|
252
|
+
return { runtime, configDir, kinds };
|
|
253
|
+
}
|
|
254
|
+
module.exports = { resolveRuntimeArtifactLayout, findInstallSourceRoot };
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* runtime-homes.cts — canonical runtime → global config/skills directory mapping.
|
|
4
|
+
*
|
|
5
|
+
* Single source of truth for resolving the global config base directory and
|
|
6
|
+
* the correct global skills directory for every GSD-supported runtime.
|
|
7
|
+
*
|
|
8
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/runtime-homes.cjs
|
|
9
|
+
* collapsed to a TypeScript source of truth. Behaviour is preserved
|
|
10
|
+
* byte-for-behaviour from the prior hand-written .cjs; only types are added.
|
|
11
|
+
*
|
|
12
|
+
* Runtime-specific notes:
|
|
13
|
+
* hermes — GSD skills nest under skills/gsd/<skillName>/ (not the flat
|
|
14
|
+
* skills/<skillName>/ layout used by all other runtimes).
|
|
15
|
+
* cline — Rules-based; commands are embedded in .clinerules. Cline does
|
|
16
|
+
* not use a skills/ directory. getGlobalSkillDir() returns null
|
|
17
|
+
* for cline so the caller can emit an appropriate warning.
|
|
18
|
+
*/
|
|
19
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
20
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
21
|
+
};
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.resolveAntigravityGlobalDir = resolveAntigravityGlobalDir;
|
|
24
|
+
exports.getGlobalConfigDir = getGlobalConfigDir;
|
|
25
|
+
exports.getGlobalSkillsBase = getGlobalSkillsBase;
|
|
26
|
+
exports.getGlobalSkillDir = getGlobalSkillDir;
|
|
27
|
+
exports.getGlobalSkillDisplayPath = getGlobalSkillDisplayPath;
|
|
28
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
29
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
30
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
31
|
+
/**
|
|
32
|
+
* Expand a leading ~ to os.homedir().
|
|
33
|
+
*/
|
|
34
|
+
function expandTilde(p) {
|
|
35
|
+
if (!p)
|
|
36
|
+
return p;
|
|
37
|
+
if (p.startsWith('~/') || p === '~')
|
|
38
|
+
return node_path_1.default.join(node_os_1.default.homedir(), p.slice(1));
|
|
39
|
+
return p;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolve Antigravity global config dir across 1.x and 2.x layouts.
|
|
43
|
+
*/
|
|
44
|
+
function resolveAntigravityGlobalDir(opts = {}) {
|
|
45
|
+
const env = opts.env ?? process.env;
|
|
46
|
+
const home = opts.home ?? node_os_1.default.homedir();
|
|
47
|
+
const existsSyncFn = opts.existsSync ?? node_fs_1.default.existsSync;
|
|
48
|
+
if (env['ANTIGRAVITY_CONFIG_DIR'])
|
|
49
|
+
return expandTilde(env['ANTIGRAVITY_CONFIG_DIR']);
|
|
50
|
+
const base = node_path_1.default.join(home, '.gemini');
|
|
51
|
+
const candidates = [
|
|
52
|
+
node_path_1.default.join(base, 'antigravity'),
|
|
53
|
+
node_path_1.default.join(base, 'antigravity-ide'),
|
|
54
|
+
node_path_1.default.join(base, 'antigravity-cli'),
|
|
55
|
+
];
|
|
56
|
+
for (const candidate of candidates) {
|
|
57
|
+
if (existsSyncFn(candidate))
|
|
58
|
+
return candidate;
|
|
59
|
+
}
|
|
60
|
+
return node_path_1.default.join(base, 'antigravity');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Return the global config base directory for the given runtime.
|
|
64
|
+
* Respects the same env-var overrides as bin/install.js getGlobalDir().
|
|
65
|
+
*/
|
|
66
|
+
function getGlobalConfigDir(runtime) {
|
|
67
|
+
const home = node_os_1.default.homedir();
|
|
68
|
+
const env = process.env;
|
|
69
|
+
switch (runtime) {
|
|
70
|
+
// ── Claude Code ──────────────────────────────────────────────────────────
|
|
71
|
+
case 'claude':
|
|
72
|
+
return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
|
|
73
|
+
// ── Cursor ───────────────────────────────────────────────────────────────
|
|
74
|
+
case 'cursor':
|
|
75
|
+
return env['CURSOR_CONFIG_DIR'] ? expandTilde(env['CURSOR_CONFIG_DIR']) : node_path_1.default.join(home, '.cursor');
|
|
76
|
+
// ── Gemini CLI ───────────────────────────────────────────────────────────
|
|
77
|
+
case 'gemini':
|
|
78
|
+
return env['GEMINI_CONFIG_DIR'] ? expandTilde(env['GEMINI_CONFIG_DIR']) : node_path_1.default.join(home, '.gemini');
|
|
79
|
+
// ── Codex ────────────────────────────────────────────────────────────────
|
|
80
|
+
case 'codex':
|
|
81
|
+
return env['CODEX_HOME'] ? expandTilde(env['CODEX_HOME']) : node_path_1.default.join(home, '.codex');
|
|
82
|
+
// ── Grok Build ───────────────────────────────────────────────────────────
|
|
83
|
+
case 'grok':
|
|
84
|
+
return env['GROK_AGENTS_HOME'] ? expandTilde(env['GROK_AGENTS_HOME']) : node_path_1.default.join(home, '.agents');
|
|
85
|
+
// ── Copilot (VS Code) ────────────────────────────────────────────────────
|
|
86
|
+
case 'copilot':
|
|
87
|
+
return env['COPILOT_CONFIG_DIR'] ? expandTilde(env['COPILOT_CONFIG_DIR']) : node_path_1.default.join(home, '.copilot');
|
|
88
|
+
// ── Antigravity ──────────────────────────────────────────────────────────
|
|
89
|
+
case 'antigravity':
|
|
90
|
+
return resolveAntigravityGlobalDir({ env, home });
|
|
91
|
+
// ── Windsurf ─────────────────────────────────────────────────────────────
|
|
92
|
+
case 'windsurf':
|
|
93
|
+
return env['WINDSURF_CONFIG_DIR']
|
|
94
|
+
? expandTilde(env['WINDSURF_CONFIG_DIR'])
|
|
95
|
+
: node_path_1.default.join(home, '.codeium', 'windsurf');
|
|
96
|
+
// ── Augment ──────────────────────────────────────────────────────────────
|
|
97
|
+
case 'augment':
|
|
98
|
+
return env['AUGMENT_CONFIG_DIR'] ? expandTilde(env['AUGMENT_CONFIG_DIR']) : node_path_1.default.join(home, '.augment');
|
|
99
|
+
// ── Trae ─────────────────────────────────────────────────────────────────
|
|
100
|
+
case 'trae':
|
|
101
|
+
return env['TRAE_CONFIG_DIR'] ? expandTilde(env['TRAE_CONFIG_DIR']) : node_path_1.default.join(home, '.trae');
|
|
102
|
+
// ── Qwen Code ────────────────────────────────────────────────────────────
|
|
103
|
+
case 'qwen':
|
|
104
|
+
return env['QWEN_CONFIG_DIR'] ? expandTilde(env['QWEN_CONFIG_DIR']) : node_path_1.default.join(home, '.qwen');
|
|
105
|
+
// ── Hermes Agent ─────────────────────────────────────────────────────────
|
|
106
|
+
case 'hermes':
|
|
107
|
+
return env['HERMES_HOME'] ? expandTilde(env['HERMES_HOME']) : node_path_1.default.join(home, '.hermes');
|
|
108
|
+
// ── CodeBuddy ────────────────────────────────────────────────────────────
|
|
109
|
+
case 'codebuddy':
|
|
110
|
+
return env['CODEBUDDY_CONFIG_DIR'] ? expandTilde(env['CODEBUDDY_CONFIG_DIR']) : node_path_1.default.join(home, '.codebuddy');
|
|
111
|
+
// ── Cline ────────────────────────────────────────────────────────────────
|
|
112
|
+
case 'cline':
|
|
113
|
+
return env['CLINE_CONFIG_DIR'] ? expandTilde(env['CLINE_CONFIG_DIR']) : node_path_1.default.join(home, '.cline');
|
|
114
|
+
// ── OpenCode (XDG) ───────────────────────────────────────────────────────
|
|
115
|
+
case 'opencode': {
|
|
116
|
+
if (env['OPENCODE_CONFIG_DIR'])
|
|
117
|
+
return expandTilde(env['OPENCODE_CONFIG_DIR']);
|
|
118
|
+
if (env['XDG_CONFIG_HOME'])
|
|
119
|
+
return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'opencode');
|
|
120
|
+
return node_path_1.default.join(home, '.config', 'opencode');
|
|
121
|
+
}
|
|
122
|
+
// ── Kilo (XDG) ───────────────────────────────────────────────────────────
|
|
123
|
+
case 'kilo': {
|
|
124
|
+
if (env['KILO_CONFIG_DIR'])
|
|
125
|
+
return expandTilde(env['KILO_CONFIG_DIR']);
|
|
126
|
+
if (env['XDG_CONFIG_HOME'])
|
|
127
|
+
return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'kilo');
|
|
128
|
+
return node_path_1.default.join(home, '.config', 'kilo');
|
|
129
|
+
}
|
|
130
|
+
// ── Default (Claude fallback) ─────────────────────────────────────────────
|
|
131
|
+
default:
|
|
132
|
+
return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Return the global skills base directory for the given runtime.
|
|
137
|
+
* Most runtimes: <configDir>/skills
|
|
138
|
+
* Hermes: <configDir>/skills/gsd (nested category layout — #2841)
|
|
139
|
+
* Cline: null (rules-based, no skills directory)
|
|
140
|
+
*/
|
|
141
|
+
function getGlobalSkillsBase(runtime) {
|
|
142
|
+
if (runtime === 'cline')
|
|
143
|
+
return null;
|
|
144
|
+
const configDir = getGlobalConfigDir(runtime);
|
|
145
|
+
if (runtime === 'hermes')
|
|
146
|
+
return node_path_1.default.join(configDir, 'skills', 'gsd');
|
|
147
|
+
return node_path_1.default.join(configDir, 'skills');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Return the full path to a specific skill's directory for the given runtime.
|
|
151
|
+
* Returns null for runtimes that don't use a skills directory (cline).
|
|
152
|
+
*/
|
|
153
|
+
function getGlobalSkillDir(runtime, skillName) {
|
|
154
|
+
const base = getGlobalSkillsBase(runtime);
|
|
155
|
+
if (base === null)
|
|
156
|
+
return null;
|
|
157
|
+
return node_path_1.default.join(base, skillName);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Return a human-readable display path for a global skill (for log messages).
|
|
161
|
+
*/
|
|
162
|
+
function getGlobalSkillDisplayPath(runtime, skillName) {
|
|
163
|
+
const dir = getGlobalSkillDir(runtime, skillName);
|
|
164
|
+
if (!dir)
|
|
165
|
+
return `(${runtime} does not use a skills directory)`;
|
|
166
|
+
// Replace homedir prefix with ~ for readability
|
|
167
|
+
const home = node_os_1.default.homedir();
|
|
168
|
+
return dir.startsWith(home) ? '~' + dir.slice(home.length) : dir;
|
|
169
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Runtime name policy — alias resolution and canonicalization for GSD runtime
|
|
4
|
+
* identifiers (ADR-457 build-at-publish: the hand-written
|
|
5
|
+
* bin/lib/runtime-name-policy.cjs collapsed to a TypeScript source of truth).
|
|
6
|
+
* Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
|
|
7
|
+
* only types are added.
|
|
8
|
+
*
|
|
9
|
+
* Group C cross-import candidate: no bin/lib sibling dependencies; only
|
|
10
|
+
* node:fs and node:path. Once this module is migrated, runtime-slash.cjs
|
|
11
|
+
* (which imports runtime-name-policy.cjs) becomes the first true cross-import
|
|
12
|
+
* proof candidate.
|
|
13
|
+
*/
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.canonicalizeRuntimeName = canonicalizeRuntimeName;
|
|
19
|
+
exports.resolveRuntimeNameFromCandidates = resolveRuntimeNameFromCandidates;
|
|
20
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
21
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
22
|
+
const FALLBACK_ALIASES = {
|
|
23
|
+
claude: ['claude', 'claude-code', 'claude-cli'],
|
|
24
|
+
opencode: ['opencode', 'open-code', 'opencode-cli'],
|
|
25
|
+
kilo: ['kilo', 'kilo-cli'],
|
|
26
|
+
gemini: ['gemini', 'gemini-cli', 'gemini-code'],
|
|
27
|
+
codex: ['codex', 'codex-app', 'codex-cli', 'codex_desktop', 'codex-desktop'],
|
|
28
|
+
copilot: ['copilot', 'copilot-cli', 'github-copilot'],
|
|
29
|
+
antigravity: ['antigravity', 'antigravity-cli', 'antigravity-agent'],
|
|
30
|
+
cursor: ['cursor', 'cursor-cli', 'cursor-nightly'],
|
|
31
|
+
windsurf: ['windsurf', 'windsurf-cli', 'windsurf-next'],
|
|
32
|
+
augment: ['augment', 'augment-code', 'augment-cli'],
|
|
33
|
+
trae: ['trae', 'trae-cli'],
|
|
34
|
+
qwen: ['qwen', 'qwen-code', 'qwen-cli'],
|
|
35
|
+
hermes: ['hermes', 'hermes-agent', 'hermes-cli'],
|
|
36
|
+
codebuddy: ['codebuddy', 'codebuddy-cli'],
|
|
37
|
+
cline: ['cline', 'cline-cli'],
|
|
38
|
+
};
|
|
39
|
+
function normalizeRuntimeToken(value) {
|
|
40
|
+
return String(value).trim().toLowerCase().replace(/[_\s]+/g, '-');
|
|
41
|
+
}
|
|
42
|
+
function loadAliasManifest() {
|
|
43
|
+
const manifestCandidates = [
|
|
44
|
+
node_path_1.default.resolve(__dirname, '..', 'shared', 'runtime-aliases.manifest.json'),
|
|
45
|
+
node_path_1.default.resolve(__dirname, '../../../sdk/shared/runtime-aliases.manifest.json'),
|
|
46
|
+
];
|
|
47
|
+
for (const manifestPath of manifestCandidates) {
|
|
48
|
+
try {
|
|
49
|
+
const parsed = JSON.parse(node_fs_1.default.readFileSync(manifestPath, 'utf8'));
|
|
50
|
+
if (parsed && typeof parsed === 'object')
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Try next candidate.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { ...FALLBACK_ALIASES };
|
|
58
|
+
}
|
|
59
|
+
const aliasManifest = loadAliasManifest();
|
|
60
|
+
const aliasToCanonical = new Map();
|
|
61
|
+
for (const [canonical, aliases] of Object.entries(aliasManifest)) {
|
|
62
|
+
if (typeof canonical !== 'string' || !Array.isArray(aliases))
|
|
63
|
+
continue;
|
|
64
|
+
aliasToCanonical.set(normalizeRuntimeToken(canonical), normalizeRuntimeToken(canonical));
|
|
65
|
+
for (const alias of aliases) {
|
|
66
|
+
if (typeof alias !== 'string')
|
|
67
|
+
continue;
|
|
68
|
+
aliasToCanonical.set(normalizeRuntimeToken(alias), normalizeRuntimeToken(canonical));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function canonicalizeRuntimeName(value) {
|
|
72
|
+
if (typeof value !== 'string')
|
|
73
|
+
return null;
|
|
74
|
+
return aliasToCanonical.get(normalizeRuntimeToken(value)) || null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve runtime from a precedence list of candidate values.
|
|
78
|
+
*
|
|
79
|
+
* - First non-empty string candidate wins.
|
|
80
|
+
* - Known aliases are canonicalized (codex-cli -> codex).
|
|
81
|
+
* - Unknown values are normalized and returned (future-runtime tolerance).
|
|
82
|
+
*
|
|
83
|
+
* @param candidates - string candidates in precedence order
|
|
84
|
+
* @returns the resolved runtime name, or null if no valid candidate
|
|
85
|
+
*/
|
|
86
|
+
function resolveRuntimeNameFromCandidates(...candidates) {
|
|
87
|
+
for (const candidate of candidates) {
|
|
88
|
+
if (typeof candidate !== 'string')
|
|
89
|
+
continue;
|
|
90
|
+
const normalized = normalizeRuntimeToken(candidate);
|
|
91
|
+
if (!normalized)
|
|
92
|
+
continue;
|
|
93
|
+
return canonicalizeRuntimeName(normalized) || normalized;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* runtime-slash.cts — single source of truth for emitting GSD slash-command
|
|
4
|
+
* references in user-facing runtime output (recommended-actions JSON, persisted
|
|
5
|
+
* ROADMAP.md entries, verify/validate fix hints, error messages, etc.).
|
|
6
|
+
*
|
|
7
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/runtime-slash.cjs collapsed
|
|
8
|
+
* to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
|
|
9
|
+
* the prior hand-written .cjs; only types are added.
|
|
10
|
+
*
|
|
11
|
+
* Background: #2808 unified all GSD skill installs to register under the hyphen
|
|
12
|
+
* form (`name: gsd-<cmd>`). The legacy colon form `/gsd:<cmd>` is no longer
|
|
13
|
+
* routable by Claude Code skill installs, but ~50 runtime emissions in
|
|
14
|
+
* bin/lib/*.cjs still hardcoded it (#3584). Codex installs need the shell-var
|
|
15
|
+
* `$gsd-<cmd>` form. This module is the only place the runtime should decide
|
|
16
|
+
* which shape to emit.
|
|
17
|
+
*
|
|
18
|
+
* - codex: $gsd-<cmd> (shell-var syntax)
|
|
19
|
+
* - claude, cursor, opencode, kilo, etc.: /gsd-<cmd>
|
|
20
|
+
*
|
|
21
|
+
* The colon form is never emitted.
|
|
22
|
+
*
|
|
23
|
+
* Cross-import proof candidate (ADR-457): this is the first TS source that
|
|
24
|
+
* imports a sibling TS-migrated module. The import specifier uses the .cjs
|
|
25
|
+
* extension per nodenext convention; tsc resolves it to src/runtime-name-policy.cts.
|
|
26
|
+
*/
|
|
27
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
28
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.formatGsdSlash = formatGsdSlash;
|
|
32
|
+
exports.resolveRuntime = resolveRuntime;
|
|
33
|
+
exports.formatGsdSlashFor = formatGsdSlashFor;
|
|
34
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
35
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
36
|
+
const runtime_name_policy_cjs_1 = require("./runtime-name-policy.cjs");
|
|
37
|
+
function formatGsdSlash(commandName, runtime) {
|
|
38
|
+
if (typeof commandName !== 'string')
|
|
39
|
+
return commandName;
|
|
40
|
+
if (commandName === '')
|
|
41
|
+
return commandName;
|
|
42
|
+
// Strip any existing leading prefix so the helper is idempotent and accepts
|
|
43
|
+
// both legacy `/gsd:<name>` and canonical hyphen-form input (plus the bare
|
|
44
|
+
// `gsd:<name>` shorthand and codex `$gsd-<name>` shell-var input).
|
|
45
|
+
const stripped = commandName.replace(/^[/$]?gsd[-:]/i, '');
|
|
46
|
+
// If the regex matched nothing (no prefix), the input is already a bare name.
|
|
47
|
+
const bare = stripped === commandName ? commandName : stripped;
|
|
48
|
+
// Defensive: a degenerate input like `/gsd:`, `gsd-`, or whitespace-only
|
|
49
|
+
// normalizes to empty. Returning the original colon-form would re-emit the
|
|
50
|
+
// deprecated shape that this module exists to suppress (#3584). Return an
|
|
51
|
+
// empty string so callers see "no command" rather than the broken input.
|
|
52
|
+
if (bare === '' || bare.trim() === '')
|
|
53
|
+
return '';
|
|
54
|
+
// Split on the first whitespace so only the command token is rewritten —
|
|
55
|
+
// anything after the first space is caller-supplied arguments (phase
|
|
56
|
+
// numbers, --flags, --paths C:\\Users\\Me, etc.) that must round-trip
|
|
57
|
+
// untouched. Codex lowercases only the command token; preserving the
|
|
58
|
+
// argument tail prevents path/flag corruption on case-sensitive systems.
|
|
59
|
+
const wsMatch = bare.match(/^(\S+)(\s[\s\S]*)?$/);
|
|
60
|
+
const token = wsMatch ? wsMatch[1] : bare;
|
|
61
|
+
const tail = wsMatch && wsMatch[2] ? wsMatch[2] : '';
|
|
62
|
+
const runtimeText = (typeof runtime === 'string' && runtime ? runtime : 'claude').toLowerCase();
|
|
63
|
+
const rt = (0, runtime_name_policy_cjs_1.canonicalizeRuntimeName)(runtimeText) || runtimeText;
|
|
64
|
+
if (rt === 'codex') {
|
|
65
|
+
// Codex skills are invoked as $gsd-<cmd> (shell-var syntax). The command
|
|
66
|
+
// token is lowercased because shell-var identifiers are conventionally
|
|
67
|
+
// lowercase; matches the convertCodexSlash() projection in bin/install.js.
|
|
68
|
+
return `$gsd-${token.toLowerCase()}${tail}`;
|
|
69
|
+
}
|
|
70
|
+
return `/gsd-${token}${tail}`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Resolve the effective runtime for a project directory.
|
|
74
|
+
*
|
|
75
|
+
* process.env.GSD_RUNTIME > config.runtime > 'claude'
|
|
76
|
+
*
|
|
77
|
+
* Mirrors the precedence already used by profile-output.cjs and the rest of
|
|
78
|
+
* the runtime resolution chain. Returns a lowercased string so downstream
|
|
79
|
+
* comparisons can be case-blind.
|
|
80
|
+
*
|
|
81
|
+
* @param projectDir - path to the project directory, or null/undefined
|
|
82
|
+
* @returns the resolved runtime name
|
|
83
|
+
*/
|
|
84
|
+
function resolveRuntime(projectDir) {
|
|
85
|
+
const envRuntime = (0, runtime_name_policy_cjs_1.resolveRuntimeNameFromCandidates)(process.env['GSD_RUNTIME']);
|
|
86
|
+
if (envRuntime)
|
|
87
|
+
return envRuntime;
|
|
88
|
+
if (projectDir) {
|
|
89
|
+
try {
|
|
90
|
+
// Read config.json directly (not via loadConfig). loadConfig has a side
|
|
91
|
+
// effect of normalizing and re-writing legacy keys back to disk, which
|
|
92
|
+
// would mutate the project file just to read the runtime name. We only
|
|
93
|
+
// need the literal `runtime:` value, so a plain JSON read is sufficient
|
|
94
|
+
// and side-effect-free.
|
|
95
|
+
const configPath = node_path_1.default.join(projectDir, '.planning', 'config.json');
|
|
96
|
+
if (node_fs_1.default.existsSync(configPath)) {
|
|
97
|
+
const raw = node_fs_1.default.readFileSync(configPath, 'utf-8');
|
|
98
|
+
const parsed = JSON.parse(raw);
|
|
99
|
+
if (parsed && typeof parsed === 'object' && 'runtime' in parsed) {
|
|
100
|
+
const configRuntime = (0, runtime_name_policy_cjs_1.resolveRuntimeNameFromCandidates)(parsed['runtime']);
|
|
101
|
+
if (configRuntime)
|
|
102
|
+
return configRuntime;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Fall through to default — a missing/broken config must not crash
|
|
108
|
+
// runtime output formatting.
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return 'claude';
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Convenience: format using the runtime resolved from a project directory.
|
|
115
|
+
* Equivalent to `formatGsdSlash(name, resolveRuntime(projectDir))`.
|
|
116
|
+
*/
|
|
117
|
+
function formatGsdSlashFor(projectDir, commandName) {
|
|
118
|
+
return formatGsdSlash(commandName, resolveRuntime(projectDir));
|
|
119
|
+
}
|