@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
|
@@ -12,7 +12,7 @@ import { readFileSync, existsSync, mkdirSync, statSync, unlinkSync } from "node:
|
|
|
12
12
|
import { logWarning } from "./workflow-logger.js";
|
|
13
13
|
import { isClosedStatus } from "./status-guards.js";
|
|
14
14
|
import { dirname, join, relative } from "node:path";
|
|
15
|
-
import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
|
|
15
|
+
import { getAllMilestones, getMilestone, getMilestoneScopedArtifacts, getSliceScopedArtifacts, getMilestoneSlices, getSliceTasks, getTasksBySliceIds, getTask, getSlice, insertArtifact, deleteArtifactByPath, getGateResults, isDbAvailable, } from "./gsd-db.js";
|
|
16
16
|
import { resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, gsdProjectionRoot, gsdRoot, buildMilestoneFileName, buildTaskFileName, } from "./paths.js";
|
|
17
17
|
import { saveFile, clearParseCache, registerCacheClearCallback } from "./files.js";
|
|
18
18
|
import { parseRoadmap, parsePlan } from "./parsers-legacy.js";
|
|
@@ -99,6 +99,12 @@ function meaningfulSection(value) {
|
|
|
99
99
|
return "";
|
|
100
100
|
return trimmed;
|
|
101
101
|
}
|
|
102
|
+
function renderGateFindings(gate) {
|
|
103
|
+
const findings = gate.findings.trim() || `- **Verdict:** ${gate.verdict}\n- **Rationale:** ${gate.rationale}`;
|
|
104
|
+
if (gate.verdict !== "flag")
|
|
105
|
+
return findings;
|
|
106
|
+
return `> **Warning:** Verdict: flag - concerns recorded below\n\n${findings}`;
|
|
107
|
+
}
|
|
102
108
|
function pushIndented(lines, value, indent = " ") {
|
|
103
109
|
for (const line of value.split("\n")) {
|
|
104
110
|
lines.push(`${indent}${line}`);
|
|
@@ -289,7 +295,7 @@ function renderTaskPlanMarkdown(task, taskGates = []) {
|
|
|
289
295
|
if (gate && gate.verdict !== "omitted") {
|
|
290
296
|
lines.push(`## ${label}`);
|
|
291
297
|
lines.push("");
|
|
292
|
-
lines.push(
|
|
298
|
+
lines.push(renderGateFindings(gate));
|
|
293
299
|
lines.push("");
|
|
294
300
|
}
|
|
295
301
|
}
|
|
@@ -319,14 +325,14 @@ function renderSlicePlanMarkdown(slice, tasks, gates = []) {
|
|
|
319
325
|
if (q3 && q3.verdict !== "omitted") {
|
|
320
326
|
lines.push("## Threat Surface");
|
|
321
327
|
lines.push("");
|
|
322
|
-
lines.push(
|
|
328
|
+
lines.push(renderGateFindings(q3));
|
|
323
329
|
lines.push("");
|
|
324
330
|
}
|
|
325
331
|
const q4 = gates.find(g => g.gate_id === "Q4" && g.status === "complete");
|
|
326
332
|
if (q4 && q4.verdict !== "omitted") {
|
|
327
333
|
lines.push("## Requirement Impact");
|
|
328
334
|
lines.push("");
|
|
329
|
-
lines.push(
|
|
335
|
+
lines.push(renderGateFindings(q4));
|
|
330
336
|
lines.push("");
|
|
331
337
|
}
|
|
332
338
|
const proofLevel = meaningfulSection(slice.proof_level);
|
|
@@ -518,13 +524,8 @@ export async function renderRoadmapFromDb(basePath, milestoneId) {
|
|
|
518
524
|
* @returns true if the roadmap was written, false on skip/error
|
|
519
525
|
*/
|
|
520
526
|
export async function renderRoadmapCheckboxes(basePath, milestoneId) {
|
|
521
|
-
const
|
|
522
|
-
|
|
523
|
-
process.stderr.write(`markdown-renderer: no slices found for milestone ${milestoneId}\n`);
|
|
524
|
-
return false;
|
|
525
|
-
}
|
|
526
|
-
await renderRoadmapFromDb(basePath, milestoneId);
|
|
527
|
-
return true;
|
|
527
|
+
const rendered = await renderRoadmapFromDb(basePath, milestoneId);
|
|
528
|
+
return !("skipped" in rendered);
|
|
528
529
|
}
|
|
529
530
|
/**
|
|
530
531
|
* Project milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from
|
|
@@ -706,6 +707,17 @@ export async function renderSliceSummary(basePath, milestoneId, sliceId) {
|
|
|
706
707
|
export async function renderAllFromDb(basePath) {
|
|
707
708
|
const result = { rendered: 0, skipped: 0, errors: [] };
|
|
708
709
|
const milestones = getAllMilestones();
|
|
710
|
+
// Pre-fetch slices once per milestone and batch-load all tasks in one query
|
|
711
|
+
// family, avoiding an N+1 (previously one task query per slice).
|
|
712
|
+
const slicesByMilestone = new Map();
|
|
713
|
+
const slicePairs = [];
|
|
714
|
+
for (const milestone of milestones) {
|
|
715
|
+
const slices = getMilestoneSlices(milestone.id);
|
|
716
|
+
slicesByMilestone.set(milestone.id, slices);
|
|
717
|
+
for (const slice of slices)
|
|
718
|
+
slicePairs.push({ milestoneId: milestone.id, sliceId: slice.id });
|
|
719
|
+
}
|
|
720
|
+
const tasksBySlice = getTasksBySliceIds(slicePairs);
|
|
709
721
|
for (const milestone of milestones) {
|
|
710
722
|
// Render roadmap checkboxes
|
|
711
723
|
try {
|
|
@@ -728,8 +740,8 @@ export async function renderAllFromDb(basePath) {
|
|
|
728
740
|
catch (err) {
|
|
729
741
|
result.errors.push(`milestone artifacts ${milestone.id}: ${err.message}`);
|
|
730
742
|
}
|
|
731
|
-
// Iterate slices
|
|
732
|
-
const slices =
|
|
743
|
+
// Iterate slices (pre-fetched above)
|
|
744
|
+
const slices = slicesByMilestone.get(milestone.id) ?? [];
|
|
733
745
|
for (const slice of slices) {
|
|
734
746
|
// Preserve slice-scoped artifacts imported from disk, including real PLAN
|
|
735
747
|
// fallback content when task rows cannot regenerate it.
|
|
@@ -765,8 +777,8 @@ export async function renderAllFromDb(basePath) {
|
|
|
765
777
|
catch (err) {
|
|
766
778
|
result.errors.push(`slice summary ${milestone.id}/${slice.id}: ${err.message}`);
|
|
767
779
|
}
|
|
768
|
-
// Iterate tasks
|
|
769
|
-
const tasks =
|
|
780
|
+
// Iterate tasks (batched above)
|
|
781
|
+
const tasks = tasksBySlice.get(`${milestone.id}\0${slice.id}`) ?? [];
|
|
770
782
|
for (const task of tasks) {
|
|
771
783
|
try {
|
|
772
784
|
const ok = await renderTaskSummary(basePath, milestone.id, slice.id, task.id);
|
|
@@ -33,8 +33,8 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
33
33
|
* decision is checked individually; only decisions whose id is already
|
|
34
34
|
* present in the memory store are skipped. A user-authored memory with
|
|
35
35
|
* their own `sourceDecisionId` does NOT abort the backfill.
|
|
36
|
-
* - Best-effort: never throws.
|
|
37
|
-
* backfill cannot block
|
|
36
|
+
* - Best-effort: never throws. Failed memory inserts are logged and skipped;
|
|
37
|
+
* setup/read failures log and return 0 so backfill cannot block startup.
|
|
38
38
|
* - Full migration (ADR-013 Stage 2a): both active and superseded rows are
|
|
39
39
|
* migrated. `structured_fields.superseded_by` preserves the supersedes
|
|
40
40
|
* chain so the DECISIONS.md projection regen can source from memories
|
|
@@ -117,25 +117,32 @@ export function backfillDecisionsToMemories() {
|
|
|
117
117
|
continue;
|
|
118
118
|
}
|
|
119
119
|
const content = synthesizeDecisionMemoryContent(row);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
120
|
+
try {
|
|
121
|
+
const id = createMemory({
|
|
122
|
+
category: "architecture",
|
|
123
|
+
content,
|
|
124
|
+
scope: row.scope || "project",
|
|
125
|
+
confidence: 0.85,
|
|
126
|
+
structuredFields: {
|
|
127
|
+
sourceDecisionId: row.id,
|
|
128
|
+
when_context: row.when_context,
|
|
129
|
+
scope: row.scope,
|
|
130
|
+
decision: row.decision,
|
|
131
|
+
choice: row.choice,
|
|
132
|
+
rationale: row.rationale,
|
|
133
|
+
made_by: row.made_by,
|
|
134
|
+
revisable: row.revisable,
|
|
135
|
+
superseded_by: row.superseded_by,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
if (id)
|
|
139
|
+
written += 1;
|
|
140
|
+
}
|
|
141
|
+
catch (rowErr) {
|
|
142
|
+
const message = rowErr instanceof Error ? rowErr.message : String(rowErr);
|
|
143
|
+
logWarning("memory-backfill", `decisions->memories backfill skipped ${row.id}: ${message}`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
139
146
|
}
|
|
140
147
|
if (healed > 0) {
|
|
141
148
|
logWarning("memory-backfill", `decisions->memories drift healed: ${healed} row${healed === 1 ? "" : "s"} updated superseded_by`);
|
|
@@ -17,7 +17,7 @@ import { join } from "node:path";
|
|
|
17
17
|
import { openSync, closeSync, unlinkSync, statSync, writeFileSync } from "node:fs";
|
|
18
18
|
import { gsdRoot } from "./paths.js";
|
|
19
19
|
import { getAndClearSkills } from "./skill-telemetry.js";
|
|
20
|
-
import { loadJsonFile, loadJsonFileOrNull,
|
|
20
|
+
import { loadJsonFile, loadJsonFileOrNull, saveJsonFileCompact } from "./json-persistence.js";
|
|
21
21
|
import { parseUnitId } from "./unit-id.js";
|
|
22
22
|
import { buildAuditEnvelope, emitUokAuditEvent } from "./uok/audit.js";
|
|
23
23
|
import { isUnifiedAuditEnabled } from "./uok/audit-toggle.js";
|
|
@@ -636,7 +636,7 @@ export function pruneMetricsLedger(base, keepCount) {
|
|
|
636
636
|
return 0;
|
|
637
637
|
const removed = disk.units.length - keepCount;
|
|
638
638
|
disk.units = keepNewestUnits(disk.units, keepCount);
|
|
639
|
-
|
|
639
|
+
saveJsonFileCompact(metricsPath(base), disk);
|
|
640
640
|
// Keep the in-memory ledger in sync if it is loaded for this session.
|
|
641
641
|
if (ledger) {
|
|
642
642
|
ledger.units = keepNewestUnits(ledger.units, keepCount);
|
|
@@ -799,7 +799,7 @@ function saveLedger(base, data) {
|
|
|
799
799
|
: dataUnits;
|
|
800
800
|
merged.sort(compareUnitsByTime);
|
|
801
801
|
data.units = keepNewestUnits(merged);
|
|
802
|
-
|
|
802
|
+
saveJsonFileCompact(path, data);
|
|
803
803
|
}
|
|
804
804
|
finally {
|
|
805
805
|
releaseLock(lockPath);
|
|
@@ -813,6 +813,6 @@ function saveLedger(base, data) {
|
|
|
813
813
|
// read-merge-write sequence without mutual exclusion.
|
|
814
814
|
logWarning("fs", "saveLedger: lock not acquired — falling back to direct write (no merge)");
|
|
815
815
|
data.units = keepNewestUnits(data.units);
|
|
816
|
-
|
|
816
|
+
saveJsonFileCompact(path, data);
|
|
817
817
|
}
|
|
818
818
|
}
|
|
@@ -110,6 +110,7 @@ export function migrateToExternalState(basePath) {
|
|
|
110
110
|
}
|
|
111
111
|
// Copy contents to external dir, skipping worktrees/
|
|
112
112
|
const entries = readdirSync(migratingPath, { withFileTypes: true });
|
|
113
|
+
const copyFailures = [];
|
|
113
114
|
for (const entry of entries) {
|
|
114
115
|
if (entry.name === "worktrees")
|
|
115
116
|
continue; // worktrees stay local
|
|
@@ -123,9 +124,17 @@ export function migrateToExternalState(basePath) {
|
|
|
123
124
|
cpSync(src, dst, { force: true });
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
|
-
catch {
|
|
127
|
-
|
|
127
|
+
catch (copyErr) {
|
|
128
|
+
copyFailures.push(`${entry.name}: ${getErrorMessage(copyErr)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (copyFailures.length > 0) {
|
|
132
|
+
try {
|
|
133
|
+
rmSync(localGsd, { force: true });
|
|
128
134
|
}
|
|
135
|
+
catch { /* may not exist */ }
|
|
136
|
+
renameSync(migratingPath, localGsd);
|
|
137
|
+
return { migrated: false, error: `Migration copy failed: ${copyFailures.join("; ")}` };
|
|
129
138
|
}
|
|
130
139
|
// Create symlink .gsd -> external path
|
|
131
140
|
symlinkSync(externalPath, localGsd, "junction");
|
|
@@ -230,7 +239,7 @@ function isLocalGsdExternalStateJunction(basePath, localGsd) {
|
|
|
230
239
|
* Recover from a failed migration (`.gsd.migrating` exists).
|
|
231
240
|
* Moves `.gsd.migrating` back to `.gsd` if `.gsd` doesn't exist, or removes an
|
|
232
241
|
* orphaned staging directory when `.gsd` is already a verified external state
|
|
233
|
-
* junction with intact current state.
|
|
242
|
+
* junction, or an intact real directory, with intact current state.
|
|
234
243
|
*/
|
|
235
244
|
export function recoverFailedMigration(basePath) {
|
|
236
245
|
const localGsd = join(basePath, ".gsd");
|
|
@@ -238,10 +247,18 @@ export function recoverFailedMigration(basePath) {
|
|
|
238
247
|
if (!existsSync(migratingPath))
|
|
239
248
|
return false;
|
|
240
249
|
if (existsSync(localGsd)) {
|
|
241
|
-
if (!isLocalGsdExternalStateJunction(basePath, localGsd))
|
|
242
|
-
return false;
|
|
243
250
|
if (!isCurrentGsdStateIntactForMigratingCleanup(basePath))
|
|
244
251
|
return false;
|
|
252
|
+
if (!isLocalGsdExternalStateJunction(basePath, localGsd)) {
|
|
253
|
+
try {
|
|
254
|
+
const stat = lstatSync(localGsd);
|
|
255
|
+
if (!stat.isDirectory())
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
245
262
|
try {
|
|
246
263
|
rmSync(migratingPath, { recursive: true, force: true });
|
|
247
264
|
return true;
|
|
@@ -45,6 +45,27 @@ function scanHasExtraIdentities(a, b) {
|
|
|
45
45
|
hasExtra(a.slices, b.slices) ||
|
|
46
46
|
hasExtra(a.tasks, b.tasks));
|
|
47
47
|
}
|
|
48
|
+
function paddedMilestoneId(id) {
|
|
49
|
+
return /^\d+$/.test(id) ? `M${id.padStart(3, "0")}` : null;
|
|
50
|
+
}
|
|
51
|
+
function replaceSetPrefix(values, from, to) {
|
|
52
|
+
for (const value of [...values]) {
|
|
53
|
+
if (value !== from && !value.startsWith(`${from}/`))
|
|
54
|
+
continue;
|
|
55
|
+
values.delete(value);
|
|
56
|
+
values.add(`${to}${value.slice(from.length)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function alignNumericMarkdownIdsWithDb(markdownScan, dbScan) {
|
|
60
|
+
for (const dbId of dbScan.milestones) {
|
|
61
|
+
const paddedId = paddedMilestoneId(dbId);
|
|
62
|
+
if (!paddedId || dbScan.milestones.has(paddedId) || !markdownScan.milestones.has(paddedId))
|
|
63
|
+
continue;
|
|
64
|
+
replaceSetPrefix(markdownScan.milestones, paddedId, dbId);
|
|
65
|
+
replaceSetPrefix(markdownScan.slices, paddedId, dbId);
|
|
66
|
+
replaceSetPrefix(markdownScan.tasks, paddedId, dbId);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
48
69
|
/**
|
|
49
70
|
* True when the DB holds any milestone/slice/task identity the markdown lacks —
|
|
50
71
|
* i.e. a `/gsd recover --confirm` (markdown → DB) would DELETE authoritative DB
|
|
@@ -126,6 +147,7 @@ export async function checkMarkdownHierarchyAgainstDb(basePath) {
|
|
|
126
147
|
refreshWorkflowDatabaseFromDisk();
|
|
127
148
|
const dbScan = scanDbHierarchy();
|
|
128
149
|
const beforeDb = dbScan.counts;
|
|
150
|
+
alignNumericMarkdownIdsWithDb(markdownScan, dbScan);
|
|
129
151
|
// Discussion-phase scratch: a milestone dir with no ROADMAP and no DB row is
|
|
130
152
|
// a pre-registration discussion artifact (CONTEXT/CONTEXT-DRAFT only — the
|
|
131
153
|
// queued DB row is inserted only at discussion handoff). Treating it as
|
|
@@ -123,7 +123,8 @@ export function clearReservedMilestoneIds() {
|
|
|
123
123
|
reservedMilestoneIds.clear();
|
|
124
124
|
}
|
|
125
125
|
// ─── Discovery ──────────────────────────────────────────────────────────────
|
|
126
|
-
function scanMilestoneIdsFromDir(dir) {
|
|
126
|
+
function scanMilestoneIdsFromDir(basePath, dir) {
|
|
127
|
+
const legacyNumericIds = idsWithLegacyNumericDirs(basePath);
|
|
127
128
|
return readdirSync(dir, { withFileTypes: true })
|
|
128
129
|
.filter((d) => d.isDirectory())
|
|
129
130
|
.map((d) => {
|
|
@@ -131,6 +132,12 @@ function scanMilestoneIdsFromDir(dir) {
|
|
|
131
132
|
if (MILESTONE_ID_RE.test(d.name)) {
|
|
132
133
|
return d.name;
|
|
133
134
|
}
|
|
135
|
+
// Legacy recovery/imports may contain bare numeric milestone directories
|
|
136
|
+
// (for example `milestones/15/15-ROADMAP.md`). The DB can preserve that
|
|
137
|
+
// id, and rebuild renders it, so drift scans must see it too.
|
|
138
|
+
if (/^\d+$/.test(d.name)) {
|
|
139
|
+
return d.name;
|
|
140
|
+
}
|
|
134
141
|
// Legacy layout: M001-abcdef-slug descriptor directories
|
|
135
142
|
const legacyMatch = d.name.match(/^(M\d{3}(?:-[a-z0-9]{6})?)-/);
|
|
136
143
|
if (legacyMatch) {
|
|
@@ -144,12 +151,35 @@ function scanMilestoneIdsFromDir(dir) {
|
|
|
144
151
|
if (MILESTONE_ID_RE.test(fromSlug)) {
|
|
145
152
|
return fromSlug;
|
|
146
153
|
}
|
|
154
|
+
const numericId = String(phaseNum);
|
|
155
|
+
if (legacyNumericIds.has(numericId)) {
|
|
156
|
+
return numericId;
|
|
157
|
+
}
|
|
147
158
|
return `M${String(phaseNum).padStart(3, "0")}`;
|
|
148
159
|
}
|
|
149
160
|
return null;
|
|
150
161
|
})
|
|
151
162
|
.filter((id) => id !== null);
|
|
152
163
|
}
|
|
164
|
+
function idsWithLegacyNumericDirs(basePath) {
|
|
165
|
+
const legacyDir = join(gsdProjectionRoot(basePath), "milestones");
|
|
166
|
+
const ids = new Set();
|
|
167
|
+
try {
|
|
168
|
+
for (const entry of readdirSync(legacyDir, { withFileTypes: true })) {
|
|
169
|
+
if (entry.isDirectory() && /^\d+$/.test(entry.name))
|
|
170
|
+
ids.add(entry.name);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
// A missing legacy directory is the common, benign case (nothing to
|
|
175
|
+
// consult). Only surface a real failure when the directory exists but
|
|
176
|
+
// could not be read.
|
|
177
|
+
if (existsSync(legacyDir)) {
|
|
178
|
+
logWarning("engine", `idsWithLegacyNumericDirs: ${legacyDir} exists but readdirSync failed — ${getErrorMessage(err)}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return ids;
|
|
182
|
+
}
|
|
153
183
|
/** Scan the milestones directory and return IDs sorted by queue order (or numeric fallback). */
|
|
154
184
|
export function findMilestoneIds(basePath) {
|
|
155
185
|
const root = gsdProjectionRoot(basePath);
|
|
@@ -163,7 +193,7 @@ export function findMilestoneIds(basePath) {
|
|
|
163
193
|
const ids = new Set();
|
|
164
194
|
for (const dir of dirs) {
|
|
165
195
|
try {
|
|
166
|
-
for (const id of scanMilestoneIdsFromDir(dir))
|
|
196
|
+
for (const id of scanMilestoneIdsFromDir(basePath, dir))
|
|
167
197
|
ids.add(id);
|
|
168
198
|
}
|
|
169
199
|
catch (err) {
|
|
@@ -26,16 +26,78 @@ function _isAlreadyRestoredApplyError(err) {
|
|
|
26
26
|
return /already exists, no checkout/i.test(message);
|
|
27
27
|
}
|
|
28
28
|
export { _isAlreadyRestoredApplyError };
|
|
29
|
+
function gitOutput(basePath, args) {
|
|
30
|
+
return execFileSync("git", args, {
|
|
31
|
+
cwd: basePath,
|
|
32
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
33
|
+
encoding: "utf-8",
|
|
34
|
+
env: GIT_NO_PROMPT_ENV,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function listStashUntrackedPaths(basePath, stashRef) {
|
|
38
|
+
try {
|
|
39
|
+
return gitOutput(basePath, ["ls-tree", "-r", "-z", "--name-only", `${stashRef}^3`]).split("\0").filter(Boolean);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function listStashTrackedPaths(basePath, stashRef) {
|
|
46
|
+
try {
|
|
47
|
+
return gitOutput(basePath, ["diff", "--name-only", "-z", `${stashRef}^1`, stashRef]).split("\0").filter(Boolean);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function readWorkingTreeStatus(basePath) {
|
|
54
|
+
try {
|
|
55
|
+
return gitOutput(basePath, ["status", "--porcelain", "-z", "--untracked-files=all"])
|
|
56
|
+
.split("\0")
|
|
57
|
+
.filter(Boolean)
|
|
58
|
+
.map((entry) => ({ code: entry.slice(0, 2), path: entry.slice(3) }));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function isAlreadyRestoredUntrackedStatus(basePath, stashRef, statusEntries) {
|
|
65
|
+
if (statusEntries.length === 0 || statusEntries.some((entry) => entry.code !== "??"))
|
|
66
|
+
return false;
|
|
67
|
+
const stashTrackedPaths = listStashTrackedPaths(basePath, stashRef);
|
|
68
|
+
if (!stashTrackedPaths || stashTrackedPaths.length > 0)
|
|
69
|
+
return false;
|
|
70
|
+
const stashUntrackedPaths = listStashUntrackedPaths(basePath, stashRef);
|
|
71
|
+
if (!stashUntrackedPaths || stashUntrackedPaths.length === 0)
|
|
72
|
+
return false;
|
|
73
|
+
const stashUntrackedPathSet = new Set(stashUntrackedPaths);
|
|
74
|
+
const workingTreeUntrackedPathSet = new Set(statusEntries.map((entry) => entry.path));
|
|
75
|
+
// "Already restored" requires the working tree's untracked paths to match the
|
|
76
|
+
// stash's untracked paths exactly, in BOTH directions:
|
|
77
|
+
// 1. every current untracked path comes from the stash (no unexplained user
|
|
78
|
+
// work that an apply would clobber), AND
|
|
79
|
+
// 2. every stash untracked path is already present in the working tree.
|
|
80
|
+
// Without (2), a partial restore (where only some stash files were recovered)
|
|
81
|
+
// would be misread as fully restored: the audit would no-op without applying
|
|
82
|
+
// or warning, leaving the remaining pre-merge files missing.
|
|
83
|
+
return (statusEntries.every((entry) => stashUntrackedPathSet.has(entry.path)) &&
|
|
84
|
+
stashUntrackedPaths.every((path) => workingTreeUntrackedPathSet.has(path)));
|
|
85
|
+
}
|
|
86
|
+
function manualApplyWarning(stashRef, milestoneId, reason) {
|
|
87
|
+
return (`Pre-merge stash ${stashRef} for milestone ${milestoneId} not auto-applied: ${reason}; ` +
|
|
88
|
+
`run \`git stash apply ${stashRef}\` manually to restore your pre-merge changes.`);
|
|
89
|
+
}
|
|
29
90
|
/**
|
|
30
91
|
* Audit `git stash list` for orphaned `gsd-preflight-stash:M00x:*` entries.
|
|
31
92
|
*
|
|
32
93
|
* The matching merge code in `phases.ts` previously skipped the postflight
|
|
33
94
|
* pop whenever `mergeAndExit` threw, leaking the user's pre-merge working
|
|
34
|
-
* tree into the stash list.
|
|
35
|
-
*
|
|
95
|
+
* tree into the stash list. Completed-milestone stashes are only auto-applied
|
|
96
|
+
* when the working tree is clean and the stash does not modify tracked files.
|
|
97
|
+
* Dirty trees and tracked-file stashes are left untouched with a manual
|
|
98
|
+
* recovery warning. When auto-apply is safe, `git stash apply` is invoked —
|
|
36
99
|
* NOT `pop`. The stash entry stays in the list so the user retains a backup
|
|
37
|
-
* if the apply produces unexpected merge results.
|
|
38
|
-
* startup runs.
|
|
100
|
+
* if the apply produces unexpected merge results.
|
|
39
101
|
*
|
|
40
102
|
* Failures are best-effort: a list error (no repo, git unavailable) returns
|
|
41
103
|
* an empty result. An apply error becomes a warning the user sees alongside
|
|
@@ -45,12 +107,7 @@ export function auditOrphanedPreflightStashes(basePath, isMilestoneComplete) {
|
|
|
45
107
|
const result = { applied: [], warnings: [] };
|
|
46
108
|
let listOutput;
|
|
47
109
|
try {
|
|
48
|
-
listOutput =
|
|
49
|
-
cwd: basePath,
|
|
50
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
51
|
-
encoding: "utf-8",
|
|
52
|
-
env: GIT_NO_PROMPT_ENV,
|
|
53
|
-
});
|
|
110
|
+
listOutput = gitOutput(basePath, ["stash", "list", "--format=%gd%x00%s"]);
|
|
54
111
|
}
|
|
55
112
|
catch {
|
|
56
113
|
return result;
|
|
@@ -78,13 +135,32 @@ export function auditOrphanedPreflightStashes(basePath, isMilestoneComplete) {
|
|
|
78
135
|
}
|
|
79
136
|
if (!complete)
|
|
80
137
|
continue;
|
|
138
|
+
const statusEntries = readWorkingTreeStatus(basePath);
|
|
139
|
+
if (!statusEntries) {
|
|
140
|
+
result.warnings.push(manualApplyWarning(ref, milestoneId, "could not verify working tree status"));
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (statusEntries.length > 0) {
|
|
144
|
+
if (isAlreadyRestoredUntrackedStatus(basePath, ref, statusEntries))
|
|
145
|
+
continue;
|
|
146
|
+
result.warnings.push(manualApplyWarning(ref, milestoneId, "working tree not clean"));
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const trackedPaths = listStashTrackedPaths(basePath, ref);
|
|
150
|
+
if (trackedPaths === null) {
|
|
151
|
+
result.warnings.push(manualApplyWarning(ref, milestoneId, "could not inspect tracked paths in stash"));
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (trackedPaths.length > 0) {
|
|
155
|
+
// A retained tracked-file stash has no durable marker showing whether a
|
|
156
|
+
// clean tree needs first recovery or would be re-mutated by an old backup.
|
|
157
|
+
const preview = trackedPaths.slice(0, 5).join(", ");
|
|
158
|
+
const suffix = trackedPaths.length > 5 ? `, and ${trackedPaths.length - 5} more` : "";
|
|
159
|
+
result.warnings.push(manualApplyWarning(ref, milestoneId, `stash modifies tracked files (${preview}${suffix})`));
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
81
162
|
try {
|
|
82
|
-
|
|
83
|
-
cwd: basePath,
|
|
84
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
85
|
-
encoding: "utf-8",
|
|
86
|
-
env: GIT_NO_PROMPT_ENV,
|
|
87
|
-
});
|
|
163
|
+
gitOutput(basePath, ["stash", "apply", "--quiet", ref]);
|
|
88
164
|
result.applied.push({ milestoneId, stashRef: ref });
|
|
89
165
|
}
|
|
90
166
|
catch (err) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { loadGlobalGSDPreferences, loadProjectGSDPreferences, } from "./preferences.js";
|
|
1
|
+
import { loadEffectiveGSDPreferences, loadGlobalGSDPreferences, loadProjectGSDPreferences, } from "./preferences.js";
|
|
2
|
+
import { crossAxisPreferenceWarnings } from "./preferences-validation.js";
|
|
2
3
|
const notifiedPreferenceDiagnostics = new Set();
|
|
3
4
|
export function collectPreferenceDiagnostics(basePath) {
|
|
4
5
|
const diagnostics = [
|
|
@@ -14,6 +15,28 @@ export function collectPreferenceDiagnostics(basePath) {
|
|
|
14
15
|
seen.add(signature);
|
|
15
16
|
unique.push(diagnostic);
|
|
16
17
|
}
|
|
18
|
+
const effective = loadEffectiveGSDPreferences(basePath);
|
|
19
|
+
if (effective) {
|
|
20
|
+
const existingMessages = new Set(unique.map((diagnostic) => diagnostic.message));
|
|
21
|
+
for (const message of crossAxisPreferenceWarnings(effective.preferences)) {
|
|
22
|
+
if (existingMessages.has(message))
|
|
23
|
+
continue;
|
|
24
|
+
const diagnostic = {
|
|
25
|
+
path: effective.path,
|
|
26
|
+
scope: effective.scope,
|
|
27
|
+
severity: "warning",
|
|
28
|
+
kind: "validation",
|
|
29
|
+
message,
|
|
30
|
+
sanitized: true,
|
|
31
|
+
};
|
|
32
|
+
const signature = preferenceDiagnosticSignature(diagnostic);
|
|
33
|
+
if (seen.has(signature))
|
|
34
|
+
continue;
|
|
35
|
+
seen.add(signature);
|
|
36
|
+
existingMessages.add(message);
|
|
37
|
+
unique.push(diagnostic);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
17
40
|
return unique;
|
|
18
41
|
}
|
|
19
42
|
export function formatPreferenceDiagnostic(diagnostic) {
|
|
@@ -74,10 +74,12 @@ function resolveWinningPhase(models, chain) {
|
|
|
74
74
|
* - Legacy: `planning: claude-opus-4-6`
|
|
75
75
|
* - Extended: `planning: { model: claude-opus-4-6, fallbacks: [glm-5, minimax-m2.5] }`
|
|
76
76
|
*/
|
|
77
|
-
export function resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId) {
|
|
78
|
-
const loadOpts =
|
|
79
|
-
? { availableModelIds
|
|
80
|
-
:
|
|
77
|
+
export function resolveModelWithFallbacksForUnit(unitType, basePath, availableModelIds, preferredModelId, skipProfileDefaults = false) {
|
|
78
|
+
const loadOpts = {
|
|
79
|
+
...(availableModelIds !== undefined ? { availableModelIds } : {}),
|
|
80
|
+
...(preferredModelId !== undefined ? { preferredModelId } : {}),
|
|
81
|
+
...(skipProfileDefaults ? { skipProfileDefaults: true } : {}),
|
|
82
|
+
};
|
|
81
83
|
const prefs = loadEffectiveGSDPreferences(basePath, loadOpts);
|
|
82
84
|
const chain = phaseChainForUnit(unitType);
|
|
83
85
|
if (!chain)
|
|
@@ -34,6 +34,15 @@ const VALID_POST_UNIT_HOOK_ON_BLOCK_ACTIONS = new Set([
|
|
|
34
34
|
"pause",
|
|
35
35
|
]);
|
|
36
36
|
const VALID_GATE_EVALUATE_SLICE_GATES = new Set(getGateIdsForTurn("gate-evaluate"));
|
|
37
|
+
/** Cross-axis warnings that only apply to the effective (merged) preference shape. */
|
|
38
|
+
export function crossAxisPreferenceWarnings(preferences) {
|
|
39
|
+
if (preferences.mode === "team" && preferences.workspace?.mode === "parent") {
|
|
40
|
+
return [
|
|
41
|
+
"mode:team + workspace.mode:parent: team branch-push/PR resolves at the project root and will not push child repositories — see docs/dev/ADR-044",
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
37
46
|
export function validatePreferences(preferences) {
|
|
38
47
|
const errors = [];
|
|
39
48
|
const warnings = [];
|
|
@@ -489,8 +498,12 @@ export function validatePreferences(preferences) {
|
|
|
489
498
|
}
|
|
490
499
|
// ─── Remote Questions ───────────────────────────────────────────────
|
|
491
500
|
if (preferences.remote_questions !== undefined) {
|
|
492
|
-
|
|
493
|
-
|
|
501
|
+
const remoteQuestions = preferences.remote_questions;
|
|
502
|
+
if (typeof remoteQuestions === "object" && remoteQuestions !== null) {
|
|
503
|
+
validated.remote_questions = remoteQuestions;
|
|
504
|
+
}
|
|
505
|
+
else if (remoteQuestions === false) {
|
|
506
|
+
// Explicit disable for a globally-configured remote questions channel.
|
|
494
507
|
}
|
|
495
508
|
else {
|
|
496
509
|
errors.push("remote_questions must be an object");
|
|
@@ -1524,6 +1537,15 @@ export function validatePreferences(preferences) {
|
|
|
1524
1537
|
else {
|
|
1525
1538
|
errors.push("workspace must be an object");
|
|
1526
1539
|
}
|
|
1540
|
+
// parent mode is behavioral: it must coordinate at least one declared
|
|
1541
|
+
// child repository. Without one it is indistinguishable from project
|
|
1542
|
+
// mode, so reject it explicitly rather than silently degrading.
|
|
1543
|
+
if (validated.workspace?.mode === "parent") {
|
|
1544
|
+
const childRepoCount = validated.workspace.repositories ? Object.keys(validated.workspace.repositories).length : 0;
|
|
1545
|
+
if (childRepoCount === 0) {
|
|
1546
|
+
errors.push('workspace.mode "parent" requires at least one repository under workspace.repositories');
|
|
1547
|
+
}
|
|
1548
|
+
}
|
|
1527
1549
|
}
|
|
1528
1550
|
// ─── Enhanced Verification ──────────────────────────────────────────────────
|
|
1529
1551
|
if (preferences.enhanced_verification !== undefined) {
|
|
@@ -1596,5 +1618,6 @@ export function validatePreferences(preferences) {
|
|
|
1596
1618
|
errors.push(`language must be a non-empty string up to 50 characters with no newlines (e.g. "Chinese", "de", "日本語")`);
|
|
1597
1619
|
}
|
|
1598
1620
|
}
|
|
1621
|
+
warnings.push(...crossAxisPreferenceWarnings(validated));
|
|
1599
1622
|
return { preferences: validated, errors, warnings };
|
|
1600
1623
|
}
|