@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.9ad8ae33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +14 -34
- package/dist/mcp-server.js +2 -1
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.d.ts +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/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 +30 -4
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
- package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
- package/dist/resources/extensions/gsd/auto/dispatch-history.js +105 -0
- package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +89 -54
- package/dist/resources/extensions/gsd/auto/phases.js +49 -6
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
- package/dist/resources/extensions/gsd/auto-dispatch.js +50 -58
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -13
- package/dist/resources/extensions/gsd/auto-post-unit.js +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 +44 -91
- package/dist/resources/extensions/gsd/auto.js +41 -14
- 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 +23 -6
- 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/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 +26 -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 +2 -6
- 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 +23 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +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/notification-store.js +11 -4
- 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 +3 -3
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
- package/dist/resources/extensions/gsd/recovery-classification.js +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/state.js +6 -20
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
- package/dist/resources/extensions/gsd/tools/complete-task.js +3 -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 +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +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-session-state.js +4 -5
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +116 -6
- package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
- package/dist/resources/shared/package-manager-detection.js +1 -1
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/update-check.d.ts +2 -0
- package/dist/update-check.js +24 -1
- package/dist/update-cmd.js +20 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +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 +2 -2
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +9 -1
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
- package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +4 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +26 -18
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +116 -39
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/README.md +1 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
- package/packages/pi-ai/dist/image-models.generated.js +6 -6
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -0
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +2 -0
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +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/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +5 -4
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +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 +34 -4
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
- package/src/resources/extensions/gsd/auto/dispatch-history.ts +152 -0
- package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +98 -56
- package/src/resources/extensions/gsd/auto/phases.ts +65 -26
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
- package/src/resources/extensions/gsd/auto-dispatch.ts +48 -61
- package/src/resources/extensions/gsd/auto-model-selection.ts +41 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +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 +44 -94
- package/src/resources/extensions/gsd/auto.ts +52 -16
- 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 +23 -6
- 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/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 +37 -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 +2 -7
- 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 +37 -28
- package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +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/notification-store.ts +26 -3
- 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 +3 -3
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +7 -5
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
- package/src/resources/extensions/gsd/recovery-classification.ts +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/state.ts +9 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +97 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +198 -26
- package/src/resources/extensions/gsd/tests/auto-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/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/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 +10 -10
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/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 +2 -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 +73 -58
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +112 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +275 -40
- package/src/resources/extensions/gsd/tests/worktree-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 +76 -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 +3 -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 +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +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-session-state.ts +3 -5
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +141 -6
- package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
- package/src/resources/shared/package-manager-detection.ts +1 -1
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
- package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → FBNo5cT_chy7YNoAQsU3o}/_ssgManifest.js +0 -0
|
@@ -65,4 +65,4 @@ Classify each capture as one of:
|
|
|
65
65
|
|
|
66
66
|
**Important:** Do NOT execute any resolutions. Only classify and update CAPTURES.md. Resolution execution happens separately (in auto-mode dispatch or manually by the user).
|
|
67
67
|
|
|
68
|
-
When done, say: "Triage complete."
|
|
68
|
+
When done, say: "Triage complete." Say this exactly once — if you already said it in a prior message, do not repeat it.
|
|
@@ -87,4 +87,4 @@ If verdict is `needs-remediation`:
|
|
|
87
87
|
|
|
88
88
|
**File system safety:** When scanning milestone directories, use `ls` or `find` first. Never pass a directory path such as `tasks/` or `slices/` directly to `read`; it only accepts files.
|
|
89
89
|
|
|
90
|
-
When done, say: "Milestone {{milestoneId}} validation complete — verdict: <verdict>."
|
|
90
|
+
When done, say: "Milestone {{milestoneId}} validation complete — verdict: <verdict>." Say this exactly once — if you already said it in a prior message, do not repeat it.
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Actionable remediation hints when auto-mode pauses on provider/model errors.
|
|
3
|
+
* Render with formatGuidance from the Guidance module.
|
|
3
4
|
*/
|
|
4
5
|
|
|
6
|
+
import type { Guidance } from "./guidance.js";
|
|
7
|
+
|
|
5
8
|
export interface ProviderErrorGuidanceInput {
|
|
6
9
|
errorMsg: string;
|
|
7
10
|
provider?: string;
|
|
@@ -12,10 +15,7 @@ export interface ProviderErrorGuidanceInput {
|
|
|
12
15
|
hasConfiguredFallbacks?: boolean;
|
|
13
16
|
}
|
|
14
17
|
|
|
15
|
-
export
|
|
16
|
-
summary: string;
|
|
17
|
-
steps: string[];
|
|
18
|
-
}
|
|
18
|
+
export type ProviderErrorGuidance = Guidance;
|
|
19
19
|
|
|
20
20
|
/** Map auto unit types to the `models:` key in PREFERENCES.md. */
|
|
21
21
|
export function unitTypeToPrefsPhaseKey(unitType: string | undefined): string | undefined {
|
|
@@ -129,8 +129,3 @@ export function resolveProviderErrorGuidance(input: ProviderErrorGuidanceInput):
|
|
|
129
129
|
return { summary, steps };
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
/** Flatten guidance into a pause banner / notification string. */
|
|
133
|
-
export function formatProviderErrorGuidance(guidance: ProviderErrorGuidance): string {
|
|
134
|
-
const numbered = guidance.steps.map((step, index) => `${index + 1}. ${step}`).join("\n");
|
|
135
|
-
return `${guidance.summary}\n\n${numbered}`;
|
|
136
|
-
}
|
|
@@ -128,7 +128,7 @@ function emitAudit(report: ProviderSwitchReport): void {
|
|
|
128
128
|
|
|
129
129
|
function emitNotification(report: ProviderSwitchReport): void {
|
|
130
130
|
try {
|
|
131
|
-
appendNotification(summarize(report), "warning", "workflow-logger");
|
|
131
|
+
appendNotification(summarize(report), "warning", "workflow-logger", { kind: "provider-switch" });
|
|
132
132
|
} catch {
|
|
133
133
|
// Notification persistence is best-effort.
|
|
134
134
|
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Project/App: gsd-pi
|
|
2
|
+
// File Purpose: Publication module — push and draft-PR creation for a merged milestone (ADR-034).
|
|
3
|
+
//
|
|
4
|
+
// Publication is distinct from the merge verb: merging a milestone branch is a
|
|
5
|
+
// Worktree Lifecycle concern (worktree, branch, lease, stash discipline);
|
|
6
|
+
// publication needs only the resulting commit, a remote, and preferences.
|
|
7
|
+
// Extracted from the tail of `mergeMilestoneToMain` (auto-worktree.ts) so it is
|
|
8
|
+
// testable without a merge fixture and reachable from any closeout path.
|
|
9
|
+
//
|
|
10
|
+
// Publication failure is non-fatal to a completed local merge: every failure is
|
|
11
|
+
// logged and reported in the result, never thrown.
|
|
12
|
+
|
|
13
|
+
import { execFileSync } from "node:child_process";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
buildPullRequestEvidence,
|
|
17
|
+
createDraftPullRequestFromEvidence,
|
|
18
|
+
} from "./pull-request-process.js";
|
|
19
|
+
import { logWarning } from "./workflow-logger.js";
|
|
20
|
+
|
|
21
|
+
export interface PublicationPrefs {
|
|
22
|
+
autoPush: boolean;
|
|
23
|
+
autoPr: boolean;
|
|
24
|
+
remote?: string;
|
|
25
|
+
prTargetBranch?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface PublicationRequest {
|
|
29
|
+
basePath: string;
|
|
30
|
+
milestoneId: string;
|
|
31
|
+
milestoneTitle: string;
|
|
32
|
+
/** The branch the milestone was merged to (push target for auto-push). */
|
|
33
|
+
integrationBranch: string;
|
|
34
|
+
/** The milestone branch (push + PR head for auto-PR). */
|
|
35
|
+
milestoneBranch: string;
|
|
36
|
+
/** Pre-rendered per-slice summary blocks for the PR body. */
|
|
37
|
+
sliceSummaries: readonly string[];
|
|
38
|
+
/** True when the merge found nothing to commit — publication is skipped. */
|
|
39
|
+
nothingToCommit: boolean;
|
|
40
|
+
prefs: PublicationPrefs;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface PublicationResult {
|
|
44
|
+
pushed: boolean;
|
|
45
|
+
prCreated: boolean;
|
|
46
|
+
prUrl?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function gitRemoteExists(basePath: string, remote: string): boolean {
|
|
50
|
+
try {
|
|
51
|
+
execFileSync("git", ["remote", "get-url", remote], {
|
|
52
|
+
cwd: basePath,
|
|
53
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
54
|
+
encoding: "utf-8",
|
|
55
|
+
});
|
|
56
|
+
return true;
|
|
57
|
+
} catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Publish a merged milestone per preferences: push the integration branch
|
|
64
|
+
* (auto-push, suppressed when auto-PR owns the remote interaction) and/or
|
|
65
|
+
* push the milestone branch and open a draft PR (auto-PR).
|
|
66
|
+
*/
|
|
67
|
+
export function publishMilestone(request: PublicationRequest): PublicationResult {
|
|
68
|
+
const result: PublicationResult = { pushed: false, prCreated: false };
|
|
69
|
+
if (request.nothingToCommit) return result;
|
|
70
|
+
|
|
71
|
+
const { basePath, prefs } = request;
|
|
72
|
+
const remote = prefs.remote ?? "origin";
|
|
73
|
+
|
|
74
|
+
if (prefs.autoPush && !prefs.autoPr && gitRemoteExists(basePath, remote)) {
|
|
75
|
+
try {
|
|
76
|
+
execFileSync("git", ["push", remote, request.integrationBranch], {
|
|
77
|
+
cwd: basePath,
|
|
78
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
79
|
+
encoding: "utf-8",
|
|
80
|
+
});
|
|
81
|
+
result.pushed = true;
|
|
82
|
+
} catch (err) {
|
|
83
|
+
// Push failure is non-fatal
|
|
84
|
+
logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// #2302: PR creation is not gated on pushed/auto-push.
|
|
89
|
+
if (prefs.autoPr && gitRemoteExists(basePath, remote)) {
|
|
90
|
+
try {
|
|
91
|
+
// Push the milestone branch to remote first
|
|
92
|
+
execFileSync("git", ["push", remote, request.milestoneBranch], {
|
|
93
|
+
cwd: basePath,
|
|
94
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
95
|
+
encoding: "utf-8",
|
|
96
|
+
});
|
|
97
|
+
const prEvidence = buildPullRequestEvidence({
|
|
98
|
+
milestoneId: request.milestoneId,
|
|
99
|
+
milestoneTitle: request.milestoneTitle,
|
|
100
|
+
changeType: "feat",
|
|
101
|
+
summaries: [...request.sliceSummaries],
|
|
102
|
+
testsRun: ["Auto-created after milestone merge. Run `npm run verify:merge` before marking this draft ready."],
|
|
103
|
+
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
104
|
+
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
105
|
+
});
|
|
106
|
+
const prUrl = createDraftPullRequestFromEvidence(basePath, request.milestoneId, prEvidence, {
|
|
107
|
+
head: request.milestoneBranch,
|
|
108
|
+
base: prefs.prTargetBranch ?? request.integrationBranch,
|
|
109
|
+
});
|
|
110
|
+
if (!prUrl) {
|
|
111
|
+
throw new Error("gh pr create returned no URL");
|
|
112
|
+
}
|
|
113
|
+
result.prCreated = true;
|
|
114
|
+
result.prUrl = prUrl;
|
|
115
|
+
} catch (err) {
|
|
116
|
+
// PR creation failure is non-fatal — gh may not be installed or authenticated
|
|
117
|
+
logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
@@ -12,7 +12,11 @@
|
|
|
12
12
|
import type { TaskIO, DerivedTaskNode, ReactiveExecutionState } from "./types.js";
|
|
13
13
|
import { loadFile, parseTaskPlanIO } from "./files.js";
|
|
14
14
|
import { isDbAvailable, getSliceTasks } from "./gsd-db.js";
|
|
15
|
+
// Explicit degraded-mode fallback ONLY (ADR-017): parsePlan is consulted when
|
|
16
|
+
// the DB is unavailable or has no task rows for the slice; the DB path in
|
|
17
|
+
// loadSliceTaskIO always wins when rows exist, and the fallback logs a warning.
|
|
15
18
|
import { parsePlan } from "./parsers-legacy.js";
|
|
19
|
+
import { logWarning } from "./workflow-logger.js";
|
|
16
20
|
import { resolveTasksDir, resolveTaskFiles } from "./paths.js";
|
|
17
21
|
import { join } from "node:path";
|
|
18
22
|
import { loadJsonFileOrNull, saveJsonFile } from "./json-persistence.js";
|
|
@@ -224,7 +228,13 @@ export async function loadSliceTaskIO(
|
|
|
224
228
|
} catch { /* fall through */ }
|
|
225
229
|
|
|
226
230
|
if (!taskEntries) {
|
|
227
|
-
//
|
|
231
|
+
// Degraded-mode fallback (ADR-017): no DB task rows for this slice —
|
|
232
|
+
// parse the PLAN.md projection instead. Warn so silent drift from the
|
|
233
|
+
// DB-authoritative path is visible in logs.
|
|
234
|
+
logWarning(
|
|
235
|
+
"projection",
|
|
236
|
+
`reactive-graph: DB unavailable or no task rows for ${mid}/${sid}; falling back to PLAN.md parsing`,
|
|
237
|
+
);
|
|
228
238
|
const parsed = parsePlan(planContent);
|
|
229
239
|
if (parsed.tasks.length > 0) {
|
|
230
240
|
taskEntries = parsed.tasks.map(t => ({
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: ADR-015 Recovery Classification module for runtime failure taxonomy.
|
|
3
3
|
|
|
4
|
+
import { isToolUnavailableError } from "./auto-tool-tracking.js";
|
|
4
5
|
import { classifyError, isTransient, type ErrorClass } from "./error-classifier.js";
|
|
6
|
+
import { recoveryRemediation } from "./guidance.js";
|
|
5
7
|
import { ReconciliationFailedError } from "./state-reconciliation.js";
|
|
6
8
|
import { IllegalPhaseTransitionError } from "./state-transition-matrix.js";
|
|
7
9
|
|
|
8
10
|
export type RecoveryFailureKind =
|
|
9
11
|
| "tool-schema"
|
|
10
12
|
| "tool-contract"
|
|
13
|
+
| "tool-unavailable"
|
|
11
14
|
| "deterministic-policy"
|
|
12
15
|
| "lifecycle-progression"
|
|
13
16
|
| "stale-worker"
|
|
@@ -49,106 +52,49 @@ export function classifyFailure(input: RecoveryClassificationInput): RecoveryCla
|
|
|
49
52
|
? "illegal-transition"
|
|
50
53
|
: input.failureKind ?? inferFailureKind(message);
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
failureKind,
|
|
64
|
-
action: "stop",
|
|
65
|
-
reason: `Tool Contract failure${unitSuffix(input)}: ${message}`,
|
|
66
|
-
exitReason: "tool-contract",
|
|
67
|
-
remediation: "Fix the Unit Tool Contract or prompt so the Unit is only asked to use tools owned by its phase.",
|
|
68
|
-
};
|
|
69
|
-
case "deterministic-policy":
|
|
70
|
-
return {
|
|
71
|
-
failureKind,
|
|
72
|
-
action: "stop",
|
|
73
|
-
reason: `Deterministic policy failure${unitSuffix(input)}: ${message}`,
|
|
74
|
-
exitReason: "deterministic-policy",
|
|
75
|
-
remediation: "Resolve the policy blocker; retrying the same Unit will repeat the failure.",
|
|
76
|
-
};
|
|
77
|
-
case "lifecycle-progression":
|
|
78
|
-
return {
|
|
79
|
-
failureKind,
|
|
80
|
-
action: "stop",
|
|
81
|
-
reason: `Lifecycle progression failure${unitSuffix(input)}: ${message}`,
|
|
82
|
-
exitReason: "lifecycle-progression",
|
|
83
|
-
remediation: "Route to the required owning Unit or restore the missing artifact before advancing lifecycle state.",
|
|
84
|
-
};
|
|
85
|
-
case "stale-worker":
|
|
86
|
-
return {
|
|
87
|
-
failureKind,
|
|
88
|
-
action: "stop",
|
|
89
|
-
reason: `Stale worker failure${unitSuffix(input)}: ${message}`,
|
|
90
|
-
exitReason: "stale-worker",
|
|
91
|
-
remediation: "Clear or reconcile the stale worker before dispatching another Unit.",
|
|
92
|
-
};
|
|
93
|
-
case "worktree-invalid":
|
|
94
|
-
return {
|
|
95
|
-
failureKind,
|
|
96
|
-
action: "stop",
|
|
97
|
-
reason: `Worktree invalid${unitSuffix(input)}: ${message}`,
|
|
98
|
-
exitReason: "worktree-invalid",
|
|
99
|
-
remediation: "Repair or recreate the milestone worktree before launching source-writing Units.",
|
|
100
|
-
};
|
|
101
|
-
case "verification-drift":
|
|
102
|
-
return {
|
|
103
|
-
failureKind,
|
|
104
|
-
action: "escalate",
|
|
105
|
-
reason: `Verification drift${unitSuffix(input)}: ${message}`,
|
|
106
|
-
exitReason: "verification-drift",
|
|
107
|
-
remediation: "Inspect the verification artifact and reconcile the state snapshot before resuming.",
|
|
108
|
-
};
|
|
109
|
-
case "reconciliation-drift":
|
|
110
|
-
return {
|
|
111
|
-
failureKind,
|
|
112
|
-
action: "escalate",
|
|
113
|
-
reason: `Reconciliation drift${unitSuffix(input)}: ${message}`,
|
|
114
|
-
exitReason: "reconciliation-drift",
|
|
115
|
-
remediation:
|
|
116
|
-
"Inspect the persistent or repair-failed drift kinds reported by the State Reconciliation Module before resuming.",
|
|
117
|
-
};
|
|
118
|
-
case "illegal-transition":
|
|
119
|
-
return {
|
|
120
|
-
failureKind,
|
|
121
|
-
action: "escalate",
|
|
122
|
-
reason: `Illegal phase transition${unitSuffix(input)}: ${message}`,
|
|
123
|
-
exitReason: "illegal-transition",
|
|
124
|
-
remediation:
|
|
125
|
-
"A derived Phase edge rejected by the Phase Transition Invariant survived reconciliation; inspect deriveState and the State Reconciliation Module before resuming.",
|
|
126
|
-
};
|
|
127
|
-
case "provider": {
|
|
128
|
-
const providerClass = classifyError(message, input.retryAfterMs);
|
|
129
|
-
return {
|
|
130
|
-
failureKind,
|
|
131
|
-
action: isTransient(providerClass) ? "retry" : "escalate",
|
|
132
|
-
reason: message,
|
|
133
|
-
exitReason: `provider-${providerClass.kind}`,
|
|
134
|
-
remediation: isTransient(providerClass)
|
|
135
|
-
? "Retry after the provider/network condition clears."
|
|
136
|
-
: "Inspect provider credentials, model entitlement, or request shape.",
|
|
137
|
-
providerClass: providerClass.kind,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
case "runtime-unknown":
|
|
141
|
-
return {
|
|
142
|
-
failureKind,
|
|
143
|
-
action: "escalate",
|
|
144
|
-
reason: message,
|
|
145
|
-
exitReason: "runtime-unknown",
|
|
146
|
-
remediation: "Inspect the runtime error and add a dedicated classification if it is repeatable.",
|
|
147
|
-
};
|
|
55
|
+
if (failureKind === "provider") {
|
|
56
|
+
const providerClass = classifyError(message, input.retryAfterMs);
|
|
57
|
+
const transient = isTransient(providerClass);
|
|
58
|
+
return {
|
|
59
|
+
failureKind,
|
|
60
|
+
action: transient ? "retry" : "escalate",
|
|
61
|
+
reason: message,
|
|
62
|
+
exitReason: `provider-${providerClass.kind}`,
|
|
63
|
+
remediation: recoveryRemediation(transient ? "provider-transient" : "provider-permanent"),
|
|
64
|
+
providerClass: providerClass.kind,
|
|
65
|
+
};
|
|
148
66
|
}
|
|
67
|
+
|
|
68
|
+
const { action, label } = FAILURE_TAXONOMY[failureKind];
|
|
69
|
+
return {
|
|
70
|
+
failureKind,
|
|
71
|
+
action,
|
|
72
|
+
reason: label ? `${label}${unitSuffix(input)}: ${message}` : message,
|
|
73
|
+
exitReason: failureKind,
|
|
74
|
+
remediation: recoveryRemediation(failureKind),
|
|
75
|
+
};
|
|
149
76
|
}
|
|
150
77
|
|
|
78
|
+
/** Per-kind action and reason label. Remediation lives in the Guidance module. */
|
|
79
|
+
const FAILURE_TAXONOMY: Record<
|
|
80
|
+
Exclude<RecoveryFailureKind, "provider">,
|
|
81
|
+
{ action: RecoveryAction; label: string | null }
|
|
82
|
+
> = {
|
|
83
|
+
"tool-schema": { action: "stop", label: "Tool schema failure" },
|
|
84
|
+
"tool-contract": { action: "stop", label: "Tool Contract failure" },
|
|
85
|
+
"tool-unavailable": { action: "retry", label: "Tool unavailable" },
|
|
86
|
+
"deterministic-policy": { action: "stop", label: "Deterministic policy failure" },
|
|
87
|
+
"lifecycle-progression": { action: "stop", label: "Lifecycle progression failure" },
|
|
88
|
+
"stale-worker": { action: "stop", label: "Stale worker failure" },
|
|
89
|
+
"worktree-invalid": { action: "stop", label: "Worktree invalid" },
|
|
90
|
+
"verification-drift": { action: "escalate", label: "Verification drift" },
|
|
91
|
+
"reconciliation-drift": { action: "escalate", label: "Reconciliation drift" },
|
|
92
|
+
"illegal-transition": { action: "escalate", label: "Illegal phase transition" },
|
|
93
|
+
"runtime-unknown": { action: "escalate", label: null },
|
|
94
|
+
};
|
|
95
|
+
|
|
151
96
|
function inferFailureKind(message: string): RecoveryFailureKind {
|
|
97
|
+
if (isToolUnavailableError(message)) return "tool-unavailable";
|
|
152
98
|
if (/tool contract|auto-unit tool scope|phase-boundary gate|not permitted.*own/i.test(message)) return "tool-contract";
|
|
153
99
|
if (/lifecycle progression|required artifact|missing .*assessment|missing .*closeout|cannot legally (?:advance|progress)/i.test(message)) return "lifecycle-progression";
|
|
154
100
|
if (/schema|invalid.*tool|tool.*invalid|enum/i.test(message)) return "tool-schema";
|
|
@@ -154,6 +154,29 @@ function parseTableSlices(section: string): RoadmapSliceEntry[] {
|
|
|
154
154
|
return slices;
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
+
function looksLikeTable(section: string): boolean {
|
|
158
|
+
const lines = section.split("\n");
|
|
159
|
+
|
|
160
|
+
// Checkbox format takes precedence — embedded demo tables must not switch mode (#721).
|
|
161
|
+
if (lines.some(line => /^\s*-\s+\[[ xX]\]/.test(line))) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const pipeLines = lines.filter(line => /^\s*\|/.test(line));
|
|
166
|
+
if (pipeLines.length < 2) return false;
|
|
167
|
+
|
|
168
|
+
const hasSeparatorRow = pipeLines.some((line, index) => {
|
|
169
|
+
if (index === 0) return false;
|
|
170
|
+
const cells = line.split("|").map(c => c.trim()).filter(Boolean);
|
|
171
|
+
return /^\s*\|[\s:-]+\|/.test(line) && cells.length >= 2 && cells.every(c => /^[\s:-]+$/.test(c));
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
if (hasSeparatorRow) return true;
|
|
175
|
+
|
|
176
|
+
// Tables without a separator row still expose slice IDs in data rows.
|
|
177
|
+
return pipeLines.some(line => /\bS\d+\b/.test(line));
|
|
178
|
+
}
|
|
179
|
+
|
|
157
180
|
export function parseRoadmapSlices(content: string): RoadmapSliceEntry[] {
|
|
158
181
|
const slicesSection = extractSlicesSection(content);
|
|
159
182
|
if (!slicesSection) {
|
|
@@ -165,9 +188,11 @@ export function parseRoadmapSlices(content: string): RoadmapSliceEntry[] {
|
|
|
165
188
|
|
|
166
189
|
// Try table format first — if the section contains pipe-delimited rows with
|
|
167
190
|
// slice IDs, parse them as a table (#1736).
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
191
|
+
if (looksLikeTable(slicesSection)) {
|
|
192
|
+
const tableSlices = parseTableSlices(slicesSection);
|
|
193
|
+
if (tableSlices.length > 0) {
|
|
194
|
+
return tableSlices;
|
|
195
|
+
}
|
|
171
196
|
}
|
|
172
197
|
|
|
173
198
|
// Standard checkbox format
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-shot confirmation token for destructive bash commands.
|
|
3
|
+
*
|
|
4
|
+
* The destructive-command guard hard-blocks classified commands (force push,
|
|
5
|
+
* rm -rf, SQL drop, etc.) in all modes. The block instructs the model to
|
|
6
|
+
* confirm via ask_user_questions and re-issue the command. This module is the
|
|
7
|
+
* missing escape hatch: it records the user's confirmation and lets the exact
|
|
8
|
+
* confirmed command through exactly once.
|
|
9
|
+
*
|
|
10
|
+
* Design constraints:
|
|
11
|
+
* - In-memory only, never persisted. A confirmation token written to disk
|
|
12
|
+
* could silently auto-approve a destructive command in a later session —
|
|
13
|
+
* confirmation must be re-obtained every process lifetime.
|
|
14
|
+
* - One-shot. Consuming a token clears it, so a second destructive command
|
|
15
|
+
* (even an identical one) re-blocks and re-prompts.
|
|
16
|
+
* - Command-bound. The token only matches the exact (normalized) command
|
|
17
|
+
* string the user confirmed. A reworded command re-blocks, which is safe.
|
|
18
|
+
* - Per basePath, so concurrent workspaces in one process never share tokens.
|
|
19
|
+
*
|
|
20
|
+
* Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { resolve } from "node:path";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Question-id substring that marks an ask_user_questions call as a
|
|
27
|
+
* destructive-command confirmation. The tool_result handler promotes the
|
|
28
|
+
* pending command to a confirmed token when an affirmative answer arrives for
|
|
29
|
+
* a question whose id contains this marker.
|
|
30
|
+
*/
|
|
31
|
+
export const DESTRUCTIVE_CONFIRM_GATE_MARKER = "destructive_confirm";
|
|
32
|
+
|
|
33
|
+
interface DestructiveConfirmationState {
|
|
34
|
+
/** Command awaiting confirmation, captured when the guard blocked it. */
|
|
35
|
+
pendingCommand: string | null;
|
|
36
|
+
/** Confirmed command cleared on first matching consume. */
|
|
37
|
+
confirmedCommand: string | null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const statesByBasePath = new Map<string, DestructiveConfirmationState>();
|
|
41
|
+
|
|
42
|
+
function stateKey(basePath: string): string {
|
|
43
|
+
return resolve(basePath);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function getState(basePath: string): DestructiveConfirmationState {
|
|
47
|
+
const key = stateKey(basePath);
|
|
48
|
+
let state = statesByBasePath.get(key);
|
|
49
|
+
if (!state) {
|
|
50
|
+
state = { pendingCommand: null, confirmedCommand: null };
|
|
51
|
+
statesByBasePath.set(key, state);
|
|
52
|
+
}
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Normalize a command for stable matching across block → confirm → retry.
|
|
58
|
+
* Trims surrounding whitespace and collapses internal runs of whitespace so
|
|
59
|
+
* cosmetic reformatting of the same command still matches the token.
|
|
60
|
+
*/
|
|
61
|
+
export function normalizeDestructiveCommand(command: string): string {
|
|
62
|
+
return command.replace(/\s+/g, " ").trim();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Whether an ask_user_questions question id is a destructive-confirm gate.
|
|
67
|
+
*/
|
|
68
|
+
export function isDestructiveConfirmGateId(questionId: unknown): boolean {
|
|
69
|
+
return typeof questionId === "string" && questionId.includes(DESTRUCTIVE_CONFIRM_GATE_MARKER);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Record that a destructive command was blocked and is awaiting confirmation.
|
|
74
|
+
* Called by the guard at block time. Overwrites any prior pending command —
|
|
75
|
+
* only the most recently blocked command can be confirmed.
|
|
76
|
+
*/
|
|
77
|
+
export function requestDestructiveConfirmation(
|
|
78
|
+
command: string,
|
|
79
|
+
basePath: string = process.cwd(),
|
|
80
|
+
): void {
|
|
81
|
+
const state = getState(basePath);
|
|
82
|
+
state.pendingCommand = normalizeDestructiveCommand(command);
|
|
83
|
+
// A fresh request invalidates any stale confirmed token for a different
|
|
84
|
+
// command so confirmation cannot leak across distinct destructive actions.
|
|
85
|
+
state.confirmedCommand = null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Promote the pending command to a confirmed, one-shot token. Called by the
|
|
90
|
+
* tool_result handler when the user gives an affirmative answer to a
|
|
91
|
+
* destructive-confirm gate. Returns the confirmed command, or null if there
|
|
92
|
+
* was nothing pending (e.g. confirmation arrived without a preceding block).
|
|
93
|
+
*/
|
|
94
|
+
export function confirmDestructiveCommand(
|
|
95
|
+
basePath: string = process.cwd(),
|
|
96
|
+
): string | null {
|
|
97
|
+
const state = getState(basePath);
|
|
98
|
+
if (!state.pendingCommand) return null;
|
|
99
|
+
state.confirmedCommand = state.pendingCommand;
|
|
100
|
+
state.pendingCommand = null;
|
|
101
|
+
return state.confirmedCommand;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Check whether the given command has been confirmed, consuming the token if
|
|
106
|
+
* so. Returns true exactly once per confirmation; subsequent calls (or a
|
|
107
|
+
* non-matching command) return false. Called by the guard before blocking.
|
|
108
|
+
*/
|
|
109
|
+
export function consumeDestructiveConfirmation(
|
|
110
|
+
command: string,
|
|
111
|
+
basePath: string = process.cwd(),
|
|
112
|
+
): boolean {
|
|
113
|
+
const state = getState(basePath);
|
|
114
|
+
if (!state.confirmedCommand) return false;
|
|
115
|
+
if (state.confirmedCommand !== normalizeDestructiveCommand(command)) return false;
|
|
116
|
+
state.confirmedCommand = null;
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Inspect the pending command without consuming it (diagnostics/tests).
|
|
122
|
+
*/
|
|
123
|
+
export function peekPendingDestructiveCommand(
|
|
124
|
+
basePath: string = process.cwd(),
|
|
125
|
+
): string | null {
|
|
126
|
+
return getState(basePath).pendingCommand;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Clear all destructive-confirmation state for a basePath (tests / flow reset).
|
|
131
|
+
*/
|
|
132
|
+
export function resetDestructiveConfirmation(basePath: string = process.cwd()): void {
|
|
133
|
+
statesByBasePath.delete(stateKey(basePath));
|
|
134
|
+
}
|
|
@@ -387,7 +387,7 @@ export function acquireSessionLock(basePath: string): SessionLockResult {
|
|
|
387
387
|
// #3218: Provide actionable workaround when lock recovery fails
|
|
388
388
|
const lockDirPath = lockTarget + ".lock";
|
|
389
389
|
const reason = existingPid
|
|
390
|
-
? `Another auto-mode session (PID ${existingPid}) appears to be running.\
|
|
390
|
+
? `Another auto-mode session (PID ${existingPid}) appears to be running.\nRun \`/gsd stop\` for graceful shutdown, or choose "Force start" from \`/gsd auto\` to terminate it.`
|
|
391
391
|
: `Another auto-mode session lock is stuck on this project.\nRun: rm -rf "${lockDirPath}" && rm -f "${lp}"`;
|
|
392
392
|
|
|
393
393
|
return { acquired: false, reason, existingPid };
|
|
@@ -13,6 +13,11 @@ import type {
|
|
|
13
13
|
MilestoneRegistryEntry,
|
|
14
14
|
} from './types.js';
|
|
15
15
|
|
|
16
|
+
// Pre-migration fallback ONLY (ADR-017): deriveState must work on projects
|
|
17
|
+
// whose DB does not exist yet (before md-importer runs), so it parses markdown
|
|
18
|
+
// projections when `isDbAvailable()` is false or the DB has no rows. Once the
|
|
19
|
+
// DB is populated, decision reads go through gsd-db queries — these parsers
|
|
20
|
+
// must never be consulted when DB data is present.
|
|
16
21
|
import {
|
|
17
22
|
parseRoadmap,
|
|
18
23
|
parsePlan,
|
|
@@ -71,27 +76,10 @@ import {
|
|
|
71
76
|
readinessNeedsDiscussion,
|
|
72
77
|
} from './milestone-readiness.js';
|
|
73
78
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
`1. Review the validation details: \`/gsd status\``,
|
|
79
|
-
`2. If you fixed the missing evidence or issue, re-run milestone validation: \`/gsd validate-milestone\``,
|
|
80
|
-
`3. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
|
|
81
|
-
`4. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
|
|
82
|
-
`After validation or override passes, run \`/gsd auto\` to complete and merge the milestone.`,
|
|
83
|
-
].join("\n");
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function formatNeedsRemediationBlocker(milestoneId: string): string {
|
|
87
|
-
return [
|
|
88
|
-
`Milestone ${milestoneId} is blocked because milestone validation returned needs-remediation, but all slices are complete.`,
|
|
89
|
-
`Fix options:`,
|
|
90
|
-
`1. Run \`/gsd dispatch reassess\` to add remediation slices, then run \`/gsd auto\``,
|
|
91
|
-
`2. If the finding is acceptable, override it: \`/gsd verdict pass --rationale "why this is okay"\``,
|
|
92
|
-
`3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
|
|
93
|
-
].join("\n");
|
|
94
|
-
}
|
|
79
|
+
import {
|
|
80
|
+
needsAttentionBlockerGuidance as formatNeedsAttentionBlocker,
|
|
81
|
+
needsRemediationBlockerGuidance as formatNeedsRemediationBlocker,
|
|
82
|
+
} from './guidance.js';
|
|
95
83
|
|
|
96
84
|
/**
|
|
97
85
|
* A "ghost" milestone directory contains only META.json (and no substantive
|