@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
|
@@ -13,6 +13,7 @@ import { gsdRoot, resolveTasksDir, resolveSlicePath, resolveSliceFile, resolveTa
|
|
|
13
13
|
import { sendDesktopNotification } from "./notifications.js";
|
|
14
14
|
import { getTask, getSlice, getSliceTasks, updateTaskStatus, resetSliceCascade } from "./gsd-db.js";
|
|
15
15
|
import { renderPlanCheckboxes, renderRoadmapCheckboxes } from "./markdown-renderer.js";
|
|
16
|
+
import { UNIT_REGISTRY } from "./unit-registry.js";
|
|
16
17
|
/**
|
|
17
18
|
* Undo the last completed unit: revert git commits,
|
|
18
19
|
* delete summary artifacts, and uncheck the task in PLAN.
|
|
@@ -35,15 +36,19 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
35
36
|
ctx.ui.notify("Nothing to undo — no activity logs found.", "info");
|
|
36
37
|
return;
|
|
37
38
|
}
|
|
38
|
-
// Extract unit type and ID from the most recent activity log filename
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
// Extract unit type and ID from the most recent activity log filename.
|
|
40
|
+
// Both the unit type and the unit ID may contain hyphens, so anchor on the
|
|
41
|
+
// known unit-type vocabulary instead of guessing the unit-ID shape: a regex
|
|
42
|
+
// tuned to milestone-shaped IDs rejects project-level units whose IDs are
|
|
43
|
+
// symbolic (e.g. discuss-project uses PROJECT, workflow-preferences uses
|
|
44
|
+
// WORKFLOW-PREFS).
|
|
45
|
+
const parsed = parseActivityLogFilename(files[0]);
|
|
46
|
+
if (!parsed) {
|
|
42
47
|
ctx.ui.notify("Nothing to undo — could not parse latest activity log.", "warning");
|
|
43
48
|
return;
|
|
44
49
|
}
|
|
45
|
-
const unitType =
|
|
46
|
-
const unitId =
|
|
50
|
+
const unitType = parsed.unitType;
|
|
51
|
+
const unitId = parsed.unitId.replace(/-/g, "/");
|
|
47
52
|
if (!force) {
|
|
48
53
|
ctx.ui.notify(`Will undo: ${unitType} (${unitId})\n` +
|
|
49
54
|
`This will:\n` +
|
|
@@ -87,6 +92,11 @@ export async function handleUndo(args, ctx, _pi, basePath) {
|
|
|
87
92
|
if (unitType === "execute-task" && task !== undefined && slice !== undefined) {
|
|
88
93
|
const [mid, sid, tid] = [milestone, slice, task];
|
|
89
94
|
planUpdated = uncheckTaskInPlan(basePath, mid, sid, tid);
|
|
95
|
+
if (getTask(mid, sid, tid)) {
|
|
96
|
+
updateTaskStatus(mid, sid, tid, "pending");
|
|
97
|
+
await renderPlanCheckboxes(basePath, mid, sid);
|
|
98
|
+
planUpdated = true;
|
|
99
|
+
}
|
|
90
100
|
}
|
|
91
101
|
// 3. Try to revert git commits from activity log
|
|
92
102
|
let commitsReverted = 0;
|
|
@@ -318,6 +328,33 @@ export async function handleResetSlice(args, ctx, _pi, basePath) {
|
|
|
318
328
|
ctx.ui.notify(results.join("\n"), "success");
|
|
319
329
|
}
|
|
320
330
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
331
|
+
// Known unit types sorted longest-first so a more specific type (e.g.
|
|
332
|
+
// "execute-task-simple") matches before a prefix of it ("execute-task") when
|
|
333
|
+
// splitting "<seq>-<unitType>-<unitId>.jsonl".
|
|
334
|
+
const UNIT_TYPES_BY_LENGTH_DESC = Object.keys(UNIT_REGISTRY).sort((a, b) => b.length - a.length);
|
|
335
|
+
/**
|
|
336
|
+
* Parse an activity-log filename of the form `<seq>-<unitType>-<unitId>.jsonl`
|
|
337
|
+
* (the format written by activity-log.ts). Both the unit type and the unit ID
|
|
338
|
+
* may contain hyphens, so we anchor on the known unit-type vocabulary rather
|
|
339
|
+
* than guessing the ID shape. This keeps non-milestone IDs (e.g. PROJECT,
|
|
340
|
+
* WORKFLOW-PREFS) parseable. Returns null when the name has no sequence prefix
|
|
341
|
+
* or does not start with a recognised unit type.
|
|
342
|
+
*/
|
|
343
|
+
export function parseActivityLogFilename(filename) {
|
|
344
|
+
const seqMatch = filename.match(/^\d+-(.+)\.jsonl$/);
|
|
345
|
+
if (!seqMatch)
|
|
346
|
+
return null;
|
|
347
|
+
const rest = seqMatch[1];
|
|
348
|
+
for (const unitType of UNIT_TYPES_BY_LENGTH_DESC) {
|
|
349
|
+
const prefix = `${unitType}-`;
|
|
350
|
+
if (rest.startsWith(prefix)) {
|
|
351
|
+
const unitId = rest.slice(prefix.length);
|
|
352
|
+
if (unitId.length > 0)
|
|
353
|
+
return { unitType, unitId };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
321
358
|
export function uncheckTaskInPlan(basePath, mid, sid, tid) {
|
|
322
359
|
const slicePath = resolveSlicePath(basePath, mid, sid);
|
|
323
360
|
if (!slicePath)
|
|
@@ -178,9 +178,10 @@ export const UNIT_MANIFESTS = {
|
|
|
178
178
|
codebaseMap: false,
|
|
179
179
|
preferences: "active-only",
|
|
180
180
|
contextMode: "verification",
|
|
181
|
-
// Validation
|
|
182
|
-
//
|
|
183
|
-
|
|
181
|
+
// Validation must persist its durable output through gsd_validate_milestone;
|
|
182
|
+
// generic write/bash tools can create filesystem artifacts that bypass DB
|
|
183
|
+
// state and trigger destructive recovery loops.
|
|
184
|
+
tools: { mode: "workflow-only", allowedSubagents: ["reviewer", "security", "tester"] },
|
|
184
185
|
artifacts: {
|
|
185
186
|
inline: ["roadmap", "requirements", "templates"],
|
|
186
187
|
excerpt: ["slice-summary", "slice-assessment"],
|
|
@@ -531,7 +532,7 @@ export function compileSubagentPermissionContract(policy) {
|
|
|
531
532
|
if (policy.mode === "all") {
|
|
532
533
|
return { allowed: true, allowedSubagents: ["*"], toolsMode: policy.mode };
|
|
533
534
|
}
|
|
534
|
-
if ((policy.mode === "planning-dispatch" || policy.mode === "verification") &&
|
|
535
|
+
if ((policy.mode === "planning-dispatch" || policy.mode === "verification" || policy.mode === "workflow-only") &&
|
|
535
536
|
Array.isArray(policy.allowedSubagents)) {
|
|
536
537
|
return {
|
|
537
538
|
allowed: policy.allowedSubagents.length > 0,
|
|
@@ -70,10 +70,11 @@ export const UNIT_REGISTRY = {
|
|
|
70
70
|
"gsd_milestone_status",
|
|
71
71
|
"gsd_plan_milestone",
|
|
72
72
|
"gsd_plan_slice",
|
|
73
|
+
"gsd_plan_task",
|
|
73
74
|
"gsd_decision_save",
|
|
74
75
|
"gsd_requirement_update",
|
|
75
76
|
],
|
|
76
|
-
requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice"],
|
|
77
|
+
requiredWorkflowTools: ["gsd_milestone_status", "gsd_plan_milestone", "gsd_plan_slice", "gsd_plan_task"],
|
|
77
78
|
},
|
|
78
79
|
},
|
|
79
80
|
"discuss-milestone": {
|
|
@@ -172,13 +173,14 @@ export const UNIT_REGISTRY = {
|
|
|
172
173
|
allowedGsdTools: [
|
|
173
174
|
"gsd_milestone_status",
|
|
174
175
|
"gsd_plan_slice",
|
|
176
|
+
"gsd_plan_task",
|
|
175
177
|
"gsd_reassess_roadmap",
|
|
176
178
|
"gsd_decision_save",
|
|
177
179
|
"gsd_exec",
|
|
178
180
|
"gsd_exec_search",
|
|
179
181
|
"gsd_resume",
|
|
180
182
|
],
|
|
181
|
-
requiredWorkflowTools: ["gsd_plan_slice", "gsd_reassess_roadmap"],
|
|
183
|
+
requiredWorkflowTools: ["gsd_plan_slice", "gsd_plan_task", "gsd_reassess_roadmap"],
|
|
182
184
|
},
|
|
183
185
|
},
|
|
184
186
|
"refine-slice": {
|
|
@@ -298,7 +300,13 @@ export const UNIT_REGISTRY = {
|
|
|
298
300
|
scopeClass: "execute-task",
|
|
299
301
|
phaseChain: ["execution"],
|
|
300
302
|
toolContract: {
|
|
301
|
-
allowedGsdTools: [
|
|
303
|
+
allowedGsdTools: [
|
|
304
|
+
"gsd_milestone_status",
|
|
305
|
+
"gsd_task_complete",
|
|
306
|
+
"gsd_exec",
|
|
307
|
+
"gsd_summary_save",
|
|
308
|
+
"gsd_decision_save",
|
|
309
|
+
],
|
|
302
310
|
requiredWorkflowTools: ["gsd_task_complete", "gsd_summary_save"],
|
|
303
311
|
},
|
|
304
312
|
},
|
|
@@ -93,6 +93,8 @@ export function writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, up
|
|
|
93
93
|
const path = runtimePath(basePath, unitType, unitId);
|
|
94
94
|
return withRecordLock(path, () => {
|
|
95
95
|
const prev = readUnitRuntimeRecord(basePath, unitType, unitId);
|
|
96
|
+
const sameRun = prev?.startedAt === startedAt;
|
|
97
|
+
const updatesHarnessAbort = Object.prototype.hasOwnProperty.call(updates, "harnessAbort");
|
|
96
98
|
const next = {
|
|
97
99
|
version: 1,
|
|
98
100
|
unitType,
|
|
@@ -109,11 +111,24 @@ export function writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, up
|
|
|
109
111
|
recovery: updates.recovery ?? prev?.recovery,
|
|
110
112
|
recoveryAttempts: updates.recoveryAttempts ?? prev?.recoveryAttempts ?? 0,
|
|
111
113
|
lastRecoveryReason: updates.lastRecoveryReason ?? prev?.lastRecoveryReason,
|
|
114
|
+
harnessAbort: updatesHarnessAbort
|
|
115
|
+
? updates.harnessAbort
|
|
116
|
+
: (sameRun ? prev?.harnessAbort : undefined),
|
|
112
117
|
};
|
|
113
118
|
atomicWriteSync(path, JSON.stringify(next, null, 2) + "\n", "utf-8");
|
|
114
119
|
return next;
|
|
115
120
|
});
|
|
116
121
|
}
|
|
122
|
+
export function recordUnitHarnessAbort(basePath, unitType, unitId, startedAt, abort) {
|
|
123
|
+
return writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, {
|
|
124
|
+
harnessAbort: {
|
|
125
|
+
...abort,
|
|
126
|
+
recordedAt: abort.recordedAt ?? Date.now(),
|
|
127
|
+
},
|
|
128
|
+
lastProgressAt: Date.now(),
|
|
129
|
+
lastProgressKind: `harness-abort:${abort.kind}`,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
117
132
|
export function readUnitRuntimeRecord(basePath, unitType, unitId) {
|
|
118
133
|
const path = runtimePath(basePath, unitType, unitId);
|
|
119
134
|
if (!existsSync(path))
|
|
@@ -125,6 +140,12 @@ export function readUnitRuntimeRecord(basePath, unitType, unitId) {
|
|
|
125
140
|
return null;
|
|
126
141
|
}
|
|
127
142
|
}
|
|
143
|
+
export function readUnitHarnessAbort(basePath, unitType, unitId, startedAt) {
|
|
144
|
+
const record = readUnitRuntimeRecord(basePath, unitType, unitId);
|
|
145
|
+
if (!record || record.startedAt !== startedAt)
|
|
146
|
+
return null;
|
|
147
|
+
return record.harnessAbort ?? null;
|
|
148
|
+
}
|
|
128
149
|
export function clearUnitRuntimeRecord(basePath, unitType, unitId) {
|
|
129
150
|
const path = runtimePath(basePath, unitType, unitId);
|
|
130
151
|
if (existsSync(path))
|
|
@@ -201,6 +201,13 @@ export function formatFailureContext(result) {
|
|
|
201
201
|
}
|
|
202
202
|
return header + body;
|
|
203
203
|
}
|
|
204
|
+
export function formatFailureSignature(result) {
|
|
205
|
+
return result.checks
|
|
206
|
+
.filter((check) => check.exitCode !== 0)
|
|
207
|
+
.map((check) => `${check.command.trim()}#${check.exitCode}`)
|
|
208
|
+
.sort()
|
|
209
|
+
.join("\n");
|
|
210
|
+
}
|
|
204
211
|
// ─── Gate Execution ─────────────────────────────────────────────────────────
|
|
205
212
|
/** Characters that indicate shell control syntax when unquoted in a command string. */
|
|
206
213
|
const UNQUOTED_SHELL_CONTROL_CHARS = new Set([";", "<", ">"]);
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: State manifest snapshot and restore orchestration for GSD workflow data.
|
|
3
3
|
import { _getAdapter, readTransaction, restoreManifest, } from "./gsd-db.js";
|
|
4
|
-
import { atomicWriteSync } from "./atomic-write.js";
|
|
4
|
+
import { atomicWriteAsync, atomicWriteSync } from "./atomic-write.js";
|
|
5
5
|
import { getAllDecisionsFromMemories } from "./context-store.js";
|
|
6
6
|
import { backfillDecisionsToMemories } from "./memory-backfill.js";
|
|
7
7
|
import { invalidateAllCaches } from "./cache.js";
|
|
8
|
-
import {
|
|
8
|
+
import { logWarning } from "./workflow-logger.js";
|
|
9
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
9
10
|
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
10
11
|
// ─── helpers ─────────────────────────────────────────────────────────────
|
|
11
12
|
function requireDb() {
|
|
@@ -257,22 +258,131 @@ export function snapshotState() {
|
|
|
257
258
|
return result;
|
|
258
259
|
});
|
|
259
260
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
261
|
+
const manifestWrites = new Map();
|
|
262
|
+
let processTeardownFlushInstalled = false;
|
|
263
|
+
let beforeExitFlushStarted = false;
|
|
264
|
+
function manifestWriteKey(basePath) {
|
|
265
|
+
return resolve(basePath);
|
|
266
|
+
}
|
|
267
|
+
function manifestFilePath(basePath) {
|
|
268
|
+
return join(resolve(basePath), ".gsd", "state-manifest.json");
|
|
269
|
+
}
|
|
270
|
+
function describeError(err) {
|
|
271
|
+
return err instanceof Error ? err.message : String(err);
|
|
272
|
+
}
|
|
273
|
+
function logManifestWriteFailure(filePath, err) {
|
|
274
|
+
logWarning("manifest", `state manifest write failed: ${describeError(err)}`, { file: filePath });
|
|
275
|
+
}
|
|
276
|
+
async function drainManifestWrites(key, state) {
|
|
277
|
+
let lastWriteError = null;
|
|
278
|
+
try {
|
|
279
|
+
while (state.latestJson !== null && state.syncFlushJson === null) {
|
|
280
|
+
const json = state.latestJson;
|
|
281
|
+
state.latestJson = null;
|
|
282
|
+
state.inFlightJson = json;
|
|
283
|
+
try {
|
|
284
|
+
await atomicWriteAsync(state.filePath, json);
|
|
285
|
+
if (state.syncFlushJson !== null) {
|
|
286
|
+
atomicWriteSync(state.filePath, state.syncFlushJson);
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
lastWriteError = null;
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
lastWriteError = err;
|
|
293
|
+
logManifestWriteFailure(state.filePath, err);
|
|
294
|
+
}
|
|
295
|
+
finally {
|
|
296
|
+
state.inFlightJson = null;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
state.active = null;
|
|
302
|
+
if (state.latestJson === null && state.inFlightJson === null) {
|
|
303
|
+
manifestWrites.delete(key);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (lastWriteError !== null && state.syncFlushJson === null) {
|
|
307
|
+
throw lastWriteError;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function enqueueManifestWrite(basePath, json) {
|
|
311
|
+
const key = manifestWriteKey(basePath);
|
|
312
|
+
let state = manifestWrites.get(key);
|
|
313
|
+
if (!state) {
|
|
314
|
+
state = {
|
|
315
|
+
filePath: manifestFilePath(basePath),
|
|
316
|
+
latestJson: null,
|
|
317
|
+
inFlightJson: null,
|
|
318
|
+
syncFlushJson: null,
|
|
319
|
+
active: null,
|
|
320
|
+
};
|
|
321
|
+
manifestWrites.set(key, state);
|
|
322
|
+
}
|
|
323
|
+
state.latestJson = json;
|
|
324
|
+
if (!state.active) {
|
|
325
|
+
const active = drainManifestWrites(key, state);
|
|
326
|
+
void active.catch(() => { });
|
|
327
|
+
state.active = active;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
266
330
|
/**
|
|
267
|
-
*
|
|
331
|
+
* Queue current DB state for an async atomic write to .gsd/state-manifest.json.
|
|
268
332
|
* Uses JSON.stringify with 2-space indent for git three-way merge friendliness.
|
|
269
333
|
*/
|
|
270
334
|
export function writeManifest(basePath) {
|
|
271
335
|
const manifest = snapshotState();
|
|
272
336
|
const json = JSON.stringify(manifest, null, 2);
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
337
|
+
enqueueManifestWrite(basePath, json);
|
|
338
|
+
}
|
|
339
|
+
async function flushManifestByKey(key) {
|
|
340
|
+
for (;;) {
|
|
341
|
+
const active = manifestWrites.get(key)?.active;
|
|
342
|
+
if (!active)
|
|
343
|
+
return;
|
|
344
|
+
await active;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Wait for any queued manifest write for this base path to become durable.
|
|
349
|
+
*/
|
|
350
|
+
export async function flushManifest(basePath) {
|
|
351
|
+
await flushManifestByKey(manifestWriteKey(basePath));
|
|
352
|
+
}
|
|
353
|
+
export async function flushAllManifests() {
|
|
354
|
+
await Promise.all(Array.from(manifestWrites.keys(), key => flushManifestByKey(key)));
|
|
355
|
+
}
|
|
356
|
+
function flushAllManifestsSync() {
|
|
357
|
+
for (const [key, state] of manifestWrites) {
|
|
358
|
+
const json = state.latestJson ?? state.inFlightJson;
|
|
359
|
+
if (json === null)
|
|
360
|
+
continue;
|
|
361
|
+
try {
|
|
362
|
+
atomicWriteSync(state.filePath, json);
|
|
363
|
+
state.latestJson = null;
|
|
364
|
+
state.inFlightJson = null;
|
|
365
|
+
state.syncFlushJson = json;
|
|
366
|
+
manifestWrites.delete(key);
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
logManifestWriteFailure(state.filePath, err);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
export function installManifestFlushOnProcessTeardown() {
|
|
374
|
+
if (processTeardownFlushInstalled)
|
|
375
|
+
return;
|
|
376
|
+
processTeardownFlushInstalled = true;
|
|
377
|
+
process.once("beforeExit", () => {
|
|
378
|
+
if (beforeExitFlushStarted)
|
|
379
|
+
return;
|
|
380
|
+
beforeExitFlushStarted = true;
|
|
381
|
+
void flushAllManifests();
|
|
382
|
+
});
|
|
383
|
+
process.once("exit", () => {
|
|
384
|
+
flushAllManifestsSync();
|
|
385
|
+
});
|
|
276
386
|
}
|
|
277
387
|
// ─── readManifest ────────────────────────────────────────────────────────
|
|
278
388
|
/**
|
|
@@ -317,7 +427,10 @@ function restoreArtifactProjections(basePath, manifest) {
|
|
|
317
427
|
if (manifest.artifacts === undefined)
|
|
318
428
|
return;
|
|
319
429
|
for (const artifact of manifest.artifacts) {
|
|
320
|
-
|
|
430
|
+
const content = artifact.full_content ?? "";
|
|
431
|
+
if (content === "")
|
|
432
|
+
continue;
|
|
433
|
+
atomicWriteSync(artifactProjectionPath(basePath, artifact.path), content);
|
|
321
434
|
}
|
|
322
435
|
}
|
|
323
436
|
// ─── bootstrapFromManifest ──────────────────────────────────────────────
|
|
@@ -399,15 +399,13 @@ export async function renderStateProjection(basePath) {
|
|
|
399
399
|
logWarning("projection", `renderStateProjection failed: ${err.message}`);
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
|
-
// ───
|
|
402
|
+
// ─── renderMilestoneShellProjections ─────────────────────────────────────
|
|
403
403
|
/**
|
|
404
|
-
* Regenerate
|
|
405
|
-
*
|
|
404
|
+
* Regenerate milestone-level projections (roadmap, top-level views, STATE.md).
|
|
405
|
+
* Does not touch slice PLAN.md or task SUMMARY.md — those have authoritative
|
|
406
|
+
* renderers in plan-slice / complete-task.
|
|
406
407
|
*/
|
|
407
|
-
export async function
|
|
408
|
-
// Delegate to the authoritative roadmap renderer — the reduced
|
|
409
|
-
// renderRoadmapProjection omits sections like ## Boundary Map and would
|
|
410
|
-
// clobber the output written by plan-milestone / reassess-roadmap.
|
|
408
|
+
export async function renderMilestoneShellProjections(basePath, milestoneId) {
|
|
411
409
|
try {
|
|
412
410
|
await renderRoadmapFromDb(basePath, milestoneId);
|
|
413
411
|
}
|
|
@@ -426,6 +424,20 @@ export async function renderAllProjections(basePath, milestoneId) {
|
|
|
426
424
|
catch (err) {
|
|
427
425
|
logWarning("projection", `renderTopLevelQueueFromDb failed: ${err.message}`);
|
|
428
426
|
}
|
|
427
|
+
try {
|
|
428
|
+
await renderStateProjection(basePath);
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
logWarning("projection", `renderStateProjection failed: ${err.message}`);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// ─── renderAllProjections ───────────────────────────────────────────────
|
|
435
|
+
/**
|
|
436
|
+
* Regenerate all projection files for a milestone from DB state.
|
|
437
|
+
* All calls are wrapped in try/catch — projection failure is non-fatal per D-02.
|
|
438
|
+
*/
|
|
439
|
+
export async function renderAllProjections(basePath, milestoneId) {
|
|
440
|
+
await renderMilestoneShellProjections(basePath, milestoneId);
|
|
429
441
|
// Query all slices for this milestone
|
|
430
442
|
const sliceRows = getMilestoneSlices(milestoneId);
|
|
431
443
|
for (const slice of sliceRows) {
|
|
@@ -445,13 +457,6 @@ export async function renderAllProjections(basePath, milestoneId) {
|
|
|
445
457
|
}
|
|
446
458
|
}
|
|
447
459
|
}
|
|
448
|
-
// Render STATE.md
|
|
449
|
-
try {
|
|
450
|
-
await renderStateProjection(basePath);
|
|
451
|
-
}
|
|
452
|
-
catch (err) {
|
|
453
|
-
logWarning("projection", `renderStateProjection failed: ${err.message}`);
|
|
454
|
-
}
|
|
455
460
|
}
|
|
456
461
|
// ─── regenerateIfMissing ────────────────────────────────────────────────
|
|
457
462
|
/**
|
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
// gsd-pi + Workspace handle: single source of truth for path resolution per milestone
|
|
2
|
-
import { join, resolve } from "node:path";
|
|
3
|
-
import { resolveGsdPathContract, normalizeRealPath } from "./paths.js";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { buildMilestoneFileName, canonicalPhaseDirName, isLegacyMilestonesLayout, milestonesDir, resolveGsdPathContract, resolveMilestoneFile, resolveMilestonePath, normalizeRealPath, } from "./paths.js";
|
|
4
4
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "./worktree-root.js";
|
|
5
5
|
function tryRealpath(p) {
|
|
6
6
|
return normalizeRealPath(p);
|
|
7
7
|
}
|
|
8
|
+
function isLegacyMilestoneDirectory(dir) {
|
|
9
|
+
const parent = dirname(dir);
|
|
10
|
+
return parent.endsWith("/milestones") || parent.endsWith("\\milestones");
|
|
11
|
+
}
|
|
12
|
+
function scopeMilestoneDir(basePath, milestoneId) {
|
|
13
|
+
return resolveMilestonePath(basePath, milestoneId) ?? join(milestonesDir(basePath), isLegacyMilestonesLayout(basePath) ? milestoneId : canonicalPhaseDirName(milestoneId));
|
|
14
|
+
}
|
|
15
|
+
function scopeMilestoneFile(basePath, milestoneId, suffix) {
|
|
16
|
+
const existing = resolveMilestoneFile(basePath, milestoneId, suffix);
|
|
17
|
+
if (existing)
|
|
18
|
+
return existing;
|
|
19
|
+
const dir = scopeMilestoneDir(basePath, milestoneId);
|
|
20
|
+
const filename = isLegacyMilestoneDirectory(dir)
|
|
21
|
+
? `${milestoneId}-${suffix}.md`
|
|
22
|
+
: buildMilestoneFileName(milestoneId, suffix);
|
|
23
|
+
return join(dir, filename);
|
|
24
|
+
}
|
|
8
25
|
/**
|
|
9
26
|
* Create an immutable GsdWorkspace handle from a raw base path.
|
|
10
27
|
* Resolves both the project root and (when applicable) the worktree root,
|
|
@@ -39,21 +56,22 @@ export function createWorkspace(rawBasePath) {
|
|
|
39
56
|
* Bind a milestoneId to a workspace, producing an immutable MilestoneScope
|
|
40
57
|
* with path-returning closures for DB-authoritative project state.
|
|
41
58
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
59
|
+
* DB paths route to contract.projectGsd. Milestone artifact paths resolve from
|
|
60
|
+
* the pinned project root with the layout-aware resolvers, so flat-phase and
|
|
61
|
+
* legacy projects use the same scope surface.
|
|
45
62
|
*/
|
|
46
63
|
export function scopeMilestone(workspace, milestoneId) {
|
|
47
64
|
const { contract } = workspace;
|
|
48
65
|
const gsd = contract.projectGsd;
|
|
66
|
+
const basePath = workspace.projectRoot;
|
|
49
67
|
const scope = Object.freeze({
|
|
50
68
|
workspace,
|
|
51
69
|
milestoneId,
|
|
52
|
-
contextFile: () =>
|
|
53
|
-
roadmapFile: () =>
|
|
70
|
+
contextFile: () => scopeMilestoneFile(basePath, milestoneId, "CONTEXT"),
|
|
71
|
+
roadmapFile: () => scopeMilestoneFile(basePath, milestoneId, "ROADMAP"),
|
|
54
72
|
stateFile: () => join(gsd, "STATE.md"),
|
|
55
73
|
dbPath: () => contract.projectDb,
|
|
56
|
-
milestoneDir: () =>
|
|
74
|
+
milestoneDir: () => scopeMilestoneDir(basePath, milestoneId),
|
|
57
75
|
metaJson: () => join(gsd, `${milestoneId}-META.json`),
|
|
58
76
|
});
|
|
59
77
|
return scope;
|