@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.a6376d75
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-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +2 -19
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/loader.js +6 -4
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- 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 +123 -20
- 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/bg-shell/utilities.js +3 -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 +456 -198
- 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 +35 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +81 -19
- package/dist/resources/extensions/gsd/auto-start.js +41 -18
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +12 -20
- package/dist/resources/extensions/gsd/auto-verification.js +23 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +45 -92
- package/dist/resources/extensions/gsd/auto.js +56 -15
- 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 +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 +212 -48
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +303 -77
- 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 +4 -6
- 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 +12 -15
- 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 +258 -131
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- 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/gsd-command-home.js +22 -12
- package/dist/resources/extensions/gsd/gsd-db.js +2 -1
- package/dist/resources/extensions/gsd/guidance.js +158 -0
- package/dist/resources/extensions/gsd/guided-flow.js +110 -6
- 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/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 +4 -1
- 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/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- 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/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 +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +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/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 +37 -94
- 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 +12 -22
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +108 -0
- 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 +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -8
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +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-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 +367 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-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/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- 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-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- 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 +13 -13
- 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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- 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 -15
- 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/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/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 -50
- 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 +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +178 -82
- 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 +35 -125
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +46 -120
- 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/bg-shell/utilities.ts +3 -0
- 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 +537 -202
- 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 +40 -8
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -35
- package/src/resources/extensions/gsd/auto-start.ts +42 -21
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +14 -21
- package/src/resources/extensions/gsd/auto-verification.ts +26 -28
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -95
- package/src/resources/extensions/gsd/auto.ts +72 -17
- 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 +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 +251 -47
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +352 -84
- 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 +4 -6
- 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 +13 -11
- 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 +269 -149
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- 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/gsd-command-home.ts +13 -3
- package/src/resources/extensions/gsd/gsd-db.ts +4 -3
- package/src/resources/extensions/gsd/guidance.ts +217 -0
- package/src/resources/extensions/gsd/guided-flow.ts +161 -26
- 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/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 +4 -1
- 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/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- 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/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 +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +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/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 +42 -96
- 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 +16 -22
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- 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 +77 -1
- 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/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -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/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 +148 -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 +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +88 -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/notification-store.test.ts +32 -0
- 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/pre-execution-checks.test.ts +193 -1
- 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-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- 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 +27 -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/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +80 -2
- 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 +329 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/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 +67 -4
- 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 +275 -40
- 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 +183 -0
- 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 +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -8
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +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-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 +442 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-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/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- 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-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- 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/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → xyMkEaICFHJoa98VgJyzY}/_ssgManifest.js +0 -0
|
@@ -14,6 +14,8 @@ import { deriveState, invalidateStateCache } from "../state.ts";
|
|
|
14
14
|
import {
|
|
15
15
|
getPendingGate,
|
|
16
16
|
loadWriteGateSnapshot,
|
|
17
|
+
markApprovalGateVerified,
|
|
18
|
+
markDepthVerified,
|
|
17
19
|
resetWriteGateState,
|
|
18
20
|
setPendingGate,
|
|
19
21
|
shouldBlockContextArtifactSave,
|
|
@@ -892,3 +894,158 @@ test("register-hooks agent_end does not re-arm deferred gate after workflow MCP
|
|
|
892
894
|
pendingGateId: null,
|
|
893
895
|
});
|
|
894
896
|
});
|
|
897
|
+
|
|
898
|
+
// ── External-engine post-hoc gate replay (write-gate two-process sync) ──────
|
|
899
|
+
// On claude-code-cli, pi ingests the SDK turn's tool blocks after the workflow
|
|
900
|
+
// MCP child already executed them. The depth gate can therefore arrive at
|
|
901
|
+
// tool_execution_start AFTER the child verified it and allowed the CONTEXT
|
|
902
|
+
// save; re-arming then wipes the verification and permanently blocks the
|
|
903
|
+
// discuss→auto handoff.
|
|
904
|
+
|
|
905
|
+
function makeHookHarness(): {
|
|
906
|
+
handlers: Map<string, Array<(event: any, ctx?: any) => Promise<any> | any>>;
|
|
907
|
+
pi: any;
|
|
908
|
+
} {
|
|
909
|
+
const handlers = new Map<string, Array<(event: any, ctx?: any) => Promise<any> | any>>();
|
|
910
|
+
const pi = {
|
|
911
|
+
on(event: string, handler: (event: any, ctx?: any) => Promise<any> | any) {
|
|
912
|
+
const existing = handlers.get(event) ?? [];
|
|
913
|
+
existing.push(handler);
|
|
914
|
+
handlers.set(event, existing);
|
|
915
|
+
},
|
|
916
|
+
} as any;
|
|
917
|
+
return { handlers, pi };
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
test("tool_execution_start does not re-arm a depth gate the MCP child already verified", async (t) => {
|
|
921
|
+
const dir = makeTempDir("posthoc-no-rearm");
|
|
922
|
+
resetWriteGateState(dir);
|
|
923
|
+
t.after(() => {
|
|
924
|
+
resetWriteGateState(dir);
|
|
925
|
+
rmSync(dir, { recursive: true, force: true });
|
|
926
|
+
});
|
|
927
|
+
|
|
928
|
+
const { handlers, pi } = makeHookHarness();
|
|
929
|
+
registerHooks(pi, []);
|
|
930
|
+
const ctx = { cwd: dir, ui: { notify: () => undefined } } as any;
|
|
931
|
+
|
|
932
|
+
// The child verified the gate and allowed the CONTEXT save before the host
|
|
933
|
+
// ever saw the tool block.
|
|
934
|
+
markApprovalGateVerified("depth_verification_M002_confirm", dir);
|
|
935
|
+
markDepthVerified("M002", dir);
|
|
936
|
+
|
|
937
|
+
for (const handler of handlers.get("tool_execution_start") ?? []) {
|
|
938
|
+
await handler({
|
|
939
|
+
toolCallId: "t-depth",
|
|
940
|
+
toolName: "mcp__gsd-workflow__ask_user_questions",
|
|
941
|
+
args: { questions: [{ id: "depth_verification_M002_confirm" }] },
|
|
942
|
+
}, ctx);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
assert.equal(getPendingGate(dir), null, "post-hoc replay must not re-arm a verified gate");
|
|
946
|
+
const snapshot = loadWriteGateSnapshot(dir);
|
|
947
|
+
assert.ok(
|
|
948
|
+
snapshot.verifiedDepthMilestones.includes("M002"),
|
|
949
|
+
"re-arm wipes verifiedDepthMilestones — the verification must survive the replay",
|
|
950
|
+
);
|
|
951
|
+
assert.equal(
|
|
952
|
+
shouldBlockContextArtifactSave("CONTEXT", "M002", null, dir).block,
|
|
953
|
+
false,
|
|
954
|
+
"context saves must stay unlocked after the replayed tool_execution_start",
|
|
955
|
+
);
|
|
956
|
+
});
|
|
957
|
+
|
|
958
|
+
test("tool_execution_start still arms an unverified depth gate", async (t) => {
|
|
959
|
+
const dir = makeTempDir("live-arm");
|
|
960
|
+
resetWriteGateState(dir);
|
|
961
|
+
t.after(() => {
|
|
962
|
+
resetWriteGateState(dir);
|
|
963
|
+
rmSync(dir, { recursive: true, force: true });
|
|
964
|
+
});
|
|
965
|
+
|
|
966
|
+
const { handlers, pi } = makeHookHarness();
|
|
967
|
+
registerHooks(pi, []);
|
|
968
|
+
const ctx = { cwd: dir, ui: { notify: () => undefined } } as any;
|
|
969
|
+
|
|
970
|
+
for (const handler of handlers.get("tool_execution_start") ?? []) {
|
|
971
|
+
await handler({
|
|
972
|
+
toolCallId: "t-depth",
|
|
973
|
+
toolName: "ask_user_questions",
|
|
974
|
+
args: { questions: [{ id: "depth_verification_M002_confirm" }] },
|
|
975
|
+
}, ctx);
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
assert.equal(getPendingGate(dir), "depth_verification_M002_confirm");
|
|
979
|
+
});
|
|
980
|
+
|
|
981
|
+
test("tool_result verifies the gate from result.structuredContent when event.details is missing", async (t) => {
|
|
982
|
+
const dir = makeTempDir("structured-fallback");
|
|
983
|
+
resetWriteGateState(dir);
|
|
984
|
+
t.after(() => {
|
|
985
|
+
resetWriteGateState(dir);
|
|
986
|
+
rmSync(dir, { recursive: true, force: true });
|
|
987
|
+
});
|
|
988
|
+
|
|
989
|
+
const { handlers, pi } = makeHookHarness();
|
|
990
|
+
registerHooks(pi, []);
|
|
991
|
+
const ctx = { cwd: dir, ui: { notify: () => undefined } } as any;
|
|
992
|
+
|
|
993
|
+
setPendingGate("depth_verification_M002_confirm", dir);
|
|
994
|
+
|
|
995
|
+
const questions = [{
|
|
996
|
+
id: "depth_verification_M002_confirm",
|
|
997
|
+
options: [
|
|
998
|
+
{ label: "Yes, you got it (Recommended)" },
|
|
999
|
+
{ label: "Not quite — let me clarify" },
|
|
1000
|
+
],
|
|
1001
|
+
}];
|
|
1002
|
+
for (const handler of handlers.get("tool_result") ?? []) {
|
|
1003
|
+
await handler({
|
|
1004
|
+
toolCallId: "t-depth",
|
|
1005
|
+
toolName: "mcp__gsd-workflow__ask_user_questions",
|
|
1006
|
+
input: { questions },
|
|
1007
|
+
// External MCP relay: no pi-native details, structured payload on result.
|
|
1008
|
+
result: {
|
|
1009
|
+
content: [{ type: "text", text: "answered" }],
|
|
1010
|
+
structuredContent: {
|
|
1011
|
+
questions,
|
|
1012
|
+
response: {
|
|
1013
|
+
answers: {
|
|
1014
|
+
depth_verification_M002_confirm: { selected: "Yes, you got it (Recommended)", notes: "" },
|
|
1015
|
+
},
|
|
1016
|
+
},
|
|
1017
|
+
cancelled: false,
|
|
1018
|
+
},
|
|
1019
|
+
},
|
|
1020
|
+
}, ctx);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
assert.equal(getPendingGate(dir), null, "structured fallback must clear the pending gate");
|
|
1024
|
+
assert.ok(loadWriteGateSnapshot(dir).verifiedDepthMilestones.includes("M002"));
|
|
1025
|
+
});
|
|
1026
|
+
|
|
1027
|
+
test("tool_result without details or structured content leaves the gate pending without crashing", async (t) => {
|
|
1028
|
+
const dir = makeTempDir("no-details");
|
|
1029
|
+
resetWriteGateState(dir);
|
|
1030
|
+
t.after(() => {
|
|
1031
|
+
resetWriteGateState(dir);
|
|
1032
|
+
rmSync(dir, { recursive: true, force: true });
|
|
1033
|
+
});
|
|
1034
|
+
|
|
1035
|
+
const { handlers, pi } = makeHookHarness();
|
|
1036
|
+
registerHooks(pi, []);
|
|
1037
|
+
const ctx = { cwd: dir, ui: { notify: () => undefined } } as any;
|
|
1038
|
+
|
|
1039
|
+
setPendingGate("depth_verification_M002_confirm", dir);
|
|
1040
|
+
|
|
1041
|
+
for (const handler of handlers.get("tool_result") ?? []) {
|
|
1042
|
+
await handler({
|
|
1043
|
+
toolCallId: "t-depth",
|
|
1044
|
+
toolName: "ask_user_questions",
|
|
1045
|
+
input: { questions: [{ id: "depth_verification_M002_confirm" }] },
|
|
1046
|
+
result: { content: [{ type: "text", text: "answered" }] },
|
|
1047
|
+
}, ctx);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
assert.equal(getPendingGate(dir), "depth_verification_M002_confirm");
|
|
1051
|
+
});
|
|
@@ -5,103 +5,53 @@
|
|
|
5
5
|
* as a fire-and-forget side-effect so that Telegram/Slack/Discord channels
|
|
6
6
|
* receive the same events as native desktop notifications.
|
|
7
7
|
*
|
|
8
|
-
* Testing strategy (
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 2. The sendDesktopNotification function body calls sendRemoteNotification
|
|
14
|
-
* with title and message as arguments.
|
|
15
|
-
* 3. The call uses the void fire-and-forget pattern with a .catch(() => {})
|
|
16
|
-
* suppressor so that async failures never break the synchronous caller.
|
|
8
|
+
* Testing strategy (behavioral):
|
|
9
|
+
* Import sendDesktopNotification and the swappable remoteNotificationDispatcher.
|
|
10
|
+
* Mock the dispatcher's send method, call sendDesktopNotification, and assert
|
|
11
|
+
* that the dispatcher received the same title/message and that the call is
|
|
12
|
+
* fire-and-forget (the function returns without awaiting).
|
|
17
13
|
*
|
|
18
14
|
* Relates to #4341.
|
|
19
15
|
*/
|
|
20
16
|
|
|
21
17
|
import test from "node:test";
|
|
22
18
|
import assert from "node:assert/strict";
|
|
23
|
-
import { readFileSync } from "node:fs";
|
|
24
|
-
import { join, dirname } from "node:path";
|
|
25
|
-
import { fileURLToPath } from "node:url";
|
|
26
19
|
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
import {
|
|
21
|
+
sendDesktopNotification,
|
|
22
|
+
remoteNotificationDispatcher,
|
|
23
|
+
} from "../notifications.js";
|
|
29
24
|
|
|
30
|
-
test("
|
|
31
|
-
const
|
|
32
|
-
SOURCE.includes('from "../remote-questions/notify.js"') ||
|
|
33
|
-
SOURCE.includes("from '../remote-questions/notify.js'");
|
|
34
|
-
assert.ok(
|
|
35
|
-
hasImport,
|
|
36
|
-
"notifications.ts must import from '../remote-questions/notify.js'",
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
const importLine = SOURCE.split("\n").find(
|
|
40
|
-
(line) =>
|
|
41
|
-
line.includes("sendRemoteNotification") &&
|
|
42
|
-
(line.includes("remote-questions/notify") || line.includes("remote-questions/notify.js")),
|
|
43
|
-
);
|
|
44
|
-
assert.ok(
|
|
45
|
-
importLine,
|
|
46
|
-
"The import statement must include sendRemoteNotification from the remote-questions/notify module",
|
|
47
|
-
);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test("sendDesktopNotification calls sendRemoteNotification(title, message)", () => {
|
|
51
|
-
// Extract the body of sendDesktopNotification — from its opening brace to the
|
|
52
|
-
// closing brace at the same indentation level.
|
|
53
|
-
const fnStart = SOURCE.indexOf("export function sendDesktopNotification(");
|
|
54
|
-
assert.ok(fnStart > -1, "sendDesktopNotification must be present in notifications.ts");
|
|
25
|
+
test("sendDesktopNotification calls sendRemoteNotification with title and message", async (t) => {
|
|
26
|
+
const sendMock = t.mock.method(remoteNotificationDispatcher, "send", async () => {});
|
|
55
27
|
|
|
56
|
-
|
|
57
|
-
const nextExportIdx = SOURCE.indexOf("\nexport ", fnStart + 1);
|
|
58
|
-
const fnBody = nextExportIdx > -1 ? SOURCE.slice(fnStart, nextExportIdx) : SOURCE.slice(fnStart);
|
|
59
|
-
|
|
60
|
-
assert.ok(
|
|
61
|
-
fnBody.includes("sendRemoteNotification"),
|
|
62
|
-
"sendDesktopNotification must call sendRemoteNotification",
|
|
63
|
-
);
|
|
28
|
+
sendDesktopNotification("Test Title", "Test Message");
|
|
64
29
|
|
|
65
|
-
assert.
|
|
66
|
-
|
|
67
|
-
"sendRemoteNotification must be called with title as first argument",
|
|
68
|
-
);
|
|
30
|
+
assert.equal(sendMock.mock.callCount(), 1);
|
|
31
|
+
assert.deepEqual(sendMock.mock.calls[0].arguments, ["Test Title", "Test Message"]);
|
|
69
32
|
});
|
|
70
33
|
|
|
71
|
-
test("
|
|
72
|
-
const
|
|
73
|
-
const nextExportIdx = SOURCE.indexOf("\nexport ", fnStart + 1);
|
|
74
|
-
const fnBody = nextExportIdx > -1 ? SOURCE.slice(fnStart, nextExportIdx) : SOURCE.slice(fnStart);
|
|
34
|
+
test("sendDesktopNotification does not await the remote notification", async (t) => {
|
|
35
|
+
const sendMock = t.mock.method(remoteNotificationDispatcher, "send", async () => {});
|
|
75
36
|
|
|
76
|
-
|
|
77
|
-
fnBody.includes("void sendRemoteNotification("),
|
|
78
|
-
"sendRemoteNotification must be called with void (fire-and-forget)",
|
|
79
|
-
);
|
|
37
|
+
const result = sendDesktopNotification("Async Title", "Async Message");
|
|
80
38
|
|
|
81
|
-
assert.
|
|
82
|
-
|
|
83
|
-
"sendRemoteNotification call must be followed by .catch() to suppress unhandled-rejection warnings",
|
|
84
|
-
);
|
|
39
|
+
assert.equal(result, undefined, "sendDesktopNotification must return void");
|
|
40
|
+
assert.equal(sendMock.mock.callCount(), 1);
|
|
85
41
|
});
|
|
86
42
|
|
|
87
|
-
test("
|
|
88
|
-
|
|
89
|
-
// gated behind the desktop-notification preference check. Users who disable
|
|
90
|
-
// desktop notifications must still receive Telegram/Slack/Discord messages.
|
|
91
|
-
const fnStart = SOURCE.indexOf("export function sendDesktopNotification(");
|
|
92
|
-
assert.ok(fnStart > -1, "sendDesktopNotification must be present in notifications.ts");
|
|
93
|
-
|
|
94
|
-
const nextExportIdx = SOURCE.indexOf("\nexport ", fnStart + 1);
|
|
95
|
-
const fnBody = nextExportIdx > -1 ? SOURCE.slice(fnStart, nextExportIdx) : SOURCE.slice(fnStart);
|
|
43
|
+
test("sendDesktopNotification fires remote notification even when desktop notifications are disabled", async (t) => {
|
|
44
|
+
const sendMock = t.mock.method(remoteNotificationDispatcher, "send", async () => {});
|
|
96
45
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
remoteCallIdx < guardIdx,
|
|
105
|
-
`sendRemoteNotification (pos ${remoteCallIdx}) must appear BEFORE the shouldSendDesktopNotification guard (pos ${guardIdx}) so that remote channels fire even when desktop notifications are disabled`,
|
|
46
|
+
sendDesktopNotification(
|
|
47
|
+
"Remote Title",
|
|
48
|
+
"Remote Message",
|
|
49
|
+
"info",
|
|
50
|
+
"complete",
|
|
51
|
+
undefined,
|
|
52
|
+
{ notifications: { enabled: false } },
|
|
106
53
|
);
|
|
54
|
+
|
|
55
|
+
assert.equal(sendMock.mock.callCount(), 1);
|
|
56
|
+
assert.deepEqual(sendMock.mock.calls[0].arguments, ["Remote Title", "Remote Message"]);
|
|
107
57
|
});
|
|
@@ -200,6 +200,74 @@ test("parseRoadmapSlices: checkbox slices with pipe characters do not switch to
|
|
|
200
200
|
assert.deepEqual(slices[2]?.depends, ["S01", "S02"]);
|
|
201
201
|
});
|
|
202
202
|
|
|
203
|
+
test("parseRoadmapSlices: demo markdown table does not switch checkbox roadmap to table mode (#721)", () => {
|
|
204
|
+
const checkboxWithDemoTable = [
|
|
205
|
+
"# M004: Demo Table Repro",
|
|
206
|
+
"",
|
|
207
|
+
"## Slices",
|
|
208
|
+
"",
|
|
209
|
+
"- [x] **S01: First** `risk:low` `depends:[]`",
|
|
210
|
+
" > After this: cli can render examples:",
|
|
211
|
+
"| Example | Meaning |",
|
|
212
|
+
"| --- | --- |",
|
|
213
|
+
"| S01 | Not a roadmap row |",
|
|
214
|
+
"- [ ] **S02: Second** `risk:medium` `depends:[S01]`",
|
|
215
|
+
" > After this: cat file | sort returns stable output.",
|
|
216
|
+
"",
|
|
217
|
+
].join("\n");
|
|
218
|
+
|
|
219
|
+
const slices = parseRoadmapSlices(checkboxWithDemoTable);
|
|
220
|
+
assert.equal(slices.length, 2);
|
|
221
|
+
assert.equal(slices[0]?.id, "S01");
|
|
222
|
+
assert.equal(slices[0]?.title, "First");
|
|
223
|
+
assert.equal(slices[0]?.done, true);
|
|
224
|
+
assert.equal(slices[1]?.id, "S02");
|
|
225
|
+
assert.deepEqual(slices[1]?.depends, ["S01"]);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test("parseRoadmapSlices: table preceded by intro prose still parsed as table (#722)", () => {
|
|
229
|
+
const tableWithIntro = [
|
|
230
|
+
"# M005: Intro Before Table",
|
|
231
|
+
"",
|
|
232
|
+
"## Slices",
|
|
233
|
+
"",
|
|
234
|
+
"This milestone is broken into the following slices:",
|
|
235
|
+
"",
|
|
236
|
+
"| Slice | Title | Risk | Status |",
|
|
237
|
+
"| --- | --- | --- | --- |",
|
|
238
|
+
"| S01 | Foundation | Low | [x] Done |",
|
|
239
|
+
"| S02 | Core | High | [ ] Pending |",
|
|
240
|
+
"",
|
|
241
|
+
].join("\n");
|
|
242
|
+
|
|
243
|
+
const slices = parseRoadmapSlices(tableWithIntro);
|
|
244
|
+
assert.equal(slices.length, 2);
|
|
245
|
+
assert.equal(slices[0]?.id, "S01");
|
|
246
|
+
assert.equal(slices[0]?.done, true);
|
|
247
|
+
assert.equal(slices[1]?.id, "S02");
|
|
248
|
+
assert.equal(slices[1]?.done, false);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("parseRoadmapSlices: table without markdown separator row still parsed as table (#722)", () => {
|
|
252
|
+
const tableWithoutSeparator = [
|
|
253
|
+
"# M006: No Separator",
|
|
254
|
+
"",
|
|
255
|
+
"## Slices",
|
|
256
|
+
"",
|
|
257
|
+
"| Slice | Title | Risk | Status |",
|
|
258
|
+
"| S01 | Foundation | Low | [x] Done |",
|
|
259
|
+
"| S02 | Core | High | [ ] Pending |",
|
|
260
|
+
"",
|
|
261
|
+
].join("\n");
|
|
262
|
+
|
|
263
|
+
const slices = parseRoadmapSlices(tableWithoutSeparator);
|
|
264
|
+
assert.equal(slices.length, 2);
|
|
265
|
+
assert.equal(slices[0]?.id, "S01");
|
|
266
|
+
assert.equal(slices[0]?.done, true);
|
|
267
|
+
assert.equal(slices[1]?.id, "S02");
|
|
268
|
+
assert.equal(slices[1]?.done, false);
|
|
269
|
+
});
|
|
270
|
+
|
|
203
271
|
// --- Prose slice header completion marker tests (#1803) ---
|
|
204
272
|
|
|
205
273
|
test("parseRoadmapSlices: prose headers with ✓ marker detected as done", () => {
|
|
@@ -6,7 +6,11 @@ import assert from "node:assert/strict";
|
|
|
6
6
|
|
|
7
7
|
import { classifyFailure } from "../recovery-classification.js";
|
|
8
8
|
import { reconcileBeforeDispatch } from "../state-reconciliation.js";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
compileUnitContextContract,
|
|
11
|
+
compileUnitToolContract,
|
|
12
|
+
getUnitWorkflowDispatchReadinessError,
|
|
13
|
+
} from "../tool-contract.js";
|
|
10
14
|
import { shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
11
15
|
import type { GSDState } from "../types.js";
|
|
12
16
|
|
|
@@ -63,7 +67,13 @@ test("Tool Contract compiles known Unit prompt and tool policy", () => {
|
|
|
63
67
|
|
|
64
68
|
assert.equal(result.ok, true);
|
|
65
69
|
assert.equal(result.ok && result.contract.unitType, "execute-task");
|
|
66
|
-
assert.deepEqual(result.ok && result.contract.requiredWorkflowTools, [
|
|
70
|
+
assert.deepEqual(result.ok && result.contract.requiredWorkflowTools, [
|
|
71
|
+
"gsd_task_complete",
|
|
72
|
+
"gsd_exec",
|
|
73
|
+
"gsd_exec_search",
|
|
74
|
+
"gsd_resume",
|
|
75
|
+
"gsd_capture_thought",
|
|
76
|
+
]);
|
|
67
77
|
assert.deepEqual(result.ok && result.contract.forbiddenWorkflowTools, []);
|
|
68
78
|
assert.equal(result.ok && result.contract.toolsPolicy.mode, "all");
|
|
69
79
|
assert.ok(result.ok && result.contract.validationRules.includes("closeout-tool-present"));
|
|
@@ -87,6 +97,20 @@ test("Tool Contract compiles known Unit prompt and tool policy", () => {
|
|
|
87
97
|
});
|
|
88
98
|
});
|
|
89
99
|
|
|
100
|
+
test("Tool Contract derives dispatch readiness from Unit workflow tools", () => {
|
|
101
|
+
const error = getUnitWorkflowDispatchReadinessError({
|
|
102
|
+
provider: "claude-code",
|
|
103
|
+
unitType: "plan-slice",
|
|
104
|
+
projectRoot: "/tmp/project",
|
|
105
|
+
env: { GSD_WORKFLOW_MCP_COMMAND: "node" },
|
|
106
|
+
surface: "auto-mode",
|
|
107
|
+
authMode: "externalCli",
|
|
108
|
+
baseUrl: "local://claude-code",
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
assert.equal(error, null);
|
|
112
|
+
});
|
|
113
|
+
|
|
90
114
|
test("Unit Context Contract exposes prompt context without workflow tool surface", () => {
|
|
91
115
|
const result = compileUnitContextContract("execute-task");
|
|
92
116
|
|
|
@@ -164,6 +188,7 @@ test("Recovery Classification covers ADR-015 failure families", () => {
|
|
|
164
188
|
const cases = [
|
|
165
189
|
["invalid tool schema enum", "tool-schema", "stop"],
|
|
166
190
|
["Tool Contract failure: complete-slice cannot use gsd_uat_result_save", "tool-contract", "stop"],
|
|
191
|
+
["No such tool available: mcp__gsd-workflow__gsd_uat_exec", "tool-unavailable", "retry"],
|
|
167
192
|
["deterministic policy rejection", "deterministic-policy", "stop"],
|
|
168
193
|
["cannot legally advance because required UAT Assessment artifact is missing", "lifecycle-progression", "stop"],
|
|
169
194
|
["stale worker lease", "stale-worker", "stop"],
|
|
@@ -92,14 +92,14 @@ test("buildSkillActivationBlock activates skills via prefer_skills when context
|
|
|
92
92
|
prefer_skills: ["react"],
|
|
93
93
|
});
|
|
94
94
|
|
|
95
|
-
assert.match(result, /
|
|
95
|
+
assert.match(result, /Read the installed 'react' skill file from <available_skills>/);
|
|
96
96
|
assert.doesNotMatch(result, /swiftui/);
|
|
97
97
|
} finally {
|
|
98
98
|
cleanup(base);
|
|
99
99
|
}
|
|
100
100
|
});
|
|
101
101
|
|
|
102
|
-
test("buildSkillActivationBlock includes always_use_skills
|
|
102
|
+
test("buildSkillActivationBlock includes always_use_skills using read-based skill loading", () => {
|
|
103
103
|
const base = makeTempBase();
|
|
104
104
|
try {
|
|
105
105
|
writeSkill(base, "swift-testing", "Use for Swift Testing assertions and verification patterns.");
|
|
@@ -109,7 +109,10 @@ test("buildSkillActivationBlock includes always_use_skills from preferences usin
|
|
|
109
109
|
always_use_skills: ["swift-testing"],
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
-
assert.equal(
|
|
112
|
+
assert.equal(
|
|
113
|
+
result,
|
|
114
|
+
"<skill_activation>Read the installed 'swift-testing' skill file from <available_skills>.</skill_activation>",
|
|
115
|
+
);
|
|
113
116
|
} finally {
|
|
114
117
|
cleanup(base);
|
|
115
118
|
}
|
|
@@ -137,8 +140,8 @@ test("buildSkillActivationBlock includes skill_rules matches and task-plan skill
|
|
|
137
140
|
skill_rules: [{ when: "prisma database schema", use: ["prisma"] }],
|
|
138
141
|
});
|
|
139
142
|
|
|
140
|
-
assert.match(result, /
|
|
141
|
-
assert.match(result, /
|
|
143
|
+
assert.match(result, /Read the installed 'accessibility' skill file from <available_skills>/);
|
|
144
|
+
assert.match(result, /Read the installed 'prisma' skill file from <available_skills>/);
|
|
142
145
|
} finally {
|
|
143
146
|
cleanup(base);
|
|
144
147
|
}
|
|
@@ -160,7 +163,7 @@ test("buildSkillActivationBlock matches skill_rules against exact unit type cont
|
|
|
160
163
|
],
|
|
161
164
|
});
|
|
162
165
|
|
|
163
|
-
assert.match(result, /
|
|
166
|
+
assert.match(result, /Read the installed 'complete-slice-policies' skill file from <available_skills>/);
|
|
164
167
|
assert.doesNotMatch(result, /slice-broad/);
|
|
165
168
|
} finally {
|
|
166
169
|
cleanup(base);
|
|
@@ -264,8 +267,8 @@ test("buildSkillActivationBlock allows valid skill names and rejects invalid one
|
|
|
264
267
|
});
|
|
265
268
|
|
|
266
269
|
assert.match(result, /skill_activation/);
|
|
267
|
-
assert.match(result, /
|
|
268
|
-
assert.match(result, /
|
|
270
|
+
assert.match(result, /Read the installed 'react' skill file from <available_skills>/);
|
|
271
|
+
assert.match(result, /Read the installed 'good-skill-2' skill file from <available_skills>/);
|
|
269
272
|
assert.doesNotMatch(result, /bad'name/);
|
|
270
273
|
} finally {
|
|
271
274
|
cleanup(base);
|
|
@@ -289,8 +292,8 @@ test("buildSkillActivationBlock: explicit always_use_skills bypass the unit-type
|
|
|
289
292
|
always_use_skills: ["write-docs", "swiftui"],
|
|
290
293
|
});
|
|
291
294
|
|
|
292
|
-
assert.match(result, /
|
|
293
|
-
assert.match(result, /
|
|
295
|
+
assert.match(result, /Read the installed 'write-docs' skill file from <available_skills>/);
|
|
296
|
+
assert.match(result, /Read the installed 'swiftui' skill file from <available_skills>/);
|
|
294
297
|
} finally {
|
|
295
298
|
cleanup(base);
|
|
296
299
|
}
|
|
@@ -307,7 +310,7 @@ test("buildSkillActivationBlock falls through to all skills for unknown unit typ
|
|
|
307
310
|
});
|
|
308
311
|
|
|
309
312
|
// Unknown unit type = wildcard fallback (pre-manifest behavior).
|
|
310
|
-
assert.match(result, /
|
|
313
|
+
assert.match(result, /Read the installed 'swiftui' skill file from <available_skills>/);
|
|
311
314
|
} finally {
|
|
312
315
|
cleanup(base);
|
|
313
316
|
}
|
|
@@ -324,7 +327,7 @@ test("buildSkillActivationBlock without unitType preserves pre-manifest behavior
|
|
|
324
327
|
always_use_skills: ["swiftui"],
|
|
325
328
|
});
|
|
326
329
|
|
|
327
|
-
assert.match(result, /
|
|
330
|
+
assert.match(result, /Read the installed 'swiftui' skill file from <available_skills>/);
|
|
328
331
|
} finally {
|
|
329
332
|
cleanup(base);
|
|
330
333
|
}
|
|
@@ -341,12 +344,12 @@ test("milestone prompt builders propagate always_use_skills through buildSkillAc
|
|
|
341
344
|
loadOnlyTestSkills(base);
|
|
342
345
|
|
|
343
346
|
const researchPrompt = await buildResearchMilestonePrompt("M001", "Test", base);
|
|
344
|
-
assert.match(researchPrompt, /
|
|
345
|
-
assert.match(researchPrompt, /
|
|
347
|
+
assert.match(researchPrompt, /Read the installed 'write-docs' skill file from <available_skills>/);
|
|
348
|
+
assert.match(researchPrompt, /Read the installed 'swiftui' skill file from <available_skills>/);
|
|
346
349
|
|
|
347
350
|
const planPrompt = await buildPlanMilestonePrompt("M001", "Test", base);
|
|
348
|
-
assert.match(planPrompt, /
|
|
349
|
-
assert.match(planPrompt, /
|
|
351
|
+
assert.match(planPrompt, /Read the installed 'write-docs' skill file from <available_skills>/);
|
|
352
|
+
assert.match(planPrompt, /Read the installed 'swiftui' skill file from <available_skills>/);
|
|
350
353
|
} finally {
|
|
351
354
|
cleanup(base);
|
|
352
355
|
}
|
|
@@ -377,7 +380,7 @@ test("complete-slice prompt propagates always_use_skills through buildSkillActiv
|
|
|
377
380
|
|
|
378
381
|
const prompt = await buildCompleteSlicePrompt("M001", "Test", "S01", "Slice", base);
|
|
379
382
|
|
|
380
|
-
assert.match(prompt, /
|
|
383
|
+
assert.match(prompt, /Read the installed 'write-docs' skill file from <available_skills>/);
|
|
381
384
|
} finally {
|
|
382
385
|
cleanup(base);
|
|
383
386
|
}
|
|
@@ -339,7 +339,7 @@ test("resume path only hard-exits on blocked stop, not blocked pause (#6154)", (
|
|
|
339
339
|
);
|
|
340
340
|
});
|
|
341
341
|
|
|
342
|
-
test("prepareForUnit
|
|
342
|
+
test("prepareForUnit enforces worktree safety for all isolation modes (#6154)", () => {
|
|
343
343
|
const orchSrc = readGsdFile("auto/orchestrator.ts");
|
|
344
344
|
const prepareForUnitIdx = orchSrc.indexOf("private async prepareWorktreeForUnit(");
|
|
345
345
|
const prepareForUnitBody = orchSrc.slice(prepareForUnitIdx, orchSrc.indexOf("private classifyAndRecover(", prepareForUnitIdx));
|
|
@@ -350,8 +350,12 @@ test("prepareForUnit skips worktree safety when isolation is not worktree (#6154
|
|
|
350
350
|
"prepareForUnit should resolve the effective isolation mode once",
|
|
351
351
|
);
|
|
352
352
|
assert.ok(
|
|
353
|
-
prepareForUnitBody.includes('
|
|
354
|
-
"prepareForUnit should
|
|
353
|
+
prepareForUnitBody.includes('const writeScope ='),
|
|
354
|
+
"prepareForUnit should classify the unit's write scope before validating",
|
|
355
|
+
);
|
|
356
|
+
assert.ok(
|
|
357
|
+
!prepareForUnitBody.includes('if (isolationMode !== "worktree")'),
|
|
358
|
+
"prepareForUnit must not bypass worktree safety outside worktree isolation mode",
|
|
355
359
|
);
|
|
356
360
|
});
|
|
357
361
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import test from "node:test";
|
|
4
4
|
import assert from "node:assert/strict";
|
|
5
5
|
|
|
6
|
-
import { _resolveCurrentUnitStartedAtForTest } from "../auto/
|
|
6
|
+
import { _resolveCurrentUnitStartedAtForTest } from "../auto/phase-helpers.ts";
|
|
7
7
|
|
|
8
8
|
test("unit started-at resolver tolerates stopAuto clearing currentUnit", () => {
|
|
9
9
|
assert.equal(_resolveCurrentUnitStartedAtForTest(null), undefined);
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// GSD Extension — Stop Notice module tests
|
|
2
|
+
// Locks the emitter↔detector round-trip: every notice the formatters produce
|
|
3
|
+
// must be recognized by the classifiers the headless host uses for exit codes.
|
|
4
|
+
|
|
5
|
+
import { describe, test } from "node:test";
|
|
6
|
+
import assert from "node:assert/strict";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
formatStopNoticePrefix,
|
|
10
|
+
isBlockedStopReason,
|
|
11
|
+
stopNoticeDisplayReason,
|
|
12
|
+
stopNoticeKind,
|
|
13
|
+
isTerminalNotice,
|
|
14
|
+
isPauseNotice,
|
|
15
|
+
isBlockedNoticeMessage,
|
|
16
|
+
isManualResolutionNotice,
|
|
17
|
+
PAUSED_NOTICE_PREFIXES,
|
|
18
|
+
TERMINAL_NOTICE_PREFIXES,
|
|
19
|
+
} from "../stop-notice.js";
|
|
20
|
+
|
|
21
|
+
describe("stop notice formatting", () => {
|
|
22
|
+
test("plain stop has no reason suffix", () => {
|
|
23
|
+
assert.equal(formatStopNoticePrefix(), "Auto-mode stopped");
|
|
24
|
+
assert.equal(formatStopNoticePrefix(null), "Auto-mode stopped");
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("reason is appended after an em-dash", () => {
|
|
28
|
+
assert.equal(formatStopNoticePrefix("user request"), "Auto-mode stopped — user request");
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("Blocked: marker switches the prefix and is stripped from display", () => {
|
|
32
|
+
assert.equal(formatStopNoticePrefix("Blocked: validation gate"), "Auto-mode blocked — validation gate");
|
|
33
|
+
assert.equal(stopNoticeKind("Blocked: x"), "blocked");
|
|
34
|
+
assert.equal(stopNoticeKind("stop"), "stopped");
|
|
35
|
+
assert.ok(isBlockedStopReason("blocked: lowercase too"));
|
|
36
|
+
assert.equal(stopNoticeDisplayReason("Blocked: spaced "), "spaced");
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("emitter↔detector round-trip", () => {
|
|
41
|
+
test("formatted stop notices classify as terminal", () => {
|
|
42
|
+
for (const reason of [undefined, "user request"]) {
|
|
43
|
+
const message = formatStopNoticePrefix(reason).toLowerCase();
|
|
44
|
+
assert.ok(isTerminalNotice(message), `not terminal: ${message}`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("pause prefixes classify as pause and as blocked (operator intervention)", () => {
|
|
49
|
+
for (const prefix of PAUSED_NOTICE_PREFIXES) {
|
|
50
|
+
assert.ok(isPauseNotice(`${prefix}: provider error`));
|
|
51
|
+
assert.ok(isBlockedNoticeMessage(`${prefix}: provider error`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("idempotent-advance pauses are non-blocking", () => {
|
|
56
|
+
assert.equal(isBlockedNoticeMessage("auto-mode paused (idempotent advance: unit already active)"), false);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("manual-resolution notices classify as blocked", () => {
|
|
60
|
+
const message = "merge conflict — resolve manually and re-run /gsd auto";
|
|
61
|
+
assert.ok(isManualResolutionNotice(message));
|
|
62
|
+
assert.ok(isBlockedNoticeMessage(message));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("terminal prefixes cover the known stop vocabulary", () => {
|
|
66
|
+
for (const message of ["auto-mode stopped.", "auto-mode complete", "auto-mode idle", "no active milestone"]) {
|
|
67
|
+
assert.ok(TERMINAL_NOTICE_PREFIXES.some((prefix) => message.startsWith(prefix)), message);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|