@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
|
@@ -6,7 +6,11 @@ import assert from "node:assert/strict";
|
|
|
6
6
|
|
|
7
7
|
import { classifyFailure } from "../recovery-classification.js";
|
|
8
8
|
import { reconcileBeforeDispatch } from "../state-reconciliation.js";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
compileUnitContextContract,
|
|
11
|
+
compileUnitToolContract,
|
|
12
|
+
getUnitWorkflowDispatchReadinessError,
|
|
13
|
+
} from "../tool-contract.js";
|
|
10
14
|
import { shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
11
15
|
import type { GSDState } from "../types.js";
|
|
12
16
|
|
|
@@ -87,6 +91,20 @@ test("Tool Contract compiles known Unit prompt and tool policy", () => {
|
|
|
87
91
|
});
|
|
88
92
|
});
|
|
89
93
|
|
|
94
|
+
test("Tool Contract derives dispatch readiness from Unit workflow tools", () => {
|
|
95
|
+
const error = getUnitWorkflowDispatchReadinessError({
|
|
96
|
+
provider: "claude-code",
|
|
97
|
+
unitType: "plan-slice",
|
|
98
|
+
projectRoot: "/tmp/project",
|
|
99
|
+
env: { GSD_WORKFLOW_MCP_COMMAND: "node" },
|
|
100
|
+
surface: "auto-mode",
|
|
101
|
+
authMode: "externalCli",
|
|
102
|
+
baseUrl: "local://claude-code",
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
assert.equal(error, null);
|
|
106
|
+
});
|
|
107
|
+
|
|
90
108
|
test("Unit Context Contract exposes prompt context without workflow tool surface", () => {
|
|
91
109
|
const result = compileUnitContextContract("execute-task");
|
|
92
110
|
|
|
@@ -164,6 +182,7 @@ test("Recovery Classification covers ADR-015 failure families", () => {
|
|
|
164
182
|
const cases = [
|
|
165
183
|
["invalid tool schema enum", "tool-schema", "stop"],
|
|
166
184
|
["Tool Contract failure: complete-slice cannot use gsd_uat_result_save", "tool-contract", "stop"],
|
|
185
|
+
["No such tool available: mcp__gsd-workflow__gsd_uat_exec", "tool-unavailable", "retry"],
|
|
167
186
|
["deterministic policy rejection", "deterministic-policy", "stop"],
|
|
168
187
|
["cannot legally advance because required UAT Assessment artifact is missing", "lifecycle-progression", "stop"],
|
|
169
188
|
["stale worker lease", "stale-worker", "stop"],
|
|
@@ -266,3 +266,41 @@ test("safety-harness: planned changed file avoids unexpected-file warning", (t)
|
|
|
266
266
|
assert.deepEqual(audit!.unexpectedFiles, [], "planned index.html must not be unexpected");
|
|
267
267
|
assert.deepEqual(audit!.missingFiles, [], "planned index.html must not be missing");
|
|
268
268
|
});
|
|
269
|
+
|
|
270
|
+
// ─── External engine evidence (claude-code-cli pre-executed tools) ──────────
|
|
271
|
+
// External engines skip beforeToolCall/tool_call, so register-hooks.ts records
|
|
272
|
+
// evidence at tool_execution_start instead. These tests lock the collector
|
|
273
|
+
// semantics that wiring relies on: idempotent recording by toolCallId, and
|
|
274
|
+
// capitalized external tool names (Bash/Write/Edit) being recognized.
|
|
275
|
+
|
|
276
|
+
test("safety-harness: recordToolCall is idempotent by toolCallId", () => {
|
|
277
|
+
resetEvidence();
|
|
278
|
+
|
|
279
|
+
// Native tools fire tool_execution_start AND tool_call — both record.
|
|
280
|
+
recordToolCall("tc-dup-1", "bash", { command: "npm test" });
|
|
281
|
+
recordToolCall("tc-dup-1", "bash", { command: "npm test" });
|
|
282
|
+
|
|
283
|
+
assert.equal(getEvidence().length, 1, "same toolCallId must not duplicate");
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("safety-harness: external capitalized Bash call records and resolves evidence", () => {
|
|
287
|
+
resetEvidence();
|
|
288
|
+
|
|
289
|
+
// tool_execution_start with Claude Code's native tool name
|
|
290
|
+
recordToolCall("ext-bash-1", "Bash", { command: "node /tmp/t01-verify.mjs" });
|
|
291
|
+
const entries = getEvidence().filter((e): e is BashEvidence => e.kind === "bash");
|
|
292
|
+
assert.equal(entries.length, 1, "capitalized Bash must be recognized as execution tool");
|
|
293
|
+
assert.equal(entries[0]!.command, "node /tmp/t01-verify.mjs");
|
|
294
|
+
|
|
295
|
+
// tool_execution_end fills the result
|
|
296
|
+
recordToolResult("ext-bash-1", "Bash", { content: [{ type: "text", text: "13 checks passed" }] }, false);
|
|
297
|
+
assert.equal(entries[0]!.exitCode, 0, "non-error external result resolves to exitCode 0");
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
test("safety-harness: external Write call records file evidence", () => {
|
|
301
|
+
resetEvidence();
|
|
302
|
+
|
|
303
|
+
recordToolCall("ext-write-1", "Write", { file_path: "/tmp/app/index.html" });
|
|
304
|
+
const writes = getEvidence().filter((e) => e.kind === "write");
|
|
305
|
+
assert.equal(writes.length, 1, "capitalized Write must record file evidence");
|
|
306
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// gsd-pi — A fresh conversation (/clear, /new) must clear pending auto-start.
|
|
2
|
+
//
|
|
3
|
+
// The discuss→auto handoff entry lives in-memory and is consumed on agent_end
|
|
4
|
+
// of the live interview. Once the milestone CONTEXT artifact is saved, the
|
|
5
|
+
// guided-flow staleness heuristic (which requires the CONTEXT file to be
|
|
6
|
+
// absent) can never fire — so a discussion interrupted by /clear left an
|
|
7
|
+
// immortal entry and every subsequent /gsd dead-ended on "Discussion already
|
|
8
|
+
// in progress — answer the question above" with no question above.
|
|
9
|
+
//
|
|
10
|
+
// session_switch with reason "new" means the conversation that contained the
|
|
11
|
+
// interview is gone; the entry must go with it. Reason "resume" restores the
|
|
12
|
+
// interview transcript, so the entry must survive.
|
|
13
|
+
|
|
14
|
+
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
15
|
+
import assert from "node:assert/strict";
|
|
16
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { tmpdir } from "node:os";
|
|
19
|
+
|
|
20
|
+
import { registerHooks } from "../bootstrap/register-hooks.ts";
|
|
21
|
+
import {
|
|
22
|
+
setPendingAutoStart,
|
|
23
|
+
clearPendingAutoStart,
|
|
24
|
+
_getPendingAutoStart,
|
|
25
|
+
} from "../pending-auto-start.ts";
|
|
26
|
+
|
|
27
|
+
function makeProjectDir(): string {
|
|
28
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-session-switch-pas-"));
|
|
29
|
+
const milestoneDir = join(dir, ".gsd", "milestones", "M001");
|
|
30
|
+
mkdirSync(milestoneDir, { recursive: true });
|
|
31
|
+
// The post-CONTEXT state that made the entry immortal before the fix.
|
|
32
|
+
writeFileSync(join(milestoneDir, "M001-CONTEXT.md"), "# M001 Context\n");
|
|
33
|
+
return dir;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function fakeCtx(base: string): any {
|
|
37
|
+
return {
|
|
38
|
+
cwd: base,
|
|
39
|
+
ui: {
|
|
40
|
+
notify: () => undefined,
|
|
41
|
+
setWidget: () => undefined,
|
|
42
|
+
setStatus: () => undefined,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function armPendingAutoStart(base: string): void {
|
|
48
|
+
setPendingAutoStart(base, {
|
|
49
|
+
basePath: base,
|
|
50
|
+
milestoneId: "M001",
|
|
51
|
+
ctx: { ui: { notify: () => undefined } } as any,
|
|
52
|
+
pi: { sendMessage: () => undefined } as any,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
describe("session_switch clears pending auto-start on conversation reset", () => {
|
|
57
|
+
let base: string;
|
|
58
|
+
const handlers = new Map<string, Function>();
|
|
59
|
+
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
clearPendingAutoStart();
|
|
62
|
+
base = makeProjectDir();
|
|
63
|
+
handlers.clear();
|
|
64
|
+
registerHooks({ on(event: string, handler: Function) { handlers.set(event, handler); } } as any, []);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
afterEach(() => {
|
|
68
|
+
clearPendingAutoStart();
|
|
69
|
+
rmSync(base, { recursive: true, force: true });
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
async function fireSessionSwitch(reason: "new" | "resume"): Promise<void> {
|
|
73
|
+
const handler = handlers.get("session_switch");
|
|
74
|
+
assert.ok(handler, "session_switch handler should be registered");
|
|
75
|
+
try {
|
|
76
|
+
await handler({ type: "session_switch", reason, previousSessionFile: undefined }, fakeCtx(base));
|
|
77
|
+
} catch {
|
|
78
|
+
// The handler also performs session plumbing (MCP prep, service tier
|
|
79
|
+
// sync) that may throw against the minimal fake ctx. Pending auto-start
|
|
80
|
+
// is cleared before that plumbing runs, so the assertions below remain
|
|
81
|
+
// valid either way.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
it('reason "new" (/clear, /new) drops the entry even after CONTEXT was saved', async () => {
|
|
86
|
+
armPendingAutoStart(base);
|
|
87
|
+
assert.ok(_getPendingAutoStart(base), "entry should be armed");
|
|
88
|
+
|
|
89
|
+
await fireSessionSwitch("new");
|
|
90
|
+
|
|
91
|
+
assert.equal(
|
|
92
|
+
_getPendingAutoStart(base),
|
|
93
|
+
null,
|
|
94
|
+
"a fresh conversation destroyed the interview — the handoff entry must not outlive it",
|
|
95
|
+
);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('reason "resume" keeps the entry (the interview transcript is restored)', async () => {
|
|
99
|
+
armPendingAutoStart(base);
|
|
100
|
+
|
|
101
|
+
await fireSessionSwitch("resume");
|
|
102
|
+
|
|
103
|
+
assert.ok(
|
|
104
|
+
_getPendingAutoStart(base),
|
|
105
|
+
"resuming restores the interview — the in-flight handoff must survive",
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
@@ -24,10 +24,24 @@ import { join, relative } from "node:path";
|
|
|
24
24
|
|
|
25
25
|
const gsdDir = join(process.cwd(), "src/resources/extensions/gsd");
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
// The single-writer invariant is enforced on a directory layer, not a single
|
|
28
|
+
// filename. Write SQL may live only in:
|
|
29
|
+
// - db/engine.ts — connection lifecycle, schema/migrations (DDL), and the
|
|
30
|
+
// BEGIN/COMMIT transaction primitives. The shared handle every writer reads.
|
|
31
|
+
// - db/writers/**.ts — the Single Writer Layer: one cohesive write subsystem
|
|
32
|
+
// per file (hierarchy, memory, gates, escalation, reconcile, manifest,
|
|
33
|
+
// legacy-import, cascades).
|
|
34
|
+
// - gsd-db.ts — the barrel that re-exports the layer (still holds wrappers
|
|
35
|
+
// mid-migration).
|
|
36
|
+
// - unit-ownership.ts — a separate .gsd/unit-claims.db, intentionally outside.
|
|
37
|
+
// db/queries.ts is explicitly NOT allowed write SQL (asserted separately below).
|
|
38
|
+
function isSingleWriterFile(rel: string): boolean {
|
|
39
|
+
const norm = rel.split("\\").join("/");
|
|
40
|
+
if (norm === "gsd-db.ts" || norm === "unit-ownership.ts") return true;
|
|
41
|
+
if (norm === "db/engine.ts") return true;
|
|
42
|
+
if (norm.startsWith("db/writers/") && norm.endsWith(".ts")) return true;
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
31
45
|
|
|
32
46
|
/** Walk the gsd extension dir and return all .ts files outside tests/. */
|
|
33
47
|
function walkTsFiles(root: string): string[] {
|
|
@@ -106,8 +120,7 @@ test("no module outside gsd-db.ts issues raw write SQL against the engine DB", (
|
|
|
106
120
|
|
|
107
121
|
for (const abs of files) {
|
|
108
122
|
const rel = relative(gsdDir, abs);
|
|
109
|
-
|
|
110
|
-
if (ALLOWLIST.has(base)) continue;
|
|
123
|
+
if (isSingleWriterFile(rel)) continue;
|
|
111
124
|
|
|
112
125
|
let content: string;
|
|
113
126
|
try {
|
|
@@ -154,6 +167,30 @@ test("no module outside gsd-db.ts issues raw write SQL against the engine DB", (
|
|
|
154
167
|
}
|
|
155
168
|
});
|
|
156
169
|
|
|
170
|
+
test("db/queries.ts (the Query Module) is read-only — contains no write SQL", () => {
|
|
171
|
+
// The read seam is separate from the single-writer layer. queries.ts holds
|
|
172
|
+
// SELECT-only wrappers so read-only callers depend on a read seam, not the
|
|
173
|
+
// write surface. (test 1 above also forbids this, since queries.ts is not in
|
|
174
|
+
// db/writers/ — this is the explicit, positive statement of intent.)
|
|
175
|
+
const queriesPath = join(gsdDir, "db", "queries.ts");
|
|
176
|
+
const content = readFileSync(queriesPath, "utf-8");
|
|
177
|
+
const lines = content.split("\n");
|
|
178
|
+
const violations: Violation[] = [];
|
|
179
|
+
for (let i = 0; i < lines.length; i++) {
|
|
180
|
+
const line = lines[i];
|
|
181
|
+
const m = PREPARE_WRITE_RE.exec(line) ?? EXEC_WRITE_RE.exec(line);
|
|
182
|
+
if (m) {
|
|
183
|
+
violations.push({ file: "db/queries.ts", line: i + 1, snippet: line.trim(), kind: m[1].toUpperCase() });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
assert.equal(
|
|
187
|
+
violations.length,
|
|
188
|
+
0,
|
|
189
|
+
`db/queries.ts must contain no write SQL — move write wrappers to db/writers/:\n` +
|
|
190
|
+
violations.map((v) => ` db/queries.ts:${v.line} [${v.kind}] — ${v.snippet}`).join("\n"),
|
|
191
|
+
);
|
|
192
|
+
});
|
|
193
|
+
|
|
157
194
|
test("gsd-db.ts exports the expected single-writer wrappers", async () => {
|
|
158
195
|
// Positive assertion — fail loudly if the module layout changes so this
|
|
159
196
|
// structural test can't silently become a no-op.
|
|
@@ -5,6 +5,8 @@ import {
|
|
|
5
5
|
STATE_TRANSITION_MATRIX,
|
|
6
6
|
findTransition,
|
|
7
7
|
validateTransitionMatrix,
|
|
8
|
+
isLegalEdge,
|
|
9
|
+
IllegalPhaseTransitionError,
|
|
8
10
|
} from "../state-transition-matrix.ts";
|
|
9
11
|
|
|
10
12
|
test("state transition matrix covers required swarm hardening events", () => {
|
|
@@ -42,3 +44,37 @@ test("state transition matrix entries all have guard and reason codes", () => {
|
|
|
42
44
|
assert.ok(entry.reasonCode.length > 0, `${entry.event} must include reason code`);
|
|
43
45
|
}
|
|
44
46
|
});
|
|
47
|
+
|
|
48
|
+
// ─── ADR-030: Phase Transition Invariant ───────────────────────────────────
|
|
49
|
+
|
|
50
|
+
test("isLegalEdge treats a self-edge as trivially legal", () => {
|
|
51
|
+
assert.equal(isLegalEdge("executing", "executing"), true);
|
|
52
|
+
assert.equal(isLegalEdge("planning", "planning"), true);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("isLegalEdge accepts edges enumerated in the matrix", () => {
|
|
56
|
+
assert.equal(isLegalEdge("planning", "executing"), true);
|
|
57
|
+
assert.equal(isLegalEdge("executing", "summarizing"), true);
|
|
58
|
+
assert.equal(isLegalEdge("summarizing", "validating-milestone"), true);
|
|
59
|
+
assert.equal(isLegalEdge("completing-milestone", "complete"), true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test("isLegalEdge honors the * wildcard rows (any -> blocked, any -> executing)", () => {
|
|
63
|
+
assert.equal(isLegalEdge("planning", "blocked"), true);
|
|
64
|
+
assert.equal(isLegalEdge("summarizing", "executing"), true);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("isLegalEdge rejects an edge no matrix entry permits", () => {
|
|
68
|
+
// executing -> complete skips validation — exactly the illegal jump the
|
|
69
|
+
// invariant exists to catch.
|
|
70
|
+
assert.equal(isLegalEdge("executing", "complete"), false);
|
|
71
|
+
assert.equal(isLegalEdge("planning", "summarizing"), false);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("IllegalPhaseTransitionError carries both endpoints and a descriptive message", () => {
|
|
75
|
+
const err = new IllegalPhaseTransitionError("executing", "complete");
|
|
76
|
+
assert.equal(err.from, "executing");
|
|
77
|
+
assert.equal(err.to, "complete");
|
|
78
|
+
assert.equal(err.name, "IllegalPhaseTransitionError");
|
|
79
|
+
assert.match(err.message, /executing -> complete/);
|
|
80
|
+
});
|
|
@@ -9,7 +9,10 @@ import {
|
|
|
9
9
|
isDeferredStatus,
|
|
10
10
|
isInactiveStatus,
|
|
11
11
|
isSkippedForDispatch,
|
|
12
|
+
toStatus,
|
|
13
|
+
RAW_CLOSED_STATUSES,
|
|
12
14
|
} from '../status-guards.ts';
|
|
15
|
+
import { TERMINAL_STATUS_SQL } from '../db/sql-constants.ts';
|
|
13
16
|
|
|
14
17
|
test('isClosedStatus: "complete" returns true', () => {
|
|
15
18
|
assert.equal(isClosedStatus('complete'), true);
|
|
@@ -95,3 +98,38 @@ test('isSkippedForDispatch does NOT skip pending/active/planned', () => {
|
|
|
95
98
|
assert.equal(isSkippedForDispatch(s), false, `${s} should block dispatch ordering`);
|
|
96
99
|
}
|
|
97
100
|
});
|
|
101
|
+
|
|
102
|
+
// ─── ADR-030: canonical Status vocabulary + normalization ──────────────────
|
|
103
|
+
|
|
104
|
+
test('toStatus passes canonical values through unchanged', () => {
|
|
105
|
+
for (const s of ['pending', 'queued', 'active', 'parked', 'in_progress', 'blocked', 'complete', 'skipped', 'deferred']) {
|
|
106
|
+
assert.equal(toStatus(s), s, `${s} is canonical and should be returned verbatim`);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test('toStatus maps known aliases to canonical', () => {
|
|
111
|
+
assert.equal(toStatus('done'), 'complete');
|
|
112
|
+
assert.equal(toStatus('closed'), 'complete');
|
|
113
|
+
assert.equal(toStatus('planned'), 'pending');
|
|
114
|
+
assert.equal(toStatus('in-progress'), 'in_progress');
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('toStatus trims surrounding whitespace before matching', () => {
|
|
118
|
+
assert.equal(toStatus(' complete '), 'complete');
|
|
119
|
+
assert.equal(toStatus(' done '), 'complete');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('toStatus quarantines unknown values verbatim (tolerant read, no throw)', () => {
|
|
123
|
+
assert.equal(toStatus('weird-legacy-value'), 'weird-legacy-value');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
test('RAW_CLOSED_STATUSES is the single source: every member is closed', () => {
|
|
127
|
+
for (const s of RAW_CLOSED_STATUSES) {
|
|
128
|
+
assert.equal(isClosedStatus(s), true, `${s} is in RAW_CLOSED_STATUSES so must be closed`);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('TERMINAL_STATUS_SQL is derived from RAW_CLOSED_STATUSES and renders identically', () => {
|
|
133
|
+
assert.equal(TERMINAL_STATUS_SQL, "'complete', 'done', 'skipped', 'closed'");
|
|
134
|
+
assert.equal(TERMINAL_STATUS_SQL, RAW_CLOSED_STATUSES.map((s) => `'${s}'`).join(', '));
|
|
135
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// GSD Extension — Stop Notice module tests
|
|
2
|
+
// Locks the emitter↔detector round-trip: every notice the formatters produce
|
|
3
|
+
// must be recognized by the classifiers the headless host uses for exit codes.
|
|
4
|
+
|
|
5
|
+
import { describe, test } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
formatStopNoticePrefix,
|
|
10
|
+
isBlockedStopReason,
|
|
11
|
+
stopNoticeDisplayReason,
|
|
12
|
+
stopNoticeKind,
|
|
13
|
+
isTerminalNotice,
|
|
14
|
+
isPauseNotice,
|
|
15
|
+
isBlockedNoticeMessage,
|
|
16
|
+
isManualResolutionNotice,
|
|
17
|
+
PAUSED_NOTICE_PREFIXES,
|
|
18
|
+
TERMINAL_NOTICE_PREFIXES,
|
|
19
|
+
} from "../stop-notice.js";
|
|
20
|
+
|
|
21
|
+
describe("stop notice formatting", () => {
|
|
22
|
+
test("plain stop has no reason suffix", () => {
|
|
23
|
+
assert.equal(formatStopNoticePrefix(), "Auto-mode stopped");
|
|
24
|
+
assert.equal(formatStopNoticePrefix(null), "Auto-mode stopped");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("reason is appended after an em-dash", () => {
|
|
28
|
+
assert.equal(formatStopNoticePrefix("user request"), "Auto-mode stopped — user request");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("Blocked: marker switches the prefix and is stripped from display", () => {
|
|
32
|
+
assert.equal(formatStopNoticePrefix("Blocked: validation gate"), "Auto-mode blocked — validation gate");
|
|
33
|
+
assert.equal(stopNoticeKind("Blocked: x"), "blocked");
|
|
34
|
+
assert.equal(stopNoticeKind("stop"), "stopped");
|
|
35
|
+
assert.ok(isBlockedStopReason("blocked: lowercase too"));
|
|
36
|
+
assert.equal(stopNoticeDisplayReason("Blocked: spaced "), "spaced");
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("emitter↔detector round-trip", () => {
|
|
41
|
+
test("formatted stop notices classify as terminal", () => {
|
|
42
|
+
for (const reason of [undefined, "user request"]) {
|
|
43
|
+
const message = formatStopNoticePrefix(reason).toLowerCase();
|
|
44
|
+
assert.ok(isTerminalNotice(message), `not terminal: ${message}`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("pause prefixes classify as pause and as blocked (operator intervention)", () => {
|
|
49
|
+
for (const prefix of PAUSED_NOTICE_PREFIXES) {
|
|
50
|
+
assert.ok(isPauseNotice(`${prefix}: provider error`));
|
|
51
|
+
assert.ok(isBlockedNoticeMessage(`${prefix}: provider error`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("idempotent-advance pauses are non-blocking", () => {
|
|
56
|
+
assert.equal(isBlockedNoticeMessage("auto-mode paused (idempotent advance: unit already active)"), false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("manual-resolution notices classify as blocked", () => {
|
|
60
|
+
const message = "merge conflict — resolve manually and re-run /gsd auto";
|
|
61
|
+
assert.ok(isManualResolutionNotice(message));
|
|
62
|
+
assert.ok(isBlockedNoticeMessage(message));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("terminal prefixes cover the known stop vocabulary", () => {
|
|
66
|
+
for (const message of ["auto-mode stopped.", "auto-mode complete", "auto-mode idle", "no active milestone"]) {
|
|
67
|
+
assert.ok(TERMINAL_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix)), message);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
@@ -159,4 +159,21 @@ describe("teardown chdir failure clears registry", () => {
|
|
|
159
159
|
assert.strictEqual(getAutoWorktreeOriginalBase(), null, "registry null after successful teardown");
|
|
160
160
|
assert.strictEqual(getActiveAutoWorktreeContext(), null, "context null after successful teardown");
|
|
161
161
|
});
|
|
162
|
+
|
|
163
|
+
test("teardown survives when current working directory was deleted", () => {
|
|
164
|
+
repoDir = createTempRepo();
|
|
165
|
+
seedMilestone(repoDir, "M003");
|
|
166
|
+
|
|
167
|
+
const worktreePath = createAutoWorktree(repoDir, "M003");
|
|
168
|
+
process.chdir(worktreePath);
|
|
169
|
+
rmSync(worktreePath, { recursive: true, force: true });
|
|
170
|
+
|
|
171
|
+
assert.doesNotThrow(
|
|
172
|
+
() => teardownAutoWorktree(repoDir, "M003"),
|
|
173
|
+
"teardownAutoWorktree should not call process.cwd() unguarded from a deleted cwd",
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
assert.strictEqual(getAutoWorktreeOriginalBase(), null, "registry null after deleted-cwd teardown");
|
|
177
|
+
assert.strictEqual(getActiveAutoWorktreeContext(), null, "context null after deleted-cwd teardown");
|
|
178
|
+
});
|
|
162
179
|
});
|
|
@@ -10,6 +10,7 @@ import { DISCUSS_TOOLS_ALLOWLIST } from "../constants.ts";
|
|
|
10
10
|
import { buildMinimalAutoGsdToolSet, buildMinimalGsdToolSet, buildMinimalGsdWorkflowToolSet, buildRequestScopedGsdToolSet, MINIMAL_AUTO_BASE_TOOL_NAMES, MINIMAL_GSD_TOOL_NAMES, requestHasGsdCustomType, restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch } from "../bootstrap/register-hooks.ts";
|
|
11
11
|
import { filterToolsForProvider } from "../model-router.ts";
|
|
12
12
|
import { applyUnitSkillVisibility } from "../skill-scope.ts";
|
|
13
|
+
import { drainLogs } from "../workflow-logger.ts";
|
|
13
14
|
|
|
14
15
|
test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surface", () => {
|
|
15
16
|
const result = buildMinimalGsdToolSet([
|
|
@@ -17,6 +18,7 @@ test("buildMinimalGsdToolSet preserves non-GSD tools and replaces broad GSD surf
|
|
|
17
18
|
"read",
|
|
18
19
|
"browser_open",
|
|
19
20
|
"gsd_plan_milestone",
|
|
21
|
+
"gsd_plan_slice",
|
|
20
22
|
"gsd_task_complete",
|
|
21
23
|
"gsd_exec",
|
|
22
24
|
"gsd_exec_search",
|
|
@@ -103,6 +105,40 @@ test("buildMinimalAutoGsdToolSet keeps unit-specific completion tools without al
|
|
|
103
105
|
assert.ok(!result.includes("gsd_complete_slice"));
|
|
104
106
|
});
|
|
105
107
|
|
|
108
|
+
test("buildMinimalAutoGsdToolSet warns when plan-milestone required tools are unresolved", () => {
|
|
109
|
+
drainLogs();
|
|
110
|
+
const result = buildMinimalAutoGsdToolSet(
|
|
111
|
+
[
|
|
112
|
+
"ask_user_questions",
|
|
113
|
+
"bash",
|
|
114
|
+
"read",
|
|
115
|
+
"gsd_milestone_status",
|
|
116
|
+
"gsd_plan_milestone",
|
|
117
|
+
],
|
|
118
|
+
"plan-milestone",
|
|
119
|
+
[
|
|
120
|
+
"ask_user_questions",
|
|
121
|
+
"bash",
|
|
122
|
+
"read",
|
|
123
|
+
"gsd_milestone_status",
|
|
124
|
+
"gsd_plan_milestone",
|
|
125
|
+
],
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
assert.ok(result.includes("gsd_plan_milestone"));
|
|
129
|
+
assert.ok(!result.includes("gsd_plan_slice"));
|
|
130
|
+
|
|
131
|
+
const logs = drainLogs();
|
|
132
|
+
assert.ok(
|
|
133
|
+
logs.some((entry) =>
|
|
134
|
+
entry.component === "bootstrap" &&
|
|
135
|
+
entry.message.includes("buildMinimalAutoGsdToolSet(plan-milestone)") &&
|
|
136
|
+
entry.message.includes("gsd_plan_slice")
|
|
137
|
+
),
|
|
138
|
+
`expected missing gsd_plan_slice bootstrap warning, got ${JSON.stringify(logs)}`,
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
|
|
106
142
|
test("buildMinimalAutoGsdToolSet scopes run-uat to UAT-specific and read-only tools", () => {
|
|
107
143
|
const active = ["ask_user_questions", "bash", "read", "edit", "write", "gsd_summary_save"];
|
|
108
144
|
const registered = [
|
|
@@ -613,6 +649,46 @@ test("buildMinimalAutoGsdToolSet resolves MCP-scoped gsd_memory_query and gsd_ca
|
|
|
613
649
|
);
|
|
614
650
|
});
|
|
615
651
|
|
|
652
|
+
// ── Regression #627: auto-mode cannot run plan-milestone because gsd_plan_slice is missing ──
|
|
653
|
+
// gsd_plan_slice is in AUTO_UNIT_SCOPED_TOOLS["plan-milestone"] (via unit-tool-contracts).
|
|
654
|
+
// buildMinimalAutoGsdToolSet must expose it when unitType is "plan-milestone".
|
|
655
|
+
|
|
656
|
+
test("buildMinimalAutoGsdToolSet includes gsd_plan_slice for plan-milestone (regression #627)", () => {
|
|
657
|
+
const result = buildMinimalAutoGsdToolSet([
|
|
658
|
+
"bash",
|
|
659
|
+
"read",
|
|
660
|
+
"gsd_plan_milestone",
|
|
661
|
+
"gsd_plan_slice",
|
|
662
|
+
"gsd_milestone_status",
|
|
663
|
+
"gsd_checkpoint_db",
|
|
664
|
+
"memory_query",
|
|
665
|
+
"capture_thought",
|
|
666
|
+
], "plan-milestone");
|
|
667
|
+
|
|
668
|
+
assert.ok(
|
|
669
|
+
result.includes("gsd_plan_slice"),
|
|
670
|
+
"gsd_plan_slice must be included in plan-milestone auto-mode tool set",
|
|
671
|
+
);
|
|
672
|
+
});
|
|
673
|
+
|
|
674
|
+
test("buildMinimalAutoGsdToolSet resolves MCP-scoped gsd_plan_slice for plan-milestone when subprocess only registers prefixed variant (regression #627)", () => {
|
|
675
|
+
const result = buildMinimalAutoGsdToolSet([
|
|
676
|
+
"bash",
|
|
677
|
+
"read",
|
|
678
|
+
"mcp__gsd-workflow__gsd_plan_milestone",
|
|
679
|
+
"mcp__gsd-workflow__gsd_plan_slice",
|
|
680
|
+
"mcp__gsd-workflow__gsd_milestone_status",
|
|
681
|
+
"mcp__gsd-workflow__gsd_checkpoint_db",
|
|
682
|
+
"mcp__gsd-workflow__memory_query",
|
|
683
|
+
"mcp__gsd-workflow__capture_thought",
|
|
684
|
+
], "plan-milestone");
|
|
685
|
+
|
|
686
|
+
assert.ok(
|
|
687
|
+
result.includes("mcp__gsd-workflow__gsd_plan_slice"),
|
|
688
|
+
"mcp__gsd-workflow__gsd_plan_slice must be included when only the MCP-scoped variant is available",
|
|
689
|
+
);
|
|
690
|
+
});
|
|
691
|
+
|
|
616
692
|
test("applyUnitSkillVisibility sets manifest or clears for wildcard", () => {
|
|
617
693
|
const calls: Array<string[] | undefined> = [];
|
|
618
694
|
applyUnitSkillVisibility({
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
isDeterministicPolicyError,
|
|
49
49
|
isPendingUserApprovalGateError,
|
|
50
50
|
isToolInvocationError,
|
|
51
|
+
isToolUnavailableError,
|
|
51
52
|
isQueuedUserMessageSkip,
|
|
52
53
|
} from "../auto-tool-tracking.ts";
|
|
53
54
|
import {
|
|
@@ -121,6 +122,13 @@ describe("#2883: isToolInvocationError classification", () => {
|
|
|
121
122
|
assert.equal(isToolInvocationError("No such tool available: mcp__gsd-workflow__memory_query"), true);
|
|
122
123
|
});
|
|
123
124
|
|
|
125
|
+
test("isToolUnavailableError singles out the startup-race error as transient", () => {
|
|
126
|
+
assert.equal(isToolUnavailableError("No such tool available: mcp__gsd-workflow__gsd_uat_exec"), true);
|
|
127
|
+
assert.equal(isToolUnavailableError("Validation failed for tool gsd_complete_slice"), false);
|
|
128
|
+
assert.equal(isToolUnavailableError("Unexpected end of JSON input"), false);
|
|
129
|
+
assert.equal(isToolUnavailableError(""), false);
|
|
130
|
+
});
|
|
131
|
+
|
|
124
132
|
test("detects ESM export-link errors", () => {
|
|
125
133
|
assert.equal(
|
|
126
134
|
isToolInvocationError("The requested module '../paths.js' does not provide an export named 'gsdProjectionRoot'"),
|