@opengsd/gsd-pi 1.2.0-dev.e8563f58 → 1.2.0-dev.fbdca60b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-model-override.d.ts +15 -0
- package/dist/cli-model-override.js +21 -0
- package/dist/cli.js +1 -18
- package/dist/loader.js +6 -4
- package/dist/register-agent-bundles.d.ts +11 -2
- package/dist/register-agent-bundles.js +18 -4
- package/dist/resource-loader.d.ts +10 -5
- package/dist/resource-loader.js +121 -6
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -2
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
- 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/dispatch-history.js +21 -6
- 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 +4 -1
- package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
- package/dist/resources/extensions/gsd/auto/orchestrator.js +85 -15
- 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 +3 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +11 -2
- package/dist/resources/extensions/gsd/auto-post-unit.js +18 -6
- package/dist/resources/extensions/gsd/auto-start.js +23 -3
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
- package/dist/resources/extensions/gsd/auto-verification.js +14 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
- package/dist/resources/extensions/gsd/auto.js +45 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
- package/dist/resources/extensions/gsd/commands/context.js +16 -2
- 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/crash-recovery.js +8 -3
- package/dist/resources/extensions/gsd/db/engine.js +24 -6
- package/dist/resources/extensions/gsd/db/queries.js +30 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
- package/dist/resources/extensions/gsd/db-transaction.js +27 -23
- package/dist/resources/extensions/gsd/db-writer.js +8 -17
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
- package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
- package/dist/resources/extensions/gsd/gsd-db.js +15 -20
- package/dist/resources/extensions/gsd/guided-flow.js +93 -4
- package/dist/resources/extensions/gsd/health-widget.js +87 -28
- package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
- package/dist/resources/extensions/gsd/memory-relations.js +1 -1
- package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
- package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
- package/dist/resources/extensions/gsd/notifications.js +12 -7
- package/dist/resources/extensions/gsd/projection-flush.js +7 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +3 -1
- 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/roadmap-slices.js +25 -3
- 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 +6 -2
- package/dist/resources/extensions/gsd/tool-contract.js +14 -3
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
- package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/unit-registry.js +34 -4
- package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
- package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
- package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
- package/dist/resources/extensions/gsd/workflow-events.js +6 -18
- package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
- package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
- package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
- package/dist/resources/extensions/gsd/worktree.js +8 -1
- package/dist/resources/extensions/mcp-client/manager.js +6 -1
- package/dist/resources/skills/create-skill/SKILL.md +3 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/runtime-checks.d.ts +10 -0
- package/dist/runtime-checks.js +27 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
- package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-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/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +3 -3
- package/packages/cloud-mcp-gateway/package.json +2 -2
- 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 +8 -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 +50 -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/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 +17 -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-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/package.json +7 -7
- package/packages/mcp-server/README.md +12 -3
- package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli-runner.js +137 -0
- package/packages/mcp-server/dist/cli-runner.js.map +1 -0
- package/packages/mcp-server/dist/cli.js +2 -53
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/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 +459 -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/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.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +62 -43
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +5 -5
- 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/package.json +1 -1
- package/packages/pi-ai/package.json +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/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/package.json +7 -7
- package/packages/pi-tui/README.md +15 -0
- package/packages/pi-tui/dist/index.d.ts +2 -2
- package/packages/pi-tui/dist/index.d.ts.map +1 -1
- package/packages/pi-tui/dist/index.js +2 -2
- 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/terminal.d.ts +12 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +70 -25
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts +15 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +106 -21
- 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/extensions/ask-user-questions.ts +7 -2
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
- 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/dispatch-history.ts +22 -6
- 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 +4 -1
- package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +95 -15
- 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 +10 -16
- package/src/resources/extensions/gsd/auto-dispatch.ts +11 -10
- package/src/resources/extensions/gsd/auto-post-unit.ts +21 -6
- package/src/resources/extensions/gsd/auto-start.ts +24 -4
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
- package/src/resources/extensions/gsd/auto-verification.ts +18 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
- package/src/resources/extensions/gsd/auto.ts +56 -2
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
- package/src/resources/extensions/gsd/commands/context.ts +16 -2
- 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/crash-recovery.ts +10 -2
- package/src/resources/extensions/gsd/db/engine.ts +26 -6
- package/src/resources/extensions/gsd/db/queries.ts +29 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
- package/src/resources/extensions/gsd/db-transaction.ts +37 -20
- package/src/resources/extensions/gsd/db-writer.ts +11 -19
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
- package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
- package/src/resources/extensions/gsd/gsd-db.ts +15 -19
- package/src/resources/extensions/gsd/guided-flow.ts +145 -24
- package/src/resources/extensions/gsd/health-widget.ts +91 -27
- package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
- package/src/resources/extensions/gsd/memory-relations.ts +1 -1
- package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
- package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
- package/src/resources/extensions/gsd/notifications.ts +13 -6
- package/src/resources/extensions/gsd/projection-flush.ts +20 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +3 -1
- 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/roadmap-slices.ts +28 -3
- 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 +7 -1
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +76 -12
- 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/complete-task.test.ts +141 -5
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -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 +2 -1
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
- package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -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/gsd-db.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
- 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-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/notifications.test.ts +64 -9
- 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 +5 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
- package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/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/workflow-events.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
- package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/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/tool-contract.ts +38 -3
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
- package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
- package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
- package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/unit-registry.ts +34 -4
- package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
- package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
- package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
- package/src/resources/extensions/gsd/workflow-events.ts +12 -20
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
- package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
- package/src/resources/extensions/gsd/worktree.ts +7 -1
- package/src/resources/extensions/mcp-client/manager.ts +7 -1
- package/src/resources/skills/create-skill/SKILL.md +3 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
- package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
- package/src/resources/skills/gsd-browser/SKILL.md +0 -41
- /package/dist/web/standalone/.next/static/{LDHRKiRBIVZmiuMjrL1Vy → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{LDHRKiRBIVZmiuMjrL1Vy → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* back committed DB state.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import { existsSync } from "node:fs";
|
|
13
14
|
import { join } from "node:path";
|
|
14
15
|
|
|
15
16
|
import type { CompleteTaskParams, EscalationArtifact } from "../types.js";
|
|
@@ -35,7 +36,8 @@ import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
|
35
36
|
import { saveFile, clearParseCache } from "../files.js";
|
|
36
37
|
import { invalidateStateCache } from "../state.js";
|
|
37
38
|
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
38
|
-
import {
|
|
39
|
+
import { renderSummaryContent } from "../workflow-projections.js";
|
|
40
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
39
41
|
import { writeManifest } from "../workflow-manifest.js";
|
|
40
42
|
import { appendEvent } from "../workflow-events.js";
|
|
41
43
|
import { logWarning, logError } from "../workflow-logger.js";
|
|
@@ -85,6 +87,49 @@ function taskSummaryPath(
|
|
|
85
87
|
);
|
|
86
88
|
}
|
|
87
89
|
|
|
90
|
+
async function repairMissingTaskSummaryProjection(
|
|
91
|
+
artifactBasePath: string,
|
|
92
|
+
taskRow: TaskRow,
|
|
93
|
+
): Promise<{ summaryPath: string; stale: boolean }> {
|
|
94
|
+
const summaryPath = taskSummaryPath(
|
|
95
|
+
artifactBasePath,
|
|
96
|
+
taskRow.milestone_id,
|
|
97
|
+
taskRow.slice_id,
|
|
98
|
+
taskRow.id,
|
|
99
|
+
);
|
|
100
|
+
const summaryMd = renderSummaryContent(taskRow, taskRow.slice_id, taskRow.milestone_id, []);
|
|
101
|
+
let stale = false;
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
await saveFile(summaryPath, summaryMd);
|
|
105
|
+
await renderPlanCheckboxes(artifactBasePath, taskRow.milestone_id, taskRow.slice_id);
|
|
106
|
+
} catch (renderErr) {
|
|
107
|
+
stale = true;
|
|
108
|
+
logWarning(
|
|
109
|
+
"projection",
|
|
110
|
+
`complete_task missing-summary repair failed for ${taskRow.milestone_id}/${taskRow.slice_id}/${taskRow.id}`,
|
|
111
|
+
{ error: (renderErr as Error).message },
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
invalidateStateCache();
|
|
116
|
+
clearPathCache();
|
|
117
|
+
clearParseCache();
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: taskRow.milestone_id });
|
|
121
|
+
} catch (projErr) {
|
|
122
|
+
logWarning("tool", `complete-task repair projection warning: ${(projErr as Error).message}`);
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
writeManifest(artifactBasePath);
|
|
126
|
+
} catch (mfErr) {
|
|
127
|
+
logWarning("tool", `complete-task repair manifest warning: ${(mfErr as Error).message}`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return { summaryPath, stale };
|
|
131
|
+
}
|
|
132
|
+
|
|
88
133
|
/**
|
|
89
134
|
* Map an execute-task-owned gate id to the CompleteTaskParams field whose
|
|
90
135
|
* presence drives `pass` vs. `omitted`. Keep in lockstep with the gates
|
|
@@ -207,6 +252,7 @@ export async function handleCompleteTask(
|
|
|
207
252
|
const completedAt = new Date().toISOString();
|
|
208
253
|
let guardError: string | null = null;
|
|
209
254
|
let summaryMd = "";
|
|
255
|
+
let repairTaskSummaryRow: TaskRow | null = null;
|
|
210
256
|
|
|
211
257
|
// ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
|
|
212
258
|
// Building the artifact runs the full shape validation (2-4 options, unique
|
|
@@ -271,6 +317,17 @@ export async function handleCompleteTask(
|
|
|
271
317
|
guardError = "__stale_duplicate__";
|
|
272
318
|
return;
|
|
273
319
|
}
|
|
320
|
+
const existingSummaryPath = taskSummaryPath(
|
|
321
|
+
artifactBasePath,
|
|
322
|
+
params.milestoneId,
|
|
323
|
+
params.sliceId,
|
|
324
|
+
params.taskId,
|
|
325
|
+
);
|
|
326
|
+
if (existingTask.full_summary_md.trim() && !existsSync(existingSummaryPath)) {
|
|
327
|
+
repairTaskSummaryRow = existingTask;
|
|
328
|
+
guardError = "__repair_missing_summary__";
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
274
331
|
guardError = `task ${params.taskId} is already complete — use gsd_task_reopen first if you need to redo it`;
|
|
275
332
|
return;
|
|
276
333
|
}
|
|
@@ -336,6 +393,18 @@ export async function handleCompleteTask(
|
|
|
336
393
|
};
|
|
337
394
|
}
|
|
338
395
|
|
|
396
|
+
if (guardError === "__repair_missing_summary__" && repairTaskSummaryRow) {
|
|
397
|
+
const repair = await repairMissingTaskSummaryProjection(artifactBasePath, repairTaskSummaryRow);
|
|
398
|
+
return {
|
|
399
|
+
taskId: params.taskId,
|
|
400
|
+
sliceId: params.sliceId,
|
|
401
|
+
milestoneId: params.milestoneId,
|
|
402
|
+
summaryPath: repair.summaryPath,
|
|
403
|
+
duplicate: true,
|
|
404
|
+
...(repair.stale ? { stale: true } : {}),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
|
|
339
408
|
if (guardError) {
|
|
340
409
|
return { error: guardError };
|
|
341
410
|
}
|
|
@@ -452,6 +521,25 @@ export async function handleCompleteTask(
|
|
|
452
521
|
}
|
|
453
522
|
}
|
|
454
523
|
} else if (params.escalation && !escalationWriteEnabled) {
|
|
524
|
+
if (params.escalation.continueWithDefault === false) {
|
|
525
|
+
const msg = `complete-task received a hard-blocker escalation (continueWithDefault=false) but phases.mid_execution_escalation is disabled for ${params.milestoneId}/${params.sliceId}/${params.taskId}; reverting to pending instead of silently advancing.`;
|
|
526
|
+
logWarning("tool", msg);
|
|
527
|
+
try {
|
|
528
|
+
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
529
|
+
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
|
|
530
|
+
invalidateStateCache();
|
|
531
|
+
logWarning(
|
|
532
|
+
"tool",
|
|
533
|
+
`complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} because hard-blocker escalation handling is disabled; SUMMARY.md left on disk for retry.`,
|
|
534
|
+
);
|
|
535
|
+
} catch (rollbackErr) {
|
|
536
|
+
logWarning(
|
|
537
|
+
"tool",
|
|
538
|
+
`complete-task rollback failed after disabled hard-blocker escalation for ${params.milestoneId}/${params.sliceId}/${params.taskId}: ${(rollbackErr as Error).message}`,
|
|
539
|
+
);
|
|
540
|
+
}
|
|
541
|
+
return { error: msg };
|
|
542
|
+
}
|
|
455
543
|
logWarning(
|
|
456
544
|
"tool",
|
|
457
545
|
`complete-task received escalation payload but phases.mid_execution_escalation is not enabled; ignoring (${params.milestoneId}/${params.sliceId}/${params.taskId})`,
|
|
@@ -467,7 +555,7 @@ export async function handleCompleteTask(
|
|
|
467
555
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
468
556
|
// the event log entry (critical for worktree reconciliation).
|
|
469
557
|
try {
|
|
470
|
-
await
|
|
558
|
+
await flushWorkflowProjections(artifactBasePath, { milestoneId: params.milestoneId });
|
|
471
559
|
} catch (projErr) {
|
|
472
560
|
logWarning("tool", `complete-task projection warning: ${(projErr as Error).message}`);
|
|
473
561
|
}
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import type { GateEvaluationConfig, GateId } from "../types.js";
|
|
22
22
|
import { invalidateStateCache } from "../state.js";
|
|
23
23
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
24
|
-
import {
|
|
24
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
25
25
|
import { writeManifest } from "../workflow-manifest.js";
|
|
26
26
|
import { appendEvent } from "../workflow-events.js";
|
|
27
27
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -468,7 +468,7 @@ export async function handlePlanSlice(
|
|
|
468
468
|
|
|
469
469
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
470
470
|
try {
|
|
471
|
-
await
|
|
471
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
472
472
|
writeManifest(basePath);
|
|
473
473
|
appendEvent(basePath, {
|
|
474
474
|
cmd: "plan-slice",
|
|
@@ -4,7 +4,7 @@ import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
|
4
4
|
import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning } from "../gsd-db.js";
|
|
5
5
|
import { invalidateStateCache } from "../state.js";
|
|
6
6
|
import { renderTaskPlanFromDb } from "../markdown-renderer.js";
|
|
7
|
-
import {
|
|
7
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
8
8
|
import { writeManifest } from "../workflow-manifest.js";
|
|
9
9
|
import { appendEvent } from "../workflow-events.js";
|
|
10
10
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -142,7 +142,7 @@ export async function handlePlanTask(
|
|
|
142
142
|
|
|
143
143
|
// ── Post-mutation hook: projections, manifest, event log ─────────────
|
|
144
144
|
try {
|
|
145
|
-
await
|
|
145
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
146
146
|
writeManifest(basePath);
|
|
147
147
|
appendEvent(basePath, {
|
|
148
148
|
cmd: "plan-task",
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "../gsd-db.js";
|
|
17
17
|
import { invalidateStateCache } from "../state.js";
|
|
18
18
|
import { renderRoadmapFromDb, renderAssessmentFromDb } from "../markdown-renderer.js";
|
|
19
|
-
import {
|
|
19
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
20
20
|
import { writeManifest } from "../workflow-manifest.js";
|
|
21
21
|
import { appendEvent } from "../workflow-events.js";
|
|
22
22
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -306,7 +306,7 @@ export async function handleReassessRoadmap(
|
|
|
306
306
|
|
|
307
307
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
308
308
|
try {
|
|
309
|
-
await
|
|
309
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
310
310
|
writeManifest(basePath);
|
|
311
311
|
appendEvent(basePath, {
|
|
312
312
|
cmd: "reassess-roadmap",
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
reopenMilestoneCascade,
|
|
16
16
|
} from "../gsd-db.js";
|
|
17
17
|
import { invalidateStateCache } from "../state.js";
|
|
18
|
-
import {
|
|
18
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
19
19
|
import { writeManifest } from "../workflow-manifest.js";
|
|
20
20
|
import { appendEvent } from "../workflow-events.js";
|
|
21
21
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -98,7 +98,7 @@ export async function handleReopenMilestone(
|
|
|
98
98
|
|
|
99
99
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
100
100
|
try {
|
|
101
|
-
await
|
|
101
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
102
102
|
writeManifest(basePath);
|
|
103
103
|
appendEvent(basePath, {
|
|
104
104
|
cmd: "reopen-milestone",
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
reopenSliceCascade,
|
|
17
17
|
} from "../gsd-db.js";
|
|
18
18
|
import { invalidateStateCache } from "../state.js";
|
|
19
|
-
import {
|
|
19
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
20
20
|
import { writeManifest } from "../workflow-manifest.js";
|
|
21
21
|
import { appendEvent } from "../workflow-events.js";
|
|
22
22
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -97,7 +97,7 @@ export async function handleReopenSlice(
|
|
|
97
97
|
|
|
98
98
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
99
99
|
try {
|
|
100
|
-
await
|
|
100
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
101
101
|
writeManifest(basePath);
|
|
102
102
|
appendEvent(basePath, {
|
|
103
103
|
cmd: "reopen-slice",
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
} from "../gsd-db.js";
|
|
20
20
|
import { invalidateStateCache } from "../state.js";
|
|
21
21
|
import { isClosedStatus } from "../status-guards.js";
|
|
22
|
-
import {
|
|
22
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
23
23
|
import { writeManifest } from "../workflow-manifest.js";
|
|
24
24
|
import { appendEvent } from "../workflow-events.js";
|
|
25
25
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -119,7 +119,7 @@ export async function handleReopenTask(
|
|
|
119
119
|
|
|
120
120
|
// ── Post-mutation hook ───────────────────────────────────────────────────
|
|
121
121
|
try {
|
|
122
|
-
await
|
|
122
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
123
123
|
writeManifest(basePath);
|
|
124
124
|
appendEvent(basePath, {
|
|
125
125
|
cmd: "reopen-task",
|
|
@@ -13,7 +13,7 @@ import { invalidateStateCache } from "../state.js";
|
|
|
13
13
|
import { isClosedStatus } from "../status-guards.js";
|
|
14
14
|
import { isNonEmptyString } from "../validation.js";
|
|
15
15
|
import { renderPlanFromDb, renderReplanFromDb } from "../markdown-renderer.js";
|
|
16
|
-
import {
|
|
16
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
17
17
|
import { writeManifest } from "../workflow-manifest.js";
|
|
18
18
|
import { appendEvent } from "../workflow-events.js";
|
|
19
19
|
import { logWarning } from "../workflow-logger.js";
|
|
@@ -216,7 +216,7 @@ export async function handleReplanSlice(
|
|
|
216
216
|
|
|
217
217
|
// ── Post-mutation hook: projections, manifest, event log ─────
|
|
218
218
|
try {
|
|
219
|
-
await
|
|
219
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
220
220
|
writeManifest(basePath);
|
|
221
221
|
appendEvent(basePath, {
|
|
222
222
|
cmd: "replan-slice",
|
|
@@ -187,7 +187,7 @@ const TOOL_SURFACE_GUIDANCE_BY_UNIT: Record<string, string> = {
|
|
|
187
187
|
"run-uat":
|
|
188
188
|
"Do not call `gsd_exec`, `Bash`, `Write`, or `Edit` — they are unavailable in this unit. Run every automated check through `gsd_uat_exec` with the appropriate `intent`. For browser UAT modes, use `browser_*` tools when presented; if browser automation fails, record the failure honestly and use `gsd_uat_exec` for the best objective substitute.",
|
|
189
189
|
"complete-slice":
|
|
190
|
-
"Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
190
|
+
"Run slice-level verification through `gsd_exec` (or MCP-scoped `mcp__…__gsd_exec`), not direct `bash`. Capture learnings through `gsd_capture_thought` (or MCP-scoped `mcp__…__gsd_capture_thought`), not bare `capture_thought`, when workflow MCP tools are presented. Do not call `gsd_uat_result_save` — run-uat owns persisted UAT assessment. On verification failure, do not edit user source files in this unit.",
|
|
191
191
|
"gate-evaluate":
|
|
192
192
|
"Dispatch only **tester** subagents via `subagent`. Persist each gate with `gsd_save_gate_result`. Do not use `ToolSearch` — it is not available.",
|
|
193
193
|
"reactive-execute":
|
|
@@ -220,15 +220,19 @@ export const UNIT_REGISTRY = {
|
|
|
220
220
|
phaseChain: ["completion"],
|
|
221
221
|
toolContract: {
|
|
222
222
|
allowedGsdTools: [
|
|
223
|
+
"gsd_exec",
|
|
223
224
|
"gsd_slice_complete",
|
|
224
225
|
"gsd_task_reopen",
|
|
225
226
|
"gsd_replan_slice",
|
|
226
227
|
"gsd_decision_save",
|
|
228
|
+
"gsd_capture_thought",
|
|
227
229
|
"gsd_requirement_update",
|
|
228
230
|
"gsd_summary_save",
|
|
229
231
|
"subagent",
|
|
230
232
|
],
|
|
231
233
|
requiredWorkflowTools: [
|
|
234
|
+
"gsd_exec",
|
|
235
|
+
"gsd_capture_thought",
|
|
232
236
|
"gsd_slice_complete",
|
|
233
237
|
"gsd_task_reopen",
|
|
234
238
|
"gsd_replan_slice",
|
|
@@ -254,8 +258,21 @@ export const UNIT_REGISTRY = {
|
|
|
254
258
|
scopeClass: "execute-task",
|
|
255
259
|
phaseChain: ["execution"],
|
|
256
260
|
toolContract: {
|
|
257
|
-
allowedGsdTools: [
|
|
258
|
-
|
|
261
|
+
allowedGsdTools: [
|
|
262
|
+
"gsd_task_complete",
|
|
263
|
+
"gsd_exec",
|
|
264
|
+
"gsd_exec_search",
|
|
265
|
+
"gsd_resume",
|
|
266
|
+
"gsd_capture_thought",
|
|
267
|
+
"gsd_decision_save",
|
|
268
|
+
],
|
|
269
|
+
requiredWorkflowTools: [
|
|
270
|
+
"gsd_task_complete",
|
|
271
|
+
"gsd_exec",
|
|
272
|
+
"gsd_exec_search",
|
|
273
|
+
"gsd_resume",
|
|
274
|
+
"gsd_capture_thought",
|
|
275
|
+
],
|
|
259
276
|
},
|
|
260
277
|
},
|
|
261
278
|
"execute-task-simple": {
|
|
@@ -263,8 +280,21 @@ export const UNIT_REGISTRY = {
|
|
|
263
280
|
scopeClass: "execute-task",
|
|
264
281
|
phaseChain: ["execution_simple", "execution"],
|
|
265
282
|
toolContract: {
|
|
266
|
-
allowedGsdTools: [
|
|
267
|
-
|
|
283
|
+
allowedGsdTools: [
|
|
284
|
+
"gsd_task_complete",
|
|
285
|
+
"gsd_exec",
|
|
286
|
+
"gsd_exec_search",
|
|
287
|
+
"gsd_resume",
|
|
288
|
+
"gsd_capture_thought",
|
|
289
|
+
"gsd_decision_save",
|
|
290
|
+
],
|
|
291
|
+
requiredWorkflowTools: [
|
|
292
|
+
"gsd_task_complete",
|
|
293
|
+
"gsd_exec",
|
|
294
|
+
"gsd_exec_search",
|
|
295
|
+
"gsd_resume",
|
|
296
|
+
"gsd_capture_thought",
|
|
297
|
+
],
|
|
268
298
|
},
|
|
269
299
|
},
|
|
270
300
|
"reactive-execute": {
|
|
@@ -15,6 +15,9 @@ export interface VerificationVerdict {
|
|
|
15
15
|
failureContext: string;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
export const NO_HOST_CHECKS_FAILURE_CONTEXT =
|
|
19
|
+
"No runnable host-owned verification command was discovered. Add project verification_commands in .gsd/PREFERENCES.md or a runnable task-plan Verify command, then resume with /gsd next.";
|
|
20
|
+
|
|
18
21
|
export function decideVerificationVerdict(
|
|
19
22
|
unitType: string,
|
|
20
23
|
result: VerificationGateResult,
|
|
@@ -33,8 +36,7 @@ export function decideVerificationVerdict(
|
|
|
33
36
|
passed: false,
|
|
34
37
|
reason: "no-host-checks",
|
|
35
38
|
retryable: false,
|
|
36
|
-
failureContext:
|
|
37
|
-
"No runnable host-owned verification command was discovered. Add project verification_commands or a runnable task-plan Verify command before completing this execute-task.",
|
|
39
|
+
failureContext: NO_HOST_CHECKS_FAILURE_CONTEXT,
|
|
38
40
|
};
|
|
39
41
|
}
|
|
40
42
|
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
|
|
5
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
6
|
+
import { resolveGsdPathContract } from "./paths.js";
|
|
7
|
+
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
8
|
+
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
9
|
+
import { normalizeWorkflowEventCommand } from "./workflow-event-vocabulary.js";
|
|
10
|
+
import type { WorkflowEvent } from "./workflow-events.js";
|
|
11
|
+
|
|
12
|
+
export const WORKFLOW_EVENT_LOG_FILENAME = "event-log.jsonl";
|
|
13
|
+
|
|
14
|
+
export interface WorkflowEventLedgerLocation {
|
|
15
|
+
projectRoot: string;
|
|
16
|
+
workRoot: string;
|
|
17
|
+
projectGsd: string;
|
|
18
|
+
worktreeGsd: string | null;
|
|
19
|
+
projectLogPath: string;
|
|
20
|
+
worktreeLogPath: string | null;
|
|
21
|
+
isWorktree: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type WorkflowEventInput = Omit<WorkflowEvent, "hash" | "session_id"> & {
|
|
25
|
+
actor_name?: string;
|
|
26
|
+
trigger_reason?: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export function resolveWorkflowEventLedgerLocation(
|
|
30
|
+
basePath: string,
|
|
31
|
+
originalProjectRoot?: string | null,
|
|
32
|
+
): WorkflowEventLedgerLocation {
|
|
33
|
+
const contract = resolveGsdPathContract(basePath, originalProjectRoot);
|
|
34
|
+
return {
|
|
35
|
+
projectRoot: contract.projectRoot,
|
|
36
|
+
workRoot: contract.workRoot,
|
|
37
|
+
projectGsd: contract.projectGsd,
|
|
38
|
+
worktreeGsd: contract.worktreeGsd,
|
|
39
|
+
projectLogPath: join(contract.projectGsd, WORKFLOW_EVENT_LOG_FILENAME),
|
|
40
|
+
worktreeLogPath: contract.worktreeGsd
|
|
41
|
+
? join(contract.worktreeGsd, WORKFLOW_EVENT_LOG_FILENAME)
|
|
42
|
+
: null,
|
|
43
|
+
isWorktree: contract.isWorktree,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function workflowEventLogPath(basePath: string): string {
|
|
48
|
+
return resolveWorkflowEventLedgerLocation(basePath).projectLogPath;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function workflowEventArchivePath(basePath: string, milestoneId: string): string {
|
|
52
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
53
|
+
return join(location.projectGsd, `event-log-${milestoneId}.jsonl.archived`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function readWorktreeEventLogPath(worktreeBasePath: string): string {
|
|
57
|
+
const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
|
|
58
|
+
return location.worktreeLogPath ?? location.projectLogPath;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function buildWorkflowEvent(event: WorkflowEventInput, sessionId: string): WorkflowEvent {
|
|
62
|
+
const hash = createHash("sha256")
|
|
63
|
+
.update(JSON.stringify({ cmd: event.cmd, params: event.params }))
|
|
64
|
+
.digest("hex")
|
|
65
|
+
.slice(0, 16);
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
v: 2,
|
|
69
|
+
...event,
|
|
70
|
+
hash,
|
|
71
|
+
session_id: sessionId,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function appendWorkflowEvent(
|
|
76
|
+
basePath: string,
|
|
77
|
+
event: WorkflowEventInput,
|
|
78
|
+
sessionId: string,
|
|
79
|
+
): WorkflowEvent {
|
|
80
|
+
const fullEvent = buildWorkflowEvent(event, sessionId);
|
|
81
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
82
|
+
|
|
83
|
+
mkdirSync(location.projectGsd, { recursive: true });
|
|
84
|
+
appendFileSync(location.projectLogPath, `${JSON.stringify(fullEvent)}\n`, "utf-8");
|
|
85
|
+
emitWorkflowEventAudit(location.projectRoot, fullEvent);
|
|
86
|
+
return fullEvent;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function writeWorkflowEventLog(basePath: string, events: readonly WorkflowEvent[]): void {
|
|
90
|
+
const location = resolveWorkflowEventLedgerLocation(basePath);
|
|
91
|
+
mkdirSync(location.projectGsd, { recursive: true });
|
|
92
|
+
const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
93
|
+
atomicWriteSync(location.projectLogPath, content);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function writeWorktreeEventLog(
|
|
97
|
+
worktreeBasePath: string,
|
|
98
|
+
events: readonly WorkflowEvent[],
|
|
99
|
+
): void {
|
|
100
|
+
const location = resolveWorkflowEventLedgerLocation(worktreeBasePath);
|
|
101
|
+
const logPath = location.worktreeLogPath ?? location.projectLogPath;
|
|
102
|
+
mkdirSync(dirname(logPath), { recursive: true });
|
|
103
|
+
const content = events.map((event) => JSON.stringify(event)).join("\n") + (events.length > 0 ? "\n" : "");
|
|
104
|
+
atomicWriteSync(logPath, content);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function emitWorkflowEventAudit(basePath: string, event: WorkflowEvent): void {
|
|
108
|
+
if (!isUnifiedAuditEnabled()) return;
|
|
109
|
+
try {
|
|
110
|
+
const normalized = normalizeWorkflowEventCommand(event.cmd) ?? "unknown";
|
|
111
|
+
emitUokAuditEvent(
|
|
112
|
+
basePath,
|
|
113
|
+
buildAuditEnvelope({
|
|
114
|
+
traceId: event.session_id,
|
|
115
|
+
category: "orchestration",
|
|
116
|
+
type: `workflow-event-${normalized}`,
|
|
117
|
+
payload: {
|
|
118
|
+
cmd: event.cmd,
|
|
119
|
+
params: event.params,
|
|
120
|
+
actor: event.actor,
|
|
121
|
+
actorName: event.actor_name,
|
|
122
|
+
triggerReason: event.trigger_reason,
|
|
123
|
+
eventTs: event.ts,
|
|
124
|
+
hash: event.hash,
|
|
125
|
+
},
|
|
126
|
+
}),
|
|
127
|
+
);
|
|
128
|
+
} catch {
|
|
129
|
+
// Best-effort: audit projection must never block the workflow event ledger.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { WorkflowEvent } from "./workflow-events.js";
|
|
2
|
+
|
|
3
|
+
export interface WorkflowEventEntityKey {
|
|
4
|
+
type: string;
|
|
5
|
+
id: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function normalizeWorkflowEventCommand(cmd: unknown): string | null {
|
|
9
|
+
return typeof cmd === "string" ? cmd.replace(/-/g, "_") : null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Workflow progress events are keyed by the domain entity they mutate.
|
|
14
|
+
* Keep command aliases and conflict identity in this module so replay,
|
|
15
|
+
* conflict detection, and tests do not each grow their own vocabulary.
|
|
16
|
+
*/
|
|
17
|
+
export function workflowEventEntityKey(event: WorkflowEvent): WorkflowEventEntityKey | null {
|
|
18
|
+
const p = event.params;
|
|
19
|
+
const cmd = normalizeWorkflowEventCommand(event.cmd);
|
|
20
|
+
if (!cmd) return null;
|
|
21
|
+
|
|
22
|
+
switch (cmd) {
|
|
23
|
+
case "complete_task":
|
|
24
|
+
case "start_task":
|
|
25
|
+
case "skip_task":
|
|
26
|
+
case "report_blocker":
|
|
27
|
+
case "record_verification":
|
|
28
|
+
case "plan_task":
|
|
29
|
+
return typeof p["taskId"] === "string"
|
|
30
|
+
? { type: "task", id: p["taskId"] }
|
|
31
|
+
: null;
|
|
32
|
+
|
|
33
|
+
case "complete_slice":
|
|
34
|
+
case "replan_slice":
|
|
35
|
+
return typeof p["sliceId"] === "string"
|
|
36
|
+
? { type: "slice", id: p["sliceId"] }
|
|
37
|
+
: null;
|
|
38
|
+
|
|
39
|
+
case "plan_slice":
|
|
40
|
+
return typeof p["sliceId"] === "string"
|
|
41
|
+
? { type: "slice_plan", id: p["sliceId"] }
|
|
42
|
+
: null;
|
|
43
|
+
|
|
44
|
+
case "complete_milestone":
|
|
45
|
+
case "plan_milestone":
|
|
46
|
+
return typeof p["milestoneId"] === "string"
|
|
47
|
+
? { type: "milestone", id: p["milestoneId"] }
|
|
48
|
+
: null;
|
|
49
|
+
|
|
50
|
+
case "save_decision":
|
|
51
|
+
if (typeof p["scope"] === "string" && typeof p["decision"] === "string") {
|
|
52
|
+
return { type: "decision", id: `${p["scope"]}:${p["decision"]}` };
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
|
|
56
|
+
default:
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { join } from "node:path";
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
4
3
|
import { atomicWriteSync } from "./atomic-write.js";
|
|
5
4
|
import { withFileLockSync } from "./file-lock.js";
|
|
5
|
+
import {
|
|
6
|
+
appendWorkflowEvent,
|
|
7
|
+
workflowEventArchivePath,
|
|
8
|
+
workflowEventLogPath,
|
|
9
|
+
type WorkflowEventInput,
|
|
10
|
+
} from "./workflow-event-ledger.js";
|
|
6
11
|
import { logWarning } from "./workflow-logger.js";
|
|
7
12
|
|
|
8
13
|
// ─── Session ID ───────────────────────────────────────────────────────────
|
|
@@ -40,22 +45,9 @@ export interface WorkflowEvent {
|
|
|
40
45
|
*/
|
|
41
46
|
export function appendEvent(
|
|
42
47
|
basePath: string,
|
|
43
|
-
event:
|
|
48
|
+
event: WorkflowEventInput,
|
|
44
49
|
): void {
|
|
45
|
-
|
|
46
|
-
.update(JSON.stringify({ cmd: event.cmd, params: event.params }))
|
|
47
|
-
.digest("hex")
|
|
48
|
-
.slice(0, 16);
|
|
49
|
-
|
|
50
|
-
const fullEvent: WorkflowEvent = {
|
|
51
|
-
v: 2,
|
|
52
|
-
...event,
|
|
53
|
-
hash,
|
|
54
|
-
session_id: ENGINE_SESSION_ID,
|
|
55
|
-
};
|
|
56
|
-
const dir = join(basePath, ".gsd");
|
|
57
|
-
mkdirSync(dir, { recursive: true });
|
|
58
|
-
appendFileSync(join(dir, "event-log.jsonl"), JSON.stringify(fullEvent) + "\n", "utf-8");
|
|
50
|
+
appendWorkflowEvent(basePath, event, ENGINE_SESSION_ID);
|
|
59
51
|
}
|
|
60
52
|
|
|
61
53
|
// ─── readEvents ──────────────────────────────────────────────────────────
|
|
@@ -125,8 +117,8 @@ export function compactMilestoneEvents(
|
|
|
125
117
|
basePath: string,
|
|
126
118
|
milestoneId: string,
|
|
127
119
|
): { archived: number } {
|
|
128
|
-
const logPath =
|
|
129
|
-
const archivePath =
|
|
120
|
+
const logPath = workflowEventLogPath(basePath);
|
|
121
|
+
const archivePath = workflowEventArchivePath(basePath, milestoneId);
|
|
130
122
|
|
|
131
123
|
return withFileLockSync(logPath, () => {
|
|
132
124
|
const allEvents = readEvents(logPath);
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type EnsureProjectWorkflowMcpConfigResult,
|
|
5
5
|
ensureProjectWorkflowMcpConfig,
|
|
6
6
|
} from "./mcp-project-config.js";
|
|
7
|
+
import { warmWorkflowMcpProbeInBackground } from "./workflow-mcp-readiness-cache.js";
|
|
7
8
|
import { usesWorkflowMcpTransport } from "./workflow-mcp.js";
|
|
8
9
|
|
|
9
10
|
interface WorkflowMcpAutoPrepContext {
|
|
@@ -75,6 +76,7 @@ export function prepareWorkflowMcpForProject(
|
|
|
75
76
|
if (result.status !== "unchanged") {
|
|
76
77
|
prepCtx.ui?.notify?.(`GSD MCP Server Prepared at ${result.configPath}`, "info");
|
|
77
78
|
}
|
|
79
|
+
warmWorkflowMcpProbeInBackground(projectRoot);
|
|
78
80
|
return result;
|
|
79
81
|
} catch (err) {
|
|
80
82
|
prepCtx.ui?.notify?.(
|