@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
|
@@ -533,6 +533,19 @@ export function buildCategorySummaries(prefs) {
|
|
|
533
533
|
if (parts.length > 0)
|
|
534
534
|
integrationsSummary = parts.join(", ");
|
|
535
535
|
}
|
|
536
|
+
// Workspace (parent-workspace multi-repo)
|
|
537
|
+
const workspace = prefs.workspace;
|
|
538
|
+
const workspaceRepos = workspace?.repositories;
|
|
539
|
+
let workspaceSummary = "(single-repo)";
|
|
540
|
+
{
|
|
541
|
+
const parts = [];
|
|
542
|
+
if (workspace?.mode)
|
|
543
|
+
parts.push(`mode: ${workspace.mode}`);
|
|
544
|
+
if (workspaceRepos && Object.keys(workspaceRepos).length > 0)
|
|
545
|
+
parts.push(`${Object.keys(workspaceRepos).length} repo(s)`);
|
|
546
|
+
if (parts.length > 0)
|
|
547
|
+
workspaceSummary = parts.join(", ");
|
|
548
|
+
}
|
|
536
549
|
return {
|
|
537
550
|
mode: modeSummary,
|
|
538
551
|
models: modelsSummary,
|
|
@@ -550,6 +563,7 @@ export function buildCategorySummaries(prefs) {
|
|
|
550
563
|
hooks: hooksSummary,
|
|
551
564
|
uok: uokSummary,
|
|
552
565
|
integrations: integrationsSummary,
|
|
566
|
+
workspace: workspaceSummary,
|
|
553
567
|
};
|
|
554
568
|
}
|
|
555
569
|
// ─── Category configuration functions ────────────────────────────────────────
|
|
@@ -716,7 +730,10 @@ async function configureDynamicRouting(ctx, prefs) {
|
|
|
716
730
|
const hooks = await promptBoolean(ctx, "Route hook sessions dynamically", dr.hooks, true);
|
|
717
731
|
if (hooks !== undefined)
|
|
718
732
|
dr.hooks = hooks;
|
|
719
|
-
|
|
733
|
+
// Opt-out flag (#1115): routing is allowed for flat-rate providers by
|
|
734
|
+
// default; only an explicit `false` suppresses it. The default hint reflects
|
|
735
|
+
// that allow-by-default behavior.
|
|
736
|
+
const flatRate = await promptBoolean(ctx, "Allow dynamic routing for flat-rate providers", dr.allow_flat_rate_providers, true);
|
|
720
737
|
if (flatRate !== undefined)
|
|
721
738
|
dr.allow_flat_rate_providers = flatRate;
|
|
722
739
|
// tier_models.light / standard / heavy — optional model IDs
|
|
@@ -892,6 +909,135 @@ async function configureSkills(ctx, prefs) {
|
|
|
892
909
|
const staleness = await promptInteger(ctx, "Skill staleness days (0 to disable)", prefs.skill_staleness_days, "60");
|
|
893
910
|
applyNumber(prefs, "skill_staleness_days", staleness);
|
|
894
911
|
}
|
|
912
|
+
async function configureWorkspace(ctx, prefs) {
|
|
913
|
+
let workspace = (prefs.workspace ?? {});
|
|
914
|
+
// Mode
|
|
915
|
+
const mode = await promptEnum(ctx, "Workspace mode", workspace.mode, ["project", "parent"]);
|
|
916
|
+
if (mode !== undefined)
|
|
917
|
+
workspace = { ...workspace, mode: mode };
|
|
918
|
+
if (workspace.mode !== "parent") {
|
|
919
|
+
// Single-repo mode: drop any declared repositories and persist.
|
|
920
|
+
if (workspace.repositories && Object.keys(workspace.repositories).length > 0) {
|
|
921
|
+
const clear = await promptBoolean(ctx, "Clear declared repositories (switch to single-repo)?", false, false);
|
|
922
|
+
if (clear)
|
|
923
|
+
workspace = { mode: workspace.mode };
|
|
924
|
+
}
|
|
925
|
+
persistWorkspace(prefs, workspace);
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
// Parent mode — edit child repositories via a sub-menu.
|
|
929
|
+
let repositories = { ...(workspace.repositories ?? {}) };
|
|
930
|
+
while (true) {
|
|
931
|
+
const ids = Object.keys(repositories).sort();
|
|
932
|
+
const summary = ids.length === 0 ? "(no repositories — parent mode requires at least one)" : `${ids.length} repo(s)`;
|
|
933
|
+
const listLabels = ids.map((id) => {
|
|
934
|
+
const r = repositories[id];
|
|
935
|
+
const roleStr = r.role ? ` — ${r.role}` : "";
|
|
936
|
+
const policyStr = r.commit_policy === "skip" ? " [skip]" : "";
|
|
937
|
+
return `${id} (${r.path})${roleStr}${policyStr}`;
|
|
938
|
+
});
|
|
939
|
+
const choice = await ctx.ui.select(`Declared repositories — ${summary}`, [...listLabels, "Add repository", "Done"]);
|
|
940
|
+
const pick = typeof choice === "string" ? choice : "";
|
|
941
|
+
if (!pick || pick === "Done")
|
|
942
|
+
break;
|
|
943
|
+
if (pick === "Add repository") {
|
|
944
|
+
const idInput = await ctx.ui.input("Repository id (letters, digits, . _ -; 'project' is reserved):", "");
|
|
945
|
+
const id = typeof idInput === "string" ? idInput.trim() : "";
|
|
946
|
+
if (!id || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(id)) {
|
|
947
|
+
ctx.ui.notify("Invalid repository id — must match ^[A-Za-z0-9][A-Za-z0-9._-]*$ and cannot be 'project'.", "warning");
|
|
948
|
+
continue;
|
|
949
|
+
}
|
|
950
|
+
if (id === "project" || repositories[id]) {
|
|
951
|
+
ctx.ui.notify(`Repository id "${id}" is reserved or already declared.`, "warning");
|
|
952
|
+
continue;
|
|
953
|
+
}
|
|
954
|
+
const pathInput = await ctx.ui.input("Repository path (relative to project root, e.g. frontend):", "");
|
|
955
|
+
const path = typeof pathInput === "string" ? pathInput.trim() : "";
|
|
956
|
+
if (!path) {
|
|
957
|
+
ctx.ui.notify("Repository path is required.", "warning");
|
|
958
|
+
continue;
|
|
959
|
+
}
|
|
960
|
+
const repo = { path };
|
|
961
|
+
const roleInput = await ctx.ui.input("Role/label (optional):", "");
|
|
962
|
+
if (typeof roleInput === "string" && roleInput.trim())
|
|
963
|
+
repo.role = roleInput.trim();
|
|
964
|
+
const verifyInput = await ctx.ui.input("Verification commands (comma- or newline-separated, optional):", "");
|
|
965
|
+
if (typeof verifyInput === "string" && verifyInput.trim()) {
|
|
966
|
+
const cmds = parseStringList(verifyInput);
|
|
967
|
+
if (cmds.length > 0)
|
|
968
|
+
repo.verification = cmds;
|
|
969
|
+
}
|
|
970
|
+
const policy = await promptEnum(ctx, "Commit policy", undefined, ["auto", "skip"]);
|
|
971
|
+
if (policy === "skip")
|
|
972
|
+
repo.commit_policy = "skip";
|
|
973
|
+
repositories[id] = repo;
|
|
974
|
+
}
|
|
975
|
+
else {
|
|
976
|
+
// Edit/delete an existing repo (the first token is the id).
|
|
977
|
+
const id = pick.split(" ")[0];
|
|
978
|
+
if (!repositories[id])
|
|
979
|
+
continue;
|
|
980
|
+
const editChoice = await ctx.ui.select(`Repository ${id}`, ["Edit path", "Edit role", "Edit verification", "Edit commit policy", "Delete repository", "Cancel"]);
|
|
981
|
+
const ec = typeof editChoice === "string" ? editChoice : "";
|
|
982
|
+
if (!ec || ec === "Cancel")
|
|
983
|
+
continue;
|
|
984
|
+
if (ec === "Delete repository") {
|
|
985
|
+
delete repositories[id];
|
|
986
|
+
}
|
|
987
|
+
else if (ec === "Edit path") {
|
|
988
|
+
const v = await ctx.ui.input("Repository path:", repositories[id].path);
|
|
989
|
+
if (typeof v === "string" && v.trim())
|
|
990
|
+
repositories[id] = { ...repositories[id], path: v.trim() };
|
|
991
|
+
}
|
|
992
|
+
else if (ec === "Edit role") {
|
|
993
|
+
const v = await ctx.ui.input("Role/label (blank to clear):", repositories[id].role ?? "");
|
|
994
|
+
if (typeof v === "string" && v.trim())
|
|
995
|
+
repositories[id] = { ...repositories[id], role: v.trim() };
|
|
996
|
+
else if (typeof v === "string") {
|
|
997
|
+
const { role, ...rest } = repositories[id];
|
|
998
|
+
void role;
|
|
999
|
+
repositories[id] = rest;
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
else if (ec === "Edit verification") {
|
|
1003
|
+
const v = await ctx.ui.input("Verification commands (blank to clear):", (repositories[id].verification ?? []).join(", "));
|
|
1004
|
+
if (typeof v === "string" && v.trim()) {
|
|
1005
|
+
const cmds = parseStringList(v);
|
|
1006
|
+
if (cmds.length > 0)
|
|
1007
|
+
repositories[id] = { ...repositories[id], verification: cmds };
|
|
1008
|
+
}
|
|
1009
|
+
else if (typeof v === "string") {
|
|
1010
|
+
const { verification, ...rest } = repositories[id];
|
|
1011
|
+
void verification;
|
|
1012
|
+
repositories[id] = rest;
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
else if (ec === "Edit commit policy") {
|
|
1016
|
+
const policy = await promptEnum(ctx, "Commit policy", repositories[id].commit_policy, ["auto", "skip"]);
|
|
1017
|
+
if (policy === "skip")
|
|
1018
|
+
repositories[id] = { ...repositories[id], commit_policy: "skip" };
|
|
1019
|
+
else {
|
|
1020
|
+
const { commit_policy, ...rest } = repositories[id];
|
|
1021
|
+
void commit_policy;
|
|
1022
|
+
repositories[id] = rest;
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
if (Object.keys(repositories).length === 0) {
|
|
1028
|
+
ctx.ui.notify("Parent mode requires at least one repository — mode not saved.", "warning");
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
persistWorkspace(prefs, { mode: "parent", repositories });
|
|
1032
|
+
}
|
|
1033
|
+
/** Persist the workspace config onto prefs, dropping it entirely when empty. */
|
|
1034
|
+
function persistWorkspace(prefs, workspace) {
|
|
1035
|
+
if (!workspace.mode && (!workspace.repositories || Object.keys(workspace.repositories).length === 0)) {
|
|
1036
|
+
delete prefs.workspace;
|
|
1037
|
+
return;
|
|
1038
|
+
}
|
|
1039
|
+
prefs.workspace = workspace;
|
|
1040
|
+
}
|
|
895
1041
|
async function configureSkillRules(ctx, prefs) {
|
|
896
1042
|
let rules = Array.isArray(prefs.skill_rules) ? [...prefs.skill_rules] : [];
|
|
897
1043
|
while (true) {
|
|
@@ -1100,6 +1246,8 @@ async function configureVerification(ctx, prefs) {
|
|
|
1100
1246
|
prefs.verification_auto_fix = autoFix;
|
|
1101
1247
|
const maxRetries = await promptInteger(ctx, "Verification max retries", prefs.verification_max_retries, "2");
|
|
1102
1248
|
applyNumber(prefs, "verification_max_retries", maxRetries);
|
|
1249
|
+
const perUnitCap = await promptNumber(ctx, "Per-unit cost cap (USD; retry cost ceiling, blank = clear to default)", prefs.per_unit_cost_cap_usd, "5.0");
|
|
1250
|
+
applyNumber(prefs, "per_unit_cost_cap_usd", perUnitCap);
|
|
1103
1251
|
const ev = await promptBoolean(ctx, "Enhanced verification (master toggle)", prefs.enhanced_verification, true);
|
|
1104
1252
|
if (ev !== undefined)
|
|
1105
1253
|
prefs.enhanced_verification = ev;
|
|
@@ -1164,7 +1312,7 @@ async function configureContextCodebase(ctx, prefs) {
|
|
|
1164
1312
|
cm.observation_mask_turns = maskTurns;
|
|
1165
1313
|
else if (maskTurns === "clear")
|
|
1166
1314
|
delete cm.observation_mask_turns;
|
|
1167
|
-
const thresh = await promptNumber(ctx, "
|
|
1315
|
+
const thresh = await promptNumber(ctx, "Soft context warning threshold percent (0.5–0.95)", cm.compaction_threshold_percent, "0.60");
|
|
1168
1316
|
if (thresh !== undefined && thresh !== "clear")
|
|
1169
1317
|
cm.compaction_threshold_percent = thresh;
|
|
1170
1318
|
else if (thresh === "clear")
|
|
@@ -1564,6 +1712,7 @@ export async function handlePrefsWizard(ctx, scope, prefill, opts) {
|
|
|
1564
1712
|
`Hooks ${summaries.hooks}`,
|
|
1565
1713
|
`UoK ${summaries.uok}`,
|
|
1566
1714
|
`Integrations ${summaries.integrations}`,
|
|
1715
|
+
`Workspace ${summaries.workspace}`,
|
|
1567
1716
|
`Advanced ${summaries.advanced}`,
|
|
1568
1717
|
`── Save & Exit ──`,
|
|
1569
1718
|
];
|
|
@@ -1601,6 +1750,8 @@ export async function handlePrefsWizard(ctx, scope, prefill, opts) {
|
|
|
1601
1750
|
await configureUoK(ctx, prefs);
|
|
1602
1751
|
else if (choice.startsWith("Integrations"))
|
|
1603
1752
|
await configureIntegrations(ctx, prefs);
|
|
1753
|
+
else if (choice.startsWith("Workspace"))
|
|
1754
|
+
await configureWorkspace(ctx, prefs);
|
|
1604
1755
|
else if (choice.startsWith("Advanced"))
|
|
1605
1756
|
await configureAdvanced(ctx, prefs);
|
|
1606
1757
|
}
|
|
@@ -1727,6 +1878,7 @@ export function serializePreferencesToFrontmatter(prefs) {
|
|
|
1727
1878
|
"reactive_execution", "gate_evaluation",
|
|
1728
1879
|
"auto_visualize", "auto_report",
|
|
1729
1880
|
"verification_commands", "verification_auto_fix", "verification_max_retries",
|
|
1881
|
+
"per_unit_cost_cap_usd",
|
|
1730
1882
|
"enhanced_verification", "enhanced_verification_pre",
|
|
1731
1883
|
"enhanced_verification_post", "enhanced_verification_strict",
|
|
1732
1884
|
"safety_harness",
|
|
@@ -83,7 +83,7 @@ function formatThresholdLines() {
|
|
|
83
83
|
}
|
|
84
84
|
const compactionThreshold = prefs?.context_management?.compaction_threshold_percent;
|
|
85
85
|
if (typeof compactionThreshold === "number") {
|
|
86
|
-
lines.push(`
|
|
86
|
+
lines.push(`Soft context warning: ${Math.round(compactionThreshold * 100)}%`);
|
|
87
87
|
}
|
|
88
88
|
return lines;
|
|
89
89
|
}
|
|
@@ -251,8 +251,17 @@ async function handleRemove(args, ctx) {
|
|
|
251
251
|
return;
|
|
252
252
|
}
|
|
253
253
|
try {
|
|
254
|
-
removeWorktree(basePath, name, { deleteBranch: true });
|
|
255
|
-
|
|
254
|
+
const removed = removeWorktree(basePath, name, { deleteBranch: true });
|
|
255
|
+
if (removed) {
|
|
256
|
+
ctx.ui.notify(`Removed worktree ${name}.`, "info");
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
ctx.ui.notify([
|
|
260
|
+
`Worktree removal aborted for "${name}" to preserve uncommitted changes.`,
|
|
261
|
+
"",
|
|
262
|
+
"Manual quarantine recovery may be needed before retrying removal.",
|
|
263
|
+
].join("\n"), "warning");
|
|
264
|
+
}
|
|
256
265
|
}
|
|
257
266
|
catch (err) {
|
|
258
267
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -19,7 +19,7 @@ import { createCoordinationTablesV24 } from "../db-coordination-schema.js";
|
|
|
19
19
|
import { createDbConnectionCache } from "../db-connection-cache.js";
|
|
20
20
|
import { backupDatabaseBeforeMigration, isMigrationBackupError } from "../db-migration-backup.js";
|
|
21
21
|
import { applyMigrationV2Artifacts, applyMigrationV3Memories, applyMigrationV4DecisionMadeBy, applyMigrationV5HierarchyTables, applyMigrationV6SliceSummaries, applyMigrationV7Dependencies, applyMigrationV8PlanningFields, applyMigrationV9Ordering, applyMigrationV10ReplanTrigger, applyMigrationV11TaskPlanning, applyMigrationV12QualityGates, applyMigrationV13HotPathIndexes, applyMigrationV14SliceDependencies, applyMigrationV15AuditTables, applyMigrationV16EscalationSource, applyMigrationV17TaskEscalation, applyMigrationV18MemorySources, applyMigrationV19MemoryFts, applyMigrationV20MemoryRelations, applyMigrationV21StructuredMemories, applyMigrationV22QualityGateRepair, applyMigrationV23MilestoneQueue, applyMigrationV26MilestoneCommitAttributions, applyMigrationV27ArtifactHash, applyMigrationV28MemoryLastHitAt, applyMigrationV29RepositoryTargets, } from "../db-migration-steps.js";
|
|
22
|
-
import { isMemoriesFtsAvailableSchema, tryCreateMemoriesFtsSchema } from "../db-memory-fts-schema.js";
|
|
22
|
+
import { isMemoriesFtsAvailableSchema, rebuildMemoriesFtsSchemaOnce, tryCreateMemoriesFtsSchema, } from "../db-memory-fts-schema.js";
|
|
23
23
|
import { createDbOpenState } from "../db-open-state.js";
|
|
24
24
|
import { createRuntimeKvTableV25 } from "../db-runtime-kv-schema.js";
|
|
25
25
|
import { getCurrentSchemaVersion, recordSchemaVersion } from "../db-schema-metadata.js";
|
|
@@ -101,6 +101,9 @@ function initSchema(db, fileBacked, dbPath) {
|
|
|
101
101
|
throw err;
|
|
102
102
|
}
|
|
103
103
|
migrateSchema(db, dbPath);
|
|
104
|
+
rebuildMemoriesFtsSchemaOnce(db, {
|
|
105
|
+
onRebuildFailed: (message) => logWarning("db", message),
|
|
106
|
+
});
|
|
104
107
|
}
|
|
105
108
|
export function _isLikelyWslDrvFsPathForTest(dbPath) {
|
|
106
109
|
if (!dbPath || process.platform !== "linux")
|
|
@@ -327,6 +327,45 @@ export function getSlicesByMilestoneIds(milestoneIds) {
|
|
|
327
327
|
}
|
|
328
328
|
return byMilestone;
|
|
329
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Load tasks for many (milestone, slice) pairs in batched queries. Returns a Map
|
|
332
|
+
* keyed by `${milestone_id}\0${slice_id}`, preserving `ORDER BY sequence, id`
|
|
333
|
+
* within each bucket. Mirrors getSlicesByMilestoneIds to avoid an N+1 over tasks
|
|
334
|
+
* during full projection rebuilds.
|
|
335
|
+
*/
|
|
336
|
+
export function getTasksBySliceIds(slices) {
|
|
337
|
+
const bySlice = new Map();
|
|
338
|
+
const db = getDbOrNull();
|
|
339
|
+
if (!db || slices.length === 0)
|
|
340
|
+
return bySlice;
|
|
341
|
+
// SQLite caps bound params (~999); 2 per pair, so chunk well under the limit.
|
|
342
|
+
const CHUNK = 400;
|
|
343
|
+
for (let start = 0; start < slices.length; start += CHUNK) {
|
|
344
|
+
const chunk = slices.slice(start, start + CHUNK);
|
|
345
|
+
const clauses = [];
|
|
346
|
+
const params = {};
|
|
347
|
+
chunk.forEach((s, i) => {
|
|
348
|
+
clauses.push(`(milestone_id = :m${i} AND slice_id = :s${i})`);
|
|
349
|
+
params[`:m${i}`] = s.milestoneId;
|
|
350
|
+
params[`:s${i}`] = s.sliceId;
|
|
351
|
+
});
|
|
352
|
+
const rows = db
|
|
353
|
+
.prepare(`SELECT * FROM tasks WHERE ${clauses.join(" OR ")} ORDER BY milestone_id, slice_id, sequence, id`)
|
|
354
|
+
.all(params);
|
|
355
|
+
for (const row of rows) {
|
|
356
|
+
const task = rowToTask(row);
|
|
357
|
+
const key = `${task.milestone_id}\0${task.slice_id}`;
|
|
358
|
+
const bucket = bySlice.get(key);
|
|
359
|
+
if (bucket) {
|
|
360
|
+
bucket.push(task);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
bySlice.set(key, [task]);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return bySlice;
|
|
368
|
+
}
|
|
330
369
|
/**
|
|
331
370
|
* Consolidated DB read for dispatch/gate/completion decisions (ADR-017).
|
|
332
371
|
* `done` uses the canonical closed-status predicate (`isClosedStatus`) — the
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Memory FTS5 SQLite schema helpers for the GSD database facade.
|
|
3
|
+
import { createRuntimeKvTableV25 } from "./db-runtime-kv-schema.js";
|
|
4
|
+
export const MEMORIES_FTS_REBUILT_KEY = "memories_fts_rebuilt_at";
|
|
3
5
|
function formatFtsUnavailableError(err) {
|
|
4
6
|
const message = err instanceof Error ? err.message : String(err);
|
|
5
7
|
return message.replace(/\bmoduel\s*:\s*/gi, "module: ");
|
|
@@ -54,3 +56,35 @@ export function isMemoriesFtsAvailableSchema(db) {
|
|
|
54
56
|
return false;
|
|
55
57
|
}
|
|
56
58
|
}
|
|
59
|
+
export function rebuildMemoriesFtsSchemaOnce(db, options = {}) {
|
|
60
|
+
if (!isMemoriesFtsAvailableSchema(db))
|
|
61
|
+
return;
|
|
62
|
+
createRuntimeKvTableV25(db);
|
|
63
|
+
const marker = db.prepare("SELECT 1 as present FROM runtime_kv WHERE scope = 'global' AND scope_id = '' AND key = :key").get({ ":key": MEMORIES_FTS_REBUILT_KEY });
|
|
64
|
+
if (marker)
|
|
65
|
+
return;
|
|
66
|
+
const now = new Date().toISOString();
|
|
67
|
+
try {
|
|
68
|
+
db.exec("BEGIN");
|
|
69
|
+
db.exec("INSERT INTO memories_fts(memories_fts) VALUES('rebuild')");
|
|
70
|
+
db.prepare(`INSERT INTO runtime_kv (scope, scope_id, key, value_json, updated_at)
|
|
71
|
+
VALUES ('global', '', :key, :value_json, :updated_at)
|
|
72
|
+
ON CONFLICT (scope, scope_id, key) DO UPDATE SET
|
|
73
|
+
value_json = excluded.value_json,
|
|
74
|
+
updated_at = excluded.updated_at`).run({
|
|
75
|
+
":key": MEMORIES_FTS_REBUILT_KEY,
|
|
76
|
+
":value_json": JSON.stringify(now),
|
|
77
|
+
":updated_at": now,
|
|
78
|
+
});
|
|
79
|
+
db.exec("COMMIT");
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
try {
|
|
83
|
+
db.exec("ROLLBACK");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Best effort: leave startup alive and retry the rebuild on next open.
|
|
87
|
+
}
|
|
88
|
+
options.onRebuildFailed?.(`FTS5 rebuild failed: ${err.message}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
// Project/App: gsd-pi
|
|
2
2
|
// File Purpose: Workspace-facing Interface for opening and maintaining the workflow database.
|
|
3
3
|
import { existsSync } from "node:fs";
|
|
4
|
-
import { dirname } from "node:path";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
5
|
import { backupDatabaseSnapshot, checkpointDatabase, closeAllDatabases, closeDatabase, closeDatabaseByWorkspace, getDbPath, getDbStatus, getDbProvider, isDbAvailable, openDatabase, openDatabaseByScope, openDatabaseByWorkspace, openIsolatedDatabase, refreshOpenDatabaseFromDisk, vacuumDatabase, wasDbOpenAttempted, } from "./gsd-db.js";
|
|
6
|
-
import { resolveGsdPathContract } from "./paths.js";
|
|
7
|
-
import { setLogBasePath } from "./workflow-logger.js";
|
|
6
|
+
import { resolveGsdPathContract, gsdRoot } from "./paths.js";
|
|
7
|
+
import { logWarning, setLogBasePath } from "./workflow-logger.js";
|
|
8
|
+
/**
|
|
9
|
+
* Global SQLite handle invariants:
|
|
10
|
+
*
|
|
11
|
+
* - `openWorkflowDatabase` / `openDatabase` switch the process-global handle consumed by
|
|
12
|
+
* deriveState, dispatch, reconciliation repairs, and domain writers. Only one active
|
|
13
|
+
* project database should own the global handle at a time.
|
|
14
|
+
* - `openWorkflowDatabaseIsolated` opens a caller-owned connection that does not clobber
|
|
15
|
+
* the global handle. Use for read-only observers (parallel monitor) and other background
|
|
16
|
+
* probes that must not disturb the active workflow session.
|
|
17
|
+
* - Reconciliation repairs that write markdown/DB state must use `ensureWorkflowDbForBase`
|
|
18
|
+
* so repairs target the correct project; those paths intentionally re-open the global handle.
|
|
19
|
+
* - Pair ad-hoc project switches with `closeWorkflowDatabase()` or restore via
|
|
20
|
+
* `ensureWorkflowDbForBase(..., { refresh: true })` before returning to derive/dispatch.
|
|
21
|
+
*/
|
|
8
22
|
export function resolveWorkflowDatabaseLocation(basePath) {
|
|
9
23
|
const contract = resolveGsdPathContract(basePath);
|
|
10
24
|
return {
|
|
@@ -104,6 +118,44 @@ export function getWorkflowDatabasePath() {
|
|
|
104
118
|
export function refreshWorkflowDatabaseFromDisk() {
|
|
105
119
|
return refreshOpenDatabaseFromDisk();
|
|
106
120
|
}
|
|
121
|
+
export function expectedWorkflowDbPathForBase(basePath) {
|
|
122
|
+
return join(gsdRoot(basePath), "gsd.db");
|
|
123
|
+
}
|
|
124
|
+
export function ensureWorkflowDbAtPath(dbPath) {
|
|
125
|
+
if (!dbPath || dbPath === ":memory:")
|
|
126
|
+
return isDbAvailable();
|
|
127
|
+
if (isDbAvailable() && getWorkflowDatabasePath() === dbPath)
|
|
128
|
+
return true;
|
|
129
|
+
if (!existsSync(dbPath))
|
|
130
|
+
return false;
|
|
131
|
+
try {
|
|
132
|
+
return openWorkflowDatabasePath(dbPath);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
logWarning("reconcile", `ensureWorkflowDbAtPath could not reopen DB: ${err.message}`);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export function ensureWorkflowDbForBase(basePath, options = {}) {
|
|
140
|
+
const dbPath = expectedWorkflowDbPathForBase(basePath);
|
|
141
|
+
if (!existsSync(dbPath))
|
|
142
|
+
return false;
|
|
143
|
+
try {
|
|
144
|
+
if (options.refresh) {
|
|
145
|
+
if (isDbAvailable() && getWorkflowDatabasePath() === dbPath && refreshWorkflowDatabaseFromDisk()) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return openWorkflowDatabasePath(dbPath);
|
|
149
|
+
}
|
|
150
|
+
if (isDbAvailable() && getWorkflowDatabasePath() === dbPath)
|
|
151
|
+
return true;
|
|
152
|
+
return openWorkflowDatabasePath(dbPath);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
logWarning("reconcile", `ensureWorkflowDbForBase could not reopen DB: ${err.message}`);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
107
159
|
export function checkpointWorkflowDatabase() {
|
|
108
160
|
checkpointDatabase();
|
|
109
161
|
}
|
|
@@ -94,7 +94,7 @@ const POLICY = {
|
|
|
94
94
|
gsd_plan_task: {
|
|
95
95
|
toolName: "gsd_plan_task",
|
|
96
96
|
verdict: "no",
|
|
97
|
-
rationale: "
|
|
97
|
+
rationale: "Incremental task planning mutates the active slice plan and re-renders projections; keep it ordered in the foreground plan-slice unit.",
|
|
98
98
|
},
|
|
99
99
|
};
|
|
100
100
|
function resolveCanonical(name) {
|
|
@@ -53,8 +53,10 @@ function noteDbRowRecoveryMiss(entry) {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
function ensureMilestoneRowForAcceptedHandoff(entry, contextFile) {
|
|
56
|
-
if (!isDbAvailable())
|
|
57
|
-
|
|
56
|
+
if (!isDbAvailable()) {
|
|
57
|
+
logWarning("guided", `R3b: milestone ${entry.milestoneId} DB-row recovery skipped because DB is unavailable`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
58
60
|
const { basePath, milestoneId } = entry;
|
|
59
61
|
const milestoneRow = getMilestone(milestoneId);
|
|
60
62
|
if (milestoneRow)
|
|
@@ -77,12 +79,15 @@ function ensureMilestoneRowForAcceptedHandoff(entry, contextFile) {
|
|
|
77
79
|
}
|
|
78
80
|
logWarning("guided", `R3b: ${milestoneId} has CONTEXT.md but no DB row — inserting placeholder "queued" row ` +
|
|
79
81
|
`(attempt ${entry.r3bRecoveryCount + 1}/${MAX_DB_ROW_RECOVERIES})`);
|
|
82
|
+
let inserted = false;
|
|
80
83
|
try {
|
|
81
|
-
insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
|
|
84
|
+
inserted = insertMilestone({ id: milestoneId, title: milestoneId, status: "queued" });
|
|
82
85
|
}
|
|
83
86
|
catch (e) {
|
|
84
87
|
logWarning("guided", `R3b: insertMilestone failed: ${e.message}`);
|
|
85
88
|
}
|
|
89
|
+
if (inserted)
|
|
90
|
+
return true;
|
|
86
91
|
if (getMilestone(milestoneId))
|
|
87
92
|
return true;
|
|
88
93
|
noteDbRowRecoveryMiss(entry);
|
|
@@ -163,7 +163,7 @@ Diagnostics record the file path, scope (global/project), severity (error/warnin
|
|
|
163
163
|
- **Deprecated:** `merge_to_main` — no longer valid; milestone-level merge is always used. Remove this setting.
|
|
164
164
|
|
|
165
165
|
- `workspace`: configures multi-repository parent workspaces. Keys:
|
|
166
|
-
- `mode`: `"project"` (default single-repo behavior) or `"parent"` (one `.gsd` controlling child repos).
|
|
166
|
+
- `mode`: `"project"` (default single-repo behavior) or `"parent"` (one `.gsd` controlling child repos). In `"parent"` mode at least one child repository must be declared under `repositories`, otherwise the setting is rejected at validation time.
|
|
167
167
|
- `repositories`: object map of repository IDs to config.
|
|
168
168
|
- Repository ID format: `^[A-Za-z0-9][A-Za-z0-9._-]*$`.
|
|
169
169
|
- Reserved ID: `project` is implicit and always maps to the project root; user-defined `workspace.repositories.project` is rejected.
|
|
@@ -171,6 +171,8 @@ Diagnostics record the file path, scope (global/project), severity (error/warnin
|
|
|
171
171
|
- `role`: optional short description of what the repo owns.
|
|
172
172
|
- `verification`: optional array of verification commands for that repo.
|
|
173
173
|
- `commit_policy`: optional `"auto"` or `"skip"` to include or skip commit actions per repo.
|
|
174
|
+
- Planning tools consume repository IDs through `targetRepositories`: `gsd_plan_slice.targetRepositories` sets a slice-wide default, and `gsd_plan_task.targetRepositories` records the repositories an individual task touches. Values must be declared IDs or the implicit `project`; omit these fields in single-repo projects.
|
|
175
|
+
- In parent mode with declared child repositories, `/gsd codebase generate` and automatic `.gsd/CODEBASE.md` refreshes enumerate `project` plus each child repository, render repo-labeled sections, and store repository IDs in map metadata.
|
|
174
176
|
|
|
175
177
|
## Workspace Example
|
|
176
178
|
|
|
@@ -198,6 +200,8 @@ workspace:
|
|
|
198
200
|
|
|
199
201
|
This config sets a parent workspace with two child repositories. The implicit `project` repository is always created for the project root and cannot be user-defined.
|
|
200
202
|
|
|
203
|
+
In `"parent"` mode, slice/task `targetRepositories` default to the declared child repositories (here `frontend` and `backend`) rather than the root `project` repo. In `"project"` mode (the default), `targetRepositories` defaults to `["project"]`.
|
|
204
|
+
|
|
201
205
|
- `unique_milestone_ids`: boolean — when `true`, generates milestone IDs in `M{seq}-{rand6}` format (e.g. `M001-eh88as`) instead of plain sequential `M001`. Prevents ID collisions in team workflows where multiple contributors create milestones concurrently. Both formats coexist — existing `M001`-style milestones remain valid. Default: `false`.
|
|
202
206
|
|
|
203
207
|
- `budget_ceiling`: number — maximum dollar amount to spend on auto-mode. When reached, behavior is controlled by `budget_enforcement`. Default: no limit.
|
|
@@ -273,10 +277,10 @@ This config sets a parent workspace with two child repositories. The implicit `p
|
|
|
273
277
|
- `audit_unified.enabled`: boolean — dual-write unified audit envelope events. Default: `true`.
|
|
274
278
|
- `plan_v2.enabled`: boolean — enable bounded clarify/research/draft/compile planning flow. Default: `true`.
|
|
275
279
|
|
|
276
|
-
- `context_management`: configures context hygiene for auto-mode sessions. Keys:
|
|
280
|
+
- `context_management`: configures context hygiene for auto-mode sessions. In step mode, the configurable threshold is a soft warning; automatic session re-rooting happens only at the fixed 90% hard context boundary. Keys:
|
|
277
281
|
- `observation_masking`: boolean — mask old tool results to reduce context bloat. Default: `true`.
|
|
278
282
|
- `observation_mask_turns`: number — keep this many recent turns verbatim (1-50). Default: `8`.
|
|
279
|
-
- `compaction_threshold_percent`: number —
|
|
283
|
+
- `compaction_threshold_percent`: number — show a soft context warning at this fraction of the context window (0.5-0.95). Lower values warn earlier so operators can compact manually before drift accumulates. Default: `0.60`.
|
|
280
284
|
- `tool_result_max_chars`: number — max chars per tool result in GSD sessions (200-10000). Default: `800`.
|
|
281
285
|
|
|
282
286
|
- `auto_visualize`: boolean — show a visualizer hint after each milestone completion in auto-mode. Default: `false`.
|
|
@@ -303,7 +307,9 @@ This config sets a parent workspace with two child repositories. The implicit `p
|
|
|
303
307
|
- `verification`: string[] (optional) — repository-specific verification commands used when global `verification_commands` is not set.
|
|
304
308
|
- `commit_policy`: `"auto"` | `"skip"` (optional) — per-repository closeout commit behavior.
|
|
305
309
|
- `project` is always an implicit repository target mapped to the project root for backward compatibility.
|
|
306
|
-
-
|
|
310
|
+
- `targetRepositories` on `gsd_plan_slice` sets the slice-wide default. `targetRepositories` on `gsd_plan_task` records or overrides the repository IDs for an individual task.
|
|
311
|
+
- Values must match declared repository IDs or the implicit `project`; omitted plan/task `targetRepositories` defaults to `["project"]`.
|
|
312
|
+
- `/gsd codebase` is workspace-aware in parent mode with declared child repositories: generated `.gsd/CODEBASE.md` uses workspace-relative paths, groups files under `## [repo-id]` headings, and refreshes when repository registry metadata changes.
|
|
307
313
|
|
|
308
314
|
- `verification_commands`: string[] — shell commands to run as verification after task execution (e.g., `["npm test", "npm run lint"]`). Commands run in order; if any fails, the task is marked as needing fixes.
|
|
309
315
|
|