@opengsd/gsd-pi 1.2.0-dev.4c756166 → 1.2.0-dev.822c9439
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.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.d.ts +9 -5
- package/dist/resource-loader.js +116 -20
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- 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 +38 -6
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +122 -58
- package/dist/resources/extensions/gsd/auto/phases.js +54 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +43 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +24 -26
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +49 -353
- package/dist/resources/extensions/gsd/auto.js +45 -21
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +29 -8
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -12
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +229 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +319 -71
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -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-recovery.js +3 -2
- package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +6 -62
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
- package/dist/resources/extensions/gsd/consent-question.js +353 -0
- package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +12 -15
- package/dist/resources/extensions/gsd/db/engine.js +755 -0
- package/dist/resources/extensions/gsd/db/queries.js +398 -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/dispatch-guard.js +10 -35
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- 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 +6 -21
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -16
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/files.js +33 -19
- 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-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +172 -2048
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +57 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +20 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +24 -3
- package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- 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-merge.js +14 -11
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +11 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- 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-models.js +14 -48
- package/dist/resources/extensions/gsd/preferences.js +14 -0
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- 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/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +41 -87
- package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- 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/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/state-transition-matrix.js +38 -0
- package/dist/resources/extensions/gsd/state.js +6 -20
- 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/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +46 -55
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +13 -31
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +16 -35
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- 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 +74 -1
- 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-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +293 -0
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +12 -3
- package/dist/resources/extensions/gsd/worktree-manager.js +52 -29
- 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.js +8 -1
- 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 +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- 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 +1 -1
- 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/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/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 +11 -11
- 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 +2 -2
- 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/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -11
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- 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/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- 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 +5 -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 +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +145 -59
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- 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/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +158 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +132 -17
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +12 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
- package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-shared.js +12 -3
- package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
- package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
- package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
- package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
- package/packages/pi-ai/package.json +3 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +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/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- 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/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- 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/gsd-browser-launch-config.test.mjs +40 -1
- 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 +40 -4
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +28 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +137 -61
- package/src/resources/extensions/gsd/auto/phases.ts +74 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +52 -13
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +24 -29
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +55 -365
- package/src/resources/extensions/gsd/auto.ts +64 -25
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +37 -10
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +33 -12
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +270 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +368 -78
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -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-recovery.ts +2 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +6 -68
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
- package/src/resources/extensions/gsd/consent-question.ts +431 -0
- package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +13 -11
- package/src/resources/extensions/gsd/db/engine.ts +809 -0
- package/src/resources/extensions/gsd/db/queries.ts +490 -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/dispatch-guard.ts +8 -31
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- 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 +5 -22
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -17
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/files.ts +33 -12
- 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-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +176 -2375
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +71 -31
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +18 -7
- package/src/resources/extensions/gsd/migration-auto-check.ts +28 -3
- package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- 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-merge.ts +12 -9
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +10 -7
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- 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-models.ts +12 -47
- package/src/resources/extensions/gsd/preferences.ts +18 -0
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- 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/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +47 -88
- package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- 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/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/state-transition-matrix.ts +42 -0
- package/src/resources/extensions/gsd/state.ts +9 -21
- 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/tests/auto-loop.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- 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-remote-session-lock-cleanup.test.ts +65 -3
- 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/blocked-models.test.ts +19 -0
- 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/browser-daemon-auto-prep.test.ts +144 -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/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- 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/gsd-command-home.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/guidance.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +2 -6
- 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/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +85 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -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 +248 -1
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +38 -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 +43 -6
- 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/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +41 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/worktree-placement.test.ts +113 -0
- 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 +24 -2
- package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +109 -1
- package/src/resources/extensions/gsd/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +45 -70
- package/src/resources/extensions/gsd/tools/complete-task.ts +3 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +13 -40
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +16 -44
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- 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 +111 -1
- 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-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +314 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +13 -9
- package/src/resources/extensions/gsd/worktree-manager.ts +53 -29
- 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.ts +7 -1
- 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 +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- 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/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{DUFWcMFRH3iXh7d2fbrOF → yWwBo-w09Y_W-nmeeWFRp}/_ssgManifest.js +0 -0
|
@@ -11,14 +11,9 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import {
|
|
14
|
-
getSlice,
|
|
15
|
-
getSliceTasks,
|
|
16
14
|
isDbAvailable,
|
|
17
|
-
|
|
18
|
-
updateSliceStatus,
|
|
19
|
-
updateTaskStatus,
|
|
15
|
+
skipSliceCascade,
|
|
20
16
|
} from "../gsd-db.js";
|
|
21
|
-
import { isClosedStatus } from "../status-guards.js";
|
|
22
17
|
|
|
23
18
|
/**
|
|
24
19
|
* Input parameters for {@link handleSkipSlice}.
|
|
@@ -90,44 +85,23 @@ export function handleSkipSlice(params: SkipSliceParams): SkipSliceResult {
|
|
|
90
85
|
throw new Error("handleSkipSlice: GSD database is not available");
|
|
91
86
|
}
|
|
92
87
|
|
|
93
|
-
// ──
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
wasAlreadySkipped = slice.status === "skipped";
|
|
113
|
-
if (!wasAlreadySkipped) {
|
|
114
|
-
updateSliceStatus(params.milestoneId, params.sliceId, "skipped");
|
|
88
|
+
// ── Atomic skip cascade (guards + writes in one transaction) ────────────
|
|
89
|
+
const outcome = skipSliceCascade(params.milestoneId, params.sliceId);
|
|
90
|
+
if (!outcome.ok) {
|
|
91
|
+
switch (outcome.reason) {
|
|
92
|
+
case "slice-not-found":
|
|
93
|
+
return {
|
|
94
|
+
...base,
|
|
95
|
+
error: `Slice ${params.sliceId} not found in milestone ${params.milestoneId}`,
|
|
96
|
+
errorCode: "slice_not_found" as SkipSliceErrorCode,
|
|
97
|
+
};
|
|
98
|
+
case "slice-already-complete":
|
|
99
|
+
return {
|
|
100
|
+
...base,
|
|
101
|
+
error: `Slice ${params.sliceId} is already complete — cannot skip.`,
|
|
102
|
+
errorCode: "already_complete" as SkipSliceErrorCode,
|
|
103
|
+
};
|
|
115
104
|
}
|
|
116
|
-
|
|
117
|
-
// Cascade: mark every non-closed task as skipped so milestone completion
|
|
118
|
-
// doesn't trip the deep-task guard (#4375). Closed tasks (complete/done/
|
|
119
|
-
// skipped) are left untouched — we never downgrade.
|
|
120
|
-
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
121
|
-
for (const task of tasks) {
|
|
122
|
-
if (!isClosedStatus(task.status)) {
|
|
123
|
-
updateTaskStatus(params.milestoneId, params.sliceId, task.id, "skipped");
|
|
124
|
-
tasksSkipped++;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
if (guardError) {
|
|
130
|
-
return { ...base, error: guardError, errorCode: guardCode ?? undefined };
|
|
131
105
|
}
|
|
132
|
-
return { ...base, tasksSkipped, wasAlreadySkipped };
|
|
106
|
+
return { ...base, tasksSkipped: outcome.tasksSkipped, wasAlreadySkipped: outcome.wasAlreadySkipped };
|
|
133
107
|
}
|
|
@@ -19,9 +19,10 @@ import {
|
|
|
19
19
|
} from "../gsd-db.js";
|
|
20
20
|
import { GATE_REGISTRY } from "../gate-registry.js";
|
|
21
21
|
import { generateRequirementsMd, saveArtifactToDb } from "../db-writer.js";
|
|
22
|
-
import { clearPathCache, relSliceFile, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
|
|
22
|
+
import { clearPathCache, normalizeRealPath, relSliceFile, resolveGsdPathContract, resolveMilestoneFile, resolveSliceFile } from "../paths.js";
|
|
23
23
|
import { saveFile, clearParseCache } from "../files.js";
|
|
24
24
|
import { unlinkSync } from "node:fs";
|
|
25
|
+
import { hostname } from "node:os";
|
|
25
26
|
import { join } from "node:path";
|
|
26
27
|
import type { CompleteMilestoneParams } from "./complete-milestone.js";
|
|
27
28
|
import { handleCompleteMilestone } from "./complete-milestone.js";
|
|
@@ -48,13 +49,21 @@ import { logError, logWarning } from "../workflow-logger.js";
|
|
|
48
49
|
import { invalidateStateCache } from "../state.js";
|
|
49
50
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
50
51
|
import { parseProject } from "../schemas/parsers.js";
|
|
51
|
-
import { getAutoRuntimeSnapshot } from "../auto-runtime-state.js";
|
|
52
|
+
import { autoSession, getAutoRuntimeSnapshot, isAutoActive } from "../auto-runtime-state.js";
|
|
52
53
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
53
54
|
import {
|
|
54
55
|
prepareUatRun,
|
|
55
56
|
saveUatAttemptArtifact,
|
|
56
57
|
type UatResultSaveParams,
|
|
57
58
|
} from "../uat-run.js";
|
|
59
|
+
import { registerAutoWorker, markWorkerStopping, getAutoWorker } from "../db/auto-workers.js";
|
|
60
|
+
import {
|
|
61
|
+
claimMilestoneLease,
|
|
62
|
+
releaseMilestoneLease,
|
|
63
|
+
getMilestoneLease,
|
|
64
|
+
refreshMilestoneLease,
|
|
65
|
+
milestoneLeaseTtlSeconds,
|
|
66
|
+
} from "../db/milestone-leases.js";
|
|
58
67
|
export type {
|
|
59
68
|
UatCheckResultInput,
|
|
60
69
|
UatEvidenceRef,
|
|
@@ -105,6 +114,24 @@ function blockIfWrongAutoUnit(requiredUnitType: string, operation: string): Tool
|
|
|
105
114
|
};
|
|
106
115
|
}
|
|
107
116
|
|
|
117
|
+
function milestoneLeaseConflictResult(
|
|
118
|
+
milestoneId: string,
|
|
119
|
+
byWorker: string,
|
|
120
|
+
expiresAt: string,
|
|
121
|
+
): ToolExecutionResult {
|
|
122
|
+
return {
|
|
123
|
+
content: [{ type: "text", text: `Milestone ${milestoneId} is currently leased by ${byWorker}. Retry after ${expiresAt}.` }],
|
|
124
|
+
details: {
|
|
125
|
+
operation: "plan_milestone",
|
|
126
|
+
error: "milestone_lease_conflict",
|
|
127
|
+
milestoneId,
|
|
128
|
+
byWorker,
|
|
129
|
+
expiresAt,
|
|
130
|
+
},
|
|
131
|
+
isError: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
108
135
|
export interface SummarySaveParams {
|
|
109
136
|
milestone_id?: string;
|
|
110
137
|
slice_id?: string;
|
|
@@ -1244,7 +1271,48 @@ export async function executePlanMilestone(
|
|
|
1244
1271
|
isError: true,
|
|
1245
1272
|
};
|
|
1246
1273
|
}
|
|
1274
|
+
let workerId: string | null = null;
|
|
1275
|
+
let acquiredToken: number | null = null;
|
|
1276
|
+
let leaseRefreshTimer: ReturnType<typeof setInterval> | undefined;
|
|
1247
1277
|
try {
|
|
1278
|
+
// Re-read at the gate so a peer-created milestone is not treated as fresh.
|
|
1279
|
+
const milestoneExists = getMilestone(params.milestoneId) !== null;
|
|
1280
|
+
if (milestoneExists) {
|
|
1281
|
+
const heldLease = getMilestoneLease(params.milestoneId);
|
|
1282
|
+
if (heldLease?.status === "held" && Date.parse(heldLease.expires_at) > Date.now()) {
|
|
1283
|
+
const holder = getAutoWorker(heldLease.worker_id);
|
|
1284
|
+
// Let the one-shot claim path recover stale same-process worker rows.
|
|
1285
|
+
const projectRoot = normalizeRealPath(basePath);
|
|
1286
|
+
const isOurAutoLease = isAutoActive() && heldLease.worker_id === autoSession.workerId;
|
|
1287
|
+
const holderIsOneShotReentrantPeer = !isAutoActive()
|
|
1288
|
+
&& !!holder
|
|
1289
|
+
&& holder.host === hostname()
|
|
1290
|
+
&& holder.pid === process.pid
|
|
1291
|
+
&& holder.project_root_realpath === projectRoot;
|
|
1292
|
+
if (holder?.status === "active" && !isOurAutoLease && !holderIsOneShotReentrantPeer) {
|
|
1293
|
+
return milestoneLeaseConflictResult(params.milestoneId, heldLease.worker_id, heldLease.expires_at);
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1298
|
+
// Fresh creation cannot claim a lease because the FK row does not exist.
|
|
1299
|
+
// In-process auto already owns its lease; re-claiming would bump its token.
|
|
1300
|
+
if (!isAutoActive() && milestoneExists) {
|
|
1301
|
+
workerId = registerAutoWorker({ projectRootRealpath: normalizeRealPath(basePath) });
|
|
1302
|
+
const lease = claimMilestoneLease(workerId, params.milestoneId);
|
|
1303
|
+
if (!lease.ok) {
|
|
1304
|
+
return milestoneLeaseConflictResult(params.milestoneId, lease.byWorker, lease.expiresAt);
|
|
1305
|
+
}
|
|
1306
|
+
acquiredToken = lease.token;
|
|
1307
|
+
|
|
1308
|
+
const leaseRefreshMs = (milestoneLeaseTtlSeconds() / 2) * 1000;
|
|
1309
|
+
leaseRefreshTimer = setInterval(() => {
|
|
1310
|
+
if (acquiredToken !== null && workerId !== null) {
|
|
1311
|
+
refreshMilestoneLease(workerId, params.milestoneId, acquiredToken);
|
|
1312
|
+
}
|
|
1313
|
+
}, leaseRefreshMs);
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1248
1316
|
const result = await handlePlanMilestone(params, basePath);
|
|
1249
1317
|
if ("error" in result) {
|
|
1250
1318
|
return {
|
|
@@ -1270,6 +1338,17 @@ export async function executePlanMilestone(
|
|
|
1270
1338
|
isError: true,
|
|
1271
1339
|
};
|
|
1272
1340
|
}
|
|
1341
|
+
finally {
|
|
1342
|
+
if (leaseRefreshTimer !== undefined) {
|
|
1343
|
+
clearInterval(leaseRefreshTimer);
|
|
1344
|
+
}
|
|
1345
|
+
if (workerId !== null && acquiredToken !== null) {
|
|
1346
|
+
releaseMilestoneLease(workerId, params.milestoneId, acquiredToken);
|
|
1347
|
+
}
|
|
1348
|
+
if (workerId !== null) {
|
|
1349
|
+
markWorkerStopping(workerId);
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1273
1352
|
}
|
|
1274
1353
|
|
|
1275
1354
|
export async function executePlanSlice(
|
|
@@ -1,7 +1,8 @@
|
|
|
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 {
|
|
4
|
+
import { hasBrowserContractPrefix } from "../shared/browser-contract.js";
|
|
5
|
+
import { extractUatType, UAT_TYPE_KEYWORDS } from "./files.js";
|
|
5
6
|
import type { UatType } from "./files.js";
|
|
6
7
|
import { hasBrowserRequiredText } from "./browser-evidence.js";
|
|
7
8
|
import { parseMcpToolName } from "./mcp-tool-name.js";
|
|
@@ -27,19 +28,14 @@ export interface UatModePolicy {
|
|
|
27
28
|
|
|
28
29
|
export interface UatContentPolicy {
|
|
29
30
|
declaredType: UatType;
|
|
31
|
+
/** False when no parseable `UAT mode:` declaration exists and declaredType defaulted to artifact-driven. */
|
|
32
|
+
modeDeclared: boolean;
|
|
30
33
|
effectiveType: UatType;
|
|
31
34
|
browserRequired: boolean;
|
|
32
35
|
shouldDispatchByDefault: boolean;
|
|
33
36
|
}
|
|
34
37
|
|
|
35
|
-
export const UAT_TYPES: readonly UatType[] =
|
|
36
|
-
"artifact-driven",
|
|
37
|
-
"browser-executable",
|
|
38
|
-
"runtime-executable",
|
|
39
|
-
"live-runtime",
|
|
40
|
-
"mixed",
|
|
41
|
-
"human-experience",
|
|
42
|
-
] as const;
|
|
38
|
+
export const UAT_TYPES: readonly UatType[] = UAT_TYPE_KEYWORDS;
|
|
43
39
|
|
|
44
40
|
export const UAT_MODE_POLICIES: Readonly<Record<UatType, UatModePolicy>> = {
|
|
45
41
|
"artifact-driven": {
|
|
@@ -88,26 +84,76 @@ export function getDeclaredUatType(content: string): UatType {
|
|
|
88
84
|
return extractUatType(content) ?? "artifact-driven";
|
|
89
85
|
}
|
|
90
86
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
/** Self-contained browser UAT harnesses that manage server lifecycle internally. */
|
|
88
|
+
const SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE =
|
|
89
|
+
/\b(?:npm run test:uat|node\s+(?:--check\s+\S+\s+&&\s+)*tests\/browser\/search-uat\.mjs|npx playwright test(?:\s+\S+)?)\b/i;
|
|
90
|
+
|
|
91
|
+
export function hasSelfContainedRuntimeUatCommand(content: string): boolean {
|
|
92
|
+
return SELF_CONTAINED_RUNTIME_UAT_COMMAND_RE.test(content);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function resolveEffectiveUatTypeFromPolicy(
|
|
96
|
+
declaredType: UatType,
|
|
97
|
+
browserRequired: boolean,
|
|
98
|
+
content: string,
|
|
99
|
+
): UatType {
|
|
100
|
+
let effectiveType = declaredType === "artifact-driven" && browserRequired
|
|
95
101
|
? "browser-executable"
|
|
96
102
|
: declaredType;
|
|
97
103
|
|
|
104
|
+
// M006/S01 regression: specs often declare browser-executable with localhost
|
|
105
|
+
// preconditions while the Evidence section names a runtime harness such as
|
|
106
|
+
// `npm run test:uat`. Interactive browser_* checks then race a fixed port
|
|
107
|
+
// against the script's own ephemeral server — run the harness instead.
|
|
108
|
+
if (
|
|
109
|
+
effectiveType === "browser-executable" &&
|
|
110
|
+
hasSelfContainedRuntimeUatCommand(content)
|
|
111
|
+
) {
|
|
112
|
+
effectiveType = "runtime-executable";
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return effectiveType;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function classifyUatContent(content: string): UatContentPolicy {
|
|
119
|
+
return classifyUatContentForRun(content);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Classify UAT mode for run-uat dispatch. Supplemental context (slice summary,
|
|
124
|
+
* verification excerpts) can name a self-contained harness even when the UAT
|
|
125
|
+
* file only documents a separate server command such as `npm run test:server`.
|
|
126
|
+
*/
|
|
127
|
+
export function classifyUatContentForRun(content: string, supplementalContext = ""): UatContentPolicy {
|
|
128
|
+
const parsedType = extractUatType(content);
|
|
129
|
+
const declaredType = parsedType ?? "artifact-driven";
|
|
130
|
+
const browserRequired = hasBrowserRequiredText(content);
|
|
131
|
+
const combinedForHarness = supplementalContext.trim()
|
|
132
|
+
? `${content}\n\n${supplementalContext}`
|
|
133
|
+
: content;
|
|
134
|
+
const effectiveType = resolveEffectiveUatTypeFromPolicy(
|
|
135
|
+
declaredType,
|
|
136
|
+
browserRequired,
|
|
137
|
+
combinedForHarness,
|
|
138
|
+
);
|
|
139
|
+
|
|
98
140
|
return {
|
|
99
141
|
declaredType,
|
|
142
|
+
modeDeclared: parsedType !== undefined,
|
|
100
143
|
effectiveType,
|
|
101
144
|
browserRequired,
|
|
102
145
|
shouldDispatchByDefault: effectiveType !== "artifact-driven" || browserRequired,
|
|
103
146
|
};
|
|
104
147
|
}
|
|
105
148
|
|
|
106
|
-
export function
|
|
107
|
-
const policy = classifyUatContent(content);
|
|
149
|
+
export function escalatesArtifactUatToBrowser(policy: UatContentPolicy): boolean {
|
|
108
150
|
return policy.declaredType === "artifact-driven" && policy.browserRequired;
|
|
109
151
|
}
|
|
110
152
|
|
|
153
|
+
export function shouldEscalateArtifactUatToBrowser(content: string): boolean {
|
|
154
|
+
return escalatesArtifactUatToBrowser(classifyUatContent(content));
|
|
155
|
+
}
|
|
156
|
+
|
|
111
157
|
export function resolveEffectiveUatType(content: string): UatType {
|
|
112
158
|
return classifyUatContent(content).effectiveType;
|
|
113
159
|
}
|
|
@@ -126,7 +172,7 @@ export function uatTypeIncludesBrowser(uatType: string | undefined): boolean {
|
|
|
126
172
|
export function isUatBrowserToolName(toolName: string): boolean {
|
|
127
173
|
const parsed = parseMcpToolName(toolName);
|
|
128
174
|
const canonicalName = parsed?.toolName ?? toolName;
|
|
129
|
-
if (canonicalName
|
|
175
|
+
if (hasBrowserContractPrefix(canonicalName)) return true;
|
|
130
176
|
return parsed?.toolName === "*" && parsed.serverName.toLowerCase().includes("browser");
|
|
131
177
|
}
|
|
132
178
|
|
|
@@ -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
|
+
}
|