@therocketcode/gsd-core 1.4.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/.claude-plugin/plugin.json +23 -0
- package/GEMINI.md +53 -0
- package/LICENSE +21 -0
- package/README.ja-JP.md +125 -0
- package/README.ko-KR.md +125 -0
- package/README.md +144 -0
- package/README.pt-BR.md +125 -0
- package/README.zh-CN.md +125 -0
- package/agents/gsd-advisor-researcher.md +108 -0
- package/agents/gsd-ai-researcher.md +114 -0
- package/agents/gsd-assumptions-analyzer.md +105 -0
- package/agents/gsd-code-fixer.md +668 -0
- package/agents/gsd-code-reviewer.md +387 -0
- package/agents/gsd-codebase-mapper.md +853 -0
- package/agents/gsd-debug-session-manager.md +314 -0
- package/agents/gsd-debugger.md +1452 -0
- package/agents/gsd-doc-classifier.md +168 -0
- package/agents/gsd-doc-synthesizer.md +204 -0
- package/agents/gsd-doc-verifier.md +217 -0
- package/agents/gsd-doc-writer.md +616 -0
- package/agents/gsd-domain-researcher.md +147 -0
- package/agents/gsd-eval-auditor.md +191 -0
- package/agents/gsd-eval-planner.md +154 -0
- package/agents/gsd-executor.md +785 -0
- package/agents/gsd-framework-selector.md +160 -0
- package/agents/gsd-integration-checker.md +470 -0
- package/agents/gsd-intel-updater.md +342 -0
- package/agents/gsd-nyquist-auditor.md +203 -0
- package/agents/gsd-pattern-mapper.md +335 -0
- package/agents/gsd-phase-researcher.md +867 -0
- package/agents/gsd-plan-checker.md +978 -0
- package/agents/gsd-planner.md +1204 -0
- package/agents/gsd-project-researcher.md +611 -0
- package/agents/gsd-research-synthesizer.md +259 -0
- package/agents/gsd-roadmapper.md +688 -0
- package/agents/gsd-security-auditor.md +155 -0
- package/agents/gsd-ui-auditor.md +495 -0
- package/agents/gsd-ui-checker.md +309 -0
- package/agents/gsd-ui-researcher.md +374 -0
- package/agents/gsd-user-profiler.md +171 -0
- package/agents/gsd-verifier.md +923 -0
- 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 +12726 -0
- package/bin/lib/ui-safety-gate.cjs +107 -0
- package/commands/gsd/add-tests.md +42 -0
- package/commands/gsd/ai-integration-phase.md +37 -0
- package/commands/gsd/audit-fix.md +34 -0
- package/commands/gsd/audit-milestone.md +37 -0
- package/commands/gsd/audit-uat.md +24 -0
- package/commands/gsd/autonomous.md +48 -0
- package/commands/gsd/capture.md +62 -0
- package/commands/gsd/cleanup.md +24 -0
- package/commands/gsd/code-review.md +59 -0
- package/commands/gsd/complete-milestone.md +143 -0
- package/commands/gsd/config.md +56 -0
- package/commands/gsd/debug.md +52 -0
- package/commands/gsd/discover-product.md +65 -0
- package/commands/gsd/discuss-phase.md +77 -0
- package/commands/gsd/docs-update.md +49 -0
- package/commands/gsd/eval-review.md +33 -0
- package/commands/gsd/execute-phase.md +66 -0
- package/commands/gsd/explore.md +27 -0
- package/commands/gsd/extract-learnings.md +23 -0
- package/commands/gsd/fast.md +31 -0
- package/commands/gsd/forensics.md +57 -0
- package/commands/gsd/graphify.md +204 -0
- package/commands/gsd/health.md +31 -0
- package/commands/gsd/help.md +28 -0
- package/commands/gsd/import.md +45 -0
- package/commands/gsd/inbox.md +39 -0
- package/commands/gsd/ingest-docs.md +42 -0
- package/commands/gsd/manager.md +45 -0
- package/commands/gsd/map-codebase.md +83 -0
- package/commands/gsd/milestone-summary.md +51 -0
- package/commands/gsd/model-domain.md +65 -0
- package/commands/gsd/mvp-phase.md +45 -0
- package/commands/gsd/new-milestone.md +45 -0
- package/commands/gsd/new-project.md +47 -0
- package/commands/gsd/ns-context.md +23 -0
- package/commands/gsd/ns-ideate.md +24 -0
- package/commands/gsd/ns-manage.md +29 -0
- package/commands/gsd/ns-project.md +22 -0
- package/commands/gsd/ns-review.md +26 -0
- package/commands/gsd/ns-workflow.md +28 -0
- package/commands/gsd/pause-work.md +43 -0
- package/commands/gsd/phase.md +56 -0
- package/commands/gsd/plan-phase.md +64 -0
- package/commands/gsd/plan-review-convergence.md +59 -0
- package/commands/gsd/pr-branch.md +26 -0
- package/commands/gsd/profile-user.md +46 -0
- package/commands/gsd/progress.md +48 -0
- package/commands/gsd/quick.md +174 -0
- package/commands/gsd/recommend-architecture.md +64 -0
- package/commands/gsd/resume-work.md +30 -0
- package/commands/gsd/review-backlog.md +63 -0
- package/commands/gsd/review.md +42 -0
- package/commands/gsd/secure-phase.md +36 -0
- package/commands/gsd/settings.md +29 -0
- package/commands/gsd/ship.md +24 -0
- package/commands/gsd/sketch.md +60 -0
- package/commands/gsd/spec-phase.md +63 -0
- package/commands/gsd/spike.md +57 -0
- package/commands/gsd/stats.md +20 -0
- package/commands/gsd/surface.md +155 -0
- package/commands/gsd/testing-strategy.md +65 -0
- package/commands/gsd/thread.md +24 -0
- package/commands/gsd/ui-phase.md +35 -0
- package/commands/gsd/ui-review.md +33 -0
- package/commands/gsd/ultraplan-phase.md +34 -0
- package/commands/gsd/undo.md +35 -0
- package/commands/gsd/update.md +49 -0
- package/commands/gsd/validate-phase.md +36 -0
- package/commands/gsd/verify-work.md +39 -0
- package/commands/gsd/workspace.md +52 -0
- package/commands/gsd/workstreams.md +70 -0
- package/gemini-extension.json +6 -0
- package/gsd-core/bin/check-latest-version.cjs +161 -0
- package/gsd-core/bin/gsd-tools.cjs +1928 -0
- 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 +343 -0
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
- package/gsd-core/bin/lib/cli-exit.cjs +42 -0
- package/gsd-core/bin/lib/clock.cjs +95 -0
- package/gsd-core/bin/lib/clusters.cjs +132 -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 +1203 -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 +738 -0
- package/gsd-core/bin/lib/configuration.cjs +239 -0
- package/gsd-core/bin/lib/context-utilization.cjs +48 -0
- package/gsd-core/bin/lib/core.cjs +2051 -0
- package/gsd-core/bin/lib/decisions.cjs +118 -0
- 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 +1815 -0
- package/gsd-core/bin/lib/install-profiles.cjs +584 -0
- package/gsd-core/bin/lib/installer-migration-authoring.cjs +122 -0
- package/gsd-core/bin/lib/installer-migration-report.cjs +350 -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 +590 -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/gsd-core/bin/lib/observability/redaction.cjs +48 -0
- package/gsd-core/bin/lib/package-identity.cjs +35 -0
- package/gsd-core/bin/lib/package-legitimacy.cjs +368 -0
- 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/gsd-core/bin/lib/plan-scan.cjs +91 -0
- 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/research-provider.cjs +137 -0
- package/gsd-core/bin/lib/research-store.cjs +167 -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 +476 -0
- package/gsd-core/bin/lib/roadmap.cjs +600 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +312 -0
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +56 -0
- package/gsd-core/bin/lib/runtime-homes.cjs +190 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
- package/gsd-core/bin/lib/schema-detect.cjs +159 -0
- package/gsd-core/bin/lib/secrets.cjs +34 -0
- package/gsd-core/bin/lib/security.cjs +480 -0
- package/gsd-core/bin/lib/semver-compare.cjs +42 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +533 -0
- package/gsd-core/bin/lib/state-command-router.cjs +160 -0
- package/gsd-core/bin/lib/state-document.cjs +259 -0
- package/gsd-core/bin/lib/state.cjs +2010 -0
- package/gsd-core/bin/lib/surface.cjs +449 -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/verification-command-router.cjs +31 -0
- package/gsd-core/bin/lib/verification.cjs +193 -0
- package/gsd-core/bin/lib/verify-command-router.cjs +44 -0
- package/gsd-core/bin/lib/verify.cjs +1451 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +81 -0
- package/gsd-core/bin/lib/workstream-inventory.cjs +147 -0
- package/gsd-core/bin/lib/workstream-name-policy.cjs +91 -0
- package/gsd-core/bin/lib/workstream.cjs +380 -0
- package/gsd-core/bin/lib/worktree-base-ref.cjs +325 -0
- package/gsd-core/bin/lib/worktree-safety.cjs +943 -0
- package/gsd-core/bin/shared/config-defaults.manifest.json +98 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +192 -0
- package/gsd-core/bin/shared/model-catalog.json +149 -0
- package/gsd-core/bin/shared/runtime-aliases.manifest.json +75 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +349 -0
- package/gsd-core/contexts/dev.md +21 -0
- package/gsd-core/contexts/research.md +22 -0
- package/gsd-core/contexts/review.md +23 -0
- package/gsd-core/references/agent-contracts.md +79 -0
- package/gsd-core/references/ai-evals.md +156 -0
- package/gsd-core/references/ai-frameworks.md +186 -0
- package/gsd-core/references/architecture-decision.md +74 -0
- package/gsd-core/references/artifact-types.md +131 -0
- package/gsd-core/references/auth-in-tests.md +91 -0
- package/gsd-core/references/autonomous-smart-discuss.md +277 -0
- package/gsd-core/references/checkpoints.md +814 -0
- package/gsd-core/references/common-bug-patterns.md +114 -0
- package/gsd-core/references/context-budget.md +85 -0
- package/gsd-core/references/continuation-format.md +253 -0
- package/gsd-core/references/db-test-isolation.md +54 -0
- package/gsd-core/references/debugger-philosophy.md +76 -0
- package/gsd-core/references/decimal-phase-calculation.md +64 -0
- package/gsd-core/references/doc-conflict-engine.md +91 -0
- package/gsd-core/references/domain-modeling.md +80 -0
- package/gsd-core/references/domain-probes.md +125 -0
- package/gsd-core/references/e2e-tiering.md +35 -0
- package/gsd-core/references/execute-mvp-tdd.md +81 -0
- package/gsd-core/references/executor-examples.md +110 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +73 -0
- package/gsd-core/references/few-shot-examples/verifier.md +109 -0
- package/gsd-core/references/flaky-test-checklist.md +22 -0
- package/gsd-core/references/gate-prompts.md +100 -0
- package/gsd-core/references/gates.md +70 -0
- package/gsd-core/references/git-integration.md +298 -0
- package/gsd-core/references/git-planning-commit.md +40 -0
- package/gsd-core/references/ios-scaffold.md +123 -0
- package/gsd-core/references/mandatory-initial-read.md +2 -0
- package/gsd-core/references/model-profile-resolution.md +38 -0
- package/gsd-core/references/model-profiles.md +245 -0
- package/gsd-core/references/mvp-concepts.md +49 -0
- package/gsd-core/references/phase-argument-parsing.md +61 -0
- package/gsd-core/references/planner-antipatterns.md +89 -0
- package/gsd-core/references/planner-chunked.md +49 -0
- package/gsd-core/references/planner-gap-closure.md +62 -0
- package/gsd-core/references/planner-graphify-auto-update.md +67 -0
- package/gsd-core/references/planner-human-verify-mode.md +57 -0
- package/gsd-core/references/planner-interface-context.md +62 -0
- package/gsd-core/references/planner-load-graph-context.md +36 -0
- package/gsd-core/references/planner-mvp-mode.md +53 -0
- package/gsd-core/references/planner-reviews.md +39 -0
- package/gsd-core/references/planner-revision.md +87 -0
- package/gsd-core/references/planner-source-audit.md +73 -0
- package/gsd-core/references/planning-config.md +473 -0
- package/gsd-core/references/product-discovery.md +49 -0
- package/gsd-core/references/project-skills-discovery.md +19 -0
- package/gsd-core/references/questioning.md +162 -0
- package/gsd-core/references/realistic-test-data.md +44 -0
- package/gsd-core/references/research-documentation-lookup.md +29 -0
- package/gsd-core/references/research-philosophy.md +29 -0
- package/gsd-core/references/research-verification-protocol.md +27 -0
- package/gsd-core/references/revision-loop.md +97 -0
- package/gsd-core/references/scout-codebase.md +51 -0
- package/gsd-core/references/skeleton-template.md +48 -0
- package/gsd-core/references/sketch-interactivity.md +41 -0
- package/gsd-core/references/sketch-theme-system.md +94 -0
- package/gsd-core/references/sketch-tooling.md +45 -0
- package/gsd-core/references/sketch-variant-patterns.md +81 -0
- package/gsd-core/references/spidr-splitting.md +69 -0
- package/gsd-core/references/tdd.md +330 -0
- package/gsd-core/references/test-containers.md +55 -0
- package/gsd-core/references/test-strategy.md +75 -0
- package/gsd-core/references/thinking-models-debug.md +44 -0
- package/gsd-core/references/thinking-models-execution.md +50 -0
- package/gsd-core/references/thinking-models-planning.md +62 -0
- package/gsd-core/references/thinking-models-research.md +50 -0
- package/gsd-core/references/thinking-models-verification.md +55 -0
- package/gsd-core/references/thinking-partner.md +96 -0
- package/gsd-core/references/ui-brand.md +162 -0
- package/gsd-core/references/universal-anti-patterns.md +63 -0
- package/gsd-core/references/user-profiling.md +681 -0
- package/gsd-core/references/user-story-template.md +58 -0
- package/gsd-core/references/verification-overrides.md +227 -0
- package/gsd-core/references/verification-patterns.md +612 -0
- package/gsd-core/references/verify-mvp-mode.md +85 -0
- package/gsd-core/references/workstream-flag.md +111 -0
- package/gsd-core/references/worktree-branch-check.md +38 -0
- package/gsd-core/references/worktree-path-safety.md +67 -0
- package/gsd-core/templates/AI-SPEC.md +246 -0
- package/gsd-core/templates/DEBUG.md +169 -0
- package/gsd-core/templates/README.md +77 -0
- package/gsd-core/templates/SECURITY.md +61 -0
- package/gsd-core/templates/UAT.md +265 -0
- package/gsd-core/templates/UI-SPEC.md +100 -0
- package/gsd-core/templates/VALIDATION.md +76 -0
- package/gsd-core/templates/adr.md +58 -0
- package/gsd-core/templates/claude-md.md +145 -0
- package/gsd-core/templates/codebase/architecture.md +255 -0
- package/gsd-core/templates/codebase/concerns.md +310 -0
- package/gsd-core/templates/codebase/conventions.md +307 -0
- package/gsd-core/templates/codebase/integrations.md +280 -0
- package/gsd-core/templates/codebase/stack.md +186 -0
- package/gsd-core/templates/codebase/structure.md +285 -0
- package/gsd-core/templates/codebase/testing.md +480 -0
- package/gsd-core/templates/config.json +62 -0
- package/gsd-core/templates/context.md +352 -0
- package/gsd-core/templates/continue-here.md +78 -0
- package/gsd-core/templates/copilot-instructions.md +7 -0
- package/gsd-core/templates/debug-subagent-prompt.md +91 -0
- package/gsd-core/templates/dev-preferences.md +21 -0
- package/gsd-core/templates/discovery.md +146 -0
- package/gsd-core/templates/discussion-log.md +63 -0
- package/gsd-core/templates/domain-model.md +54 -0
- package/gsd-core/templates/milestone-archive.md +123 -0
- package/gsd-core/templates/milestone.md +115 -0
- package/gsd-core/templates/phase-prompt.md +610 -0
- package/gsd-core/templates/planner-subagent-prompt.md +117 -0
- package/gsd-core/templates/product-brief.md +55 -0
- package/gsd-core/templates/project.md +186 -0
- package/gsd-core/templates/requirements.md +231 -0
- package/gsd-core/templates/research-project/ARCHITECTURE.md +204 -0
- package/gsd-core/templates/research-project/FEATURES.md +147 -0
- package/gsd-core/templates/research-project/PITFALLS.md +200 -0
- package/gsd-core/templates/research-project/STACK.md +120 -0
- package/gsd-core/templates/research-project/SUMMARY.md +170 -0
- package/gsd-core/templates/research.md +592 -0
- package/gsd-core/templates/retrospective.md +54 -0
- package/gsd-core/templates/roadmap.md +202 -0
- package/gsd-core/templates/spec.md +307 -0
- package/gsd-core/templates/state.md +195 -0
- package/gsd-core/templates/summary-complex.md +59 -0
- package/gsd-core/templates/summary-minimal.md +41 -0
- package/gsd-core/templates/summary-standard.md +48 -0
- package/gsd-core/templates/summary.md +248 -0
- package/gsd-core/templates/test-strategy.md +50 -0
- package/gsd-core/templates/user-profile.md +146 -0
- package/gsd-core/templates/user-setup.md +311 -0
- package/gsd-core/templates/verification-report.md +322 -0
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -0
- package/gsd-core/workflows/add-backlog.md +91 -0
- package/gsd-core/workflows/add-phase.md +113 -0
- package/gsd-core/workflows/add-tests.md +355 -0
- package/gsd-core/workflows/add-todo.md +161 -0
- package/gsd-core/workflows/ai-integration-phase.md +295 -0
- package/gsd-core/workflows/analyze-dependencies.md +96 -0
- package/gsd-core/workflows/audit-fix.md +178 -0
- package/gsd-core/workflows/audit-milestone.md +360 -0
- package/gsd-core/workflows/audit-uat.md +110 -0
- package/gsd-core/workflows/autonomous.md +797 -0
- package/gsd-core/workflows/check-todos.md +180 -0
- package/gsd-core/workflows/cleanup.md +195 -0
- package/gsd-core/workflows/code-review-fix.md +502 -0
- package/gsd-core/workflows/code-review.md +658 -0
- package/gsd-core/workflows/complete-milestone.md +855 -0
- package/gsd-core/workflows/debug.md +237 -0
- package/gsd-core/workflows/diagnose-issues.md +245 -0
- package/gsd-core/workflows/discover-product.md +112 -0
- package/gsd-core/workflows/discovery-phase.md +291 -0
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +176 -0
- package/gsd-core/workflows/discuss-phase/modes/all.md +28 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +44 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +57 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +52 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +98 -0
- package/gsd-core/workflows/discuss-phase/modes/default.md +141 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +44 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +55 -0
- package/gsd-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
- package/gsd-core/workflows/discuss-phase/templates/context.md +136 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +675 -0
- package/gsd-core/workflows/discuss-phase-power.md +291 -0
- package/gsd-core/workflows/discuss-phase.md +499 -0
- package/gsd-core/workflows/do.md +111 -0
- package/gsd-core/workflows/docs-update.md +1176 -0
- package/gsd-core/workflows/edit-phase.md +295 -0
- package/gsd-core/workflows/eval-review.md +156 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
- package/gsd-core/workflows/execute-phase.md +1752 -0
- package/gsd-core/workflows/execute-plan.md +526 -0
- package/gsd-core/workflows/explore.md +146 -0
- package/gsd-core/workflows/extract-learnings.md +243 -0
- package/gsd-core/workflows/fast.md +124 -0
- package/gsd-core/workflows/forensics.md +279 -0
- package/gsd-core/workflows/graduation.md +196 -0
- package/gsd-core/workflows/health.md +224 -0
- package/gsd-core/workflows/help/modes/brief.md +22 -0
- package/gsd-core/workflows/help/modes/default.md +50 -0
- package/gsd-core/workflows/help/modes/full.md +789 -0
- package/gsd-core/workflows/help/modes/topic.md +74 -0
- package/gsd-core/workflows/help.md +24 -0
- package/gsd-core/workflows/import.md +256 -0
- package/gsd-core/workflows/inbox.md +387 -0
- package/gsd-core/workflows/ingest-docs.md +340 -0
- package/gsd-core/workflows/insert-phase.md +152 -0
- package/gsd-core/workflows/list-phase-assumptions.md +178 -0
- package/gsd-core/workflows/list-workspaces.md +57 -0
- package/gsd-core/workflows/manager.md +393 -0
- package/gsd-core/workflows/map-codebase.md +446 -0
- package/gsd-core/workflows/milestone-summary.md +224 -0
- package/gsd-core/workflows/model-domain.md +162 -0
- package/gsd-core/workflows/mvp-phase.md +222 -0
- package/gsd-core/workflows/new-milestone.md +635 -0
- package/gsd-core/workflows/new-project.md +1555 -0
- package/gsd-core/workflows/new-workspace.md +240 -0
- package/gsd-core/workflows/next.md +299 -0
- package/gsd-core/workflows/node-repair.md +92 -0
- package/gsd-core/workflows/note.md +158 -0
- package/gsd-core/workflows/pause-work.md +244 -0
- package/gsd-core/workflows/plan-milestone-gaps.md +281 -0
- package/gsd-core/workflows/plan-phase.md +1814 -0
- package/gsd-core/workflows/plan-review-convergence.md +346 -0
- package/gsd-core/workflows/plant-seed.md +230 -0
- package/gsd-core/workflows/pr-branch.md +157 -0
- package/gsd-core/workflows/profile-user.md +453 -0
- package/gsd-core/workflows/progress.md +699 -0
- package/gsd-core/workflows/quick.md +1017 -0
- package/gsd-core/workflows/reapply-patches.md +426 -0
- package/gsd-core/workflows/recommend-architecture.md +135 -0
- package/gsd-core/workflows/remove-phase.md +156 -0
- package/gsd-core/workflows/remove-workspace.md +108 -0
- package/gsd-core/workflows/resume-project.md +332 -0
- package/gsd-core/workflows/review.md +748 -0
- package/gsd-core/workflows/scan.md +107 -0
- package/gsd-core/workflows/secure-phase.md +182 -0
- package/gsd-core/workflows/session-report.md +146 -0
- package/gsd-core/workflows/settings-advanced.md +810 -0
- package/gsd-core/workflows/settings-integrations.md +312 -0
- package/gsd-core/workflows/settings.md +566 -0
- package/gsd-core/workflows/ship.md +405 -0
- package/gsd-core/workflows/sketch-wrap-up.md +286 -0
- package/gsd-core/workflows/sketch.md +361 -0
- package/gsd-core/workflows/spec-phase.md +263 -0
- package/gsd-core/workflows/spike-wrap-up.md +307 -0
- package/gsd-core/workflows/spike.md +453 -0
- package/gsd-core/workflows/stats.md +80 -0
- package/gsd-core/workflows/sync-skills.md +182 -0
- package/gsd-core/workflows/testing-strategy.md +122 -0
- package/gsd-core/workflows/thread.md +222 -0
- package/gsd-core/workflows/transition.md +694 -0
- package/gsd-core/workflows/ui-phase.md +328 -0
- package/gsd-core/workflows/ui-review.md +193 -0
- package/gsd-core/workflows/ultraplan-phase.md +199 -0
- package/gsd-core/workflows/undo.md +314 -0
- package/gsd-core/workflows/update.md +496 -0
- package/gsd-core/workflows/validate-phase.md +181 -0
- package/gsd-core/workflows/verify-phase.md +544 -0
- package/gsd-core/workflows/verify-work.md +781 -0
- package/hooks/dist/gsd-check-update-worker.js +108 -0
- package/hooks/dist/gsd-check-update.js +66 -0
- package/hooks/dist/gsd-config-reload.js +133 -0
- package/hooks/dist/gsd-context-monitor.js +195 -0
- package/hooks/dist/gsd-cursor-post-tool.js +75 -0
- package/hooks/dist/gsd-cursor-session-start.js +52 -0
- package/hooks/dist/gsd-graphify-update.sh +158 -0
- package/hooks/dist/gsd-phase-boundary.sh +47 -0
- package/hooks/dist/gsd-prompt-guard.js +97 -0
- package/hooks/dist/gsd-read-guard.js +101 -0
- package/hooks/dist/gsd-read-injection-scanner.js +203 -0
- package/hooks/dist/gsd-session-state.sh +59 -0
- package/hooks/dist/gsd-statusline.js +566 -0
- package/hooks/dist/gsd-update-banner.js +138 -0
- package/hooks/dist/gsd-validate-commit.sh +57 -0
- package/hooks/dist/gsd-workflow-guard.js +167 -0
- package/hooks/dist/gsd-worktree-path-guard.js +169 -0
- package/hooks/dist/lib/git-cmd.js +150 -0
- package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/dist/managed-hooks-registry.cjs +38 -0
- package/hooks/gsd-check-update-worker.js +108 -0
- package/hooks/gsd-check-update.js +66 -0
- package/hooks/gsd-config-reload.js +133 -0
- package/hooks/gsd-context-monitor.js +195 -0
- package/hooks/gsd-cursor-post-tool.js +75 -0
- package/hooks/gsd-cursor-session-start.js +52 -0
- package/hooks/gsd-graphify-update.sh +158 -0
- package/hooks/gsd-phase-boundary.sh +47 -0
- package/hooks/gsd-prompt-guard.js +97 -0
- package/hooks/gsd-read-guard.js +101 -0
- package/hooks/gsd-read-injection-scanner.js +203 -0
- package/hooks/gsd-session-state.sh +59 -0
- package/hooks/gsd-statusline.js +566 -0
- package/hooks/gsd-update-banner.js +138 -0
- package/hooks/gsd-validate-commit.sh +57 -0
- package/hooks/gsd-workflow-guard.js +167 -0
- package/hooks/gsd-worktree-path-guard.js +169 -0
- package/hooks/hooks.json +69 -0
- package/hooks/lib/git-cmd.js +150 -0
- package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
- package/hooks/managed-hooks-registry.cjs +38 -0
- package/package.json +115 -0
- package/scripts/affected-tests-lib.cjs +542 -0
- package/scripts/audit-workflow-script-paths.cjs +73 -0
- package/scripts/base64-scan.sh +351 -0
- package/scripts/build-hooks.js +247 -0
- package/scripts/changeset/README.md +129 -0
- package/scripts/changeset/cli.cjs +590 -0
- package/scripts/changeset/github-release-notes.cjs +199 -0
- package/scripts/changeset/lint.cjs +111 -0
- package/scripts/changeset/new.cjs +137 -0
- package/scripts/changeset/parse.cjs +114 -0
- package/scripts/changeset/render.cjs +34 -0
- package/scripts/changeset/serialize.cjs +130 -0
- package/scripts/check-alias-drift.cjs +114 -0
- package/scripts/check-env.cjs +312 -0
- package/scripts/check-npm-integrity.cjs +215 -0
- package/scripts/ci-guard-runner.cjs +22 -0
- package/scripts/ci-prepare-test-scope.cjs +51 -0
- package/scripts/ci-rebase-check.cjs +86 -0
- package/scripts/ci-test-scope.cjs +431 -0
- package/scripts/command-contract-helpers.cjs +64 -0
- package/scripts/diff-touches-shipped-paths.cjs +155 -0
- package/scripts/fix-slash-commands.cjs +147 -0
- package/scripts/gen-inventory-manifest.cjs +115 -0
- package/scripts/gen-research-agents.cjs +276 -0
- package/scripts/generate-package-identity.cjs +125 -0
- package/scripts/issue-dedupe.cjs +278 -0
- package/scripts/lib/allowlist-ratchet.cjs +136 -0
- package/scripts/lib/cli-exit.cjs +56 -0
- package/scripts/lint-command-contract.cjs +114 -0
- package/scripts/lint-descriptions.cjs +87 -0
- package/scripts/lint-docs-required.cjs +222 -0
- package/scripts/lint-legacy-dir-name.cjs +160 -0
- package/scripts/lint-package-identity-drift.cjs +141 -0
- package/scripts/lint-pr-check-project-dir.cjs +99 -0
- package/scripts/lint-shell-command-projection-drift.cjs +62 -0
- package/scripts/lint-skill-deps.cjs +185 -0
- package/scripts/lint-test-file-count.allowlist.json +135 -0
- package/scripts/lint-test-file-count.cjs +246 -0
- package/scripts/mutation-matrix.cjs +222 -0
- package/scripts/pr-template-policy.cjs +268 -0
- package/scripts/prompt-injection-scan.sh +207 -0
- package/scripts/release-notes/discord-release-summary.cjs +373 -0
- package/scripts/release-notes/format-github-release-notes.cjs +261 -0
- package/scripts/release-tarball-smoke.cjs +629 -0
- package/scripts/research-profiles.cjs +149 -0
- package/scripts/run-affected-tests.cjs +7 -0
- package/scripts/run-cross-platform-tests.cjs +67 -0
- package/scripts/run-tests.cjs +315 -0
- package/scripts/secret-scan-lint.sh +231 -0
- package/scripts/secret-scan.sh +358 -0
- package/scripts/setup-branch-protection.sh +236 -0
- package/scripts/strip-prose-atrefs.cjs +106 -0
- package/scripts/sync-manifest-versions.cjs +119 -0
- package/scripts/sync-rulesets.sh +34 -0
- package/scripts/sync-runtime-launcher.cjs +399 -0
- package/scripts/test-failure-reasons.cjs +34 -0
- package/scripts/verify-npm-publish.cjs +240 -0
- package/scripts/workflow-policy.cjs +450 -0
|
@@ -0,0 +1,312 @@
|
|
|
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, stageCommandsForRuntimeFlat, } = 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
|
+
* Build a converted-commands kind descriptor for runtimes that use a flat
|
|
180
|
+
* commands directory with per-file conversion (e.g. Cursor 1.6 slash commands).
|
|
181
|
+
*
|
|
182
|
+
* Unlike `commandsKind` (which passes raw source files through), this kind
|
|
183
|
+
* applies `converterName` from bin/install.js exports to each file during
|
|
184
|
+
* staging, writing flat `${prefix}${stem}.md` files to the staged directory.
|
|
185
|
+
*
|
|
186
|
+
* The staged files are then written by `_copyStaged` (commands branch) which
|
|
187
|
+
* handles prefix logic via the existing layout machinery.
|
|
188
|
+
*
|
|
189
|
+
* @param destSubpath destination subpath within configDir (e.g. 'commands')
|
|
190
|
+
* @param prefix filename prefix, e.g. 'gsd-'
|
|
191
|
+
* @param converterName name of converter function in bin/install.js exports
|
|
192
|
+
* @param configDir runtime config dir (for .gsd-source marker resolution)
|
|
193
|
+
*/
|
|
194
|
+
function convertedCommandsKind(destSubpath, prefix, converterName, configDir) {
|
|
195
|
+
return {
|
|
196
|
+
kind: 'commands',
|
|
197
|
+
destSubpath,
|
|
198
|
+
prefix,
|
|
199
|
+
stage: (resolved) => {
|
|
200
|
+
const installExports = getInstallExports();
|
|
201
|
+
const converter = installExports[converterName];
|
|
202
|
+
return stageCommandsForRuntimeFlat(findInstallSourceRoot(configDir), resolved, converter, prefix);
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Public API
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
/**
|
|
210
|
+
* Resolve the artifact layout for a given runtime and config directory.
|
|
211
|
+
*/
|
|
212
|
+
function resolveRuntimeArtifactLayout(runtime, configDir, scope = 'global') {
|
|
213
|
+
if (typeof configDir !== 'string' || configDir === '') {
|
|
214
|
+
throw new TypeError('configDir must be a non-empty string');
|
|
215
|
+
}
|
|
216
|
+
if (scope !== 'local' && scope !== 'global') {
|
|
217
|
+
throw new TypeError('scope must be "local" or "global"');
|
|
218
|
+
}
|
|
219
|
+
if (!ALLOWED_RUNTIMES.has(runtime)) {
|
|
220
|
+
throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
|
|
221
|
+
}
|
|
222
|
+
let kinds;
|
|
223
|
+
switch (runtime) {
|
|
224
|
+
case 'claude':
|
|
225
|
+
if (scope === 'local') {
|
|
226
|
+
kinds = [
|
|
227
|
+
commandsKind('commands/gsd', 'gsd-', configDir),
|
|
228
|
+
agentsKind('agents', 'gsd-', configDir),
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'claude', configDir)];
|
|
233
|
+
}
|
|
234
|
+
break;
|
|
235
|
+
case 'cursor':
|
|
236
|
+
// Cursor 1.6+ supports two artifact surfaces:
|
|
237
|
+
// 1. skills/gsd-<name>/SKILL.md — rich skills with frontmatter + adapter header
|
|
238
|
+
// 2. commands/gsd-<name>.md — plain markdown slash commands (no frontmatter)
|
|
239
|
+
// accessed via '/' in the Agent input (#785)
|
|
240
|
+
kinds = [
|
|
241
|
+
skillsKind('skills', 'gsd-', 'convertClaudeCommandToCursorSkill', 'cursor', configDir),
|
|
242
|
+
convertedCommandsKind('commands', 'gsd-', 'convertClaudeCommandToCursorCommand', configDir),
|
|
243
|
+
];
|
|
244
|
+
break;
|
|
245
|
+
case 'gemini':
|
|
246
|
+
kinds = [commandsKind('commands/gsd', 'gsd-', configDir)];
|
|
247
|
+
break;
|
|
248
|
+
case 'codex':
|
|
249
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodexSkill', 'codex', configDir)];
|
|
250
|
+
break;
|
|
251
|
+
case 'copilot':
|
|
252
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToCopilotSkill', 'copilot', configDir)];
|
|
253
|
+
break;
|
|
254
|
+
case 'antigravity':
|
|
255
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToAntigravitySkill', 'antigravity', configDir)];
|
|
256
|
+
break;
|
|
257
|
+
case 'windsurf':
|
|
258
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToWindsurfSkill', 'windsurf', configDir)];
|
|
259
|
+
break;
|
|
260
|
+
case 'augment':
|
|
261
|
+
kinds = [
|
|
262
|
+
commandsKind('commands', 'gsd-', configDir),
|
|
263
|
+
skillsKind('skills', 'gsd-', 'convertClaudeCommandToAugmentSkill', 'augment', configDir),
|
|
264
|
+
];
|
|
265
|
+
break;
|
|
266
|
+
case 'trae':
|
|
267
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToTraeSkill', 'trae', configDir)];
|
|
268
|
+
break;
|
|
269
|
+
case 'qwen':
|
|
270
|
+
kinds = [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClaudeSkill', 'qwen', configDir)];
|
|
271
|
+
break;
|
|
272
|
+
case 'hermes':
|
|
273
|
+
kinds = [skillsKind('skills/gsd', '', 'convertClaudeCommandToClaudeSkill', 'hermes', configDir)];
|
|
274
|
+
break;
|
|
275
|
+
case 'codebuddy':
|
|
276
|
+
// CodeBuddy (Tencent) reads two user-level surfaces (codebuddy.ai/docs/cli):
|
|
277
|
+
// 1. commands/gsd-<name>.md — slash commands shown in the '/' menu (#789)
|
|
278
|
+
// 2. skills/gsd-<name>/SKILL.md — model-invocable skills, emitted with
|
|
279
|
+
// user-invocable:false so they stay OUT of '/' (the commands surface is
|
|
280
|
+
// the sole '/' entry point) — avoids a duplicated /gsd-* per workflow.
|
|
281
|
+
// Subagents (~/.codebuddy/agents/) are already emitted by the generic agents
|
|
282
|
+
// block in bin/install.js; MCP is excluded (gsd ships no MCP server).
|
|
283
|
+
kinds = [
|
|
284
|
+
convertedCommandsKind('commands', 'gsd-', 'convertClaudeCommandToCodebuddyCommand', configDir),
|
|
285
|
+
skillsKind('skills', 'gsd-', 'convertClaudeCommandToCodebuddySkill', 'codebuddy', configDir),
|
|
286
|
+
];
|
|
287
|
+
break;
|
|
288
|
+
case 'cline':
|
|
289
|
+
kinds = scope === 'global' ? [skillsKind('skills', 'gsd-', 'convertClaudeCommandToClineSkill', 'cline', configDir)] : [];
|
|
290
|
+
break;
|
|
291
|
+
case 'opencode':
|
|
292
|
+
// OpenCode reads flat slash commands from command/ and on-demand skills
|
|
293
|
+
// from skills/<name>/SKILL.md (https://opencode.ai/docs/skills). Emit both.
|
|
294
|
+
kinds = [
|
|
295
|
+
commandsKind('command', 'gsd-', configDir),
|
|
296
|
+
skillsKind('skills', 'gsd-', 'convertClaudeCommandToOpencodeSkill', 'opencode', configDir),
|
|
297
|
+
];
|
|
298
|
+
break;
|
|
299
|
+
case 'kilo':
|
|
300
|
+
// Kilo derives from OpenCode and shares the skills/<name>/SKILL.md layout
|
|
301
|
+
// (https://kilo.ai/docs/customize/skills). Emit flat commands + skills.
|
|
302
|
+
kinds = [
|
|
303
|
+
commandsKind('command', 'gsd-', configDir),
|
|
304
|
+
skillsKind('skills', 'gsd-', 'convertClaudeCommandToKiloSkill', 'kilo', configDir),
|
|
305
|
+
];
|
|
306
|
+
break;
|
|
307
|
+
default:
|
|
308
|
+
throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
|
|
309
|
+
}
|
|
310
|
+
return { runtime, configDir, scope, kinds };
|
|
311
|
+
}
|
|
312
|
+
module.exports = { resolveRuntimeArtifactLayout, findInstallSourceRoot, getInstallExports };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Registry
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const REGISTRY = Object.freeze({
|
|
6
|
+
claude: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
|
|
7
|
+
gemini: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
|
|
8
|
+
antigravity: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
|
|
9
|
+
augment: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
|
|
10
|
+
qwen: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
|
|
11
|
+
hermes: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
|
|
12
|
+
codebuddy: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: null }),
|
|
13
|
+
opencode: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: true, finishPermissionWriter: 'opencode' }),
|
|
14
|
+
kilo: Object.freeze({ installSurface: 'settings-json', writesSharedSettings: false, finishPermissionWriter: 'kilo' }),
|
|
15
|
+
codex: Object.freeze({ installSurface: 'codex-toml', writesSharedSettings: false, finishPermissionWriter: null }),
|
|
16
|
+
copilot: Object.freeze({ installSurface: 'copilot-instructions', writesSharedSettings: false, finishPermissionWriter: null }),
|
|
17
|
+
cline: Object.freeze({ installSurface: 'cline-rules', writesSharedSettings: false, finishPermissionWriter: null }),
|
|
18
|
+
cursor: Object.freeze({ installSurface: 'cursor-hooks-json', writesSharedSettings: false, finishPermissionWriter: null }),
|
|
19
|
+
windsurf: Object.freeze({ installSurface: 'profile-marker-only', writesSharedSettings: false, finishPermissionWriter: null }),
|
|
20
|
+
trae: Object.freeze({ installSurface: 'profile-marker-only', writesSharedSettings: false, finishPermissionWriter: null }),
|
|
21
|
+
});
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Exports
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
/** The complete set of 15 supported runtimes for config-adapter dispatch. */
|
|
26
|
+
const ALLOWED_CONFIG_RUNTIMES = new Set(Object.keys(REGISTRY));
|
|
27
|
+
/** All valid installSurface values. */
|
|
28
|
+
const INSTALL_SURFACES = Object.freeze([
|
|
29
|
+
'settings-json',
|
|
30
|
+
'codex-toml',
|
|
31
|
+
'copilot-instructions',
|
|
32
|
+
'cline-rules',
|
|
33
|
+
'cursor-hooks-json',
|
|
34
|
+
'profile-marker-only',
|
|
35
|
+
]);
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the config adapter intent for a given runtime.
|
|
38
|
+
*
|
|
39
|
+
* Returns a fresh object each call so callers cannot poison the registry by
|
|
40
|
+
* mutating the returned value.
|
|
41
|
+
*
|
|
42
|
+
* @throws {TypeError} if runtime is not a known supported runtime.
|
|
43
|
+
*/
|
|
44
|
+
function resolveRuntimeConfigIntent(runtime) {
|
|
45
|
+
if (!Object.hasOwn(REGISTRY, runtime)) {
|
|
46
|
+
throw new TypeError(`Unknown runtime for config adapter: ${runtime}`);
|
|
47
|
+
}
|
|
48
|
+
const entry = REGISTRY[runtime];
|
|
49
|
+
return {
|
|
50
|
+
runtime,
|
|
51
|
+
installSurface: entry.installSurface,
|
|
52
|
+
writesSharedSettings: entry.writesSharedSettings,
|
|
53
|
+
finishPermissionWriter: entry.finishPermissionWriter,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
module.exports = { resolveRuntimeConfigIntent, ALLOWED_CONFIG_RUNTIMES, INSTALL_SURFACES };
|
|
@@ -0,0 +1,190 @@
|
|
|
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 — Skills-capable since v3.48.0 (#782). SKILL.md files live at
|
|
16
|
+
* ~/.cline/skills/<skillName>/SKILL.md (same flat layout as cursor/codex).
|
|
17
|
+
* .clinerules is also emitted (rules-based compatibility layer).
|
|
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
|
+
* @param runtime - The runtime identifier (e.g. 'claude', 'opencode').
|
|
67
|
+
* @param explicitDir - If provided and non-empty, returned immediately after
|
|
68
|
+
* tilde-expansion, overriding all env-var and default logic. This matches
|
|
69
|
+
* the behaviour of bin/install.js getGlobalDir(runtime, explicitDir).
|
|
70
|
+
*/
|
|
71
|
+
function getGlobalConfigDir(runtime, explicitDir) {
|
|
72
|
+
if (explicitDir)
|
|
73
|
+
return expandTilde(explicitDir);
|
|
74
|
+
const home = node_os_1.default.homedir();
|
|
75
|
+
const env = process.env;
|
|
76
|
+
switch (runtime) {
|
|
77
|
+
// ── Claude Code ──────────────────────────────────────────────────────────
|
|
78
|
+
case 'claude':
|
|
79
|
+
return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
|
|
80
|
+
// ── Cursor ───────────────────────────────────────────────────────────────
|
|
81
|
+
case 'cursor':
|
|
82
|
+
return env['CURSOR_CONFIG_DIR'] ? expandTilde(env['CURSOR_CONFIG_DIR']) : node_path_1.default.join(home, '.cursor');
|
|
83
|
+
// ── Gemini CLI ───────────────────────────────────────────────────────────
|
|
84
|
+
case 'gemini':
|
|
85
|
+
return env['GEMINI_CONFIG_DIR'] ? expandTilde(env['GEMINI_CONFIG_DIR']) : node_path_1.default.join(home, '.gemini');
|
|
86
|
+
// ── Codex ────────────────────────────────────────────────────────────────
|
|
87
|
+
case 'codex':
|
|
88
|
+
return env['CODEX_HOME'] ? expandTilde(env['CODEX_HOME']) : node_path_1.default.join(home, '.codex');
|
|
89
|
+
// ── Grok Build ───────────────────────────────────────────────────────────
|
|
90
|
+
case 'grok':
|
|
91
|
+
return env['GROK_AGENTS_HOME'] ? expandTilde(env['GROK_AGENTS_HOME']) : node_path_1.default.join(home, '.agents');
|
|
92
|
+
// ── Copilot (VS Code) ────────────────────────────────────────────────────
|
|
93
|
+
case 'copilot':
|
|
94
|
+
if (env['COPILOT_CONFIG_DIR'])
|
|
95
|
+
return expandTilde(env['COPILOT_CONFIG_DIR']);
|
|
96
|
+
if (env['COPILOT_HOME'])
|
|
97
|
+
return expandTilde(env['COPILOT_HOME']);
|
|
98
|
+
return node_path_1.default.join(home, '.copilot');
|
|
99
|
+
// ── Antigravity ──────────────────────────────────────────────────────────
|
|
100
|
+
case 'antigravity':
|
|
101
|
+
return resolveAntigravityGlobalDir({ env, home });
|
|
102
|
+
// ── Windsurf ─────────────────────────────────────────────────────────────
|
|
103
|
+
case 'windsurf':
|
|
104
|
+
return env['WINDSURF_CONFIG_DIR']
|
|
105
|
+
? expandTilde(env['WINDSURF_CONFIG_DIR'])
|
|
106
|
+
: node_path_1.default.join(home, '.codeium', 'windsurf');
|
|
107
|
+
// ── Augment ──────────────────────────────────────────────────────────────
|
|
108
|
+
case 'augment':
|
|
109
|
+
return env['AUGMENT_CONFIG_DIR'] ? expandTilde(env['AUGMENT_CONFIG_DIR']) : node_path_1.default.join(home, '.augment');
|
|
110
|
+
// ── Trae ─────────────────────────────────────────────────────────────────
|
|
111
|
+
case 'trae':
|
|
112
|
+
return env['TRAE_CONFIG_DIR'] ? expandTilde(env['TRAE_CONFIG_DIR']) : node_path_1.default.join(home, '.trae');
|
|
113
|
+
// ── Qwen Code ────────────────────────────────────────────────────────────
|
|
114
|
+
case 'qwen':
|
|
115
|
+
return env['QWEN_CONFIG_DIR'] ? expandTilde(env['QWEN_CONFIG_DIR']) : node_path_1.default.join(home, '.qwen');
|
|
116
|
+
// ── Hermes Agent ─────────────────────────────────────────────────────────
|
|
117
|
+
case 'hermes':
|
|
118
|
+
return env['HERMES_HOME'] ? expandTilde(env['HERMES_HOME']) : node_path_1.default.join(home, '.hermes');
|
|
119
|
+
// ── CodeBuddy ────────────────────────────────────────────────────────────
|
|
120
|
+
case 'codebuddy':
|
|
121
|
+
return env['CODEBUDDY_CONFIG_DIR'] ? expandTilde(env['CODEBUDDY_CONFIG_DIR']) : node_path_1.default.join(home, '.codebuddy');
|
|
122
|
+
// ── Cline ────────────────────────────────────────────────────────────────
|
|
123
|
+
case 'cline':
|
|
124
|
+
return env['CLINE_CONFIG_DIR'] ? expandTilde(env['CLINE_CONFIG_DIR']) : node_path_1.default.join(home, '.cline');
|
|
125
|
+
// ── OpenCode (XDG) ───────────────────────────────────────────────────────
|
|
126
|
+
case 'opencode': {
|
|
127
|
+
if (env['OPENCODE_CONFIG_DIR'])
|
|
128
|
+
return expandTilde(env['OPENCODE_CONFIG_DIR']);
|
|
129
|
+
if (env['OPENCODE_CONFIG'])
|
|
130
|
+
return node_path_1.default.dirname(expandTilde(env['OPENCODE_CONFIG']));
|
|
131
|
+
if (env['XDG_CONFIG_HOME'])
|
|
132
|
+
return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'opencode');
|
|
133
|
+
return node_path_1.default.join(home, '.config', 'opencode');
|
|
134
|
+
}
|
|
135
|
+
// ── Kilo (XDG) ───────────────────────────────────────────────────────────
|
|
136
|
+
case 'kilo': {
|
|
137
|
+
if (env['KILO_CONFIG_DIR'])
|
|
138
|
+
return expandTilde(env['KILO_CONFIG_DIR']);
|
|
139
|
+
if (env['KILO_CONFIG'])
|
|
140
|
+
return node_path_1.default.dirname(expandTilde(env['KILO_CONFIG']));
|
|
141
|
+
if (env['XDG_CONFIG_HOME'])
|
|
142
|
+
return node_path_1.default.join(expandTilde(env['XDG_CONFIG_HOME']), 'kilo');
|
|
143
|
+
return node_path_1.default.join(home, '.config', 'kilo');
|
|
144
|
+
}
|
|
145
|
+
// ── Default (Claude fallback) ─────────────────────────────────────────────
|
|
146
|
+
default:
|
|
147
|
+
return env['CLAUDE_CONFIG_DIR'] ? expandTilde(env['CLAUDE_CONFIG_DIR']) : node_path_1.default.join(home, '.claude');
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Return the global skills base directory for the given runtime.
|
|
152
|
+
* Most runtimes: <configDir>/skills
|
|
153
|
+
* Hermes: <configDir>/skills/gsd (nested category layout — #2841)
|
|
154
|
+
* Cline ≥ v3.48.0: <configDir>/skills (SKILL.md-based global skills — #782)
|
|
155
|
+
*/
|
|
156
|
+
function getGlobalSkillsBase(runtime) {
|
|
157
|
+
if (runtime === 'hermes') {
|
|
158
|
+
const configDir = getGlobalConfigDir(runtime);
|
|
159
|
+
return node_path_1.default.join(configDir, 'skills', 'gsd');
|
|
160
|
+
}
|
|
161
|
+
// Kilo Code discovers global skills from ~/.kilo/skills/ (HOME-relative),
|
|
162
|
+
// independent of the XDG-based config dir (~/.config/kilo) used for commands.
|
|
163
|
+
// See: https://kilo.ai/docs/customize/skills
|
|
164
|
+
// "Global skills are located in the `.kilo` directory within your Home
|
|
165
|
+
// directory: ~/.kilo/skills/"
|
|
166
|
+
if (runtime === 'kilo')
|
|
167
|
+
return node_path_1.default.join(node_os_1.default.homedir(), '.kilo', 'skills');
|
|
168
|
+
const configDir = getGlobalConfigDir(runtime);
|
|
169
|
+
return node_path_1.default.join(configDir, 'skills');
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Return the full path to a specific skill's directory for the given runtime.
|
|
173
|
+
*/
|
|
174
|
+
function getGlobalSkillDir(runtime, skillName) {
|
|
175
|
+
const base = getGlobalSkillsBase(runtime);
|
|
176
|
+
if (base === null)
|
|
177
|
+
return null;
|
|
178
|
+
return node_path_1.default.join(base, skillName);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Return a human-readable display path for a global skill (for log messages).
|
|
182
|
+
*/
|
|
183
|
+
function getGlobalSkillDisplayPath(runtime, skillName) {
|
|
184
|
+
const dir = getGlobalSkillDir(runtime, skillName);
|
|
185
|
+
if (!dir)
|
|
186
|
+
return `(${runtime} does not use a skills directory)`;
|
|
187
|
+
// Replace homedir prefix with ~ for readability
|
|
188
|
+
const home = node_os_1.default.homedir();
|
|
189
|
+
return dir.startsWith(home) ? '~' + dir.slice(home.length) : dir;
|
|
190
|
+
}
|
|
@@ -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
|
+
}
|