@opengsd/gsd-pi 1.2.0-dev.844675c9 → 1.2.0-dev.84c56d87
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/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli-web-branch.d.ts +2 -0
- package/dist/cli-web-branch.js +9 -2
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/help-text.js +5 -0
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +78 -23
- package/dist/resources/extensions/bg-shell/utilities.js +5 -2
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +122 -234
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
- package/dist/resources/extensions/github-sync/templates.js +3 -3
- package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
- package/dist/resources/extensions/gsd/auto/loop.js +74 -56
- package/dist/resources/extensions/gsd/auto/orchestrator.js +142 -15
- package/dist/resources/extensions/gsd/auto/phases.js +34 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
- package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
- package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +23 -11
- package/dist/resources/extensions/gsd/auto-prompts.js +84 -8
- package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
- package/dist/resources/extensions/gsd/auto-runtime-state.js +14 -0
- package/dist/resources/extensions/gsd/auto-start.js +24 -37
- package/dist/resources/extensions/gsd/auto-timers.js +16 -2
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +11 -45
- package/dist/resources/extensions/gsd/auto-verification.js +7 -7
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +53 -368
- package/dist/resources/extensions/gsd/auto.js +19 -27
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +20 -43
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +209 -149
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +93 -8
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +5 -15
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
- package/dist/resources/extensions/gsd/closeout-recovery.js +3 -2
- package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
- package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
- package/dist/resources/extensions/gsd/commands-ship.js +2 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +372 -0
- package/dist/resources/extensions/gsd/db/sql-constants.js +11 -0
- package/dist/resources/extensions/gsd/db/writers/cascades.js +194 -0
- package/dist/resources/extensions/gsd/db/writers/import-restore.js +182 -0
- package/dist/resources/extensions/gsd/db/writers/memory.js +149 -0
- package/dist/resources/extensions/gsd/db/writers/reconcile.js +458 -0
- package/dist/resources/extensions/gsd/db/writers/status.js +70 -0
- package/dist/resources/extensions/gsd/db-workspace.js +103 -0
- package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
- package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +5 -11
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -3
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/doctor.js +16 -9
- package/dist/resources/extensions/gsd/error-classifier.js +10 -1
- package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
- package/dist/resources/extensions/gsd/git-service.js +1 -0
- package/dist/resources/extensions/gsd/gitignore.js +3 -0
- package/dist/resources/extensions/gsd/gsd-db.js +183 -2048
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +83 -471
- package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -1
- package/dist/resources/extensions/gsd/mcp-filter.js +4 -20
- package/dist/resources/extensions/gsd/mcp-tool-name.js +18 -0
- package/dist/resources/extensions/gsd/md-importer.js +4 -3
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +22 -11
- package/dist/resources/extensions/gsd/migration-auto-check.js +27 -5
- package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
- package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
- package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
- package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
- package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
- package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
- package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
- package/dist/resources/extensions/gsd/model-router.js +3 -0
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
- package/dist/resources/extensions/gsd/parallel-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/paths.js +37 -24
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
- package/dist/resources/extensions/gsd/preferences-models.js +12 -46
- package/dist/resources/extensions/gsd/preferences.js +161 -29
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
- package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
- package/dist/resources/extensions/gsd/question-transport.js +86 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +37 -4
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +7 -2
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +10 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +14 -25
- package/dist/resources/extensions/gsd/status-guards.js +56 -8
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/templates/plan.md +7 -0
- package/dist/resources/extensions/gsd/templates/project.md +1 -0
- package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/dist/resources/extensions/gsd/templates/uat.md +5 -1
- package/dist/resources/extensions/gsd/tool-contract.js +52 -8
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +24 -43
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
- package/dist/resources/extensions/gsd/uat-policy.js +17 -10
- package/dist/resources/extensions/gsd/uat-run.js +9 -14
- package/dist/resources/extensions/gsd/undo.js +8 -7
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +49 -21
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -181
- package/dist/resources/extensions/gsd/user-input-boundary.js +23 -0
- package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
- package/dist/resources/extensions/gsd/web-app-uat.js +117 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
- package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
- package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +9 -1
- package/dist/resources/extensions/gsd/worktree-manager.js +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
- package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +72 -4
- package/dist/resources/extensions/shared/interview-ui.js +2 -2
- package/dist/resources/shared/claude-runtime-floor.js +182 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-cmd.js +20 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/{5047.js → 5942.js} +2 -2
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
- package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/web-mode.d.ts +2 -0
- package/dist/web-mode.js +20 -8
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +2 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts +10 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +8 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +49 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +48 -22
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +455 -546
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +481 -599
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +3 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/components/input.js +1 -1
- package/packages/pi-tui/dist/components/input.js.map +1 -1
- package/packages/pi-tui/dist/keys.d.ts.map +1 -1
- package/packages/pi-tui/dist/keys.js +39 -30
- package/packages/pi-tui/dist/keys.js.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
- package/packages/pi-tui/dist/stdin-buffer.js +22 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +87 -24
- package/src/resources/extensions/bg-shell/utilities.ts +5 -2
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +148 -285
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +268 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
- package/src/resources/extensions/github-sync/templates.ts +3 -3
- package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
- package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +32 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -1
- package/src/resources/extensions/gsd/auto/loop.ts +83 -61
- package/src/resources/extensions/gsd/auto/orchestrator.ts +164 -17
- package/src/resources/extensions/gsd/auto/phases.ts +45 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
- package/src/resources/extensions/gsd/auto/session.ts +4 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
- package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
- package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +29 -10
- package/src/resources/extensions/gsd/auto-prompts.ts +110 -9
- package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +26 -0
- package/src/resources/extensions/gsd/auto-start.ts +29 -35
- package/src/resources/extensions/gsd/auto-timers.ts +16 -2
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +54 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +19 -47
- package/src/resources/extensions/gsd/auto-verification.ts +7 -8
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +68 -384
- package/src/resources/extensions/gsd/auto.ts +35 -32
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +20 -43
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +251 -161
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +136 -6
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +5 -16
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
- package/src/resources/extensions/gsd/closeout-recovery.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
- package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
- package/src/resources/extensions/gsd/commands-ship.ts +2 -2
- package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +453 -0
- package/src/resources/extensions/gsd/db/sql-constants.ts +12 -0
- package/src/resources/extensions/gsd/db/writers/cascades.ts +237 -0
- package/src/resources/extensions/gsd/db/writers/import-restore.ts +310 -0
- package/src/resources/extensions/gsd/db/writers/memory.ts +220 -0
- package/src/resources/extensions/gsd/db/writers/reconcile.ts +500 -0
- package/src/resources/extensions/gsd/db/writers/status.ts +88 -0
- package/src/resources/extensions/gsd/db-workspace.ts +170 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
- package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +5 -13
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +3 -3
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/doctor.ts +15 -5
- package/src/resources/extensions/gsd/error-classifier.ts +12 -1
- package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
- package/src/resources/extensions/gsd/git-service.ts +1 -0
- package/src/resources/extensions/gsd/gitignore.ts +3 -0
- package/src/resources/extensions/gsd/gsd-db.ts +185 -2373
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +95 -561
- package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +2 -1
- package/src/resources/extensions/gsd/mcp-filter.ts +4 -24
- package/src/resources/extensions/gsd/mcp-tool-name.ts +30 -0
- package/src/resources/extensions/gsd/md-importer.ts +3 -3
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +20 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +30 -5
- package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
- package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
- package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
- package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
- package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
- package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
- package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
- package/src/resources/extensions/gsd/model-router.ts +3 -0
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
- package/src/resources/extensions/gsd/parallel-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/paths.ts +42 -22
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
- package/src/resources/extensions/gsd/preferences-models.ts +10 -46
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences.ts +191 -28
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +3 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
- package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
- package/src/resources/extensions/gsd/question-transport.ts +138 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +36 -4
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +7 -2
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +14 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +19 -26
- package/src/resources/extensions/gsd/status-guards.ts +59 -8
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/templates/plan.md +7 -0
- package/src/resources/extensions/gsd/templates/project.md +1 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
- package/src/resources/extensions/gsd/templates/uat.md +5 -1
- package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +444 -5
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +133 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +46 -8
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
- package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +58 -15
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +74 -59
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +143 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/recovery-classification-illegal-transition.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +342 -1
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/session-switch-clears-pending-autostart.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -6
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +70 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +86 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +128 -11
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +43 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +12 -6
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +121 -0
- package/src/resources/extensions/gsd/tool-contract.ts +86 -8
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +23 -58
- package/src/resources/extensions/gsd/tools/exec-tool.ts +5 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
- package/src/resources/extensions/gsd/uat-policy.ts +20 -10
- package/src/resources/extensions/gsd/uat-run.ts +10 -14
- package/src/resources/extensions/gsd/undo.ts +9 -8
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +97 -21
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -191
- package/src/resources/extensions/gsd/user-input-boundary.ts +18 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
- package/src/resources/extensions/gsd/web-app-uat.ts +144 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
- package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +76 -0
- package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +17 -17
- package/src/resources/extensions/gsd/worktree-manager.ts +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
- package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +88 -4
- package/src/resources/extensions/shared/interview-ui.ts +15 -2
- package/src/resources/shared/claude-runtime-floor.ts +248 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
- package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
- package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
- package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
- package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Qbr81pQ-pbQXP4bq2VXLv → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Central UAT mode policy for dispatch, tool presentation, and result validation.
|
|
3
3
|
|
|
4
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
4
5
|
import { extractUatType } from "./files.js";
|
|
5
6
|
import type { UatType } from "./files.js";
|
|
6
7
|
import { hasBrowserRequiredText } from "./browser-evidence.js";
|
|
8
|
+
import { parseMcpToolName } from "./mcp-tool-name.js";
|
|
7
9
|
|
|
8
10
|
export type { UatType } from "./files.js";
|
|
9
11
|
|
|
@@ -122,31 +124,39 @@ export function uatTypeIncludesBrowser(uatType: string | undefined): boolean {
|
|
|
122
124
|
return isUatType(uatType) && UAT_MODE_POLICIES[uatType].browserTools;
|
|
123
125
|
}
|
|
124
126
|
|
|
125
|
-
function canonicalPresentedToolName(toolName: string): string {
|
|
126
|
-
if (!toolName.startsWith("mcp__")) return toolName;
|
|
127
|
-
const toolSeparator = toolName.indexOf("__", "mcp__".length);
|
|
128
|
-
return toolSeparator >= 0 ? toolName.slice(toolSeparator + 2) : toolName;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
127
|
export function isUatBrowserToolName(toolName: string): boolean {
|
|
132
|
-
|
|
128
|
+
const parsed = parseMcpToolName(toolName);
|
|
129
|
+
const canonicalName = parsed?.toolName ?? toolName;
|
|
130
|
+
if (hasBrowserContractPrefix(canonicalName)) return true;
|
|
131
|
+
return parsed?.toolName === "*" && parsed.serverName.toLowerCase().includes("browser");
|
|
133
132
|
}
|
|
134
133
|
|
|
135
134
|
export function hasUatBrowserToolSurface(activeTools: readonly string[] | undefined): boolean {
|
|
136
135
|
return Array.isArray(activeTools) && activeTools.some(isUatBrowserToolName);
|
|
137
136
|
}
|
|
138
137
|
|
|
138
|
+
export function resolveUatBrowserToolSurface(options: {
|
|
139
|
+
activeTools: readonly string[] | undefined;
|
|
140
|
+
registeredTools?: readonly string[] | undefined;
|
|
141
|
+
}): readonly string[] | undefined {
|
|
142
|
+
const surfaces = [options.activeTools, options.registeredTools].filter(Array.isArray);
|
|
143
|
+
if (surfaces.length === 0) return undefined;
|
|
144
|
+
return [...new Set(surfaces.flat())];
|
|
145
|
+
}
|
|
146
|
+
|
|
139
147
|
export function getUatBrowserToolSupportError(options: {
|
|
140
148
|
uatType: UatType;
|
|
141
149
|
activeTools: readonly string[] | undefined;
|
|
150
|
+
registeredTools?: readonly string[] | undefined;
|
|
142
151
|
milestoneId: string;
|
|
143
152
|
sliceId: string;
|
|
144
153
|
}): string | null {
|
|
145
154
|
if (!uatTypeIncludesBrowser(options.uatType)) return null;
|
|
146
|
-
|
|
147
|
-
if (
|
|
155
|
+
const toolSurface = resolveUatBrowserToolSurface(options);
|
|
156
|
+
if (!toolSurface) return null;
|
|
157
|
+
if (hasUatBrowserToolSurface(toolSurface)) return null;
|
|
148
158
|
|
|
149
|
-
return `Cannot dispatch browser-backed run-uat for ${options.milestoneId}/${options.sliceId}: UAT mode "${options.uatType}" requires browser tools, but the
|
|
159
|
+
return `Cannot dispatch browser-backed run-uat for ${options.milestoneId}/${options.sliceId}: UAT mode "${options.uatType}" requires browser tools, but the run-uat tool surface has none. Enable browser tools or change the UAT to a runtime-executable Playwright command, then rerun /gsd auto.`;
|
|
150
160
|
}
|
|
151
161
|
|
|
152
162
|
export function isPartialEligibleUatType(uatType: UatType | undefined): boolean {
|
|
@@ -103,7 +103,7 @@ function mergeBlockedTools(
|
|
|
103
103
|
): UatPresentationInput["blockedTools"] {
|
|
104
104
|
const merged = new Map<string, { name: string; reason: string }>();
|
|
105
105
|
for (const entry of [...(current ?? []), ...canonical]) {
|
|
106
|
-
merged.set(canonicalWorkflowToolName(parseMcpToolName(entry.name)?.
|
|
106
|
+
merged.set(canonicalWorkflowToolName(parseMcpToolName(entry.name)?.toolName ?? entry.name), entry);
|
|
107
107
|
}
|
|
108
108
|
return [...merged.values()];
|
|
109
109
|
}
|
|
@@ -299,22 +299,18 @@ function quoteToolNames(toolNames: readonly string[]): string {
|
|
|
299
299
|
}
|
|
300
300
|
|
|
301
301
|
function validateCanonicalPresentation(params: UatResultSaveParams): string | null {
|
|
302
|
-
const aliasHints: Record<string, string> = {
|
|
303
|
-
gsd_save_summary: "gsd_summary_save",
|
|
304
|
-
gsd_complete_task: "gsd_task_complete",
|
|
305
|
-
gsd_complete_slice: "gsd_slice_complete",
|
|
306
|
-
gsd_milestone_complete: "gsd_complete_milestone",
|
|
307
|
-
};
|
|
308
302
|
const errors: string[] = [];
|
|
309
303
|
for (const toolName of params.presentation.presentedTools) {
|
|
310
|
-
const baseName = parseMcpToolName(toolName)?.
|
|
311
|
-
const canonical =
|
|
312
|
-
if (canonical
|
|
304
|
+
const baseName = parseMcpToolName(toolName)?.toolName ?? toolName;
|
|
305
|
+
const canonical = canonicalWorkflowToolName(baseName);
|
|
306
|
+
if (canonical !== baseName) {
|
|
307
|
+
errors.push(`presentation tool "${toolName}" uses an alias; use canonical "${canonical}"`);
|
|
308
|
+
}
|
|
313
309
|
}
|
|
314
310
|
|
|
315
311
|
const presentedCanonical = new Set(
|
|
316
312
|
params.presentation.presentedTools.map((toolName) =>
|
|
317
|
-
canonicalWorkflowToolName(parseMcpToolName(toolName)?.
|
|
313
|
+
canonicalWorkflowToolName(parseMcpToolName(toolName)?.toolName ?? toolName)
|
|
318
314
|
),
|
|
319
315
|
);
|
|
320
316
|
const missingRequiredTools = RUN_UAT_WORKFLOW_TOOL_NAMES.filter(
|
|
@@ -329,11 +325,11 @@ function validateCanonicalPresentation(params: UatResultSaveParams): string | nu
|
|
|
329
325
|
const forbiddenCanonical = new Set(
|
|
330
326
|
RUN_UAT_FORBIDDEN_TOOL_NAMES
|
|
331
327
|
.filter((toolName) => !toolName.includes("*"))
|
|
332
|
-
.map((toolName) => canonicalWorkflowToolName(parseMcpToolName(toolName)?.
|
|
328
|
+
.map((toolName) => canonicalWorkflowToolName(parseMcpToolName(toolName)?.toolName ?? toolName)),
|
|
333
329
|
);
|
|
334
330
|
const forbiddenPresentedTools: string[] = [];
|
|
335
331
|
for (const toolName of params.presentation.presentedTools) {
|
|
336
|
-
const canonical = canonicalWorkflowToolName(parseMcpToolName(toolName)?.
|
|
332
|
+
const canonical = canonicalWorkflowToolName(parseMcpToolName(toolName)?.toolName ?? toolName);
|
|
337
333
|
if (toolName === "mcp__gsd-workflow__*" || forbiddenCanonical.has(canonical)) {
|
|
338
334
|
forbiddenPresentedTools.push(toolName);
|
|
339
335
|
}
|
|
@@ -346,7 +342,7 @@ function validateCanonicalPresentation(params: UatResultSaveParams): string | nu
|
|
|
346
342
|
|
|
347
343
|
const blockedCanonical = new Set(
|
|
348
344
|
params.presentation.blockedTools.map((entry) =>
|
|
349
|
-
canonicalWorkflowToolName(parseMcpToolName(entry.name)?.
|
|
345
|
+
canonicalWorkflowToolName(parseMcpToolName(entry.name)?.toolName ?? entry.name)
|
|
350
346
|
),
|
|
351
347
|
);
|
|
352
348
|
const missingBlockedTools = ["gsd_exec", "gsd_summary_save", "gsd_save_gate_result"].filter(
|
|
@@ -13,7 +13,7 @@ import { deriveState } from "./state.js";
|
|
|
13
13
|
import { invalidateAllCaches } from "./cache.js";
|
|
14
14
|
import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveTaskFile, buildTaskFileName, buildSliceFileName } from "./paths.js";
|
|
15
15
|
import { sendDesktopNotification } from "./notifications.js";
|
|
16
|
-
import { getTask, getSlice, getSliceTasks, updateTaskStatus,
|
|
16
|
+
import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
|
|
17
17
|
import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -330,12 +330,16 @@ export async function handleResetSlice(
|
|
|
330
330
|
return;
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
// Reset all
|
|
334
|
-
|
|
333
|
+
// Reset all task statuses to "pending" and the slice to "active" in one
|
|
334
|
+
// atomic commit (DB is source of truth). Previously a per-task updateTaskStatus
|
|
335
|
+
// loop + a separate updateSliceStatus, which could leave a partial reset if
|
|
336
|
+
// interrupted mid-loop.
|
|
337
|
+
resetSliceCascade(mid, sid);
|
|
338
|
+
|
|
339
|
+
// Delete task summary files — projection cleanup, separate from the DB reset.
|
|
340
|
+
const tasksReset = tasks.length;
|
|
335
341
|
let summariesDeleted = 0;
|
|
336
342
|
for (const t of tasks) {
|
|
337
|
-
updateTaskStatus(mid, sid, t.id, "pending");
|
|
338
|
-
tasksReset++;
|
|
339
343
|
const summaryPath = resolveTaskFile(basePath, mid, sid, t.id, "SUMMARY");
|
|
340
344
|
if (summaryPath && existsSync(summaryPath)) {
|
|
341
345
|
unlinkSync(summaryPath);
|
|
@@ -343,9 +347,6 @@ export async function handleResetSlice(
|
|
|
343
347
|
}
|
|
344
348
|
}
|
|
345
349
|
|
|
346
|
-
// Reset slice status
|
|
347
|
-
updateSliceStatus(mid, sid, "active");
|
|
348
|
-
|
|
349
350
|
// Delete slice summary and UAT files
|
|
350
351
|
let sliceFilesDeleted = 0;
|
|
351
352
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Unit Closeout module — durable completion pipeline behind one seam (ADR-032).
|
|
3
|
+
//
|
|
4
|
+
// `closeUnit` owns what makes a Unit's completion durable. This pass ships the
|
|
5
|
+
// **Interactive Closeout adapter** path: commit the work and compute the
|
|
6
|
+
// Closeout Git Verdict, failing closed (loudly) instead of silently when a
|
|
7
|
+
// non-`none` `git.isolation` preference was never honoured by the session.
|
|
8
|
+
// Motivating failure (2026-06-10): an interactive session under
|
|
9
|
+
// `git.isolation: worktree` completed a milestone with every source file
|
|
10
|
+
// untracked on the integration branch — no commit, no merge, no warning.
|
|
11
|
+
//
|
|
12
|
+
// The interactive adapter only fires on milestone boundaries — the durability
|
|
13
|
+
// gap is the milestone close, and committing at every task/slice would sweep a
|
|
14
|
+
// developer's unrelated working-tree changes. `closeUnit` itself stays general
|
|
15
|
+
// over all boundaries for the pending Auto Closeout adapter re-seat.
|
|
16
|
+
//
|
|
17
|
+
// The auto loop keeps its existing closeout pipeline for now (the Auto
|
|
18
|
+
// Closeout adapter re-seat is the documented next step in ADR-032); the
|
|
19
|
+
// interactive trigger in bootstrap/register-hooks.ts is a no-op while
|
|
20
|
+
// `isAutoActive()`, so auto-mode behaviour is untouched.
|
|
21
|
+
//
|
|
22
|
+
// Re-entrancy is naturally safe: a re-fired completion commits an already-clean
|
|
23
|
+
// tree, which yields `nothing-to-commit`, and `appendNotification` carries its
|
|
24
|
+
// own dedup window — so `closeUnit` keeps no result cache of its own.
|
|
25
|
+
|
|
26
|
+
import { appendNotification, type NotifySeverity } from "./notification-store.js";
|
|
27
|
+
import { readStringField } from "./auto-unit-tool-scope.js";
|
|
28
|
+
import { MILESTONE_BRANCH_PREFIX } from "./branch-patterns.js";
|
|
29
|
+
import { nativeGetCurrentBranch } from "./native-git-bridge.js";
|
|
30
|
+
import { getIsolationMode } from "./preferences.js";
|
|
31
|
+
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
32
|
+
import { logWarning } from "./workflow-logger.js";
|
|
33
|
+
|
|
34
|
+
export type CloseoutBoundary = "task" | "slice" | "milestone";
|
|
35
|
+
export type CloseoutOutcome = "complete" | "failed" | "skipped";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* What git state the closeout found and did.
|
|
39
|
+
*
|
|
40
|
+
* - `committed` — work committed on the current branch (expected under
|
|
41
|
+
* `isolation: none`, and for task/slice boundaries).
|
|
42
|
+
* - `nothing-to-commit` — working tree was already clean.
|
|
43
|
+
* - `milestone-branch` — milestone boundary closed on a `milestone/<MID>`
|
|
44
|
+
* branch; the merge stays owned by worktree tooling.
|
|
45
|
+
* - `isolation-bypassed` — milestone boundary closed outside a milestone
|
|
46
|
+
* worktree/branch while `git.isolation` is
|
|
47
|
+
* `worktree`/`branch`: committed where the work sits
|
|
48
|
+
* and surfaced a Needs Attention notice instead of
|
|
49
|
+
* completing silently.
|
|
50
|
+
* - `commit-failed` — the commit attempt threw; surfaced, never thrown.
|
|
51
|
+
*/
|
|
52
|
+
export type CloseoutGitVerdict =
|
|
53
|
+
| "committed"
|
|
54
|
+
| "nothing-to-commit"
|
|
55
|
+
| "milestone-branch"
|
|
56
|
+
| "isolation-bypassed"
|
|
57
|
+
| "commit-failed";
|
|
58
|
+
|
|
59
|
+
export interface UnitCloseoutRequest {
|
|
60
|
+
basePath: string;
|
|
61
|
+
unitType: string;
|
|
62
|
+
/** "M001" | "M001/S01" | "M001/S01/T01" */
|
|
63
|
+
unitId: string;
|
|
64
|
+
boundary: CloseoutBoundary;
|
|
65
|
+
outcome: CloseoutOutcome;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface UnitCloseoutResult {
|
|
69
|
+
gitVerdict: CloseoutGitVerdict;
|
|
70
|
+
commitMessage: string | null;
|
|
71
|
+
/** The user-facing Needs Attention / status notice, when one was emitted. */
|
|
72
|
+
notice?: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Seam for tests; production callers use the defaults. */
|
|
76
|
+
export interface UnitCloseoutDeps {
|
|
77
|
+
isolationMode(basePath: string): "none" | "worktree" | "branch";
|
|
78
|
+
currentBranch(basePath: string): string | null;
|
|
79
|
+
commit(basePath: string, unitType: string, unitId: string): string | null;
|
|
80
|
+
notify(message: string, severity: NotifySeverity): void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const defaultDeps: UnitCloseoutDeps = {
|
|
84
|
+
isolationMode: (basePath) => getIsolationMode(basePath),
|
|
85
|
+
currentBranch: (basePath) => {
|
|
86
|
+
try {
|
|
87
|
+
return nativeGetCurrentBranch(basePath);
|
|
88
|
+
} catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
commit: (basePath, unitType, unitId) => autoCommitCurrentBranch(basePath, unitType, unitId),
|
|
93
|
+
notify: (message, severity) => appendNotification(message, severity),
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export function closeUnit(request: UnitCloseoutRequest, deps: UnitCloseoutDeps = defaultDeps): UnitCloseoutResult {
|
|
97
|
+
let commitMessage: string | null = null;
|
|
98
|
+
let gitVerdict: CloseoutGitVerdict;
|
|
99
|
+
let notice: string | undefined;
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
commitMessage = deps.commit(request.basePath, request.unitType, request.unitId);
|
|
103
|
+
gitVerdict = commitMessage === null ? "nothing-to-commit" : "committed";
|
|
104
|
+
} catch (err) {
|
|
105
|
+
gitVerdict = "commit-failed";
|
|
106
|
+
notice = `Unit closeout commit failed for ${request.unitId}: ${err instanceof Error ? err.message : String(err)}`;
|
|
107
|
+
logWarning("engine", notice);
|
|
108
|
+
deps.notify(notice, "error");
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (request.boundary === "milestone" && gitVerdict !== "commit-failed") {
|
|
112
|
+
const isolation = deps.isolationMode(request.basePath);
|
|
113
|
+
if (isolation !== "none") {
|
|
114
|
+
const branch = deps.currentBranch(request.basePath);
|
|
115
|
+
if (branch?.startsWith(MILESTONE_BRANCH_PREFIX)) {
|
|
116
|
+
gitVerdict = "milestone-branch";
|
|
117
|
+
notice =
|
|
118
|
+
`Milestone ${request.unitId} completed on ${branch}. ` +
|
|
119
|
+
`Merge it to the integration branch with the worktree tooling (/gsd worktree merge).`;
|
|
120
|
+
deps.notify(notice, "info");
|
|
121
|
+
} else {
|
|
122
|
+
gitVerdict = "isolation-bypassed";
|
|
123
|
+
notice =
|
|
124
|
+
`Needs attention: milestone ${request.unitId} completed outside a milestone worktree/branch ` +
|
|
125
|
+
`while git.isolation is "${isolation}" — the isolation preference was not honoured this session. ` +
|
|
126
|
+
(commitMessage
|
|
127
|
+
? `Work was committed directly on "${branch ?? "the current branch"}".`
|
|
128
|
+
: `The working tree had nothing left to commit on "${branch ?? "the current branch"}".`);
|
|
129
|
+
logWarning("engine", notice);
|
|
130
|
+
deps.notify(notice, "warning");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return { gitVerdict, commitMessage, notice };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ─── Interactive Closeout adapter (tool-observation trigger) ─────────────
|
|
139
|
+
|
|
140
|
+
// Canonical closeout tool → boundary. Aliases are canonicalized by the hook.
|
|
141
|
+
// Only the milestone boundary is wired interactively: it is the durability gap
|
|
142
|
+
// that motivated ADR-032, and committing at every task/slice would sweep a
|
|
143
|
+
// developer's unrelated working-tree changes. `closeUnit` still handles every
|
|
144
|
+
// boundary for the pending Auto Closeout adapter re-seat.
|
|
145
|
+
const CLOSEOUT_TOOL_BOUNDARIES: Record<string, CloseoutBoundary> = {
|
|
146
|
+
gsd_complete_milestone: "milestone",
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// Commit attribution uses the canonical unit types so interactive closeout
|
|
150
|
+
// commits carry the same GSD-Unit evidence trailers the verification prompts
|
|
151
|
+
// look for.
|
|
152
|
+
const BOUNDARY_UNIT_TYPES: Record<CloseoutBoundary, string> = {
|
|
153
|
+
task: "execute-task",
|
|
154
|
+
slice: "complete-slice",
|
|
155
|
+
milestone: "complete-milestone",
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
export function isUnitCloseoutTool(canonicalToolName: string): boolean {
|
|
159
|
+
return canonicalToolName in CLOSEOUT_TOOL_BOUNDARIES;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function readId(input: unknown, camel: string, snake: string): string | undefined {
|
|
163
|
+
const value = readStringField(input, camel, snake);
|
|
164
|
+
return value && value.length > 0 ? value : undefined;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Interactive Closeout adapter entry, called from the host's tool-observation
|
|
169
|
+
* hook for successful closeout tool calls when auto-mode is NOT active.
|
|
170
|
+
* Returns null when the tool input doesn't identify a unit.
|
|
171
|
+
*/
|
|
172
|
+
export function runInteractiveUnitCloseout(
|
|
173
|
+
args: { basePath: string; canonicalToolName: string; input: unknown },
|
|
174
|
+
deps: UnitCloseoutDeps = defaultDeps,
|
|
175
|
+
): UnitCloseoutResult | null {
|
|
176
|
+
const boundary = CLOSEOUT_TOOL_BOUNDARIES[args.canonicalToolName];
|
|
177
|
+
if (!boundary) return null;
|
|
178
|
+
|
|
179
|
+
const milestoneId = readId(args.input, "milestoneId", "milestone_id");
|
|
180
|
+
if (!milestoneId) return null;
|
|
181
|
+
const sliceId = readId(args.input, "sliceId", "slice_id");
|
|
182
|
+
const taskId = readId(args.input, "taskId", "task_id");
|
|
183
|
+
|
|
184
|
+
let unitId = milestoneId;
|
|
185
|
+
if (boundary !== "milestone") {
|
|
186
|
+
if (!sliceId) return null;
|
|
187
|
+
unitId = boundary === "slice" ? `${milestoneId}/${sliceId}` : `${milestoneId}/${sliceId}/${taskId ?? ""}`;
|
|
188
|
+
if (boundary === "task" && !taskId) return null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return closeUnit(
|
|
192
|
+
{
|
|
193
|
+
basePath: args.basePath,
|
|
194
|
+
unitType: BOUNDARY_UNIT_TYPES[boundary],
|
|
195
|
+
unitId,
|
|
196
|
+
boundary,
|
|
197
|
+
outcome: "complete",
|
|
198
|
+
},
|
|
199
|
+
deps,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
type ContextModePolicy,
|
|
46
46
|
type UnitContextManifest,
|
|
47
47
|
} from "./unit-context-manifest.js";
|
|
48
|
+
import type { UnitPromptContextContract } from "./tool-contract.js";
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
51
|
* Async function mapping an artifact key to its inlined-content string,
|
|
@@ -132,6 +133,16 @@ const CONTEXT_MODE_GUIDANCE_BY_LANE: Record<Exclude<ContextModePolicy, "none">,
|
|
|
132
133
|
"Use `gsd_resume` for prior context, `gsd_exec_search` for saved evidence, and `gsd_exec` for noisy doc validation commands.",
|
|
133
134
|
};
|
|
134
135
|
|
|
136
|
+
// Per-unit overrides win over the lane default. run-uat's tool contract
|
|
137
|
+
// forbids `gsd_exec`/`gsd_exec_search` (acceptance evidence must flow through
|
|
138
|
+
// `gsd_uat_exec`) and Claude Code dispatch strips the tools entirely, so the
|
|
139
|
+
// shared verification-lane guidance would steer the agent into calling an
|
|
140
|
+
// unavailable tool.
|
|
141
|
+
const CONTEXT_MODE_GUIDANCE_BY_UNIT: Record<string, string> = {
|
|
142
|
+
"run-uat":
|
|
143
|
+
"Use `gsd_uat_exec` for acceptance checks so evidence is typed as UAT-owned, and `gsd_resume` after compaction or resume.",
|
|
144
|
+
};
|
|
145
|
+
|
|
135
146
|
/**
|
|
136
147
|
* Render the Context Mode instruction lane for a unit type. Unknown unit
|
|
137
148
|
* types, disabled config, and explicit `contextMode: "none"` all omit the
|
|
@@ -146,7 +157,8 @@ export function composeContextModeInstructions(
|
|
|
146
157
|
if (!manifest || manifest.contextMode === "none") return "";
|
|
147
158
|
|
|
148
159
|
const lane = CONTEXT_MODE_LANE_LABELS[manifest.contextMode];
|
|
149
|
-
const guidance =
|
|
160
|
+
const guidance =
|
|
161
|
+
CONTEXT_MODE_GUIDANCE_BY_UNIT[unitType] ?? CONTEXT_MODE_GUIDANCE_BY_LANE[manifest.contextMode];
|
|
150
162
|
if (opts.renderMode === "nested") {
|
|
151
163
|
return `Context Mode (${lane} lane): ${guidance}`;
|
|
152
164
|
}
|
|
@@ -195,8 +207,32 @@ export interface ComposedUnitContext {
|
|
|
195
207
|
readonly inline: string;
|
|
196
208
|
}
|
|
197
209
|
|
|
210
|
+
export type UnitContextBlockMode = "prepend" | "inline" | "excerpt" | "computed";
|
|
211
|
+
|
|
212
|
+
export interface ComposedUnitContextBlock {
|
|
213
|
+
readonly key: string;
|
|
214
|
+
readonly mode: UnitContextBlockMode;
|
|
215
|
+
readonly body: string;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export interface ComposedContractedUnitContext extends ComposedUnitContext {
|
|
219
|
+
readonly blocks: readonly ComposedUnitContextBlock[];
|
|
220
|
+
readonly onDemand: readonly ArtifactKey[];
|
|
221
|
+
}
|
|
222
|
+
|
|
198
223
|
const SECTION_SEPARATOR = "\n\n---\n\n";
|
|
199
224
|
|
|
225
|
+
interface UnitContextCompositionContract {
|
|
226
|
+
readonly unitType: string;
|
|
227
|
+
readonly artifacts: {
|
|
228
|
+
readonly inline: readonly ArtifactKey[];
|
|
229
|
+
readonly excerpt: readonly ArtifactKey[];
|
|
230
|
+
readonly onDemand: readonly ArtifactKey[];
|
|
231
|
+
readonly computed: readonly ComputedArtifactId[];
|
|
232
|
+
readonly prepend: readonly ComputedArtifactId[];
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
200
236
|
/**
|
|
201
237
|
* Compose all manifest-declared context for a unit type using the v2
|
|
202
238
|
* surface. Walks `prepend` first (computed-only), then the `inline` list
|
|
@@ -220,36 +256,73 @@ export async function composeUnitContext(
|
|
|
220
256
|
const manifest: UnitContextManifest | null = resolveManifest(unitType);
|
|
221
257
|
if (!manifest) return { prepend: "", inline: "" };
|
|
222
258
|
|
|
223
|
-
|
|
259
|
+
const composed = await composeDeclaredUnitContext({
|
|
260
|
+
unitType,
|
|
261
|
+
artifacts: {
|
|
262
|
+
inline: manifest.artifacts.inline,
|
|
263
|
+
excerpt: manifest.artifacts.excerpt,
|
|
264
|
+
onDemand: manifest.artifacts.onDemand,
|
|
265
|
+
computed: manifest.artifacts.computed ?? [],
|
|
266
|
+
prepend: manifest.prepend ?? [],
|
|
267
|
+
},
|
|
268
|
+
}, opts);
|
|
269
|
+
return {
|
|
270
|
+
prepend: composed.prepend,
|
|
271
|
+
inline: composed.inline,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export async function composeContractedUnitContext(
|
|
276
|
+
contract: UnitPromptContextContract,
|
|
277
|
+
opts: ComposeUnitContextOptions,
|
|
278
|
+
): Promise<ComposedContractedUnitContext> {
|
|
279
|
+
return composeDeclaredUnitContext(contract, opts);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async function composeDeclaredUnitContext(
|
|
283
|
+
contract: UnitContextCompositionContract,
|
|
284
|
+
opts: ComposeUnitContextOptions,
|
|
285
|
+
): Promise<ComposedContractedUnitContext> {
|
|
286
|
+
// Single-source `unitType`: contract/manifest selection comes from the
|
|
224
287
|
// function arg, but computed builders read it from `base.unitType`.
|
|
225
|
-
//
|
|
226
|
-
// but a different one in opts.base), the composer would silently
|
|
227
|
-
// mix one unit's manifest with another unit's computed context.
|
|
228
|
-
// Normalize here so the composer dispatches a consistent identity
|
|
229
|
-
// through to every builder.
|
|
288
|
+
// Normalize here so every builder sees the same Unit identity.
|
|
230
289
|
const normalizedOpts: ComposeUnitContextOptions = {
|
|
231
290
|
...opts,
|
|
232
|
-
base: { ...opts.base, unitType },
|
|
291
|
+
base: { ...opts.base, unitType: contract.unitType },
|
|
233
292
|
};
|
|
234
293
|
|
|
235
|
-
const prependBlocks = await
|
|
236
|
-
|
|
294
|
+
const prependBlocks = await runComputedBlocks(
|
|
295
|
+
contract.artifacts.prepend,
|
|
296
|
+
normalizedOpts,
|
|
297
|
+
"prepend",
|
|
298
|
+
);
|
|
299
|
+
const inlineBlocks: ComposedUnitContextBlock[] = [];
|
|
237
300
|
|
|
238
|
-
for (const key of
|
|
301
|
+
for (const key of contract.artifacts.inline) {
|
|
239
302
|
if (!normalizedOpts.resolveArtifact) break;
|
|
240
303
|
const body = await normalizedOpts.resolveArtifact(key);
|
|
241
|
-
if (body && body.length > 0)
|
|
304
|
+
if (body && body.length > 0) {
|
|
305
|
+
inlineBlocks.push({ key, mode: "inline", body });
|
|
306
|
+
}
|
|
242
307
|
}
|
|
243
|
-
for (const key of
|
|
308
|
+
for (const key of contract.artifacts.excerpt) {
|
|
244
309
|
if (!normalizedOpts.resolveExcerpt) break;
|
|
245
310
|
const body = await normalizedOpts.resolveExcerpt(key);
|
|
246
|
-
if (body && body.length > 0)
|
|
311
|
+
if (body && body.length > 0) {
|
|
312
|
+
inlineBlocks.push({ key, mode: "excerpt", body });
|
|
313
|
+
}
|
|
247
314
|
}
|
|
248
|
-
inlineBlocks.push(...await
|
|
315
|
+
inlineBlocks.push(...await runComputedBlocks(
|
|
316
|
+
contract.artifacts.computed,
|
|
317
|
+
normalizedOpts,
|
|
318
|
+
"computed",
|
|
319
|
+
));
|
|
249
320
|
|
|
250
321
|
return {
|
|
251
|
-
prepend: prependBlocks.join(SECTION_SEPARATOR),
|
|
252
|
-
inline: inlineBlocks.join(SECTION_SEPARATOR),
|
|
322
|
+
prepend: prependBlocks.map((block) => block.body).join(SECTION_SEPARATOR),
|
|
323
|
+
inline: inlineBlocks.map((block) => block.body).join(SECTION_SEPARATOR),
|
|
324
|
+
blocks: [...prependBlocks, ...inlineBlocks],
|
|
325
|
+
onDemand: contract.artifacts.onDemand,
|
|
253
326
|
};
|
|
254
327
|
}
|
|
255
328
|
|
|
@@ -258,10 +331,11 @@ export async function composeUnitContext(
|
|
|
258
331
|
* Missing registry entries (manifest declares the id but caller didn't
|
|
259
332
|
* register it) are skipped silently — see composeUnitContext rationale.
|
|
260
333
|
*/
|
|
261
|
-
async function
|
|
334
|
+
async function runComputedBlocks(
|
|
262
335
|
ids: readonly ComputedArtifactId[],
|
|
263
336
|
opts: ComposeUnitContextOptions,
|
|
264
|
-
|
|
337
|
+
mode: Extract<UnitContextBlockMode, "prepend" | "computed">,
|
|
338
|
+
): Promise<ComposedUnitContextBlock[]> {
|
|
265
339
|
if (ids.length === 0 || !opts.computed) return [];
|
|
266
340
|
// Type safety lives at the registration boundary (caller-supplied
|
|
267
341
|
// `computed` is typed against ComputedArtifactInputs[K] per id). Inside
|
|
@@ -274,12 +348,14 @@ async function runComputed(
|
|
|
274
348
|
inputs: unknown;
|
|
275
349
|
};
|
|
276
350
|
const registry = opts.computed as Record<string, AnyEntry | undefined>;
|
|
277
|
-
const out:
|
|
351
|
+
const out: ComposedUnitContextBlock[] = [];
|
|
278
352
|
for (const id of ids) {
|
|
279
353
|
const entry = registry[id];
|
|
280
354
|
if (!entry) continue;
|
|
281
355
|
const body = await entry.build(entry.inputs, opts.base);
|
|
282
|
-
if (body && body.length > 0)
|
|
356
|
+
if (body && body.length > 0) {
|
|
357
|
+
out.push({ key: id, mode, body });
|
|
358
|
+
}
|
|
283
359
|
}
|
|
284
360
|
return out;
|
|
285
361
|
}
|
|
@@ -343,35 +343,11 @@ const TOOLS_DOCS: ToolsPolicy = {
|
|
|
343
343
|
* enumerates these against `UNIT_MANIFESTS` to catch manifest drift when
|
|
344
344
|
* a new unit type lands.
|
|
345
345
|
*/
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
"discuss-milestone",
|
|
350
|
-
"validate-milestone",
|
|
351
|
-
"complete-milestone",
|
|
352
|
-
"research-slice",
|
|
353
|
-
"plan-slice",
|
|
354
|
-
"refine-slice",
|
|
355
|
-
"replan-slice",
|
|
356
|
-
"complete-slice",
|
|
357
|
-
"reassess-roadmap",
|
|
358
|
-
"execute-task",
|
|
359
|
-
"reactive-execute",
|
|
360
|
-
"run-uat",
|
|
361
|
-
"gate-evaluate",
|
|
362
|
-
"rewrite-docs",
|
|
363
|
-
// Sidecar units (triage, quick-task)
|
|
364
|
-
"triage-captures",
|
|
365
|
-
"quick-task",
|
|
366
|
-
// Deep planning mode (project-level) units
|
|
367
|
-
"workflow-preferences",
|
|
368
|
-
"discuss-project",
|
|
369
|
-
"discuss-requirements",
|
|
370
|
-
"research-decision",
|
|
371
|
-
"research-project",
|
|
372
|
-
] as const;
|
|
346
|
+
// Unit-type vocabulary is owned by the Unit Registry (ADR-033); re-exported
|
|
347
|
+
// here so established import paths keep working.
|
|
348
|
+
import { KNOWN_UNIT_TYPES, type UnitType } from "./unit-registry.js";
|
|
373
349
|
|
|
374
|
-
export type UnitType
|
|
350
|
+
export { KNOWN_UNIT_TYPES, type UnitType };
|
|
375
351
|
|
|
376
352
|
export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
377
353
|
// ─── Milestone-scoped ────────────────────────────────────────────────
|