@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
|
@@ -268,7 +268,7 @@ test("#4934: every manifest declares a tools policy", () => {
|
|
|
268
268
|
});
|
|
269
269
|
|
|
270
270
|
test("#4934: tools.mode is one of the declared policies", () => {
|
|
271
|
-
const validModes = new Set(["all", "read-only", "planning", "planning-dispatch", "docs", "verification"]);
|
|
271
|
+
const validModes = new Set(["all", "read-only", "planning", "planning-dispatch", "docs", "verification", "workflow-only"]);
|
|
272
272
|
for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
|
|
273
273
|
const mode = (manifest as { tools: { mode: string } }).tools.mode;
|
|
274
274
|
assert.ok(
|
|
@@ -327,23 +327,71 @@ test("#5453: complete-milestone uses all tools so bash verification is not plann
|
|
|
327
327
|
}
|
|
328
328
|
});
|
|
329
329
|
|
|
330
|
-
test("#5731:
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
330
|
+
test("#5731: complete-slice uses all tools so closeout verification is not planning-dispatch blocked", () => {
|
|
331
|
+
const manifest = UNIT_MANIFESTS["complete-slice"];
|
|
332
|
+
assert.strictEqual(manifest.tools.mode, "all");
|
|
333
|
+
const result = shouldBlockPlanningUnit(
|
|
334
|
+
"bash",
|
|
335
|
+
"go test -short -count=1 ./...",
|
|
336
|
+
process.cwd(),
|
|
337
|
+
"complete-slice",
|
|
338
|
+
manifest.tools,
|
|
339
|
+
);
|
|
340
|
+
assert.strictEqual(
|
|
341
|
+
result.block,
|
|
342
|
+
false,
|
|
343
|
+
`complete-slice must allow verification bash commands: ${result.reason}`,
|
|
344
|
+
);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
test("#1157: validate-milestone uses workflow-only tools and blocks manual artifact writes", () => {
|
|
348
|
+
const manifest = UNIT_MANIFESTS["validate-milestone"];
|
|
349
|
+
assert.strictEqual(manifest.tools.mode, "workflow-only");
|
|
350
|
+
assert.deepEqual(resolveSubagentPermissionContract("validate-milestone"), {
|
|
351
|
+
allowed: true,
|
|
352
|
+
allowedSubagents: ["reviewer", "security", "tester"],
|
|
353
|
+
toolsMode: "workflow-only",
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
const validationWrite = shouldBlockPlanningUnit(
|
|
357
|
+
"write",
|
|
358
|
+
".gsd/milestones/M001/M001-VALIDATION.md",
|
|
359
|
+
process.cwd(),
|
|
360
|
+
"validate-milestone",
|
|
361
|
+
manifest.tools,
|
|
362
|
+
);
|
|
363
|
+
assert.strictEqual(validationWrite.block, true);
|
|
364
|
+
assert.match(validationWrite.reason!, /workflow-only/);
|
|
365
|
+
assert.match(validationWrite.reason!, /direct artifact writes are disabled/);
|
|
366
|
+
|
|
367
|
+
const bash = shouldBlockPlanningUnit(
|
|
368
|
+
"bash",
|
|
369
|
+
"npm test",
|
|
370
|
+
process.cwd(),
|
|
371
|
+
"validate-milestone",
|
|
372
|
+
manifest.tools,
|
|
373
|
+
);
|
|
374
|
+
assert.strictEqual(bash.block, true);
|
|
375
|
+
assert.match(bash.reason!, /bash is not permitted/);
|
|
376
|
+
|
|
377
|
+
const validateTool = shouldBlockPlanningUnit(
|
|
378
|
+
"gsd_validate_milestone",
|
|
379
|
+
"",
|
|
380
|
+
process.cwd(),
|
|
381
|
+
"validate-milestone",
|
|
382
|
+
manifest.tools,
|
|
383
|
+
);
|
|
384
|
+
assert.strictEqual(validateTool.block, false);
|
|
385
|
+
|
|
386
|
+
const reviewer = shouldBlockPlanningUnit(
|
|
387
|
+
"subagent",
|
|
388
|
+
"",
|
|
389
|
+
process.cwd(),
|
|
390
|
+
"validate-milestone",
|
|
391
|
+
manifest.tools,
|
|
392
|
+
["reviewer"],
|
|
393
|
+
);
|
|
394
|
+
assert.strictEqual(reviewer.block, false, reviewer.reason);
|
|
347
395
|
});
|
|
348
396
|
|
|
349
397
|
test("#5843: run-uat uses verification tools policy so build/test commands can run", () => {
|
|
@@ -6,7 +6,9 @@ import {
|
|
|
6
6
|
formatExecuteTaskRecoveryStatus,
|
|
7
7
|
inspectExecuteTaskDurability,
|
|
8
8
|
isInFlightRuntimePhase,
|
|
9
|
+
readUnitHarnessAbort,
|
|
9
10
|
readUnitRuntimeRecord,
|
|
11
|
+
recordUnitHarnessAbort,
|
|
10
12
|
writeUnitRuntimeRecord,
|
|
11
13
|
} from "../unit-runtime.ts";
|
|
12
14
|
import { closeDatabase, insertMilestone, insertSlice, insertTask, openDatabase } from "../gsd-db.ts";
|
|
@@ -41,6 +43,34 @@ console.log("\n=== runtime record write/read/update ===");
|
|
|
41
43
|
assert.deepStrictEqual(loaded!.phase, "wrapup-warning-sent", "updated phase readable");
|
|
42
44
|
}
|
|
43
45
|
|
|
46
|
+
console.log("\n=== runtime harness abort preservation and explicit clear ===");
|
|
47
|
+
{
|
|
48
|
+
const startedAt = 3000;
|
|
49
|
+
recordUnitHarnessAbort(base, "gate-evaluate", "M100/S02/gates+Q3", startedAt, {
|
|
50
|
+
kind: "tool-error",
|
|
51
|
+
reason: "Tool execution failed before the unit could complete its gate evaluation.",
|
|
52
|
+
toolName: "browser_click",
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const preserved = writeUnitRuntimeRecord(base, "gate-evaluate", "M100/S02/gates+Q3", startedAt, {
|
|
56
|
+
phase: "wrapup-warning-sent",
|
|
57
|
+
});
|
|
58
|
+
assert.equal(preserved.harnessAbort?.kind, "tool-error", "ordinary same-run updates preserve harness abort");
|
|
59
|
+
|
|
60
|
+
const cleared = writeUnitRuntimeRecord(base, "gate-evaluate", "M100/S02/gates+Q3", startedAt, {
|
|
61
|
+
phase: "recovered",
|
|
62
|
+
harnessAbort: undefined,
|
|
63
|
+
});
|
|
64
|
+
assert.equal(cleared.harnessAbort, undefined, "explicit clear removes stale harness abort");
|
|
65
|
+
assert.equal(
|
|
66
|
+
readUnitHarnessAbort(base, "gate-evaluate", "M100/S02/gates+Q3", startedAt),
|
|
67
|
+
null,
|
|
68
|
+
"cleared harness abort no longer blocks result saves",
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
clearUnitRuntimeRecord(base, "gate-evaluate", "M100/S02/gates+Q3");
|
|
72
|
+
}
|
|
73
|
+
|
|
44
74
|
console.log("\n=== execute-task durability inspection ===");
|
|
45
75
|
{
|
|
46
76
|
let status = await inspectExecuteTaskDurability(base, "M100/S02/T09");
|
|
@@ -18,6 +18,7 @@ import { join } from "node:path";
|
|
|
18
18
|
import { execSync } from "node:child_process";
|
|
19
19
|
import { GIT_NO_PROMPT_ENV } from "../git-constants.ts";
|
|
20
20
|
import { handleTurnGitActionError, runTurnGitAction } from "../git-service.ts";
|
|
21
|
+
import { _resetLogs, drainLogs } from "../workflow-logger.ts";
|
|
21
22
|
|
|
22
23
|
function run(cmd: string, cwd: string): string {
|
|
23
24
|
return execSync(cmd, { cwd, stdio: "pipe", encoding: "utf-8" }).trim();
|
|
@@ -111,6 +112,43 @@ workspace:
|
|
|
111
112
|
}
|
|
112
113
|
});
|
|
113
114
|
|
|
115
|
+
test("uok gitops turn action status-only reports dirty undeclared nested git repositories", () => {
|
|
116
|
+
const root = mkdtempSync(join(tmpdir(), "gsd-uok-gitops-nested-"));
|
|
117
|
+
try {
|
|
118
|
+
initRepo(root);
|
|
119
|
+
mkdirSync(join(root, "nested"), { recursive: true });
|
|
120
|
+
initRepo(join(root, "nested"));
|
|
121
|
+
writeFileSync(join(root, ".gitignore"), "nested/\n", "utf-8");
|
|
122
|
+
run("git add .gitignore", root);
|
|
123
|
+
run('git commit -m "chore: ignore nested repo"', root);
|
|
124
|
+
|
|
125
|
+
writeFileSync(join(root, "nested", "README.md"), "# Dirty nested\n", "utf-8");
|
|
126
|
+
|
|
127
|
+
_resetLogs();
|
|
128
|
+
const result = runTurnGitAction({
|
|
129
|
+
basePath: root,
|
|
130
|
+
action: "status-only",
|
|
131
|
+
unitType: "execute-task",
|
|
132
|
+
unitId: "M001/S01/T01",
|
|
133
|
+
});
|
|
134
|
+
const warnings = drainLogs();
|
|
135
|
+
|
|
136
|
+
assert.equal(result.status, "ok");
|
|
137
|
+
assert.equal(result.dirty, true);
|
|
138
|
+
assert.deepEqual(result.dirtyRepositories, {
|
|
139
|
+
project: false,
|
|
140
|
+
"nested (undeclared)": true,
|
|
141
|
+
});
|
|
142
|
+
assert.ok(
|
|
143
|
+
warnings.some((entry) => entry.message.includes("undeclared dirty nested git repo nested")),
|
|
144
|
+
"dirty undeclared nested repo should be logged as a warning",
|
|
145
|
+
);
|
|
146
|
+
} finally {
|
|
147
|
+
_resetLogs();
|
|
148
|
+
rmSync(root, { recursive: true, force: true });
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
|
|
114
152
|
test("uok gitops turn action snapshot writes snapshot refs", () => {
|
|
115
153
|
const repo = makeRepo();
|
|
116
154
|
try {
|
|
@@ -148,6 +186,58 @@ test("uok gitops turn action commit creates commit with unit trailer", () => {
|
|
|
148
186
|
}
|
|
149
187
|
});
|
|
150
188
|
|
|
189
|
+
test("uok gitops turn action commit defaults to child repositories in parent mode", () => {
|
|
190
|
+
const root = mkdtempSync(join(tmpdir(), "gsd-uok-gitops-parent-commit-"));
|
|
191
|
+
try {
|
|
192
|
+
initRepo(root);
|
|
193
|
+
mkdirSync(join(root, ".gsd"), { recursive: true });
|
|
194
|
+
mkdirSync(join(root, "frontend"), { recursive: true });
|
|
195
|
+
mkdirSync(join(root, "backend"), { recursive: true });
|
|
196
|
+
initRepo(join(root, "frontend"));
|
|
197
|
+
initRepo(join(root, "backend"));
|
|
198
|
+
writeFileSync(join(root, ".gitignore"), "frontend/\nbackend/\n", "utf-8");
|
|
199
|
+
run("git add .gitignore", root);
|
|
200
|
+
run('git commit -m "chore: ignore nested repos"', root);
|
|
201
|
+
writeFileSync(join(root, ".gsd", "PREFERENCES.md"), `---
|
|
202
|
+
version: 1
|
|
203
|
+
workspace:
|
|
204
|
+
mode: parent
|
|
205
|
+
repositories:
|
|
206
|
+
frontend:
|
|
207
|
+
path: frontend
|
|
208
|
+
backend:
|
|
209
|
+
path: backend
|
|
210
|
+
---
|
|
211
|
+
`, "utf-8");
|
|
212
|
+
run("git add .gsd/PREFERENCES.md", root);
|
|
213
|
+
run('git commit -m "chore: configure parent workspace repos"', root);
|
|
214
|
+
|
|
215
|
+
const rootHeadBefore = run("git rev-parse HEAD", root);
|
|
216
|
+
writeFileSync(join(root, "frontend", "README.md"), "# frontend dirty\n", "utf-8");
|
|
217
|
+
writeFileSync(join(root, "backend", "README.md"), "# backend dirty\n", "utf-8");
|
|
218
|
+
|
|
219
|
+
const result = runTurnGitAction({
|
|
220
|
+
basePath: root,
|
|
221
|
+
action: "commit",
|
|
222
|
+
unitType: "execute-task",
|
|
223
|
+
unitId: "M001/S01/T-parent",
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
assert.equal(result.status, "ok");
|
|
227
|
+
assert.equal(result.commitMessages?.project, undefined);
|
|
228
|
+
assert.equal(typeof result.commitMessages?.frontend, "string");
|
|
229
|
+
assert.equal(typeof result.commitMessages?.backend, "string");
|
|
230
|
+
assert.equal(result.commitMessage, result.commitMessages?.frontend);
|
|
231
|
+
assert.equal(run("git rev-parse HEAD", root), rootHeadBefore);
|
|
232
|
+
assert.equal(run("git status --porcelain", join(root, "frontend")), "");
|
|
233
|
+
assert.equal(run("git status --porcelain", join(root, "backend")), "");
|
|
234
|
+
assert.ok(run("git log -1 --pretty=%B", join(root, "frontend")).includes("GSD-Unit: M001/S01/T-parent"));
|
|
235
|
+
assert.ok(run("git log -1 --pretty=%B", join(root, "backend")).includes("GSD-Unit: M001/S01/T-parent"));
|
|
236
|
+
} finally {
|
|
237
|
+
rmSync(root, { recursive: true, force: true });
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
|
|
151
241
|
test("uok gitops turn action commit reuses the collected dirty status", () => {
|
|
152
242
|
const repo = makeRepo();
|
|
153
243
|
const wrapperDir = mkdtempSync(join(tmpdir(), "gsd-uok-git-wrapper-"));
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
|
|
24
24
|
function makeProjectDir(label = "gsd-vsp-"): string {
|
|
25
25
|
const dir = realpathSync(mkdtempSync(join(tmpdir(), label)));
|
|
26
|
-
mkdirSync(join(dir, ".gsd", "
|
|
26
|
+
mkdirSync(join(dir, ".gsd", "phases", "01-m001"), { recursive: true });
|
|
27
27
|
return dir;
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -236,4 +236,56 @@ describe("validator-scope-parity: scope uses canonical projectRoot not worktree
|
|
|
236
236
|
"verifyExpectedArtifactForScope should return false when artifact is absent",
|
|
237
237
|
);
|
|
238
238
|
});
|
|
239
|
+
|
|
240
|
+
test("verifyExpectedArtifactForScope rejects zero-slice scoped plan-milestone roadmaps", () => {
|
|
241
|
+
const ws = createWorkspace(base);
|
|
242
|
+
const scope = scopeMilestone(ws, "M001");
|
|
243
|
+
|
|
244
|
+
writeFileSync(scope.roadmapFile(), [
|
|
245
|
+
"# M001: Placeholder",
|
|
246
|
+
"",
|
|
247
|
+
"## Slices",
|
|
248
|
+
"",
|
|
249
|
+
"_TBD_",
|
|
250
|
+
"",
|
|
251
|
+
].join("\n"));
|
|
252
|
+
|
|
253
|
+
const ready = verifyExpectedArtifactForScope(scope, "plan-milestone", "M001");
|
|
254
|
+
assert.equal(
|
|
255
|
+
ready,
|
|
256
|
+
false,
|
|
257
|
+
"scoped plan-milestone verification must parse roadmap content, not only check existence",
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test("verifyExpectedArtifactForScope verifies the scoped plan-milestone roadmap path", () => {
|
|
262
|
+
const ws = createWorkspace(base);
|
|
263
|
+
const realScope = scopeMilestone(ws, "M001");
|
|
264
|
+
const scopedRoadmap = join(base, "scoped-M001-ROADMAP.md");
|
|
265
|
+
const scope = {
|
|
266
|
+
...realScope,
|
|
267
|
+
roadmapFile: () => scopedRoadmap,
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
writeFileSync(scopedRoadmap, [
|
|
271
|
+
"# M001: Scoped roadmap",
|
|
272
|
+
"",
|
|
273
|
+
"## Slices",
|
|
274
|
+
"",
|
|
275
|
+
"- [ ] **S01: First slice** `risk:low` `depends:[]`",
|
|
276
|
+
" > After this: a real slice exists.",
|
|
277
|
+
"",
|
|
278
|
+
].join("\n"));
|
|
279
|
+
|
|
280
|
+
assert.equal(
|
|
281
|
+
resolveExpectedArtifactPathForScope(scope, "plan-milestone", "M001"),
|
|
282
|
+
scopedRoadmap,
|
|
283
|
+
"scoped plan-milestone artifact path must come from scope.roadmapFile()",
|
|
284
|
+
);
|
|
285
|
+
assert.equal(
|
|
286
|
+
verifyExpectedArtifactForScope(scope, "plan-milestone", "M001"),
|
|
287
|
+
true,
|
|
288
|
+
"scoped plan-milestone verification must read the roadmap from scope.roadmapFile()",
|
|
289
|
+
);
|
|
290
|
+
});
|
|
239
291
|
});
|
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
verificationRetryKey,
|
|
12
12
|
VERIFICATION_RETRY_MAX_DELAY_MS,
|
|
13
13
|
} from "../auto/verification-retry-policy.ts";
|
|
14
|
+
import { formatFailureContext, formatFailureSignature } from "../verification-gate.ts";
|
|
15
|
+
import type { VerificationResult } from "../types.ts";
|
|
14
16
|
|
|
15
17
|
test("verificationRetryDelayMs uses exponential backoff with cap", () => {
|
|
16
18
|
assert.deepEqual(verificationRetryDelayMs(1, () => 0.5), {
|
|
@@ -31,9 +33,22 @@ test("verificationRetryDelayMs uses exponential backoff with cap", () => {
|
|
|
31
33
|
});
|
|
32
34
|
});
|
|
33
35
|
|
|
34
|
-
test("decideVerificationRetry pauses on
|
|
36
|
+
test("decideVerificationRetry pauses on repeated failure context across attempts", () => {
|
|
35
37
|
const failureContext = "lint failed\n";
|
|
36
|
-
const
|
|
38
|
+
const firstDecision = decideVerificationRetry({
|
|
39
|
+
unitType: "execute-task",
|
|
40
|
+
retryInfo: {
|
|
41
|
+
unitId: "M001/S01/T01",
|
|
42
|
+
failureContext,
|
|
43
|
+
attempt: 1,
|
|
44
|
+
},
|
|
45
|
+
previousFailureHash: undefined,
|
|
46
|
+
random: () => 0.5,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
assert.equal(firstDecision.action, "delay");
|
|
50
|
+
assert.equal(firstDecision.failureHash, hashVerificationFailureContext(failureContext));
|
|
51
|
+
|
|
37
52
|
const decision = decideVerificationRetry({
|
|
38
53
|
unitType: "execute-task",
|
|
39
54
|
retryInfo: {
|
|
@@ -41,7 +56,7 @@ test("decideVerificationRetry pauses on duplicate failure context", () => {
|
|
|
41
56
|
failureContext,
|
|
42
57
|
attempt: 2,
|
|
43
58
|
},
|
|
44
|
-
previousFailureHash: failureHash,
|
|
59
|
+
previousFailureHash: firstDecision.failureHash,
|
|
45
60
|
random: () => 0.5,
|
|
46
61
|
});
|
|
47
62
|
|
|
@@ -49,7 +64,7 @@ test("decideVerificationRetry pauses on duplicate failure context", () => {
|
|
|
49
64
|
action: "pause",
|
|
50
65
|
reason: "duplicate-failure-context",
|
|
51
66
|
key: verificationRetryKey("execute-task", "M001/S01/T01"),
|
|
52
|
-
failureHash,
|
|
67
|
+
failureHash: firstDecision.failureHash,
|
|
53
68
|
});
|
|
54
69
|
});
|
|
55
70
|
|
|
@@ -71,6 +86,56 @@ test("decideVerificationRetry delays changed failure context", () => {
|
|
|
71
86
|
assert.equal(decision.baseDelayMs, 4_000);
|
|
72
87
|
});
|
|
73
88
|
|
|
89
|
+
test("decideVerificationRetry pauses duplicate host-check failures with volatile stderr", () => {
|
|
90
|
+
const makeResult = (stderr: string): VerificationResult => ({
|
|
91
|
+
passed: false,
|
|
92
|
+
discoverySource: "package-json",
|
|
93
|
+
timestamp: Date.now(),
|
|
94
|
+
checks: [
|
|
95
|
+
{
|
|
96
|
+
command: "npm test",
|
|
97
|
+
exitCode: 1,
|
|
98
|
+
stdout: "",
|
|
99
|
+
stderr,
|
|
100
|
+
durationMs: 100,
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
});
|
|
104
|
+
const first = makeResult("failed after 120ms in /tmp/gsd-a worker pid 101");
|
|
105
|
+
const second = makeResult("failed after 133ms in /tmp/gsd-b worker pid 202");
|
|
106
|
+
const firstContext = formatFailureContext(first);
|
|
107
|
+
const secondContext = formatFailureContext(second);
|
|
108
|
+
|
|
109
|
+
assert.notEqual(
|
|
110
|
+
hashVerificationFailureContext(firstContext),
|
|
111
|
+
hashVerificationFailureContext(secondContext),
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
const signature = formatFailureSignature(first);
|
|
115
|
+
assert.equal(signature, "npm test#1");
|
|
116
|
+
assert.equal(formatFailureSignature(second), signature);
|
|
117
|
+
|
|
118
|
+
const failureHash = hashVerificationFailureContext(signature);
|
|
119
|
+
const decision = decideVerificationRetry({
|
|
120
|
+
unitType: "execute-task",
|
|
121
|
+
retryInfo: {
|
|
122
|
+
unitId: "M001/S01/T01",
|
|
123
|
+
failureContext: secondContext,
|
|
124
|
+
signature: formatFailureSignature(second),
|
|
125
|
+
attempt: 2,
|
|
126
|
+
},
|
|
127
|
+
previousFailureHash: failureHash,
|
|
128
|
+
random: () => 0.5,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
assert.deepEqual(decision, {
|
|
132
|
+
action: "pause",
|
|
133
|
+
reason: "duplicate-failure-context",
|
|
134
|
+
key: verificationRetryKey("execute-task", "M001/S01/T01"),
|
|
135
|
+
failureHash,
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
74
139
|
test("decideVerificationRetry pauses when retry context is missing", () => {
|
|
75
140
|
assert.deepEqual(
|
|
76
141
|
decideVerificationRetry({
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
} from '../gsd-db.ts';
|
|
25
25
|
import {
|
|
26
26
|
writeManifest,
|
|
27
|
+
flushManifest,
|
|
27
28
|
readManifest,
|
|
28
29
|
snapshotState,
|
|
29
30
|
bootstrapFromManifest,
|
|
@@ -42,6 +43,11 @@ function cleanupDir(dirPath: string): void {
|
|
|
42
43
|
try { fs.rmSync(dirPath, { recursive: true, force: true }); } catch { /* best effort */ }
|
|
43
44
|
}
|
|
44
45
|
|
|
46
|
+
async function writeManifestAndFlush(base: string): Promise<void> {
|
|
47
|
+
writeManifest(base);
|
|
48
|
+
await flushManifest(base);
|
|
49
|
+
}
|
|
50
|
+
|
|
45
51
|
function insertMemoryBackedDecision(id: string): void {
|
|
46
52
|
const now = '2026-01-01T00:00:00.000Z';
|
|
47
53
|
insertMemoryRow({
|
|
@@ -83,12 +89,14 @@ test('workflow-manifest: readManifest returns null when file does not exist', ()
|
|
|
83
89
|
|
|
84
90
|
// ─── writeManifest + readManifest round-trip ─────────────────────────────
|
|
85
91
|
|
|
86
|
-
test('workflow-manifest: writeManifest creates state-manifest.json with version 1', () => {
|
|
92
|
+
test('workflow-manifest: writeManifest creates state-manifest.json with version 1 after flush', async () => {
|
|
87
93
|
const base = tempDir();
|
|
88
94
|
openDatabase(tempDbPath(base));
|
|
89
95
|
try {
|
|
90
96
|
writeManifest(base);
|
|
91
97
|
const manifestPath = path.join(base, '.gsd', 'state-manifest.json');
|
|
98
|
+
assert.equal(fs.existsSync(manifestPath), false, 'writeManifest should not synchronously write state-manifest.json');
|
|
99
|
+
await flushManifest(base);
|
|
92
100
|
assert.ok(fs.existsSync(manifestPath), 'state-manifest.json should exist');
|
|
93
101
|
const raw = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
|
|
94
102
|
assert.strictEqual(raw.version, 1);
|
|
@@ -98,11 +106,11 @@ test('workflow-manifest: writeManifest creates state-manifest.json with version
|
|
|
98
106
|
}
|
|
99
107
|
});
|
|
100
108
|
|
|
101
|
-
test('workflow-manifest: readManifest parses manifest written by writeManifest', () => {
|
|
109
|
+
test('workflow-manifest: readManifest parses manifest written by writeManifest', async () => {
|
|
102
110
|
const base = tempDir();
|
|
103
111
|
openDatabase(tempDbPath(base));
|
|
104
112
|
try {
|
|
105
|
-
|
|
113
|
+
await writeManifestAndFlush(base);
|
|
106
114
|
const manifest = readManifest(base);
|
|
107
115
|
assert.ok(manifest !== null);
|
|
108
116
|
assert.strictEqual(manifest!.version, 1);
|
|
@@ -124,6 +132,25 @@ test('workflow-manifest: readManifest parses manifest written by writeManifest',
|
|
|
124
132
|
}
|
|
125
133
|
});
|
|
126
134
|
|
|
135
|
+
test('workflow-manifest: flushManifest writes the latest queued payload', async () => {
|
|
136
|
+
const base = tempDir();
|
|
137
|
+
openDatabase(tempDbPath(base));
|
|
138
|
+
try {
|
|
139
|
+
insertMilestone({ id: 'M001', title: 'First Milestone' });
|
|
140
|
+
writeManifest(base);
|
|
141
|
+
insertMilestone({ id: 'M002', title: 'Latest Milestone' });
|
|
142
|
+
writeManifest(base);
|
|
143
|
+
|
|
144
|
+
await flushManifest(base);
|
|
145
|
+
|
|
146
|
+
const manifest = readManifest(base);
|
|
147
|
+
assert.ok(manifest?.milestones.some((m) => m.id === 'M002'), 'latest queued write should be durable');
|
|
148
|
+
} finally {
|
|
149
|
+
closeDatabase();
|
|
150
|
+
cleanupDir(base);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
127
154
|
// ─── snapshotState: captures DB rows ─────────────────────────────────────
|
|
128
155
|
|
|
129
156
|
test('workflow-manifest: snapshotState includes inserted milestone', () => {
|
|
@@ -181,7 +208,7 @@ test('workflow-manifest: snapshotState captures memory-backed decisions', () =>
|
|
|
181
208
|
}
|
|
182
209
|
});
|
|
183
210
|
|
|
184
|
-
test('workflow-manifest: bootstrapFromManifest restores extended correctness rows', () => {
|
|
211
|
+
test('workflow-manifest: bootstrapFromManifest restores extended correctness rows', async () => {
|
|
185
212
|
const base = tempDir();
|
|
186
213
|
openDatabase(tempDbPath(base));
|
|
187
214
|
try {
|
|
@@ -256,7 +283,7 @@ test('workflow-manifest: bootstrapFromManifest restores extended correctness row
|
|
|
256
283
|
createdAt: '2026-06-05T00:00:00.000Z',
|
|
257
284
|
});
|
|
258
285
|
|
|
259
|
-
|
|
286
|
+
await writeManifestAndFlush(base);
|
|
260
287
|
closeDatabase();
|
|
261
288
|
|
|
262
289
|
const newDbPath = path.join(base, 'new.db');
|
|
@@ -306,7 +333,7 @@ test('workflow-manifest: bootstrapFromManifest returns false when no manifest fi
|
|
|
306
333
|
}
|
|
307
334
|
});
|
|
308
335
|
|
|
309
|
-
test('workflow-manifest: bootstrapFromManifest restores DB from manifest (round-trip)', () => {
|
|
336
|
+
test('workflow-manifest: bootstrapFromManifest restores DB from manifest (round-trip)', async () => {
|
|
310
337
|
const base = tempDir();
|
|
311
338
|
openDatabase(tempDbPath(base));
|
|
312
339
|
try {
|
|
@@ -326,7 +353,7 @@ test('workflow-manifest: bootstrapFromManifest restores DB from manifest (round-
|
|
|
326
353
|
status: 'complete',
|
|
327
354
|
planning: { fullPlanMd: '# Full Task Plan\n\nKeep this body.', targetRepositories: ['project'] },
|
|
328
355
|
});
|
|
329
|
-
|
|
356
|
+
await writeManifestAndFlush(base);
|
|
330
357
|
closeDatabase();
|
|
331
358
|
|
|
332
359
|
// Open a fresh DB and bootstrap from manifest
|
|
@@ -356,14 +383,14 @@ test('workflow-manifest: bootstrapFromManifest restores DB from manifest (round-
|
|
|
356
383
|
}
|
|
357
384
|
});
|
|
358
385
|
|
|
359
|
-
test('workflow-manifest: bootstrapFromManifest preserves target_repositories', () => {
|
|
386
|
+
test('workflow-manifest: bootstrapFromManifest preserves target_repositories', async () => {
|
|
360
387
|
const base = tempDir();
|
|
361
388
|
openDatabase(tempDbPath(base));
|
|
362
389
|
try {
|
|
363
390
|
insertMilestone({ id: 'M001', title: 'Restored Milestone' });
|
|
364
391
|
insertSlice({ id: 'S01', milestoneId: 'M001', planning: { targetRepositories: ['frontend'] } });
|
|
365
392
|
insertTask({ id: 'T01', sliceId: 'S01', milestoneId: 'M001', planning: { targetRepositories: ['backend'] } });
|
|
366
|
-
|
|
393
|
+
await writeManifestAndFlush(base);
|
|
367
394
|
closeDatabase();
|
|
368
395
|
|
|
369
396
|
const newDbPath = path.join(base, 'new.db');
|
|
@@ -380,14 +407,68 @@ test('workflow-manifest: bootstrapFromManifest preserves target_repositories', (
|
|
|
380
407
|
}
|
|
381
408
|
});
|
|
382
409
|
|
|
383
|
-
test('workflow-manifest: bootstrapFromManifest
|
|
410
|
+
test('workflow-manifest: bootstrapFromManifest does not truncate projections when artifact content is empty', async () => {
|
|
411
|
+
const base = tempDir();
|
|
412
|
+
openDatabase(tempDbPath(base));
|
|
413
|
+
try {
|
|
414
|
+
insertMilestone({ id: 'M001', title: 'Projection Milestone' });
|
|
415
|
+
insertArtifact({
|
|
416
|
+
path: '.gsd/milestones/M001/M001-PLAN.md',
|
|
417
|
+
artifact_type: 'PLAN',
|
|
418
|
+
milestone_id: 'M001',
|
|
419
|
+
slice_id: null,
|
|
420
|
+
task_id: null,
|
|
421
|
+
full_content: '# Manifest Plan',
|
|
422
|
+
});
|
|
423
|
+
insertArtifact({
|
|
424
|
+
path: '.gsd/milestones/M001/M001-VALIDATION.md',
|
|
425
|
+
artifact_type: 'VALIDATION',
|
|
426
|
+
milestone_id: 'M001',
|
|
427
|
+
slice_id: null,
|
|
428
|
+
task_id: null,
|
|
429
|
+
full_content: '# Manifest Validation',
|
|
430
|
+
});
|
|
431
|
+
await writeManifestAndFlush(base);
|
|
432
|
+
|
|
433
|
+
const planPath = path.join(base, '.gsd', 'milestones', 'M001', 'M001-PLAN.md');
|
|
434
|
+
const validationPath = path.join(base, '.gsd', 'milestones', 'M001', 'M001-VALIDATION.md');
|
|
435
|
+
fs.mkdirSync(path.dirname(planPath), { recursive: true });
|
|
436
|
+
fs.writeFileSync(planPath, '# Existing Plan\n\nKeep this.');
|
|
437
|
+
fs.writeFileSync(validationPath, '# Existing Validation\n\nKeep this.');
|
|
438
|
+
|
|
439
|
+
const manifestPath = path.join(base, '.gsd', 'state-manifest.json');
|
|
440
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;
|
|
441
|
+
const artifacts = manifest['artifacts'] as Array<Record<string, unknown>>;
|
|
442
|
+
const emptyArtifact = artifacts.find((r) => r['path'] === '.gsd/milestones/M001/M001-PLAN.md');
|
|
443
|
+
const absentArtifact = artifacts.find((r) => r['path'] === '.gsd/milestones/M001/M001-VALIDATION.md');
|
|
444
|
+
assert.ok(emptyArtifact !== undefined);
|
|
445
|
+
assert.ok(absentArtifact !== undefined);
|
|
446
|
+
emptyArtifact['full_content'] = '';
|
|
447
|
+
delete absentArtifact['full_content'];
|
|
448
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
449
|
+
closeDatabase();
|
|
450
|
+
|
|
451
|
+
const newDbPath = path.join(base, 'new.db');
|
|
452
|
+
openDatabase(newDbPath);
|
|
453
|
+
const restored = bootstrapFromManifest(base);
|
|
454
|
+
assert.strictEqual(restored, true);
|
|
455
|
+
|
|
456
|
+
assert.strictEqual(fs.readFileSync(planPath, 'utf-8'), '# Existing Plan\n\nKeep this.');
|
|
457
|
+
assert.strictEqual(fs.readFileSync(validationPath, 'utf-8'), '# Existing Validation\n\nKeep this.');
|
|
458
|
+
} finally {
|
|
459
|
+
closeDatabase();
|
|
460
|
+
cleanupDir(base);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
test('workflow-manifest: bootstrapFromManifest preserves optional rows from old manifests', async () => {
|
|
384
465
|
const base = tempDir();
|
|
385
466
|
openDatabase(tempDbPath(base));
|
|
386
467
|
try {
|
|
387
468
|
insertMilestone({ id: 'M001', title: 'Old Manifest Milestone' });
|
|
388
469
|
insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Old Manifest Slice' });
|
|
389
470
|
insertTask({ id: 'T01', sliceId: 'S01', milestoneId: 'M001', title: 'Old Manifest Task' });
|
|
390
|
-
|
|
471
|
+
await writeManifestAndFlush(base);
|
|
391
472
|
|
|
392
473
|
const manifestPath = path.join(base, '.gsd', 'state-manifest.json');
|
|
393
474
|
const oldManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;
|
|
@@ -450,12 +531,12 @@ test('workflow-manifest: bootstrapFromManifest preserves optional rows from old
|
|
|
450
531
|
}
|
|
451
532
|
});
|
|
452
533
|
|
|
453
|
-
test('workflow-manifest: bootstrapFromManifest restores memory-backed decisions', () => {
|
|
534
|
+
test('workflow-manifest: bootstrapFromManifest restores memory-backed decisions', async () => {
|
|
454
535
|
const base = tempDir();
|
|
455
536
|
openDatabase(tempDbPath(base));
|
|
456
537
|
try {
|
|
457
538
|
insertMemoryBackedDecision('D901');
|
|
458
|
-
|
|
539
|
+
await writeManifestAndFlush(base);
|
|
459
540
|
closeDatabase();
|
|
460
541
|
|
|
461
542
|
const newDbPath = path.join(base, 'new.db');
|
|
@@ -472,12 +553,12 @@ test('workflow-manifest: bootstrapFromManifest restores memory-backed decisions'
|
|
|
472
553
|
}
|
|
473
554
|
});
|
|
474
555
|
|
|
475
|
-
test('workflow-manifest: bootstrapFromManifest replaces stale memory-backed decisions', () => {
|
|
556
|
+
test('workflow-manifest: bootstrapFromManifest replaces stale memory-backed decisions', async () => {
|
|
476
557
|
const base = tempDir();
|
|
477
558
|
openDatabase(tempDbPath(base));
|
|
478
559
|
try {
|
|
479
560
|
insertMemoryBackedDecision('D902');
|
|
480
|
-
|
|
561
|
+
await writeManifestAndFlush(base);
|
|
481
562
|
closeDatabase();
|
|
482
563
|
|
|
483
564
|
const newDbPath = path.join(base, 'new.db');
|
|
@@ -29,6 +29,7 @@ test("preflight uses inline workflow MCP config when no project config is persis
|
|
|
29
29
|
`const { StdioServerTransport } = await import(${JSON.stringify(stdioModuleUrl)});`,
|
|
30
30
|
'const server = new McpServer({ name: "fake", version: "1.0.0" }, { capabilities: { tools: {} } });',
|
|
31
31
|
'server.tool("gsd_plan_slice", "Plan slice", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
|
|
32
|
+
'server.tool("gsd_plan_task", "Plan task", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
|
|
32
33
|
'server.tool("gsd_reassess_roadmap", "Reassess roadmap", {}, async () => ({ content: [{ type: "text", text: "ok" }] }));',
|
|
33
34
|
'await server.connect(new StdioServerTransport());',
|
|
34
35
|
].join("\n"),
|