@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
|
@@ -9,16 +9,62 @@ import { migrateFromMarkdown } from "./md-importer.js";
|
|
|
9
9
|
import { countDbHierarchy } from "./migration-auto-check.js";
|
|
10
10
|
import { logWarning } from "./workflow-logger.js";
|
|
11
11
|
import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
12
|
-
import { canonicalPhaseDirName, milestonesDir, resolveMilestonePath } from "./paths.js";
|
|
12
|
+
import { canonicalPhaseDirName, dirIsContentBearingLegacyMilestone, milestonesDir, resolveMilestonePath, } from "./paths.js";
|
|
13
13
|
const LEGACY_MIGRATING_SEGMENT = "milestones.migrating";
|
|
14
|
+
const RETRYABLE_FS_ERROR_CODES = new Set(["EPERM", "EBUSY", "ENOTEMPTY"]);
|
|
15
|
+
const RM_RETRY_OPTIONS = { recursive: true, force: true, maxRetries: 5, retryDelay: 100 };
|
|
16
|
+
let fsOps = { cpSync, renameSync, rmSync };
|
|
17
|
+
export function _setFlatPhaseMigrationFsOpsForTest(overrides) {
|
|
18
|
+
const previous = fsOps;
|
|
19
|
+
fsOps = { ...fsOps, ...overrides };
|
|
20
|
+
return () => {
|
|
21
|
+
fsOps = previous;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
14
24
|
function legacyMigratingPath(basePath) {
|
|
15
25
|
return join(basePath, ".gsd", LEGACY_MIGRATING_SEGMENT);
|
|
16
26
|
}
|
|
27
|
+
function removePathWithRetries(path) {
|
|
28
|
+
fsOps.rmSync(path, { recursive: true, force: true, maxRetries: RM_RETRY_OPTIONS.maxRetries, retryDelay: RM_RETRY_OPTIONS.retryDelay });
|
|
29
|
+
}
|
|
30
|
+
function isRetryableFsError(err) {
|
|
31
|
+
const code = err?.code;
|
|
32
|
+
return typeof code === "string" && RETRYABLE_FS_ERROR_CODES.has(code);
|
|
33
|
+
}
|
|
34
|
+
function movePathWithCopyDeleteFallback(src, dst) {
|
|
35
|
+
try {
|
|
36
|
+
fsOps.renameSync(src, dst);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (!isRetryableFsError(err))
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
fsOps.cpSync(src, dst, { recursive: true, force: true });
|
|
45
|
+
removePathWithRetries(src);
|
|
46
|
+
}
|
|
47
|
+
catch (fallbackErr) {
|
|
48
|
+
if (existsSync(src) && existsSync(dst)) {
|
|
49
|
+
try {
|
|
50
|
+
removePathWithRetries(dst);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Leave the original error intact; the next run can pre-clean dst.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
throw fallbackErr;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function expectedPhaseDirs(basePath) {
|
|
60
|
+
return getAllMilestones().map((milestone) => resolveMilestonePath(basePath, milestone.id) ??
|
|
61
|
+
join(milestonesDir(basePath), canonicalPhaseDirName(milestone.id, milestone.title)));
|
|
62
|
+
}
|
|
17
63
|
function hasLegacyMilestoneSubdirs(dirPath) {
|
|
18
64
|
if (!existsSync(dirPath))
|
|
19
65
|
return false;
|
|
20
66
|
try {
|
|
21
|
-
return readdirSync(dirPath).some(e => statSync(join(dirPath, e)).isDirectory());
|
|
67
|
+
return readdirSync(dirPath).some((e) => statSync(join(dirPath, e)).isDirectory() && dirIsContentBearingLegacyMilestone(join(dirPath, e)));
|
|
22
68
|
}
|
|
23
69
|
catch {
|
|
24
70
|
return false;
|
|
@@ -26,19 +72,24 @@ function hasLegacyMilestoneSubdirs(dirPath) {
|
|
|
26
72
|
}
|
|
27
73
|
function rollbackPartialMigration(basePath, backupDir, migratingPath) {
|
|
28
74
|
// Remove the partially-written phases/ dir.
|
|
29
|
-
|
|
75
|
+
try {
|
|
76
|
+
removePathWithRetries(join(basePath, ".gsd", LAYOUT_SEGMENTS.level1));
|
|
77
|
+
}
|
|
78
|
+
catch (removeErr) {
|
|
79
|
+
logWarning("migration", `rollback: could not remove partial ${LAYOUT_SEGMENTS.level1}/: ${removeErr.message}`);
|
|
80
|
+
}
|
|
30
81
|
// Restore milestones/ — prefer renaming the preserved migrating copy back.
|
|
31
82
|
const milestonesPath = join(basePath, ".gsd", "milestones");
|
|
32
83
|
try {
|
|
33
84
|
if (migratingPath && existsSync(migratingPath) && !existsSync(milestonesPath)) {
|
|
34
|
-
|
|
85
|
+
movePathWithCopyDeleteFallback(migratingPath, milestonesPath);
|
|
35
86
|
return;
|
|
36
87
|
}
|
|
37
88
|
if (existsSync(backupDir)) {
|
|
38
89
|
cpSync(backupDir, milestonesPath, { recursive: true });
|
|
39
90
|
}
|
|
40
91
|
if (migratingPath && existsSync(migratingPath)) {
|
|
41
|
-
|
|
92
|
+
removePathWithRetries(migratingPath);
|
|
42
93
|
}
|
|
43
94
|
}
|
|
44
95
|
catch (restoreErr) {
|
|
@@ -59,6 +110,51 @@ export function needsFlatPhaseMigration(basePath) {
|
|
|
59
110
|
// Resume an interrupted migration where the legacy tree was renamed aside.
|
|
60
111
|
return hasLegacyMilestoneSubdirs(legacyMigratingPath(basePath));
|
|
61
112
|
}
|
|
113
|
+
/** Retention window before flat-phase migration backups are auto-pruned. */
|
|
114
|
+
export const FLAT_PHASE_BACKUP_RETENTION_MS = 30 * 24 * 60 * 60 * 1000;
|
|
115
|
+
/**
|
|
116
|
+
* Remove stale flat-phase migration backups after the retention window.
|
|
117
|
+
* Only runs when migration is complete (.gsd/phases/ exists, legacy layout gone).
|
|
118
|
+
* Returns the number of migrate-* directories removed.
|
|
119
|
+
*/
|
|
120
|
+
export function pruneStaleFlatPhaseBackups(basePath) {
|
|
121
|
+
if (needsFlatPhaseMigration(basePath))
|
|
122
|
+
return 0;
|
|
123
|
+
const phasesPath = join(basePath, ".gsd", LAYOUT_SEGMENTS.level1);
|
|
124
|
+
if (!existsSync(phasesPath))
|
|
125
|
+
return 0;
|
|
126
|
+
const backupRoot = join(basePath, ".gsd-backups");
|
|
127
|
+
if (!existsSync(backupRoot))
|
|
128
|
+
return 0;
|
|
129
|
+
const now = Date.now();
|
|
130
|
+
let removed = 0;
|
|
131
|
+
for (const entry of readdirSync(backupRoot)) {
|
|
132
|
+
if (!entry.startsWith("migrate-"))
|
|
133
|
+
continue;
|
|
134
|
+
const dirPath = join(backupRoot, entry);
|
|
135
|
+
try {
|
|
136
|
+
const st = statSync(dirPath);
|
|
137
|
+
if (!st.isDirectory())
|
|
138
|
+
continue;
|
|
139
|
+
if (now - st.mtimeMs < FLAT_PHASE_BACKUP_RETENTION_MS)
|
|
140
|
+
continue;
|
|
141
|
+
rmSync(dirPath, { recursive: true, force: true });
|
|
142
|
+
removed++;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Non-fatal: leave backup for manual recovery.
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
if (readdirSync(backupRoot).length === 0) {
|
|
150
|
+
rmSync(backupRoot, { recursive: true, force: true });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Non-fatal.
|
|
155
|
+
}
|
|
156
|
+
return removed;
|
|
157
|
+
}
|
|
62
158
|
/**
|
|
63
159
|
* Migrate from legacy nested .gsd/milestones/ to flat-phase .gsd/phases/.
|
|
64
160
|
*
|
|
@@ -101,20 +197,29 @@ export async function migrateToFlatPhase(basePath) {
|
|
|
101
197
|
logWarning("migration", `flat-phase migration backup failed: ${err.message}`);
|
|
102
198
|
throw err;
|
|
103
199
|
}
|
|
200
|
+
if (existsSync(migratingPath)) {
|
|
201
|
+
removePathWithRetries(migratingPath);
|
|
202
|
+
}
|
|
104
203
|
// 3. Rename legacy tree aside before rendering so path resolvers target
|
|
105
204
|
// phases/ instead of writing back into the nested milestones/ layout.
|
|
106
205
|
// Keep the full tree on disk until render+verify succeed (unlike rmSync).
|
|
107
206
|
try {
|
|
108
|
-
|
|
207
|
+
movePathWithCopyDeleteFallback(milestonesPath, migratingPath);
|
|
109
208
|
}
|
|
110
209
|
catch (err) {
|
|
111
210
|
logWarning("migration", `failed to rename legacy milestones/ before render: ${err.message}`);
|
|
112
211
|
throw err;
|
|
113
212
|
}
|
|
114
213
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
214
|
+
// Clear any stale or partially-rendered flat projection before this run
|
|
215
|
+
// writes. Verification below checks the current DB render, not leftovers.
|
|
216
|
+
try {
|
|
217
|
+
removePathWithRetries(phasesPath);
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
logWarning("migration", `failed to clear stale phases/ before render: ${err.message}`);
|
|
221
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
222
|
+
throw err;
|
|
118
223
|
}
|
|
119
224
|
// 4. Render flat-phase from DB
|
|
120
225
|
let renderResult;
|
|
@@ -146,20 +251,11 @@ export async function migrateToFlatPhase(basePath) {
|
|
|
146
251
|
throw new Error(`flat-phase migration render failed: ${renderResult.errors.slice(0, 3).join("; ")}`);
|
|
147
252
|
}
|
|
148
253
|
const db = countDbHierarchy();
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
// whose dirs start with "100-slug" are counted correctly.
|
|
153
|
-
renderedDirCount = readdirSync(phasesPath, { withFileTypes: true })
|
|
154
|
-
.filter((entry) => entry.isDirectory() && /^\d+-/.test(entry.name)).length;
|
|
155
|
-
}
|
|
156
|
-
catch {
|
|
157
|
-
// phases/ doesn't exist or is unreadable — same as zero dirs
|
|
158
|
-
}
|
|
159
|
-
if (db.milestones > 0 && renderedDirCount !== db.milestones) {
|
|
160
|
-
logWarning("migration", `phases/ dir count mismatch: expected ${db.milestones}, found ${renderedDirCount}`);
|
|
254
|
+
const missingPhaseDirs = expectedPhaseDirs(basePath).filter((phaseDir) => !existsSync(phaseDir));
|
|
255
|
+
if (db.milestones > 0 && missingPhaseDirs.length > 0) {
|
|
256
|
+
logWarning("migration", `flat-phase migration missing ${missingPhaseDirs.length} expected phase dir(s): ${missingPhaseDirs.join(", ")}`);
|
|
161
257
|
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
162
|
-
throw new Error("flat-phase migration verification failed:
|
|
258
|
+
throw new Error("flat-phase migration verification failed: missing rendered phase directories");
|
|
163
259
|
}
|
|
164
260
|
if (db.slices > 0 && renderResult.rendered === 0) {
|
|
165
261
|
logWarning("migration", "flat-phase migration verification failed: render produced no artifacts for populated DB");
|
|
@@ -168,7 +264,7 @@ export async function migrateToFlatPhase(basePath) {
|
|
|
168
264
|
}
|
|
169
265
|
// 6. Verified — remove the renamed legacy tree (backup already on disk).
|
|
170
266
|
try {
|
|
171
|
-
|
|
267
|
+
removePathWithRetries(migratingPath);
|
|
172
268
|
}
|
|
173
269
|
catch (err) {
|
|
174
270
|
logWarning("migration", `flat-phase migration succeeded but could not remove ${LEGACY_MIGRATING_SEGMENT}: ${err.message}`);
|
|
@@ -16,7 +16,7 @@ import { gsdRoot } from "./paths.js";
|
|
|
16
16
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
17
17
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
18
18
|
import { logWarning } from "./workflow-logger.js";
|
|
19
|
-
import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
|
|
19
|
+
import { createRepositoryRegistryFromPreferences, defaultRepositoryTargets } from "./repository-registry.js";
|
|
20
20
|
import { isGsdGitignored } from "./gitignore.js";
|
|
21
21
|
import { detectWorktreeName, } from "./worktree.js";
|
|
22
22
|
import { SLICE_BRANCH_RE, QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
|
|
@@ -208,6 +208,7 @@ export class MergeConflictError extends GSDError {
|
|
|
208
208
|
*/
|
|
209
209
|
export const RUNTIME_EXCLUSION_PATHS = [
|
|
210
210
|
".gsd-worktrees/",
|
|
211
|
+
".gsd-backups/**",
|
|
211
212
|
".gsd/activity/",
|
|
212
213
|
".gsd/audit/",
|
|
213
214
|
".gsd/forensics/",
|
|
@@ -1023,25 +1024,78 @@ export function handleTurnGitActionError(action, err) {
|
|
|
1023
1024
|
error: errorWithStreams.stderr?.trim() || errorWithStreams.message || getErrorMessage(err),
|
|
1024
1025
|
};
|
|
1025
1026
|
}
|
|
1027
|
+
export function isRepositoryDirty(repoRoot) {
|
|
1028
|
+
try {
|
|
1029
|
+
return runGit(repoRoot, ["status", "--porcelain"]).length > 0;
|
|
1030
|
+
}
|
|
1031
|
+
catch {
|
|
1032
|
+
// Fallback preserves legacy behavior if explicit status probing fails.
|
|
1033
|
+
return nativeHasChanges(repoRoot);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1026
1036
|
function collectRepositoryDirtyStatus(basePath) {
|
|
1027
1037
|
const preferences = loadEffectiveGSDPreferences(basePath)?.preferences;
|
|
1028
1038
|
const registry = createRepositoryRegistryFromPreferences(basePath, preferences);
|
|
1029
1039
|
const dirtyByRepository = {};
|
|
1040
|
+
const registeredRoots = new Set(registry.repositories.map((repo) => resolve(repo.root)));
|
|
1030
1041
|
for (const repo of registry.repositories) {
|
|
1042
|
+
dirtyByRepository[repo.id] = isRepositoryDirty(repo.root);
|
|
1043
|
+
}
|
|
1044
|
+
for (const repoRoot of findUndeclaredNestedGitRepositories(registry.projectRoot, registeredRoots)) {
|
|
1045
|
+
const dirty = isRepositoryDirty(repoRoot);
|
|
1046
|
+
if (!dirty)
|
|
1047
|
+
continue;
|
|
1048
|
+
const relPath = relative(registry.projectRoot, repoRoot).split(sep).join("/") || repoRoot;
|
|
1049
|
+
const label = `${relPath} (undeclared)`;
|
|
1050
|
+
dirtyByRepository[label] = true;
|
|
1051
|
+
logWarning("engine", `undeclared dirty nested git repo ${relPath}; declare it under workspace.repositories or commit manually`, { file: "git-service.ts" });
|
|
1052
|
+
}
|
|
1053
|
+
return dirtyByRepository;
|
|
1054
|
+
}
|
|
1055
|
+
const UNDECLARED_NESTED_REPO_SCAN_MAX_DEPTH = 4;
|
|
1056
|
+
const UNDECLARED_NESTED_REPO_SKIP_DIRS = new Set([
|
|
1057
|
+
".git",
|
|
1058
|
+
".gsd",
|
|
1059
|
+
".gsd-worktrees",
|
|
1060
|
+
"node_modules",
|
|
1061
|
+
"dist",
|
|
1062
|
+
"dist-test",
|
|
1063
|
+
]);
|
|
1064
|
+
function findUndeclaredNestedGitRepositories(projectRoot, registeredRoots) {
|
|
1065
|
+
const found = [];
|
|
1066
|
+
function visit(dir, depth) {
|
|
1067
|
+
if (depth >= UNDECLARED_NESTED_REPO_SCAN_MAX_DEPTH)
|
|
1068
|
+
return;
|
|
1069
|
+
let entries;
|
|
1031
1070
|
try {
|
|
1032
|
-
|
|
1071
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
1033
1072
|
}
|
|
1034
1073
|
catch {
|
|
1035
|
-
|
|
1036
|
-
|
|
1074
|
+
return;
|
|
1075
|
+
}
|
|
1076
|
+
for (const entry of entries) {
|
|
1077
|
+
if (!entry.isDirectory())
|
|
1078
|
+
continue;
|
|
1079
|
+
if (UNDECLARED_NESTED_REPO_SKIP_DIRS.has(entry.name))
|
|
1080
|
+
continue;
|
|
1081
|
+
const child = join(dir, entry.name);
|
|
1082
|
+
const childRoot = resolve(child);
|
|
1083
|
+
const hasGitDir = existsSync(join(child, ".git"));
|
|
1084
|
+
const isRegistered = registeredRoots.has(childRoot);
|
|
1085
|
+
if (hasGitDir && !isRegistered) {
|
|
1086
|
+
found.push(childRoot);
|
|
1087
|
+
continue;
|
|
1088
|
+
}
|
|
1089
|
+
visit(child, depth + 1);
|
|
1037
1090
|
}
|
|
1038
1091
|
}
|
|
1039
|
-
|
|
1092
|
+
visit(projectRoot, 0);
|
|
1093
|
+
return found;
|
|
1040
1094
|
}
|
|
1041
1095
|
function runPerRepositoryCommitAction(args) {
|
|
1042
1096
|
const preferences = loadEffectiveGSDPreferences(args.basePath)?.preferences;
|
|
1043
1097
|
const registry = createRepositoryRegistryFromPreferences(args.basePath, preferences);
|
|
1044
|
-
const repoIds = args.targetRepositories?.length ? args.targetRepositories :
|
|
1098
|
+
const repoIds = args.targetRepositories?.length ? args.targetRepositories : defaultRepositoryTargets(registry);
|
|
1045
1099
|
const gitPrefs = preferences?.git ?? {};
|
|
1046
1100
|
const commitMessages = {};
|
|
1047
1101
|
const commitErrors = {};
|
|
@@ -1109,8 +1163,7 @@ export function runTurnGitAction(args) {
|
|
|
1109
1163
|
skippedRepositories: repoCommitResult.skippedRepositories,
|
|
1110
1164
|
};
|
|
1111
1165
|
}
|
|
1112
|
-
const primaryMessage = repoCommitResult.commitMessages[
|
|
1113
|
-
?? Object.values(repoCommitResult.commitMessages)[0];
|
|
1166
|
+
const primaryMessage = Object.values(repoCommitResult.commitMessages)[0];
|
|
1114
1167
|
return {
|
|
1115
1168
|
action: args.action,
|
|
1116
1169
|
status: "ok",
|
|
@@ -22,8 +22,9 @@ import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
|
22
22
|
* With external state (symlink), these are a no-op in most cases,
|
|
23
23
|
* but retained for backwards compatibility during migration.
|
|
24
24
|
*/
|
|
25
|
-
const GSD_RUNTIME_PATTERNS = [
|
|
25
|
+
export const GSD_RUNTIME_PATTERNS = [
|
|
26
26
|
".gsd-worktrees/",
|
|
27
|
+
".gsd-backups/",
|
|
27
28
|
".gsd/activity/",
|
|
28
29
|
".gsd/audit/",
|
|
29
30
|
".gsd/forensics/",
|
|
@@ -48,6 +49,8 @@ const BASELINE_PATTERNS = [
|
|
|
48
49
|
".gsd",
|
|
49
50
|
// Worktree container sibling — NOT covered by the ".gsd" pattern above.
|
|
50
51
|
".gsd-worktrees/",
|
|
52
|
+
// Flat-phase migration snapshots — NOT covered by the ".gsd" pattern above.
|
|
53
|
+
".gsd-backups/",
|
|
51
54
|
".gsd-id",
|
|
52
55
|
".mcp.json",
|
|
53
56
|
".bg-shell/",
|
|
@@ -151,6 +151,7 @@ const DOCTOR_FIX_HINTS = {
|
|
|
151
151
|
state_file_stale: "Run `/gsd doctor fix` to rebuild the projection from the database.",
|
|
152
152
|
state_file_missing: "Run `/gsd doctor fix` to rebuild the projection from the database.",
|
|
153
153
|
projection_drift: "Run `/gsd doctor fix` to rebuild markdown projections from the database (DB is the source of truth).",
|
|
154
|
+
artifact_user_content_missing: "Doctor cannot recreate user-authored content from the database. Re-run `/gsd discuss` for CONTEXT artifacts or `/gsd auto` for RESEARCH artifacts in that milestone.",
|
|
154
155
|
uat_retry_exhausted: "Review the failing UAT criteria via `/gsd status`, fix the issue, then re-run `/gsd auto`.",
|
|
155
156
|
};
|
|
156
157
|
export function doctorFixHint(code) {
|
|
@@ -274,21 +274,28 @@ function capExistingMilestonesContext(sections, cap = QUEUE_EXISTING_MILESTONES_
|
|
|
274
274
|
if (fullContext.length <= cap)
|
|
275
275
|
return fullContext;
|
|
276
276
|
const notice = `[Existing milestones context truncated to ${cap} chars. Read source paths in this prompt or the corresponding .gsd artifacts for full details.]`;
|
|
277
|
-
const
|
|
277
|
+
const noticeSuffix = `${QUEUE_CONTEXT_SECTION_SEPARATOR}${notice}`;
|
|
278
278
|
const selected = [];
|
|
279
|
-
for (
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
279
|
+
for (const section of sections) {
|
|
280
|
+
const candidate = [...selected, section].join(QUEUE_CONTEXT_SECTION_SEPARATOR) + noticeSuffix;
|
|
281
|
+
if (candidate.length <= cap) {
|
|
282
|
+
selected.push(section);
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
if (selected.length === sections.length) {
|
|
288
|
+
return selected.join(QUEUE_CONTEXT_SECTION_SEPARATOR) + noticeSuffix;
|
|
287
289
|
}
|
|
288
|
-
const
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
290
|
+
const compactTail = sections.slice(selected.length).map(compactSectionForQueueBudget);
|
|
291
|
+
const hybrid = [...selected, ...compactTail].join(QUEUE_CONTEXT_SECTION_SEPARATOR) + noticeSuffix;
|
|
292
|
+
if (hybrid.length <= cap)
|
|
293
|
+
return hybrid;
|
|
294
|
+
const compact = sections.map(compactSectionForQueueBudget);
|
|
295
|
+
const compactContext = compact.join(QUEUE_CONTEXT_SECTION_SEPARATOR) + noticeSuffix;
|
|
296
|
+
if (compactContext.length <= cap)
|
|
297
|
+
return compactContext;
|
|
298
|
+
return `${compactContext.slice(0, Math.max(0, cap - notice.length - 2)).trimEnd()}\n\n${notice}`;
|
|
292
299
|
}
|
|
293
300
|
function compactSectionForQueueBudget(section) {
|
|
294
301
|
const lines = section.split("\n");
|
|
@@ -20,7 +20,7 @@ import { assessInterruptedSession, formatInterruptedSessionRunningMessage, forma
|
|
|
20
20
|
import { listUnitRuntimeRecords, clearUnitRuntimeRecord, isInFlightRuntimePhase } from "./unit-runtime.js";
|
|
21
21
|
import { resolveExpectedArtifactPath } from "./auto.js";
|
|
22
22
|
import { gsdHome } from "./gsd-home.js";
|
|
23
|
-
import { gsdRoot, milestonesDir, legacyMilestonesDir, resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile, relMilestoneFile, relSliceFile, } from "./paths.js";
|
|
23
|
+
import { gsdRoot, milestonesDir, legacyMilestonesDir, resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveGsdRootFile, relGsdRootFile, relMilestoneFile, relSliceFile, clearPathCache, } from "./paths.js";
|
|
24
24
|
import { join } from "node:path";
|
|
25
25
|
import { readFileSync, existsSync, mkdirSync, readdirSync, rmSync } from "node:fs";
|
|
26
26
|
import { readSessionLockData, isSessionLockProcessAlive } from "./session-lock.js";
|
|
@@ -53,6 +53,7 @@ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
|
|
|
53
53
|
import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
|
|
54
54
|
import { runPreparation, formatCodebaseBrief, formatPriorContextBrief, } from "./preparation.js";
|
|
55
55
|
import { verifyExpectedArtifact } from "./auto-recovery.js";
|
|
56
|
+
import { countPlanMilestoneRoadmapSlices } from "./artifact-verification.js";
|
|
56
57
|
import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
|
|
57
58
|
import { _getPendingAutoStart, deletePendingAutoStart, hasPendingAutoStart, setPendingAutoStart, } from "./pending-auto-start.js";
|
|
58
59
|
import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
|
|
@@ -78,20 +79,57 @@ export const _scheduleAutoStartAfterIdleForTest = scheduleAutoStartAfterIdle;
|
|
|
78
79
|
// These thin wrappers accept a MilestoneScope so callers that already hold a
|
|
79
80
|
// pinned scope never have to re-derive (basePath, milestoneId) separately.
|
|
80
81
|
// The underlying implementations in auto-recovery.ts / auto-artifact-paths.ts /
|
|
81
|
-
// state.ts
|
|
82
|
+
// state.ts remain the default for non-scope-specific units.
|
|
82
83
|
/**
|
|
83
84
|
* Scope-based overload of verifyExpectedArtifact.
|
|
84
85
|
* Uses scope.workspace.projectRoot as the authoritative base path, making
|
|
85
86
|
* the check immune to cwd-drift and worktree-path divergence.
|
|
86
87
|
*/
|
|
87
88
|
export function verifyExpectedArtifactForScope(scope, unitType, unitId) {
|
|
89
|
+
if (unitId === scope.milestoneId &&
|
|
90
|
+
(unitType === "discuss-milestone" || unitType === "plan-milestone")) {
|
|
91
|
+
// Layout-aware scope paths use resolveMilestoneFile; clear stale dir listings
|
|
92
|
+
// primed before discuss/plan wrote CONTEXT.md or ROADMAP.md (see checkAutoStartAfterDiscuss).
|
|
93
|
+
clearPathCache();
|
|
94
|
+
}
|
|
95
|
+
if (unitId === scope.milestoneId &&
|
|
96
|
+
unitType === "discuss-milestone") {
|
|
97
|
+
const path = resolveExpectedArtifactPathForScope(scope, unitType, unitId);
|
|
98
|
+
return path ? existsSync(path) : false;
|
|
99
|
+
}
|
|
100
|
+
if (unitId === scope.milestoneId && unitType === "plan-milestone") {
|
|
101
|
+
const path = resolveExpectedArtifactPathForScope(scope, unitType, unitId);
|
|
102
|
+
return verifyScopedPlanMilestoneArtifact(path, unitType, unitId);
|
|
103
|
+
}
|
|
88
104
|
return verifyExpectedArtifact(unitType, unitId, scope.workspace.projectRoot);
|
|
89
105
|
}
|
|
106
|
+
function verifyScopedPlanMilestoneArtifact(path, unitType, unitId) {
|
|
107
|
+
if (!path || !existsSync(path))
|
|
108
|
+
return false;
|
|
109
|
+
try {
|
|
110
|
+
const roadmapContent = readFileSync(path, "utf-8");
|
|
111
|
+
if (countPlanMilestoneRoadmapSlices(roadmapContent) === 0) {
|
|
112
|
+
logWarning("recovery", `verify-fail ${unitType} ${unitId}: roadmap has zero slices at ${path}`);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
logWarning("recovery", `plan-milestone roadmap verification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
90
122
|
/**
|
|
91
123
|
* Scope-based overload of resolveExpectedArtifactPath.
|
|
92
124
|
* Returns the canonical absolute path (or null) using the scope's projectRoot.
|
|
93
125
|
*/
|
|
94
126
|
export function resolveExpectedArtifactPathForScope(scope, unitType, unitId) {
|
|
127
|
+
if (unitId === scope.milestoneId) {
|
|
128
|
+
if (unitType === "discuss-milestone")
|
|
129
|
+
return scope.contextFile();
|
|
130
|
+
if (unitType === "plan-milestone")
|
|
131
|
+
return scope.roadmapFile();
|
|
132
|
+
}
|
|
95
133
|
return resolveExpectedArtifactPath(unitType, unitId, scope.workspace.projectRoot);
|
|
96
134
|
}
|
|
97
135
|
async function runQuickTaskChoice(ctx, pi) {
|
|
@@ -56,6 +56,26 @@ export function saveJsonFile(filePath, data) {
|
|
|
56
56
|
// Non-fatal — don't let persistence failures break operation
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Save a JSON file atomically using compact serialization.
|
|
61
|
+
*
|
|
62
|
+
* Intended for machine-only ledgers where pretty-printing has no consumer.
|
|
63
|
+
* Keeps the same write-tmp-rename safety and non-fatal error behavior as
|
|
64
|
+
* saveJsonFile.
|
|
65
|
+
*/
|
|
66
|
+
export function saveJsonFileCompact(filePath, data) {
|
|
67
|
+
try {
|
|
68
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
69
|
+
// Use randomized tmp suffix to prevent concurrent-write data loss
|
|
70
|
+
const tmp = `${filePath}.tmp.${randomBytes(4).toString("hex")}`;
|
|
71
|
+
writeFileSync(tmp, JSON.stringify(data) + "\n", "utf-8");
|
|
72
|
+
renameSync(tmp, filePath);
|
|
73
|
+
// No cleanup needed — renameSync atomically removes tmp on success
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Non-fatal — don't let persistence failures break operation
|
|
77
|
+
}
|
|
78
|
+
}
|
|
59
79
|
/**
|
|
60
80
|
* Write a JSON file atomically (write to .tmp, then rename).
|
|
61
81
|
* Creates parent directories as needed. Non-fatal on error.
|
|
@@ -19,6 +19,7 @@ export const PROVIDER_REGISTRY = [
|
|
|
19
19
|
// must be in the canonical registry so all consumers see the same catalog.
|
|
20
20
|
// See: https://github.com/open-gsd/gsd-pi/issues/4541
|
|
21
21
|
{ id: "claude-code", label: "Claude Code CLI", category: "llm", authMode: "externalCli" },
|
|
22
|
+
{ id: "cursor-agent", label: "Cursor Agent", category: "llm", envVar: "CURSOR_API_KEY", authMode: "externalCli" },
|
|
22
23
|
{ id: "openai", label: "OpenAI", category: "llm", envVar: "OPENAI_API_KEY", prefixes: ["sk-"], dashboardUrl: "platform.openai.com/api-keys" },
|
|
23
24
|
{ id: "github-copilot", label: "GitHub Copilot", category: "llm", envVar: "GITHUB_TOKEN", authMode: "browserOAuth" },
|
|
24
25
|
{ id: "openai-codex", label: "ChatGPT Plus/Pro (Codex)", category: "llm", authMode: "browserOAuth" },
|
|
@@ -24,8 +24,8 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
24
24
|
* - Idempotent (per-row): each migrated memory carries
|
|
25
25
|
* `structured_fields.sourceKnowledgeId = "<P|L>NNN"`. Rows whose ID is
|
|
26
26
|
* already present in the memory store are skipped.
|
|
27
|
-
* - Best-effort: never throws.
|
|
28
|
-
* backfill cannot block
|
|
27
|
+
* - Best-effort: never throws. Failed memory inserts are logged and skipped;
|
|
28
|
+
* setup/read failures log and return 0 so backfill cannot block startup.
|
|
29
29
|
* - Rules (K###) are intentionally skipped — they remain manually maintained
|
|
30
30
|
* in `KNOWLEDGE.md` per ADR-013.
|
|
31
31
|
*
|
|
@@ -56,15 +56,22 @@ export function backfillKnowledgeToMemories(basePath) {
|
|
|
56
56
|
const matchPattern = `%"sourceKnowledgeId":"${synth.id}"%`;
|
|
57
57
|
if (checkExisting.get({ ":pattern": matchPattern }))
|
|
58
58
|
continue;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
try {
|
|
60
|
+
const id = createMemory({
|
|
61
|
+
category: synth.category,
|
|
62
|
+
content: synth.content,
|
|
63
|
+
scope: synth.scope,
|
|
64
|
+
confidence: 0.85,
|
|
65
|
+
structuredFields: synth.structuredFields,
|
|
66
|
+
});
|
|
67
|
+
if (id)
|
|
68
|
+
written += 1;
|
|
69
|
+
}
|
|
70
|
+
catch (rowErr) {
|
|
71
|
+
const message = rowErr instanceof Error ? rowErr.message : String(rowErr);
|
|
72
|
+
logWarning("knowledge-backfill", `KNOWLEDGE.md -> memories backfill skipped ${synth.id}: ${message}`);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
68
75
|
}
|
|
69
76
|
return written;
|
|
70
77
|
}
|
|
@@ -40,8 +40,10 @@ export function dbPath(basePath) {
|
|
|
40
40
|
* Used by the renderer to derive the phase number from the DB's milestone_id.
|
|
41
41
|
*/
|
|
42
42
|
export function milestoneIdToPhaseNum(milestoneId) {
|
|
43
|
-
// No $ anchor: accepts bare (M012)
|
|
43
|
+
// No $ anchor: accepts bare (M012), team-suffixed (M012-abc123), and legacy numeric IDs.
|
|
44
44
|
const m = milestoneId.match(/^M0*(\d+)/i);
|
|
45
|
+
if (!m && /^\d+$/.test(milestoneId))
|
|
46
|
+
return Number.parseInt(milestoneId, 10);
|
|
45
47
|
return m ? Number.parseInt(m[1], 10) : 1;
|
|
46
48
|
}
|
|
47
49
|
/** Team-mode suffix from milestone ids like M001-abc123. */
|