@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,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Milestone — Milestone and requirements lifecycle operations.
|
|
4
|
+
*
|
|
5
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/milestone.cjs collapsed to
|
|
6
|
+
* a TypeScript source of truth, compiled by tsc to a gitignored .cjs at the same
|
|
7
|
+
* require() path. Behaviour preserved byte-for-behaviour; only types are added.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
13
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- core.cjs is an export= CommonJS module
|
|
15
|
+
const core = require("./core.cjs");
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- planning-workspace.cjs is an export= CommonJS module
|
|
17
|
+
const planningWorkspace = require("./planning-workspace.cjs");
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- frontmatter.cjs is an export= CommonJS module
|
|
19
|
+
const frontmatterMod = require("./frontmatter.cjs");
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports -- state.cjs is an export= CommonJS module
|
|
21
|
+
const stateMod = require("./state.cjs");
|
|
22
|
+
const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
|
|
23
|
+
const runtime_slash_cjs_1 = require("./runtime-slash.cjs");
|
|
24
|
+
const { escapeRegex, getMilestonePhaseFilter, extractOneLinerFromBody, normalizePhaseName, phaseTokenMatches, output, error, } = core;
|
|
25
|
+
const { planningPaths } = planningWorkspace;
|
|
26
|
+
const { extractFrontmatter } = frontmatterMod;
|
|
27
|
+
const { writeStateMd, stateReplaceFieldWithFallback } = stateMod;
|
|
28
|
+
function cmdRequirementsMarkComplete(cwd, reqIdsRaw, raw) {
|
|
29
|
+
if (!reqIdsRaw || reqIdsRaw.length === 0) {
|
|
30
|
+
error('requirement IDs required. Usage: requirements mark-complete REQ-01,REQ-02 or REQ-01 REQ-02');
|
|
31
|
+
}
|
|
32
|
+
// Accept comma-separated, space-separated, or bracket-wrapped: [REQ-01, REQ-02]
|
|
33
|
+
const reqIds = reqIdsRaw
|
|
34
|
+
.join(' ')
|
|
35
|
+
.replace(/[\[\]]/g, '')
|
|
36
|
+
.split(/[,\s]+/)
|
|
37
|
+
.map((r) => r.trim())
|
|
38
|
+
.filter(Boolean);
|
|
39
|
+
if (reqIds.length === 0) {
|
|
40
|
+
error('no valid requirement IDs found');
|
|
41
|
+
}
|
|
42
|
+
const reqPath = planningPaths(cwd).requirements;
|
|
43
|
+
if (!node_fs_1.default.existsSync(reqPath)) {
|
|
44
|
+
output({ updated: false, reason: 'REQUIREMENTS.md not found', ids: reqIds }, raw, 'no requirements file');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
let reqContent = node_fs_1.default.readFileSync(reqPath, 'utf-8');
|
|
48
|
+
const updated = [];
|
|
49
|
+
const alreadyComplete = [];
|
|
50
|
+
const notFound = [];
|
|
51
|
+
for (const reqId of reqIds) {
|
|
52
|
+
let found = false;
|
|
53
|
+
const reqEscaped = escapeRegex(reqId);
|
|
54
|
+
// Update checkbox: - [ ] **REQ-ID** → - [x] **REQ-ID**
|
|
55
|
+
// Use replace() directly and compare — avoids test()+replace() global regex
|
|
56
|
+
// lastIndex bug where test() advances state and replace() misses matches.
|
|
57
|
+
const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*\\*\\*${reqEscaped}\\*\\*)`, 'gi');
|
|
58
|
+
const afterCheckbox = reqContent.replace(checkboxPattern, '$1x$2');
|
|
59
|
+
if (afterCheckbox !== reqContent) {
|
|
60
|
+
reqContent = afterCheckbox;
|
|
61
|
+
found = true;
|
|
62
|
+
}
|
|
63
|
+
// Update traceability table: | REQ-ID | Phase N | Pending | → | REQ-ID | Phase N | Complete |
|
|
64
|
+
const tablePattern = new RegExp(`(\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|)\\s*Pending\\s*(\\|)`, 'gi');
|
|
65
|
+
const afterTable = reqContent.replace(tablePattern, '$1 Complete $2');
|
|
66
|
+
if (afterTable !== reqContent) {
|
|
67
|
+
reqContent = afterTable;
|
|
68
|
+
found = true;
|
|
69
|
+
}
|
|
70
|
+
if (found) {
|
|
71
|
+
updated.push(reqId);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Check if already complete before declaring not_found.
|
|
75
|
+
// Non-global flag is fine here — we only need to know if a match exists.
|
|
76
|
+
const doneCheckbox = new RegExp(`-\\s*\\[x\\]\\s*\\*\\*${reqEscaped}\\*\\*`, 'i');
|
|
77
|
+
const doneTable = new RegExp(`\\|\\s*${reqEscaped}\\s*\\|[^|]+\\|\\s*Complete\\s*\\|`, 'i');
|
|
78
|
+
if (doneCheckbox.test(reqContent) || doneTable.test(reqContent)) {
|
|
79
|
+
alreadyComplete.push(reqId);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
notFound.push(reqId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (updated.length > 0) {
|
|
87
|
+
(0, shell_command_projection_cjs_1.platformWriteSync)(reqPath, reqContent);
|
|
88
|
+
}
|
|
89
|
+
output({
|
|
90
|
+
updated: updated.length > 0,
|
|
91
|
+
marked_complete: updated,
|
|
92
|
+
already_complete: alreadyComplete,
|
|
93
|
+
not_found: notFound,
|
|
94
|
+
total: reqIds.length,
|
|
95
|
+
}, raw, `${updated.length}/${reqIds.length} requirements marked complete`);
|
|
96
|
+
}
|
|
97
|
+
function cmdMilestoneComplete(cwd, version, options, raw) {
|
|
98
|
+
if (!version) {
|
|
99
|
+
error('version required for milestone complete (e.g., v1.0)');
|
|
100
|
+
}
|
|
101
|
+
const roadmapPath = planningPaths(cwd).roadmap;
|
|
102
|
+
const reqPath = planningPaths(cwd).requirements;
|
|
103
|
+
const statePath = planningPaths(cwd).state;
|
|
104
|
+
const milestonesPath = node_path_1.default.join(cwd, '.planning', 'MILESTONES.md');
|
|
105
|
+
const archiveDir = node_path_1.default.join(cwd, '.planning', 'milestones');
|
|
106
|
+
const phasesDir = planningPaths(cwd).phases;
|
|
107
|
+
const today = new Date().toISOString().split('T')[0];
|
|
108
|
+
const milestoneName = options.name || version;
|
|
109
|
+
// Ensure archive directory exists
|
|
110
|
+
(0, shell_command_projection_cjs_1.platformEnsureDir)(archiveDir);
|
|
111
|
+
// Scope stats and accomplishments to only the phases belonging to the
|
|
112
|
+
// current milestone's ROADMAP. Uses the shared filter from core.cjs
|
|
113
|
+
// (same logic used by cmdPhasesList and other callers).
|
|
114
|
+
const isDirInMilestone = getMilestonePhaseFilter(cwd, version);
|
|
115
|
+
if (isDirInMilestone.missingExplicitVersion) {
|
|
116
|
+
error(`no phases found for milestone ${version} in ROADMAP.md`);
|
|
117
|
+
}
|
|
118
|
+
// Guard: prevent marking complete when ROADMAP still lists phases that have
|
|
119
|
+
// no directory on disk (disk_status: no_directory). This catches the case
|
|
120
|
+
// where the active milestone was erroneously marked complete before phases
|
|
121
|
+
// were even started. Only fires when STATE.md confirms the current milestone
|
|
122
|
+
// version matches what is being completed — no false positives on fresh
|
|
123
|
+
// projects where phases haven't been scaffolded yet.
|
|
124
|
+
// Pass --force to override this guard.
|
|
125
|
+
if (!options.force) {
|
|
126
|
+
try {
|
|
127
|
+
// Only guard when STATE.md's milestone field matches the version being completed.
|
|
128
|
+
let stateVersion = null;
|
|
129
|
+
try {
|
|
130
|
+
const stateRaw = node_fs_1.default.existsSync(statePath) ? node_fs_1.default.readFileSync(statePath, 'utf-8') : null;
|
|
131
|
+
if (stateRaw) {
|
|
132
|
+
const milestoneMatch = stateRaw.match(/^milestone:\s*(.+)/m);
|
|
133
|
+
if (milestoneMatch)
|
|
134
|
+
stateVersion = milestoneMatch[1].trim();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
/* skip */
|
|
139
|
+
}
|
|
140
|
+
if (stateVersion && stateVersion === version) {
|
|
141
|
+
const { extractCurrentMilestone } = core;
|
|
142
|
+
const roadmapContent = node_fs_1.default.readFileSync(roadmapPath, 'utf-8');
|
|
143
|
+
const scopedContent = extractCurrentMilestone(roadmapContent, cwd);
|
|
144
|
+
const phasePattern = /#{2,4}\s*Phase\s+(\d+[A-Z]?(?:\.\d+)*)\s*:\s*([^\n]+)/gi;
|
|
145
|
+
const noDirectoryPhases = [];
|
|
146
|
+
let pm;
|
|
147
|
+
const phaseDirEntries = (() => {
|
|
148
|
+
try {
|
|
149
|
+
return node_fs_1.default
|
|
150
|
+
.readdirSync(phasesDir, { withFileTypes: true })
|
|
151
|
+
.filter((e) => e.isDirectory())
|
|
152
|
+
.map((e) => e.name);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
})();
|
|
158
|
+
while ((pm = phasePattern.exec(scopedContent)) !== null) {
|
|
159
|
+
const phaseNum = pm[1];
|
|
160
|
+
const normalized = normalizePhaseName(phaseNum);
|
|
161
|
+
// A phase has disk_status: 'no_directory' when no phase directory
|
|
162
|
+
// with a matching token exists on disk. Use the same phaseTokenMatches
|
|
163
|
+
// helper that roadmap.analyze uses to avoid false positives on decimal
|
|
164
|
+
// (2.1) and letter-suffix (12A) phase IDs.
|
|
165
|
+
const hasDirectory = phaseDirEntries.some((d) => phaseTokenMatches(d, normalized));
|
|
166
|
+
if (!hasDirectory) {
|
|
167
|
+
noDirectoryPhases.push(phaseNum);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (noDirectoryPhases.length > 0) {
|
|
171
|
+
error(`Cannot mark milestone complete: ROADMAP lists ${noDirectoryPhases.length} unstarted phase(s) ` +
|
|
172
|
+
`(e.g. Phase ${noDirectoryPhases[0]}). Re-run with --force to override.`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
// If the error came from our guard, re-throw it; otherwise skip silently.
|
|
178
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
179
|
+
if (message && message.startsWith('Cannot mark milestone complete:'))
|
|
180
|
+
throw e;
|
|
181
|
+
// Phase scan failed or STATE version mismatch — allow completion to proceed.
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Gather stats from phases (scoped to current milestone only)
|
|
185
|
+
let phaseCount = 0;
|
|
186
|
+
let totalPlans = 0;
|
|
187
|
+
let totalTasks = 0;
|
|
188
|
+
const accomplishments = [];
|
|
189
|
+
try {
|
|
190
|
+
const entries = node_fs_1.default.readdirSync(phasesDir, { withFileTypes: true });
|
|
191
|
+
const dirs = entries
|
|
192
|
+
.filter((e) => e.isDirectory())
|
|
193
|
+
.map((e) => e.name)
|
|
194
|
+
.sort();
|
|
195
|
+
for (const dir of dirs) {
|
|
196
|
+
if (!isDirInMilestone(dir))
|
|
197
|
+
continue;
|
|
198
|
+
phaseCount++;
|
|
199
|
+
const phaseFiles = node_fs_1.default.readdirSync(node_path_1.default.join(phasesDir, dir));
|
|
200
|
+
const plans = phaseFiles.filter((f) => f.endsWith('-PLAN.md') || f === 'PLAN.md');
|
|
201
|
+
const summaries = phaseFiles.filter((f) => f.endsWith('-SUMMARY.md') || f === 'SUMMARY.md');
|
|
202
|
+
totalPlans += plans.length;
|
|
203
|
+
// Extract one-liners from summaries
|
|
204
|
+
for (const s of summaries) {
|
|
205
|
+
try {
|
|
206
|
+
const content = node_fs_1.default.readFileSync(node_path_1.default.join(phasesDir, dir, s), 'utf-8');
|
|
207
|
+
const fm = extractFrontmatter(content);
|
|
208
|
+
const rawOneLiner = fm['one-liner'];
|
|
209
|
+
const oneLiner = (typeof rawOneLiner === 'string' ? rawOneLiner : '') || extractOneLinerFromBody(content);
|
|
210
|
+
if (oneLiner) {
|
|
211
|
+
accomplishments.push(oneLiner);
|
|
212
|
+
}
|
|
213
|
+
// Count tasks: prefer **Tasks:** N from Performance section,
|
|
214
|
+
// then <task XML tags, then ## Task N markdown headers
|
|
215
|
+
const tasksFieldMatch = content.match(/\*\*Tasks:\*\*\s*(\d+)/);
|
|
216
|
+
if (tasksFieldMatch) {
|
|
217
|
+
totalTasks += parseInt(tasksFieldMatch[1], 10);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
const xmlTaskMatches = content.match(/<task[\s>]/gi) || [];
|
|
221
|
+
const mdTaskMatches = content.match(/##\s*Task\s*\d+/gi) || [];
|
|
222
|
+
totalTasks += xmlTaskMatches.length || mdTaskMatches.length;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
/* intentionally empty */
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
/* intentionally empty */
|
|
233
|
+
}
|
|
234
|
+
// Archive ROADMAP.md
|
|
235
|
+
if (node_fs_1.default.existsSync(roadmapPath)) {
|
|
236
|
+
const roadmapContent = node_fs_1.default.readFileSync(roadmapPath, 'utf-8');
|
|
237
|
+
(0, shell_command_projection_cjs_1.platformWriteSync)(node_path_1.default.join(archiveDir, `${version}-ROADMAP.md`), roadmapContent);
|
|
238
|
+
}
|
|
239
|
+
// Archive REQUIREMENTS.md
|
|
240
|
+
if (node_fs_1.default.existsSync(reqPath)) {
|
|
241
|
+
const reqContent = node_fs_1.default.readFileSync(reqPath, 'utf-8');
|
|
242
|
+
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`;
|
|
243
|
+
(0, shell_command_projection_cjs_1.platformWriteSync)(node_path_1.default.join(archiveDir, `${version}-REQUIREMENTS.md`), archiveHeader + reqContent);
|
|
244
|
+
}
|
|
245
|
+
// Archive audit file if exists
|
|
246
|
+
const auditFile = node_path_1.default.join(cwd, '.planning', `${version}-MILESTONE-AUDIT.md`);
|
|
247
|
+
if (node_fs_1.default.existsSync(auditFile)) {
|
|
248
|
+
node_fs_1.default.renameSync(auditFile, node_path_1.default.join(archiveDir, `${version}-MILESTONE-AUDIT.md`));
|
|
249
|
+
}
|
|
250
|
+
// Create/append MILESTONES.md entry
|
|
251
|
+
const accomplishmentsList = accomplishments.map((a) => `- ${a}`).join('\n');
|
|
252
|
+
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`;
|
|
253
|
+
if (node_fs_1.default.existsSync(milestonesPath)) {
|
|
254
|
+
const existing = node_fs_1.default.readFileSync(milestonesPath, 'utf-8');
|
|
255
|
+
if (!existing.trim()) {
|
|
256
|
+
// Empty file — treat like new
|
|
257
|
+
(0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Insert after the header line(s) for reverse chronological order (newest first)
|
|
261
|
+
const headerMatch = existing.match(/^(#{1,3}\s+[^\n]*\n\n?)/);
|
|
262
|
+
if (headerMatch) {
|
|
263
|
+
const header = headerMatch[1];
|
|
264
|
+
const rest = existing.slice(header.length);
|
|
265
|
+
(0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, header + milestoneEntry + rest);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
// No recognizable header — prepend the entry
|
|
269
|
+
(0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, milestoneEntry + existing);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
(0, shell_command_projection_cjs_1.platformWriteSync)(milestonesPath, `# Milestones\n\n${milestoneEntry}`);
|
|
275
|
+
}
|
|
276
|
+
// Update STATE.md — keep frontmatter/body semantically aligned after closure
|
|
277
|
+
if (node_fs_1.default.existsSync(statePath)) {
|
|
278
|
+
let stateContent = node_fs_1.default.readFileSync(statePath, 'utf-8');
|
|
279
|
+
stateContent = stateReplaceFieldWithFallback(stateContent, 'Status', null, `${version} milestone complete`);
|
|
280
|
+
stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity', 'Last activity', today);
|
|
281
|
+
stateContent = stateReplaceFieldWithFallback(stateContent, 'Last Activity Description', null, `${version} milestone completed and archived`);
|
|
282
|
+
// Reset Current Position narrative so resume/progress flows do not keep
|
|
283
|
+
// pointing at closed-phase execution instructions.
|
|
284
|
+
const positionPattern = /(##\s*Current Position\s*\n)([\s\S]*?)(?=\n##|$)/i;
|
|
285
|
+
const closedPositionBody = `\nPhase: Milestone ${version} complete\n` +
|
|
286
|
+
`Plan: —\n` +
|
|
287
|
+
`Status: Awaiting next milestone\n` +
|
|
288
|
+
`Last activity: ${today} — Milestone ${version} completed and archived\n\n`;
|
|
289
|
+
if (positionPattern.test(stateContent)) {
|
|
290
|
+
stateContent = stateContent.replace(positionPattern, (_m, header) => `${header}${closedPositionBody}`);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
stateContent = `${stateContent.trimEnd()}\n\n## Current Position\n${closedPositionBody}`;
|
|
294
|
+
}
|
|
295
|
+
// Normalize operator-next-step tails that can become stale after close.
|
|
296
|
+
const operatorPattern = /(##\s*Operator Next Steps\s*\n)([\s\S]*?)(?=\n##|$)/i;
|
|
297
|
+
if (operatorPattern.test(stateContent)) {
|
|
298
|
+
stateContent = stateContent.replace(operatorPattern, `$1\n- Start the next milestone with ${(0, runtime_slash_cjs_1.formatGsdSlash)('new-milestone', (0, runtime_slash_cjs_1.resolveRuntime)(cwd))}\n\n`);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
stateContent = `${stateContent.trimEnd()}\n\n## Operator Next Steps\n\n- Start the next milestone with ${(0, runtime_slash_cjs_1.formatGsdSlash)('new-milestone', (0, runtime_slash_cjs_1.resolveRuntime)(cwd))}\n`;
|
|
302
|
+
}
|
|
303
|
+
writeStateMd(statePath, stateContent, cwd);
|
|
304
|
+
}
|
|
305
|
+
// Archive phase directories if requested
|
|
306
|
+
let phasesArchived = false;
|
|
307
|
+
if (options.archivePhases) {
|
|
308
|
+
try {
|
|
309
|
+
const phaseArchiveDir = node_path_1.default.join(archiveDir, `${version}-phases`);
|
|
310
|
+
(0, shell_command_projection_cjs_1.platformEnsureDir)(phaseArchiveDir);
|
|
311
|
+
const phaseEntries = node_fs_1.default.readdirSync(phasesDir, { withFileTypes: true });
|
|
312
|
+
const phaseDirNames = phaseEntries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
313
|
+
let archivedCount = 0;
|
|
314
|
+
for (const dir of phaseDirNames) {
|
|
315
|
+
if (!isDirInMilestone(dir))
|
|
316
|
+
continue;
|
|
317
|
+
node_fs_1.default.renameSync(node_path_1.default.join(phasesDir, dir), node_path_1.default.join(phaseArchiveDir, dir));
|
|
318
|
+
archivedCount++;
|
|
319
|
+
}
|
|
320
|
+
phasesArchived = archivedCount > 0;
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
/* intentionally empty */
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const result = {
|
|
327
|
+
version,
|
|
328
|
+
name: milestoneName,
|
|
329
|
+
date: today,
|
|
330
|
+
phases: phaseCount,
|
|
331
|
+
plans: totalPlans,
|
|
332
|
+
tasks: totalTasks,
|
|
333
|
+
accomplishments,
|
|
334
|
+
archived: {
|
|
335
|
+
roadmap: node_fs_1.default.existsSync(node_path_1.default.join(archiveDir, `${version}-ROADMAP.md`)),
|
|
336
|
+
requirements: node_fs_1.default.existsSync(node_path_1.default.join(archiveDir, `${version}-REQUIREMENTS.md`)),
|
|
337
|
+
audit: node_fs_1.default.existsSync(node_path_1.default.join(archiveDir, `${version}-MILESTONE-AUDIT.md`)),
|
|
338
|
+
phases: phasesArchived,
|
|
339
|
+
},
|
|
340
|
+
milestones_updated: true,
|
|
341
|
+
state_updated: node_fs_1.default.existsSync(statePath),
|
|
342
|
+
};
|
|
343
|
+
output(result, raw);
|
|
344
|
+
}
|
|
345
|
+
function cmdPhasesClear(cwd, raw, args) {
|
|
346
|
+
const phasesDir = planningPaths(cwd).phases;
|
|
347
|
+
const confirm = Array.isArray(args) && args.includes('--confirm');
|
|
348
|
+
let cleared = 0;
|
|
349
|
+
if (node_fs_1.default.existsSync(phasesDir)) {
|
|
350
|
+
const entries = node_fs_1.default.readdirSync(phasesDir, { withFileTypes: true });
|
|
351
|
+
const dirs = entries.filter((e) => e.isDirectory() && !/^999(?:\.|$)/.test(e.name));
|
|
352
|
+
if (dirs.length > 0 && !confirm) {
|
|
353
|
+
error(`phases clear would delete ${dirs.length} phase director${dirs.length === 1 ? 'y' : 'ies'}. ` +
|
|
354
|
+
`Pass --confirm to proceed.`);
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
for (const entry of dirs) {
|
|
358
|
+
node_fs_1.default.rmSync(node_path_1.default.join(phasesDir, entry.name), { recursive: true, force: true });
|
|
359
|
+
cleared++;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (e) {
|
|
363
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
364
|
+
error('Failed to clear phases directory: ' + message);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
output({ cleared }, raw, `${cleared} phase director${cleared === 1 ? 'y' : 'ies'} cleared`);
|
|
368
|
+
}
|
|
369
|
+
module.exports = {
|
|
370
|
+
cmdRequirementsMarkComplete,
|
|
371
|
+
cmdMilestoneComplete,
|
|
372
|
+
cmdPhasesClear,
|
|
373
|
+
};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Model catalog — typed access to model-catalog.json.
|
|
4
|
+
*
|
|
5
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/model-catalog.cjs
|
|
6
|
+
* collapsed to a TypeScript source of truth. Behaviour is preserved
|
|
7
|
+
* byte-for-behaviour from the prior hand-written .cjs; only types are added.
|
|
8
|
+
*/
|
|
9
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
10
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.RUNTIMES_WITH_FAST_MODE = exports.EFFORT_RENDERING = exports.KNOWN_PROVIDERS = exports.PROVIDER_PRESETS = exports.RUNTIMES_WITH_REASONING_EFFORT = exports.KNOWN_RUNTIMES = exports.RUNTIME_PROFILE_MAP = exports.MODEL_ALIAS_MAP = exports.AGENT_DEFAULT_TIERS = exports.AGENT_TO_PHASE_TYPE = exports.MODEL_PROFILES = exports.VALID_AGENT_TIERS = exports.VALID_PHASE_TYPES = exports.VALID_PROFILES = exports.catalog = void 0;
|
|
14
|
+
exports.nextTier = nextTier;
|
|
15
|
+
exports.formatAgentToModelMapAsTable = formatAgentToModelMapAsTable;
|
|
16
|
+
exports.getAgentToModelMapForProfile = getAgentToModelMapForProfile;
|
|
17
|
+
exports.renderEffortForRuntime = renderEffortForRuntime;
|
|
18
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
19
|
+
// In .cts (CommonJS output) files, `require` is available as a global;
|
|
20
|
+
// we use it directly to load JSON candidates.
|
|
21
|
+
const _require = require;
|
|
22
|
+
// Resolve model-catalog.json via a prioritised candidate list so the module
|
|
23
|
+
// works in every layout:
|
|
24
|
+
//
|
|
25
|
+
// 1. Co-located install path — gsd-core/bin/shared/model-catalog.json
|
|
26
|
+
// 2. Source-repo dev path — sdk/shared/model-catalog.json
|
|
27
|
+
// 3. GSD_MODEL_CATALOG env override
|
|
28
|
+
const _catalogCandidates = [
|
|
29
|
+
node_path_1.default.resolve(__dirname, '..', 'shared', 'model-catalog.json'),
|
|
30
|
+
node_path_1.default.resolve(__dirname, '..', '..', '..', 'sdk', 'shared', 'model-catalog.json'),
|
|
31
|
+
...(process.env['GSD_MODEL_CATALOG'] ? [node_path_1.default.resolve(process.env['GSD_MODEL_CATALOG'])] : []),
|
|
32
|
+
];
|
|
33
|
+
let catalog = null;
|
|
34
|
+
let _catalogLastErr = null;
|
|
35
|
+
for (const _p of _catalogCandidates) {
|
|
36
|
+
try {
|
|
37
|
+
catalog = _require(_p);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
const isMissingCandidate = (e && e.code === 'MODULE_NOT_FOUND' && String(e.message || '').includes(_p)) ||
|
|
42
|
+
(e && e.code === 'ENOENT');
|
|
43
|
+
if (!isMissingCandidate)
|
|
44
|
+
throw e;
|
|
45
|
+
_catalogLastErr = e;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!catalog) {
|
|
49
|
+
throw new Error(`model-catalog.json not found. Tried:\n${_catalogCandidates.map((p) => ` ${p}`).join('\n')}\nLast error: ${_catalogLastErr?.message}`);
|
|
50
|
+
}
|
|
51
|
+
// After the throw guard above, catalog is guaranteed non-null.
|
|
52
|
+
const _catalog = catalog;
|
|
53
|
+
exports.catalog = _catalog;
|
|
54
|
+
exports.VALID_PROFILES = [..._catalog.profiles];
|
|
55
|
+
exports.VALID_PHASE_TYPES = new Set(_catalog.phaseTypes);
|
|
56
|
+
exports.VALID_AGENT_TIERS = new Set(Object.keys(_catalog.adaptiveTierMap));
|
|
57
|
+
exports.MODEL_PROFILES = Object.fromEntries(Object.entries(_catalog.agents).map(([agent, meta]) => [agent, {
|
|
58
|
+
quality: meta.golden,
|
|
59
|
+
balanced: meta.balanced,
|
|
60
|
+
budget: meta.budget,
|
|
61
|
+
adaptive: _catalog.adaptiveTierMap[meta.routingTier],
|
|
62
|
+
}]));
|
|
63
|
+
exports.AGENT_TO_PHASE_TYPE = Object.fromEntries(Object.entries(_catalog.agents).map(([agent, meta]) => [agent, meta.phaseType]));
|
|
64
|
+
exports.AGENT_DEFAULT_TIERS = Object.fromEntries(Object.entries(_catalog.agents).map(([agent, meta]) => [agent, meta.routingTier]));
|
|
65
|
+
exports.MODEL_ALIAS_MAP = Object.fromEntries(Object.entries(_catalog.runtimeTierDefaults['claude'] ?? {}).map(([tier, entry]) => [tier, entry?.model]));
|
|
66
|
+
exports.RUNTIME_PROFILE_MAP = (() => {
|
|
67
|
+
const result = {};
|
|
68
|
+
for (const [runtime, tiers] of Object.entries(_catalog.runtimeTierDefaults)) {
|
|
69
|
+
const filtered = {};
|
|
70
|
+
for (const [tier, entry] of Object.entries(tiers)) {
|
|
71
|
+
if (entry)
|
|
72
|
+
filtered[tier] = entry;
|
|
73
|
+
}
|
|
74
|
+
if (Object.keys(filtered).length > 0)
|
|
75
|
+
result[runtime] = filtered;
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
})();
|
|
79
|
+
exports.KNOWN_RUNTIMES = new Set(Object.keys(_catalog.runtimeTierDefaults));
|
|
80
|
+
exports.RUNTIMES_WITH_REASONING_EFFORT = new Set(Object.entries(_catalog.runtimeTierDefaults)
|
|
81
|
+
.filter(([, tiers]) => Object.values(tiers).some((entry) => entry && entry.reasoning_effort))
|
|
82
|
+
.map(([runtime]) => runtime));
|
|
83
|
+
exports.PROVIDER_PRESETS = _catalog.providerPresets ?? {};
|
|
84
|
+
// KNOWN_PROVIDERS excludes 'generic' — it is a sentinel (all null entries) that
|
|
85
|
+
// forces users to supply model IDs via model_profile_overrides. It is not a
|
|
86
|
+
// real catalog-backed provider (#49).
|
|
87
|
+
exports.KNOWN_PROVIDERS = new Set(Object.entries(exports.PROVIDER_PRESETS)
|
|
88
|
+
.filter(([, tiers]) => Object.values(tiers).some((budgets) => budgets && Object.values(budgets).some((entry) => entry && entry.model)))
|
|
89
|
+
.map(([name]) => name));
|
|
90
|
+
function nextTier(currentTier) {
|
|
91
|
+
const order = ['light', 'standard', 'heavy'];
|
|
92
|
+
const idx = order.indexOf(String(currentTier));
|
|
93
|
+
if (idx === -1)
|
|
94
|
+
return null;
|
|
95
|
+
return order[Math.min(idx + 1, order.length - 1)];
|
|
96
|
+
}
|
|
97
|
+
function formatAgentToModelMapAsTable(agentToModelMap) {
|
|
98
|
+
const agentWidth = Math.max('Agent'.length, ...Object.keys(agentToModelMap).map((a) => a.length));
|
|
99
|
+
const modelWidth = Math.max('Model'.length, ...Object.values(agentToModelMap).map((m) => m.length));
|
|
100
|
+
const sep = '─'.repeat(agentWidth + 2) + '┼' + '─'.repeat(modelWidth + 2);
|
|
101
|
+
const header = ` ${'Agent'.padEnd(agentWidth)} │ ${'Model'.padEnd(modelWidth)}`;
|
|
102
|
+
let out = `${header}\n${sep}\n`;
|
|
103
|
+
for (const [agent, model] of Object.entries(agentToModelMap)) {
|
|
104
|
+
out += ` ${agent.padEnd(agentWidth)} │ ${model.padEnd(modelWidth)}\n`;
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
function getAgentToModelMapForProfile(normalizedProfile) {
|
|
109
|
+
const profile = exports.VALID_PROFILES.includes(normalizedProfile) ? normalizedProfile : 'balanced';
|
|
110
|
+
const out = {};
|
|
111
|
+
for (const [agent, profiles] of Object.entries(exports.MODEL_PROFILES)) {
|
|
112
|
+
const profilesRec = profiles;
|
|
113
|
+
out[agent] = profile === 'inherit' ? 'inherit' : (profilesRec[profile] ?? profiles.balanced);
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
exports.EFFORT_RENDERING = {
|
|
118
|
+
claude: {
|
|
119
|
+
param: 'output_config.effort',
|
|
120
|
+
channel: 'frontmatter',
|
|
121
|
+
supported: new Set(['low', 'medium', 'high', 'xhigh', 'max']),
|
|
122
|
+
clamp(level) {
|
|
123
|
+
if (level === 'minimal')
|
|
124
|
+
return 'low';
|
|
125
|
+
return level;
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
codex: {
|
|
129
|
+
param: 'model_reasoning_effort',
|
|
130
|
+
channel: 'api',
|
|
131
|
+
supported: new Set(['minimal', 'low', 'medium', 'high', 'xhigh']),
|
|
132
|
+
clamp(level) {
|
|
133
|
+
if (level === 'max')
|
|
134
|
+
return 'xhigh';
|
|
135
|
+
return level;
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Render a universal effort string for a specific runtime.
|
|
141
|
+
*/
|
|
142
|
+
function renderEffortForRuntime(runtime, universalEffort) {
|
|
143
|
+
const spec = exports.EFFORT_RENDERING[runtime];
|
|
144
|
+
if (!spec) {
|
|
145
|
+
return { value: universalEffort, param: null, channel: null };
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
value: spec.clamp(universalEffort),
|
|
149
|
+
param: spec.param,
|
|
150
|
+
channel: spec.channel,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// ─── Fast mode propagation ───────────────────────────────────────────────────
|
|
154
|
+
exports.RUNTIMES_WITH_FAST_MODE = new Set(['api']);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* model-profiles — re-exports model catalog symbols consumed by callers that
|
|
4
|
+
* historically required bin/lib/model-profiles.cjs.
|
|
5
|
+
*
|
|
6
|
+
* ADR-457 build-at-publish: the hand-written bin/lib/model-profiles.cjs collapsed
|
|
7
|
+
* to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
|
|
8
|
+
* the prior hand-written .cjs; only types are added.
|
|
9
|
+
*/
|
|
10
|
+
const model_catalog_cjs_1 = require("./model-catalog.cjs");
|
|
11
|
+
module.exports = {
|
|
12
|
+
MODEL_PROFILES: model_catalog_cjs_1.MODEL_PROFILES,
|
|
13
|
+
VALID_PROFILES: model_catalog_cjs_1.VALID_PROFILES,
|
|
14
|
+
AGENT_TO_PHASE_TYPE: model_catalog_cjs_1.AGENT_TO_PHASE_TYPE,
|
|
15
|
+
VALID_PHASE_TYPES: model_catalog_cjs_1.VALID_PHASE_TYPES,
|
|
16
|
+
AGENT_DEFAULT_TIERS: model_catalog_cjs_1.AGENT_DEFAULT_TIERS,
|
|
17
|
+
VALID_AGENT_TIERS: model_catalog_cjs_1.VALID_AGENT_TIERS,
|
|
18
|
+
nextTier: model_catalog_cjs_1.nextTier,
|
|
19
|
+
formatAgentToModelMapAsTable: model_catalog_cjs_1.formatAgentToModelMapAsTable,
|
|
20
|
+
getAgentToModelMapForProfile: model_catalog_cjs_1.getAgentToModelMapForProfile,
|
|
21
|
+
EFFORT_RENDERING: model_catalog_cjs_1.EFFORT_RENDERING,
|
|
22
|
+
renderEffortForRuntime: model_catalog_cjs_1.renderEffortForRuntime,
|
|
23
|
+
RUNTIMES_WITH_FAST_MODE: model_catalog_cjs_1.RUNTIMES_WITH_FAST_MODE,
|
|
24
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DispatchEvent shape factory — issue #177 (ADR-0174 P1.3), extended in #178 (P1.4).
|
|
4
|
+
*
|
|
5
|
+
* Creates a structured event record for every Hub dispatch, used by
|
|
6
|
+
* DispatchLogger to emit stderr errors and opt-in file audit trails.
|
|
7
|
+
*
|
|
8
|
+
* ADR-457 build-at-publish: the hand-written
|
|
9
|
+
* bin/lib/observability/event.cjs collapsed to a TypeScript source of truth.
|
|
10
|
+
* Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
|
|
11
|
+
* only types are added.
|
|
12
|
+
*
|
|
13
|
+
* Shape:
|
|
14
|
+
* traceId: string — UUID v4, generated per dispatch
|
|
15
|
+
* parentTraceId: string|undefined — propagated from the caller when it is a canonical UUID v4
|
|
16
|
+
* (RFC 4122); invalid values are silently coerced to undefined.
|
|
17
|
+
* command: string — the dispatched verb
|
|
18
|
+
* args?: unknown — only present when includeArgs === true
|
|
19
|
+
* result: { kind: 'ok' | 'UnknownCommand' | 'InvalidArgs' | 'HandlerRefusal' | 'HandlerFailure', ...payload }
|
|
20
|
+
* timestamp: string — ISO 8601
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.makeDispatchEvent = makeDispatchEvent;
|
|
24
|
+
const node_crypto_1 = require("node:crypto");
|
|
25
|
+
/**
|
|
26
|
+
* Canonical UUID v4 regex (RFC 4122).
|
|
27
|
+
*/
|
|
28
|
+
const UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
29
|
+
/**
|
|
30
|
+
* Returns true only when value is a canonical UUID v4 string.
|
|
31
|
+
*/
|
|
32
|
+
function isValidParentTraceId(value) {
|
|
33
|
+
return typeof value === 'string' && UUID_V4_REGEX.test(value);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Create a DispatchEvent.
|
|
37
|
+
*/
|
|
38
|
+
function makeDispatchEvent({ command, args, result, includeArgs = false, parentTraceId, }) {
|
|
39
|
+
const resolvedParentTraceId = isValidParentTraceId(parentTraceId) ? parentTraceId : undefined;
|
|
40
|
+
const event = {
|
|
41
|
+
traceId: (0, node_crypto_1.randomUUID)(),
|
|
42
|
+
parentTraceId: resolvedParentTraceId,
|
|
43
|
+
command: String(command),
|
|
44
|
+
result,
|
|
45
|
+
timestamp: new Date().toISOString(),
|
|
46
|
+
};
|
|
47
|
+
if (includeArgs && args !== undefined) {
|
|
48
|
+
event.args = args;
|
|
49
|
+
}
|
|
50
|
+
return Object.freeze(event);
|
|
51
|
+
}
|