@opengsd/gsd-pi 1.3.0-dev.eed73bea → 1.4.0-dev.5fc22c6f
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/README.md +11 -11
- package/dist/cli.js +17 -4
- package/dist/headless-answers.js +1 -1
- package/dist/headless-ui.d.ts +1 -1
- package/dist/headless-ui.js +1 -1
- package/dist/headless.js +1 -1
- package/dist/onboarding.js +11 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +20 -25
- package/dist/resources/extensions/claude-code-cli/models.js +9 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +61 -50
- package/dist/resources/extensions/cursor-cli/index.js +16 -0
- package/dist/resources/extensions/cursor-cli/models.js +63 -0
- package/dist/resources/extensions/cursor-cli/package.json +11 -0
- package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
- package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
- package/dist/resources/extensions/gsd/activity-log.js +4 -1
- package/dist/resources/extensions/gsd/artifact-verification.js +431 -0
- package/dist/resources/extensions/gsd/auto/session.js +11 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +28 -1
- package/dist/resources/extensions/gsd/auto-budget.js +5 -1
- package/dist/resources/extensions/gsd/auto-dispatch.js +32 -11
- package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
- package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +83 -25
- package/dist/resources/extensions/gsd/auto-recovery.js +9 -517
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -5
- package/dist/resources/extensions/gsd/auto-start.js +4 -3
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +7 -3
- package/dist/resources/extensions/gsd/auto-verification.js +5 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +38 -11
- package/dist/resources/extensions/gsd/auto.js +32 -10
- package/dist/resources/extensions/gsd/bootstrap/core-session-tools.js +39 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -4
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +147 -23
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +56 -36
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +29 -5
- package/dist/resources/extensions/gsd/closeout-consistency-gate.js +3 -1
- package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +154 -2
- package/dist/resources/extensions/gsd/commands-usage.js +1 -1
- package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
- package/dist/resources/extensions/gsd/db/engine.js +4 -1
- package/dist/resources/extensions/gsd/db/queries.js +39 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +34 -0
- package/dist/resources/extensions/gsd/db-workspace.js +55 -3
- package/dist/resources/extensions/gsd/delegation-policy.js +1 -1
- package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +227 -5
- package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +3 -0
- package/dist/resources/extensions/gsd/doctor.js +93 -3
- package/dist/resources/extensions/gsd/exec-sandbox.js +14 -4
- package/dist/resources/extensions/gsd/flat-phase-migration.js +119 -23
- package/dist/resources/extensions/gsd/git-service.js +61 -8
- package/dist/resources/extensions/gsd/gitignore.js +4 -1
- package/dist/resources/extensions/gsd/guidance.js +1 -0
- package/dist/resources/extensions/gsd/guided-flow-queue.js +20 -13
- package/dist/resources/extensions/gsd/guided-flow.js +40 -2
- package/dist/resources/extensions/gsd/json-persistence.js +20 -0
- package/dist/resources/extensions/gsd/key-manager.js +1 -0
- package/dist/resources/extensions/gsd/knowledge-backfill.js +18 -11
- package/dist/resources/extensions/gsd/layout-policy.js +3 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +27 -15
- package/dist/resources/extensions/gsd/memory-backfill.js +28 -21
- package/dist/resources/extensions/gsd/metrics.js +4 -4
- package/dist/resources/extensions/gsd/migrate-external.js +22 -5
- package/dist/resources/extensions/gsd/migration-auto-check.js +22 -0
- package/dist/resources/extensions/gsd/milestone-ids.js +32 -2
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +92 -16
- package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
- package/dist/resources/extensions/gsd/preferences-models.js +6 -4
- package/dist/resources/extensions/gsd/preferences-validation.js +25 -2
- package/dist/resources/extensions/gsd/preferences.js +29 -2
- package/dist/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
- package/dist/resources/extensions/gsd/repository-registry.js +6 -1
- package/dist/resources/extensions/gsd/root-write-leak-guard.js +7 -1
- package/dist/resources/extensions/gsd/safe-fs.js +23 -2
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +8 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +16 -1
- package/dist/resources/extensions/gsd/safety/file-change-validator.js +5 -2
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
- package/dist/resources/extensions/gsd/state/derive/cache.js +28 -0
- package/dist/resources/extensions/gsd/state/derive/db-open.js +39 -0
- package/dist/resources/extensions/gsd/state/derive/from-db.js +452 -0
- package/dist/resources/extensions/gsd/state/derive/index.js +75 -0
- package/dist/resources/extensions/gsd/state/derive/interrupted-work.js +21 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +27 -33
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +48 -23
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +32 -28
- package/dist/resources/extensions/gsd/state.js +12 -611
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +3 -34
- package/dist/resources/extensions/gsd/tools/complete-task.js +8 -41
- package/dist/resources/extensions/gsd/tools/plan-slice.js +59 -44
- package/dist/resources/extensions/gsd/tools/plan-task.js +103 -12
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
- package/dist/resources/extensions/gsd/undo.js +43 -6
- package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
- package/dist/resources/extensions/gsd/unit-registry.js +11 -3
- package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
- package/dist/resources/extensions/gsd/verification-gate.js +7 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +126 -13
- package/dist/resources/extensions/gsd/workflow-projections.js +19 -14
- package/dist/resources/extensions/gsd/workspace.js +26 -8
- package/dist/resources/extensions/gsd/worktree-manager.js +140 -5
- 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 +12 -12
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +9 -9
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +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/page_client-reference-manifest.js +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/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- 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/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
- package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{2659.b7b129ee6a769448.js → 2659.58e950899a9bb82f.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/2772.a7c1fcc69a4685ef.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{3616.3c60753b8ffcbd2e.js → 3616.61a2af74bb8833c8.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{4283.8e446784528ed9dc.js → 4283.d0d9e0a955e441cb.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{5826.a46ecdd1cfe8dabc.js → 5826.5421d66c72b9f34e.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{8785.481aa5869991b760.js → 8785.e29b3134cab1d153.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/8937.640dc9c2aaa1dfad.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-6644fc6ee8ca1247.js → page-72a856634ad14c10.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9c401904f87ded16.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/wizard.d.ts +8 -0
- package/dist/wizard.js +8 -1
- package/integrations/hermes/__init__.py +31 -0
- package/integrations/hermes/tests/test_directory_loader.py +37 -0
- package/package.json +8 -8
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
- package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
- package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-runtime.js +25 -1
- package/packages/daemon/dist/cloud-runtime.js.map +1 -1
- package/packages/daemon/dist/cloud-runtime.test.js +51 -0
- package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
- package/packages/daemon/dist/message-batcher.d.ts +7 -0
- package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
- package/packages/daemon/dist/message-batcher.js +13 -0
- package/packages/daemon/dist/message-batcher.js.map +1 -1
- package/packages/daemon/dist/message-batcher.test.js +48 -0
- package/packages/daemon/dist/message-batcher.test.js.map +1 -1
- package/packages/daemon/package.json +5 -5
- package/packages/gsd-agent-core/dist/agent-session.d.ts +1 -0
- package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/agent-session.js +3 -0
- package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts +41 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js +62 -0
- package/packages/gsd-agent-core/dist/extension-ui-snapshot.js.map +1 -0
- package/packages/gsd-agent-core/dist/index.d.ts +2 -0
- package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/index.js +2 -0
- package/packages/gsd-agent-core/dist/index.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-events.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts +5 -0
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +60 -3
- package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
- package/packages/gsd-agent-core/dist/transcript-store.d.ts +58 -0
- package/packages/gsd-agent-core/dist/transcript-store.d.ts.map +1 -0
- package/packages/gsd-agent-core/dist/transcript-store.js +132 -0
- package/packages/gsd-agent-core/dist/transcript-store.js.map +1 -0
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +2 -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 +25 -11
- 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-latency.d.ts +4 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller-latency.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -24
- 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 +26 -841
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts +58 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js +312 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-handoff-filter.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts +31 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js +130 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-pinned-zone.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts +15 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +259 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts +13 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js +118 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-tool-rollup.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts +54 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js +20 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-ui-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +4 -1
- 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 +9 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts +56 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js +44 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/streaming-render-state.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js +77 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/tui-transcript-tracker.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts +2 -0
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +24 -6
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.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 +18 -0
- 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/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +3 -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/dist/env-api-keys.d.ts.map +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +3 -0
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +46 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +38 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -2
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +3 -2
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts +9 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js +94 -0
- package/packages/pi-coding-agent/dist/core/session-manager-context.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts +8 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js +244 -0
- package/packages/pi-coding-agent/dist/core/session-manager-list.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js +84 -0
- package/packages/pi-coding-agent/dist/core/session-manager-migration.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +135 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js +2 -0
- package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts +6 -154
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +22 -459
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts +75 -75
- package/packages/pi-coding-agent/dist/theme/theme-schema.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.js +1 -1
- package/packages/pi-coding-agent/dist/theme/theme-schema.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 +11 -7
- 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/package.json +2 -2
- package/packages/rpc-client/dist/rpc-client.js +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme-schema.d.ts +75 -75
- package/pkg/dist/theme/theme-schema.d.ts.map +1 -1
- package/pkg/dist/theme/theme-schema.js +1 -1
- package/pkg/dist/theme/theme-schema.js.map +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +11 -7
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/link-workspace-packages.cjs +14 -4
- package/src/resources/GSD-WORKFLOW.md +20 -25
- package/src/resources/extensions/claude-code-cli/models.ts +9 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +67 -49
- package/src/resources/extensions/claude-code-cli/tests/index.test.ts +14 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +159 -0
- package/src/resources/extensions/cursor-cli/index.ts +18 -0
- package/src/resources/extensions/cursor-cli/models.ts +65 -0
- package/src/resources/extensions/cursor-cli/package.json +11 -0
- package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
- package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
- package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
- package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
- package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
- package/src/resources/extensions/gsd/activity-log.ts +4 -1
- package/src/resources/extensions/gsd/artifact-verification.ts +468 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/session.ts +14 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +3 -1
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +47 -1
- package/src/resources/extensions/gsd/auto-budget.ts +12 -1
- package/src/resources/extensions/gsd/auto-dispatch.ts +34 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
- package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +80 -25
- package/src/resources/extensions/gsd/auto-recovery.ts +13 -518
- package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -5
- package/src/resources/extensions/gsd/auto-start.ts +4 -3
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +7 -2
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +50 -11
- package/src/resources/extensions/gsd/auto.ts +36 -8
- package/src/resources/extensions/gsd/bootstrap/core-session-tools.ts +44 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +171 -23
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +49 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +60 -37
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +39 -5
- package/src/resources/extensions/gsd/closeout-consistency-gate.ts +2 -1
- package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +136 -2
- package/src/resources/extensions/gsd/commands-usage.ts +1 -1
- package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
- package/src/resources/extensions/gsd/db/engine.ts +8 -1
- package/src/resources/extensions/gsd/db/queries.ts +40 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +45 -0
- package/src/resources/extensions/gsd/db-workspace.ts +61 -3
- package/src/resources/extensions/gsd/delegation-policy.ts +1 -1
- package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +275 -5
- package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +3 -0
- package/src/resources/extensions/gsd/doctor-types.ts +8 -1
- package/src/resources/extensions/gsd/doctor.ts +95 -3
- package/src/resources/extensions/gsd/exec-sandbox.ts +13 -4
- package/src/resources/extensions/gsd/flat-phase-migration.ts +142 -22
- package/src/resources/extensions/gsd/git-service.ts +70 -9
- package/src/resources/extensions/gsd/gitignore.ts +4 -1
- package/src/resources/extensions/gsd/guidance.ts +2 -0
- package/src/resources/extensions/gsd/guided-flow-queue.ts +20 -13
- package/src/resources/extensions/gsd/guided-flow.ts +45 -2
- package/src/resources/extensions/gsd/json-persistence.ts +20 -0
- package/src/resources/extensions/gsd/key-manager.ts +1 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +16 -10
- package/src/resources/extensions/gsd/layout-policy.ts +2 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +27 -17
- package/src/resources/extensions/gsd/memory-backfill.ts +26 -20
- package/src/resources/extensions/gsd/metrics.ts +4 -4
- package/src/resources/extensions/gsd/migrate-external.ts +17 -4
- package/src/resources/extensions/gsd/migration-auto-check.ts +23 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +31 -2
- package/src/resources/extensions/gsd/model-router.ts +4 -5
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +108 -20
- package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
- package/src/resources/extensions/gsd/preferences-models.ts +6 -3
- package/src/resources/extensions/gsd/preferences-validation.ts +28 -2
- package/src/resources/extensions/gsd/preferences.ts +38 -4
- package/src/resources/extensions/gsd/prompts/code-review.md +6 -4
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
- package/src/resources/extensions/gsd/repository-registry.ts +7 -1
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +13 -1
- package/src/resources/extensions/gsd/safe-fs.ts +22 -2
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +9 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +16 -1
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +8 -2
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +2 -1
- package/src/resources/extensions/gsd/state/derive/cache.ts +46 -0
- package/src/resources/extensions/gsd/state/derive/db-open.ts +45 -0
- package/src/resources/extensions/gsd/state/derive/from-db.ts +561 -0
- package/src/resources/extensions/gsd/state/derive/index.ts +104 -0
- package/src/resources/extensions/gsd/state/derive/interrupted-work.ts +31 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +36 -30
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +50 -24
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +43 -28
- package/src/resources/extensions/gsd/state.ts +32 -732
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +98 -1
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +14 -5
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +182 -4
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
- package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +58 -3
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +296 -2
- package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +74 -2
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +11 -2
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +91 -7
- package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +103 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +307 -1
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +50 -14
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +15 -3
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/undo.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +69 -4
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +96 -15
- package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +214 -6
- package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +31 -1
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
- package/src/resources/extensions/gsd/tools/complete-slice.ts +3 -30
- package/src/resources/extensions/gsd/tools/complete-task.ts +7 -39
- package/src/resources/extensions/gsd/tools/plan-slice.ts +60 -47
- package/src/resources/extensions/gsd/tools/plan-task.ts +135 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
- package/src/resources/extensions/gsd/undo.ts +47 -6
- package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
- package/src/resources/extensions/gsd/unit-registry.ts +11 -3
- package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
- package/src/resources/extensions/gsd/verification-gate.ts +8 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +141 -7
- package/src/resources/extensions/gsd/workflow-projections.ts +20 -14
- package/src/resources/extensions/gsd/workspace.ts +42 -8
- package/src/resources/extensions/gsd/worktree-manager.ts +183 -5
- package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +0 -1
- package/dist/web/standalone/.next/static/chunks/796.3976108148518f7d.js +0 -10
- package/dist/web/standalone/.next/static/chunks/webpack-7c1d97e39be2da11.js +0 -1
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{SzEuqWX37DR9MEpEuQjP1 → kIEFsCryyGy6RzifULbJl}/_ssgManifest.js +0 -0
|
@@ -29,21 +29,18 @@ import {
|
|
|
29
29
|
deleteVerificationEvidence,
|
|
30
30
|
saveGateResult,
|
|
31
31
|
getPendingGatesForTurn,
|
|
32
|
-
isDbAvailable,
|
|
33
32
|
} from "../gsd-db.js";
|
|
34
|
-
import { getWorkflowDatabasePath,
|
|
33
|
+
import { getWorkflowDatabasePath, ensureWorkflowDbAtPath } from "../db-workspace.js";
|
|
35
34
|
import { getGatesForTurn } from "../gate-registry.js";
|
|
36
35
|
import { gsdProjectionRoot, clearPathCache, resolveMilestonePath, resolveSlicePath } from "../paths.js";
|
|
37
36
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
38
37
|
import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
39
38
|
import { saveFile, clearParseCache } from "../files.js";
|
|
40
39
|
import { invalidateStateCache } from "../state.js";
|
|
41
|
-
import { renderPlanCheckboxes
|
|
40
|
+
import { renderPlanCheckboxes } from "../markdown-renderer.js";
|
|
42
41
|
import {
|
|
43
|
-
|
|
42
|
+
renderMilestoneShellProjections,
|
|
44
43
|
renderSummaryContent,
|
|
45
|
-
renderTopLevelQueueFromDb,
|
|
46
|
-
renderTopLevelRoadmapFromDb,
|
|
47
44
|
} from "../workflow-projections.js";
|
|
48
45
|
import { writeManifest } from "../workflow-manifest.js";
|
|
49
46
|
import { appendEvent } from "../workflow-events.js";
|
|
@@ -108,35 +105,6 @@ function taskSummaryPath(
|
|
|
108
105
|
);
|
|
109
106
|
}
|
|
110
107
|
|
|
111
|
-
async function renderCompleteTaskProjections(basePath: string, milestoneId: string): Promise<void> {
|
|
112
|
-
try {
|
|
113
|
-
await renderRoadmapFromDb(basePath, milestoneId);
|
|
114
|
-
} catch (err) {
|
|
115
|
-
logWarning("projection", `renderRoadmapFromDb failed for ${milestoneId}: ${(err as Error).message}`);
|
|
116
|
-
}
|
|
117
|
-
try {
|
|
118
|
-
renderTopLevelRoadmapFromDb(basePath);
|
|
119
|
-
} catch (err) {
|
|
120
|
-
logWarning("projection", `renderTopLevelRoadmapFromDb failed: ${(err as Error).message}`);
|
|
121
|
-
}
|
|
122
|
-
try {
|
|
123
|
-
renderTopLevelQueueFromDb(basePath);
|
|
124
|
-
} catch (err) {
|
|
125
|
-
logWarning("projection", `renderTopLevelQueueFromDb failed: ${(err as Error).message}`);
|
|
126
|
-
}
|
|
127
|
-
try {
|
|
128
|
-
await renderStateProjection(basePath);
|
|
129
|
-
} catch (err) {
|
|
130
|
-
logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function ensureCompleteTaskDbOpen(dbPath: string | null): boolean {
|
|
135
|
-
if (!dbPath || dbPath === ":memory:") return isDbAvailable();
|
|
136
|
-
if (isDbAvailable() && getWorkflowDatabasePath() === dbPath) return true;
|
|
137
|
-
return openWorkflowDatabasePath(dbPath);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
108
|
async function repairMissingTaskSummaryProjection(
|
|
141
109
|
artifactBasePath: string,
|
|
142
110
|
taskRow: TaskRow,
|
|
@@ -167,7 +135,7 @@ async function repairMissingTaskSummaryProjection(
|
|
|
167
135
|
clearParseCache();
|
|
168
136
|
|
|
169
137
|
try {
|
|
170
|
-
await
|
|
138
|
+
await renderMilestoneShellProjections(artifactBasePath, taskRow.milestone_id);
|
|
171
139
|
} catch (projErr) {
|
|
172
140
|
logWarning("tool", `complete-task repair projection warning: ${(projErr as Error).message}`);
|
|
173
141
|
}
|
|
@@ -473,7 +441,7 @@ export async function handleCompleteTask(
|
|
|
473
441
|
|
|
474
442
|
// Toggle or regenerate the plan projection from DB. Missing projection
|
|
475
443
|
// files are rebuilt by the renderer instead of being skipped.
|
|
476
|
-
if (!
|
|
444
|
+
if (!ensureWorkflowDbAtPath(rollbackDbPath)) {
|
|
477
445
|
throw new Error(`database unavailable before plan projection render for ${params.milestoneId}/${params.sliceId}`);
|
|
478
446
|
}
|
|
479
447
|
const wrotePlan = await renderPlanCheckboxes(artifactBasePath, params.milestoneId, params.sliceId);
|
|
@@ -488,7 +456,7 @@ export async function handleCompleteTask(
|
|
|
488
456
|
);
|
|
489
457
|
let rollbackSucceeded = false;
|
|
490
458
|
try {
|
|
491
|
-
|
|
459
|
+
ensureWorkflowDbAtPath(rollbackDbPath);
|
|
492
460
|
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
493
461
|
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, "pending");
|
|
494
462
|
invalidateStateCache();
|
|
@@ -640,7 +608,7 @@ export async function handleCompleteTask(
|
|
|
640
608
|
// Separate try/catch per step so a projection failure doesn't prevent
|
|
641
609
|
// the event log entry (critical for worktree reconciliation).
|
|
642
610
|
try {
|
|
643
|
-
await
|
|
611
|
+
await renderMilestoneShellProjections(artifactBasePath, params.milestoneId);
|
|
644
612
|
} catch (projErr) {
|
|
645
613
|
logWarning("tool", `complete-task projection warning: ${(projErr as Error).message}`);
|
|
646
614
|
}
|
|
@@ -51,7 +51,7 @@ export interface PlanSliceParams {
|
|
|
51
51
|
milestoneId: string;
|
|
52
52
|
sliceId: string;
|
|
53
53
|
goal: string;
|
|
54
|
-
tasks
|
|
54
|
+
tasks?: PlanSliceTaskInput[];
|
|
55
55
|
/** @optional — omitted fields render as conservative defaults */
|
|
56
56
|
successCriteria?: string;
|
|
57
57
|
/** @optional — omitted fields render as conservative defaults */
|
|
@@ -86,10 +86,12 @@ function validateRepositoryTargetIds(
|
|
|
86
86
|
return deduped;
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
function validateTasks(value: unknown): PlanSliceTaskInput[] {
|
|
90
|
-
if (
|
|
91
|
-
|
|
89
|
+
function validateTasks(value: unknown): PlanSliceTaskInput[] | undefined {
|
|
90
|
+
if (value === undefined) return undefined;
|
|
91
|
+
if (!Array.isArray(value)) {
|
|
92
|
+
throw new Error("tasks must be an array");
|
|
92
93
|
}
|
|
94
|
+
if (value.length === 0) return undefined;
|
|
93
95
|
|
|
94
96
|
const seen = new Set<string>();
|
|
95
97
|
return value.map((entry, index) => {
|
|
@@ -200,7 +202,7 @@ function validateReferencedRepositories(
|
|
|
200
202
|
};
|
|
201
203
|
|
|
202
204
|
for (const id of params.targetRepositories ?? defaultTargets) noteMissing(id);
|
|
203
|
-
for (const task of params.tasks) {
|
|
205
|
+
for (const task of params.tasks ?? []) {
|
|
204
206
|
for (const id of task.targetRepositories ?? params.targetRepositories ?? defaultTargets) noteMissing(id);
|
|
205
207
|
}
|
|
206
208
|
|
|
@@ -211,7 +213,7 @@ function validateReferencedRepositories(
|
|
|
211
213
|
function resolveAllowedRootsForPathScope(params: PlanSliceParams, registry: RepositoryRegistry, defaultTargets: string[]): string[] {
|
|
212
214
|
const requested = new Set<string>();
|
|
213
215
|
for (const id of params.targetRepositories ?? defaultTargets) requested.add(id);
|
|
214
|
-
for (const task of params.tasks) {
|
|
216
|
+
for (const task of params.tasks ?? []) {
|
|
215
217
|
for (const id of task.targetRepositories ?? params.targetRepositories ?? defaultTargets) requested.add(id);
|
|
216
218
|
}
|
|
217
219
|
if (requested.size === 0) return [registry.projectRoot];
|
|
@@ -222,7 +224,7 @@ function resolveAllowedRootsForPathScope(params: PlanSliceParams, registry: Repo
|
|
|
222
224
|
}
|
|
223
225
|
|
|
224
226
|
function toTaskRows(params: PlanSliceParams, defaultTargets: string[]): TaskRow[] {
|
|
225
|
-
return params.tasks.map((task, index) => ({
|
|
227
|
+
return (params.tasks ?? []).map((task, index) => ({
|
|
226
228
|
milestone_id: params.milestoneId,
|
|
227
229
|
slice_id: params.sliceId,
|
|
228
230
|
id: task.taskId,
|
|
@@ -309,6 +311,8 @@ export async function handlePlanSlice(
|
|
|
309
311
|
return { error: `validation failed: ${message}` };
|
|
310
312
|
}
|
|
311
313
|
const defaultTargets = defaultRepositoryTargets(repositoryRegistry);
|
|
314
|
+
const taskPayload = params.tasks ?? [];
|
|
315
|
+
const hasTaskPayload = taskPayload.length > 0;
|
|
312
316
|
const repoValidationError = validateReferencedRepositories(params, repositoryRegistry, defaultTargets);
|
|
313
317
|
if (repoValidationError) {
|
|
314
318
|
return { error: `validation failed: ${repoValidationError}` };
|
|
@@ -317,7 +321,7 @@ export async function handlePlanSlice(
|
|
|
317
321
|
const allowedAbsoluteRoots = resolveAllowedRootsForPathScope(params, repositoryRegistry, defaultTargets);
|
|
318
322
|
|
|
319
323
|
const pathOnlyError = validatePathOnlyPlanningFields(
|
|
320
|
-
|
|
324
|
+
taskPayload.map((task, index) => ({
|
|
321
325
|
field: `tasks[${index}].expectedOutput`,
|
|
322
326
|
values: task.expectedOutput,
|
|
323
327
|
})),
|
|
@@ -328,7 +332,7 @@ export async function handlePlanSlice(
|
|
|
328
332
|
|
|
329
333
|
const pathScopeError = validatePlanningPathScope(
|
|
330
334
|
basePath,
|
|
331
|
-
|
|
335
|
+
taskPayload.flatMap((task, index) => [
|
|
332
336
|
{ field: `tasks[${index}].files`, values: task.files },
|
|
333
337
|
{ field: `tasks[${index}].inputs`, values: task.inputs },
|
|
334
338
|
{ field: `tasks[${index}].expectedOutput`, values: task.expectedOutput },
|
|
@@ -372,16 +376,18 @@ export async function handlePlanSlice(
|
|
|
372
376
|
return;
|
|
373
377
|
}
|
|
374
378
|
|
|
375
|
-
const newTaskIds = new Set(
|
|
379
|
+
const newTaskIds = new Set(taskPayload.map((task) => task.taskId));
|
|
376
380
|
const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
381
|
+
if (hasTaskPayload) {
|
|
382
|
+
omittedTaskIds = existingTasks
|
|
383
|
+
.filter((task) => !newTaskIds.has(task.id))
|
|
384
|
+
.map((task) => task.id);
|
|
385
|
+
|
|
386
|
+
for (const task of existingTasks) {
|
|
387
|
+
if (!newTaskIds.has(task.id) && isClosedStatus(task.status)) {
|
|
388
|
+
guardError = `cannot remove completed task ${task.id}`;
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
385
391
|
}
|
|
386
392
|
}
|
|
387
393
|
|
|
@@ -398,35 +404,37 @@ export async function handlePlanSlice(
|
|
|
398
404
|
targetRepositories: params.targetRepositories ?? defaultTargets,
|
|
399
405
|
});
|
|
400
406
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
407
|
+
if (hasTaskPayload) {
|
|
408
|
+
for (const taskId of omittedTaskIds) {
|
|
409
|
+
deleteTask(params.milestoneId, params.sliceId, taskId);
|
|
410
|
+
}
|
|
404
411
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
title: task.title,
|
|
409
|
-
description: task.description,
|
|
410
|
-
estimate: task.estimate,
|
|
411
|
-
files: task.files,
|
|
412
|
-
verify: task.verify,
|
|
413
|
-
inputs: task.inputs,
|
|
414
|
-
expectedOutput: task.expectedOutput,
|
|
415
|
-
observabilityImpact: task.observabilityImpact ?? "",
|
|
416
|
-
fullPlanMd: task.fullPlanMd,
|
|
417
|
-
targetRepositories: task.targetRepositories ?? params.targetRepositories ?? defaultTargets,
|
|
418
|
-
};
|
|
419
|
-
const existingTask = existingTaskById.get(task.taskId);
|
|
420
|
-
if (!existingTask || !isClosedStatus(existingTask.status)) {
|
|
421
|
-
insertTask({
|
|
422
|
-
id: task.taskId,
|
|
423
|
-
sliceId: params.sliceId,
|
|
424
|
-
milestoneId: params.milestoneId,
|
|
412
|
+
const existingTaskById = new Map(existingTasks.map((task) => [task.id, task]));
|
|
413
|
+
for (const task of taskPayload) {
|
|
414
|
+
const planning = {
|
|
425
415
|
title: task.title,
|
|
426
|
-
|
|
427
|
-
|
|
416
|
+
description: task.description,
|
|
417
|
+
estimate: task.estimate,
|
|
418
|
+
files: task.files,
|
|
419
|
+
verify: task.verify,
|
|
420
|
+
inputs: task.inputs,
|
|
421
|
+
expectedOutput: task.expectedOutput,
|
|
422
|
+
observabilityImpact: task.observabilityImpact ?? "",
|
|
423
|
+
fullPlanMd: task.fullPlanMd,
|
|
424
|
+
targetRepositories: task.targetRepositories ?? params.targetRepositories ?? defaultTargets,
|
|
425
|
+
};
|
|
426
|
+
const existingTask = existingTaskById.get(task.taskId);
|
|
427
|
+
if (!existingTask || !isClosedStatus(existingTask.status)) {
|
|
428
|
+
insertTask({
|
|
429
|
+
id: task.taskId,
|
|
430
|
+
sliceId: params.sliceId,
|
|
431
|
+
milestoneId: params.milestoneId,
|
|
432
|
+
title: task.title,
|
|
433
|
+
status: "pending",
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
upsertTaskPlanning(params.milestoneId, params.sliceId, task.taskId, planning);
|
|
428
437
|
}
|
|
429
|
-
upsertTaskPlanning(params.milestoneId, params.sliceId, task.taskId, planning);
|
|
430
438
|
}
|
|
431
439
|
|
|
432
440
|
// Seed quality gate rows inside the transaction — all-or-nothing with
|
|
@@ -436,7 +444,7 @@ export async function handlePlanSlice(
|
|
|
436
444
|
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "slice" });
|
|
437
445
|
}
|
|
438
446
|
const taskGates = resolveTaskGates(gateEvaluation);
|
|
439
|
-
for (const task of
|
|
447
|
+
for (const task of taskPayload) {
|
|
440
448
|
for (const gid of taskGates) {
|
|
441
449
|
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: task.taskId });
|
|
442
450
|
}
|
|
@@ -460,8 +468,13 @@ export async function handlePlanSlice(
|
|
|
460
468
|
deleteArtifactByPath(artifactPath);
|
|
461
469
|
}
|
|
462
470
|
|
|
463
|
-
const
|
|
464
|
-
|
|
471
|
+
const sliceTasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
472
|
+
const renderResult = sliceTasks.length === 0
|
|
473
|
+
? { planPath: "", taskPlanPaths: [] as string[] }
|
|
474
|
+
: await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
|
|
475
|
+
if (sliceTasks.length > 0) {
|
|
476
|
+
setSliceSketchFlag(params.milestoneId, params.sliceId, false);
|
|
477
|
+
}
|
|
465
478
|
invalidateStateCache();
|
|
466
479
|
clearParseCache();
|
|
467
480
|
|
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { clearParseCache } from "../files.js";
|
|
2
2
|
import { isClosedStatus } from "../status-guards.js";
|
|
3
3
|
import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
4
|
-
import {
|
|
4
|
+
import { getGateIdsForTurn } from "../gate-registry.js";
|
|
5
|
+
import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning, insertGateRow, setSliceSketchFlag } from "../gsd-db.js";
|
|
5
6
|
import { invalidateStateCache } from "../state.js";
|
|
6
7
|
import { renderTaskPlanFromDb, renderPlanFromDb } from "../markdown-renderer.js";
|
|
7
|
-
import {
|
|
8
|
+
import { resolveTasksDir } from "../paths.js";
|
|
8
9
|
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
9
10
|
import { writeManifest } from "../workflow-manifest.js";
|
|
10
11
|
import { appendEvent } from "../workflow-events.js";
|
|
11
12
|
import { logWarning } from "../workflow-logger.js";
|
|
13
|
+
import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
12
14
|
import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
|
|
15
|
+
import { createRepositoryRegistryFromPreferences, defaultRepositoryTargets, type RepositoryRegistry } from "../repository-registry.js";
|
|
16
|
+
import type { GateId } from "../types.js";
|
|
13
17
|
|
|
14
18
|
export interface PlanTaskParams {
|
|
15
19
|
milestoneId: string;
|
|
@@ -23,6 +27,8 @@ export interface PlanTaskParams {
|
|
|
23
27
|
inputs: string[];
|
|
24
28
|
expectedOutput: string[];
|
|
25
29
|
observabilityImpact?: string;
|
|
30
|
+
/** Repository id(s) this task touches (parent workspace); omitted for single-repo projects. */
|
|
31
|
+
targetRepositories?: string[];
|
|
26
32
|
fullPlanMd?: string;
|
|
27
33
|
/** Optional caller-provided identity for audit trail */
|
|
28
34
|
actorName?: string;
|
|
@@ -37,6 +43,63 @@ export interface PlanTaskResult {
|
|
|
37
43
|
taskPlanPath: string;
|
|
38
44
|
}
|
|
39
45
|
|
|
46
|
+
function validateRepositoryTargetIds(field: string, value: unknown): string[] {
|
|
47
|
+
const ids = validateStringArray(value, field);
|
|
48
|
+
if (ids.length === 0) throw new Error(`${field} must include at least one repository id when provided`);
|
|
49
|
+
const deduped = Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)));
|
|
50
|
+
if (deduped.length === 0) throw new Error(`${field} must include at least one repository id when provided`);
|
|
51
|
+
return deduped;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function validateReferencedRepositories(
|
|
55
|
+
targetRepositories: string[] | undefined,
|
|
56
|
+
registry: RepositoryRegistry,
|
|
57
|
+
): string | null {
|
|
58
|
+
if (!targetRepositories) return null;
|
|
59
|
+
const known = new Set(registry.repositories.map((repo) => repo.id));
|
|
60
|
+
const missing = targetRepositories.filter((id) => !known.has(id));
|
|
61
|
+
if (missing.length === 0) return null;
|
|
62
|
+
return `unknown targetRepositories: ${missing.join(", ")}. Declared repositories: ${Array.from(known).join(", ")}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function resolveAllowedRootsForPathScope(
|
|
66
|
+
targetRepositories: string[],
|
|
67
|
+
registry: RepositoryRegistry,
|
|
68
|
+
): string[] {
|
|
69
|
+
if (targetRepositories.length === 0) return [registry.projectRoot];
|
|
70
|
+
const roots = targetRepositories
|
|
71
|
+
.map((id) => registry.byId.get(id)?.root)
|
|
72
|
+
.filter((root): root is string => typeof root === "string");
|
|
73
|
+
return roots.length > 0 ? roots : [registry.projectRoot];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function validatePathScopeForTargetRepositories(
|
|
77
|
+
params: PlanTaskParams,
|
|
78
|
+
basePath: string,
|
|
79
|
+
registry: RepositoryRegistry,
|
|
80
|
+
targetRepositories: string[],
|
|
81
|
+
): string | null {
|
|
82
|
+
return validatePlanningPathScope(
|
|
83
|
+
basePath,
|
|
84
|
+
[
|
|
85
|
+
{ field: "files", values: params.files },
|
|
86
|
+
{ field: "inputs", values: params.inputs },
|
|
87
|
+
{ field: "expectedOutput", values: params.expectedOutput },
|
|
88
|
+
],
|
|
89
|
+
resolveAllowedRootsForPathScope(targetRepositories, registry),
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function resolveEffectiveTargetRepositories(
|
|
94
|
+
taskTargetRepositories: string[] | undefined,
|
|
95
|
+
sliceTargetRepositories: string[] | undefined,
|
|
96
|
+
defaultTargets: string[],
|
|
97
|
+
): string[] {
|
|
98
|
+
if (taskTargetRepositories) return taskTargetRepositories;
|
|
99
|
+
if (sliceTargetRepositories?.length) return sliceTargetRepositories;
|
|
100
|
+
return defaultTargets;
|
|
101
|
+
}
|
|
102
|
+
|
|
40
103
|
function validateParams(params: PlanTaskParams): PlanTaskParams {
|
|
41
104
|
if (!isNonEmptyString(params?.milestoneId)) throw new Error("milestoneId is required");
|
|
42
105
|
if (!isNonEmptyString(params?.sliceId)) throw new Error("sliceId is required");
|
|
@@ -54,9 +117,18 @@ function validateParams(params: PlanTaskParams): PlanTaskParams {
|
|
|
54
117
|
files: validateStringArray(params.files, "files"),
|
|
55
118
|
inputs: validateStringArray(params.inputs, "inputs"),
|
|
56
119
|
expectedOutput: validateStringArray(params.expectedOutput, "expectedOutput"),
|
|
120
|
+
...(params.targetRepositories !== undefined
|
|
121
|
+
? { targetRepositories: validateRepositoryTargetIds("targetRepositories", params.targetRepositories) }
|
|
122
|
+
: {}),
|
|
57
123
|
};
|
|
58
124
|
}
|
|
59
125
|
|
|
126
|
+
function resolveTaskGates(basePath: string): GateId[] {
|
|
127
|
+
const loaded = loadEffectiveGSDPreferences(basePath);
|
|
128
|
+
if (loaded?.preferences?.gate_evaluation?.task_gates === false) return [];
|
|
129
|
+
return [...getGateIdsForTurn("execute-task")];
|
|
130
|
+
}
|
|
131
|
+
|
|
60
132
|
export async function handlePlanTask(
|
|
61
133
|
rawParams: PlanTaskParams,
|
|
62
134
|
basePath: string,
|
|
@@ -75,15 +147,19 @@ export async function handlePlanTask(
|
|
|
75
147
|
return { error: `validation failed: ${pathOnlyError}` };
|
|
76
148
|
}
|
|
77
149
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
150
|
+
let taskGates: GateId[];
|
|
151
|
+
let repositoryRegistry: RepositoryRegistry;
|
|
152
|
+
try {
|
|
153
|
+
taskGates = resolveTaskGates(basePath);
|
|
154
|
+
const loaded = loadEffectiveGSDPreferences(basePath);
|
|
155
|
+
repositoryRegistry = createRepositoryRegistryFromPreferences(basePath, loaded?.preferences);
|
|
156
|
+
} catch (err) {
|
|
157
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
158
|
+
return { error: `validation failed: ${message}` };
|
|
85
159
|
}
|
|
86
160
|
|
|
161
|
+
const defaultTargets = defaultRepositoryTargets(repositoryRegistry);
|
|
162
|
+
|
|
87
163
|
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
88
164
|
// Guards must be inside the transaction so the state they check cannot
|
|
89
165
|
// change between the read and the write (#2723).
|
|
@@ -107,6 +183,44 @@ export async function handlePlanTask(
|
|
|
107
183
|
return;
|
|
108
184
|
}
|
|
109
185
|
|
|
186
|
+
let effectiveTargetRepositories = resolveEffectiveTargetRepositories(
|
|
187
|
+
params.targetRepositories,
|
|
188
|
+
parentSlice.target_repositories,
|
|
189
|
+
defaultTargets,
|
|
190
|
+
);
|
|
191
|
+
const repoValidationError = validateReferencedRepositories(effectiveTargetRepositories, repositoryRegistry);
|
|
192
|
+
if (repoValidationError) {
|
|
193
|
+
guardError = `validation failed: ${repoValidationError}`;
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
let pathScopeError = validatePathScopeForTargetRepositories(
|
|
198
|
+
params,
|
|
199
|
+
basePath,
|
|
200
|
+
repositoryRegistry,
|
|
201
|
+
effectiveTargetRepositories,
|
|
202
|
+
);
|
|
203
|
+
const storedTaskTargets = existingTask?.target_repositories?.length
|
|
204
|
+
? existingTask.target_repositories
|
|
205
|
+
: undefined;
|
|
206
|
+
// Omitted targetRepositories inherit the current slice default first.
|
|
207
|
+
// Fall back to the stored task target only when that inherited scope
|
|
208
|
+
// rejects the replan paths, preserving explicit per-task parent-root work.
|
|
209
|
+
if (pathScopeError && params.targetRepositories === undefined && storedTaskTargets) {
|
|
210
|
+
const storedRepoValidationError = validateReferencedRepositories(storedTaskTargets, repositoryRegistry);
|
|
211
|
+
const storedPathScopeError = storedRepoValidationError
|
|
212
|
+
? storedRepoValidationError
|
|
213
|
+
: validatePathScopeForTargetRepositories(params, basePath, repositoryRegistry, storedTaskTargets);
|
|
214
|
+
if (!storedPathScopeError) {
|
|
215
|
+
effectiveTargetRepositories = storedTaskTargets;
|
|
216
|
+
pathScopeError = null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (pathScopeError) {
|
|
220
|
+
guardError = `validation failed: ${pathScopeError}`;
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
110
224
|
if (!existingTask) {
|
|
111
225
|
insertTask({
|
|
112
226
|
id: params.taskId,
|
|
@@ -126,7 +240,11 @@ export async function handlePlanTask(
|
|
|
126
240
|
expectedOutput: params.expectedOutput,
|
|
127
241
|
observabilityImpact: params.observabilityImpact ?? "",
|
|
128
242
|
fullPlanMd: params.fullPlanMd,
|
|
243
|
+
targetRepositories: effectiveTargetRepositories,
|
|
129
244
|
});
|
|
245
|
+
for (const gid of taskGates) {
|
|
246
|
+
insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: params.taskId });
|
|
247
|
+
}
|
|
130
248
|
});
|
|
131
249
|
} catch (err) {
|
|
132
250
|
return { error: `db write failed: ${(err as Error).message}` };
|
|
@@ -142,17 +260,22 @@ export async function handlePlanTask(
|
|
|
142
260
|
// Flat-phase: tasks live as checkboxes in the slice plan's <tasks> block,
|
|
143
261
|
// not as standalone TID-PLAN.md files. Re-render the slice plan so the
|
|
144
262
|
// new/updated task appears in the plan file that gsd-core reads.
|
|
145
|
-
// Guard: resolveTasksDir is null in flat-phase (no tasks/ subdir exists)
|
|
146
|
-
|
|
263
|
+
// Guard: resolveTasksDir is null in flat-phase (no tasks/ subdir exists).
|
|
264
|
+
let slicePlanSynced = false;
|
|
147
265
|
try {
|
|
148
266
|
const tDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
|
|
149
|
-
if (!tDir
|
|
267
|
+
if (!tDir) {
|
|
150
268
|
await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
|
|
269
|
+
slicePlanSynced = true;
|
|
151
270
|
}
|
|
152
271
|
} catch (syncErr) {
|
|
153
272
|
logWarning("tool", `plan-task: slice-plan sync failed: ${(syncErr as Error).message}`);
|
|
154
273
|
}
|
|
155
274
|
|
|
275
|
+
if (slicePlanSynced) {
|
|
276
|
+
setSliceSketchFlag(params.milestoneId, params.sliceId, false);
|
|
277
|
+
}
|
|
278
|
+
|
|
156
279
|
invalidateStateCache();
|
|
157
280
|
clearParseCache();
|
|
158
281
|
|
|
@@ -53,11 +53,13 @@ import { loadEffectiveGSDPreferences } from "../preferences.js";
|
|
|
53
53
|
import { parseProject } from "../schemas/parsers.js";
|
|
54
54
|
import { autoSession, getAutoRuntimeSnapshot, isAutoActive } from "../auto-runtime-state.js";
|
|
55
55
|
import { renderPlanFromDb } from "../markdown-renderer.js";
|
|
56
|
+
import { readUnitHarnessAbort, type UnitHarnessAbortRecord } from "../unit-runtime.js";
|
|
56
57
|
import {
|
|
57
58
|
prepareUatRun,
|
|
58
59
|
saveUatAttemptArtifact,
|
|
59
60
|
type UatResultSaveParams,
|
|
60
61
|
} from "../uat-run.js";
|
|
62
|
+
import { appendNotification } from "../notification-store.js";
|
|
61
63
|
import { registerAutoWorker, markWorkerStopping, getAutoWorker } from "../db/auto-workers.js";
|
|
62
64
|
import {
|
|
63
65
|
claimMilestoneLease,
|
|
@@ -116,6 +118,48 @@ function blockIfWrongAutoUnit(requiredUnitType: string, operation: string): Tool
|
|
|
116
118
|
};
|
|
117
119
|
}
|
|
118
120
|
|
|
121
|
+
function blockIfHarnessAbortedUnit(operation: string, basePath: string): ToolExecutionResult | null {
|
|
122
|
+
const snapshot = getAutoRuntimeSnapshot();
|
|
123
|
+
if (!snapshot.active || !snapshot.currentUnit) return null;
|
|
124
|
+
|
|
125
|
+
const abort = readUnitHarnessAbort(
|
|
126
|
+
snapshot.basePath || basePath,
|
|
127
|
+
snapshot.currentUnit.type,
|
|
128
|
+
snapshot.currentUnit.id,
|
|
129
|
+
snapshot.currentUnit.startedAt,
|
|
130
|
+
);
|
|
131
|
+
if (!abort) return null;
|
|
132
|
+
|
|
133
|
+
return harnessAbortResult(operation, snapshot.currentUnit.type, snapshot.currentUnit.id, abort);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function harnessAbortResult(
|
|
137
|
+
operation: string,
|
|
138
|
+
unitType: string,
|
|
139
|
+
unitId: string,
|
|
140
|
+
abort: UnitHarnessAbortRecord,
|
|
141
|
+
): ToolExecutionResult {
|
|
142
|
+
const toolText = abort.toolName ? ` while calling ${abort.toolName}` : "";
|
|
143
|
+
const message =
|
|
144
|
+
`Retryable harness abort: ${unitType} ${unitId} was truncated by ${abort.kind}${toolText}. ` +
|
|
145
|
+
"This gate result was not saved; leave the gate pending so auto-mode can rerun it.";
|
|
146
|
+
return {
|
|
147
|
+
content: [{ type: "text", text: message }],
|
|
148
|
+
details: {
|
|
149
|
+
operation,
|
|
150
|
+
error: "harness_aborted_needs_retry",
|
|
151
|
+
retryable: true,
|
|
152
|
+
unitType,
|
|
153
|
+
unitId,
|
|
154
|
+
harnessAbortKind: abort.kind,
|
|
155
|
+
harnessAbortReason: abort.reason,
|
|
156
|
+
harnessAbortToolName: abort.toolName,
|
|
157
|
+
harnessAbortCount: abort.count,
|
|
158
|
+
},
|
|
159
|
+
isError: true,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
119
163
|
function milestoneLeaseConflictResult(
|
|
120
164
|
milestoneId: string,
|
|
121
165
|
byWorker: string,
|
|
@@ -1135,6 +1179,9 @@ export async function executeSaveGateResult(
|
|
|
1135
1179
|
params: SaveGateResultParams,
|
|
1136
1180
|
basePath: string = process.cwd(),
|
|
1137
1181
|
): Promise<ToolExecutionResult> {
|
|
1182
|
+
const harnessAbort = blockIfHarnessAbortedUnit("save_gate_result", basePath);
|
|
1183
|
+
if (harnessAbort) return harnessAbort;
|
|
1184
|
+
|
|
1138
1185
|
const dbAvailable = await ensureDbOpen(basePath);
|
|
1139
1186
|
if (!dbAvailable) {
|
|
1140
1187
|
return {
|
|
@@ -1206,6 +1253,9 @@ export async function executeUatResultSave(
|
|
|
1206
1253
|
const unitGuard = blockIfWrongAutoUnit("run-uat", "save_uat_result");
|
|
1207
1254
|
if (unitGuard) return unitGuard;
|
|
1208
1255
|
|
|
1256
|
+
const harnessAbort = blockIfHarnessAbortedUnit("save_uat_result", basePath);
|
|
1257
|
+
if (harnessAbort) return harnessAbort;
|
|
1258
|
+
|
|
1209
1259
|
const dbAvailable = await ensureDbOpen(basePath);
|
|
1210
1260
|
if (!dbAvailable) return errorResult("save_uat_result", "GSD database is not available.", "db_unavailable");
|
|
1211
1261
|
|
|
@@ -1268,6 +1318,14 @@ export async function executeUatResultSave(
|
|
|
1268
1318
|
evaluatedAt: run.evaluatedAt,
|
|
1269
1319
|
});
|
|
1270
1320
|
invalidateStateCache();
|
|
1321
|
+
if (run.hasHuman) {
|
|
1322
|
+
appendNotification(
|
|
1323
|
+
`UAT for ${run.params.milestoneId}/${run.params.sliceId} has NEEDS-HUMAN checks awaiting human validation`,
|
|
1324
|
+
"warning",
|
|
1325
|
+
"notify",
|
|
1326
|
+
{ kind: "uat-needs-human", scope: `${run.params.milestoneId}/${run.params.sliceId}` },
|
|
1327
|
+
);
|
|
1328
|
+
}
|
|
1271
1329
|
const savedText = `UAT result saved for ${run.params.milestoneId}/${run.params.sliceId}: ${run.params.verdict}`;
|
|
1272
1330
|
return {
|
|
1273
1331
|
content: [{
|