@opengsd/gsd-core 1.10.0 → 1.12.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/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-debug-session-manager.md +12 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-dom-verifier.md +169 -0
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +22 -14
- package/agents/gsd-framework-selector.md +1 -3
- package/agents/gsd-intel-updater.md +1 -1
- package/agents/gsd-mempalace-curator.md +5 -3
- package/agents/gsd-pattern-mapper.md +11 -0
- package/agents/gsd-phase-researcher.md +23 -2
- package/agents/gsd-plan-checker.md +50 -53
- package/agents/gsd-planner.md +50 -50
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +2 -2
- package/agents/gsd-roadmapper.md +15 -11
- package/agents/gsd-ui-checker.md +63 -4
- package/agents/gsd-ui-researcher.md +41 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +13 -4
- package/bin/install.js +1448 -1103
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/discuss-phase.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/import.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +1 -1
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +1 -1
- package/commands/gsd/quick.md +9 -5
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1035 -138
- package/gsd-core/bin/lib/active-workstream-store.cjs +146 -22
- package/gsd-core/bin/lib/adr-parser.cjs +13 -7
- package/gsd-core/bin/lib/agent-install-check.cjs +392 -32
- package/gsd-core/bin/lib/api-coverage.cjs +33 -14
- package/gsd-core/bin/lib/artifacts.cjs +5 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +32 -15
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +1026 -268
- package/gsd-core/bin/lib/broken-windows.cjs +306 -28
- package/gsd-core/bin/lib/capability-consent.cjs +149 -15
- package/gsd-core/bin/lib/capability-lifecycle.cjs +45 -0
- package/gsd-core/bin/lib/capability-lock.cjs +10 -4
- package/gsd-core/bin/lib/capability-registry.cjs +845 -130
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-state.cjs +18 -3
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +700 -40
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +216 -42
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/cli-exit.cjs +496 -10
- package/gsd-core/bin/lib/code-review-depth.cjs +288 -0
- package/gsd-core/bin/lib/codex-agent-toml.cjs +735 -0
- package/gsd-core/bin/lib/command-aliases.cjs +22 -0
- package/gsd-core/bin/lib/command-arg-projection.cjs +144 -14
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/command-routing-hub.cjs +31 -2
- package/gsd-core/bin/lib/commands.cjs +1172 -108
- package/gsd-core/bin/lib/commonjs-marker.cjs +12 -6
- package/gsd-core/bin/lib/complexity-trigger.cjs +1192 -0
- package/gsd-core/bin/lib/config-loader.cjs +187 -23
- package/gsd-core/bin/lib/config.cjs +102 -3
- package/gsd-core/bin/lib/configuration.cjs +129 -37
- package/gsd-core/bin/lib/core-utils.cjs +208 -33
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/edge-probe.cjs +9 -1
- package/gsd-core/bin/lib/estimate-cli.cjs +55 -11
- package/gsd-core/bin/lib/exit-code-registry.cjs +98 -0
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +899 -229
- package/gsd-core/bin/lib/gap-checker.cjs +95 -10
- package/gsd-core/bin/lib/git-base-branch.cjs +276 -39
- package/gsd-core/bin/lib/gsd2-import.cjs +10 -1
- package/gsd-core/bin/lib/health-diagnostic-rules/agent-install.cjs +101 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/config-validation.cjs +348 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/consistency.cjs +149 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/install-surface-shadowing.cjs +98 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/milestone-archive-hygiene.cjs +100 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +222 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +268 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/root-existence.cjs +161 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +303 -0
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +187 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +451 -0
- package/gsd-core/bin/lib/host-integration.cjs +39 -6
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +118 -21
- package/gsd-core/bin/lib/init.cjs +439 -168
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +811 -259
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +235 -0
- package/gsd-core/bin/lib/install-profiles.cjs +212 -61
- package/gsd-core/bin/lib/install-scope.cjs +270 -0
- package/gsd-core/bin/lib/install-shadow-report.cjs +385 -0
- package/gsd-core/bin/lib/installed-surface-resolver.cjs +381 -0
- package/gsd-core/bin/lib/installer-migration-report.cjs +3 -0
- package/gsd-core/bin/lib/installer-migrations/010-antigravity-retire-confighome-artifacts.cjs +169 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +148 -38
- package/gsd-core/bin/lib/intel.cjs +101 -26
- package/gsd-core/bin/lib/io.cjs +170 -15
- package/gsd-core/bin/lib/learnings.cjs +85 -14
- package/gsd-core/bin/lib/legacy-cleanup.cjs +8 -2
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +2 -1
- package/gsd-core/bin/lib/markdown-table.cjs +183 -22
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +842 -73
- package/gsd-core/bin/lib/model-catalog.cjs +232 -16
- package/gsd-core/bin/lib/model-resolver.cjs +193 -68
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/onboard-projection.cjs +5 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +18 -9
- package/gsd-core/bin/lib/phase-id.cjs +514 -40
- package/gsd-core/bin/lib/phase-lifecycle.cjs +52 -19
- package/gsd-core/bin/lib/phase-locator.cjs +262 -34
- package/gsd-core/bin/lib/phase.cjs +1038 -214
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +72 -1
- package/gsd-core/bin/lib/plan-document.cjs +263 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +98 -3
- package/gsd-core/bin/lib/planning-command-router.cjs +61 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +1168 -0
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +894 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +112 -6
- package/gsd-core/bin/lib/probe-core.cjs +5 -2
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/profile-pipeline-command-router.cjs +50 -7
- package/gsd-core/bin/lib/profile-pipeline.cjs +6 -3
- package/gsd-core/bin/lib/real-home-guard.cjs +419 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +766 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +11 -6
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +22 -13
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +421 -66
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +59 -11
- package/gsd-core/bin/lib/roadmap-parser.cjs +1006 -184
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +442 -96
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +702 -52
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +459 -55
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +69 -3
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +402 -58
- package/gsd-core/bin/lib/runtime-identity.cjs +234 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +96 -8
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +342 -7
- package/gsd-core/bin/lib/smart-entry.cjs +133 -23
- package/gsd-core/bin/lib/spec-section.cjs +12 -7
- package/gsd-core/bin/lib/state-command-router.cjs +52 -19
- package/gsd-core/bin/lib/state-contract.cjs +359 -0
- package/gsd-core/bin/lib/state-document.cjs +338 -8
- package/gsd-core/bin/lib/state-md-schema.cjs +221 -0
- package/gsd-core/bin/lib/state-transition.cjs +846 -176
- package/gsd-core/bin/lib/state.cjs +2589 -369
- package/gsd-core/bin/lib/surface.cjs +33 -11
- package/gsd-core/bin/lib/task-command-router.cjs +111 -1
- package/gsd-core/bin/lib/task-content-resolution.cjs +368 -0
- package/gsd-core/bin/lib/teams-status.cjs +4 -1
- package/gsd-core/bin/lib/text-lines.cjs +80 -0
- package/gsd-core/bin/lib/token-scanner.cjs +76 -0
- package/gsd-core/bin/lib/uat-predicate.cjs +67 -23
- package/gsd-core/bin/lib/uat.cjs +1761 -167
- package/gsd-core/bin/lib/ui-consideration-probe.cjs +9 -1
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +51 -12
- package/gsd-core/bin/lib/unusable-input.cjs +37 -0
- package/gsd-core/bin/lib/update-context.cjs +8 -2
- package/gsd-core/bin/lib/user-artifact-staging.cjs +705 -0
- package/gsd-core/bin/lib/validate-command-router.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +75 -0
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +3014 -0
- package/gsd-core/bin/lib/vendor/re2js.cjs +6480 -0
- package/gsd-core/bin/lib/vendor/re2js.d.cts +938 -0
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +272 -9
- package/gsd-core/bin/lib/verify-command-grounding.cjs +846 -0
- package/gsd-core/bin/lib/verify.cjs +453 -918
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +53 -32
- package/gsd-core/bin/lib/workstream-inventory.cjs +63 -10
- package/gsd-core/bin/lib/workstream-name-policy.cjs +25 -4
- package/gsd-core/bin/lib/workstream.cjs +2 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +66 -12
- package/gsd-core/bin/lib/worktree-safety.cjs +341 -18
- package/gsd-core/bin/shared/config-defaults.manifest.json +8 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +12 -1
- package/gsd-core/bin/shared/exit-codes.json +8 -0
- package/gsd-core/bin/shared/exit-codes.sh +20 -0
- package/gsd-core/bin/shared/model-catalog.json +8 -1
- package/gsd-core/references/agent-contracts.md +44 -26
- package/gsd-core/references/api-coverage.md +24 -2
- package/gsd-core/references/autonomous-smart-discuss.md +3 -3
- package/gsd-core/references/checkpoints.md +39 -21
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/decimal-phase-calculation.md +5 -5
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/edge-probe.md +8 -0
- package/gsd-core/references/execute-mvp-tdd.md +4 -6
- package/gsd-core/references/execute-phase-between-wave-reset.md +15 -14
- package/gsd-core/references/execute-phase-context-guard.md +1 -1
- package/gsd-core/references/execute-phase-response-language.md +1 -1
- package/gsd-core/references/execute-phase-wave-guard.md +17 -11
- package/gsd-core/references/failing-direction.md +78 -0
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-integration.md +5 -5
- package/gsd-core/references/git-planning-commit.md +5 -4
- package/gsd-core/references/gsd-run-resolver.md +1 -1
- package/gsd-core/references/loop-hook-dispatch.md +61 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/nyquist-compliance.md +74 -0
- package/gsd-core/references/offer-next.md +3 -5
- package/gsd-core/references/phase-argument-parsing.md +3 -3
- package/gsd-core/references/planner-failing-direction.md +53 -0
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-human-verify-mode.md +15 -1
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planner-revision.md +1 -1
- package/gsd-core/references/planner-verify-command-grounding.md +17 -0
- package/gsd-core/references/planning-config.md +44 -13
- package/gsd-core/references/reviewer-instances.md +31 -0
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/runtime-aware-dispatch.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +1 -1
- package/gsd-core/references/tdd.md +1 -3
- package/gsd-core/references/ui-brand.md +65 -21
- package/gsd-core/references/ui-consideration-probe.md +1 -1
- package/gsd-core/references/universal-anti-patterns.md +5 -5
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verify-command-path-resolvability.md +42 -0
- package/gsd-core/references/verify-mvp-mode.md +2 -2
- package/gsd-core/references/workstream-flag.md +33 -17
- package/gsd-core/templates/README.md +1 -1
- package/gsd-core/templates/SECURITY.md +3 -3
- package/gsd-core/templates/UI-SPEC.md +25 -3
- package/gsd-core/templates/VALIDATION.md +3 -3
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +5 -4
- package/gsd-core/templates/state.md +11 -4
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
- package/gsd-core/workflows/add-backlog.md +1 -1
- package/gsd-core/workflows/add-phase.md +3 -3
- package/gsd-core/workflows/add-tests.md +3 -8
- package/gsd-core/workflows/add-todo.md +1 -1
- package/gsd-core/workflows/ai-integration-phase.md +13 -20
- package/gsd-core/workflows/audit-fix.md +12 -3
- package/gsd-core/workflows/audit-milestone.md +9 -9
- package/gsd-core/workflows/audit-uat.md +17 -2
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +2 -2
- package/gsd-core/workflows/autonomous.md +11 -27
- package/gsd-core/workflows/check-todos.md +1 -1
- package/gsd-core/workflows/cleanup.md +64 -5
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +14 -4
- package/gsd-core/workflows/code-review-fix.md +38 -11
- package/gsd-core/workflows/code-review.md +159 -52
- package/gsd-core/workflows/complete-milestone.md +151 -23
- package/gsd-core/workflows/debug.md +12 -8
- package/gsd-core/workflows/diagnose-issues.md +47 -15
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -8
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase/modes/text.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +1 -3
- package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +3 -6
- package/gsd-core/workflows/docs-update.md +5 -4
- package/gsd-core/workflows/edit-phase.md +27 -2
- package/gsd-core/workflows/eval-review.md +7 -14
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +142 -15
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +1 -1
- package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +77 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +24 -4
- package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/protected-branch.md +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -2
- package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +39 -0
- package/gsd-core/workflows/execute-phase.md +72 -100
- package/gsd-core/workflows/execute-plan.md +52 -15
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/extract-learnings.md +1 -1
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/forensics.md +1 -1
- package/gsd-core/workflows/graduation.md +5 -5
- package/gsd-core/workflows/health.md +76 -10
- package/gsd-core/workflows/import.md +18 -15
- package/gsd-core/workflows/inbox.md +4 -5
- package/gsd-core/workflows/ingest-docs.md +49 -16
- package/gsd-core/workflows/insert-phase.md +5 -5
- package/gsd-core/workflows/list-seeds.md +5 -3
- package/gsd-core/workflows/list-workspaces.md +1 -1
- package/gsd-core/workflows/manager.md +12 -23
- package/gsd-core/workflows/map-codebase.md +1 -1
- package/gsd-core/workflows/milestone-summary.md +1 -1
- package/gsd-core/workflows/mvp-phase.md +8 -5
- package/gsd-core/workflows/new-milestone.md +22 -29
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +1 -1
- package/gsd-core/workflows/new-project.md +26 -40
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +14 -2
- package/gsd-core/workflows/pause-work.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +1 -1
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -4
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +3 -3
- package/gsd-core/workflows/plan-phase.md +162 -59
- package/gsd-core/workflows/plan-review-convergence.md +96 -11
- package/gsd-core/workflows/plant-seed.md +2 -2
- package/gsd-core/workflows/pr-branch.md +187 -51
- package/gsd-core/workflows/profile-user.md +16 -14
- package/gsd-core/workflows/progress.md +61 -18
- package/gsd-core/workflows/quick/steps/discussion-phase.md +1 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +5 -7
- package/gsd-core/workflows/quick/steps/quick-verification.md +28 -9
- package/gsd-core/workflows/quick/steps/research-phase.md +4 -6
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +3 -3
- package/gsd-core/workflows/quick.md +55 -44
- package/gsd-core/workflows/remove-phase.md +4 -4
- package/gsd-core/workflows/remove-workspace.md +2 -2
- package/gsd-core/workflows/resume-project.md +8 -12
- package/gsd-core/workflows/review.md +219 -20
- package/gsd-core/workflows/scan.md +1 -1
- package/gsd-core/workflows/secure-phase.md +3 -3
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings-advanced.md +7 -9
- package/gsd-core/workflows/settings-integrations.md +64 -31
- package/gsd-core/workflows/settings.md +69 -7
- package/gsd-core/workflows/ship.md +116 -50
- package/gsd-core/workflows/sketch-wrap-up.md +11 -17
- package/gsd-core/workflows/sketch.md +12 -18
- package/gsd-core/workflows/smart-entry.md +3 -5
- package/gsd-core/workflows/spec-phase.md +53 -13
- package/gsd-core/workflows/spike-wrap-up.md +7 -11
- package/gsd-core/workflows/spike.md +20 -31
- package/gsd-core/workflows/stats.md +2 -2
- package/gsd-core/workflows/sync-skills.md +64 -9
- package/gsd-core/workflows/thread.md +11 -7
- package/gsd-core/workflows/transition.md +49 -14
- package/gsd-core/workflows/ui-phase.md +15 -21
- package/gsd-core/workflows/ui-review.md +8 -12
- package/gsd-core/workflows/ultraplan-phase.md +5 -13
- package/gsd-core/workflows/undo.md +8 -16
- package/gsd-core/workflows/update.md +7 -11
- package/gsd-core/workflows/validate-phase.md +3 -3
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +25 -1
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +1 -1
- package/gsd-core/workflows/verify-work.md +66 -25
- package/hooks/dist/gsd-agent-isolation-guard.js +158 -30
- package/hooks/dist/gsd-check-update-worker.js +56 -13
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-config-reload.js +18 -12
- package/hooks/dist/gsd-context-monitor.js +19 -10
- package/hooks/dist/gsd-cursor-post-tool.js +3 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +2 -3
- package/hooks/dist/gsd-cursor-session-start.js +2 -1
- package/hooks/dist/gsd-cursor-stop.js +2 -1
- package/hooks/dist/gsd-cursor-subagent-start.js +83 -3
- package/hooks/dist/gsd-cursor-subagent-stop.js +6 -3
- package/hooks/dist/gsd-ensure-canonical-path.js +2 -1
- package/hooks/dist/gsd-graphify-update.sh +22 -18
- package/hooks/dist/gsd-node-runner.sh +76 -0
- package/hooks/dist/gsd-phase-boundary.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +37 -27
- package/hooks/dist/gsd-read-guard.js +16 -7
- package/hooks/dist/gsd-read-injection-scanner.js +55 -32
- package/hooks/dist/gsd-session-state.sh +1 -0
- package/hooks/dist/gsd-statusline.js +231 -24
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-validate-commit.sh +80 -6
- package/hooks/dist/gsd-windsurf-pre-command.js +16 -11
- package/hooks/dist/gsd-windsurf-pre-write.js +22 -13
- package/hooks/dist/gsd-workflow-guard.js +162 -46
- package/hooks/dist/gsd-worktree-path-guard.js +36 -21
- package/hooks/dist/gsd-write-guard.js +35 -25
- package/hooks/dist/lib/cli-exit.js +560 -0
- package/hooks/dist/lib/exit-code-registry.js +98 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- package/hooks/dist/lib/git-probe.js +84 -0
- package/hooks/dist/lib/hook-exit.js +81 -0
- package/hooks/dist/lib/injection-patterns.js +45 -0
- package/hooks/dist/lib/isolation-deny-reason.js +39 -0
- package/hooks/dist/lib/isolation-sentinel.js +9 -0
- package/hooks/dist/managed-hooks-registry.cjs +3 -0
- package/hooks/gsd-agent-isolation-guard.js +158 -30
- package/hooks/gsd-check-update-worker.js +56 -13
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-config-reload.js +18 -12
- package/hooks/gsd-context-monitor.js +19 -10
- package/hooks/gsd-cursor-post-tool.js +3 -1
- package/hooks/gsd-cursor-pre-tool.js +2 -3
- package/hooks/gsd-cursor-session-start.js +2 -1
- package/hooks/gsd-cursor-stop.js +2 -1
- package/hooks/gsd-cursor-subagent-start.js +83 -3
- package/hooks/gsd-cursor-subagent-stop.js +6 -3
- package/hooks/gsd-ensure-canonical-path.js +2 -1
- package/hooks/gsd-graphify-update.sh +22 -18
- package/hooks/gsd-node-runner.sh +76 -0
- package/hooks/gsd-phase-boundary.sh +1 -0
- package/hooks/gsd-prompt-guard.js +37 -27
- package/hooks/gsd-read-guard.js +16 -7
- package/hooks/gsd-read-injection-scanner.js +55 -32
- package/hooks/gsd-session-state.sh +1 -0
- package/hooks/gsd-statusline.js +231 -24
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-validate-commit.sh +80 -6
- package/hooks/gsd-windsurf-pre-command.js +16 -11
- package/hooks/gsd-windsurf-pre-write.js +22 -13
- package/hooks/gsd-workflow-guard.js +162 -46
- package/hooks/gsd-worktree-path-guard.js +36 -21
- package/hooks/gsd-write-guard.js +35 -25
- package/hooks/lib/cli-exit.js +560 -0
- package/hooks/lib/exit-code-registry.js +98 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/git-probe.js +84 -0
- package/hooks/lib/hook-exit.js +81 -0
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +9 -0
- package/hooks/managed-hooks-registry.cjs +3 -0
- package/package.json +28 -11
- package/pi/gsd.cjs +19 -5
- package/scripts/base64-scan.sh +74 -12
- package/scripts/baselines/planning-prompt-drift-baseline.json +4 -0
- package/scripts/baselines/planning-snapshot-bypass-baseline.json +12 -0
- package/scripts/baselines/unreachable-guard-drift-baseline.json +4 -0
- package/scripts/build-hooks.js +5 -0
- package/scripts/changeset/lint.cjs +60 -5
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/check-glossary-refs.cjs +77 -15
- package/scripts/check-mutation-score-ratchet.cjs +156 -0
- package/scripts/ci-check-job-near-cap.cjs +49 -0
- package/scripts/ci-pr-mergeability.cjs +262 -0
- package/scripts/ci-test-scope.cjs +64 -14
- package/scripts/ci-timeout-report.cjs +230 -0
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/docs-guard-registry.cjs +396 -0
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-registry.cjs +11 -21
- package/scripts/gen-context-index.cjs +2 -11
- package/scripts/gen-exit-code-docs.cjs +318 -0
- package/scripts/gen-exit-code-registry.cjs +891 -0
- package/scripts/gen-features.cjs +836 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-hooks-cli-exit.cjs +239 -0
- package/scripts/gen-install-tree-fixtures.cjs +2 -2
- package/scripts/gen-inventory-manifest.cjs +50 -4
- package/scripts/gen-loop-host-contract.cjs +138 -25
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-scripts-cli-exit.cjs +185 -0
- package/scripts/gen-state-md-docs.cjs +727 -0
- package/scripts/{test-failure-reasons.cjs → gsd-test-gate-reasons.cjs} +6 -0
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/ci-job-timing.cjs +72 -0
- package/scripts/lib/cli-exit.cjs +546 -44
- package/scripts/lib/drift-scan.cjs +308 -0
- package/scripts/lib/exit-code-registry.cjs +98 -0
- package/scripts/lib/ndjson-reporter.cjs +119 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +1 -26
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +4 -0
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +3 -0
- package/scripts/lint-canary-version-leak.cjs +73 -0
- package/scripts/lint-command-contract.cjs +96 -13
- package/scripts/lint-completion-predicate-drift.cjs +933 -0
- package/scripts/lint-completion-ratio-drift.cjs +214 -0
- package/scripts/lint-default-flip-documentation.cjs +193 -0
- package/scripts/lint-docs-guard-registration.cjs +495 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +193 -0
- package/scripts/lint-eslint-glob-coverage.allowlist.json +38 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/{lint-fix-has-regression-test.cjs → lint-fix-has-regression-tests.cjs} +12 -6
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +461 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-mutation-test-derivation-drift.cjs +86 -0
- package/scripts/lint-phase-enumeration-drift.cjs +492 -0
- package/scripts/lint-plan-count-drift.cjs +318 -0
- package/scripts/lint-planning-artifact-writer-drift.cjs +398 -0
- package/scripts/lint-planning-prompt-drift.cjs +471 -0
- package/scripts/lint-planning-snapshot-bypass-drift.cjs +544 -0
- package/scripts/lint-regression-test-names.cjs +15 -13
- package/scripts/lint-removed-but-needed.cjs +488 -0
- package/scripts/lint-seam-enforcement.cjs +182 -0
- package/scripts/lint-slug-derivation-drift.cjs +921 -0
- package/scripts/lint-source-test-name-collision.cjs +241 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +950 -0
- package/scripts/lint-test-file-count.allowlist.json +137 -8
- package/scripts/lint-test-file-count.cjs +25 -3
- package/scripts/lint-unreachable-guard-drift.cjs +830 -0
- package/scripts/lint-vendored-deps.cjs +297 -0
- package/scripts/mutation-matrix.cjs +599 -50
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +100 -14
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/secret-scan.sh +75 -13
- package/scripts/select-docs-guards.cjs +56 -0
- package/scripts/sync-runtime-launcher.cjs +24 -7
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-discuss-phase/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-import/SKILL.md +1 -1
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +1 -1
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +1 -1
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +0 -1
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +9 -5
- package/skills/gsd-review-backlog/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +0 -1
- package/skills/gsd-verify-work/SKILL.md +1 -1
- package/vscode/package.json +1 -1
- package/bin/lib/ui-safety-gate.cjs +0 -107
- package/gsd-core/workflows/discovery-phase.md +0 -298
- package/gsd-core/workflows/plan-milestone-gaps.md +0 -281
- package/gsd-core/workflows/verify-phase.md +0 -574
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/lint-emitted-drift-ack.cjs +0 -344
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1051
|
@@ -10,12 +10,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
10
10
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.RUNTIMES_WITH_FAST_MODE = exports.EFFORT_ARGV = 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.ADAPTIVE_TIER_VALUES = exports.VALID_TIERS = exports.VALID_AGENT_TIERS = exports.VALID_PHASE_TYPES = exports.VALID_PROFILES = exports.catalog = void 0;
|
|
13
|
+
exports.RUNTIMES_WITH_FAST_MODE = exports.EFFORT_ARGV = exports.EFFORT_RENDERING = exports.CLAUDE_AGENT_ALIASES = exports.KNOWN_PROVIDERS = exports.CODEX_MODEL_EFFORT = 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.ADAPTIVE_TIER_VALUES = exports.VALID_TIERS = exports.VALID_AGENT_TIERS = exports.VALID_PHASE_TYPES = exports.VALID_PROFILES = exports.catalog = void 0;
|
|
14
|
+
exports.isAnthropicFlavoredModel = isAnthropicFlavoredModel;
|
|
14
15
|
exports.nextTier = nextTier;
|
|
15
16
|
exports.formatAgentToModelMapAsTable = formatAgentToModelMapAsTable;
|
|
16
17
|
exports.getAgentToModelMapForProfile = getAgentToModelMapForProfile;
|
|
18
|
+
exports.clampEffortForHost = clampEffortForHost;
|
|
17
19
|
exports.renderEffortArgv = renderEffortArgv;
|
|
18
20
|
exports.renderEffortForRuntime = renderEffortForRuntime;
|
|
21
|
+
exports.mergeEffortTierDefaults = mergeEffortTierDefaults;
|
|
19
22
|
const node_path_1 = __importDefault(require("node:path"));
|
|
20
23
|
// In .cts (CommonJS output) files, `require` is available as a global;
|
|
21
24
|
// we use it directly to load JSON candidates.
|
|
@@ -97,12 +100,68 @@ exports.RUNTIMES_WITH_REASONING_EFFORT = new Set(Object.entries(_catalog.runtime
|
|
|
97
100
|
.filter(([, tiers]) => Object.values(tiers).some((entry) => entry && entry.reasoning_effort))
|
|
98
101
|
.map(([runtime]) => runtime));
|
|
99
102
|
exports.PROVIDER_PRESETS = _catalog.providerPresets ?? {};
|
|
103
|
+
// ─── #3007 — Codex per-model effort capability ───────────────────────────────
|
|
104
|
+
//
|
|
105
|
+
// Codex's own `models.json` publishes `supported_reasoning_levels` per model and
|
|
106
|
+
// rejects an unsupported level at request time, so GSD must be conservative
|
|
107
|
+
// about what it sends: read the ceiling as DATA from the catalog (never
|
|
108
|
+
// branch on model id in code) and fall back to the family baseline for any
|
|
109
|
+
// model the catalog doesn't know about.
|
|
110
|
+
// (b) A malformed catalog entry (e.g. a non-array value like `"gpt-x": 5`) must
|
|
111
|
+
// degrade to "ignore that entry", never throw — model-catalog.cjs is required
|
|
112
|
+
// across the whole CLI, so one bad JSON value must not kill every command.
|
|
113
|
+
// `new Set(5)` would throw at module load; filter to array values first.
|
|
114
|
+
exports.CODEX_MODEL_EFFORT = Object.fromEntries(Object.entries(_catalog.codexModelEffort ?? {})
|
|
115
|
+
.filter(([, levels]) => Array.isArray(levels))
|
|
116
|
+
.map(([model, levels]) => [model, new Set(levels)]));
|
|
117
|
+
// (a) `??` only catches null/undefined. A malformed `"_baseline": null` still
|
|
118
|
+
// produces `new Set(null)` above — an empty Set, which is truthy — so a bare
|
|
119
|
+
// `??` fallback would never fire and every level would silently lose its
|
|
120
|
+
// advertised set (every effort would render as `value: null`). Guard on
|
|
121
|
+
// `.size > 0` so an empty/missing/malformed baseline always falls back to the
|
|
122
|
+
// hardcoded floor instead of failing open.
|
|
123
|
+
const CODEX_EFFORT_BASELINE = exports.CODEX_MODEL_EFFORT['_baseline'] && exports.CODEX_MODEL_EFFORT['_baseline'].size > 0
|
|
124
|
+
? exports.CODEX_MODEL_EFFORT['_baseline']
|
|
125
|
+
: new Set(['low', 'medium', 'high', 'xhigh', 'max']);
|
|
126
|
+
function advertisedCodexEffort(model) {
|
|
127
|
+
if (typeof model !== 'string' || model.length === 0)
|
|
128
|
+
return CODEX_EFFORT_BASELINE;
|
|
129
|
+
return Object.prototype.hasOwnProperty.call(exports.CODEX_MODEL_EFFORT, model) ? exports.CODEX_MODEL_EFFORT[model] : CODEX_EFFORT_BASELINE;
|
|
130
|
+
}
|
|
131
|
+
// The full universal effort ladder, low-to-high. Used only to find "the
|
|
132
|
+
// nearest advertised level below" when a requested level isn't supported —
|
|
133
|
+
// never to invent behaviour for a level that isn't on it at all.
|
|
134
|
+
const EFFORT_LADDER = ['minimal', 'low', 'medium', 'high', 'xhigh', 'max', 'ultra'];
|
|
100
135
|
// KNOWN_PROVIDERS excludes 'generic' — it is a sentinel (all null entries) that
|
|
101
136
|
// forces users to supply model IDs via model_profile_overrides. It is not a
|
|
102
137
|
// real catalog-backed provider (#49).
|
|
103
138
|
exports.KNOWN_PROVIDERS = new Set(Object.entries(exports.PROVIDER_PRESETS)
|
|
104
139
|
.filter(([, tiers]) => Object.values(tiers).some((budgets) => budgets && Object.values(budgets).some((entry) => entry && entry.model)))
|
|
105
140
|
.map(([name]) => name));
|
|
141
|
+
// ─── #3241 — Anthropic-flavored model detection ──────────────────────────────
|
|
142
|
+
//
|
|
143
|
+
// Moved here from src/model-resolver.cts (the "seam decision" in
|
|
144
|
+
// .gsd/phase/feat-3241-codex-omit-model-by-default/40-design.md): this leaf
|
|
145
|
+
// module is the one common dependency both model-resolver and the (layering-
|
|
146
|
+
// restricted) install-time Codex-posture checks can share without pulling
|
|
147
|
+
// model-resolver's config-loader dependency chain into a "pure read/verify"
|
|
148
|
+
// caller. model-resolver re-exports both names for back-compat.
|
|
149
|
+
//
|
|
150
|
+
// #2310 — True if `model` is an Anthropic-flavored value that must never appear as a
|
|
151
|
+
// Codex agent `.toml` `model`. Two forms: (a) a bare Claude Agent-tool tier alias
|
|
152
|
+
// (opus/sonnet/haiku/fable — CLAUDE_AGENT_ALIASES below); (b) any Claude model id in
|
|
153
|
+
// any provider namespacing — `claude-*`, `anthropic/claude-*`, `us.anthropic.claude-*`
|
|
154
|
+
// (the forms the catalog assigns to opencode/hermes/kilo, reachable on a Codex .toml
|
|
155
|
+
// via the runtime-resolver path). No OpenAI/Codex model id contains "claude", so a
|
|
156
|
+
// case-insensitive substring test is a safe, exhaustive guard for (b). Codex/ChatGPT
|
|
157
|
+
// rejects all of these.
|
|
158
|
+
exports.CLAUDE_AGENT_ALIASES = new Set(['opus', 'sonnet', 'haiku', 'fable']);
|
|
159
|
+
function isAnthropicFlavoredModel(model) {
|
|
160
|
+
if (typeof model !== 'string')
|
|
161
|
+
return false;
|
|
162
|
+
const lower = model.toLowerCase();
|
|
163
|
+
return exports.CLAUDE_AGENT_ALIASES.has(lower) || lower.includes('claude');
|
|
164
|
+
}
|
|
106
165
|
function nextTier(currentTier) {
|
|
107
166
|
const order = ['light', 'standard', 'heavy'];
|
|
108
167
|
const idx = order.indexOf(String(currentTier));
|
|
@@ -142,12 +201,21 @@ exports.EFFORT_RENDERING = {
|
|
|
142
201
|
},
|
|
143
202
|
},
|
|
144
203
|
codex: {
|
|
204
|
+
// #3007: 'max' and 'minimal' are stale here — Codex's per-model table
|
|
205
|
+
// (CODEX_MODEL_EFFORT above) is now the source of truth for what a given
|
|
206
|
+
// model actually advertises, and every model in the family baseline DOES
|
|
207
|
+
// advertise 'max' (no model advertises 'minimal'). This runtime-level
|
|
208
|
+
// spec is kept in sync with the family baseline so the two tables can
|
|
209
|
+
// never disagree; renderEffortForRuntime layers the per-model ceiling
|
|
210
|
+
// (and the 'ultra' policy rejection) on top of it.
|
|
211
|
+
// KEEP IN SYNC with EFFORT_ARGV.codex below — same family baseline, two
|
|
212
|
+
// channels (install-time vs invocation-time); they must never diverge.
|
|
145
213
|
param: 'model_reasoning_effort',
|
|
146
214
|
channel: 'api',
|
|
147
|
-
supported: new Set(['
|
|
215
|
+
supported: new Set(['low', 'medium', 'high', 'xhigh', 'max']),
|
|
148
216
|
clamp(level) {
|
|
149
|
-
if (level === '
|
|
150
|
-
return '
|
|
217
|
+
if (level === 'minimal')
|
|
218
|
+
return 'low';
|
|
151
219
|
return level;
|
|
152
220
|
},
|
|
153
221
|
},
|
|
@@ -168,12 +236,45 @@ exports.EFFORT_ARGV = {
|
|
|
168
236
|
},
|
|
169
237
|
// First-party Codex docs: `model_reasoning_effort` is a config-only key with no
|
|
170
238
|
// dedicated flag, so the generic `-c key=value` override is the only argv route.
|
|
239
|
+
// #3007: KEEP IN SYNC with EFFORT_RENDERING.codex above — this table must match
|
|
240
|
+
// the family baseline exactly (no 'minimal', 'max' passes through unclamped),
|
|
241
|
+
// otherwise the argv channel and the install-time channel disagree about the
|
|
242
|
+
// same runtime's capability.
|
|
171
243
|
codex: {
|
|
172
244
|
render: (level) => ['-c', `model_reasoning_effort=${level}`],
|
|
173
|
-
supported: new Set(['
|
|
174
|
-
clamp: (level) => (level === '
|
|
245
|
+
supported: new Set(['low', 'medium', 'high', 'xhigh', 'max']),
|
|
246
|
+
clamp: (level) => (level === 'minimal' ? 'low' : level),
|
|
175
247
|
},
|
|
176
248
|
};
|
|
249
|
+
/**
|
|
250
|
+
* Clamp a universal effort level to what a host actually accepts, or null.
|
|
251
|
+
*
|
|
252
|
+
* #3706 — extracted from `renderEffortArgv` so the two effort CHANNELS can share
|
|
253
|
+
* one capability table without one pretending to be the other. `EFFORT_ARGV[host]`
|
|
254
|
+
* describes what levels the host understands (`supported` + `clamp`); whether that
|
|
255
|
+
* reaches the host as a CLI flag or as a baked frontmatter key is the caller's
|
|
256
|
+
* business. The install-time OpenCode `variant:` writer needs the former without
|
|
257
|
+
* the latter, and hardcoding `'argv'` at that call site to borrow this logic read
|
|
258
|
+
* as if the frontmatter key were gated on the invocation-time axis. It is not —
|
|
259
|
+
* claude declares `effortSurface: "argv"` and independently bakes an `effort:` key.
|
|
260
|
+
*
|
|
261
|
+
* Returns null for a level the host does not accept, which every caller treats as
|
|
262
|
+
* "emit nothing". `inherit` lands here too: per #3533 (10d) it is not a wire level
|
|
263
|
+
* on any runtime, so it is in no `supported` set and must never be written out.
|
|
264
|
+
*/
|
|
265
|
+
function clampEffortForHost(host, universalEffort) {
|
|
266
|
+
// Own-property lookup only: a plain `EFFORT_ARGV[host]` resolves `__proto__`
|
|
267
|
+
// and friends to inherited members that carry no clamp/render.
|
|
268
|
+
if (typeof host !== 'string' || !Object.prototype.hasOwnProperty.call(exports.EFFORT_ARGV, host))
|
|
269
|
+
return null;
|
|
270
|
+
const spec = exports.EFFORT_ARGV[host];
|
|
271
|
+
if (!spec || typeof spec.clamp !== 'function')
|
|
272
|
+
return null;
|
|
273
|
+
if (typeof universalEffort !== 'string' || universalEffort.length === 0)
|
|
274
|
+
return null;
|
|
275
|
+
const clamped = spec.clamp(universalEffort);
|
|
276
|
+
return spec.supported.has(clamped) ? clamped : null;
|
|
277
|
+
}
|
|
177
278
|
/**
|
|
178
279
|
* Render the invocation-time effort argument for a host.
|
|
179
280
|
*
|
|
@@ -189,31 +290,146 @@ function renderEffortArgv(host, universalEffort, effortSurface) {
|
|
|
189
290
|
// (and `constructor`/`toString`) to inherited members, which are truthy but
|
|
190
291
|
// carry no `clamp`/`render` — a hostile host id would throw instead of
|
|
191
292
|
// degrading. The host id reaches here from a descriptor, i.e. untrusted JSON.
|
|
192
|
-
|
|
293
|
+
// #3706: the clamp/supported half lives in clampEffortForHost so the
|
|
294
|
+
// install-time channel can reuse it; this function keeps the axis gate and
|
|
295
|
+
// the argv rendering. One table, one clamp, two channels.
|
|
296
|
+
const clamped = clampEffortForHost(host, universalEffort);
|
|
297
|
+
if (clamped === null)
|
|
193
298
|
return empty;
|
|
194
299
|
const spec = exports.EFFORT_ARGV[host];
|
|
195
|
-
if (
|
|
196
|
-
return empty;
|
|
197
|
-
if (typeof universalEffort !== 'string' || universalEffort.length === 0)
|
|
198
|
-
return empty;
|
|
199
|
-
const clamped = spec.clamp(universalEffort);
|
|
200
|
-
if (!spec.supported.has(clamped))
|
|
300
|
+
if (typeof spec.render !== 'function')
|
|
201
301
|
return empty;
|
|
202
302
|
return { argv: spec.render(clamped), value: clamped, host };
|
|
203
303
|
}
|
|
204
304
|
/**
|
|
205
305
|
* Render a universal effort string for a specific runtime.
|
|
306
|
+
*
|
|
307
|
+
* `model` (#3007) is consulted ONLY for codex: Codex's per-model
|
|
308
|
+
* `supported_reasoning_levels` means the same universal level can be a clean
|
|
309
|
+
* pass-through on one model and a clamp (or, for 'ultra', an outright
|
|
310
|
+
* rejection) on another. Every other runtime ignores the third argument
|
|
311
|
+
* entirely — passing a model id to claude changes nothing.
|
|
206
312
|
*/
|
|
207
|
-
function renderEffortForRuntime(runtime, universalEffort) {
|
|
313
|
+
function renderEffortForRuntime(runtime, universalEffort, model) {
|
|
314
|
+
// #3533 (10d): 'inherit' is not a wire level on ANY runtime — it means
|
|
315
|
+
// "omit the key / pass no argument and follow the session/host default".
|
|
316
|
+
// Renderers must never emit it as a literal; null param/channel tells
|
|
317
|
+
// resolve-execution consumers there is no propagation. Never measured
|
|
318
|
+
// against any supported set.
|
|
319
|
+
if (universalEffort === 'inherit') {
|
|
320
|
+
return { value: 'inherit', param: null, channel: null, requested: 'inherit', clamped: false, reason: null };
|
|
321
|
+
}
|
|
208
322
|
const spec = exports.EFFORT_RENDERING[runtime];
|
|
209
323
|
if (!spec) {
|
|
210
|
-
return { value: universalEffort, param: null, channel: null };
|
|
324
|
+
return { value: universalEffort, param: null, channel: null, requested: universalEffort, clamped: false, reason: null };
|
|
325
|
+
}
|
|
326
|
+
if (runtime === 'codex') {
|
|
327
|
+
// #2167 — 'ultra' turns on Codex's automatic task delegation, which would
|
|
328
|
+
// let Codex spawn agents underneath GSD's own orchestration. GSD rejects
|
|
329
|
+
// it unconditionally as a POLICY call, never as a capability clamp — this
|
|
330
|
+
// holds even for a model (e.g. gpt-5.6-sol) that DOES advertise 'ultra',
|
|
331
|
+
// so it is never softened down to 'max'.
|
|
332
|
+
if (universalEffort === 'ultra') {
|
|
333
|
+
return {
|
|
334
|
+
value: null,
|
|
335
|
+
param: null,
|
|
336
|
+
channel: null,
|
|
337
|
+
requested: 'ultra',
|
|
338
|
+
clamped: false,
|
|
339
|
+
reason: "'ultra' turns on Codex's automatic task delegation, which would let Codex spawn agents underneath GSD's own orchestration (#2167); GSD rejects it regardless of what the model advertises.",
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
const allowed = advertisedCodexEffort(model);
|
|
343
|
+
if (allowed.has(universalEffort)) {
|
|
344
|
+
return { value: universalEffort, param: spec.param, channel: spec.channel, requested: universalEffort, clamped: false, reason: null };
|
|
345
|
+
}
|
|
346
|
+
const idx = EFFORT_LADDER.indexOf(universalEffort);
|
|
347
|
+
if (idx === -1) {
|
|
348
|
+
// Not on the ladder at all (e.g. 'MAX') — preserve prior behaviour:
|
|
349
|
+
// fall through to the runtime-level clamp rather than inventing new
|
|
350
|
+
// handling for input the ladder doesn't recognize.
|
|
351
|
+
return { value: spec.clamp(universalEffort), param: spec.param, channel: spec.channel, requested: universalEffort, clamped: false, reason: null };
|
|
352
|
+
}
|
|
353
|
+
// Every model's advertised set is a contiguous run up to 'max' (or 'ultra'
|
|
354
|
+
// for sol, already handled above), so the only unsupported level in
|
|
355
|
+
// practice is 'minimal' — below every model's floor. Walk UP the ladder
|
|
356
|
+
// to the nearest level the model actually advertises (its floor): there
|
|
357
|
+
// is nothing below 'minimal' to fall back to.
|
|
358
|
+
// Walking UP is safe today only because every advertised set floors at
|
|
359
|
+
// 'low' — a future model whose floor is, say, 'high' would silently turn
|
|
360
|
+
// a requested 'low' into 'high': MORE reasoning and MORE cost than asked
|
|
361
|
+
// for, with no error. `clamped`/`reason` below is what makes that
|
|
362
|
+
// escalation visible to a caller instead of a silent cost surprise, which
|
|
363
|
+
// is why those fields are not optional decoration.
|
|
364
|
+
for (let i = idx + 1; i < EFFORT_LADDER.length; i++) {
|
|
365
|
+
const candidate = EFFORT_LADDER[i];
|
|
366
|
+
// 'ultra' is never a valid clamp target: it would re-enter, by the back
|
|
367
|
+
// door, the delegation mode the #2167 rejection above exists to keep
|
|
368
|
+
// out. A clamp may never produce a value that a direct request for
|
|
369
|
+
// that same value would have refused.
|
|
370
|
+
if (candidate === 'ultra') {
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
if (allowed.has(candidate)) {
|
|
374
|
+
return {
|
|
375
|
+
value: candidate,
|
|
376
|
+
param: spec.param,
|
|
377
|
+
channel: spec.channel,
|
|
378
|
+
requested: universalEffort,
|
|
379
|
+
clamped: true,
|
|
380
|
+
reason: `requested '${universalEffort}' is not in ${model ? `${model}'s` : "the codex family baseline's"} advertised reasoning levels; clamped up to its floor, '${candidate}'.`,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// No advertised level at or above the request either (shouldn't happen
|
|
385
|
+
// given today's catalog data, but never throw): reject rather than emit
|
|
386
|
+
// an unsupported level.
|
|
387
|
+
return {
|
|
388
|
+
value: null,
|
|
389
|
+
param: null,
|
|
390
|
+
channel: null,
|
|
391
|
+
requested: universalEffort,
|
|
392
|
+
clamped: false,
|
|
393
|
+
reason: `requested '${universalEffort}' is not in ${model ? `${model}'s` : "the codex family baseline's"} advertised reasoning levels, and no advertised level is available either.`,
|
|
394
|
+
};
|
|
211
395
|
}
|
|
396
|
+
const value = spec.clamp(universalEffort);
|
|
212
397
|
return {
|
|
213
|
-
value
|
|
398
|
+
value,
|
|
214
399
|
param: spec.param,
|
|
215
400
|
channel: spec.channel,
|
|
401
|
+
requested: universalEffort,
|
|
402
|
+
clamped: value !== universalEffort,
|
|
403
|
+
reason: value !== universalEffort ? `requested '${universalEffort}' clamped to '${value}' for ${runtime}.` : null,
|
|
216
404
|
};
|
|
217
405
|
}
|
|
406
|
+
/**
|
|
407
|
+
* #3531 (10c) — Merge a config `effort.routing_tier_defaults` block over the
|
|
408
|
+
* manifest tier defaults instead of replacing them. A partial config must not
|
|
409
|
+
* discard built-ins: per tier, a valid override value wins and an invalid one
|
|
410
|
+
* is ignored so the manifest value for that tier surfaces (ADR-443 D1's
|
|
411
|
+
* "invalid values fall through" holds within the merged layer).
|
|
412
|
+
*
|
|
413
|
+
* Pure: returns a new object and never mutates either input — the manifest
|
|
414
|
+
* constants (`CANONICAL_CONFIG_DEFAULTS`, the catalog cache) stay frozen. The
|
|
415
|
+
* validator is injected because `EFFORT_SET` lives in model-resolver, which
|
|
416
|
+
* imports this leaf (a reverse import would be a cycle); both effort
|
|
417
|
+
* resolvers pass their own `(v) => typeof v === 'string' && EFFORT_SET.has(v)`.
|
|
418
|
+
*/
|
|
419
|
+
function mergeEffortTierDefaults(manifest, override, isValid) {
|
|
420
|
+
const merged = { ...(manifest || {}) };
|
|
421
|
+
if (override && typeof override === 'object' && !Array.isArray(override)) {
|
|
422
|
+
for (const [tier, value] of Object.entries(override)) {
|
|
423
|
+
// House pollution guard (mirrors _deepMergeConfig in config-loader): the
|
|
424
|
+
// string-only validator already makes these inert, but an explicit skip
|
|
425
|
+
// keeps this merge safe even if a caller's validator is ever relaxed.
|
|
426
|
+
if (tier === '__proto__' || tier === 'constructor' || tier === 'prototype')
|
|
427
|
+
continue;
|
|
428
|
+
if (isValid(value))
|
|
429
|
+
merged[tier] = value;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return merged;
|
|
433
|
+
}
|
|
218
434
|
// ─── Fast mode propagation ───────────────────────────────────────────────────
|
|
219
435
|
exports.RUNTIMES_WITH_FAST_MODE = new Set(['api']);
|