@opengsd/gsd-pi 1.2.0-dev.b1abb545 → 1.2.0-dev.e8563f58
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.js +2 -14
- 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 +8 -3
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +40 -57
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +31 -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-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +9 -28
- package/dist/resources/extensions/gsd/auto-worktree-repair.js +10 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +35 -352
- package/dist/resources/extensions/gsd/auto.js +15 -20
- 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-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 +4 -12
- 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-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 +51 -5
- 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/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/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- 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/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/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-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +44 -53
- package/dist/resources/extensions/gsd/tools/exec-tool.js +10 -8
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +11 -29
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +14 -33
- package/dist/resources/extensions/gsd/tools/skip-slice.js +18 -36
- package/dist/resources/extensions/gsd/tools/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/web-app-uat.js +45 -8
- 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 +45 -28
- package/dist/resources/extensions/gsd/worktree-placement.js +59 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +12 -8
- package/dist/resources/extensions/gsd/worktree-root.js +28 -6
- package/dist/resources/extensions/gsd/worktree-safety.js +8 -5
- package/dist/resources/extensions/gsd/worktree-session-state.js +12 -11
- package/dist/resources/extensions/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/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/gsd-browser/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-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 +8 -8
- 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 +8 -8
- 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 +8 -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 +6 -3
- 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/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 +192 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +166 -0
- 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 +12 -3
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -32
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -52
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +37 -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-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +8 -26
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +13 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +41 -364
- package/src/resources/extensions/gsd/auto.ts +28 -24
- 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-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 +3 -9
- 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-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 +50 -5
- 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/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/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +6 -4
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- 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/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/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 +91 -0
- 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-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/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/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/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/runtime-invariant-modules.test.ts +1 -0
- 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/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/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/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- 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 +2 -2
- 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-presentation-plan.ts +4 -4
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +43 -68
- package/src/resources/extensions/gsd/tools/exec-tool.ts +9 -8
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +11 -38
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +14 -42
- package/src/resources/extensions/gsd/tools/skip-slice.ts +18 -44
- package/src/resources/extensions/gsd/tools/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/web-app-uat.ts +51 -8
- 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 +47 -28
- package/src/resources/extensions/gsd/worktree-placement.ts +63 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +10 -7
- package/src/resources/extensions/gsd/worktree-root.ts +29 -6
- package/src/resources/extensions/gsd/worktree-safety.ts +8 -5
- package/src/resources/extensions/gsd/worktree-session-state.ts +11 -11
- package/src/resources/extensions/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/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/gsd-browser/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- 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/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{3PtrU9qGPEXwNLWkIyiqk → LDHRKiRBIVZmiuMjrL1Vy}/_ssgManifest.js +0 -0
|
@@ -117,7 +117,8 @@ describe("extension bootstrap isolation (#4168, #4172)", () => {
|
|
|
117
117
|
// registration is wrapped in its own try/catch so one failure does not
|
|
118
118
|
// prevent siblings from loading.
|
|
119
119
|
|
|
120
|
-
import { registerGsdExtension } from "../bootstrap/register-extension.ts";
|
|
120
|
+
import { CRITICAL_GSD_WORKFLOW_TOOL_NAMES, registerGsdExtension } from "../bootstrap/register-extension.ts";
|
|
121
|
+
import { drainLogs } from "../workflow-logger.ts";
|
|
121
122
|
|
|
122
123
|
describe("registerGsdExtension defensive registration", () => {
|
|
123
124
|
test("a failing shortcut registration does not prevent kill command registration", async () => {
|
|
@@ -161,4 +162,37 @@ describe("registerGsdExtension defensive registration", () => {
|
|
|
161
162
|
`registerGsdExtension must NOT register 'gsd' (it is registered separately by index.ts), got ${JSON.stringify(registered)}`,
|
|
162
163
|
);
|
|
163
164
|
});
|
|
165
|
+
|
|
166
|
+
test("critical workflow tool list includes lifecycle planning and completion tools", () => {
|
|
167
|
+
assert.ok(CRITICAL_GSD_WORKFLOW_TOOL_NAMES.includes("gsd_plan_slice"));
|
|
168
|
+
assert.ok(CRITICAL_GSD_WORKFLOW_TOOL_NAMES.includes("gsd_slice_complete"));
|
|
169
|
+
assert.ok(CRITICAL_GSD_WORKFLOW_TOOL_NAMES.includes("gsd_validate_milestone"));
|
|
170
|
+
assert.ok(CRITICAL_GSD_WORKFLOW_TOOL_NAMES.includes("gsd_complete_milestone"));
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test("partial db-tools registration fails visibly when critical tools are missing", () => {
|
|
174
|
+
drainLogs();
|
|
175
|
+
const registeredTools: string[] = [];
|
|
176
|
+
const pi = {
|
|
177
|
+
registerCommand: () => {},
|
|
178
|
+
registerTool: (tool: { name: string }) => {
|
|
179
|
+
if (tool.name === "gsd_plan_slice") {
|
|
180
|
+
throw new Error("simulated db-tools partial registration failure");
|
|
181
|
+
}
|
|
182
|
+
registeredTools.push(tool.name);
|
|
183
|
+
},
|
|
184
|
+
registerHook: () => {},
|
|
185
|
+
registerShortcut: () => {},
|
|
186
|
+
events: { on: () => {}, off: () => {}, emit: () => {} },
|
|
187
|
+
getAllTools: () => registeredTools.map((name) => ({ name })),
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
assert.throws(
|
|
191
|
+
() => registerGsdExtension(pi as any),
|
|
192
|
+
/Critical GSD workflow tool registration failed; missing required tool\(s\): .*gsd_plan_slice/,
|
|
193
|
+
);
|
|
194
|
+
assert.ok(registeredTools.includes("gsd_plan_milestone"));
|
|
195
|
+
assert.ok(!registeredTools.includes("gsd_plan_slice"));
|
|
196
|
+
drainLogs();
|
|
197
|
+
});
|
|
164
198
|
});
|
|
@@ -5,7 +5,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
|
|
8
|
-
import { validateFileChanges } from "../safety/file-change-validator.ts";
|
|
8
|
+
import { validateFileChanges, effectiveFileChangeAllowlist } from "../safety/file-change-validator.ts";
|
|
9
9
|
|
|
10
10
|
function git(cwd: string, ...args: string[]): string {
|
|
11
11
|
return execFileSync("git", args, {
|
|
@@ -106,3 +106,35 @@ test("validateFileChanges ignores inline descriptions in expected output paths",
|
|
|
106
106
|
"described expected output should not trigger unexpected-file warnings",
|
|
107
107
|
);
|
|
108
108
|
});
|
|
109
|
+
|
|
110
|
+
test("effectiveFileChangeAllowlist includes .gitignore when GSD manages it", () => {
|
|
111
|
+
assert.deepEqual(effectiveFileChangeAllowlist([], undefined), [".gitignore"]);
|
|
112
|
+
assert.deepEqual(effectiveFileChangeAllowlist(["docs/**"], true), ["docs/**", ".gitignore"]);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test("effectiveFileChangeAllowlist keeps .gitignore auditable when management is disabled", () => {
|
|
116
|
+
assert.deepEqual(effectiveFileChangeAllowlist(["docs/**"], false), ["docs/**"]);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test("GSD-managed .gitignore edit swept into a task commit is not flagged", (t) => {
|
|
120
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-file-change-validator-"));
|
|
121
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
122
|
+
|
|
123
|
+
git(base, "init");
|
|
124
|
+
git(base, "config", "user.email", "test@example.com");
|
|
125
|
+
git(base, "config", "user.name", "Test User");
|
|
126
|
+
writeFileSync(join(base, "index.html"), "<main></main>\n");
|
|
127
|
+
writeFileSync(join(base, ".gitignore"), "# ── GSD baseline (auto-generated) ──\n.gsd\n");
|
|
128
|
+
git(base, "add", ".");
|
|
129
|
+
git(base, "commit", "-m", "task commit with swept gitignore");
|
|
130
|
+
|
|
131
|
+
const audit = validateFileChanges(
|
|
132
|
+
base,
|
|
133
|
+
["index.html"],
|
|
134
|
+
[],
|
|
135
|
+
effectiveFileChangeAllowlist([], undefined),
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
assert.ok(audit, "audit should be produced");
|
|
139
|
+
assert.deepEqual(audit.unexpectedFiles, [], ".gitignore must not be flagged when GSD manages it");
|
|
140
|
+
});
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
import test from "node:test";
|
|
5
5
|
import assert from "node:assert/strict";
|
|
6
6
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
7
8
|
import { join } from "node:path";
|
|
8
9
|
import { tmpdir } from "node:os";
|
|
9
10
|
|
|
10
11
|
import { buildGsdHomeModel, showGsdHome } from "../gsd-command-home.ts";
|
|
12
|
+
import { buildIdleMenuSummary, detectIdleMilestoneResidueHint } from "../closeout-wizard.ts";
|
|
13
|
+
import { closeDatabase, insertMilestone, openDatabase } from "../gsd-db.ts";
|
|
11
14
|
import type { GSDState } from "../types.ts";
|
|
12
15
|
|
|
13
16
|
function baseState(overrides: Partial<GSDState> = {}): GSDState {
|
|
@@ -118,6 +121,123 @@ test("/gsd home recommends start or configure after all milestones complete", ()
|
|
|
118
121
|
assert.match(model.summary.join("\n"), /All milestones complete/);
|
|
119
122
|
});
|
|
120
123
|
|
|
124
|
+
test("/gsd home recommends fix or recover when milestone git residue is stranded", () => {
|
|
125
|
+
const model = buildGsdHomeModel(baseState({
|
|
126
|
+
activeMilestone: null,
|
|
127
|
+
activeSlice: null,
|
|
128
|
+
activeTask: null,
|
|
129
|
+
phase: "complete",
|
|
130
|
+
nextAction: "All milestones complete.",
|
|
131
|
+
}), {
|
|
132
|
+
strandedQuick: null,
|
|
133
|
+
unmergedMilestones: [],
|
|
134
|
+
idleResidueHint: {
|
|
135
|
+
milestoneIds: ["M008"],
|
|
136
|
+
message:
|
|
137
|
+
"Stranded milestone git residue detected (M008: worktree dir and/or milestone/* branch). " +
|
|
138
|
+
"Run /gsd dispatch complete-milestone M008 or /gsd status to recover closeout before starting new work.",
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
assert.equal(action(model, "fix_recover").recommended, true);
|
|
143
|
+
assert.equal(action(model, "fix_recover").enabled, true);
|
|
144
|
+
assert.match(model.summary[0], /Stranded milestone git residue/);
|
|
145
|
+
assert.equal(action(model, "continue_step").enabled, false);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("detectIdleMilestoneResidueHint reports missing workflow database in a git repo", () => {
|
|
149
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-home-residue-"));
|
|
150
|
+
try {
|
|
151
|
+
execFileSync("git", ["init", "-b", "main"], { cwd: base, stdio: "ignore" });
|
|
152
|
+
const hint = detectIdleMilestoneResidueHint(base);
|
|
153
|
+
assert.ok(hint);
|
|
154
|
+
assert.match(hint!.message, /\.gsd\/gsd\.db/);
|
|
155
|
+
} finally {
|
|
156
|
+
rmSync(base, { recursive: true, force: true });
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("detectIdleMilestoneResidueHint matches unique-format milestone ids (M###-abc123)", () => {
|
|
161
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-home-residue-unique-"));
|
|
162
|
+
try {
|
|
163
|
+
execFileSync("git", ["init", "-b", "main"], { cwd: base, stdio: "ignore" });
|
|
164
|
+
mkdirSync(join(base, ".gsd-worktrees", "M042-abc123"), { recursive: true });
|
|
165
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
166
|
+
|
|
167
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
168
|
+
try {
|
|
169
|
+
// Closed milestone with lingering worktree dir — classic residue.
|
|
170
|
+
insertMilestone({ id: "M042-abc123", title: "Closed Unique", status: "complete" });
|
|
171
|
+
const hint = detectIdleMilestoneResidueHint(base);
|
|
172
|
+
assert.ok(hint, "unique-format closed milestone with worktree should be detected");
|
|
173
|
+
assert.deepEqual(hint!.milestoneIds, ["M042-abc123"]);
|
|
174
|
+
assert.match(hint!.message, /M042-abc123/);
|
|
175
|
+
} finally {
|
|
176
|
+
closeDatabase();
|
|
177
|
+
}
|
|
178
|
+
} finally {
|
|
179
|
+
rmSync(base, { recursive: true, force: true });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("detectIdleMilestoneResidueHint ignores in-flight milestones with worktree artifacts", () => {
|
|
184
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-home-residue-active-"));
|
|
185
|
+
try {
|
|
186
|
+
execFileSync("git", ["init", "-b", "main"], { cwd: base, stdio: "ignore" });
|
|
187
|
+
mkdirSync(join(base, ".gsd-worktrees", "M001"), { recursive: true });
|
|
188
|
+
mkdirSync(join(base, ".gsd-worktrees", "M002-abc123"), { recursive: true });
|
|
189
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
190
|
+
|
|
191
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
192
|
+
try {
|
|
193
|
+
// Active and pending milestones must not be flagged as stranded residue.
|
|
194
|
+
insertMilestone({ id: "M001", title: "Active milestone", status: "active" });
|
|
195
|
+
insertMilestone({ id: "M002-abc123", title: "Pending milestone", status: "pending" });
|
|
196
|
+
const hint = detectIdleMilestoneResidueHint(base);
|
|
197
|
+
assert.equal(hint, null, "active/pending milestone worktrees must not be classified as residue");
|
|
198
|
+
} finally {
|
|
199
|
+
closeDatabase();
|
|
200
|
+
}
|
|
201
|
+
} finally {
|
|
202
|
+
rmSync(base, { recursive: true, force: true });
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("buildIdleMenuSummary surfaces idle residue hint even when phase is complete", () => {
|
|
207
|
+
const summary = buildIdleMenuSummary(
|
|
208
|
+
{
|
|
209
|
+
activeMilestone: null,
|
|
210
|
+
activeSlice: null,
|
|
211
|
+
activeTask: null,
|
|
212
|
+
phase: "complete",
|
|
213
|
+
recentDecisions: [],
|
|
214
|
+
blockers: [],
|
|
215
|
+
nextAction: "All milestones complete.",
|
|
216
|
+
lastCompletedMilestone: { id: "M001", title: "Menu Cleanup" },
|
|
217
|
+
registry: [{ id: "M001", title: "Menu Cleanup", status: "complete" }],
|
|
218
|
+
requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
|
|
219
|
+
progress: {
|
|
220
|
+
milestones: { done: 1, total: 1 },
|
|
221
|
+
slices: { done: 0, total: 0 },
|
|
222
|
+
tasks: { done: 0, total: 0 },
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
strandedQuick: null,
|
|
227
|
+
unmergedMilestones: [],
|
|
228
|
+
idleResidueHint: {
|
|
229
|
+
milestoneIds: ["M008"],
|
|
230
|
+
message:
|
|
231
|
+
"Stranded milestone git residue detected (M008: worktree dir and/or milestone/* branch). " +
|
|
232
|
+
"Run /gsd dispatch complete-milestone M008 or /gsd status to recover closeout before starting new work.",
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
assert.match(summary[0] ?? "", /Stranded milestone git residue/);
|
|
238
|
+
assert.doesNotMatch(summary.join("\n"), /All milestones complete/);
|
|
239
|
+
});
|
|
240
|
+
|
|
121
241
|
test("showGsdHome renders the five-slot home text without an interactive TUI", async () => {
|
|
122
242
|
const base = mkdtempSync(join(tmpdir(), "gsd-home-"));
|
|
123
243
|
const notifications: Array<{ message: string; level: string }> = [];
|
|
@@ -30,6 +30,8 @@ import {
|
|
|
30
30
|
insertTask,
|
|
31
31
|
getTask,
|
|
32
32
|
getSliceTasks,
|
|
33
|
+
getMilestoneSliceSummaries,
|
|
34
|
+
getClosedSliceIds,
|
|
33
35
|
getActiveMilestoneFromDb,
|
|
34
36
|
deleteMilestone,
|
|
35
37
|
clearEngineHierarchy,
|
|
@@ -947,6 +949,31 @@ describe('gsd-db', () => {
|
|
|
947
949
|
closeDatabase();
|
|
948
950
|
});
|
|
949
951
|
|
|
952
|
+
test('gsd-db: slice summaries use the canonical closed vocabulary; getClosedSliceIds filters to closed ids', () => {
|
|
953
|
+
openDatabase(':memory:');
|
|
954
|
+
insertMilestone({ id: 'M001', status: 'active' });
|
|
955
|
+
insertSlice({ milestoneId: 'M001', id: 'S01', title: 'Complete', status: 'complete', depends: [], sequence: 1 });
|
|
956
|
+
insertSlice({ milestoneId: 'M001', id: 'S02', title: 'Done', status: 'done', depends: ['S01'], sequence: 2 });
|
|
957
|
+
insertSlice({ milestoneId: 'M001', id: 'S03', title: 'Skipped', status: 'skipped', depends: [], sequence: 3 });
|
|
958
|
+
insertSlice({ milestoneId: 'M001', id: 'S04', title: 'Closed', status: 'closed', depends: [], sequence: 4 });
|
|
959
|
+
insertSlice({ milestoneId: 'M001', id: 'S05', title: 'Active', status: 'active', depends: [], sequence: 5 });
|
|
960
|
+
insertSlice({ milestoneId: 'M001', id: 'S06', title: 'Pending', status: 'pending', depends: ['S05'], sequence: 6 });
|
|
961
|
+
|
|
962
|
+
const summaries = getMilestoneSliceSummaries('M001');
|
|
963
|
+
assert.deepStrictEqual(summaries[0], { id: 'S01', title: 'Complete', done: true, depends: [] });
|
|
964
|
+
assert.deepStrictEqual(summaries[5], { id: 'S06', title: 'Pending', done: false, depends: ['S05'] });
|
|
965
|
+
assert.deepStrictEqual(
|
|
966
|
+
summaries.map((s) => s.done),
|
|
967
|
+
[true, true, true, true, false, false],
|
|
968
|
+
'complete/done/skipped/closed are closed; active/pending are not',
|
|
969
|
+
);
|
|
970
|
+
|
|
971
|
+
assert.deepStrictEqual(getClosedSliceIds('M001'), ['S01', 'S02', 'S03', 'S04']);
|
|
972
|
+
assert.deepStrictEqual(getClosedSliceIds('M999'), [], 'unknown milestone yields no closed ids');
|
|
973
|
+
|
|
974
|
+
closeDatabase();
|
|
975
|
+
});
|
|
976
|
+
|
|
950
977
|
test('gsd-db: FTS5 unavailable warning normalizes provider typo', () => {
|
|
951
978
|
const previousStderr = setStderrLoggingEnabled(false);
|
|
952
979
|
_resetLogs();
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// GSD Extension — Guidance module tests
|
|
2
|
+
// The catalog is the test surface: every typed finding must resolve to
|
|
3
|
+
// non-empty remediation, and load-bearing phrases must survive edits.
|
|
4
|
+
|
|
5
|
+
import { describe, test } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
formatGuidance,
|
|
10
|
+
recoveryRemediation,
|
|
11
|
+
needsAttentionBlockerGuidance,
|
|
12
|
+
needsRemediationBlockerGuidance,
|
|
13
|
+
uatSignoffBlockerGuidance,
|
|
14
|
+
worktreeCreationFailedGuidance,
|
|
15
|
+
crashResumeHint,
|
|
16
|
+
doctorFixHint,
|
|
17
|
+
type RecoveryGuidanceKey,
|
|
18
|
+
} from "../guidance.js";
|
|
19
|
+
import { classifyFailure, type RecoveryFailureKind } from "../recovery-classification.js";
|
|
20
|
+
import { isValidationBlockedState } from "../validation-block-guard.js";
|
|
21
|
+
import type { GSDState } from "../types.js";
|
|
22
|
+
|
|
23
|
+
const RECOVERY_KEYS: RecoveryGuidanceKey[] = [
|
|
24
|
+
"tool-schema",
|
|
25
|
+
"tool-contract",
|
|
26
|
+
"tool-unavailable",
|
|
27
|
+
"deterministic-policy",
|
|
28
|
+
"lifecycle-progression",
|
|
29
|
+
"stale-worker",
|
|
30
|
+
"worktree-invalid",
|
|
31
|
+
"verification-drift",
|
|
32
|
+
"reconciliation-drift",
|
|
33
|
+
"illegal-transition",
|
|
34
|
+
"runtime-unknown",
|
|
35
|
+
"provider-transient",
|
|
36
|
+
"provider-permanent",
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
describe("guidance catalog", () => {
|
|
40
|
+
test("every recovery guidance key resolves to non-empty remediation", () => {
|
|
41
|
+
for (const key of RECOVERY_KEYS) {
|
|
42
|
+
const remediation = recoveryRemediation(key);
|
|
43
|
+
assert.ok(remediation.length > 0, `empty remediation for ${key}`);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("classifyFailure carries catalog remediation for every failure kind", () => {
|
|
48
|
+
const kinds: RecoveryFailureKind[] = [
|
|
49
|
+
"tool-schema",
|
|
50
|
+
"tool-contract",
|
|
51
|
+
"deterministic-policy",
|
|
52
|
+
"lifecycle-progression",
|
|
53
|
+
"stale-worker",
|
|
54
|
+
"worktree-invalid",
|
|
55
|
+
"verification-drift",
|
|
56
|
+
"reconciliation-drift",
|
|
57
|
+
"runtime-unknown",
|
|
58
|
+
];
|
|
59
|
+
for (const kind of kinds) {
|
|
60
|
+
const result = classifyFailure({ error: new Error("boom"), failureKind: kind });
|
|
61
|
+
assert.equal(result.failureKind, kind);
|
|
62
|
+
assert.equal(result.exitReason, kind);
|
|
63
|
+
assert.ok(result.remediation.length > 0, `empty remediation for ${kind}`);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("escalation kinds with weak guidance now name a concrete command", () => {
|
|
68
|
+
for (const key of ["stale-worker", "worktree-invalid", "verification-drift", "reconciliation-drift"] as const) {
|
|
69
|
+
assert.match(recoveryRemediation(key), /\/gsd /, `no command in remediation for ${key}`);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("formatGuidance numbers steps under the summary", () => {
|
|
74
|
+
const text = formatGuidance({ summary: "It broke.", steps: ["Fix it.", "Retry."] });
|
|
75
|
+
assert.equal(text, "It broke.\n\n1. Fix it.\n2. Retry.");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("formatGuidance with no steps is just the summary", () => {
|
|
79
|
+
assert.equal(formatGuidance({ summary: "All good.", steps: [] }), "All good.");
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe("milestone blocker guidance", () => {
|
|
84
|
+
test("needs-attention blocker keeps the phrase the validation-block guard matches", () => {
|
|
85
|
+
const state = { phase: "blocked", blockers: [needsAttentionBlockerGuidance("M005")] } as unknown as GSDState;
|
|
86
|
+
assert.ok(isValidationBlockedState(state));
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("needs-remediation blocker keeps the phrase the validation-block guard matches", () => {
|
|
90
|
+
const state = { phase: "blocked", blockers: [needsRemediationBlockerGuidance("M005")] } as unknown as GSDState;
|
|
91
|
+
assert.ok(isValidationBlockedState(state));
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test("blockers carry the milestone id and concrete fix commands", () => {
|
|
95
|
+
const text = needsAttentionBlockerGuidance("M007");
|
|
96
|
+
assert.match(text, /M007/);
|
|
97
|
+
assert.match(text, /\/gsd status/);
|
|
98
|
+
assert.match(text, /\/gsd validate-milestone/);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("UAT sign-off guidance explains direct dispatch target", () => {
|
|
102
|
+
const missing = uatSignoffBlockerGuidance("M007", "S02");
|
|
103
|
+
const failing = uatSignoffBlockerGuidance("M007", "S02", "FAIL");
|
|
104
|
+
|
|
105
|
+
for (const text of [missing, failing]) {
|
|
106
|
+
assert.match(text, /Manual UAT sign-off \(PASS\) is required before milestone closure/);
|
|
107
|
+
assert.match(text, /\/gsd dispatch uat/);
|
|
108
|
+
assert.match(text, /most recently completed slice/);
|
|
109
|
+
assert.match(text, /re-run UAT for S02/);
|
|
110
|
+
assert.match(text, /gsd_uat_result_save/);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("worktree creation failure guidance does not claim bootstrap continues", () => {
|
|
115
|
+
const text = worktreeCreationFailedGuidance("M007", "boom");
|
|
116
|
+
|
|
117
|
+
assert.match(text, /Auto-worktree creation for M007 failed: boom\. Continuing in project root\./);
|
|
118
|
+
assert.match(text, /Worktree isolation is degraded for this session\./);
|
|
119
|
+
assert.doesNotMatch(text, /work continues in the project root/i);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe("crash resume hints", () => {
|
|
124
|
+
test("bootstrap crash reports no work lost", () => {
|
|
125
|
+
assert.match(crashResumeHint("starting", "bootstrap") ?? "", /No work was lost/);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("unit classes map to their resume hints", () => {
|
|
129
|
+
assert.match(crashResumeHint("research-milestone", "M001") ?? "", /may be incomplete/);
|
|
130
|
+
assert.match(crashResumeHint("execute-task", "T001") ?? "", /completed work is preserved/);
|
|
131
|
+
assert.match(crashResumeHint("complete-slice", "S001") ?? "", /interrupted/);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("unknown unit types yield no hint", () => {
|
|
135
|
+
assert.equal(crashResumeHint("triage-captures", "X"), undefined);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe("doctor fix hints", () => {
|
|
140
|
+
test("known codes resolve to a hint", () => {
|
|
141
|
+
assert.ok(doctorFixHint("stale_crash_lock"));
|
|
142
|
+
assert.ok(doctorFixHint("db_unavailable"));
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("codes without authored guidance resolve to undefined", () => {
|
|
146
|
+
assert.equal(doctorFixHint("delimiter_in_title"), undefined);
|
|
147
|
+
});
|
|
148
|
+
});
|
package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts
CHANGED
|
@@ -35,6 +35,7 @@ import {
|
|
|
35
35
|
insertTask,
|
|
36
36
|
openDatabase,
|
|
37
37
|
} from "../../gsd-db.ts";
|
|
38
|
+
import { createGsdIntegrationProject } from "./gsd-integration-fixture.ts";
|
|
38
39
|
|
|
39
40
|
function run(cmd: string, cwd: string): string {
|
|
40
41
|
// Safe: all inputs are hardcoded test strings, not user input
|
|
@@ -42,17 +43,12 @@ function run(cmd: string, cwd: string): string {
|
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
function createTempRepo(): string {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
writeFileSync(join(dir, ".gsd", "STATE.md"), "# State\n");
|
|
52
|
-
run("git add .", dir);
|
|
53
|
-
run("git commit -m init", dir);
|
|
54
|
-
run("git branch -M main", dir);
|
|
55
|
-
return dir;
|
|
46
|
+
return createGsdIntegrationProject({
|
|
47
|
+
prefix: "wt-ms-merge-test-",
|
|
48
|
+
initialFiles: {
|
|
49
|
+
".gsd/STATE.md": "# State\n",
|
|
50
|
+
},
|
|
51
|
+
}).root;
|
|
56
52
|
}
|
|
57
53
|
|
|
58
54
|
function createTempRepoWithExternalGsd(): { repo: string; externalState: string } {
|
|
@@ -746,7 +742,7 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
746
742
|
});
|
|
747
743
|
|
|
748
744
|
test("#2156: mergeMilestoneToMain removes external-state worktrees using the milestone branch name", () => {
|
|
749
|
-
const { repo
|
|
745
|
+
const { repo } = freshRepoWithExternalGsd();
|
|
750
746
|
const wtPath = createAutoWorktree(repo, "M215");
|
|
751
747
|
|
|
752
748
|
addSliceToMilestone(repo, wtPath, "M215", "S01", "External cleanup", [
|
|
@@ -754,9 +750,10 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
754
750
|
]);
|
|
755
751
|
|
|
756
752
|
const realWtPath = realpathSync(wtPath);
|
|
757
|
-
assert.
|
|
758
|
-
realWtPath
|
|
759
|
-
|
|
753
|
+
assert.equal(
|
|
754
|
+
realWtPath,
|
|
755
|
+
join(repo, ".gsd-worktrees", "M215"),
|
|
756
|
+
`worktree should use canonical path under project root, got ${realWtPath}`,
|
|
760
757
|
);
|
|
761
758
|
|
|
762
759
|
// Recreate the exact divergence from #1852: local .gsd/ is replaced with a
|
|
@@ -783,6 +780,52 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
783
780
|
);
|
|
784
781
|
});
|
|
785
782
|
|
|
783
|
+
test("#2156 (legacy): mergeMilestoneToMain removes external-state worktrees created under .gsd/worktrees/", () => {
|
|
784
|
+
const { repo, externalState } = freshRepoWithExternalGsd();
|
|
785
|
+
// Worktrees created by older versions live at .gsd/worktrees/<MID>; git
|
|
786
|
+
// resolves the symlink and registers them under external state. Canonical
|
|
787
|
+
// .gsd-worktrees/ creation never crosses the symlink, so this coverage
|
|
788
|
+
// creates the legacy worktree explicitly. createAutoWorktree chdirs into
|
|
789
|
+
// the new worktree and mergeMilestoneToMain reads process.cwd() as the
|
|
790
|
+
// worktree cwd, so mirror that here.
|
|
791
|
+
const wtPath = join(repo, ".gsd", "worktrees", "M216");
|
|
792
|
+
run(`git worktree add -b milestone/M216 "${wtPath}"`, repo);
|
|
793
|
+
process.chdir(wtPath);
|
|
794
|
+
|
|
795
|
+
addSliceToMilestone(repo, wtPath, "M216", "S01", "Legacy external cleanup", [
|
|
796
|
+
{ file: "legacy-external-cleanup.ts", content: "export const legacyExternalCleanup = true;\n", message: "add legacy external cleanup" },
|
|
797
|
+
]);
|
|
798
|
+
|
|
799
|
+
const realWtPath = realpathSync(wtPath);
|
|
800
|
+
assert.ok(
|
|
801
|
+
realWtPath.startsWith(externalState),
|
|
802
|
+
`legacy worktree should be registered under external .gsd state, got ${realWtPath}`,
|
|
803
|
+
);
|
|
804
|
+
|
|
805
|
+
// Recreate the exact divergence from #1852: local .gsd/ is replaced with a
|
|
806
|
+
// stale real directory, so the computed path no longer matches git's record.
|
|
807
|
+
unlinkSync(join(repo, ".gsd"));
|
|
808
|
+
mkdirSync(join(repo, ".gsd", "worktrees", "M216"), { recursive: true });
|
|
809
|
+
writeFileSync(join(repo, ".gsd", "STATE.md"), "# Local stale state\n");
|
|
810
|
+
writeFileSync(join(repo, ".gsd", "worktrees", "M216", "stale.txt"), "stale local artifact\n");
|
|
811
|
+
|
|
812
|
+
const roadmap = makeRoadmap("M216", "Legacy external cleanup", [
|
|
813
|
+
{ id: "S01", title: "Legacy external cleanup" },
|
|
814
|
+
]);
|
|
815
|
+
|
|
816
|
+
mergeMilestoneToMain(repo, "M216", roadmap);
|
|
817
|
+
|
|
818
|
+
assert.ok(
|
|
819
|
+
!run("git worktree list", repo).includes("M216"),
|
|
820
|
+
"merged legacy milestone worktree should be removed from git worktree list",
|
|
821
|
+
);
|
|
822
|
+
assert.ok(!existsSync(realWtPath), "real external worktree directory should be removed");
|
|
823
|
+
assert.ok(
|
|
824
|
+
!run("git branch", repo).includes("milestone/M216"),
|
|
825
|
+
"milestone branch should be deleted after merge cleanup",
|
|
826
|
+
);
|
|
827
|
+
});
|
|
828
|
+
|
|
786
829
|
test("#2912: MERGE_HEAD cleaned up after squash-merge conflict", () => {
|
|
787
830
|
const repo = freshRepo();
|
|
788
831
|
const wtPath = createAutoWorktree(repo, "M291");
|