@opengsd/gsd-pi 1.2.0-dev.5457a158 → 1.2.0-dev.6ccd27b3
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-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/headless-events.js +7 -5
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +5 -4
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- 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/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/stream-adapter.js +450 -217
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
- package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
- 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 +120 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
- package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
- package/dist/resources/extensions/gsd/auto/loop.js +7 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +174 -69
- package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
- package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -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 +30 -12
- package/dist/resources/extensions/gsd/auto-prompts.js +78 -19
- package/dist/resources/extensions/gsd/auto-start.js +35 -15
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +41 -2
- package/dist/resources/extensions/gsd/blocked-models.js +28 -0
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +60 -13
- 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 +172 -59
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
- 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/closeout-wizard.js +92 -0
- 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/commands-mcp-status.js +2 -2
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
- 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 +8 -3
- package/dist/resources/extensions/gsd/db/queries.js +56 -0
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- 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 +256 -125
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -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/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +60 -0
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- 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/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/preferences-models.js +2 -2
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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 +9 -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/prompts/workflow-start.md +2 -1
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- 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/session-lock.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +3 -6
- package/dist/resources/extensions/gsd/state.js +11 -2
- 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 +83 -31
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/exec-tool.js +5 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- 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 +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- 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/workflow-tool-executors.js +67 -2
- package/dist/resources/extensions/gsd/uat-policy.js +42 -16
- package/dist/resources/extensions/gsd/unit-context-composer.js +65 -0
- package/dist/resources/extensions/gsd/unit-registry.js +41 -24
- 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-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -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/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- 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 +12 -12
- 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/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/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 +12 -12
- 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/package.json +3 -3
- 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/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +6 -4
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +13 -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 +55 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.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-mode.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.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/interactive/interactive-selectors-settings.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.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/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- 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/pid-registry.d.ts +46 -0
- package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
- package/packages/mcp-server/dist/pid-registry.js +452 -0
- package/packages/mcp-server/dist/pid-registry.js.map +1 -0
- package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
- package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
- package/packages/mcp-server/dist/probe-mode.js +10 -0
- package/packages/mcp-server/dist/probe-mode.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/stdio-watchdog.d.ts +8 -0
- package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
- package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
- package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +161 -81
- 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/agent-loop.js +43 -2
- package/packages/pi-agent-core/dist/agent-loop.js.map +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 +239 -153
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +256 -145
- 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/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/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.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/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
- package/packages/pi-coding-agent/dist/theme/theme.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/index.d.ts +1 -1
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +1 -1
- package/packages/pi-tui/dist/index.js.map +1 -1
- package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal-image.js +54 -2
- package/packages/pi-tui/dist/terminal-image.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +8 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +72 -18
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +110 -36
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +45 -17
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/ask-user-questions.ts +7 -2
- 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/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/stream-adapter.ts +534 -228
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
- package/src/resources/extensions/gsd/auto/closeout.ts +309 -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 +168 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
- package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
- package/src/resources/extensions/gsd/auto/loop.ts +7 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +193 -71
- package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
- package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
- package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -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 +33 -12
- package/src/resources/extensions/gsd/auto-prompts.ts +115 -35
- package/src/resources/extensions/gsd/auto-start.ts +36 -18
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +49 -2
- package/src/resources/extensions/gsd/blocked-models.ts +49 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +79 -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 +211 -59
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
- 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/closeout-wizard.ts +102 -0
- 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/commands-mcp-status.ts +2 -2
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
- 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 +10 -2
- package/src/resources/extensions/gsd/db/queries.ts +66 -0
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- 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 +267 -142
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -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/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +78 -0
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- 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/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/preferences-models.ts +2 -1
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- 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 +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- 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 +9 -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/prompts/workflow-start.md +2 -1
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- 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/session-lock.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +3 -6
- package/src/resources/extensions/gsd/state.ts +12 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +273 -37
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
- 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/complete-slice-verification-gate.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
- 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/db-writer.test.ts +15 -4
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +36 -0
- 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 +328 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
- 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/engine-interfaces-contract.test.ts +117 -91
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -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/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 +23 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +7 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +35 -58
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
- 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/parallel-skill-prompt-integration.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- 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 +80 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- 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-context-composer.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
- 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-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
- 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 +67 -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 +126 -19
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- 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 +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- 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/workflow-tool-executors.ts +81 -2
- package/src/resources/extensions/gsd/uat-policy.ts +62 -16
- package/src/resources/extensions/gsd/unit-context-composer.ts +99 -0
- package/src/resources/extensions/gsd/unit-registry.ts +41 -24
- 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-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.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/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → avEtvPrImYTq2gGe-hVNp}/_ssgManifest.js +0 -0
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
_dispatchWorkflowForTest,
|
|
12
12
|
resolveGuidedDispatchProjectRoot,
|
|
13
13
|
} from "../guided-flow.ts";
|
|
14
|
+
import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.ts";
|
|
14
15
|
|
|
15
16
|
test("guided dispatch falls back to cwd only when no project root is supplied", () => {
|
|
16
17
|
const cwd = process.cwd();
|
|
@@ -77,12 +78,8 @@ test("guided dispatch passes the explicit project root through model and compati
|
|
|
77
78
|
seen.modelRoot = projectRoot;
|
|
78
79
|
return { routing: null, appliedModel: null };
|
|
79
80
|
},
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
_requiredTools: string[],
|
|
83
|
-
options?: { projectRoot?: string },
|
|
84
|
-
) => {
|
|
85
|
-
seen.compatibilityRoot = options?.projectRoot ?? "";
|
|
81
|
+
getDispatchReadinessError: (input: { projectRoot?: string }) => {
|
|
82
|
+
seen.compatibilityRoot = input.projectRoot ?? "";
|
|
86
83
|
return null;
|
|
87
84
|
},
|
|
88
85
|
},
|
|
@@ -119,6 +116,7 @@ test("guided dispatch accepts workflow MCP tools absent from parent active tool
|
|
|
119
116
|
getProviderAuthMode: () => "externalCli",
|
|
120
117
|
},
|
|
121
118
|
ui: {
|
|
119
|
+
setStatus: () => {},
|
|
122
120
|
notify: (message: string) => {
|
|
123
121
|
notifications.push(message);
|
|
124
122
|
},
|
|
@@ -134,8 +132,22 @@ test("guided dispatch accepts workflow MCP tools absent from parent active tool
|
|
|
134
132
|
"write",
|
|
135
133
|
];
|
|
136
134
|
|
|
135
|
+
// The workflow MCP server registers its tools out of band, so the unit's
|
|
136
|
+
// required workflow tools show up in the registered tool snapshot
|
|
137
|
+
// (getAllTools) under the MCP server prefix without ever entering the parent
|
|
138
|
+
// session's active tool surface (getActiveTools). This is exactly the shape
|
|
139
|
+
// the readiness gate must accept. Derive the surface from the unit contract
|
|
140
|
+
// so this test stays correct if discuss-milestone's required tools change.
|
|
141
|
+
const registeredTools = [
|
|
142
|
+
...activeTools,
|
|
143
|
+
...getRequiredWorkflowToolsForUnit("discuss-milestone").map(
|
|
144
|
+
(tool) => `mcp__gsd-workflow__${tool}`,
|
|
145
|
+
),
|
|
146
|
+
];
|
|
147
|
+
|
|
137
148
|
const pi = {
|
|
138
149
|
getActiveTools: () => [...activeTools],
|
|
150
|
+
getAllTools: () => registeredTools.map((name) => ({ name })),
|
|
139
151
|
setActiveTools: (tools: string[]) => {
|
|
140
152
|
activeTools = [...tools];
|
|
141
153
|
},
|
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 } {
|
|
@@ -11,6 +11,11 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, realpathSync
|
|
|
11
11
|
import { join } from "node:path";
|
|
12
12
|
import { tmpdir } from "node:os";
|
|
13
13
|
import { execSync } from "node:child_process";
|
|
14
|
+
import {
|
|
15
|
+
commitAll,
|
|
16
|
+
createGsdIntegrationProject,
|
|
17
|
+
writeGsdMilestoneContext,
|
|
18
|
+
} from "./gsd-integration-fixture.ts";
|
|
14
19
|
|
|
15
20
|
import {
|
|
16
21
|
createAutoWorktree,
|
|
@@ -32,17 +37,12 @@ function run(command: string, cwd: string): string {
|
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
function createTempRepo(): string {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
run("git add .", dir);
|
|
42
|
-
run("git commit -m init", dir);
|
|
43
|
-
// Ensure branch is called main
|
|
44
|
-
run("git branch -M main", dir);
|
|
45
|
-
return dir;
|
|
40
|
+
return createGsdIntegrationProject("auto-wt-test-").root;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function commitMilestoneContext(repo: string, milestoneId: string): void {
|
|
44
|
+
writeGsdMilestoneContext(repo, milestoneId);
|
|
45
|
+
commitAll(repo, "add milestone");
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
describe("auto-worktree lifecycle", () => {
|
|
@@ -59,13 +59,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
59
59
|
|
|
60
60
|
test("create → detect → teardown", () => {
|
|
61
61
|
tempDir = createTempRepo();
|
|
62
|
-
|
|
63
|
-
// Create .gsd/milestones/M003 with a dummy file (simulates planning artifacts)
|
|
64
|
-
const msDir = join(tempDir, ".gsd", "milestones", "M003");
|
|
65
|
-
mkdirSync(msDir, { recursive: true });
|
|
66
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
67
|
-
run("git add .", tempDir);
|
|
68
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
62
|
+
commitMilestoneContext(tempDir, "M003");
|
|
69
63
|
|
|
70
64
|
// ─── createAutoWorktree ──────────────────────────────────────────
|
|
71
65
|
const wtPath = createAutoWorktree(tempDir, "M003");
|
|
@@ -112,11 +106,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
112
106
|
|
|
113
107
|
test("re-entry: create again, exit without teardown, re-enter", () => {
|
|
114
108
|
tempDir = createTempRepo();
|
|
115
|
-
|
|
116
|
-
mkdirSync(msDir, { recursive: true });
|
|
117
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
118
|
-
run("git add .", tempDir);
|
|
119
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
109
|
+
commitMilestoneContext(tempDir, "M003");
|
|
120
110
|
|
|
121
111
|
const wtPath2 = createAutoWorktree(tempDir, "M003");
|
|
122
112
|
assert.ok(existsSync(wtPath2), "worktree re-created");
|
|
@@ -144,6 +134,21 @@ describe("auto-worktree lifecycle", () => {
|
|
|
144
134
|
teardownAutoWorktree(tempDir, "M003");
|
|
145
135
|
});
|
|
146
136
|
|
|
137
|
+
test("isInAutoWorktree returns false when ambient cwd was deleted", (t) => {
|
|
138
|
+
const cwd = t.mock.method(process, "cwd", () => {
|
|
139
|
+
const err = new Error("process.cwd failed") as NodeJS.ErrnoException;
|
|
140
|
+
err.code = "ENOENT";
|
|
141
|
+
err.syscall = "uv_cwd";
|
|
142
|
+
throw err;
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
assert.equal(isInAutoWorktree("/repo"), false);
|
|
147
|
+
} finally {
|
|
148
|
+
cwd.mock.restore();
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
|
|
147
152
|
test("symlink-resolved auto worktree is detected after module state reset", () => {
|
|
148
153
|
tempDir = createTempRepo();
|
|
149
154
|
const savedGsdHome = process.env.GSD_HOME;
|
|
@@ -247,11 +252,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
247
252
|
|
|
248
253
|
test("coexistence with manual worktree", async () => {
|
|
249
254
|
tempDir = createTempRepo();
|
|
250
|
-
|
|
251
|
-
mkdirSync(msDir, { recursive: true });
|
|
252
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
253
|
-
run("git add .", tempDir);
|
|
254
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
255
|
+
commitMilestoneContext(tempDir, "M003");
|
|
255
256
|
|
|
256
257
|
// Import createWorktree directly for manual worktree
|
|
257
258
|
const { createWorktree } = await import("../../worktree-manager.ts");
|
|
@@ -274,11 +275,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
274
275
|
|
|
275
276
|
test("split-brain prevention: originalBase cleared after teardown", () => {
|
|
276
277
|
tempDir = createTempRepo();
|
|
277
|
-
|
|
278
|
-
mkdirSync(msDir, { recursive: true });
|
|
279
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
280
|
-
run("git add .", tempDir);
|
|
281
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
278
|
+
commitMilestoneContext(tempDir, "M003");
|
|
282
279
|
|
|
283
280
|
createAutoWorktree(tempDir, "M003");
|
|
284
281
|
teardownAutoWorktree(tempDir, "M003");
|
|
@@ -288,11 +285,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
288
285
|
|
|
289
286
|
test("#1526: getMainBranch returns milestone/<MID> in auto-worktree", async () => {
|
|
290
287
|
tempDir = createTempRepo();
|
|
291
|
-
|
|
292
|
-
mkdirSync(msDir, { recursive: true });
|
|
293
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M005 Context\n");
|
|
294
|
-
run("git add .", tempDir);
|
|
295
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
288
|
+
commitMilestoneContext(tempDir, "M005");
|
|
296
289
|
|
|
297
290
|
const { GitServiceImpl } = await import("../../git-service.ts");
|
|
298
291
|
|
|
@@ -312,11 +305,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
312
305
|
|
|
313
306
|
test("#1713: stale worktree directory without .git file", async () => {
|
|
314
307
|
tempDir = createTempRepo();
|
|
315
|
-
|
|
316
|
-
mkdirSync(msDir, { recursive: true });
|
|
317
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M010 Context\n");
|
|
318
|
-
run("git add .", tempDir);
|
|
319
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
308
|
+
commitMilestoneContext(tempDir, "M010");
|
|
320
309
|
|
|
321
310
|
// Simulate a crash leaving a stale directory with no .git file.
|
|
322
311
|
const { worktreePath } = await import("../../worktree-manager.ts");
|
|
@@ -337,11 +326,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
337
326
|
|
|
338
327
|
test("#778: re-attach does not reconcile plan checkboxes into a worktree-local .gsd projection", async () => {
|
|
339
328
|
tempDir = createTempRepo();
|
|
340
|
-
|
|
341
|
-
mkdirSync(msDir, { recursive: true });
|
|
342
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
343
|
-
run("git add .", tempDir);
|
|
344
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
329
|
+
commitMilestoneContext(tempDir, "M003");
|
|
345
330
|
|
|
346
331
|
const planRelPath = join(".gsd", "milestones", "M004", "slices", "S01", "S01-PLAN.md");
|
|
347
332
|
const planDir = join(tempDir, ".gsd", "milestones", "M004", "slices", "S01");
|
|
@@ -401,11 +386,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
401
386
|
|
|
402
387
|
test("#2791: mcp.json is not copied into worktree on creation after copyPlanningArtifacts removal", () => {
|
|
403
388
|
tempDir = createTempRepo();
|
|
404
|
-
|
|
405
|
-
mkdirSync(msDir, { recursive: true });
|
|
406
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
407
|
-
run("git add .", tempDir);
|
|
408
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
389
|
+
commitMilestoneContext(tempDir, "M003");
|
|
409
390
|
|
|
410
391
|
// Create mcp.json in .gsd/ AFTER the commit (untracked, like real usage).
|
|
411
392
|
// Phase C removed copyPlanningArtifacts, so creation should not seed a
|
|
@@ -430,11 +411,7 @@ describe("auto-worktree lifecycle", () => {
|
|
|
430
411
|
|
|
431
412
|
test("#2791: mcp.json synced via syncGsdStateToWorktree (ROOT_STATE_FILES)", () => {
|
|
432
413
|
tempDir = createTempRepo();
|
|
433
|
-
|
|
434
|
-
mkdirSync(msDir, { recursive: true });
|
|
435
|
-
writeFileSync(join(msDir, "CONTEXT.md"), "# M003 Context\n");
|
|
436
|
-
run("git add .", tempDir);
|
|
437
|
-
run("git commit -m \"add milestone\"", tempDir);
|
|
414
|
+
commitMilestoneContext(tempDir, "M003");
|
|
438
415
|
|
|
439
416
|
// Create worktree first (no mcp.json yet)
|
|
440
417
|
const wtPath = createAutoWorktree(tempDir, "M003");
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Verify the non-blocking runEnvironmentChecksAsync is behaviourally
|
|
3
|
+
// identical to the synchronous runEnvironmentChecks (the health-widget render
|
|
4
|
+
// path was moved onto the async variant for performance), and that the single-
|
|
5
|
+
// scan checkPortConflicts still detects a real in-use port.
|
|
6
|
+
|
|
7
|
+
import test, { type TestContext } from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
10
|
+
import { join, dirname } from "node:path";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { createServer } from "node:net";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
runEnvironmentChecks,
|
|
16
|
+
runEnvironmentChecksAsync,
|
|
17
|
+
type EnvironmentCheckResult,
|
|
18
|
+
} from "../../doctor-environment.ts";
|
|
19
|
+
|
|
20
|
+
function makeProject(t: TestContext, files: Record<string, string>): string {
|
|
21
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-env-async-"));
|
|
22
|
+
t.after(() => {
|
|
23
|
+
try {
|
|
24
|
+
rmSync(dir, { recursive: true, force: true });
|
|
25
|
+
} catch {
|
|
26
|
+
/* ignore */
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
for (const [name, content] of Object.entries(files)) {
|
|
30
|
+
const filePath = join(dir, name);
|
|
31
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
32
|
+
writeFileSync(filePath, content);
|
|
33
|
+
}
|
|
34
|
+
return dir;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Stable, order-independent signature of a check-result set for comparison.
|
|
38
|
+
function normalize(results: EnvironmentCheckResult[]): string[] {
|
|
39
|
+
return results.map((r) => `${r.name}|${r.status}|${r.message}|${r.detail ?? ""}`).sort();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
test("runEnvironmentChecksAsync returns the same results as runEnvironmentChecks", async (t) => {
|
|
43
|
+
const dir = makeProject(t, {
|
|
44
|
+
"package.json": JSON.stringify({
|
|
45
|
+
name: "fixture",
|
|
46
|
+
engines: { node: ">=18" },
|
|
47
|
+
scripts: { dev: "vite --port 4321", build: "tsc" },
|
|
48
|
+
devDependencies: { typescript: "^5.0.0" },
|
|
49
|
+
}),
|
|
50
|
+
".env.example": "API_KEY=\n",
|
|
51
|
+
Dockerfile: "FROM node:20\n",
|
|
52
|
+
});
|
|
53
|
+
mkdirSync(join(dir, "node_modules"), { recursive: true });
|
|
54
|
+
|
|
55
|
+
const sync = runEnvironmentChecks(dir);
|
|
56
|
+
const asyncResults = await runEnvironmentChecksAsync(dir);
|
|
57
|
+
|
|
58
|
+
assert.deepEqual(
|
|
59
|
+
normalize(asyncResults),
|
|
60
|
+
normalize(sync),
|
|
61
|
+
"async checks must produce the identical result set as the sync checks",
|
|
62
|
+
);
|
|
63
|
+
// Sanity: the fixture is rich enough that the suite actually produced checks.
|
|
64
|
+
assert.ok(sync.length > 0, "expected the fixture to yield environment checks");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("runEnvironmentChecksAsync matches sync on a bare directory (no package.json)", async (t) => {
|
|
68
|
+
const dir = makeProject(t, {});
|
|
69
|
+
const sync = runEnvironmentChecks(dir);
|
|
70
|
+
const asyncResults = await runEnvironmentChecksAsync(dir);
|
|
71
|
+
assert.deepEqual(normalize(asyncResults), normalize(sync));
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test(
|
|
75
|
+
"single-scan port check detects a real in-use port, identically sync and async",
|
|
76
|
+
{ skip: process.platform === "win32" ? "lsof-based port check is macOS/Linux only" : false },
|
|
77
|
+
async (t) => {
|
|
78
|
+
// Bind a real listener, then reference its port from package.json scripts so
|
|
79
|
+
// collectPortsToCheck picks it up. The server stays up across both check runs.
|
|
80
|
+
const server = createServer();
|
|
81
|
+
const port = await new Promise<number>((resolve, reject) => {
|
|
82
|
+
server.once("error", reject);
|
|
83
|
+
server.listen(0, "127.0.0.1", () => {
|
|
84
|
+
const addr = server.address();
|
|
85
|
+
resolve(typeof addr === "object" && addr ? addr.port : 0);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
t.after(() => new Promise<void>((resolve) => server.close(() => resolve())));
|
|
89
|
+
assert.ok(port >= 1024 && port <= 65535, "ephemeral port should be in the checked range");
|
|
90
|
+
|
|
91
|
+
const dir = makeProject(t, {
|
|
92
|
+
"package.json": JSON.stringify({ name: "fixture", scripts: { dev: `serve --port ${port}` } }),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const syncConflicts = runEnvironmentChecks(dir).filter((r) => r.name === "port_conflict");
|
|
96
|
+
const asyncConflicts = (await runEnvironmentChecksAsync(dir)).filter((r) => r.name === "port_conflict");
|
|
97
|
+
|
|
98
|
+
// Equivalence holds regardless of whether lsof is present on the runner.
|
|
99
|
+
assert.deepEqual(normalize(asyncConflicts), normalize(syncConflicts), "sync and async must agree on port conflicts");
|
|
100
|
+
// On macOS/Linux lsof is standard, so the listener must be reported and named.
|
|
101
|
+
assert.equal(syncConflicts.length, 1, "expected exactly one port conflict for the in-use port");
|
|
102
|
+
assert.match(syncConflicts[0]!.message, new RegExp(`\\b${port}\\b`), "conflict message must name the in-use port");
|
|
103
|
+
},
|
|
104
|
+
);
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
|
|
6
|
+
export type GsdIntegrationProject = {
|
|
7
|
+
root: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type CreateGsdIntegrationProjectOptions = {
|
|
11
|
+
prefix?: string;
|
|
12
|
+
initialFiles?: Record<string, string>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export function projectRoot(project: GsdIntegrationProject | string): string {
|
|
16
|
+
return typeof project === "string" ? project : project.root;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function git(project: GsdIntegrationProject | string, ...args: string[]): string {
|
|
20
|
+
return execFileSync("git", args, {
|
|
21
|
+
cwd: projectRoot(project),
|
|
22
|
+
encoding: "utf-8",
|
|
23
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
24
|
+
}).trim();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createGsdIntegrationProject(
|
|
28
|
+
options: CreateGsdIntegrationProjectOptions | string = {},
|
|
29
|
+
): GsdIntegrationProject {
|
|
30
|
+
const resolvedOptions = typeof options === "string" ? { prefix: options } : options;
|
|
31
|
+
const prefix = resolvedOptions.prefix ?? "gsd-integration-";
|
|
32
|
+
const root = realpathSync(mkdtempSync(join(tmpdir(), prefix)));
|
|
33
|
+
|
|
34
|
+
git(root, "init");
|
|
35
|
+
git(root, "config", "user.email", "test@test.com");
|
|
36
|
+
git(root, "config", "user.name", "Test");
|
|
37
|
+
git(root, "config", "core.autocrlf", "false");
|
|
38
|
+
|
|
39
|
+
writeProjectFile(root, "README.md", "# test\n");
|
|
40
|
+
for (const [relativePath, content] of Object.entries(resolvedOptions.initialFiles ?? {})) {
|
|
41
|
+
writeProjectFile(root, relativePath, content);
|
|
42
|
+
}
|
|
43
|
+
git(root, "add", ".");
|
|
44
|
+
git(root, "commit", "-m", "init");
|
|
45
|
+
git(root, "branch", "-M", "main");
|
|
46
|
+
|
|
47
|
+
return { root };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function writeProjectFile(
|
|
51
|
+
project: GsdIntegrationProject | string,
|
|
52
|
+
relativePath: string,
|
|
53
|
+
content: string,
|
|
54
|
+
): string {
|
|
55
|
+
const filePath = join(projectRoot(project), relativePath);
|
|
56
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
57
|
+
writeFileSync(filePath, content, "utf-8");
|
|
58
|
+
return filePath;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function writeGsdMilestoneContext(
|
|
62
|
+
project: GsdIntegrationProject | string,
|
|
63
|
+
milestoneId: string,
|
|
64
|
+
content = `# ${milestoneId} Context\n`,
|
|
65
|
+
): string {
|
|
66
|
+
return writeProjectFile(
|
|
67
|
+
project,
|
|
68
|
+
join(".gsd", "milestones", milestoneId, "CONTEXT.md"),
|
|
69
|
+
content,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function commitAll(project: GsdIntegrationProject | string, message: string): void {
|
|
74
|
+
git(project, "add", ".");
|
|
75
|
+
git(project, "commit", "-m", message);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function cleanupGsdIntegrationProject(project: GsdIntegrationProject | string): void {
|
|
79
|
+
rmSync(projectRoot(project), { recursive: true, force: true });
|
|
80
|
+
}
|
|
@@ -317,6 +317,24 @@ test('(k2) run-uat prompt references gsd_uat_result_save, not direct write', ()
|
|
|
317
317
|
);
|
|
318
318
|
});
|
|
319
319
|
|
|
320
|
+
test('(k3) run-uat prompt warns that .gsd glob misses can be symlink traversal artifacts', async () => {
|
|
321
|
+
const base = createFixtureBase();
|
|
322
|
+
try {
|
|
323
|
+
const uatRel = '.gsd/milestones/M001/slices/S01/S01-UAT.md';
|
|
324
|
+
const uatContent = makeUatContent('runtime-executable');
|
|
325
|
+
writeSliceFile(base, 'M001', 'S01', 'UAT', uatContent);
|
|
326
|
+
|
|
327
|
+
const prompt = await buildRunUatPrompt('M001', 'S01', uatRel, uatContent, base);
|
|
328
|
+
|
|
329
|
+
assert.match(prompt, /\.gsd\/\*\*/);
|
|
330
|
+
assert.match(prompt, /symlink-backed/i);
|
|
331
|
+
assert.match(prompt, /do not infer that the GSD harness is missing/i);
|
|
332
|
+
assert.match(prompt, /use the preloaded UAT context/i);
|
|
333
|
+
} finally {
|
|
334
|
+
cleanup(base);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
|
|
320
338
|
test('(l) dispatch preconditions via resolveSliceFile', () => {
|
|
321
339
|
const base = createFixtureBase();
|
|
322
340
|
const uatContent = makeUatContent('artifact-driven');
|
|
@@ -731,6 +749,75 @@ test('(u) run-uat prompt promotes artifact-driven browser specs to browser-execu
|
|
|
731
749
|
}
|
|
732
750
|
});
|
|
733
751
|
|
|
752
|
+
test('(w) run-uat prompt promotes browser-executable harness specs to runtime-executable (M006/S01)', async () => {
|
|
753
|
+
const base = createFixtureBase();
|
|
754
|
+
try {
|
|
755
|
+
const uatRel = '.gsd/milestones/M006/slices/S01/S01-UAT.md';
|
|
756
|
+
const uatContent = [
|
|
757
|
+
'# S01 UAT',
|
|
758
|
+
'',
|
|
759
|
+
'## UAT Type',
|
|
760
|
+
'- UAT mode: browser-executable',
|
|
761
|
+
'',
|
|
762
|
+
'## Preconditions',
|
|
763
|
+
'- Start the local app server with `npm run start`.',
|
|
764
|
+
'- Open the app at `http://127.0.0.1:4173`.',
|
|
765
|
+
'',
|
|
766
|
+
'## Evidence',
|
|
767
|
+
'- Fresh closeout verification command: `npm run test:uat`',
|
|
768
|
+
].join('\n');
|
|
769
|
+
writeSliceFile(base, 'M006', 'S01', 'UAT', uatContent);
|
|
770
|
+
|
|
771
|
+
const prompt = await buildRunUatPrompt('M006', 'S01', uatRel, uatContent, base);
|
|
772
|
+
|
|
773
|
+
assert.match(prompt, /\*\*Detected UAT mode:\*\*\s*`runtime-executable`/);
|
|
774
|
+
assert.match(prompt, /uatType: "runtime-executable"/);
|
|
775
|
+
assert.match(prompt, /Runtime harness override/i);
|
|
776
|
+
assert.match(prompt, /Do \*\*not\*\* call `uat-service-start`/);
|
|
777
|
+
assert.doesNotMatch(prompt, /uatType: "browser-executable"/);
|
|
778
|
+
} finally {
|
|
779
|
+
cleanup(base);
|
|
780
|
+
}
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
test('(w2) run-uat prompt promotes harness from slice context when UAT only names test:server (M007/S01)', async () => {
|
|
784
|
+
const base = createFixtureBase();
|
|
785
|
+
try {
|
|
786
|
+
const uatRel = '.gsd/milestones/M007/slices/S01/S01-UAT.md';
|
|
787
|
+
const uatContent = [
|
|
788
|
+
'# S01 UAT',
|
|
789
|
+
'',
|
|
790
|
+
'## UAT Type',
|
|
791
|
+
'- UAT mode: browser-executable',
|
|
792
|
+
'',
|
|
793
|
+
'## Preconditions',
|
|
794
|
+
'- Start the dev/local verification server with `npm run test:server`.',
|
|
795
|
+
'- Open the app at the localhost URL printed by the server.',
|
|
796
|
+
].join('\n');
|
|
797
|
+
writeSliceFile(base, 'M007', 'S01', 'UAT', uatContent);
|
|
798
|
+
writeSliceFile(
|
|
799
|
+
base,
|
|
800
|
+
'M007',
|
|
801
|
+
'S01',
|
|
802
|
+
'SUMMARY',
|
|
803
|
+
[
|
|
804
|
+
'# S01 Summary',
|
|
805
|
+
'',
|
|
806
|
+
'Verification: `npm run test:uat` passed with clean browser diagnostics.',
|
|
807
|
+
].join('\n'),
|
|
808
|
+
);
|
|
809
|
+
|
|
810
|
+
const prompt = await buildRunUatPrompt('M007', 'S01', uatRel, uatContent, base);
|
|
811
|
+
|
|
812
|
+
assert.match(prompt, /\*\*Detected UAT mode:\*\*\s*`runtime-executable`/);
|
|
813
|
+
assert.match(prompt, /Runtime harness override/i);
|
|
814
|
+
assert.match(prompt, /npm run test:server/);
|
|
815
|
+
assert.match(prompt, /uatType: "runtime-executable"/);
|
|
816
|
+
} finally {
|
|
817
|
+
cleanup(base);
|
|
818
|
+
}
|
|
819
|
+
});
|
|
820
|
+
|
|
734
821
|
test('(v) run-uat prompt keeps deferred browser work artifact-driven', async () => {
|
|
735
822
|
const base = createFixtureBase();
|
|
736
823
|
try {
|
|
@@ -748,4 +835,134 @@ test('(v) run-uat prompt keeps deferred browser work artifact-driven', async ()
|
|
|
748
835
|
cleanup(base);
|
|
749
836
|
}
|
|
750
837
|
});
|
|
838
|
+
|
|
839
|
+
test('(x) checkNeedsRunUat returns runtime-executable when slice SUMMARY names a self-contained harness (M007/S01)', async () => {
|
|
840
|
+
// Regression: the dispatch gate must surface the same effective UAT mode
|
|
841
|
+
// that buildRunUatPrompt emits. When the UAT file alone declares
|
|
842
|
+
// `browser-executable` but the slice SUMMARY references `npm run test:uat`,
|
|
843
|
+
// the prompt promotes to `runtime-executable` — and so must the gate, or
|
|
844
|
+
// the auto-dispatch path requires browser tools / warms up the browser
|
|
845
|
+
// daemon (and may stop dispatch entirely) for a UAT that never touches
|
|
846
|
+
// the browser. See cursor[bot] review on PR #696.
|
|
847
|
+
const base = createFixtureBase();
|
|
848
|
+
try {
|
|
849
|
+
const roadmapDir = join(base, '.gsd', 'milestones', 'M007');
|
|
850
|
+
mkdirSync(roadmapDir, { recursive: true });
|
|
851
|
+
writeFileSync(
|
|
852
|
+
join(roadmapDir, 'M007-ROADMAP.md'),
|
|
853
|
+
[
|
|
854
|
+
'# M007: Test roadmap',
|
|
855
|
+
'',
|
|
856
|
+
'## Slices',
|
|
857
|
+
'',
|
|
858
|
+
'- [x] **S01: Only slice** `risk:low` `depends:[]`',
|
|
859
|
+
'',
|
|
860
|
+
'## Boundary Map',
|
|
861
|
+
'',
|
|
862
|
+
].join('\n'),
|
|
863
|
+
);
|
|
864
|
+
writeSliceFile(
|
|
865
|
+
base,
|
|
866
|
+
'M007',
|
|
867
|
+
'S01',
|
|
868
|
+
'UAT',
|
|
869
|
+
[
|
|
870
|
+
'# S01 UAT',
|
|
871
|
+
'',
|
|
872
|
+
'## UAT Type',
|
|
873
|
+
'- UAT mode: browser-executable',
|
|
874
|
+
'',
|
|
875
|
+
'## Preconditions',
|
|
876
|
+
'- Start the dev/local verification server with `npm run test:server`.',
|
|
877
|
+
].join('\n'),
|
|
878
|
+
);
|
|
879
|
+
writeSliceFile(
|
|
880
|
+
base,
|
|
881
|
+
'M007',
|
|
882
|
+
'S01',
|
|
883
|
+
'SUMMARY',
|
|
884
|
+
[
|
|
885
|
+
'# S01 Summary',
|
|
886
|
+
'',
|
|
887
|
+
'Verification: `npm run test:uat` passed with clean browser diagnostics.',
|
|
888
|
+
].join('\n'),
|
|
889
|
+
);
|
|
890
|
+
|
|
891
|
+
const state = {
|
|
892
|
+
activeMilestone: { id: 'M007', title: 'Test roadmap' },
|
|
893
|
+
activeSlice: null,
|
|
894
|
+
activeTask: null,
|
|
895
|
+
phase: 'validating-milestone',
|
|
896
|
+
recentDecisions: [],
|
|
897
|
+
blockers: [],
|
|
898
|
+
nextAction: 'Validate M007',
|
|
899
|
+
registry: [],
|
|
900
|
+
} as const;
|
|
901
|
+
|
|
902
|
+
const result = await checkNeedsRunUat(base, 'M007', state as any, { uat_dispatch: true } as any);
|
|
903
|
+
assert.deepStrictEqual(
|
|
904
|
+
result,
|
|
905
|
+
{ sliceId: 'S01', uatType: 'runtime-executable' },
|
|
906
|
+
'dispatch gate must mirror the prompt`s runtime-executable promotion so it does not require browser tools',
|
|
907
|
+
);
|
|
908
|
+
} finally {
|
|
909
|
+
cleanup(base);
|
|
910
|
+
}
|
|
911
|
+
});
|
|
912
|
+
|
|
913
|
+
test('(x2) checkNeedsRunUat leaves true browser-executable UAT unpromoted when no harness is referenced', async () => {
|
|
914
|
+
// Counter-test for (x): when the slice SUMMARY does NOT name a
|
|
915
|
+
// self-contained harness, the dispatch gate must still require browser
|
|
916
|
+
// tools for a genuinely browser-executable UAT.
|
|
917
|
+
const base = createFixtureBase();
|
|
918
|
+
try {
|
|
919
|
+
const roadmapDir = join(base, '.gsd', 'milestones', 'M008');
|
|
920
|
+
mkdirSync(roadmapDir, { recursive: true });
|
|
921
|
+
writeFileSync(
|
|
922
|
+
join(roadmapDir, 'M008-ROADMAP.md'),
|
|
923
|
+
[
|
|
924
|
+
'# M008: Test roadmap',
|
|
925
|
+
'',
|
|
926
|
+
'## Slices',
|
|
927
|
+
'',
|
|
928
|
+
'- [x] **S01: Only slice** `risk:low` `depends:[]`',
|
|
929
|
+
'',
|
|
930
|
+
'## Boundary Map',
|
|
931
|
+
'',
|
|
932
|
+
].join('\n'),
|
|
933
|
+
);
|
|
934
|
+
writeSliceFile(base, 'M008', 'S01', 'UAT', makeBrowserObservableUatContent('browser-executable'));
|
|
935
|
+
writeSliceFile(
|
|
936
|
+
base,
|
|
937
|
+
'M008',
|
|
938
|
+
'S01',
|
|
939
|
+
'SUMMARY',
|
|
940
|
+
[
|
|
941
|
+
'# S01 Summary',
|
|
942
|
+
'',
|
|
943
|
+
'Verification: clicked through the UI and confirmed the search box filters todos.',
|
|
944
|
+
].join('\n'),
|
|
945
|
+
);
|
|
946
|
+
|
|
947
|
+
const state = {
|
|
948
|
+
activeMilestone: { id: 'M008', title: 'Test roadmap' },
|
|
949
|
+
activeSlice: null,
|
|
950
|
+
activeTask: null,
|
|
951
|
+
phase: 'validating-milestone',
|
|
952
|
+
recentDecisions: [],
|
|
953
|
+
blockers: [],
|
|
954
|
+
nextAction: 'Validate M008',
|
|
955
|
+
registry: [],
|
|
956
|
+
} as const;
|
|
957
|
+
|
|
958
|
+
const result = await checkNeedsRunUat(base, 'M008', state as any, { uat_dispatch: true } as any);
|
|
959
|
+
assert.deepStrictEqual(
|
|
960
|
+
result,
|
|
961
|
+
{ sliceId: 'S01', uatType: 'browser-executable' },
|
|
962
|
+
'a true browser-executable UAT without a harness reference must keep its browser-executable mode',
|
|
963
|
+
);
|
|
964
|
+
} finally {
|
|
965
|
+
cleanup(base);
|
|
966
|
+
}
|
|
967
|
+
});
|
|
751
968
|
});
|