@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
|
@@ -15,6 +15,7 @@ import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveSliceFile, resolveTa
|
|
|
15
15
|
import { sendDesktopNotification } from "./notifications.js";
|
|
16
16
|
import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
|
|
17
17
|
import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
|
|
18
|
+
import { UNIT_REGISTRY } from "./unit-registry.js";
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* Undo the last completed unit: revert git commits,
|
|
@@ -42,16 +43,20 @@ export async function handleUndo(args: string, ctx: ExtensionCommandContext, _pi
|
|
|
42
43
|
return;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
|
-
// Extract unit type and ID from the most recent activity log filename
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
// Extract unit type and ID from the most recent activity log filename.
|
|
47
|
+
// Both the unit type and the unit ID may contain hyphens, so anchor on the
|
|
48
|
+
// known unit-type vocabulary instead of guessing the unit-ID shape: a regex
|
|
49
|
+
// tuned to milestone-shaped IDs rejects project-level units whose IDs are
|
|
50
|
+
// symbolic (e.g. discuss-project uses PROJECT, workflow-preferences uses
|
|
51
|
+
// WORKFLOW-PREFS).
|
|
52
|
+
const parsed = parseActivityLogFilename(files[0]);
|
|
53
|
+
if (!parsed) {
|
|
49
54
|
ctx.ui.notify("Nothing to undo — could not parse latest activity log.", "warning");
|
|
50
55
|
return;
|
|
51
56
|
}
|
|
52
57
|
|
|
53
|
-
const unitType =
|
|
54
|
-
const unitId =
|
|
58
|
+
const unitType = parsed.unitType;
|
|
59
|
+
const unitId = parsed.unitId.replace(/-/g, "/");
|
|
55
60
|
|
|
56
61
|
if (!force) {
|
|
57
62
|
ctx.ui.notify(
|
|
@@ -100,6 +105,11 @@ export async function handleUndo(args: string, ctx: ExtensionCommandContext, _pi
|
|
|
100
105
|
if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
|
|
101
106
|
const [mid, sid, tid] = [milestone, slice, task];
|
|
102
107
|
planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
|
|
108
|
+
if (getTask(mid, sid, tid)) {
|
|
109
|
+
updateTaskStatus(mid, sid, tid, "pending");
|
|
110
|
+
await renderPlanCheckboxes(basePath, mid, sid);
|
|
111
|
+
planUpdated = true;
|
|
112
|
+
}
|
|
103
113
|
}
|
|
104
114
|
|
|
105
115
|
// 3. Try to revert git commits from activity log
|
|
@@ -379,6 +389,37 @@ export async function handleResetSlice(
|
|
|
379
389
|
|
|
380
390
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
381
391
|
|
|
392
|
+
// Known unit types sorted longest-first so a more specific type (e.g.
|
|
393
|
+
// "execute-task-simple") matches before a prefix of it ("execute-task") when
|
|
394
|
+
// splitting "<seq>-<unitType>-<unitId>.jsonl".
|
|
395
|
+
const UNIT_TYPES_BY_LENGTH_DESC: readonly string[] = Object.keys(UNIT_REGISTRY).sort(
|
|
396
|
+
(a, b) => b.length - a.length,
|
|
397
|
+
);
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Parse an activity-log filename of the form `<seq>-<unitType>-<unitId>.jsonl`
|
|
401
|
+
* (the format written by activity-log.ts). Both the unit type and the unit ID
|
|
402
|
+
* may contain hyphens, so we anchor on the known unit-type vocabulary rather
|
|
403
|
+
* than guessing the ID shape. This keeps non-milestone IDs (e.g. PROJECT,
|
|
404
|
+
* WORKFLOW-PREFS) parseable. Returns null when the name has no sequence prefix
|
|
405
|
+
* or does not start with a recognised unit type.
|
|
406
|
+
*/
|
|
407
|
+
export function parseActivityLogFilename(
|
|
408
|
+
filename: string,
|
|
409
|
+
): { unitType: string; unitId: string } | null {
|
|
410
|
+
const seqMatch = filename.match(/^\d+-(.+)\.jsonl$/);
|
|
411
|
+
if (!seqMatch) return null;
|
|
412
|
+
const rest = seqMatch[1];
|
|
413
|
+
for (const unitType of UNIT_TYPES_BY_LENGTH_DESC) {
|
|
414
|
+
const prefix = `${unitType}-`;
|
|
415
|
+
if (rest.startsWith(prefix)) {
|
|
416
|
+
const unitId = rest.slice(prefix.length);
|
|
417
|
+
if (unitId.length > 0) return { unitType, unitId };
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
|
|
382
423
|
export function uncheckTaskInPlan(basePath: string, mid: string, sid: string, tid: string): boolean {
|
|
383
424
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
384
425
|
if (!slicePath) return false;
|
|
@@ -140,6 +140,10 @@ export type ContextModePolicy =
|
|
|
140
140
|
* restricted to .gsd/**. Subagent dispatch is denied unless
|
|
141
141
|
* `allowedSubagents` opts a unit into controlled read-only
|
|
142
142
|
* specialist delegation.
|
|
143
|
+
* - "workflow-only"
|
|
144
|
+
* — Read tools + GSD workflow tools only. No generic writes
|
|
145
|
+
* and no generic shell; used by lanes whose durable output
|
|
146
|
+
* must be produced by a dedicated DB-backed workflow tool.
|
|
143
147
|
*
|
|
144
148
|
* The allowlist for "docs" is declared per-manifest rather than hardcoded so
|
|
145
149
|
* projects with non-standard doc layouts can extend it without forking the
|
|
@@ -152,7 +156,8 @@ export type ToolsPolicy =
|
|
|
152
156
|
| { readonly mode: "planning" }
|
|
153
157
|
| { readonly mode: "planning-dispatch"; readonly allowedSubagents: readonly string[] }
|
|
154
158
|
| { readonly mode: "docs"; readonly allowedPathGlobs: readonly string[] }
|
|
155
|
-
| { readonly mode: "verification"; readonly allowedSubagents?: readonly string[] }
|
|
159
|
+
| { readonly mode: "verification"; readonly allowedSubagents?: readonly string[] }
|
|
160
|
+
| { readonly mode: "workflow-only"; readonly allowedSubagents?: readonly string[] };
|
|
156
161
|
|
|
157
162
|
// ─── Computed-artifact registry (#4924 v2 contract) ───────────────────────
|
|
158
163
|
|
|
@@ -405,9 +410,10 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
405
410
|
codebaseMap: false,
|
|
406
411
|
preferences: "active-only",
|
|
407
412
|
contextMode: "verification",
|
|
408
|
-
// Validation
|
|
409
|
-
//
|
|
410
|
-
|
|
413
|
+
// Validation must persist its durable output through gsd_validate_milestone;
|
|
414
|
+
// generic write/bash tools can create filesystem artifacts that bypass DB
|
|
415
|
+
// state and trigger destructive recovery loops.
|
|
416
|
+
tools: { mode: "workflow-only", allowedSubagents: ["reviewer", "security", "tester"] },
|
|
411
417
|
artifacts: {
|
|
412
418
|
inline: ["roadmap", "requirements", "templates"],
|
|
413
419
|
excerpt: ["slice-summary", "slice-assessment"],
|
|
@@ -774,7 +780,7 @@ export function compileSubagentPermissionContract(
|
|
|
774
780
|
return { allowed: true, allowedSubagents: ["*"], toolsMode: policy.mode };
|
|
775
781
|
}
|
|
776
782
|
if (
|
|
777
|
-
(policy.mode === "planning-dispatch" || policy.mode === "verification") &&
|
|
783
|
+
(policy.mode === "planning-dispatch" || policy.mode === "verification" || policy.mode === "workflow-only") &&
|
|
778
784
|
Array.isArray(policy.allowedSubagents)
|
|
779
785
|
) {
|
|
780
786
|
return {
|
|
@@ -117,10 +117,11 @@ export const UNIT_REGISTRY = {
|
|
|
117
117
|
"gsd_milestone_status",
|
|
118
118
|
"gsd_plan_milestone",
|
|
119
119
|
"gsd_plan_slice",
|
|
120
|
+
"gsd_plan_task",
|
|
120
121
|
"gsd_decision_save",
|
|
121
122
|
"gsd_requirement_update",
|
|
122
123
|
],
|
|
123
|
-
requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice"],
|
|
124
|
+
requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice", "gsd_plan_task"],
|
|
124
125
|
},
|
|
125
126
|
},
|
|
126
127
|
"discuss-milestone": {
|
|
@@ -219,13 +220,14 @@ export const UNIT_REGISTRY = {
|
|
|
219
220
|
allowedGsdTools: [
|
|
220
221
|
"gsd_milestone_status",
|
|
221
222
|
"gsd_plan_slice",
|
|
223
|
+
"gsd_plan_task",
|
|
222
224
|
"gsd_reassess_roadmap",
|
|
223
225
|
"gsd_decision_save",
|
|
224
226
|
"gsd_exec",
|
|
225
227
|
"gsd_exec_search",
|
|
226
228
|
"gsd_resume",
|
|
227
229
|
],
|
|
228
|
-
requiredWorkflowTools: ["gsd_plan_slice", "gsd_reassess_roadmap"],
|
|
230
|
+
requiredWorkflowTools: ["gsd_plan_slice", "gsd_plan_task", "gsd_reassess_roadmap"],
|
|
229
231
|
},
|
|
230
232
|
},
|
|
231
233
|
"refine-slice": {
|
|
@@ -345,7 +347,13 @@ export const UNIT_REGISTRY = {
|
|
|
345
347
|
scopeClass: "execute-task",
|
|
346
348
|
phaseChain: ["execution"],
|
|
347
349
|
toolContract: {
|
|
348
|
-
allowedGsdTools: [
|
|
350
|
+
allowedGsdTools: [
|
|
351
|
+
"gsd_milestone_status",
|
|
352
|
+
"gsd_task_complete",
|
|
353
|
+
"gsd_exec",
|
|
354
|
+
"gsd_summary_save",
|
|
355
|
+
"gsd_decision_save",
|
|
356
|
+
],
|
|
349
357
|
requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
|
|
350
358
|
},
|
|
351
359
|
},
|
|
@@ -100,6 +100,14 @@ export interface ExecuteTaskRecoveryStatus {
|
|
|
100
100
|
mustHavesMentionedInSummary: number;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
+
export interface UnitHarnessAbortRecord {
|
|
104
|
+
kind: "tool-loop-guard" | "tool-error" | "turn-abort";
|
|
105
|
+
reason: string;
|
|
106
|
+
toolName?: string;
|
|
107
|
+
count?: number;
|
|
108
|
+
recordedAt: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
103
111
|
export interface AutoUnitRuntimeRecord {
|
|
104
112
|
version: 1;
|
|
105
113
|
unitType: string;
|
|
@@ -116,6 +124,7 @@ export interface AutoUnitRuntimeRecord {
|
|
|
116
124
|
recovery?: ExecuteTaskRecoveryStatus;
|
|
117
125
|
recoveryAttempts?: number;
|
|
118
126
|
lastRecoveryReason?: "idle" | "hard";
|
|
127
|
+
harnessAbort?: UnitHarnessAbortRecord;
|
|
119
128
|
}
|
|
120
129
|
|
|
121
130
|
function runtimeDir(basePath: string): string {
|
|
@@ -138,6 +147,8 @@ export function writeUnitRuntimeRecord(
|
|
|
138
147
|
const path = runtimePath(basePath, unitType, unitId);
|
|
139
148
|
return withRecordLock(path, () => {
|
|
140
149
|
const prev = readUnitRuntimeRecord(basePath, unitType, unitId);
|
|
150
|
+
const sameRun = prev?.startedAt === startedAt;
|
|
151
|
+
const updatesHarnessAbort = Object.prototype.hasOwnProperty.call(updates, "harnessAbort");
|
|
141
152
|
const next: AutoUnitRuntimeRecord = {
|
|
142
153
|
version: 1,
|
|
143
154
|
unitType,
|
|
@@ -154,12 +165,32 @@ export function writeUnitRuntimeRecord(
|
|
|
154
165
|
recovery: updates.recovery ?? prev?.recovery,
|
|
155
166
|
recoveryAttempts: updates.recoveryAttempts ?? prev?.recoveryAttempts ?? 0,
|
|
156
167
|
lastRecoveryReason: updates.lastRecoveryReason ?? prev?.lastRecoveryReason,
|
|
168
|
+
harnessAbort: updatesHarnessAbort
|
|
169
|
+
? updates.harnessAbort
|
|
170
|
+
: (sameRun ? prev?.harnessAbort : undefined),
|
|
157
171
|
};
|
|
158
172
|
atomicWriteSync(path, JSON.stringify(next, null, 2) + "\n", "utf-8");
|
|
159
173
|
return next;
|
|
160
174
|
});
|
|
161
175
|
}
|
|
162
176
|
|
|
177
|
+
export function recordUnitHarnessAbort(
|
|
178
|
+
basePath: string,
|
|
179
|
+
unitType: string,
|
|
180
|
+
unitId: string,
|
|
181
|
+
startedAt: number,
|
|
182
|
+
abort: Omit<UnitHarnessAbortRecord, "recordedAt"> & { recordedAt?: number },
|
|
183
|
+
): AutoUnitRuntimeRecord {
|
|
184
|
+
return writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, {
|
|
185
|
+
harnessAbort: {
|
|
186
|
+
...abort,
|
|
187
|
+
recordedAt: abort.recordedAt ?? Date.now(),
|
|
188
|
+
},
|
|
189
|
+
lastProgressAt: Date.now(),
|
|
190
|
+
lastProgressKind: `harness-abort:${abort.kind}`,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
163
194
|
export function readUnitRuntimeRecord(basePath: string, unitType: string, unitId: string): AutoUnitRuntimeRecord | null {
|
|
164
195
|
const path = runtimePath(basePath, unitType, unitId);
|
|
165
196
|
if (!existsSync(path)) return null;
|
|
@@ -170,6 +201,17 @@ export function readUnitRuntimeRecord(basePath: string, unitType: string, unitId
|
|
|
170
201
|
}
|
|
171
202
|
}
|
|
172
203
|
|
|
204
|
+
export function readUnitHarnessAbort(
|
|
205
|
+
basePath: string,
|
|
206
|
+
unitType: string,
|
|
207
|
+
unitId: string,
|
|
208
|
+
startedAt: number,
|
|
209
|
+
): UnitHarnessAbortRecord | null {
|
|
210
|
+
const record = readUnitRuntimeRecord(basePath, unitType, unitId);
|
|
211
|
+
if (!record || record.startedAt !== startedAt) return null;
|
|
212
|
+
return record.harnessAbort ?? null;
|
|
213
|
+
}
|
|
214
|
+
|
|
173
215
|
export function clearUnitRuntimeRecord(basePath: string, unitType: string, unitId: string): void {
|
|
174
216
|
const path = runtimePath(basePath, unitType, unitId);
|
|
175
217
|
if (existsSync(path)) unlinkSync(path);
|
|
@@ -244,6 +244,14 @@ export function formatFailureContext(result: VerificationResult): string {
|
|
|
244
244
|
return header + body;
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
+
export function formatFailureSignature(result: VerificationResult): string {
|
|
248
|
+
return result.checks
|
|
249
|
+
.filter((check) => check.exitCode !== 0)
|
|
250
|
+
.map((check) => `${check.command.trim()}#${check.exitCode}`)
|
|
251
|
+
.sort()
|
|
252
|
+
.join("\n");
|
|
253
|
+
}
|
|
254
|
+
|
|
247
255
|
// ─── Gate Execution ─────────────────────────────────────────────────────────
|
|
248
256
|
|
|
249
257
|
/** Characters that indicate shell control syntax when unquoted in a command string. */
|
|
@@ -10,11 +10,12 @@ import type { ArtifactRow, MilestoneRow } from "./db-milestone-artifact-rows.js"
|
|
|
10
10
|
import type { SliceRow, TaskRow } from "./db-task-slice-rows.js";
|
|
11
11
|
import type { VerificationEvidenceRow } from "./db-verification-evidence-rows.js";
|
|
12
12
|
import type { Decision, GateRow, Requirement } from "./types.js";
|
|
13
|
-
import { atomicWriteSync } from "./atomic-write.js";
|
|
13
|
+
import { atomicWriteAsync, atomicWriteSync } from "./atomic-write.js";
|
|
14
14
|
import { getAllDecisionsFromMemories } from "./context-store.js";
|
|
15
15
|
import { backfillDecisionsToMemories } from "./memory-backfill.js";
|
|
16
16
|
import { invalidateAllCaches } from "./cache.js";
|
|
17
|
-
import {
|
|
17
|
+
import { logWarning } from "./workflow-logger.js";
|
|
18
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
18
19
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
19
20
|
|
|
20
21
|
// ─── Manifest Types ──────────────────────────────────────────────────────
|
|
@@ -349,16 +350,146 @@ export function snapshotState(): StateManifest {
|
|
|
349
350
|
|
|
350
351
|
// ─── writeManifest ───────────────────────────────────────────────────────
|
|
351
352
|
|
|
353
|
+
interface ManifestWriteState {
|
|
354
|
+
filePath: string;
|
|
355
|
+
latestJson: string | null;
|
|
356
|
+
inFlightJson: string | null;
|
|
357
|
+
/** Set by sync exit flush so an in-flight async write cannot leave stale data on disk. */
|
|
358
|
+
syncFlushJson: string | null;
|
|
359
|
+
active: Promise<void> | null;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const manifestWrites = new Map<string, ManifestWriteState>();
|
|
363
|
+
let processTeardownFlushInstalled = false;
|
|
364
|
+
let beforeExitFlushStarted = false;
|
|
365
|
+
|
|
366
|
+
function manifestWriteKey(basePath: string): string {
|
|
367
|
+
return resolve(basePath);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
function manifestFilePath(basePath: string): string {
|
|
371
|
+
return join(resolve(basePath), ".gsd", "state-manifest.json");
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function describeError(err: unknown): string {
|
|
375
|
+
return err instanceof Error ? err.message : String(err);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function logManifestWriteFailure(filePath: string, err: unknown): void {
|
|
379
|
+
logWarning("manifest", `state manifest write failed: ${describeError(err)}`, { file: filePath });
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
async function drainManifestWrites(key: string, state: ManifestWriteState): Promise<void> {
|
|
383
|
+
let lastWriteError: unknown = null;
|
|
384
|
+
try {
|
|
385
|
+
while (state.latestJson !== null && state.syncFlushJson === null) {
|
|
386
|
+
const json = state.latestJson;
|
|
387
|
+
state.latestJson = null;
|
|
388
|
+
state.inFlightJson = json;
|
|
389
|
+
try {
|
|
390
|
+
await atomicWriteAsync(state.filePath, json);
|
|
391
|
+
if (state.syncFlushJson !== null) {
|
|
392
|
+
atomicWriteSync(state.filePath, state.syncFlushJson);
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
lastWriteError = null;
|
|
396
|
+
} catch (err) {
|
|
397
|
+
lastWriteError = err;
|
|
398
|
+
logManifestWriteFailure(state.filePath, err);
|
|
399
|
+
} finally {
|
|
400
|
+
state.inFlightJson = null;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
} finally {
|
|
404
|
+
state.active = null;
|
|
405
|
+
if (state.latestJson === null && state.inFlightJson === null) {
|
|
406
|
+
manifestWrites.delete(key);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (lastWriteError !== null && state.syncFlushJson === null) {
|
|
410
|
+
throw lastWriteError;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function enqueueManifestWrite(basePath: string, json: string): void {
|
|
415
|
+
const key = manifestWriteKey(basePath);
|
|
416
|
+
let state = manifestWrites.get(key);
|
|
417
|
+
if (!state) {
|
|
418
|
+
state = {
|
|
419
|
+
filePath: manifestFilePath(basePath),
|
|
420
|
+
latestJson: null,
|
|
421
|
+
inFlightJson: null,
|
|
422
|
+
syncFlushJson: null,
|
|
423
|
+
active: null,
|
|
424
|
+
};
|
|
425
|
+
manifestWrites.set(key, state);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
state.latestJson = json;
|
|
429
|
+
if (!state.active) {
|
|
430
|
+
const active = drainManifestWrites(key, state);
|
|
431
|
+
void active.catch(() => {});
|
|
432
|
+
state.active = active;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
352
436
|
/**
|
|
353
|
-
*
|
|
437
|
+
* Queue current DB state for an async atomic write to .gsd/state-manifest.json.
|
|
354
438
|
* Uses JSON.stringify with 2-space indent for git three-way merge friendliness.
|
|
355
439
|
*/
|
|
356
440
|
export function writeManifest(basePath: string): void {
|
|
357
441
|
const manifest = snapshotState();
|
|
358
442
|
const json = JSON.stringify(manifest, null, 2);
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
443
|
+
enqueueManifestWrite(basePath, json);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
async function flushManifestByKey(key: string): Promise<void> {
|
|
447
|
+
for (;;) {
|
|
448
|
+
const active = manifestWrites.get(key)?.active;
|
|
449
|
+
if (!active) return;
|
|
450
|
+
await active;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Wait for any queued manifest write for this base path to become durable.
|
|
456
|
+
*/
|
|
457
|
+
export async function flushManifest(basePath: string): Promise<void> {
|
|
458
|
+
await flushManifestByKey(manifestWriteKey(basePath));
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
export async function flushAllManifests(): Promise<void> {
|
|
462
|
+
await Promise.all(Array.from(manifestWrites.keys(), key => flushManifestByKey(key)));
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
function flushAllManifestsSync(): void {
|
|
466
|
+
for (const [key, state] of manifestWrites) {
|
|
467
|
+
const json = state.latestJson ?? state.inFlightJson;
|
|
468
|
+
if (json === null) continue;
|
|
469
|
+
try {
|
|
470
|
+
atomicWriteSync(state.filePath, json);
|
|
471
|
+
state.latestJson = null;
|
|
472
|
+
state.inFlightJson = null;
|
|
473
|
+
state.syncFlushJson = json;
|
|
474
|
+
manifestWrites.delete(key);
|
|
475
|
+
} catch (err) {
|
|
476
|
+
logManifestWriteFailure(state.filePath, err);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
export function installManifestFlushOnProcessTeardown(): void {
|
|
482
|
+
if (processTeardownFlushInstalled) return;
|
|
483
|
+
processTeardownFlushInstalled = true;
|
|
484
|
+
|
|
485
|
+
process.once("beforeExit", () => {
|
|
486
|
+
if (beforeExitFlushStarted) return;
|
|
487
|
+
beforeExitFlushStarted = true;
|
|
488
|
+
void flushAllManifests();
|
|
489
|
+
});
|
|
490
|
+
process.once("exit", () => {
|
|
491
|
+
flushAllManifestsSync();
|
|
492
|
+
});
|
|
362
493
|
}
|
|
363
494
|
|
|
364
495
|
// ─── readManifest ────────────────────────────────────────────────────────
|
|
@@ -414,9 +545,12 @@ function restoreArtifactProjections(basePath: string, manifest: StateManifest):
|
|
|
414
545
|
if (manifest.artifacts === undefined) return;
|
|
415
546
|
|
|
416
547
|
for (const artifact of manifest.artifacts) {
|
|
548
|
+
const content = artifact.full_content ?? "";
|
|
549
|
+
if (content === "") continue;
|
|
550
|
+
|
|
417
551
|
atomicWriteSync(
|
|
418
552
|
artifactProjectionPath(basePath, artifact.path),
|
|
419
|
-
|
|
553
|
+
content,
|
|
420
554
|
);
|
|
421
555
|
}
|
|
422
556
|
}
|
|
@@ -451,16 +451,14 @@ export async function renderStateProjection(basePath: string): Promise<void> {
|
|
|
451
451
|
}
|
|
452
452
|
}
|
|
453
453
|
|
|
454
|
-
// ───
|
|
454
|
+
// ─── renderMilestoneShellProjections ─────────────────────────────────────
|
|
455
455
|
|
|
456
456
|
/**
|
|
457
|
-
* Regenerate
|
|
458
|
-
*
|
|
457
|
+
* Regenerate milestone-level projections (roadmap, top-level views, STATE.md).
|
|
458
|
+
* Does not touch slice PLAN.md or task SUMMARY.md — those have authoritative
|
|
459
|
+
* renderers in plan-slice / complete-task.
|
|
459
460
|
*/
|
|
460
|
-
export async function
|
|
461
|
-
// Delegate to the authoritative roadmap renderer — the reduced
|
|
462
|
-
// renderRoadmapProjection omits sections like ## Boundary Map and would
|
|
463
|
-
// clobber the output written by plan-milestone / reassess-roadmap.
|
|
461
|
+
export async function renderMilestoneShellProjections(basePath: string, milestoneId: string): Promise<void> {
|
|
464
462
|
try {
|
|
465
463
|
await renderRoadmapFromDb(basePath, milestoneId);
|
|
466
464
|
} catch (err) {
|
|
@@ -476,6 +474,21 @@ export async function renderAllProjections(basePath: string, milestoneId: string
|
|
|
476
474
|
} catch (err) {
|
|
477
475
|
logWarning("projection", `renderTopLevelQueueFromDb failed: ${(err as Error).message}`);
|
|
478
476
|
}
|
|
477
|
+
try {
|
|
478
|
+
await renderStateProjection(basePath);
|
|
479
|
+
} catch (err) {
|
|
480
|
+
logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// ─── renderAllProjections ───────────────────────────────────────────────
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Regenerate all projection files for a milestone from DB state.
|
|
488
|
+
* All calls are wrapped in try/catch — projection failure is non-fatal per D-02.
|
|
489
|
+
*/
|
|
490
|
+
export async function renderAllProjections(basePath: string, milestoneId: string): Promise<void> {
|
|
491
|
+
await renderMilestoneShellProjections(basePath, milestoneId);
|
|
479
492
|
|
|
480
493
|
// Query all slices for this milestone
|
|
481
494
|
const sliceRows = getMilestoneSlices(milestoneId);
|
|
@@ -498,13 +511,6 @@ export async function renderAllProjections(basePath: string, milestoneId: string
|
|
|
498
511
|
}
|
|
499
512
|
}
|
|
500
513
|
}
|
|
501
|
-
|
|
502
|
-
// Render STATE.md
|
|
503
|
-
try {
|
|
504
|
-
await renderStateProjection(basePath);
|
|
505
|
-
} catch (err) {
|
|
506
|
-
logWarning("projection", `renderStateProjection failed: ${(err as Error).message}`);
|
|
507
|
-
}
|
|
508
514
|
}
|
|
509
515
|
|
|
510
516
|
// ─── regenerateIfMissing ────────────────────────────────────────────────
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
// gsd-pi + Workspace handle: single source of truth for path resolution per milestone
|
|
2
2
|
|
|
3
|
-
import { join, resolve } from "node:path";
|
|
4
|
-
import {
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import {
|
|
5
|
+
buildMilestoneFileName,
|
|
6
|
+
canonicalPhaseDirName,
|
|
7
|
+
isLegacyMilestonesLayout,
|
|
8
|
+
milestonesDir,
|
|
9
|
+
type GsdPathContract,
|
|
10
|
+
resolveGsdPathContract,
|
|
11
|
+
resolveMilestoneFile,
|
|
12
|
+
resolveMilestonePath,
|
|
13
|
+
normalizeRealPath,
|
|
14
|
+
} from "./paths.js";
|
|
5
15
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
6
16
|
|
|
7
17
|
export type GsdWorkspaceMode = "project" | "worktree";
|
|
@@ -31,6 +41,29 @@ function tryRealpath(p: string): string {
|
|
|
31
41
|
return normalizeRealPath(p);
|
|
32
42
|
}
|
|
33
43
|
|
|
44
|
+
function isLegacyMilestoneDirectory(dir: string): boolean {
|
|
45
|
+
const parent = dirname(dir);
|
|
46
|
+
return parent.endsWith("/milestones") || parent.endsWith("\\milestones");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function scopeMilestoneDir(basePath: string, milestoneId: string): string {
|
|
50
|
+
return resolveMilestonePath(basePath, milestoneId) ?? join(
|
|
51
|
+
milestonesDir(basePath),
|
|
52
|
+
isLegacyMilestonesLayout(basePath) ? milestoneId : canonicalPhaseDirName(milestoneId),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function scopeMilestoneFile(basePath: string, milestoneId: string, suffix: string): string {
|
|
57
|
+
const existing = resolveMilestoneFile(basePath, milestoneId, suffix);
|
|
58
|
+
if (existing) return existing;
|
|
59
|
+
|
|
60
|
+
const dir = scopeMilestoneDir(basePath, milestoneId);
|
|
61
|
+
const filename = isLegacyMilestoneDirectory(dir)
|
|
62
|
+
? `${milestoneId}-${suffix}.md`
|
|
63
|
+
: buildMilestoneFileName(milestoneId, suffix);
|
|
64
|
+
return join(dir, filename);
|
|
65
|
+
}
|
|
66
|
+
|
|
34
67
|
/**
|
|
35
68
|
* Create an immutable GsdWorkspace handle from a raw base path.
|
|
36
69
|
* Resolves both the project root and (when applicable) the worktree root,
|
|
@@ -73,22 +106,23 @@ export function createWorkspace(rawBasePath: string): GsdWorkspace {
|
|
|
73
106
|
* Bind a milestoneId to a workspace, producing an immutable MilestoneScope
|
|
74
107
|
* with path-returning closures for DB-authoritative project state.
|
|
75
108
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
109
|
+
* DB paths route to contract.projectGsd. Milestone artifact paths resolve from
|
|
110
|
+
* the pinned project root with the layout-aware resolvers, so flat-phase and
|
|
111
|
+
* legacy projects use the same scope surface.
|
|
79
112
|
*/
|
|
80
113
|
export function scopeMilestone(workspace: GsdWorkspace, milestoneId: string): MilestoneScope {
|
|
81
114
|
const { contract } = workspace;
|
|
82
115
|
const gsd = contract.projectGsd;
|
|
116
|
+
const basePath = workspace.projectRoot;
|
|
83
117
|
|
|
84
118
|
const scope: MilestoneScope = Object.freeze({
|
|
85
119
|
workspace,
|
|
86
120
|
milestoneId,
|
|
87
|
-
contextFile: () =>
|
|
88
|
-
roadmapFile: () =>
|
|
121
|
+
contextFile: () => scopeMilestoneFile(basePath, milestoneId, "CONTEXT"),
|
|
122
|
+
roadmapFile: () => scopeMilestoneFile(basePath, milestoneId, "ROADMAP"),
|
|
89
123
|
stateFile: () => join(gsd, "STATE.md"),
|
|
90
124
|
dbPath: () => contract.projectDb,
|
|
91
|
-
milestoneDir: () =>
|
|
125
|
+
milestoneDir: () => scopeMilestoneDir(basePath, milestoneId),
|
|
92
126
|
metaJson: () => join(gsd, `${milestoneId}-META.json`),
|
|
93
127
|
});
|
|
94
128
|
|