@opengsd/gsd-core 1.3.0-rc.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja-JP.md +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 +784 -0
- package/gsd-core/bin/lib/intel.cjs +607 -0
- package/gsd-core/bin/lib/learnings.cjs +270 -0
- package/gsd-core/bin/lib/legacy-cleanup.cjs +253 -0
- package/gsd-core/bin/lib/milestone.cjs +373 -0
- package/gsd-core/bin/lib/model-catalog.cjs +154 -0
- package/gsd-core/bin/lib/model-profiles.cjs +24 -0
- package/gsd-core/bin/lib/observability/event.cjs +51 -0
- package/gsd-core/bin/lib/observability/logger.cjs +146 -0
- package/{get-shit-done → gsd-core}/bin/lib/observability/redaction.cjs +19 -21
- package/{get-shit-done → gsd-core}/bin/lib/package-identity.cjs +5 -1
- package/gsd-core/bin/lib/phase-command-router.cjs +189 -0
- package/gsd-core/bin/lib/phase-lifecycle.cjs +74 -0
- package/gsd-core/bin/lib/phase.cjs +1307 -0
- package/gsd-core/bin/lib/phases-command-router.cjs +43 -0
- package/{get-shit-done → gsd-core}/bin/lib/plan-scan.cjs +18 -24
- package/gsd-core/bin/lib/planning-workspace.cjs +245 -0
- package/gsd-core/bin/lib/profile-output.cjs +1120 -0
- package/gsd-core/bin/lib/profile-pipeline.cjs +517 -0
- package/gsd-core/bin/lib/project-root.cjs +119 -0
- package/gsd-core/bin/lib/prompt-budget.cjs +305 -0
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +121 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +166 -0
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +491 -0
- package/gsd-core/bin/lib/roadmap.cjs +600 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +254 -0
- package/gsd-core/bin/lib/runtime-homes.cjs +169 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +96 -0
- package/gsd-core/bin/lib/runtime-slash.cjs +119 -0
- package/{get-shit-done → gsd-core}/bin/lib/schema-detect.cjs +20 -26
- package/gsd-core/bin/lib/secrets.cjs +34 -0
- package/gsd-core/bin/lib/security.cjs +407 -0
- package/{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
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Milestone — Milestone and requirements lifecycle operations
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
const fs = require('fs');
|
|
6
|
-
const path = require('path');
|
|
7
|
-
const { escapeRegex, getMilestonePhaseFilter, extractOneLinerFromBody, normalizePhaseName, phaseTokenMatches, output, error } = require('./core.cjs');
|
|
8
|
-
const { platformWriteSync, platformEnsureDir } = require('./shell-command-projection.cjs');
|
|
9
|
-
const { planningPaths } = require('./planning-workspace.cjs');
|
|
10
|
-
const { extractFrontmatter } = require('./frontmatter.cjs');
|
|
11
|
-
const { writeStateMd, stateReplaceFieldWithFallback } = require('./state.cjs');
|
|
12
|
-
const { formatGsdSlash, resolveRuntime } = require('./runtime-slash.cjs');
|
|
13
|
-
|
|
14
|
-
function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
|
|
15
|
-
if (!reqIdsRaw || reqIdsRaw.length === 0) {
|
|
16
|
-
error('requirement IDs required. Usage: requirements mark-complete REQ-01,REQ-02 or REQ-01 REQ-02');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Accept comma-separated, space-separated, or bracket-wrapped: [REQ-01, REQ-02]
|
|
20
|
-
const reqIds = reqIdsRaw
|
|
21
|
-
.join(' ')
|
|
22
|
-
.replace(/[\[\]]/g, '')
|
|
23
|
-
.split(/[,\s]+/)
|
|
24
|
-
.map(r => r.trim())
|
|
25
|
-
.filter(Boolean);
|
|
26
|
-
|
|
27
|
-
if (reqIds.length === 0) {
|
|
28
|
-
error('no valid requirement IDs found');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const reqPath = planningPaths(cwd).requirements;
|
|
32
|
-
if (!fs.existsSync(reqPath)) {
|
|
33
|
-
output({ updated: false, reason: 'REQUIREMENTS.md not found', ids: reqIds }, raw, 'no requirements file');
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
let reqContent = fs.readFileSync(reqPath, 'utf-8');
|
|
38
|
-
const updated = [];
|
|
39
|
-
const alreadyComplete = [];
|
|
40
|
-
const notFound = [];
|
|
41
|
-
|
|
42
|
-
for (const reqId of reqIds) {
|
|
43
|
-
let found = false;
|
|
44
|
-
const reqEscaped = escapeRegex(reqId);
|
|
45
|
-
|
|
46
|
-
// Update checkbox: - [ ] **REQ-ID** → - [x] **REQ-ID**
|
|
47
|
-
// Use replace() directly and compare — avoids test()+replace() global regex
|
|
48
|
-
// lastIndex bug where test() advances state and replace() misses matches.
|
|
49
|
-
const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${reqEscaped}\\*\\*)`, 'gi');
|
|
50
|
-
const afterCheckbox = reqContent.replace(checkboxPattern, '$1x$2');
|
|
51
|
-
if (afterCheckbox !== reqContent) {
|
|
52
|
-
reqContent = afterCheckbox;
|
|
53
|
-
found = true;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Update traceability table: | REQ-ID | Phase N | Pending | → | REQ-ID | Phase N | Complete |
|
|
57
|
-
const tablePattern = new RegExp(`(\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`, 'gi');
|
|
58
|
-
const afterTable = reqContent.replace(tablePattern, '$1 Complete $2');
|
|
59
|
-
if (afterTable !== reqContent) {
|
|
60
|
-
reqContent = afterTable;
|
|
61
|
-
found = true;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (found) {
|
|
65
|
-
updated.push(reqId);
|
|
66
|
-
} else {
|
|
67
|
-
// Check if already complete before declaring not_found.
|
|
68
|
-
// Non-global flag is fine here — we only need to know if a match exists.
|
|
69
|
-
const doneCheckbox = new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${reqEscaped}\\*\\*`, 'i');
|
|
70
|
-
const doneTable = new RegExp(`\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`, 'i');
|
|
71
|
-
if (doneCheckbox.test(reqContent) || doneTable.test(reqContent)) {
|
|
72
|
-
alreadyComplete.push(reqId);
|
|
73
|
-
} else {
|
|
74
|
-
notFound.push(reqId);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (updated.length > 0) {
|
|
80
|
-
platformWriteSync(reqPath, reqContent);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
output({
|
|
84
|
-
updated: updated.length > 0,
|
|
85
|
-
marked_complete: updated,
|
|
86
|
-
already_complete: alreadyComplete,
|
|
87
|
-
not_found: notFound,
|
|
88
|
-
total: reqIds.length,
|
|
89
|
-
}, raw, `${updated.length}/${reqIds.length} requirements marked complete`);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function cmdMilestoneComplete(cwd, version, options, raw) {
|
|
93
|
-
if (!version) {
|
|
94
|
-
error('version required for milestone complete (e.g., v1.0)');
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const roadmapPath = planningPaths(cwd).roadmap;
|
|
98
|
-
const reqPath = planningPaths(cwd).requirements;
|
|
99
|
-
const statePath = planningPaths(cwd).state;
|
|
100
|
-
const milestonesPath = path.join(cwd, '.planning', 'MILESTONES.md');
|
|
101
|
-
const archiveDir = path.join(cwd, '.planning', 'milestones');
|
|
102
|
-
const phasesDir = planningPaths(cwd).phases;
|
|
103
|
-
const today = new Date().toISOString().split('T')[0];
|
|
104
|
-
const milestoneName = options.name || version;
|
|
105
|
-
|
|
106
|
-
// Ensure archive directory exists
|
|
107
|
-
platformEnsureDir(archiveDir);
|
|
108
|
-
|
|
109
|
-
// Scope stats and accomplishments to only the phases belonging to the
|
|
110
|
-
// current milestone's ROADMAP. Uses the shared filter from core.cjs
|
|
111
|
-
// (same logic used by cmdPhasesList and other callers).
|
|
112
|
-
const isDirInMilestone = getMilestonePhaseFilter(cwd, version);
|
|
113
|
-
if (isDirInMilestone.missingExplicitVersion) {
|
|
114
|
-
error(`no phases found for milestone ${version} in ROADMAP.md`);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Guard: prevent marking complete when ROADMAP still lists phases that have
|
|
118
|
-
// no directory on disk (disk_status: no_directory). This catches the case
|
|
119
|
-
// where the active milestone was erroneously marked complete before phases
|
|
120
|
-
// were even started. Only fires when STATE.md confirms the current milestone
|
|
121
|
-
// version matches what is being completed — no false positives on fresh
|
|
122
|
-
// projects where phases haven't been scaffolded yet.
|
|
123
|
-
// Pass --force to override this guard.
|
|
124
|
-
if (!options.force) {
|
|
125
|
-
try {
|
|
126
|
-
// Only guard when STATE.md's milestone field matches the version being completed.
|
|
127
|
-
let stateVersion = null;
|
|
128
|
-
try {
|
|
129
|
-
const stateRaw = fs.existsSync(statePath) ? fs.readFileSync(statePath, 'utf-8') : null;
|
|
130
|
-
if (stateRaw) {
|
|
131
|
-
const milestoneMatch = stateRaw.match(/^milestone:\s*(.+)/m);
|
|
132
|
-
if (milestoneMatch) stateVersion = milestoneMatch[1].trim();
|
|
133
|
-
}
|
|
134
|
-
} catch { /* skip */ }
|
|
135
|
-
|
|
136
|
-
if (stateVersion && stateVersion === version) {
|
|
137
|
-
const { extractCurrentMilestone } = require('./core.cjs');
|
|
138
|
-
const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
|
|
139
|
-
const scopedContent = extractCurrentMilestone(roadmapContent, cwd);
|
|
140
|
-
const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
|
|
141
|
-
const noDirectoryPhases = [];
|
|
142
|
-
let pm;
|
|
143
|
-
const phaseDirEntries = (() => {
|
|
144
|
-
try {
|
|
145
|
-
return fs.readdirSync(phasesDir, { withFileTypes: true })
|
|
146
|
-
.filter(e => e.isDirectory()).map(e => e.name);
|
|
147
|
-
} catch { return []; }
|
|
148
|
-
})();
|
|
149
|
-
while ((pm = phasePattern.exec(scopedContent)) !== null) {
|
|
150
|
-
const phaseNum = pm[1];
|
|
151
|
-
const normalized = normalizePhaseName(phaseNum);
|
|
152
|
-
// A phase has disk_status: 'no_directory' when no phase directory
|
|
153
|
-
// with a matching token exists on disk. Use the same phaseTokenMatches
|
|
154
|
-
// helper that roadmap.analyze uses to avoid false positives on decimal
|
|
155
|
-
// (2.1) and letter-suffix (12A) phase IDs.
|
|
156
|
-
const hasDirectory = phaseDirEntries.some(d => phaseTokenMatches(d, normalized));
|
|
157
|
-
if (!hasDirectory) {
|
|
158
|
-
noDirectoryPhases.push(phaseNum);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
if (noDirectoryPhases.length > 0) {
|
|
162
|
-
error(
|
|
163
|
-
`Cannot mark milestone complete: ROADMAP lists ${noDirectoryPhases.length} unstarted phase(s) ` +
|
|
164
|
-
`(e.g. Phase ${noDirectoryPhases[0]}). Re-run with --force to override.`
|
|
165
|
-
);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
} catch (e) {
|
|
169
|
-
// If the error came from our guard, re-throw it; otherwise skip silently.
|
|
170
|
-
if (e.message && e.message.startsWith('Cannot mark milestone complete:')) throw e;
|
|
171
|
-
// Phase scan failed or STATE version mismatch — allow completion to proceed.
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Gather stats from phases (scoped to current milestone only)
|
|
176
|
-
let phaseCount = 0;
|
|
177
|
-
let totalPlans = 0;
|
|
178
|
-
let totalTasks = 0;
|
|
179
|
-
const accomplishments = [];
|
|
180
|
-
|
|
181
|
-
try {
|
|
182
|
-
const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
|
|
183
|
-
const dirs = entries.filter(e => e.isDirectory()).map(e => e.name).sort();
|
|
184
|
-
|
|
185
|
-
for (const dir of dirs) {
|
|
186
|
-
if (!isDirInMilestone(dir)) continue;
|
|
187
|
-
|
|
188
|
-
phaseCount++;
|
|
189
|
-
const phaseFiles = fs.readdirSync(path.join(phasesDir, dir));
|
|
190
|
-
const plans = phaseFiles.filter(f => f.endsWith('-PLAN.md') || f === 'PLAN.md');
|
|
191
|
-
const summaries = phaseFiles.filter(f => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
|
|
192
|
-
totalPlans += plans.length;
|
|
193
|
-
|
|
194
|
-
// Extract one-liners from summaries
|
|
195
|
-
for (const s of summaries) {
|
|
196
|
-
try {
|
|
197
|
-
const content = fs.readFileSync(path.join(phasesDir, dir, s), 'utf-8');
|
|
198
|
-
const fm = extractFrontmatter(content);
|
|
199
|
-
const oneLiner = fm['one-liner'] || extractOneLinerFromBody(content);
|
|
200
|
-
if (oneLiner) {
|
|
201
|
-
accomplishments.push(oneLiner);
|
|
202
|
-
}
|
|
203
|
-
// Count tasks: prefer **Tasks:** N from Performance section,
|
|
204
|
-
// then <task XML tags, then ## Task N markdown headers
|
|
205
|
-
const tasksFieldMatch = content.match(/\*\*Tasks:\*\*\s*(\d+)/);
|
|
206
|
-
if (tasksFieldMatch) {
|
|
207
|
-
totalTasks += parseInt(tasksFieldMatch[1], 10);
|
|
208
|
-
} else {
|
|
209
|
-
const xmlTaskMatches = content.match(/<task[\s>]/gi) || [];
|
|
210
|
-
const mdTaskMatches = content.match(/##\s*Task\s*\d+/gi) || [];
|
|
211
|
-
totalTasks += xmlTaskMatches.length || mdTaskMatches.length;
|
|
212
|
-
}
|
|
213
|
-
} catch { /* intentionally empty */ }
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
} catch { /* intentionally empty */ }
|
|
217
|
-
|
|
218
|
-
// Archive ROADMAP.md
|
|
219
|
-
if (fs.existsSync(roadmapPath)) {
|
|
220
|
-
const roadmapContent = fs.readFileSync(roadmapPath, 'utf-8');
|
|
221
|
-
platformWriteSync(path.join(archiveDir, `${version}-ROADMAP.md`), roadmapContent);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Archive REQUIREMENTS.md
|
|
225
|
-
if (fs.existsSync(reqPath)) {
|
|
226
|
-
const reqContent = fs.readFileSync(reqPath, 'utf-8');
|
|
227
|
-
const archiveHeader = `# Requirements Archive: ${version} ${milestoneName}\n\n**Archived:** ${today}\n**Status:** SHIPPED\n\nFor current requirements, see \`.planning/REQUIREMENTS.md\`.\n\n---\n\n`;
|
|
228
|
-
platformWriteSync(path.join(archiveDir, `${version}-REQUIREMENTS.md`), archiveHeader + reqContent);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Archive audit file if exists
|
|
232
|
-
const auditFile = path.join(cwd, '.planning', `${version}-MILESTONE-AUDIT.md`);
|
|
233
|
-
if (fs.existsSync(auditFile)) {
|
|
234
|
-
fs.renameSync(auditFile, path.join(archiveDir, `${version}-MILESTONE-AUDIT.md`));
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Create/append MILESTONES.md entry
|
|
238
|
-
const accomplishmentsList = accomplishments.map(a => `- ${a}`).join('\n');
|
|
239
|
-
const milestoneEntry = `## ${version} ${milestoneName} (Shipped: ${today})\n\n**Phases completed:** ${phaseCount} phases, ${totalPlans} plans, ${totalTasks} tasks\n\n**Key accomplishments:**\n${accomplishmentsList || '- (none recorded)'}\n\n---\n\n`;
|
|
240
|
-
|
|
241
|
-
if (fs.existsSync(milestonesPath)) {
|
|
242
|
-
const existing = fs.readFileSync(milestonesPath, 'utf-8');
|
|
243
|
-
if (!existing.trim()) {
|
|
244
|
-
// Empty file — treat like new
|
|
245
|
-
platformWriteSync(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
|
|
246
|
-
} else {
|
|
247
|
-
// Insert after the header line(s) for reverse chronological order (newest first)
|
|
248
|
-
const headerMatch = existing.match(/^(#{1,3}\s+[^\n]*\n\n?)/);
|
|
249
|
-
if (headerMatch) {
|
|
250
|
-
const header = headerMatch[1];
|
|
251
|
-
const rest = existing.slice(header.length);
|
|
252
|
-
platformWriteSync(milestonesPath, header + milestoneEntry + rest);
|
|
253
|
-
} else {
|
|
254
|
-
// No recognizable header — prepend the entry
|
|
255
|
-
platformWriteSync(milestonesPath, milestoneEntry + existing);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
} else {
|
|
259
|
-
platformWriteSync(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Update STATE.md — keep frontmatter/body semantically aligned after closure
|
|
263
|
-
if (fs.existsSync(statePath)) {
|
|
264
|
-
let stateContent = fs.readFileSync(statePath, 'utf-8');
|
|
265
|
-
|
|
266
|
-
stateContent = stateReplaceFieldWithFallback(stateContent, 'Status', null, `${version} milestone complete`);
|
|
267
|
-
stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity', 'Last activity', today);
|
|
268
|
-
stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity Description', null,
|
|
269
|
-
`${version} milestone completed and archived`);
|
|
270
|
-
|
|
271
|
-
// Reset Current Position narrative so resume/progress flows do not keep
|
|
272
|
-
// pointing at closed-phase execution instructions.
|
|
273
|
-
const positionPattern = /(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i;
|
|
274
|
-
const closedPositionBody =
|
|
275
|
-
`\nPhase: Milestone ${version} complete\n` +
|
|
276
|
-
`Plan: —\n` +
|
|
277
|
-
`Status: Awaiting next milestone\n` +
|
|
278
|
-
`Last activity: ${today} — Milestone ${version} completed and archived\n\n`;
|
|
279
|
-
if (positionPattern.test(stateContent)) {
|
|
280
|
-
stateContent = stateContent.replace(positionPattern, (_m, header) => `${header}${closedPositionBody}`);
|
|
281
|
-
} else {
|
|
282
|
-
stateContent = `${stateContent.trimEnd()}\n\n## Current Position\n${closedPositionBody}`;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Normalize operator-next-step tails that can become stale after close.
|
|
286
|
-
const operatorPattern = /(##\s*Operator Next Steps\s*\n)([\s\S]*?)(?=\n##|$)/i;
|
|
287
|
-
if (operatorPattern.test(stateContent)) {
|
|
288
|
-
stateContent = stateContent.replace(
|
|
289
|
-
operatorPattern,
|
|
290
|
-
`$1\n- Start the next milestone with ${formatGsdSlash('new-milestone', resolveRuntime(cwd))}\n\n`,
|
|
291
|
-
);
|
|
292
|
-
} else {
|
|
293
|
-
stateContent = `${stateContent.trimEnd()}\n\n## Operator Next Steps\n\n- Start the next milestone with ${formatGsdSlash('new-milestone', resolveRuntime(cwd))}\n`;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
writeStateMd(statePath, stateContent, cwd);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// Archive phase directories if requested
|
|
300
|
-
let phasesArchived = false;
|
|
301
|
-
if (options.archivePhases) {
|
|
302
|
-
try {
|
|
303
|
-
const phaseArchiveDir = path.join(archiveDir, `${version}-phases`);
|
|
304
|
-
platformEnsureDir(phaseArchiveDir);
|
|
305
|
-
|
|
306
|
-
const phaseEntries = fs.readdirSync(phasesDir, { withFileTypes: true });
|
|
307
|
-
const phaseDirNames = phaseEntries.filter(e => e.isDirectory()).map(e => e.name);
|
|
308
|
-
let archivedCount = 0;
|
|
309
|
-
for (const dir of phaseDirNames) {
|
|
310
|
-
if (!isDirInMilestone(dir)) continue;
|
|
311
|
-
fs.renameSync(path.join(phasesDir, dir), path.join(phaseArchiveDir, dir));
|
|
312
|
-
archivedCount++;
|
|
313
|
-
}
|
|
314
|
-
phasesArchived = archivedCount > 0;
|
|
315
|
-
} catch { /* intentionally empty */ }
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const result = {
|
|
319
|
-
version,
|
|
320
|
-
name: milestoneName,
|
|
321
|
-
date: today,
|
|
322
|
-
phases: phaseCount,
|
|
323
|
-
plans: totalPlans,
|
|
324
|
-
tasks: totalTasks,
|
|
325
|
-
accomplishments,
|
|
326
|
-
archived: {
|
|
327
|
-
roadmap: fs.existsSync(path.join(archiveDir, `${version}-ROADMAP.md`)),
|
|
328
|
-
requirements: fs.existsSync(path.join(archiveDir, `${version}-REQUIREMENTS.md`)),
|
|
329
|
-
audit: fs.existsSync(path.join(archiveDir, `${version}-MILESTONE-AUDIT.md`)),
|
|
330
|
-
phases: phasesArchived,
|
|
331
|
-
},
|
|
332
|
-
milestones_updated: true,
|
|
333
|
-
state_updated: fs.existsSync(statePath),
|
|
334
|
-
};
|
|
335
|
-
|
|
336
|
-
output(result, raw);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
function cmdPhasesClear(cwd, raw, args) {
|
|
340
|
-
const phasesDir = planningPaths(cwd).phases;
|
|
341
|
-
const confirm = Array.isArray(args) && args.includes('--confirm');
|
|
342
|
-
let cleared = 0;
|
|
343
|
-
|
|
344
|
-
if (fs.existsSync(phasesDir)) {
|
|
345
|
-
const entries = fs.readdirSync(phasesDir, { withFileTypes: true });
|
|
346
|
-
const dirs = entries.filter(e => e.isDirectory() && !/^999(?:\.|$)/.test(e.name));
|
|
347
|
-
|
|
348
|
-
if (dirs.length > 0 && !confirm) {
|
|
349
|
-
error(
|
|
350
|
-
`phases clear would delete ${dirs.length} phase director${dirs.length === 1 ? 'y' : 'ies'}. ` +
|
|
351
|
-
`Pass --confirm to proceed.`
|
|
352
|
-
);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
try {
|
|
356
|
-
for (const entry of dirs) {
|
|
357
|
-
fs.rmSync(path.join(phasesDir, entry.name), { recursive: true, force: true });
|
|
358
|
-
cleared++;
|
|
359
|
-
}
|
|
360
|
-
} catch (e) {
|
|
361
|
-
error('Failed to clear phases directory: ' + e.message);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
output({ cleared }, raw, `${cleared} phase director${cleared === 1 ? 'y' : 'ies'} cleared`);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
module.exports = {
|
|
369
|
-
cmdRequirementsMarkComplete,
|
|
370
|
-
cmdMilestoneComplete,
|
|
371
|
-
cmdPhasesClear,
|
|
372
|
-
};
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const path = require('node:path');
|
|
4
|
-
|
|
5
|
-
// Resolve model-catalog.json via a prioritised candidate list so the module
|
|
6
|
-
// works in every layout:
|
|
7
|
-
//
|
|
8
|
-
// 1. Co-located install path — get-shit-done/bin/shared/model-catalog.json
|
|
9
|
-
// Written by bin/install.js (#3288 fix). This is the canonical post-install
|
|
10
|
-
// location across all runtimes (Claude Code, Codex, OpenCode, etc.).
|
|
11
|
-
//
|
|
12
|
-
// 2. Source-repo dev path — sdk/shared/model-catalog.json
|
|
13
|
-
// Three levels up from bin/lib/: works when running directly from the
|
|
14
|
-
// open-gsd/gsd-core clone (the original path introduced by #3230).
|
|
15
|
-
//
|
|
16
|
-
// 3. GSD_MODEL_CATALOG env override — allows test harnesses and custom
|
|
17
|
-
// deployments to point at an arbitrary catalog file.
|
|
18
|
-
//
|
|
19
|
-
// Throws with a diagnostic message that lists all candidates when none resolve,
|
|
20
|
-
// so MODULE_NOT_FOUND surfaces as a clear actionable error (PRED.k301).
|
|
21
|
-
const _catalogCandidates = [
|
|
22
|
-
path.resolve(__dirname, '..', 'shared', 'model-catalog.json'),
|
|
23
|
-
path.resolve(__dirname, '..', '..', '..', 'sdk', 'shared', 'model-catalog.json'),
|
|
24
|
-
process.env.GSD_MODEL_CATALOG ? path.resolve(process.env.GSD_MODEL_CATALOG) : null,
|
|
25
|
-
].filter(Boolean);
|
|
26
|
-
|
|
27
|
-
let catalog = null;
|
|
28
|
-
let _catalogLastErr = null;
|
|
29
|
-
for (const _p of _catalogCandidates) {
|
|
30
|
-
try {
|
|
31
|
-
catalog = require(_p);
|
|
32
|
-
break;
|
|
33
|
-
} catch (e) {
|
|
34
|
-
// Only treat missing-file errors as recoverable — rethrow parse errors,
|
|
35
|
-
// permission errors, and any other real failures so they surface clearly
|
|
36
|
-
// instead of being silently swallowed (CR finding, PR #3293).
|
|
37
|
-
const isMissingCandidate =
|
|
38
|
-
(e && e.code === 'MODULE_NOT_FOUND' && String(e.message || '').includes(_p)) ||
|
|
39
|
-
(e && e.code === 'ENOENT');
|
|
40
|
-
if (!isMissingCandidate) throw e;
|
|
41
|
-
_catalogLastErr = e;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
if (!catalog) {
|
|
45
|
-
throw new Error(
|
|
46
|
-
`model-catalog.json not found. Tried:\n${_catalogCandidates.map((p) => ` ${p}`).join('\n')}\nLast error: ${_catalogLastErr?.message}`
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const VALID_PROFILES = [...catalog.profiles];
|
|
51
|
-
const VALID_PHASE_TYPES = new Set(catalog.phaseTypes);
|
|
52
|
-
const VALID_AGENT_TIERS = new Set(Object.keys(catalog.adaptiveTierMap));
|
|
53
|
-
|
|
54
|
-
const MODEL_PROFILES = Object.fromEntries(
|
|
55
|
-
Object.entries(catalog.agents).map(([agent, meta]) => [agent, {
|
|
56
|
-
quality: meta.golden,
|
|
57
|
-
balanced: meta.balanced,
|
|
58
|
-
budget: meta.budget,
|
|
59
|
-
adaptive: catalog.adaptiveTierMap[meta.routingTier],
|
|
60
|
-
}])
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
const AGENT_TO_PHASE_TYPE = Object.fromEntries(
|
|
64
|
-
Object.entries(catalog.agents).map(([agent, meta]) => [agent, meta.phaseType])
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
const AGENT_DEFAULT_TIERS = Object.fromEntries(
|
|
68
|
-
Object.entries(catalog.agents).map(([agent, meta]) => [agent, meta.routingTier])
|
|
69
|
-
);
|
|
70
|
-
|
|
71
|
-
const MODEL_ALIAS_MAP = Object.fromEntries(
|
|
72
|
-
Object.entries(catalog.runtimeTierDefaults.claude).map(([tier, entry]) => [tier, entry?.model])
|
|
73
|
-
);
|
|
74
|
-
|
|
75
|
-
const RUNTIME_PROFILE_MAP = Object.fromEntries(
|
|
76
|
-
Object.entries(catalog.runtimeTierDefaults)
|
|
77
|
-
.map(([runtime, tiers]) => [
|
|
78
|
-
runtime,
|
|
79
|
-
Object.fromEntries(
|
|
80
|
-
Object.entries(tiers).filter(([, entry]) => entry).map(([tier, entry]) => [tier, entry])
|
|
81
|
-
),
|
|
82
|
-
])
|
|
83
|
-
.filter(([, tiers]) => Object.keys(tiers).length > 0)
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
const KNOWN_RUNTIMES = new Set(Object.keys(catalog.runtimeTierDefaults));
|
|
87
|
-
const RUNTIMES_WITH_REASONING_EFFORT = new Set(
|
|
88
|
-
Object.entries(catalog.runtimeTierDefaults)
|
|
89
|
-
.filter(([, tiers]) => Object.values(tiers).some((entry) => entry && entry.reasoning_effort))
|
|
90
|
-
.map(([runtime]) => runtime)
|
|
91
|
-
);
|
|
92
|
-
|
|
93
|
-
const PROVIDER_PRESETS = catalog.providerPresets || {};
|
|
94
|
-
|
|
95
|
-
// KNOWN_PROVIDERS excludes 'generic' — it is a sentinel (all null entries) that
|
|
96
|
-
// forces users to supply model IDs via model_profile_overrides. It is not a
|
|
97
|
-
// real catalog-backed provider (#49).
|
|
98
|
-
const KNOWN_PROVIDERS = new Set(
|
|
99
|
-
Object.entries(PROVIDER_PRESETS)
|
|
100
|
-
.filter(([, tiers]) =>
|
|
101
|
-
Object.values(tiers).some((budgets) =>
|
|
102
|
-
budgets && Object.values(budgets).some((entry) => entry && entry.model)
|
|
103
|
-
)
|
|
104
|
-
)
|
|
105
|
-
.map(([name]) => name)
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
function nextTier(currentTier) {
|
|
109
|
-
const order = ['light', 'standard', 'heavy'];
|
|
110
|
-
const idx = order.indexOf(String(currentTier));
|
|
111
|
-
if (idx === -1) return null;
|
|
112
|
-
return order[Math.min(idx + 1, order.length - 1)];
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function formatAgentToModelMapAsTable(agentToModelMap) {
|
|
116
|
-
const agentWidth = Math.max('Agent'.length, ...Object.keys(agentToModelMap).map((a) => a.length));
|
|
117
|
-
const modelWidth = Math.max('Model'.length, ...Object.values(agentToModelMap).map((m) => m.length));
|
|
118
|
-
const sep = '─'.repeat(agentWidth + 2) + '┼' + '─'.repeat(modelWidth + 2);
|
|
119
|
-
const header = ` ${'Agent'.padEnd(agentWidth)} │ ${'Model'.padEnd(modelWidth)}`;
|
|
120
|
-
let out = `${header}\n${sep}\n`;
|
|
121
|
-
for (const [agent, model] of Object.entries(agentToModelMap)) {
|
|
122
|
-
out += ` ${agent.padEnd(agentWidth)} │ ${model.padEnd(modelWidth)}\n`;
|
|
123
|
-
}
|
|
124
|
-
return out;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function getAgentToModelMapForProfile(normalizedProfile) {
|
|
128
|
-
const profile = VALID_PROFILES.includes(normalizedProfile) ? normalizedProfile : 'balanced';
|
|
129
|
-
const out = {};
|
|
130
|
-
for (const [agent, profiles] of Object.entries(MODEL_PROFILES)) {
|
|
131
|
-
out[agent] = profile === 'inherit' ? 'inherit' : (profiles[profile] ?? profiles.balanced);
|
|
132
|
-
}
|
|
133
|
-
return out;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// ─── Effort rendering ────────────────────────────────────────────────────────
|
|
137
|
-
//
|
|
138
|
-
// Universal effort ladder: minimal < low < medium < high < xhigh < max
|
|
139
|
-
//
|
|
140
|
-
// Each runtime supports a subset. The unique tails must be clamped when emitting
|
|
141
|
-
// to a runtime that does not support them:
|
|
142
|
-
// - 'max' is Anthropic-only: Codex does not support it -> clamp to 'xhigh'
|
|
143
|
-
// - 'minimal' is Codex-only: Claude does not support it -> clamp to 'low'
|
|
144
|
-
//
|
|
145
|
-
// Rendering maps the universal effort string to the runtime's native parameter.
|
|
146
|
-
|
|
147
|
-
const EFFORT_RENDERING = {
|
|
148
|
-
// Claude Code subagent effort: output_config.effort frontmatter key /
|
|
149
|
-
// CLAUDE_CODE_EFFORT_LEVEL env. Supports: low, medium, high, xhigh, max.
|
|
150
|
-
// Does NOT support 'minimal' (Codex-only) -> clamp to 'low'.
|
|
151
|
-
claude: {
|
|
152
|
-
param: 'output_config.effort',
|
|
153
|
-
channel: 'frontmatter',
|
|
154
|
-
supported: new Set(['low', 'medium', 'high', 'xhigh', 'max']),
|
|
155
|
-
clamp(level) {
|
|
156
|
-
if (level === 'minimal') return 'low';
|
|
157
|
-
return level;
|
|
158
|
-
},
|
|
159
|
-
},
|
|
160
|
-
// Codex Responses API reasoning.effort. Supports: minimal, low, medium, high, xhigh.
|
|
161
|
-
// Does NOT support 'max' (Anthropic-only) -> clamp to 'xhigh'.
|
|
162
|
-
codex: {
|
|
163
|
-
param: 'model_reasoning_effort',
|
|
164
|
-
channel: 'api',
|
|
165
|
-
supported: new Set(['minimal', 'low', 'medium', 'high', 'xhigh']),
|
|
166
|
-
clamp(level) {
|
|
167
|
-
if (level === 'max') return 'xhigh';
|
|
168
|
-
return level;
|
|
169
|
-
},
|
|
170
|
-
},
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Render a universal effort string for a specific runtime.
|
|
175
|
-
*
|
|
176
|
-
* Returns { value (clamped), param, channel } where:
|
|
177
|
-
* - value: the clamped effort string safe to pass to the runtime
|
|
178
|
-
* - param: the native parameter name (e.g. 'output_config.effort')
|
|
179
|
-
* - channel: how the value is propagated ('frontmatter', 'api', null)
|
|
180
|
-
*
|
|
181
|
-
* Unknown runtimes return { value: universalEffort, param: null, channel: null }
|
|
182
|
-
* so callers can always read .value safely.
|
|
183
|
-
*/
|
|
184
|
-
function renderEffortForRuntime(runtime, universalEffort) {
|
|
185
|
-
const spec = EFFORT_RENDERING[runtime];
|
|
186
|
-
if (!spec) {
|
|
187
|
-
return { value: universalEffort, param: null, channel: null };
|
|
188
|
-
}
|
|
189
|
-
return {
|
|
190
|
-
value: spec.clamp(universalEffort),
|
|
191
|
-
param: spec.param,
|
|
192
|
-
channel: spec.channel,
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// ─── Fast mode propagation ───────────────────────────────────────────────────
|
|
197
|
-
//
|
|
198
|
-
// RUNTIMES_WITH_FAST_MODE is the set of runtimes where fast_mode=true can be
|
|
199
|
-
// propagated to a SPAWNED SUBAGENT via a native mechanism.
|
|
200
|
-
//
|
|
201
|
-
// Claude Code has NO per-subagent fast-mode mechanism — /fast is a session-level
|
|
202
|
-
// toggle only. Emitting a `fast_mode: true` frontmatter key on a Claude subagent
|
|
203
|
-
// would be a SILENT NO-OP, which is why 'claude' is deliberately excluded here.
|
|
204
|
-
//
|
|
205
|
-
// Only API-direct runtimes ('api') accept a speed:"fast" field in the request.
|
|
206
|
-
// Codex and other runtimes do not expose per-call fast_mode either.
|
|
207
|
-
const RUNTIMES_WITH_FAST_MODE = new Set(['api']);
|
|
208
|
-
|
|
209
|
-
module.exports = {
|
|
210
|
-
catalog,
|
|
211
|
-
MODEL_PROFILES,
|
|
212
|
-
VALID_PROFILES,
|
|
213
|
-
AGENT_TO_PHASE_TYPE,
|
|
214
|
-
VALID_PHASE_TYPES,
|
|
215
|
-
AGENT_DEFAULT_TIERS,
|
|
216
|
-
VALID_AGENT_TIERS,
|
|
217
|
-
MODEL_ALIAS_MAP,
|
|
218
|
-
RUNTIME_PROFILE_MAP,
|
|
219
|
-
KNOWN_RUNTIMES,
|
|
220
|
-
RUNTIMES_WITH_REASONING_EFFORT,
|
|
221
|
-
PROVIDER_PRESETS,
|
|
222
|
-
KNOWN_PROVIDERS,
|
|
223
|
-
nextTier,
|
|
224
|
-
formatAgentToModelMapAsTable,
|
|
225
|
-
getAgentToModelMapForProfile,
|
|
226
|
-
EFFORT_RENDERING,
|
|
227
|
-
renderEffortForRuntime,
|
|
228
|
-
RUNTIMES_WITH_FAST_MODE,
|
|
229
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const {
|
|
4
|
-
MODEL_PROFILES,
|
|
5
|
-
VALID_PROFILES,
|
|
6
|
-
AGENT_TO_PHASE_TYPE,
|
|
7
|
-
VALID_PHASE_TYPES,
|
|
8
|
-
AGENT_DEFAULT_TIERS,
|
|
9
|
-
VALID_AGENT_TIERS,
|
|
10
|
-
nextTier,
|
|
11
|
-
formatAgentToModelMapAsTable,
|
|
12
|
-
getAgentToModelMapForProfile,
|
|
13
|
-
EFFORT_RENDERING,
|
|
14
|
-
renderEffortForRuntime,
|
|
15
|
-
RUNTIMES_WITH_FAST_MODE,
|
|
16
|
-
} = require('./model-catalog.cjs');
|
|
17
|
-
|
|
18
|
-
module.exports = {
|
|
19
|
-
MODEL_PROFILES,
|
|
20
|
-
VALID_PROFILES,
|
|
21
|
-
AGENT_TO_PHASE_TYPE,
|
|
22
|
-
VALID_PHASE_TYPES,
|
|
23
|
-
AGENT_DEFAULT_TIERS,
|
|
24
|
-
VALID_AGENT_TIERS,
|
|
25
|
-
nextTier,
|
|
26
|
-
formatAgentToModelMapAsTable,
|
|
27
|
-
getAgentToModelMapForProfile,
|
|
28
|
-
EFFORT_RENDERING,
|
|
29
|
-
renderEffortForRuntime,
|
|
30
|
-
RUNTIMES_WITH_FAST_MODE,
|
|
31
|
-
};
|