@opengsd/gsd-core 1.9.1 → 1.11.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 +2 -3
- package/.opencode/plugins/gsd-core.js +8 -1
- package/agents/gsd-code-fixer.md +27 -3
- package/agents/gsd-debug-session-manager.md +11 -0
- package/agents/gsd-debugger.md +12 -246
- package/agents/gsd-doc-synthesizer.md +2 -4
- package/agents/gsd-executor.md +12 -10
- package/agents/gsd-integration-checker.md +3 -0
- package/agents/gsd-mempalace-curator.md +5 -2
- package/agents/gsd-phase-researcher.md +20 -1
- package/agents/gsd-plan-checker.md +46 -0
- package/agents/gsd-planner.md +49 -54
- package/agents/gsd-roadmapper.md +21 -3
- package/agents/gsd-user-profiler.md +3 -0
- package/agents/gsd-verifier.md +26 -73
- package/bin/install.js +1272 -1238
- package/bin/lib/ui-safety-gate.cjs +2 -0
- package/commands/gsd/code-review.md +1 -1
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/map-codebase.md +1 -1
- package/commands/gsd/mempalace-capture.md +2 -2
- package/commands/gsd/mempalace-recall.md +1 -1
- package/commands/gsd/new-milestone.md +2 -2
- package/commands/gsd/plan-phase.md +1 -1
- package/commands/gsd/quick.md +1 -1
- package/commands/gsd/review-backlog.md +2 -1
- package/commands/gsd/verify-work.md +1 -1
- package/gsd-core/bin/gsd-tools.cjs +1009 -115
- package/gsd-core/bin/lib/active-workstream-store.cjs +153 -12
- package/gsd-core/bin/lib/agent-install-check.cjs +268 -38
- package/gsd-core/bin/lib/api-coverage.cjs +123 -5
- package/gsd-core/bin/lib/artifacts.cjs +3 -0
- package/gsd-core/bin/lib/assumption-delta.cjs +2 -4
- package/gsd-core/bin/lib/audit-command-router.cjs +9 -2
- package/gsd-core/bin/lib/audit.cjs +926 -202
- package/gsd-core/bin/lib/broken-windows.cjs +36 -6
- 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-registry.cjs +608 -148
- package/gsd-core/bin/lib/capability-source.cjs +92 -0
- package/gsd-core/bin/lib/capability-trust.cjs +444 -25
- package/gsd-core/bin/lib/capability-validator.cjs +507 -24
- package/gsd-core/bin/lib/capability-writer.cjs +3 -2
- package/gsd-core/bin/lib/check-command-router.cjs +114 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +56 -3
- package/gsd-core/bin/lib/codex-agent-toml.cjs +329 -0
- package/gsd-core/bin/lib/command-aliases.cjs +94 -0
- package/gsd-core/bin/lib/command-roster.cjs +44 -1
- package/gsd-core/bin/lib/commands.cjs +665 -99
- package/gsd-core/bin/lib/commonjs-marker.cjs +142 -0
- package/gsd-core/bin/lib/complexity-trigger.cjs +1172 -0
- package/gsd-core/bin/lib/config-loader.cjs +76 -0
- package/gsd-core/bin/lib/config.cjs +22 -2
- package/gsd-core/bin/lib/context-composer.cjs +278 -0
- package/gsd-core/bin/lib/context-predicates.cjs +506 -0
- package/gsd-core/bin/lib/core-utils.cjs +217 -40
- package/gsd-core/bin/lib/decisions.cjs +23 -0
- package/gsd-core/bin/lib/docs.cjs +3 -2
- package/gsd-core/bin/lib/external-job.cjs +19 -4
- package/gsd-core/bin/lib/fallow-runner.cjs +20 -44
- package/gsd-core/bin/lib/frontmatter.cjs +239 -32
- package/gsd-core/bin/lib/gap-checker.cjs +68 -7
- package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +57 -6
- package/gsd-core/bin/lib/git-base-branch.cjs +160 -15
- package/gsd-core/bin/lib/graphify.cjs +142 -27
- package/gsd-core/bin/lib/gsd2-import.cjs +37 -5
- 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 +145 -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 +265 -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 +173 -0
- package/gsd-core/bin/lib/health-diagnostic-types.cjs +68 -0
- package/gsd-core/bin/lib/health-diagnostic.cjs +431 -0
- package/gsd-core/bin/lib/host-integration.cjs +13 -1
- package/gsd-core/bin/lib/host-runtime-detection.cjs +134 -0
- package/gsd-core/bin/lib/init-command-router.cjs +83 -8
- package/gsd-core/bin/lib/init.cjs +1325 -169
- package/gsd-core/bin/lib/install-effort-resolver.cjs +73 -30
- package/gsd-core/bin/lib/install-engine.cjs +805 -264
- package/gsd-core/bin/lib/install-fs-adapter.cjs +262 -0
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +203 -0
- package/gsd-core/bin/lib/install-profiles.cjs +160 -57
- 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-authoring.cjs +3 -1
- package/gsd-core/bin/lib/installer-migration-report.cjs +4 -0
- package/gsd-core/bin/lib/installer-migrations/007-retire-config-root-commonjs-marker.cjs +149 -0
- package/gsd-core/bin/lib/installer-migrations/008-cursor-retire-commands-surface.cjs +55 -0
- package/gsd-core/bin/lib/installer-migrations/009-pi-retire-reserved-hooks-dir.cjs +199 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +206 -13
- package/gsd-core/bin/lib/io.cjs +38 -3
- package/gsd-core/bin/lib/markdown-sectionizer.cjs +8 -1
- package/gsd-core/bin/lib/markdown-table.cjs +133 -20
- package/gsd-core/bin/lib/mcp-catalog.cjs +518 -0
- package/gsd-core/bin/lib/mcp-server.cjs +135 -3
- package/gsd-core/bin/lib/milestone-lock.cjs +248 -0
- package/gsd-core/bin/lib/milestone.cjs +821 -109
- package/gsd-core/bin/lib/model-catalog.cjs +59 -1
- package/gsd-core/bin/lib/model-resolver.cjs +183 -40
- package/gsd-core/bin/lib/normalize-test-command.cjs +1 -1
- package/gsd-core/bin/lib/pattern.cjs +122 -0
- package/gsd-core/bin/lib/phase-estimation.cjs +1 -1
- package/gsd-core/bin/lib/phase-id.cjs +507 -36
- package/gsd-core/bin/lib/phase-lifecycle.cjs +28 -3
- package/gsd-core/bin/lib/phase-locator.cjs +258 -58
- package/gsd-core/bin/lib/phase.cjs +891 -156
- package/gsd-core/bin/lib/plan-dependency-graph.cjs +303 -0
- package/gsd-core/bin/lib/plan-drift-guard.cjs +120 -0
- package/gsd-core/bin/lib/plan-scan.cjs +86 -2
- package/gsd-core/bin/lib/planning-scope.cjs +31 -0
- package/gsd-core/bin/lib/planning-snapshot.cjs +890 -0
- package/gsd-core/bin/lib/planning-workspace.cjs +60 -6
- package/gsd-core/bin/lib/probe-core.cjs +1 -1
- package/gsd-core/bin/lib/profile-output.cjs +1 -1
- package/gsd-core/bin/lib/prompt-budget.cjs +128 -165
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +740 -0
- package/gsd-core/bin/lib/retired-artifact-cleanup.cjs +85 -0
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +108 -0
- package/gsd-core/bin/lib/review-lane-invocation.cjs +30 -0
- package/gsd-core/bin/lib/review-lane-runner.cjs +447 -68
- package/gsd-core/bin/lib/review-reviewer-selection.cjs +13 -18
- package/gsd-core/bin/lib/roadmap-command-router.cjs +76 -9
- package/gsd-core/bin/lib/roadmap-parser.cjs +1035 -194
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +37 -10
- package/gsd-core/bin/lib/roadmap.cjs +405 -84
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +795 -100
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +14 -2
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +440 -57
- package/gsd-core/bin/lib/runtime-config-adapter-registry.cjs +3 -2
- package/gsd-core/bin/lib/runtime-homes.cjs +220 -41
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +220 -44
- package/gsd-core/bin/lib/runtime-name-policy.cjs +3 -1
- package/gsd-core/bin/lib/runtime-slash.cjs +27 -9
- package/gsd-core/bin/lib/section-manifest.cjs +209 -0
- package/gsd-core/bin/lib/security.cjs +104 -5
- package/gsd-core/bin/lib/shell-command-projection.cjs +388 -30
- package/gsd-core/bin/lib/smart-entry.cjs +154 -22
- package/gsd-core/bin/lib/state-command-router.cjs +5 -1
- package/gsd-core/bin/lib/state-document.cjs +152 -8
- package/gsd-core/bin/lib/state-transition.cjs +424 -105
- package/gsd-core/bin/lib/state.cjs +1927 -401
- package/gsd-core/bin/lib/surface.cjs +35 -10
- 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 +20 -4
- package/gsd-core/bin/lib/uat.cjs +706 -64
- package/gsd-core/bin/lib/ui-frontend-evidence.cjs +157 -0
- package/gsd-core/bin/lib/ui-safety-gate.cjs +14 -5
- package/gsd-core/bin/lib/unusable-input.cjs +33 -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.cjs +20 -6
- package/gsd-core/bin/lib/vendor/README.md +37 -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 +287 -20
- package/gsd-core/bin/lib/verify.cjs +368 -880
- package/gsd-core/bin/lib/workflow-fragments.cjs +557 -0
- package/gsd-core/bin/lib/workstream-inventory-builder.cjs +203 -19
- package/gsd-core/bin/lib/workstream-inventory.cjs +576 -31
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-base-ref.cjs +50 -6
- package/gsd-core/bin/lib/worktree-safety.cjs +450 -125
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +9 -1
- package/gsd-core/references/agent-contracts.md +43 -26
- package/gsd-core/references/artifact-types.md +10 -3
- package/gsd-core/references/autonomous-ui-design-contract.md +42 -0
- package/gsd-core/references/checkpoints.md +2 -2
- package/gsd-core/references/context-budget.md +1 -1
- package/gsd-core/references/debugger-techniques.md +255 -0
- package/gsd-core/references/dispatch-isolation-gate.md +138 -0
- package/gsd-core/references/doc-conflict-engine.md +1 -1
- package/gsd-core/references/execute-mvp-tdd.md +3 -3
- package/gsd-core/references/execute-phase-between-wave-reset.md +6 -2
- 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 +6 -2
- package/gsd-core/references/gate-prompts.md +1 -1
- package/gsd-core/references/git-planning-commit.md +2 -1
- package/gsd-core/references/loop-hook-dispatch.md +39 -2
- package/gsd-core/references/model-profiles.md +12 -4
- package/gsd-core/references/mvp-concepts.md +9 -9
- package/gsd-core/references/planner-guidance.md +3 -9
- package/gsd-core/references/planner-preconditions.md +1 -1
- package/gsd-core/references/planner-reviews.md +1 -1
- package/gsd-core/references/planning-config.md +8 -6
- package/gsd-core/references/research-documentation-lookup.md +5 -3
- package/gsd-core/references/revision-loop.md +1 -1
- package/gsd-core/references/specless-probe-fallback.md +8 -7
- package/gsd-core/references/universal-anti-patterns.md +3 -3
- package/gsd-core/references/verifier-phase-gates.md +192 -0
- package/gsd-core/references/verifier-wiring-patterns.md +100 -0
- package/gsd-core/references/verify-mvp-mode.md +1 -1
- package/gsd-core/references/workstream-flag.md +22 -6
- package/gsd-core/references/worktree-branch-check.md +2 -2
- package/gsd-core/templates/discussion-log.md +1 -1
- package/gsd-core/templates/phase-prompt.md +2 -4
- package/gsd-core/templates/state.md +4 -4
- package/gsd-core/templates/summary-complex.md +2 -0
- package/gsd-core/templates/summary-minimal.md +2 -0
- package/gsd-core/templates/summary-standard.md +2 -0
- package/gsd-core/templates/summary.md +2 -0
- package/gsd-core/templates/verification-report.md +9 -1
- package/gsd-core/workflows/ai-integration-phase.md +9 -11
- package/gsd-core/workflows/audit-milestone.md +3 -0
- package/gsd-core/workflows/autonomous/steps/converge-banner.md +1 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-bg.md +11 -0
- package/gsd-core/workflows/autonomous/steps/converge-dispatch-inline.md +7 -0
- package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +21 -0
- package/gsd-core/workflows/autonomous/steps/converge-loop.md +7 -0
- package/gsd-core/workflows/autonomous.md +33 -70
- package/gsd-core/workflows/cleanup.md +62 -3
- package/gsd-core/workflows/code-review/steps/dispatch-fix.md +39 -0
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +93 -0
- package/gsd-core/workflows/code-review-fix.md +37 -10
- package/gsd-core/workflows/code-review.md +74 -166
- package/gsd-core/workflows/complete-milestone/steps/git-tag.md +29 -0
- package/gsd-core/workflows/complete-milestone.md +160 -95
- package/gsd-core/workflows/debug.md +16 -17
- package/gsd-core/workflows/diagnose-issues.md +56 -8
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -1
- package/gsd-core/workflows/discuss-phase/modes/default.md +1 -1
- package/gsd-core/workflows/discuss-phase-assumptions/steps/auto-advance-dispatch.md +15 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +7 -17
- package/gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md +51 -0
- package/gsd-core/workflows/docs-update.md +8 -51
- package/gsd-core/workflows/edit-phase.md +26 -1
- package/gsd-core/workflows/eval-review.md +3 -5
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +64 -7
- package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +50 -0
- package/gsd-core/workflows/execute-phase/steps/partial-wave.md +31 -0
- 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 +21 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +42 -0
- package/gsd-core/workflows/execute-phase/steps/regression-gate.md +43 -37
- package/gsd-core/workflows/execute-phase.md +103 -187
- package/gsd-core/workflows/execute-plan.md +36 -4
- package/gsd-core/workflows/explore.md +131 -4
- package/gsd-core/workflows/fast.md +10 -2
- package/gsd-core/workflows/health.md +73 -4
- package/gsd-core/workflows/help/modes/full.md +6 -1
- package/gsd-core/workflows/import.md +4 -4
- package/gsd-core/workflows/ingest-docs.md +7 -6
- package/gsd-core/workflows/mvp-phase.md +6 -3
- package/gsd-core/workflows/new-milestone/steps/project-md-milestone-write.md +16 -0
- package/gsd-core/workflows/new-milestone/steps/reset-phase-safety.md +19 -0
- package/gsd-core/workflows/new-milestone.md +35 -47
- package/gsd-core/workflows/new-project/steps/auto-mode-config.md +176 -0
- package/gsd-core/workflows/new-project/steps/auto-mode-detection.md +32 -0
- package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +18 -0
- package/gsd-core/workflows/new-project.md +27 -240
- package/gsd-core/workflows/next.md +12 -0
- package/gsd-core/workflows/plan-phase/steps/adr-ingest-express-path.md +15 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +110 -0
- package/gsd-core/workflows/plan-phase/steps/prd-express-gate.md +8 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-early-exit.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/research-only-modifiers.md +16 -0
- package/gsd-core/workflows/plan-phase/steps/reviews-prerequisite.md +17 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +149 -0
- package/gsd-core/workflows/plan-phase.md +89 -209
- package/gsd-core/workflows/plan-review-convergence.md +50 -2
- package/gsd-core/workflows/progress/steps/forensic-audit.md +125 -0
- package/gsd-core/workflows/progress/steps/mvp-display.md +18 -0
- package/gsd-core/workflows/progress.md +45 -159
- package/gsd-core/workflows/quick/steps/discussion-phase.md +124 -0
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +111 -0
- package/gsd-core/workflows/quick/steps/quick-verification.md +67 -0
- package/gsd-core/workflows/quick/steps/research-phase.md +72 -0
- package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +37 -0
- package/gsd-core/workflows/quick.md +55 -405
- package/gsd-core/workflows/resume-project.md +3 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-1.md +4 -0
- package/gsd-core/workflows/review/steps/reviewer-instances-note-2.md +3 -0
- package/gsd-core/workflows/review.md +41 -13
- package/gsd-core/workflows/section-manifest.json +219 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -1
- package/gsd-core/workflows/settings.md +66 -2
- package/gsd-core/workflows/ship.md +104 -44
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/spec-phase.md +41 -20
- package/gsd-core/workflows/spike-wrap-up.md +20 -5
- package/gsd-core/workflows/spike.md +50 -16
- package/gsd-core/workflows/sync-skills.md +106 -13
- package/gsd-core/workflows/transition/steps/workstream-collision-check.md +17 -0
- package/gsd-core/workflows/transition.md +53 -31
- package/gsd-core/workflows/ui-phase.md +13 -12
- package/gsd-core/workflows/ui-review.md +2 -2
- package/gsd-core/workflows/update/steps/channel-banner.md +7 -0
- package/gsd-core/workflows/update.md +19 -8
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +36 -0
- package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +21 -0
- package/gsd-core/workflows/verify-work.md +17 -65
- package/hooks/dist/gsd-agent-isolation-guard.js +517 -0
- package/hooks/dist/gsd-check-update-worker.js +64 -12
- package/hooks/dist/gsd-check-update.js +19 -1
- package/hooks/dist/gsd-cursor-pre-tool.js +0 -3
- package/hooks/dist/gsd-cursor-subagent-start.js +607 -26
- package/hooks/dist/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/dist/gsd-prompt-guard.js +21 -20
- package/hooks/dist/gsd-read-injection-scanner.js +45 -24
- package/hooks/dist/gsd-statusline.js +90 -6
- package/hooks/dist/gsd-update-banner.js +22 -1
- package/hooks/dist/gsd-workflow-guard.js +134 -36
- package/hooks/dist/gsd-worktree-path-guard.js +2 -1
- package/hooks/dist/gsd-write-guard.js +359 -0
- package/hooks/dist/lib/git-cmd.js +92 -59
- 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 +277 -0
- package/hooks/dist/managed-hooks-registry.cjs +2 -0
- package/hooks/gsd-agent-isolation-guard.js +517 -0
- package/hooks/gsd-check-update-worker.js +64 -12
- package/hooks/gsd-check-update.js +19 -1
- package/hooks/gsd-cursor-pre-tool.js +0 -3
- package/hooks/gsd-cursor-subagent-start.js +607 -26
- package/hooks/gsd-cursor-subagent-stop.js +3 -2
- package/hooks/gsd-prompt-guard.js +21 -20
- package/hooks/gsd-read-injection-scanner.js +45 -24
- package/hooks/gsd-statusline.js +90 -6
- package/hooks/gsd-update-banner.js +22 -1
- package/hooks/gsd-workflow-guard.js +134 -36
- package/hooks/gsd-worktree-path-guard.js +2 -1
- package/hooks/gsd-write-guard.js +359 -0
- package/hooks/hooks.json +12 -0
- package/hooks/lib/git-cmd.js +92 -59
- package/hooks/lib/injection-patterns.js +45 -0
- package/hooks/lib/isolation-deny-reason.js +39 -0
- package/hooks/lib/isolation-sentinel.js +277 -0
- package/hooks/managed-hooks-registry.cjs +2 -0
- package/package.json +31 -10
- package/pi/gsd.cjs +71 -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 +9 -0
- package/scripts/changeset/lint.cjs +68 -6
- package/scripts/changeset/serialize.cjs +5 -1
- package/scripts/check-alias-drift.cjs +7 -43
- package/scripts/check-contract-drift.cjs +297 -0
- package/scripts/ci-test-scope.cjs +19 -2
- package/scripts/command-contract-helpers.cjs +903 -1
- package/scripts/gen-adr-index.cjs +728 -38
- package/scripts/gen-capability-matrix.cjs +1 -1
- package/scripts/gen-capability-registry.cjs +3 -15
- package/scripts/gen-context-index.cjs +439 -0
- package/scripts/gen-health-docs.cjs +390 -0
- package/scripts/gen-inventory-manifest.cjs +150 -4
- package/scripts/gen-loop-host-contract.cjs +4 -24
- package/scripts/gen-prompt-budget-parity-corpus.cjs +645 -0
- package/scripts/gen-registry.cjs +3 -14
- package/scripts/gen-section-manifest.cjs +638 -0
- package/scripts/generate-package-identity.cjs +4 -2
- package/scripts/lib/alias-drift-families.cjs +46 -0
- package/scripts/lib/drift-scan.cjs +278 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +15 -54
- 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-compiled-artifact-sync.cjs +6 -1
- 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-command-form.cjs +195 -0
- package/scripts/lint-docs-required.cjs +9 -1
- package/scripts/lint-emitted-drift-ack.cjs +215 -20
- package/scripts/lint-eslint-glob-coverage.allowlist.json +34 -0
- package/scripts/lint-eslint-glob-coverage.cjs +340 -0
- package/scripts/lint-example-parser-parity.cjs +395 -0
- package/scripts/lint-frontmatter-scalar-broad-grep.cjs +237 -0
- package/scripts/lint-health-diagnostic-rule-table.cjs +404 -0
- package/scripts/lint-hooks-runtime-build-seam.cjs +262 -0
- package/scripts/lint-milestone-window-drift.cjs +468 -0
- package/scripts/lint-phase-enumeration-drift.cjs +479 -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 +434 -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 +320 -0
- package/scripts/lint-state-field-drift.cjs +805 -0
- package/scripts/lint-state-write-path-drift.cjs +1045 -0
- package/scripts/lint-test-file-count.allowlist.json +40 -3
- package/scripts/lint-unreachable-guard-drift.cjs +843 -0
- package/scripts/lint-vendored-deps.cjs +124 -0
- package/scripts/mutation-matrix.cjs +13 -0
- package/scripts/pr-changed-files.cjs +63 -0
- package/scripts/pr-template-policy.cjs +14 -4
- package/scripts/prompt-injection-scan.sh +52 -6
- package/scripts/require-issue-link-policy.cjs +192 -0
- package/scripts/state-write-path-drift-baseline.json +19 -0
- package/scripts/sync-runtime-launcher.cjs +2 -4
- package/skills/gsd-autonomous/SKILL.md +0 -1
- package/skills/gsd-code-review/SKILL.md +1 -1
- package/skills/gsd-execute-phase/SKILL.md +1 -2
- package/skills/gsd-map-codebase/SKILL.md +1 -1
- package/skills/gsd-mempalace-capture/SKILL.md +2 -2
- package/skills/gsd-mempalace-recall/SKILL.md +1 -1
- package/skills/gsd-new-milestone/SKILL.md +2 -2
- package/skills/gsd-next/SKILL.md +0 -1
- package/skills/gsd-plan-phase/SKILL.md +1 -2
- package/skills/gsd-progress/SKILL.md +0 -1
- package/skills/gsd-quick/SKILL.md +1 -1
- 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/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 -577
- package/scripts/affected-tests-lib.cjs +0 -554
- package/scripts/gen-emitted-baseline.cjs +0 -145
- package/scripts/lint-allow-test-rule-refs.cjs +0 -162
- package/scripts/run-affected-tests.cjs +0 -7
- package/scripts/run-tests.cjs +0 -1050
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Conservative cleanup for artifact surfaces retired by a runtime descriptor.
|
|
4
|
+
*
|
|
5
|
+
* A descriptor may stop materializing an artifact kind while old installs
|
|
6
|
+
* still contain files from that surface. Install and profile/surface apply
|
|
7
|
+
* both call this helper so either path converges an existing installation.
|
|
8
|
+
* Only files proven managed by the previous install manifest are removed;
|
|
9
|
+
* modified and unknown files are preserved for the journaled installer
|
|
10
|
+
* migration (or the user) to handle without data loss.
|
|
11
|
+
*/
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
16
|
+
// #2874 (ADR-58 cleanup phase): pruneRetiredRuntimeArtifacts is the first
|
|
17
|
+
// thing installRuntimeArtifacts calls, so its fs calls are routed through
|
|
18
|
+
// the injectable seam too — see install-fs-adapter.cts's module doc.
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
20
|
+
const installFsAdapter = require("./install-fs-adapter.cjs");
|
|
21
|
+
const { installFs } = installFsAdapter;
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
23
|
+
const installerMigrations = require("./installer-migrations.cjs");
|
|
24
|
+
const external_descriptor_trust_cjs_1 = require("./external-descriptor-trust.cjs");
|
|
25
|
+
// Generated at build time, so no TypeScript source declaration exists.
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
27
|
+
const capabilityRegistry = require('./capability-registry.cjs');
|
|
28
|
+
function retiredArtifactsFor(runtime) {
|
|
29
|
+
const configured = capabilityRegistry.runtimes?.[runtime]?.runtime?.hostBehaviors?.retiredArtifacts;
|
|
30
|
+
return Array.isArray(configured) ? configured : [];
|
|
31
|
+
}
|
|
32
|
+
function pruneRetiredRuntimeArtifacts(runtime, configDir) {
|
|
33
|
+
const result = { removed: [], preserved: [] };
|
|
34
|
+
const declarations = retiredArtifactsFor(runtime);
|
|
35
|
+
if (declarations.length === 0)
|
|
36
|
+
return result;
|
|
37
|
+
const manifest = installerMigrations.readInstallManifest(configDir);
|
|
38
|
+
for (const declaration of declarations) {
|
|
39
|
+
const destSubpath = declaration.destSubpath;
|
|
40
|
+
const prefix = declaration.prefix;
|
|
41
|
+
const suffix = declaration.suffix;
|
|
42
|
+
if (typeof destSubpath !== 'string' || destSubpath.length === 0 ||
|
|
43
|
+
typeof prefix !== 'string' || prefix.length === 0 ||
|
|
44
|
+
typeof suffix !== 'string' || suffix.length === 0 ||
|
|
45
|
+
!(0, external_descriptor_trust_cjs_1.isPathConfined)(destSubpath, configDir)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const destDir = node_path_1.default.resolve(configDir, destSubpath);
|
|
49
|
+
let entries;
|
|
50
|
+
try {
|
|
51
|
+
if (!installFs().existsSync(destDir) || installFs().lstatSync(destDir).isSymbolicLink())
|
|
52
|
+
continue;
|
|
53
|
+
entries = installFs().readdirSync(destDir, { withFileTypes: true });
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (!entry.isFile() || !entry.name.startsWith(prefix) || !entry.name.endsWith(suffix))
|
|
60
|
+
continue;
|
|
61
|
+
const relPath = node_path_1.default.posix.join(destSubpath.replace(/\\/g, '/'), entry.name);
|
|
62
|
+
const artifact = installerMigrations.classifyArtifact(configDir, relPath, manifest);
|
|
63
|
+
if (artifact.classification !== 'managed-pristine') {
|
|
64
|
+
result.preserved.push(relPath);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
installFs().unlinkSync(node_path_1.default.join(destDir, entry.name));
|
|
69
|
+
result.removed.push(relPath);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
result.preserved.push(relPath);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
if (installFs().readdirSync(destDir).length === 0)
|
|
77
|
+
installFs().rmdirSync(destDir);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Non-empty, unreadable, or concurrently changed: preserve the directory.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
module.exports = { pruneRetiredRuntimeArtifacts, retiredArtifactsFor };
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
*/
|
|
53
53
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
54
|
exports.DOCS_PARITY_VIOLATION = exports.LANE_SLUG_RE = exports.PARITY_VIOLATION = exports.REVIEWER_LANES = exports.ARGV_PLACEHOLDER = void 0;
|
|
55
|
+
exports.mergeReviewerLanes = mergeReviewerLanes;
|
|
55
56
|
exports.checkReviewerLaneParity = checkReviewerLaneParity;
|
|
56
57
|
exports.checkReviewerDocsParity = checkReviewerDocsParity;
|
|
57
58
|
/**
|
|
@@ -127,6 +128,15 @@ exports.REVIEWER_LANES = Object.freeze([
|
|
|
127
128
|
...SPAWN_STDIN_STDOUT,
|
|
128
129
|
modelArg: '--model',
|
|
129
130
|
effortChannel: 'argv',
|
|
131
|
+
// #2483: without these the claude leg is the only reviewer that additionally inherits the
|
|
132
|
+
// invoking user's global CLAUDE.md, the project CLAUDE.md, and Claude Code auto-memory —
|
|
133
|
+
// a context asymmetry against the independent-review premise (gemini sees only the
|
|
134
|
+
// assembled prompt; codex runs --ephemeral). Both flags, not just the first: CLAUDE.md
|
|
135
|
+
// loading and auto-memory are independently-toggled mechanisms, and an environment
|
|
136
|
+
// exporting CLAUDE_CODE_DISABLE_AUTO_MEMORY=0 forces auto-memory back ON — the explicit
|
|
137
|
+
// pair is robust against that. Applies when /gsd:review runs from a non-Claude-Code host;
|
|
138
|
+
// inside Claude Code the claude lane self-skips for independence.
|
|
139
|
+
env: { CLAUDE_CODE_DISABLE_CLAUDE_MDS: '1', CLAUDE_CODE_DISABLE_AUTO_MEMORY: '1' },
|
|
130
140
|
},
|
|
131
141
|
timeoutFloorMs: 1_200_000,
|
|
132
142
|
emptyOutput: 'stub-with-stderr',
|
|
@@ -423,6 +433,104 @@ exports.REVIEWER_LANES = Object.freeze([
|
|
|
423
433
|
handler: null,
|
|
424
434
|
},
|
|
425
435
|
].map((lane) => Object.freeze(lane)));
|
|
436
|
+
/**
|
|
437
|
+
* Merge the first-party lane set with installed overlay `reviewer` bodies
|
|
438
|
+
* (ADR-2782 D8: first-party ∪ overlay, first-party wins on slug collision).
|
|
439
|
+
*
|
|
440
|
+
* `routeReviewLane` (gsd-core/bin/gsd-tools.cjs) consumes this to build the lane
|
|
441
|
+
* map its `sections`/`flags`/`plan`/`invoke` subcommands resolve against, so an
|
|
442
|
+
* installed, consented third-party reviewer capability (`role:"reviewer"` with a
|
|
443
|
+
* declared `reviewer` body) becomes selectable, plannable, and invocable through
|
|
444
|
+
* the same surface as a built-in lane — closing #2927, where the overlay was
|
|
445
|
+
* roster-visible (`deriveReviewerSlugs`) and disclosed at install
|
|
446
|
+
* (`collectReviewerLaneSurfaces`) but never reached the invocation path.
|
|
447
|
+
*
|
|
448
|
+
* ADR-2782 D1 deliberately made the manifest `reviewer` body field-identical to
|
|
449
|
+
* `ReviewerLaneCommon` so "Phase 2 harvests the shape into the capability manifest
|
|
450
|
+
* with no translation layer" (CONTEXT.md reviewer-lane-descriptor predicate). The
|
|
451
|
+
* overlay body IS already `ReviewerLane`-shaped; this function MERGES, it does not
|
|
452
|
+
* PROJECT — there is no field renaming, no vocabulary translation. That is the
|
|
453
|
+
* design decision the bug violated by simply never calling anything.
|
|
454
|
+
*
|
|
455
|
+
* Pure and TOTAL — never throws on any input, because third-party overlay
|
|
456
|
+
* manifests are untrusted data reaching this seam at load time. A cap whose
|
|
457
|
+
* `reviewer` body is absent, non-object, or carries an empty/grammar-invalid slug
|
|
458
|
+
* is SKIPPED (contributes no lane) rather than crashing, so one malformed overlay
|
|
459
|
+
* cannot take the whole `review-lane` surface (and every first-party lane with it)
|
|
460
|
+
* down. The slug grammar (`LANE_SLUG_RE`) is enforced HERE even though
|
|
461
|
+
* `resolveLanePlan`'s trust boundary re-checks it, because `sections`/`flags` read
|
|
462
|
+
* lane fields before reaching `resolveLanePlan` — defense in depth against the
|
|
463
|
+
* path-traversal class the invocation boundary exists for.
|
|
464
|
+
*
|
|
465
|
+
* First-party wins: an overlay declaring a slug that already names a first-party
|
|
466
|
+
* lane is silently superseded (the first-party entry is kept, identity-stable),
|
|
467
|
+
* never overwritten. The first-party object is returned by reference, not copied.
|
|
468
|
+
*
|
|
469
|
+
* @param firstParty The frozen first-party lane set (`REVIEWER_LANES`).
|
|
470
|
+
* @param registry The merged capability registry
|
|
471
|
+
* (`loadRegistry({ includeInstalled: true })`); only its
|
|
472
|
+
* `capabilities` map is read. A cap contributes a lane iff it
|
|
473
|
+
* carries an object `reviewer` body with a non-empty,
|
|
474
|
+
* grammar-valid `slug`. The `role:"runtime"` `reviewerCli`
|
|
475
|
+
* alias never contributed a lane here, and as of #2801 it no
|
|
476
|
+
* longer contributes to the selection roster
|
|
477
|
+
* (`deriveReviewerSlugs`) either — the two surfaces now agree.
|
|
478
|
+
* @returns A NEW array: first-party lanes (in order) followed by accepted overlay
|
|
479
|
+
* lanes (in registry iteration order). Callers must not mutate it.
|
|
480
|
+
*/
|
|
481
|
+
function mergeReviewerLanes(firstParty, registry) {
|
|
482
|
+
// First-party always wins and is returned by reference (identity-stable), so a
|
|
483
|
+
// collision cannot perturb the first-party entry a consumer already holds.
|
|
484
|
+
const bySlug = new Map();
|
|
485
|
+
const ordered = [];
|
|
486
|
+
for (const lane of firstParty) {
|
|
487
|
+
const slug = typeof lane.slug === 'string' ? lane.slug.trim() : '';
|
|
488
|
+
if (!slug)
|
|
489
|
+
continue; // unreachable for the shipped frozen set, but this is exported
|
|
490
|
+
if (!bySlug.has(slug)) {
|
|
491
|
+
bySlug.set(slug, lane);
|
|
492
|
+
ordered.push(lane);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
const capabilities = (registry && registry.capabilities) || {};
|
|
496
|
+
for (const cap of Object.values(capabilities)) {
|
|
497
|
+
if (cap === null || typeof cap !== 'object' || Array.isArray(cap))
|
|
498
|
+
continue;
|
|
499
|
+
const body = cap.reviewer;
|
|
500
|
+
// C1/C2 (mirroring collectReviewerLaneSurfaces): a missing, null, or
|
|
501
|
+
// non-object reviewer body declares no lane — never an error at this layer.
|
|
502
|
+
if (body === null || typeof body !== 'object' || Array.isArray(body))
|
|
503
|
+
continue;
|
|
504
|
+
const rawSlug = body.slug;
|
|
505
|
+
const slug = typeof rawSlug === 'string' ? rawSlug.trim() : '';
|
|
506
|
+
// Empty/whitespace slug: nothing to key on. Grammar-invalid slug: the
|
|
507
|
+
// path-traversal class — skip rather than admit, even though resolveLanePlan
|
|
508
|
+
// would reject it downstream. Both are skips, not throws.
|
|
509
|
+
if (!slug || !exports.LANE_SLUG_RE.test(slug))
|
|
510
|
+
continue;
|
|
511
|
+
if (bySlug.has(slug))
|
|
512
|
+
continue; // D8: first-party (or an earlier overlay) wins
|
|
513
|
+
// The body is already ReviewerLane-shaped per ADR-2782 D1. We do NOT
|
|
514
|
+
// deep-validate every field here: the invocation trust boundary
|
|
515
|
+
// (resolveLanePlan) is the seam that re-validates a lane before it runs, and
|
|
516
|
+
// `sections`/`flags` are both tolerant of a partial body (flags filters by
|
|
517
|
+
// shape; sections reads slug/reviewsSection which a non-string cap simply
|
|
518
|
+
// renders as undefined). Admitting the body keeps the merge a pure merge.
|
|
519
|
+
//
|
|
520
|
+
// The slug is normalized to its trimmed value on the stored lane so the merge
|
|
521
|
+
// and the selection roster (`deriveReviewerSlugs`, which trims before adding)
|
|
522
|
+
// agree on the canonical key — otherwise a body declaring `slug: ' x '`
|
|
523
|
+
// would key the map on `'x'` but emit the raw `' x '` in `sections` and fail
|
|
524
|
+
// to match a `--selected` value coming from the roster. (The capability
|
|
525
|
+
// validator's grammar check rejects surrounding whitespace before this is
|
|
526
|
+
// reachable through a real install, so this is belt-and-braces parity with the
|
|
527
|
+
// roster, not a live-input guard.)
|
|
528
|
+
const lane = { ...body, slug };
|
|
529
|
+
bySlug.set(slug, lane);
|
|
530
|
+
ordered.push(lane);
|
|
531
|
+
}
|
|
532
|
+
return ordered;
|
|
533
|
+
}
|
|
426
534
|
/* ------------------------------------------------------------------ *
|
|
427
535
|
* DEFECT.GENERATIVE-FIX parity (CONTEXT.md:797)
|
|
428
536
|
* ------------------------------------------------------------------ */
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
*/
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.LANE_UNAVAILABLE = void 0;
|
|
27
|
+
exports.configString = configString;
|
|
27
28
|
exports.normalizeHost = normalizeHost;
|
|
28
29
|
exports.isEmptyReview = isEmptyReview;
|
|
29
30
|
exports.fileRefPrompt = fileRefPrompt;
|
|
@@ -74,6 +75,9 @@ const KNOWN_HANDLERS = new Set(['antigravity', 'openai-compatible', 'opencode'])
|
|
|
74
75
|
*
|
|
75
76
|
* A non-string (number, bool, object, array) is NOT coerced. `String(0)` would put `"0"` into argv
|
|
76
77
|
* as a model name; a wrong model silently reviewed is worse than no model override.
|
|
78
|
+
*
|
|
79
|
+
* Exported and shared with the runner's model-recovery arms (#2295) — "what counts as unset" has
|
|
80
|
+
* ONE source, so the plan resolver and the runner's recovered-model normalization cannot disagree.
|
|
77
81
|
*/
|
|
78
82
|
function configString(raw) {
|
|
79
83
|
if (typeof raw !== 'string')
|
|
@@ -212,6 +216,10 @@ function resolveLanePlan(input) {
|
|
|
212
216
|
? lane.timeoutFloorMs
|
|
213
217
|
: 900_000;
|
|
214
218
|
const emptyOutput = lane.emptyOutput === 'handler-owned' ? 'handler-owned' : 'stub-with-stderr';
|
|
219
|
+
// #3194: only an EXACT 'diff-only' declaration exempts a lane from evidence verification.
|
|
220
|
+
// Anything else — including a missing or garbage value on a third-party overlay body —
|
|
221
|
+
// resolves as 'source-grounded', so the runner verifies rather than trusts it.
|
|
222
|
+
const evidenceClass = lane.evidenceClass === 'diff-only' ? 'diff-only' : 'source-grounded';
|
|
215
223
|
const requiresBinaries = Array.isArray(lane.requiresBinaries)
|
|
216
224
|
? lane.requiresBinaries.filter((b) => typeof b === 'string')
|
|
217
225
|
: [];
|
|
@@ -255,6 +263,7 @@ function resolveLanePlan(input) {
|
|
|
255
263
|
errPath,
|
|
256
264
|
timeoutMs,
|
|
257
265
|
emptyOutput,
|
|
266
|
+
evidenceClass,
|
|
258
267
|
handler,
|
|
259
268
|
requiresBinaries,
|
|
260
269
|
probe: lane.probe,
|
|
@@ -325,6 +334,23 @@ function resolveLanePlan(input) {
|
|
|
325
334
|
argv.push(token);
|
|
326
335
|
}
|
|
327
336
|
}
|
|
337
|
+
// Per-invocation env pairs (#2483). Own string-valued entries only — a non-string is dropped,
|
|
338
|
+
// never coerced, and prototype members never resolve (same lookup discipline as the argv
|
|
339
|
+
// expansions above). An empty or absent declaration resolves to `null`, so the runner has one
|
|
340
|
+
// shape to test.
|
|
341
|
+
let env = null;
|
|
342
|
+
const declaredEnv = inv.env;
|
|
343
|
+
if (declaredEnv !== null && typeof declaredEnv === 'object' && !Array.isArray(declaredEnv)) {
|
|
344
|
+
const source = declaredEnv;
|
|
345
|
+
const pairs = {};
|
|
346
|
+
for (const k of Object.keys(source)) {
|
|
347
|
+
const v = source[k];
|
|
348
|
+
if (typeof v === 'string')
|
|
349
|
+
pairs[k] = v;
|
|
350
|
+
}
|
|
351
|
+
if (Object.keys(pairs).length > 0)
|
|
352
|
+
env = pairs;
|
|
353
|
+
}
|
|
328
354
|
return {
|
|
329
355
|
ok: true,
|
|
330
356
|
warnings,
|
|
@@ -333,6 +359,8 @@ function resolveLanePlan(input) {
|
|
|
333
359
|
slug,
|
|
334
360
|
binary,
|
|
335
361
|
argv,
|
|
362
|
+
model: modelExpansion.length > 0 ? model : null,
|
|
363
|
+
effort: effortExpansion.length > 0 ? (configString(input.effortValue) ?? null) : null,
|
|
336
364
|
stdin,
|
|
337
365
|
promptPath,
|
|
338
366
|
outputTarget,
|
|
@@ -340,9 +368,11 @@ function resolveLanePlan(input) {
|
|
|
340
368
|
errPath,
|
|
341
369
|
timeoutMs,
|
|
342
370
|
emptyOutput,
|
|
371
|
+
evidenceClass,
|
|
343
372
|
handler,
|
|
344
373
|
requiresBinaries,
|
|
345
374
|
probe: lane.probe,
|
|
375
|
+
env,
|
|
346
376
|
},
|
|
347
377
|
};
|
|
348
378
|
}
|