@opengsd/gsd-core 1.12.0 → 1.14.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/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +458 -0
- package/agents/gsd-code-fixer.md +5 -5
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +345 -0
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +63 -35
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-plan-checker.md +76 -57
- package/agents/gsd-planner.md +14 -0
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-checker.md +19 -3
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +29 -0
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +23 -1
- package/bin/install.js +444 -134
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +1 -0
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +2 -1
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/surface.md +18 -8
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +532 -174
- package/gsd-core/bin/lib/adr-parser.cjs +1 -1
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +39 -22
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +528 -116
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-state.cjs +7 -1
- package/gsd-core/bin/lib/capability-validator.cjs +134 -5
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +198 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/commands.cjs +981 -79
- package/gsd-core/bin/lib/config-loader.cjs +4 -0
- package/gsd-core/bin/lib/config.cjs +153 -38
- package/gsd-core/bin/lib/core-utils.cjs +34 -7
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +343 -28
- package/gsd-core/bin/lib/edge-probe.cjs +14 -1
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +137 -23
- package/gsd-core/bin/lib/gap-checker.cjs +22 -13
- package/gsd-core/bin/lib/git-base-branch.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +54 -11
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +87 -23
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-integration.cjs +57 -5
- package/gsd-core/bin/lib/init-command-router.cjs +14 -0
- package/gsd-core/bin/lib/init.cjs +539 -60
- package/gsd-core/bin/lib/install-engine.cjs +199 -14
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +45 -0
- package/gsd-core/bin/lib/install-profiles.cjs +36 -14
- package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +33 -4
- package/gsd-core/bin/lib/io.cjs +35 -0
- package/gsd-core/bin/lib/loop-resolver.cjs +64 -39
- package/gsd-core/bin/lib/markdown-table.cjs +123 -0
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +41 -10
- package/gsd-core/bin/lib/model-resolver.cjs +101 -10
- package/gsd-core/bin/lib/phase-command-router.cjs +20 -7
- package/gsd-core/bin/lib/phase-id.cjs +412 -31
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase.cjs +941 -98
- package/gsd-core/bin/lib/plan-document.cjs +10 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +34 -18
- package/gsd-core/bin/lib/planning-snapshot.cjs +206 -30
- package/gsd-core/bin/lib/planning-workspace.cjs +153 -29
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +53 -5
- package/gsd-core/bin/lib/review-lane-invocation.cjs +96 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-parser.cjs +555 -41
- package/gsd-core/bin/lib/roadmap.cjs +292 -69
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +260 -43
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +28 -20
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +294 -108
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -47
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +4 -0
- package/gsd-core/bin/lib/smart-entry.cjs +7 -9
- package/gsd-core/bin/lib/state-document.cjs +159 -32
- package/gsd-core/bin/lib/state-md-schema.cjs +44 -27
- package/gsd-core/bin/lib/state-transition.cjs +465 -62
- package/gsd-core/bin/lib/state.cjs +906 -151
- package/gsd-core/bin/lib/surface.cjs +83 -10
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/uat.cjs +1420 -516
- package/gsd-core/bin/lib/update-context.cjs +36 -26
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +316 -23
- package/gsd-core/bin/lib/verify-command-grounding.cjs +1 -1
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +531 -36
- package/gsd-core/bin/lib/workstream-inventory.cjs +21 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +21 -7
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +507 -81
- package/gsd-core/references/agent-contracts.md +3 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe.md +17 -13
- package/gsd-core/references/execute-mvp-tdd.md +18 -16
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +12 -3
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +75 -2
- package/gsd-core/references/planning-config.md +5 -1
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/tdd.md +17 -9
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/worktree-path-safety.md +112 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/phase-prompt.md +4 -0
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/add-backlog.md +2 -0
- package/gsd-core/workflows/add-phase.md +2 -0
- package/gsd-core/workflows/add-tests.md +1 -1
- package/gsd-core/workflows/add-todo.md +4 -3
- package/gsd-core/workflows/ai-integration-phase.md +1 -1
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +2 -0
- package/gsd-core/workflows/audit-milestone.md +2 -0
- package/gsd-core/workflows/audit-uat.md +2 -0
- package/gsd-core/workflows/autonomous.md +15 -10
- package/gsd-core/workflows/check-todos.md +5 -3
- package/gsd-core/workflows/cleanup.md +4 -2
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +22 -13
- package/gsd-core/workflows/code-review-fix.md +5 -3
- package/gsd-core/workflows/code-review.md +211 -43
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +40 -254
- package/gsd-core/workflows/debug.md +1 -1
- package/gsd-core/workflows/diagnose-issues.md +5 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +43 -13
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +15 -156
- package/gsd-core/workflows/edit-phase.md +2 -0
- package/gsd-core/workflows/eval-review.md +1 -1
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +20 -3
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +24 -3
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +8 -2
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +78 -159
- package/gsd-core/workflows/execute-plan.md +28 -15
- package/gsd-core/workflows/explore.md +2 -0
- package/gsd-core/workflows/extract-learnings.md +2 -0
- package/gsd-core/workflows/fast.md +6 -0
- package/gsd-core/workflows/forensics.md +2 -0
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +1 -1
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.compact.md +398 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +3 -1
- package/gsd-core/workflows/import.md +3 -3
- package/gsd-core/workflows/inbox.md +1 -1
- package/gsd-core/workflows/ingest-docs.md +1 -1
- package/gsd-core/workflows/insert-phase.md +2 -0
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +2 -0
- package/gsd-core/workflows/list-workspaces.md +2 -0
- package/gsd-core/workflows/manager.md +3 -3
- package/gsd-core/workflows/map-codebase.md +52 -3
- package/gsd-core/workflows/milestone-summary.md +2 -0
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +55 -13
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project.md +37 -205
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +2 -0
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +19 -4
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +9 -0
- package/gsd-core/workflows/plan-phase.md +144 -185
- package/gsd-core/workflows/plan-review-convergence.md +102 -10
- package/gsd-core/workflows/plant-seed.md +1 -1
- package/gsd-core/workflows/pr-branch.md +30 -10
- package/gsd-core/workflows/profile-user.md +1 -1
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +25 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +37 -2
- package/gsd-core/workflows/quick/steps/research-phase.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +21 -4
- package/gsd-core/workflows/reapply-patches.md +79 -3
- package/gsd-core/workflows/remove-phase.md +2 -0
- package/gsd-core/workflows/remove-workspace.md +1 -1
- package/gsd-core/workflows/resume-project.md +6 -2
- package/gsd-core/workflows/review.md +215 -10
- package/gsd-core/workflows/scan.md +2 -0
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +2 -0
- package/gsd-core/workflows/settings-integrations.md +9 -8
- package/gsd-core/workflows/settings.md +19 -6
- package/gsd-core/workflows/ship.md +10 -10
- package/gsd-core/workflows/sketch-wrap-up.md +2 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +1 -1
- package/gsd-core/workflows/spec-phase.md +24 -19
- package/gsd-core/workflows/spike-wrap-up.md +2 -0
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +2 -0
- package/gsd-core/workflows/sync-skills.md +12 -4
- package/gsd-core/workflows/thread.md +2 -0
- package/gsd-core/workflows/transition.md +2 -0
- package/gsd-core/workflows/ui-phase.md +26 -5
- package/gsd-core/workflows/ui-review.md +1 -1
- package/gsd-core/workflows/ultraplan-phase.md +2 -0
- package/gsd-core/workflows/undo.md +1 -1
- package/gsd-core/workflows/update.md +48 -43
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work.md +68 -182
- package/hooks/dist/gsd-agent-isolation-guard.js +42 -16
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-context-monitor.js +371 -27
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-node-runner.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +30 -5
- package/hooks/dist/gsd-read-guard.js +2 -0
- package/hooks/dist/gsd-read-injection-scanner.js +5 -5
- package/hooks/dist/gsd-secret-read-guard.js +1105 -0
- package/hooks/dist/gsd-statusline.js +18 -10
- package/hooks/dist/gsd-validate-commit.sh +474 -7
- package/hooks/dist/gsd-workflow-guard.js +2 -1
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-agent-isolation-guard.js +42 -16
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-context-monitor.js +371 -27
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-node-runner.sh +1 -0
- package/hooks/gsd-prompt-guard.js +30 -5
- package/hooks/gsd-read-guard.js +2 -0
- package/hooks/gsd-read-injection-scanner.js +5 -5
- package/hooks/gsd-secret-read-guard.js +1105 -0
- package/hooks/gsd-statusline.js +18 -10
- package/hooks/gsd-validate-commit.sh +474 -7
- package/hooks/gsd-workflow-guard.js +2 -1
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/hooks.json +6 -0
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +13 -9
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +11 -4
- package/scripts/check-contract-drift.cjs +4 -1
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +133 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +17 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +67 -15
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +210 -0
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +276 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lib/suite-detection.cjs +32 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +24 -2
- package/scripts/lint-phase-enumeration-drift.cjs +24 -6
- package/scripts/lint-phase-id-drift.cjs +465 -15
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-response-language-coverage.cjs +530 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-test-file-count.allowlist.json +4 -1
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +1112 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +22 -0
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +1 -0
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +2 -1
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -111,7 +111,13 @@ const RULE_W024 = {
|
|
|
111
111
|
function buildValidPhaseSet(snapshot) {
|
|
112
112
|
const valid = new Set();
|
|
113
113
|
for (const dir of snapshot.phaseDirs.value) {
|
|
114
|
-
|
|
114
|
+
// #612: the pre-migration source of this third was
|
|
115
|
+
// `collectDiskPhases(planBase, convention)`, whose keys came from the
|
|
116
|
+
// convention-aware extractor. Left convention-less here, a bracket repo's
|
|
117
|
+
// `GSD.02-05-slug` contributes `GSD.02` instead of `05`, so every STATE.md
|
|
118
|
+
// reference to a real phase falls outside the valid set and W002 fires on
|
|
119
|
+
// all of them.
|
|
120
|
+
const token = extractPhaseToken(dir, snapshot.phaseIdConvention);
|
|
115
121
|
if (token)
|
|
116
122
|
valid.add(token);
|
|
117
123
|
}
|
|
@@ -152,6 +158,17 @@ const RULE_W002 = {
|
|
|
152
158
|
const normalizedValid = normalizePhaseTokenSet(validPhases);
|
|
153
159
|
const sortedValid = [...validPhases].sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
|
|
154
160
|
const diagnostics = [];
|
|
161
|
+
// #4257: the valid set above is WORKSTREAM-scoped by construction (every
|
|
162
|
+
// source field is read from `planningPaths(cwd)`'s base, which resolves
|
|
163
|
+
// under `.planning/workstreams/<active-ws>/`), and per-workstream phase
|
|
164
|
+
// numbering is deliberate — so under a workstream the message must NAME
|
|
165
|
+
// that scope rather than make an unqualified project-wide claim (a
|
|
166
|
+
// reference to a phase declared only in a SIBLING workstream reads as
|
|
167
|
+
// "undeclared" against this list; that is the scope speaking, not drift).
|
|
168
|
+
// Root scope (`workstream === null`, flat or root-planning projects)
|
|
169
|
+
// keeps the byte-identical message — no clause is appended when none
|
|
170
|
+
// applies.
|
|
171
|
+
const scopeClause = snapshot.workstream ? ` in workstream ${snapshot.workstream}` : '';
|
|
155
172
|
for (const ref of snapshot.statePhaseTokens.value) {
|
|
156
173
|
const dotIdx = ref.indexOf('.');
|
|
157
174
|
const head = dotIdx === -1 ? ref : ref.slice(0, dotIdx);
|
|
@@ -162,7 +179,7 @@ const RULE_W002 = {
|
|
|
162
179
|
diagnostics.push({
|
|
163
180
|
code: 'W002',
|
|
164
181
|
severity: SEVERITY.WARNING,
|
|
165
|
-
message: `STATE.md references phase ${ref}, but only phases ${sortedValid.join(', ')} are declared`,
|
|
182
|
+
message: `STATE.md references phase ${ref}, but only phases ${sortedValid.join(', ')} are declared${scopeClause}`,
|
|
166
183
|
remedy: adviseRemedy('Review STATE.md manually before changing it; /gsd-health --repair will not overwrite an existing STATE.md for phase mismatches'),
|
|
167
184
|
});
|
|
168
185
|
}
|
|
@@ -233,31 +250,71 @@ const RULE_W021 = {
|
|
|
233
250
|
description: "Phase's integer prefix implies a different milestone than its ROADMAP section (phase_id_convention: milestone-prefixed)",
|
|
234
251
|
repairable: false,
|
|
235
252
|
check: (snapshot) => {
|
|
236
|
-
const convention = snapshot.config.value?.['phase_id_convention'];
|
|
237
|
-
if (convention !== 'milestone-prefixed')
|
|
238
|
-
return [];
|
|
239
253
|
const diagnostics = [];
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
254
|
+
// Two INDEPENDENT gates, evaluated in the order the pre-migration
|
|
255
|
+
// `cmdValidateHealth` block emitted them (milestone-prefixed first, then
|
|
256
|
+
// bracket). They are deliberately NOT written as if/else: the two read
|
|
257
|
+
// DIFFERENT config bases and can both be true at once.
|
|
258
|
+
//
|
|
259
|
+
// milestone-prefixed — `snapshot.config` (ROOT config only), exactly as
|
|
260
|
+
// this gate has always read it. Federating THIS one silently moved a
|
|
261
|
+
// legacy convention's answer in BOTH directions on workstream repos: a
|
|
262
|
+
// W021 that fires at base vanishing, and one silent at base firing.
|
|
263
|
+
// bracket — `snapshot.phaseIdConvention` (federated workstream -> root),
|
|
264
|
+
// because the bracket reads this half reports on are themselves
|
|
265
|
+
// federated; gating it on the root answer would split the check against
|
|
266
|
+
// the reads it describes.
|
|
267
|
+
//
|
|
268
|
+
// A workstream that overrides a `milestone-prefixed` ROOT to `bracket` is
|
|
269
|
+
// the case that makes the distinction observable, and it is the reason an
|
|
270
|
+
// early `return` here would be a bug: the root-configured M-NN gate must
|
|
271
|
+
// still fire, or the repo looks healthier than it is.
|
|
272
|
+
const rootConvention = snapshot.config.value?.['phase_id_convention'];
|
|
273
|
+
if (rootConvention === 'milestone-prefixed') {
|
|
274
|
+
diagnostics.push(...checkMilestonePrefixW021(snapshot));
|
|
275
|
+
}
|
|
276
|
+
// #612: an ADDITIVE sibling branch — the milestone-prefixed gate above is
|
|
277
|
+
// untouched. Gated strictly on the ACTIVE convention, never on
|
|
278
|
+
// project_code presence: reads are selected per convention, and a CHECK
|
|
279
|
+
// that can fail a repo runs only for the convention that repo opted into.
|
|
280
|
+
if (snapshot.phaseIdConvention === 'bracket') {
|
|
281
|
+
for (const mm of snapshot.roadmapBracketIncoherences.value) {
|
|
282
|
+
diagnostics.push({
|
|
283
|
+
code: 'W021',
|
|
284
|
+
severity: SEVERITY.WARNING,
|
|
285
|
+
message: mm.kind === 'missing-bracket'
|
|
286
|
+
? `Phase ${mm.phaseId}: heading is not in bracket form under the 'bracket' convention (expected \`[CODE.${mm.sectionMilestone}] ${mm.phaseId}:\`)`
|
|
287
|
+
: `Phase ${mm.phaseId}: bracket milestone ${mm.phaseMilestone} does not match its section milestone ${mm.sectionMilestone}`,
|
|
288
|
+
remedy: adviseRemedy('Bracket migration lands with the #612 migrator (PR-3); until then, manually align the bracket milestone in this heading to match the enclosing section.'),
|
|
289
|
+
});
|
|
290
|
+
}
|
|
257
291
|
}
|
|
258
292
|
return diagnostics;
|
|
259
293
|
},
|
|
260
294
|
};
|
|
295
|
+
/** The milestone-prefixed half of W021, unchanged by #612. */
|
|
296
|
+
function checkMilestonePrefixW021(snapshot) {
|
|
297
|
+
const diagnostics = [];
|
|
298
|
+
for (const entry of snapshot.roadmapDeclaredPhases.value) {
|
|
299
|
+
// `entry.milestone === null` means the builder never found this phase
|
|
300
|
+
// heading inside any versioned (`v\d+\.\d+`) section — the original
|
|
301
|
+
// `checkMilestonePrefixMismatches` only ever iterates phases found
|
|
302
|
+
// WITHIN a section, so a phase outside any section is equivalently
|
|
303
|
+
// never checked here.
|
|
304
|
+
if (entry.milestone === null)
|
|
305
|
+
continue;
|
|
306
|
+
const expectedMilestone = getMilestoneFromPhaseId(entry.phaseId);
|
|
307
|
+
if (expectedMilestone === null || expectedMilestone === entry.milestone)
|
|
308
|
+
continue;
|
|
309
|
+
diagnostics.push({
|
|
310
|
+
code: 'W021',
|
|
311
|
+
severity: SEVERITY.WARNING,
|
|
312
|
+
message: `Phase ${entry.phaseId}: integer prefix implies ${expectedMilestone} but listed under ${entry.milestone}`,
|
|
313
|
+
remedy: adviseRemedy('gsd-tools roadmap upgrade --convention milestone-prefixed'),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return diagnostics;
|
|
317
|
+
}
|
|
261
318
|
// ─── W026 — STATE says milestone complete but ROADMAP lists unstarted phase ─
|
|
262
319
|
const RULE_W026 = {
|
|
263
320
|
code: 'W026',
|
|
@@ -282,7 +339,14 @@ const RULE_W026 = {
|
|
|
282
339
|
// unwindowed `phaseDirNames2` (`verify.cts:2372-2382`, a direct
|
|
283
340
|
// `readdirSync` of the phases dir), not the current-milestone-windowed
|
|
284
341
|
// `phaseDirs`.
|
|
285
|
-
|
|
342
|
+
// #612: the directory read widens with the heading read that produced
|
|
343
|
+
// `currentMilestoneRoadmapPhaseIds`, or every bracket phase resolves to
|
|
344
|
+
// nothing, reads as unstarted, and this UNGATED warning false-fires on
|
|
345
|
+
// any bracket repo whose STATE says the milestone is complete. #2528
|
|
346
|
+
// moved the read onto the shared selector; the convention rides along,
|
|
347
|
+
// since the selector's primary match IS the `phaseTokenMatches` call this
|
|
348
|
+
// line used to make directly.
|
|
349
|
+
const hasDirectory = matchPhaseDirs(snapshot.allPhaseDirNames.value, normalized, snapshot.phaseIdConvention).matches.length > 0;
|
|
286
350
|
if (!hasDirectory)
|
|
287
351
|
unstarted.push(phaseId);
|
|
288
352
|
}
|
|
@@ -135,7 +135,7 @@ function checkW017(snapshot) {
|
|
|
135
135
|
function isActiveWorktreePath(activeCwd, worktreePath, platform = process.platform) {
|
|
136
136
|
const active = shellCmdProjection.toComparablePathKey(activeCwd, platform);
|
|
137
137
|
const worktree = shellCmdProjection.toComparablePathKey(worktreePath, platform);
|
|
138
|
-
return active === worktree || active.startsWith(worktree + '/');
|
|
138
|
+
return active === worktree || active.startsWith(worktree + '/'); // allow-handrolled-containment: worktree identity matching, not a containment gate
|
|
139
139
|
}
|
|
140
140
|
function checkW027(snapshot) {
|
|
141
141
|
const diagnostics = [];
|
|
@@ -72,7 +72,7 @@ const INTERFACE_POINTS = Object.freeze(['command', 'dispatch', 'model', 'hooks',
|
|
|
72
72
|
const SAFE_DEFAULTS = {
|
|
73
73
|
embeddingMode: 'declarative',
|
|
74
74
|
commandSurface: 'prose-only',
|
|
75
|
-
dispatch: { namedDispatch: false, nested: false, maxDepth: 0, background: false, subagentToolkit: 'read-only', backgroundDispatch: false, isolation: 'none' },
|
|
75
|
+
dispatch: { namedDispatch: false, nested: false, maxDepth: 0, background: false, subagentToolkit: 'read-only', backgroundDispatch: false, isolation: 'none', maxConcurrency: 1 },
|
|
76
76
|
modelMode: 'passive',
|
|
77
77
|
hookBus: 'none',
|
|
78
78
|
stateIO: 'session-log-append',
|
|
@@ -84,7 +84,7 @@ const PROFILE_BASELINES = Object.freeze({
|
|
|
84
84
|
'programmatic-cli': Object.freeze({
|
|
85
85
|
embeddingMode: 'imperative',
|
|
86
86
|
commandSurface: 'slash-file',
|
|
87
|
-
dispatch: Object.freeze({ namedDispatch: true, nested: true, maxDepth: -1, background: true, subagentToolkit: 'full', backgroundDispatch: true, isolation: 'none' }),
|
|
87
|
+
dispatch: Object.freeze({ namedDispatch: true, nested: true, maxDepth: -1, background: true, subagentToolkit: 'full', backgroundDispatch: true, isolation: 'none', maxConcurrency: 1 }),
|
|
88
88
|
modelMode: 'passive',
|
|
89
89
|
hookBus: 'host',
|
|
90
90
|
stateIO: 'filesystem',
|
|
@@ -95,7 +95,7 @@ const PROFILE_BASELINES = Object.freeze({
|
|
|
95
95
|
'declarative-cli': Object.freeze({
|
|
96
96
|
embeddingMode: 'declarative',
|
|
97
97
|
commandSurface: 'slash-file',
|
|
98
|
-
dispatch: Object.freeze({ namedDispatch: true, nested: false, maxDepth: 1, background: false, subagentToolkit: 'full', backgroundDispatch: false, isolation: 'none' }),
|
|
98
|
+
dispatch: Object.freeze({ namedDispatch: true, nested: false, maxDepth: 1, background: false, subagentToolkit: 'full', backgroundDispatch: false, isolation: 'none', maxConcurrency: 1 }),
|
|
99
99
|
modelMode: 'passive',
|
|
100
100
|
hookBus: 'host',
|
|
101
101
|
stateIO: 'filesystem',
|
|
@@ -106,7 +106,7 @@ const PROFILE_BASELINES = Object.freeze({
|
|
|
106
106
|
'ide': Object.freeze({
|
|
107
107
|
embeddingMode: 'imperative',
|
|
108
108
|
commandSurface: 'palette',
|
|
109
|
-
dispatch: Object.freeze({ namedDispatch: true, nested: true, maxDepth: 5, background: true, subagentToolkit: 'full', backgroundDispatch: true, isolation: 'none' }),
|
|
109
|
+
dispatch: Object.freeze({ namedDispatch: true, nested: true, maxDepth: 5, background: true, subagentToolkit: 'full', backgroundDispatch: true, isolation: 'none', maxConcurrency: 1 }),
|
|
110
110
|
modelMode: 'active',
|
|
111
111
|
hookBus: 'engine',
|
|
112
112
|
stateIO: 'sandboxed-storage',
|
|
@@ -235,7 +235,7 @@ const DEFAULT_ENGINE = {
|
|
|
235
235
|
axes: {
|
|
236
236
|
embeddingMode: 'imperative',
|
|
237
237
|
commandSurface: 'slash-file',
|
|
238
|
-
dispatch: { namedDispatch: true, nested: true, maxDepth: -1, background: true, subagentToolkit: 'full', backgroundDispatch: true, isolation: 'none' },
|
|
238
|
+
dispatch: { namedDispatch: true, nested: true, maxDepth: -1, background: true, subagentToolkit: 'full', backgroundDispatch: true, isolation: 'none', maxConcurrency: 1 },
|
|
239
239
|
modelMode: 'active',
|
|
240
240
|
hookBus: 'host',
|
|
241
241
|
stateIO: 'filesystem',
|
|
@@ -246,6 +246,19 @@ const DEFAULT_ENGINE = {
|
|
|
246
246
|
known: HOST_INTEGRATION_AXES,
|
|
247
247
|
};
|
|
248
248
|
// ---------------------------------------------------------------------------
|
|
249
|
+
// isPositiveSafeInteger — shared predicate (#3673)
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
/**
|
|
252
|
+
* True iff `v` is a positive (>0) JS safe integer. Single source of truth for
|
|
253
|
+
* the dispatch.maxConcurrency contract: used by negotiateHostCapabilities
|
|
254
|
+
* below, and by gsd-core/bin/gsd-tools.cjs's routeDispatchCapacity (which
|
|
255
|
+
* requires this module's compiled output rather than reimplementing the
|
|
256
|
+
* predicate), so the two consumers cannot silently diverge.
|
|
257
|
+
*/
|
|
258
|
+
function isPositiveSafeInteger(v) {
|
|
259
|
+
return typeof v === 'number' && Number.isSafeInteger(v) && v > 0;
|
|
260
|
+
}
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
249
262
|
// negotiateHostCapabilities
|
|
250
263
|
// ---------------------------------------------------------------------------
|
|
251
264
|
/**
|
|
@@ -335,6 +348,7 @@ function negotiateHostCapabilities(host, engine = DEFAULT_ENGINE) {
|
|
|
335
348
|
let effectiveSubagentToolkit;
|
|
336
349
|
let effectiveMaxDepth;
|
|
337
350
|
let effectiveIsolation;
|
|
351
|
+
let effectiveMaxConcurrency;
|
|
338
352
|
if (hostDispatch === null) {
|
|
339
353
|
// Host didn't declare dispatch at all — fail-closed to most-restrictive values
|
|
340
354
|
warnings.push(`host did not declare 'dispatch'`);
|
|
@@ -345,6 +359,7 @@ function negotiateHostCapabilities(host, engine = DEFAULT_ENGINE) {
|
|
|
345
359
|
effectiveSubagentToolkit = 'read-only';
|
|
346
360
|
effectiveMaxDepth = 0;
|
|
347
361
|
effectiveIsolation = 'none';
|
|
362
|
+
effectiveMaxConcurrency = 1;
|
|
348
363
|
}
|
|
349
364
|
else {
|
|
350
365
|
// N1: observability warnings for 'undocumented' sentinel on dispatch fields
|
|
@@ -408,6 +423,41 @@ function negotiateHostCapabilities(host, engine = DEFAULT_ENGINE) {
|
|
|
408
423
|
const eDepthNum = engineDispatch.maxDepth < 0 ? Infinity : engineDispatch.maxDepth;
|
|
409
424
|
const minDepth = Math.min(hDepthNum, eDepthNum);
|
|
410
425
|
effectiveMaxDepth = minDepth === Infinity ? -1 : minDepth;
|
|
426
|
+
// maxConcurrency (#3673, ADR-1239 Phase 1): a positive-safe-integer
|
|
427
|
+
// passthrough with a fail-closed floor of 1. UNLIKE maxDepth, there is no
|
|
428
|
+
// min(host, engine) reduction here — the design doc explicitly rejects an
|
|
429
|
+
// engine-side ceiling for this field (no competing intrinsic worker
|
|
430
|
+
// ceiling to cap against at the negotiation layer); a `--jobs N` cap is
|
|
431
|
+
// applied later, at the Phase 4 scheduler.
|
|
432
|
+
const hostMaxConcurrency = hostDispatch.maxConcurrency;
|
|
433
|
+
if (hostMaxConcurrency === UNDOCUMENTED) {
|
|
434
|
+
warnings.push(`dispatch.maxConcurrency is undocumented — degraded closed (1)`);
|
|
435
|
+
effectiveMaxConcurrency = 1;
|
|
436
|
+
}
|
|
437
|
+
else if (isPositiveSafeInteger(hostMaxConcurrency)) {
|
|
438
|
+
effectiveMaxConcurrency = hostMaxConcurrency;
|
|
439
|
+
}
|
|
440
|
+
else if (hostMaxConcurrency === undefined) {
|
|
441
|
+
warnings.push(`host did not declare 'dispatch.maxConcurrency' — treating as 1`);
|
|
442
|
+
effectiveMaxConcurrency = 1;
|
|
443
|
+
}
|
|
444
|
+
else if (typeof hostMaxConcurrency !== 'number') {
|
|
445
|
+
warnings.push(`host dispatch.maxConcurrency is not a number — treating as 1`);
|
|
446
|
+
effectiveMaxConcurrency = 1;
|
|
447
|
+
}
|
|
448
|
+
else if (!Number.isSafeInteger(hostMaxConcurrency)) {
|
|
449
|
+
if (Number.isInteger(hostMaxConcurrency)) {
|
|
450
|
+
warnings.push(`host dispatch.maxConcurrency is an unsafe integer — treating as 1`);
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
warnings.push(`host dispatch.maxConcurrency is not an integer — treating as 1`);
|
|
454
|
+
}
|
|
455
|
+
effectiveMaxConcurrency = 1;
|
|
456
|
+
}
|
|
457
|
+
else {
|
|
458
|
+
warnings.push(`host dispatch.maxConcurrency is non-positive — treating as 1`);
|
|
459
|
+
effectiveMaxConcurrency = 1;
|
|
460
|
+
}
|
|
411
461
|
// If namedDispatch is false, cap maxDepth/nested/background/backgroundDispatch to 0/false/false/false (struct consistency)
|
|
412
462
|
if (!effectiveNamedDispatch) {
|
|
413
463
|
effectiveMaxDepth = 0;
|
|
@@ -424,6 +474,7 @@ function negotiateHostCapabilities(host, engine = DEFAULT_ENGINE) {
|
|
|
424
474
|
subagentToolkit: effectiveSubagentToolkit,
|
|
425
475
|
backgroundDispatch: effectiveBackgroundDispatch,
|
|
426
476
|
isolation: effectiveIsolation,
|
|
477
|
+
maxConcurrency: effectiveMaxConcurrency,
|
|
427
478
|
};
|
|
428
479
|
// ---------------------------------------------------------------------------
|
|
429
480
|
// Assemble effective axes
|
|
@@ -753,6 +804,7 @@ module.exports = {
|
|
|
753
804
|
EXTENSION_EVENT_SURFACES,
|
|
754
805
|
degradationFor,
|
|
755
806
|
profileOf,
|
|
807
|
+
isPositiveSafeInteger,
|
|
756
808
|
negotiateHostCapabilities,
|
|
757
809
|
shouldFlattenDispatch,
|
|
758
810
|
resolveDispatchType,
|
|
@@ -158,6 +158,20 @@ function routeInitCommand({ init, args, cwd, raw, error }) {
|
|
|
158
158
|
full: namedArgs['full'],
|
|
159
159
|
});
|
|
160
160
|
},
|
|
161
|
+
// #3676 (Phase 4, epic #3344): `init.quick-batch` supplies model
|
|
162
|
+
// profiles/commit_docs/roadmap-existence/section_manifest — batch
|
|
163
|
+
// creation itself is the `quick-batch create` verb's job (wraps
|
|
164
|
+
// `createBatch`, src/quick-batch.cts). No free-text description to
|
|
165
|
+
// strip: `--research`/`--validate` are the only recognized flags
|
|
166
|
+
// (`--discuss`/`--full` are rejected upstream by `parseQuickBatchArgs`
|
|
167
|
+
// before this init bundle is ever reached).
|
|
168
|
+
'quick-batch': () => {
|
|
169
|
+
const namedArgs = (0, command_arg_projection_cjs_1.parseNamedArgsOrExit)(args, { booleanFlags: ['research', 'validate'], positionals: 2 }, error);
|
|
170
|
+
init.cmdInitQuickBatch(cwd, raw, {
|
|
171
|
+
research: namedArgs['research'],
|
|
172
|
+
validate: namedArgs['validate'],
|
|
173
|
+
});
|
|
174
|
+
},
|
|
161
175
|
'ingest-docs': () => init.cmdInitIngestDocs(cwd, raw),
|
|
162
176
|
resume: () => init.cmdInitResume(cwd, raw),
|
|
163
177
|
// ADR-3473 §8.4 / #3358 gap: these handlers read args[2] positionally
|