@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
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Tool Contract module's runtime face — verify the live SDK tool surface covers a Unit's required workflow tools.
|
|
3
|
+
|
|
4
|
+
import { mcpToolMatchesBaseName } from "./mcp-tool-name.js";
|
|
5
|
+
import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
|
|
6
|
+
import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Stable phrase recognized as transient by auto-tool-tracking's
|
|
10
|
+
* isToolUnavailableError and error-classifier's transient buckets,
|
|
11
|
+
* which build their matchers from this constant.
|
|
12
|
+
*/
|
|
13
|
+
export const TOOL_SURFACE_NOT_READY = "workflow tool surface not ready";
|
|
14
|
+
|
|
15
|
+
/** MCP server statuses that will not self-heal within the session. */
|
|
16
|
+
const TERMINAL_MCP_SERVER_STATUSES = new Set(["failed", "needs-auth", "disabled"]);
|
|
17
|
+
|
|
18
|
+
export interface LiveToolSurfaceObservation {
|
|
19
|
+
/** Tool names the session reported at init (MCP tools appear as mcp__<server>__<tool>). */
|
|
20
|
+
tools: readonly string[];
|
|
21
|
+
/** MCP server connection statuses the session reported at init. */
|
|
22
|
+
mcpServers: readonly { name: string; status: string }[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Verify the live tool surface observed at SDK session init covers the Unit's
|
|
27
|
+
* required workflow tools. Complements the static pre-dispatch gate
|
|
28
|
+
* (getWorkflowTransportSupportError), which only proves the MCP launch config
|
|
29
|
+
* is discoverable — the workflow server connects asynchronously after session
|
|
30
|
+
* start, so the static gate cannot see whether the tools actually registered.
|
|
31
|
+
*
|
|
32
|
+
* Returns a transient, recovery-classifiable error (kind tool-unavailable →
|
|
33
|
+
* retry) when the workflow server failed or has not yet registered a required
|
|
34
|
+
* tool, so dispatch aborts before the first model turn instead of letting the
|
|
35
|
+
* Unit improvise around "No such tool available". Returns null when no
|
|
36
|
+
* workflow server is part of this session (native tool path), when the Unit
|
|
37
|
+
* requires no workflow tools, or when the surface is ready.
|
|
38
|
+
*/
|
|
39
|
+
export function getToolSurfaceReadinessError(input: {
|
|
40
|
+
unitType: string | undefined;
|
|
41
|
+
workflowServerName: string | undefined;
|
|
42
|
+
observation: LiveToolSurfaceObservation;
|
|
43
|
+
}): string | null {
|
|
44
|
+
const { unitType, workflowServerName, observation } = input;
|
|
45
|
+
if (!unitType || !workflowServerName) return null;
|
|
46
|
+
|
|
47
|
+
const required = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
|
|
48
|
+
if (required.length === 0) return null;
|
|
49
|
+
|
|
50
|
+
const server = observation.mcpServers.find((entry) => entry.name === workflowServerName);
|
|
51
|
+
if (!server) {
|
|
52
|
+
return `${TOOL_SURFACE_NOT_READY} for ${unitType}: MCP server "${workflowServerName}" is absent from the init surface (not yet connected): ${required.join(", ")}`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// The SDK does not wait for MCP servers before init — a still-connecting
|
|
56
|
+
// server reports "pending" there routinely, then registers within seconds,
|
|
57
|
+
// usually well before the Unit's first workflow tool call. Aborting on
|
|
58
|
+
// "pending" would fail the common healthy session, so it passes through;
|
|
59
|
+
// a genuine miss after pass-through still surfaces in-session as
|
|
60
|
+
// "No such tool available" and classifies tool-unavailable → bounded retry.
|
|
61
|
+
// Only statuses that cannot self-heal abort here.
|
|
62
|
+
if (server.status !== "connected" && !TERMINAL_MCP_SERVER_STATUSES.has(server.status)) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const missing = required.filter(
|
|
67
|
+
(tool) => !observation.tools.some((name) => name === tool || mcpToolMatchesBaseName(name, tool)),
|
|
68
|
+
);
|
|
69
|
+
if (missing.length === 0) return null;
|
|
70
|
+
|
|
71
|
+
const serverDetail =
|
|
72
|
+
server.status === "connected"
|
|
73
|
+
? `MCP server "${workflowServerName}" is connected but has not registered`
|
|
74
|
+
: `MCP server "${workflowServerName}" status is "${server.status}" and it has not registered`;
|
|
75
|
+
return `${TOOL_SURFACE_NOT_READY} for ${unitType}: ${serverDetail}: ${missing.join(", ")}`;
|
|
76
|
+
}
|
|
@@ -26,7 +26,8 @@ import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
|
26
26
|
import { isClosedStatus } from "../status-guards.js";
|
|
27
27
|
import { saveFile, clearParseCache } from "../files.js";
|
|
28
28
|
import { invalidateStateCache } from "../state.js";
|
|
29
|
-
import {
|
|
29
|
+
import { stripIdPrefix } from "../workflow-projections.js";
|
|
30
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
30
31
|
import { writeManifest } from "../workflow-manifest.js";
|
|
31
32
|
import { appendEvent } from "../workflow-events.js";
|
|
32
33
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -240,7 +241,7 @@ export async function handleCompleteMilestone(
|
|
|
240
241
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
241
242
|
// the event log entry (critical for worktree reconciliation).
|
|
242
243
|
try {
|
|
243
|
-
await
|
|
244
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
244
245
|
} catch (projErr) {
|
|
245
246
|
logWarning("tool", `complete-milestone projection warning: ${(projErr as Error).message}`);
|
|
246
247
|
}
|
|
@@ -15,32 +15,22 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
15
15
|
import { join } from "node:path";
|
|
16
16
|
|
|
17
17
|
import type { CompleteSliceParams } from "../types.js";
|
|
18
|
-
import { isClosedStatus } from "../status-guards.js";
|
|
19
18
|
import {
|
|
20
|
-
|
|
21
|
-
insertMilestone,
|
|
22
|
-
insertSlice,
|
|
23
|
-
getSlice,
|
|
24
|
-
getSliceTasks,
|
|
25
|
-
getMilestone,
|
|
26
|
-
updateSliceStatus,
|
|
19
|
+
completeSliceCascade,
|
|
27
20
|
setSliceSummaryMd,
|
|
28
21
|
saveGateResult,
|
|
29
22
|
getPendingGatesForTurn,
|
|
30
|
-
getMilestoneSlices,
|
|
31
|
-
updateMilestoneStatus,
|
|
32
23
|
} from "../gsd-db.js";
|
|
33
24
|
import { getGatesForTurn } from "../gate-registry.js";
|
|
34
25
|
import { gsdProjectionRoot, clearPathCache, resolveMilestoneFile } from "../paths.js";
|
|
35
26
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
36
27
|
import { checkOwnership, sliceUnitKey } from "../unit-ownership.js";
|
|
37
28
|
import { saveFile, clearParseCache } from "../files.js";
|
|
38
|
-
import {
|
|
29
|
+
import { classifyUatContent, escalatesArtifactUatToBrowser } from "../uat-policy.js";
|
|
39
30
|
import { invalidateStateCache } from "../state.js";
|
|
40
|
-
import { renderRoadmapFromDb } from "../markdown-renderer.js";
|
|
41
|
-
import { parseRoadmap } from "../parsers-legacy.js";
|
|
31
|
+
import { renderRoadmapFromDb, roadmapRenderMarksSliceDone } from "../markdown-renderer.js";
|
|
42
32
|
import { isStaleWrite } from "../auto/turn-epoch.js";
|
|
43
|
-
import {
|
|
33
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
44
34
|
import { writeManifest } from "../workflow-manifest.js";
|
|
45
35
|
import { appendEvent } from "../workflow-events.js";
|
|
46
36
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -100,9 +90,11 @@ function hasCompleteSliceArtifactContract(basePath: string, milestoneId: string,
|
|
|
100
90
|
join(gsdProjectionRoot(basePath), "milestones", milestoneId, `${milestoneId}-ROADMAP.md`);
|
|
101
91
|
if (!existsSync(roadmapPath)) return false;
|
|
102
92
|
|
|
93
|
+
// Projection-completeness check (ADR-017): the DB has already recorded the
|
|
94
|
+
// duplicate completion; this only verifies the rendered markdown artifacts
|
|
95
|
+
// exist and reflect it, deciding whether re-rendering is needed.
|
|
103
96
|
try {
|
|
104
|
-
|
|
105
|
-
return roadmap.slices.some((slice) => slice.id === sliceId && slice.done);
|
|
97
|
+
return roadmapRenderMarksSliceDone(readFileSync(roadmapPath, "utf-8"), sliceId);
|
|
106
98
|
} catch {
|
|
107
99
|
return false;
|
|
108
100
|
}
|
|
@@ -364,67 +356,49 @@ export async function handleCompleteSlice(
|
|
|
364
356
|
// `npx playwright test` via gsd_uat_exec, and live-runtime/mixed/
|
|
365
357
|
// browser-executable receive browser tools (UAT_MODE_POLICIES).
|
|
366
358
|
const uatContent = params.uatContent || "";
|
|
367
|
-
const
|
|
368
|
-
if (
|
|
359
|
+
const uatPolicy = classifyUatContent(uatContent);
|
|
360
|
+
if (escalatesArtifactUatToBrowser(uatPolicy)) {
|
|
361
|
+
// Distinguish an explicit artifact-driven declaration from a missing or
|
|
362
|
+
// unparseable one that merely *defaulted* to artifact-driven — telling an
|
|
363
|
+
// agent it "declared artifact-driven" when its declaration simply failed
|
|
364
|
+
// to parse sends it into a rewrite loop with the same unparseable format.
|
|
365
|
+
const staticOnlyClause = `which only runs static/file checks and would defer the browser work to a human`;
|
|
366
|
+
const modeClause = uatPolicy.modeDeclared
|
|
367
|
+
? `declares "UAT mode: artifact-driven", ${staticOnlyClause}`
|
|
368
|
+
: `has no parseable UAT mode declaration in its "## UAT Type" section (the declaration must be a bullet exactly like "- UAT mode: browser-executable"), so it defaults to "artifact-driven", ${staticOnlyClause}`;
|
|
369
369
|
return {
|
|
370
|
-
error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but
|
|
370
|
+
error: `UAT requires browser verification (opening a page in a browser, navigating to a page or localhost, screenshots) but ${modeClause}. Use a mode that actually verifies the UI: "browser-executable" (interactive browser tools), "runtime-executable" (a browser test command such as playwright), or a browser-inclusive "mixed"/"live-runtime". Re-author the UAT Type section and complete the slice again.`,
|
|
371
371
|
};
|
|
372
372
|
}
|
|
373
373
|
|
|
374
|
-
// ──
|
|
374
|
+
// ── Atomic completion cascade (guards + writes in one transaction) ───────
|
|
375
375
|
const completedAt = new Date().toISOString();
|
|
376
376
|
let guardError: string | null = null;
|
|
377
377
|
let existingSummaryMd = "";
|
|
378
378
|
let duplicateComplete = false;
|
|
379
379
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
// Only block if they exist and are closed.
|
|
384
|
-
const milestone = getMilestone(params.milestoneId);
|
|
385
|
-
if (milestone && isClosedStatus(milestone.status)) {
|
|
386
|
-
guardError = `cannot complete slice in a closed milestone: ${params.milestoneId} (status: ${milestone.status})`;
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
const slice = getSlice(params.milestoneId, params.sliceId);
|
|
391
|
-
existingSummaryMd = slice?.full_summary_md?.trim() ?? "";
|
|
392
|
-
if (slice && isClosedStatus(slice.status)) {
|
|
393
|
-
duplicateComplete = true;
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// Verify all tasks are complete
|
|
398
|
-
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
399
|
-
if (tasks.length === 0) {
|
|
400
|
-
guardError = `no tasks found for slice ${params.sliceId} in milestone ${params.milestoneId}`;
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
const incompleteTasks = tasks.filter(t => !isClosedStatus(t.status));
|
|
405
|
-
if (incompleteTasks.length > 0) {
|
|
406
|
-
const incompleteIds = incompleteTasks.map(t => `${t.id} (status: ${t.status})`).join(", ");
|
|
407
|
-
guardError = `incomplete tasks: ${incompleteIds}`;
|
|
408
|
-
return;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// All guards passed — perform writes. Preserve existing planning metadata:
|
|
412
|
-
// completion should not overwrite title/risk/depends/demo/sequence.
|
|
413
|
-
insertMilestone({ id: params.milestoneId, title: params.milestoneId });
|
|
414
|
-
if (!slice) {
|
|
415
|
-
insertSlice({ id: params.sliceId, milestoneId: params.milestoneId, title: params.sliceTitle || params.sliceId });
|
|
416
|
-
}
|
|
417
|
-
updateSliceStatus(params.milestoneId, params.sliceId, "complete", completedAt);
|
|
418
|
-
|
|
419
|
-
const updatedSlices = getMilestoneSlices(params.milestoneId);
|
|
420
|
-
if (
|
|
421
|
-
milestone?.status === "planned" &&
|
|
422
|
-
updatedSlices.length > 0 &&
|
|
423
|
-
updatedSlices.every((s) => isClosedStatus(s.status))
|
|
424
|
-
) {
|
|
425
|
-
updateMilestoneStatus(params.milestoneId, "active");
|
|
426
|
-
}
|
|
380
|
+
const outcome = completeSliceCascade(params.milestoneId, params.sliceId, {
|
|
381
|
+
sliceTitle: params.sliceTitle,
|
|
382
|
+
completedAt,
|
|
427
383
|
});
|
|
384
|
+
if (outcome.ok) {
|
|
385
|
+
existingSummaryMd = outcome.existingSummaryMd;
|
|
386
|
+
duplicateComplete = outcome.duplicate;
|
|
387
|
+
} else {
|
|
388
|
+
switch (outcome.reason) {
|
|
389
|
+
case "milestone-closed":
|
|
390
|
+
guardError = `cannot complete slice in a closed milestone: ${params.milestoneId} (status: ${outcome.status})`;
|
|
391
|
+
break;
|
|
392
|
+
case "no-tasks":
|
|
393
|
+
guardError = `no tasks found for slice ${params.sliceId} in milestone ${params.milestoneId}`;
|
|
394
|
+
break;
|
|
395
|
+
case "incomplete-tasks": {
|
|
396
|
+
const incompleteIds = outcome.incomplete.map((t) => `${t.id} (status: ${t.status})`).join(", ");
|
|
397
|
+
guardError = `incomplete tasks: ${incompleteIds}`;
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
428
402
|
|
|
429
403
|
if (duplicateComplete) {
|
|
430
404
|
const staleSummaryPath = sliceSummaryPath(
|
|
@@ -505,8 +479,9 @@ export async function handleCompleteSlice(
|
|
|
505
479
|
|
|
506
480
|
const roadmap = await renderRoadmapFromDb(artifactBasePath, params.milestoneId);
|
|
507
481
|
clearParseCache();
|
|
508
|
-
|
|
509
|
-
|
|
482
|
+
// Render verification (ADR-017): confirms the just-written projection
|
|
483
|
+
// reflects the DB completion; the DB row is already committed.
|
|
484
|
+
if (!roadmapRenderMarksSliceDone(roadmap.content, params.sliceId)) {
|
|
510
485
|
throw new Error(`roadmap render did not mark ${params.milestoneId}/${params.sliceId} complete`);
|
|
511
486
|
}
|
|
512
487
|
} catch (renderErr) {
|
|
@@ -562,7 +537,7 @@ export async function handleCompleteSlice(
|
|
|
562
537
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
563
538
|
// the event log entry (critical for worktree reconciliation).
|
|
564
539
|
try {
|
|
565
|
-
await
|
|
540
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
566
541
|
} catch (projErr) {
|
|
567
542
|
logWarning("tool", `complete-slice projection warning for ${params.milestoneId}/${params.sliceId}: ${(projErr as Error).message}`);
|
|
568
543
|
}
|
|
@@ -35,7 +35,8 @@ import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
|
35
35
|
import { saveFile, clearParseCache } from "../files.js";
|
|
36
36
|
import { invalidateStateCache } from "../state.js";
|
|
37
37
|
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
38
|
-
import {
|
|
38
|
+
import { renderSummaryContent } from "../workflow-projections.js";
|
|
39
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
39
40
|
import { writeManifest } from "../workflow-manifest.js";
|
|
40
41
|
import { appendEvent } from "../workflow-events.js";
|
|
41
42
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -467,7 +468,7 @@ export async function handleCompleteTask(
|
|
|
467
468
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
468
469
|
// the event log entry (critical for worktree reconciliation).
|
|
469
470
|
try {
|
|
470
|
-
await
|
|
471
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
471
472
|
} catch (projErr) {
|
|
472
473
|
logWarning("tool", `complete-task projection warning: ${(projErr as Error).message}`);
|
|
473
474
|
}
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
import { realpathSync } from "node:fs";
|
|
12
12
|
import path from "node:path";
|
|
13
13
|
import { isContextModeEnabled, type ContextModeConfig } from "../preferences-types.js";
|
|
14
|
+
import { projectRootFromWorktreePath } from "../worktree-root.js";
|
|
14
15
|
import { contextModeDisabledResult, type ToolExecutionResult } from "./context-mode-tool-result.js";
|
|
15
16
|
|
|
16
17
|
export interface ExecToolParams {
|
|
@@ -201,13 +202,9 @@ function normalizeScanPath(value: string): string {
|
|
|
201
202
|
|
|
202
203
|
function parseWorktreeBase(baseDir: string): { originalRoot: string; worktreeRoot: string } | null {
|
|
203
204
|
const normalizedBase = normalizeScanPath(baseDir);
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return {
|
|
208
|
-
originalRoot: normalizedBase.slice(0, markerIndex),
|
|
209
|
-
worktreeRoot: normalizedBase,
|
|
210
|
-
};
|
|
205
|
+
const originalRoot = projectRootFromWorktreePath(normalizedBase);
|
|
206
|
+
if (!originalRoot) return null;
|
|
207
|
+
return { originalRoot, worktreeRoot: normalizedBase };
|
|
211
208
|
}
|
|
212
209
|
|
|
213
210
|
function pathInside(parent: string, target: string): boolean {
|
|
@@ -297,7 +294,7 @@ function scriptReferencesOriginalRootFromWorktree(script: string, baseDir: strin
|
|
|
297
294
|
const normalizedScript = script.replace(/\\/g, "/");
|
|
298
295
|
return comparablePathVariants(parsed.originalRoot).some((originalRoot) => {
|
|
299
296
|
const originalRootPattern = new RegExp(
|
|
300
|
-
`${escapeRegExp(originalRoot)}(?=$|[\\s'"\\\`;)&|<>]|/(?!\\.gsd
|
|
297
|
+
`${escapeRegExp(originalRoot)}(?=$|[\\s'"\\\`;)&|<>]|/(?!\\.gsd(?:-worktrees|/worktrees)(?:/|$)))`,
|
|
301
298
|
);
|
|
302
299
|
return originalRootPattern.test(normalizedScript);
|
|
303
300
|
});
|
|
@@ -427,6 +424,7 @@ function formatResult(result: ExecSandboxResult): ToolExecutionResult {
|
|
|
427
424
|
exit_code: result.exit_code,
|
|
428
425
|
signal: result.signal,
|
|
429
426
|
timed_out: result.timed_out,
|
|
427
|
+
force_resolved: result.force_resolved,
|
|
430
428
|
duration_ms: result.duration_ms,
|
|
431
429
|
stdout_bytes: result.stdout_bytes,
|
|
432
430
|
stderr_bytes: result.stderr_bytes,
|
|
@@ -441,6 +439,9 @@ function formatResult(result: ExecSandboxResult): ToolExecutionResult {
|
|
|
441
439
|
}
|
|
442
440
|
|
|
443
441
|
function formatExit(result: ExecSandboxResult): string {
|
|
442
|
+
// force_resolved means a non-closing (D-state) child was force-resolved past its
|
|
443
|
+
// hard deadline rather than observed exiting; distinguish it from a clean timeout.
|
|
444
|
+
if (result.force_resolved) return "timeout(force-killed)";
|
|
444
445
|
if (result.timed_out) return "timeout";
|
|
445
446
|
if (result.signal) return `signal:${result.signal}`;
|
|
446
447
|
if (result.exit_code === null) return "null";
|
|
@@ -21,13 +21,14 @@ import {
|
|
|
21
21
|
import type { GateEvaluationConfig, GateId } from "../types.js";
|
|
22
22
|
import { invalidateStateCache } from "../state.js";
|
|
23
23
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
24
|
-
import {
|
|
24
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
25
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
26
26
|
import { appendEvent } from "../workflow-events.js";
|
|
27
27
|
import { logWarning } from "../workflow-logger.js";
|
|
28
28
|
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
29
|
-
import {
|
|
29
|
+
import { runTaskPathChecks } from "../pre-execution-checks.js";
|
|
30
30
|
import type { TaskRow } from "../db-task-slice-rows.js";
|
|
31
|
+
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
31
32
|
import { buildTaskFileName, gsdProjectionRoot } from "../paths.js";
|
|
32
33
|
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
33
34
|
import { createRepositoryRegistryFromPreferences, defaultRepositoryTargets, type RepositoryRegistry } from "../repository-registry.js";
|
|
@@ -268,11 +269,16 @@ function validateTaskPathsBeforePersist(
|
|
|
268
269
|
const additionalRoots = allowedRoots
|
|
269
270
|
.map((root) => resolve(root))
|
|
270
271
|
.filter((root) => root !== baseRoot);
|
|
271
|
-
const
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
272
|
+
const resolvedCanonicalRoot = resolve(resolveWorktreeProjectRoot(basePath));
|
|
273
|
+
const canonicalProjectRoot = resolvedCanonicalRoot !== baseRoot ? resolvedCanonicalRoot : undefined;
|
|
274
|
+
const hasContext = additionalRoots.length > 0 || canonicalProjectRoot !== undefined;
|
|
275
|
+
const context = hasContext
|
|
276
|
+
? {
|
|
277
|
+
...(additionalRoots.length > 0 ? { additionalRoots } : {}),
|
|
278
|
+
...(canonicalProjectRoot !== undefined ? { canonicalProjectRoot } : {}),
|
|
279
|
+
}
|
|
280
|
+
: undefined;
|
|
281
|
+
const checks = runTaskPathChecks(taskRows, basePath, context);
|
|
276
282
|
const blocking = checks.filter((check) => !check.passed && check.blocking);
|
|
277
283
|
|
|
278
284
|
if (blocking.length === 0) return null;
|
|
@@ -462,7 +468,7 @@ export async function handlePlanSlice(
|
|
|
462
468
|
|
|
463
469
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
464
470
|
try {
|
|
465
|
-
await
|
|
471
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
466
472
|
writeManifest(basePath);
|
|
467
473
|
appendEvent(basePath, {
|
|
468
474
|
cmd: "plan-slice",
|
|
@@ -4,7 +4,7 @@ import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
|
4
4
|
import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning } from "../gsd-db.js";
|
|
5
5
|
import { invalidateStateCache } from "../state.js";
|
|
6
6
|
import { renderTaskPlanFromDb } from "../markdown-renderer.js";
|
|
7
|
-
import {
|
|
7
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -142,7 +142,7 @@ export async function handlePlanTask(
|
|
|
142
142
|
|
|
143
143
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
144
144
|
try {
|
|
145
|
-
await
|
|
145
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
146
146
|
writeManifest(basePath);
|
|
147
147
|
appendEvent(basePath, {
|
|
148
148
|
cmd: "plan-task",
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "../gsd-db.js";
|
|
17
17
|
import { invalidateStateCache } from "../state.js";
|
|
18
18
|
import { renderRoadmapFromDb, renderAssessmentFromDb } from "../markdown-renderer.js";
|
|
19
|
-
import {
|
|
19
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
20
20
|
import { writeManifest } from "../workflow-manifest.js";
|
|
21
21
|
import { appendEvent } from "../workflow-events.js";
|
|
22
22
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -306,7 +306,7 @@ export async function handleReassessRoadmap(
|
|
|
306
306
|
|
|
307
307
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
308
308
|
try {
|
|
309
|
-
await
|
|
309
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
310
310
|
writeManifest(basePath);
|
|
311
311
|
appendEvent(basePath, {
|
|
312
312
|
cmd: "reassess-roadmap",
|
|
@@ -10,17 +10,12 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import {
|
|
13
|
-
getMilestone,
|
|
14
13
|
getMilestoneSlices,
|
|
15
14
|
getSliceTasks,
|
|
16
|
-
|
|
17
|
-
updateSliceStatus,
|
|
18
|
-
updateTaskStatus,
|
|
19
|
-
transaction,
|
|
15
|
+
reopenMilestoneCascade,
|
|
20
16
|
} from "../gsd-db.js";
|
|
21
17
|
import { invalidateStateCache } from "../state.js";
|
|
22
|
-
import {
|
|
23
|
-
import { renderAllProjections } from "../workflow-projections.js";
|
|
18
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
24
19
|
import { writeManifest } from "../workflow-manifest.js";
|
|
25
20
|
import { appendEvent } from "../workflow-events.js";
|
|
26
21
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -53,40 +48,18 @@ export async function handleReopenMilestone(
|
|
|
53
48
|
return { error: "milestoneId is required and must be a non-empty string" };
|
|
54
49
|
}
|
|
55
50
|
|
|
56
|
-
// ──
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
guardError = `milestone not found: ${params.milestoneId}`;
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (!isClosedStatus(milestone.status)) {
|
|
68
|
-
guardError = `milestone ${params.milestoneId} is not closed (status: ${milestone.status}) — nothing to reopen`;
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
reopenMilestoneStatus(params.milestoneId);
|
|
73
|
-
|
|
74
|
-
const slices = getMilestoneSlices(params.milestoneId);
|
|
75
|
-
slicesResetCount = slices.length;
|
|
76
|
-
|
|
77
|
-
for (const slice of slices) {
|
|
78
|
-
updateSliceStatus(params.milestoneId, slice.id, "in_progress");
|
|
79
|
-
const tasks = getSliceTasks(params.milestoneId, slice.id);
|
|
80
|
-
tasksResetCount += tasks.length;
|
|
81
|
-
for (const task of tasks) {
|
|
82
|
-
updateTaskStatus(params.milestoneId, slice.id, task.id, "pending");
|
|
83
|
-
}
|
|
51
|
+
// ── Atomic reopen cascade (guards + writes in one transaction) ───────────
|
|
52
|
+
const outcome = reopenMilestoneCascade(params.milestoneId);
|
|
53
|
+
if (!outcome.ok) {
|
|
54
|
+
switch (outcome.reason) {
|
|
55
|
+
case "milestone-not-found":
|
|
56
|
+
return { error: `milestone not found: ${params.milestoneId}` };
|
|
57
|
+
case "milestone-not-closed":
|
|
58
|
+
return { error: `milestone ${params.milestoneId} is not closed (status: ${outcome.status}) — nothing to reopen` };
|
|
84
59
|
}
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
if (guardError) {
|
|
88
|
-
return { error: guardError };
|
|
89
60
|
}
|
|
61
|
+
const slicesResetCount = outcome.slicesReset;
|
|
62
|
+
const tasksResetCount = outcome.tasksReset;
|
|
90
63
|
|
|
91
64
|
// ── Invalidate caches ────────────────────────────────────────────────────
|
|
92
65
|
invalidateStateCache();
|
|
@@ -125,7 +98,7 @@ export async function handleReopenMilestone(
|
|
|
125
98
|
|
|
126
99
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
127
100
|
try {
|
|
128
|
-
await
|
|
101
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
129
102
|
writeManifest(basePath);
|
|
130
103
|
appendEvent(basePath, {
|
|
131
104
|
cmd: "reopen-milestone",
|
|
@@ -12,16 +12,11 @@
|
|
|
12
12
|
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
13
13
|
|
|
14
14
|
import {
|
|
15
|
-
getMilestone,
|
|
16
|
-
getSlice,
|
|
17
15
|
getSliceTasks,
|
|
18
|
-
|
|
19
|
-
updateTaskStatus,
|
|
20
|
-
transaction,
|
|
16
|
+
reopenSliceCascade,
|
|
21
17
|
} from "../gsd-db.js";
|
|
22
18
|
import { invalidateStateCache } from "../state.js";
|
|
23
|
-
import {
|
|
24
|
-
import { renderAllProjections } from "../workflow-projections.js";
|
|
19
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
25
20
|
import { writeManifest } from "../workflow-manifest.js";
|
|
26
21
|
import { appendEvent } from "../workflow-events.js";
|
|
27
22
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -57,44 +52,21 @@ export async function handleReopenSlice(
|
|
|
57
52
|
return { error: "milestoneId is required and must be a non-empty string" };
|
|
58
53
|
}
|
|
59
54
|
|
|
60
|
-
// ──
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const slice = getSlice(params.milestoneId, params.sliceId);
|
|
76
|
-
if (!slice) {
|
|
77
|
-
guardError = `slice not found: ${params.milestoneId}/${params.sliceId}`;
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (!isClosedStatus(slice.status)) {
|
|
81
|
-
guardError = `slice ${params.sliceId} is not complete (status: ${slice.status}) — nothing to reopen`;
|
|
82
|
-
return;
|
|
55
|
+
// ── Atomic reopen cascade (guards + writes in one transaction) ───────────
|
|
56
|
+
const outcome = reopenSliceCascade(params.milestoneId, params.sliceId);
|
|
57
|
+
if (!outcome.ok) {
|
|
58
|
+
switch (outcome.reason) {
|
|
59
|
+
case "milestone-not-found":
|
|
60
|
+
return { error: `milestone not found: ${params.milestoneId}` };
|
|
61
|
+
case "milestone-closed":
|
|
62
|
+
return { error: `cannot reopen slice in a closed milestone: ${params.milestoneId} (status: ${outcome.status})` };
|
|
63
|
+
case "slice-not-found":
|
|
64
|
+
return { error: `slice not found: ${params.milestoneId}/${params.sliceId}` };
|
|
65
|
+
case "slice-not-complete":
|
|
66
|
+
return { error: `slice ${params.sliceId} is not complete (status: ${outcome.status}) — nothing to reopen` };
|
|
83
67
|
}
|
|
84
|
-
|
|
85
|
-
// Fetch tasks inside txn so the list is consistent with the slice status check
|
|
86
|
-
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
87
|
-
tasksResetCount = tasks.length;
|
|
88
|
-
|
|
89
|
-
updateSliceStatus(params.milestoneId, params.sliceId, "in_progress");
|
|
90
|
-
for (const task of tasks) {
|
|
91
|
-
updateTaskStatus(params.milestoneId, params.sliceId, task.id, "pending");
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
if (guardError) {
|
|
96
|
-
return { error: guardError };
|
|
97
68
|
}
|
|
69
|
+
const tasksResetCount = outcome.tasksReset;
|
|
98
70
|
|
|
99
71
|
// ── Invalidate caches ────────────────────────────────────────────────────
|
|
100
72
|
invalidateStateCache();
|
|
@@ -125,7 +97,7 @@ export async function handleReopenSlice(
|
|
|
125
97
|
|
|
126
98
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
127
99
|
try {
|
|
128
|
-
await
|
|
100
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
129
101
|
writeManifest(basePath);
|
|
130
102
|
appendEvent(basePath, {
|
|
131
103
|
cmd: "reopen-slice",
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
} from "../gsd-db.js";
|
|
20
20
|
import { invalidateStateCache } from "../state.js";
|
|
21
21
|
import { isClosedStatus } from "../status-guards.js";
|
|
22
|
-
import {
|
|
22
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
23
23
|
import { writeManifest } from "../workflow-manifest.js";
|
|
24
24
|
import { appendEvent } from "../workflow-events.js";
|
|
25
25
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -119,7 +119,7 @@ export async function handleReopenTask(
|
|
|
119
119
|
|
|
120
120
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
121
121
|
try {
|
|
122
|
-
await
|
|
122
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
123
123
|
writeManifest(basePath);
|
|
124
124
|
appendEvent(basePath, {
|
|
125
125
|
cmd: "reopen-task",
|
|
@@ -13,7 +13,7 @@ import { invalidateStateCache } from "../state.js";
|
|
|
13
13
|
import { isClosedStatus } from "../status-guards.js";
|
|
14
14
|
import { isNonEmptyString } from "../validation.js";
|
|
15
15
|
import { renderPlanFromDb, renderReplanFromDb } from "../markdown-renderer.js";
|
|
16
|
-
import {
|
|
16
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
17
17
|
import { writeManifest } from "../workflow-manifest.js";
|
|
18
18
|
import { appendEvent } from "../workflow-events.js";
|
|
19
19
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -216,7 +216,7 @@ export async function handleReplanSlice(
|
|
|
216
216
|
|
|
217
217
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
218
218
|
try {
|
|
219
|
-
await
|
|
219
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
220
220
|
writeManifest(basePath);
|
|
221
221
|
appendEvent(basePath, {
|
|
222
222
|
cmd: "replan-slice",
|