gsd-pi 2.81.0 → 2.82.0-dev.2841a1e44
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 +63 -32
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +3 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/loop.js +111 -8
- package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
- package/dist/resources/extensions/gsd/auto/phases.js +199 -97
- package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
- package/dist/resources/extensions/gsd/auto/session.js +9 -0
- package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
- package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
- package/dist/resources/extensions/gsd/auto-post-unit.js +176 -125
- package/dist/resources/extensions/gsd/auto-prompts.js +13 -5
- package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
- package/dist/resources/extensions/gsd/auto-start.js +20 -23
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
- package/dist/resources/extensions/gsd/auto-verification.js +38 -26
- package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
- package/dist/resources/extensions/gsd/auto.js +371 -106
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +16 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +3 -1
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +4 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
- package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
- package/dist/resources/extensions/gsd/git-service.js +2 -1
- package/dist/resources/extensions/gsd/gsd-db.js +7 -23
- package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
- package/dist/resources/extensions/gsd/health-widget.js +4 -10
- package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
- package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
- package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
- package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
- package/dist/resources/extensions/gsd/session-lock.js +40 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
- package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
- package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
- package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
- package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
- package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +25 -2
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
- package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +743 -318
- package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +122 -0
- package/dist/resources/extensions/visual-brief/prompts.js +111 -0
- 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 +11 -11
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- 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.js +2 -2
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 +4 -4
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- 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 +5 -5
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- 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/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/{8359.e059d86b255fce1c.js → 8359.7eb3bb8f8ecf4c01.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-6a95bc41e0f7ec89.js} +1 -1
- package/dist/web/standalone/.next/static/css/0262768ec1b89d34.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +0 -7
- package/dist/welcome-screen.js +60 -69
- package/package.json +5 -4
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +14 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +22 -0
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
- package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
- package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
- package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
- package/packages/pi-tui/dist/overlay-layout.js +9 -6
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +5 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
- package/packages/pi-tui/src/overlay-layout.ts +10 -7
- package/packages/pi-tui/src/tui.ts +6 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
- package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +105 -1
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +27 -26
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +3 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
- package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
- package/src/resources/extensions/gsd/auto/loop.ts +113 -9
- package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
- package/src/resources/extensions/gsd/auto/phases.ts +158 -19
- package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
- package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +201 -138
- package/src/resources/extensions/gsd/auto-prompts.ts +13 -5
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
- package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
- package/src/resources/extensions/gsd/auto-start.ts +22 -22
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
- package/src/resources/extensions/gsd/auto-verification.ts +46 -38
- package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
- package/src/resources/extensions/gsd/auto.ts +411 -106
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +16 -6
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +3 -2
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +4 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +25 -1
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/git-service.ts +2 -0
- package/src/resources/extensions/gsd/gsd-db.ts +7 -23
- package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
- package/src/resources/extensions/gsd/health-widget.ts +6 -10
- package/src/resources/extensions/gsd/journal.ts +2 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
- package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
- package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
- package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
- package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
- package/src/resources/extensions/gsd/session-lock.ts +41 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
- package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
- package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
- package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +81 -3
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
- package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +35 -2
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
- package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1171 -526
- package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +134 -0
- package/src/resources/extensions/visual-brief/prompts.ts +147 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +172 -0
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Qgr2B_MRhPxC0z8fwv4vT}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Qgr2B_MRhPxC0z8fwv4vT}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import test from "node:test";
|
|
10
10
|
import assert from "node:assert/strict";
|
|
11
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync, realpathSync } from "node:fs";
|
|
11
|
+
import { existsSync, mkdtempSync, mkdirSync, writeFileSync, rmSync, readFileSync, realpathSync } from "node:fs";
|
|
12
12
|
import { join } from "node:path";
|
|
13
13
|
import { tmpdir } from "node:os";
|
|
14
14
|
import { execSync } from "node:child_process";
|
|
@@ -208,8 +208,8 @@ test("postflightPopStash conflict warning names the exact stash ref", () => {
|
|
|
208
208
|
assert.match(postflight.message, /failed after merge of milestone M005C/);
|
|
209
209
|
|
|
210
210
|
const warning = notifications.find((n) => n.level === "warning")?.msg ?? "";
|
|
211
|
-
assert.match(warning, /git stash pop stash@\{\d+\}/);
|
|
212
211
|
assert.match(warning, /git stash apply stash@\{\d+\}/);
|
|
212
|
+
assert.match(warning, /git stash drop stash@\{\d+\}/);
|
|
213
213
|
} finally {
|
|
214
214
|
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
|
|
215
215
|
}
|
|
@@ -279,3 +279,108 @@ test("postflightPopStash falls back to milestone marker prefix when exact marker
|
|
|
279
279
|
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
|
|
280
280
|
}
|
|
281
281
|
});
|
|
282
|
+
|
|
283
|
+
test("postflightPopStash preserves stash when untracked collision differs from merged file", () => {
|
|
284
|
+
const repo = createTempRepo();
|
|
285
|
+
try {
|
|
286
|
+
writeFileSync(join(repo, "tests.txt"), "local preflight test\n");
|
|
287
|
+
const preflight = preflightCleanRoot(repo, "M009", () => {});
|
|
288
|
+
assert.equal(preflight.stashPushed, true, "preflight must stash untracked file");
|
|
289
|
+
|
|
290
|
+
writeFileSync(join(repo, "tests.txt"), "merged milestone test\n");
|
|
291
|
+
run("git add tests.txt", repo);
|
|
292
|
+
run('git commit -m "feat: add merged test"', repo);
|
|
293
|
+
|
|
294
|
+
const notifications: Array<{ msg: string; level: string }> = [];
|
|
295
|
+
const postflight = postflightPopStash(repo, "M009", preflight.stashMarker, (msg, level) => {
|
|
296
|
+
notifications.push({ msg, level });
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
assert.equal(postflight.needsManualRecovery, false, "different already-present untracked files must not stop auto-mode");
|
|
300
|
+
assert.equal(postflight.resolution, "already-present-preserved");
|
|
301
|
+
assert.deepEqual(postflight.collidedPaths, ["tests.txt"]);
|
|
302
|
+
assert.equal(readFileSync(join(repo, "tests.txt"), "utf-8"), "merged milestone test\n");
|
|
303
|
+
assert.equal(run("git status --porcelain", repo), "", "merged file must stay clean");
|
|
304
|
+
|
|
305
|
+
const stashList = run("git stash list", repo);
|
|
306
|
+
assert.ok(preflight.stashMarker && stashList.includes(preflight.stashMarker), "stash backup must be preserved");
|
|
307
|
+
assert.ok(
|
|
308
|
+
notifications.some((n) => n.level === "warning" && n.msg.includes("preserving")),
|
|
309
|
+
"user must be warned that the stash was preserved as backup",
|
|
310
|
+
);
|
|
311
|
+
} finally {
|
|
312
|
+
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
test("postflightPopStash drops stash when untracked collision is identical to merged file", () => {
|
|
317
|
+
const repo = createTempRepo();
|
|
318
|
+
try {
|
|
319
|
+
writeFileSync(join(repo, "tests.txt"), "same test content\n");
|
|
320
|
+
const preflight = preflightCleanRoot(repo, "M010", () => {});
|
|
321
|
+
assert.equal(preflight.stashPushed, true, "preflight must stash untracked file");
|
|
322
|
+
|
|
323
|
+
writeFileSync(join(repo, "tests.txt"), "same test content\n");
|
|
324
|
+
run("git add tests.txt", repo);
|
|
325
|
+
run('git commit -m "feat: add same test"', repo);
|
|
326
|
+
|
|
327
|
+
const postflight = postflightPopStash(repo, "M010", preflight.stashMarker, () => {});
|
|
328
|
+
|
|
329
|
+
assert.equal(postflight.needsManualRecovery, false, "identical already-present files must not stop auto-mode");
|
|
330
|
+
assert.equal(postflight.resolution, "already-present-dropped");
|
|
331
|
+
assert.equal(readFileSync(join(repo, "tests.txt"), "utf-8"), "same test content\n");
|
|
332
|
+
|
|
333
|
+
const stashList = run("git stash list", repo);
|
|
334
|
+
assert.ok(!stashList.includes(preflight.stashMarker ?? ""), "identical stash must be dropped");
|
|
335
|
+
} finally {
|
|
336
|
+
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
test("postflightPopStash requires manual recovery for mixed tracked changes and untracked collision", () => {
|
|
341
|
+
const repo = createTempRepo();
|
|
342
|
+
try {
|
|
343
|
+
writeFileSync(join(repo, "README.md"), "# local tracked work\n");
|
|
344
|
+
writeFileSync(join(repo, "tests.txt"), "local untracked work\n");
|
|
345
|
+
const preflight = preflightCleanRoot(repo, "M011", () => {});
|
|
346
|
+
assert.equal(preflight.stashPushed, true, "preflight must stash mixed changes");
|
|
347
|
+
|
|
348
|
+
writeFileSync(join(repo, "tests.txt"), "merged milestone test\n");
|
|
349
|
+
run("git add tests.txt", repo);
|
|
350
|
+
run('git commit -m "feat: add merged test"', repo);
|
|
351
|
+
|
|
352
|
+
const postflight = postflightPopStash(repo, "M011", preflight.stashMarker, () => {});
|
|
353
|
+
|
|
354
|
+
assert.equal(postflight.needsManualRecovery, true, "tracked stash payload must still require manual recovery");
|
|
355
|
+
assert.equal(postflight.resolution, "manual-recovery");
|
|
356
|
+
const stashList = run("git stash list", repo);
|
|
357
|
+
assert.ok(preflight.stashMarker && stashList.includes(preflight.stashMarker), "mixed stash must be preserved");
|
|
358
|
+
} finally {
|
|
359
|
+
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
test("postflightPopStash requires manual recovery when an untracked stash path is missing after collision", () => {
|
|
364
|
+
const repo = createTempRepo();
|
|
365
|
+
try {
|
|
366
|
+
writeFileSync(join(repo, "tests.txt"), "local untracked work\n");
|
|
367
|
+
writeFileSync(join(repo, "other-tests.txt"), "other local untracked work\n");
|
|
368
|
+
const preflight = preflightCleanRoot(repo, "M012", () => {});
|
|
369
|
+
assert.equal(preflight.stashPushed, true, "preflight must stash untracked files");
|
|
370
|
+
|
|
371
|
+
writeFileSync(join(repo, "tests.txt"), "merged milestone test\n");
|
|
372
|
+
run("git add tests.txt", repo);
|
|
373
|
+
run('git commit -m "feat: add one merged test"', repo);
|
|
374
|
+
|
|
375
|
+
const postflight = postflightPopStash(repo, "M012", preflight.stashMarker, () => {});
|
|
376
|
+
|
|
377
|
+
assert.equal(postflight.needsManualRecovery, true, "partial untracked restores must still require manual recovery");
|
|
378
|
+
assert.equal(postflight.resolution, "manual-recovery");
|
|
379
|
+
assert.equal(existsSync(join(repo, "other-tests.txt")), true, "git may partially restore the non-colliding path");
|
|
380
|
+
assert.match(run("git status --porcelain", repo), /\?\? other-tests\.txt/, "partial restore must leave manual recovery visible");
|
|
381
|
+
const stashList = run("git stash list", repo);
|
|
382
|
+
assert.ok(preflight.stashMarker && stashList.includes(preflight.stashMarker), "stash must remain for manual recovery");
|
|
383
|
+
} finally {
|
|
384
|
+
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
|
|
385
|
+
}
|
|
386
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Tests closeout git action deferral policy for auto-mode units.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
|
|
7
|
+
import { shouldDeferCloseoutGitAction } from "../auto-post-unit.ts";
|
|
8
|
+
|
|
9
|
+
test("execute-task defers closeout git action until verification passes", () => {
|
|
10
|
+
assert.equal(shouldDeferCloseoutGitAction("execute-task"), true);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test("non execute-task units keep pre-verification closeout git action", () => {
|
|
14
|
+
assert.equal(shouldDeferCloseoutGitAction("plan-slice"), false);
|
|
15
|
+
assert.equal(shouldDeferCloseoutGitAction("complete-slice"), false);
|
|
16
|
+
});
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
// ADR-013 Phase 6 cutover (Stage 1) — queryDecisionsFromMemories parity test.
|
|
2
|
+
//
|
|
3
|
+
// Verifies that reading active decisions from the `memories` table returns
|
|
4
|
+
// the same Decision[] shape and content as the legacy `queryDecisions` read
|
|
5
|
+
// from the `decisions` table, once Phase 5 dual-write has populated both
|
|
6
|
+
// surfaces. Lock-in regression for the prompt-inline read path which was
|
|
7
|
+
// switched to the memories source in auto-prompts.ts:inlineDecisionsFromDb.
|
|
8
|
+
//
|
|
9
|
+
// Scope of parity: ACTIVE decisions only. Superseded rows are intentionally
|
|
10
|
+
// skipped by the existing backfill, so this test does not assert parity for
|
|
11
|
+
// the supersedes-chain — that gap is acknowledged in
|
|
12
|
+
// queryDecisionsFromMemories' contract and tracked for Stage 2/3.
|
|
13
|
+
|
|
14
|
+
import test from "node:test";
|
|
15
|
+
import assert from "node:assert/strict";
|
|
16
|
+
import { mkdtempSync, mkdirSync, rmSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { tmpdir } from "node:os";
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
closeDatabase,
|
|
22
|
+
insertDecision,
|
|
23
|
+
openDatabase,
|
|
24
|
+
} from "../gsd-db.ts";
|
|
25
|
+
import { saveDecisionToDb } from "../db-writer.ts";
|
|
26
|
+
import {
|
|
27
|
+
queryDecisions,
|
|
28
|
+
queryDecisionsFromMemories,
|
|
29
|
+
} from "../context-store.ts";
|
|
30
|
+
|
|
31
|
+
function makeTmpBase(): string {
|
|
32
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-decisions-memories-"));
|
|
33
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
34
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
35
|
+
return base;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function cleanup(base: string): void {
|
|
39
|
+
try {
|
|
40
|
+
closeDatabase();
|
|
41
|
+
} catch {
|
|
42
|
+
/* noop */
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
rmSync(base, { recursive: true, force: true });
|
|
46
|
+
} catch {
|
|
47
|
+
/* noop */
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function seedDecision(
|
|
52
|
+
base: string,
|
|
53
|
+
fields: {
|
|
54
|
+
when_context: string;
|
|
55
|
+
scope: string;
|
|
56
|
+
decision: string;
|
|
57
|
+
choice: string;
|
|
58
|
+
rationale: string;
|
|
59
|
+
revisable?: string;
|
|
60
|
+
made_by?: "human" | "agent" | "collaborative";
|
|
61
|
+
},
|
|
62
|
+
): Promise<string> {
|
|
63
|
+
// saveDecisionToDb writes ONLY to memories post-Stage-3. For parity tests
|
|
64
|
+
// comparing the legacy `queryDecisions` against `queryDecisionsFromMemories`,
|
|
65
|
+
// mirror the same row into the legacy decisions table directly so both
|
|
66
|
+
// surfaces hold the same data and the parity assertion is well-defined.
|
|
67
|
+
const result = await saveDecisionToDb(
|
|
68
|
+
{
|
|
69
|
+
when_context: fields.when_context,
|
|
70
|
+
scope: fields.scope,
|
|
71
|
+
decision: fields.decision,
|
|
72
|
+
choice: fields.choice,
|
|
73
|
+
rationale: fields.rationale,
|
|
74
|
+
revisable: fields.revisable ?? "Yes",
|
|
75
|
+
made_by: fields.made_by ?? "agent",
|
|
76
|
+
},
|
|
77
|
+
base,
|
|
78
|
+
);
|
|
79
|
+
insertDecision({
|
|
80
|
+
id: result.id,
|
|
81
|
+
when_context: fields.when_context,
|
|
82
|
+
scope: fields.scope,
|
|
83
|
+
decision: fields.decision,
|
|
84
|
+
choice: fields.choice,
|
|
85
|
+
rationale: fields.rationale,
|
|
86
|
+
revisable: fields.revisable ?? "Yes",
|
|
87
|
+
made_by: fields.made_by ?? "agent",
|
|
88
|
+
superseded_by: null,
|
|
89
|
+
});
|
|
90
|
+
return result.id;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
test("queryDecisionsFromMemories returns empty when no decisions exist", () => {
|
|
94
|
+
const base = makeTmpBase();
|
|
95
|
+
try {
|
|
96
|
+
assert.deepEqual(queryDecisionsFromMemories(), []);
|
|
97
|
+
assert.deepEqual(queryDecisionsFromMemories({ milestoneId: "M001" }), []);
|
|
98
|
+
} finally {
|
|
99
|
+
cleanup(base);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("queryDecisionsFromMemories matches queryDecisions for a single active decision", async () => {
|
|
104
|
+
const base = makeTmpBase();
|
|
105
|
+
try {
|
|
106
|
+
await seedDecision(base, {
|
|
107
|
+
when_context: "M001 discuss phase",
|
|
108
|
+
scope: "M001",
|
|
109
|
+
decision: "Adopt SQLite for persistence",
|
|
110
|
+
choice: "better-sqlite3",
|
|
111
|
+
rationale: "Native, synchronous, well-supported",
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const fromDecisions = queryDecisions();
|
|
115
|
+
const fromMemories = queryDecisionsFromMemories();
|
|
116
|
+
|
|
117
|
+
assert.equal(fromDecisions.length, 1);
|
|
118
|
+
assert.equal(fromMemories.length, 1);
|
|
119
|
+
|
|
120
|
+
// Compare the user-visible Decision fields. seq differs across tables
|
|
121
|
+
// (memories.seq vs decisions.seq) so it's intentionally excluded.
|
|
122
|
+
const { seq: _seq1, ...d1 } = fromDecisions[0]!;
|
|
123
|
+
const { seq: _seq2, ...d2 } = fromMemories[0]!;
|
|
124
|
+
assert.deepEqual(d1, d2);
|
|
125
|
+
} finally {
|
|
126
|
+
cleanup(base);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test("queryDecisionsFromMemories preserves decision order across multiple writes", async () => {
|
|
131
|
+
const base = makeTmpBase();
|
|
132
|
+
try {
|
|
133
|
+
const id1 = await seedDecision(base, {
|
|
134
|
+
when_context: "M001 discuss",
|
|
135
|
+
scope: "M001",
|
|
136
|
+
decision: "First decision",
|
|
137
|
+
choice: "A",
|
|
138
|
+
rationale: "first",
|
|
139
|
+
});
|
|
140
|
+
const id2 = await seedDecision(base, {
|
|
141
|
+
when_context: "M001 plan",
|
|
142
|
+
scope: "M001",
|
|
143
|
+
decision: "Second decision",
|
|
144
|
+
choice: "B",
|
|
145
|
+
rationale: "second",
|
|
146
|
+
});
|
|
147
|
+
const id3 = await seedDecision(base, {
|
|
148
|
+
when_context: "M002 discuss",
|
|
149
|
+
scope: "M002",
|
|
150
|
+
decision: "Third decision",
|
|
151
|
+
choice: "C",
|
|
152
|
+
rationale: "third",
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const fromMemories = queryDecisionsFromMemories();
|
|
156
|
+
assert.equal(fromMemories.length, 3);
|
|
157
|
+
assert.deepEqual(
|
|
158
|
+
fromMemories.map((d) => d.id),
|
|
159
|
+
[id1, id2, id3],
|
|
160
|
+
);
|
|
161
|
+
} finally {
|
|
162
|
+
cleanup(base);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test("queryDecisionsFromMemories filters by milestoneId (substring match on when_context)", async () => {
|
|
167
|
+
const base = makeTmpBase();
|
|
168
|
+
try {
|
|
169
|
+
await seedDecision(base, {
|
|
170
|
+
when_context: "M001 discuss",
|
|
171
|
+
scope: "M001",
|
|
172
|
+
decision: "M001 decision",
|
|
173
|
+
choice: "A",
|
|
174
|
+
rationale: "x",
|
|
175
|
+
});
|
|
176
|
+
await seedDecision(base, {
|
|
177
|
+
when_context: "M002 plan",
|
|
178
|
+
scope: "M002",
|
|
179
|
+
decision: "M002 decision",
|
|
180
|
+
choice: "B",
|
|
181
|
+
rationale: "y",
|
|
182
|
+
});
|
|
183
|
+
await seedDecision(base, {
|
|
184
|
+
when_context: "M001 execute",
|
|
185
|
+
scope: "M001-S01",
|
|
186
|
+
decision: "M001 follow-up",
|
|
187
|
+
choice: "C",
|
|
188
|
+
rationale: "z",
|
|
189
|
+
});
|
|
190
|
+
await seedDecision(base, {
|
|
191
|
+
when_context: "M003 plan",
|
|
192
|
+
scope: "M003",
|
|
193
|
+
decision: "Use M001 as precedent",
|
|
194
|
+
choice: "D",
|
|
195
|
+
rationale: "Mentions M001 outside when_context",
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
const m001 = queryDecisionsFromMemories({ milestoneId: "M001" });
|
|
199
|
+
assert.equal(m001.length, 2, "two decisions reference M001 in when_context");
|
|
200
|
+
assert.ok(m001.every((d) => d.when_context.includes("M001")));
|
|
201
|
+
|
|
202
|
+
const m002 = queryDecisionsFromMemories({ milestoneId: "M002" });
|
|
203
|
+
assert.equal(m002.length, 1);
|
|
204
|
+
assert.equal(m002[0]?.decision, "M002 decision");
|
|
205
|
+
} finally {
|
|
206
|
+
cleanup(base);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test("queryDecisionsFromMemories filters by scope (exact match, no prefix collisions)", async () => {
|
|
211
|
+
const base = makeTmpBase();
|
|
212
|
+
try {
|
|
213
|
+
await seedDecision(base, {
|
|
214
|
+
when_context: "M001 discuss",
|
|
215
|
+
scope: "M001",
|
|
216
|
+
decision: "Milestone-level",
|
|
217
|
+
choice: "A",
|
|
218
|
+
rationale: "x",
|
|
219
|
+
});
|
|
220
|
+
await seedDecision(base, {
|
|
221
|
+
when_context: "M001 plan",
|
|
222
|
+
scope: "M001-S01",
|
|
223
|
+
decision: "Slice-level",
|
|
224
|
+
choice: "B",
|
|
225
|
+
rationale: "y",
|
|
226
|
+
});
|
|
227
|
+
await seedDecision(base, {
|
|
228
|
+
when_context: "M001 plan",
|
|
229
|
+
scope: "M001-S02",
|
|
230
|
+
decision: "Different slice",
|
|
231
|
+
choice: "C",
|
|
232
|
+
rationale: "z",
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
// Exact-scope filter must not match prefix-similar values.
|
|
236
|
+
const milestoneScope = queryDecisionsFromMemories({ scope: "M001" });
|
|
237
|
+
assert.equal(milestoneScope.length, 1, "scope=M001 must not match M001-S01 / M001-S02");
|
|
238
|
+
assert.equal(milestoneScope[0]?.scope, "M001");
|
|
239
|
+
|
|
240
|
+
const sliceScope = queryDecisionsFromMemories({ scope: "M001-S01" });
|
|
241
|
+
assert.equal(sliceScope.length, 1);
|
|
242
|
+
assert.equal(sliceScope[0]?.scope, "M001-S01");
|
|
243
|
+
} finally {
|
|
244
|
+
cleanup(base);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test("queryDecisionsFromMemories matches queryDecisions for combined milestoneId + scope filters", async () => {
|
|
249
|
+
const base = makeTmpBase();
|
|
250
|
+
try {
|
|
251
|
+
await seedDecision(base, {
|
|
252
|
+
when_context: "M001 discuss",
|
|
253
|
+
scope: "M001",
|
|
254
|
+
decision: "A",
|
|
255
|
+
choice: "1",
|
|
256
|
+
rationale: "x",
|
|
257
|
+
});
|
|
258
|
+
await seedDecision(base, {
|
|
259
|
+
when_context: "M001 plan",
|
|
260
|
+
scope: "M001-S01",
|
|
261
|
+
decision: "B",
|
|
262
|
+
choice: "2",
|
|
263
|
+
rationale: "y",
|
|
264
|
+
});
|
|
265
|
+
await seedDecision(base, {
|
|
266
|
+
when_context: "M002 discuss",
|
|
267
|
+
scope: "M002",
|
|
268
|
+
decision: "C",
|
|
269
|
+
choice: "3",
|
|
270
|
+
rationale: "z",
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
const opts = { milestoneId: "M001", scope: "M001-S01" };
|
|
274
|
+
const fromDecisions = queryDecisions(opts);
|
|
275
|
+
const fromMemories = queryDecisionsFromMemories(opts);
|
|
276
|
+
|
|
277
|
+
assert.equal(fromDecisions.length, fromMemories.length);
|
|
278
|
+
assert.equal(fromMemories.length, 1);
|
|
279
|
+
assert.equal(fromMemories[0]?.id, fromDecisions[0]?.id);
|
|
280
|
+
assert.equal(fromMemories[0]?.scope, "M001-S01");
|
|
281
|
+
} finally {
|
|
282
|
+
cleanup(base);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test("queryDecisionsFromMemories ignores memories without a sourceDecisionId marker", async () => {
|
|
287
|
+
const base = makeTmpBase();
|
|
288
|
+
try {
|
|
289
|
+
// Insert a user-authored memory (no sourceDecisionId) — must not appear in
|
|
290
|
+
// the decisions-from-memories projection.
|
|
291
|
+
const { createMemory } = await import("../memory-store.ts");
|
|
292
|
+
createMemory({
|
|
293
|
+
category: "architecture",
|
|
294
|
+
content: "User-authored architecture note, not derived from a decision",
|
|
295
|
+
scope: "project",
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
await seedDecision(base, {
|
|
299
|
+
when_context: "M001 discuss",
|
|
300
|
+
scope: "M001",
|
|
301
|
+
decision: "Real decision",
|
|
302
|
+
choice: "A",
|
|
303
|
+
rationale: "x",
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
const fromMemories = queryDecisionsFromMemories();
|
|
307
|
+
assert.equal(fromMemories.length, 1, "user-authored memory must not appear as a decision");
|
|
308
|
+
assert.equal(fromMemories[0]?.decision, "Real decision");
|
|
309
|
+
} finally {
|
|
310
|
+
cleanup(base);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
@@ -182,7 +182,6 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
|
|
|
182
182
|
pruneQueueOrder: () => {},
|
|
183
183
|
isInAutoWorktree: () => false,
|
|
184
184
|
shouldUseWorktreeIsolation: () => false,
|
|
185
|
-
mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: false }),
|
|
186
185
|
teardownAutoWorktree: () => {},
|
|
187
186
|
createAutoWorktree: () => "/tmp/wt",
|
|
188
187
|
captureIntegrationBranch: () => {},
|
|
@@ -420,6 +419,10 @@ describe("Custom engine loop integration", () => {
|
|
|
420
419
|
await autoLoop(ctx, pi, s, deps);
|
|
421
420
|
|
|
422
421
|
assert.deepEqual(turnResults, [{ status: "completed", failureClass: "none", error: undefined }]);
|
|
422
|
+
assert.ok(
|
|
423
|
+
deps.callLog.includes("journal:iteration-end"),
|
|
424
|
+
`complete workflow should emit iteration-end; log=${deps.callLog.join(",")}`,
|
|
425
|
+
);
|
|
423
426
|
assert.ok(
|
|
424
427
|
deps.callLog.indexOf("turnResult:completed") < deps.callLog.indexOf("stopAuto:Workflow complete"),
|
|
425
428
|
`turn should finalize before stopAuto; log=${deps.callLog.join(",")}`,
|
|
@@ -472,6 +475,10 @@ describe("Custom engine loop integration", () => {
|
|
|
472
475
|
assert.equal(turnResults[0].status, "stopped");
|
|
473
476
|
assert.equal(turnResults[0].failureClass, "manual-attention");
|
|
474
477
|
assert.match(turnResults[0].error ?? "", /custom-engine-dispatch-stop/);
|
|
478
|
+
assert.ok(
|
|
479
|
+
deps.callLog.includes("journal:iteration-end"),
|
|
480
|
+
`blocked workflow should emit iteration-end; log=${deps.callLog.join(",")}`,
|
|
481
|
+
);
|
|
475
482
|
assert.equal(s.currentTraceId, null);
|
|
476
483
|
assert.equal(s.currentTurnId, null);
|
|
477
484
|
assert.equal(pi.calls.length, 0, "blocked workflow should not dispatch a custom step");
|
|
@@ -664,11 +671,16 @@ describe("Custom engine loop integration", () => {
|
|
|
664
671
|
activeRunDir: runDir,
|
|
665
672
|
basePath: runDir,
|
|
666
673
|
});
|
|
674
|
+
const journalEvents: Array<{ eventType: string; data?: any }> = [];
|
|
667
675
|
const deps = makeMockDeps({
|
|
668
676
|
stopAuto: async (_ctx, _pi, reason) => {
|
|
669
677
|
deps.callLog.push(`stopAuto:${reason ?? "no-reason"}`);
|
|
670
678
|
s.active = false;
|
|
671
679
|
},
|
|
680
|
+
emitJournalEvent: (entry: any) => {
|
|
681
|
+
journalEvents.push(entry);
|
|
682
|
+
deps.callLog.push(`journal:${entry.eventType}`);
|
|
683
|
+
},
|
|
672
684
|
});
|
|
673
685
|
|
|
674
686
|
const resolver = setInterval(() => {
|
|
@@ -700,6 +712,21 @@ describe("Custom engine loop integration", () => {
|
|
|
700
712
|
assert.match(stopEntry ?? "", /requested retry 4 times without passing/);
|
|
701
713
|
const finalGraph = readGraph(runDir);
|
|
702
714
|
assert.equal(finalGraph.steps[0]?.status, "active", "failed verification must not reconcile the step complete");
|
|
715
|
+
|
|
716
|
+
const unitEndIndexes = journalEvents
|
|
717
|
+
.map((entry, index) => entry.eventType === "unit-end" ? index : -1)
|
|
718
|
+
.filter((index) => index >= 0);
|
|
719
|
+
const iterationEndIndexes = journalEvents
|
|
720
|
+
.map((entry, index) => entry.eventType === "iteration-end" ? index : -1)
|
|
721
|
+
.filter((index) => index >= 0);
|
|
722
|
+
assert.equal(unitEndIndexes.length, 4, "each custom verification retry/stop attempt must emit unit-end");
|
|
723
|
+
assert.equal(iterationEndIndexes.length, 4, "each custom verification retry/stop iteration must close after unit-end");
|
|
724
|
+
for (const [i, unitEndIndex] of unitEndIndexes.entries()) {
|
|
725
|
+
assert.ok(
|
|
726
|
+
iterationEndIndexes[i]! > unitEndIndex,
|
|
727
|
+
`custom verification attempt ${i + 1} should emit iteration-end after unit-end`,
|
|
728
|
+
);
|
|
729
|
+
}
|
|
703
730
|
});
|
|
704
731
|
|
|
705
732
|
it("persists custom verification retry budget across a session restart", async () => {
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
saveArtifactToDb,
|
|
28
28
|
extractDeferredSliceRef,
|
|
29
29
|
} from '../db-writer.ts';
|
|
30
|
+
import { getAllDecisionsFromMemories } from '../context-store.ts';
|
|
30
31
|
import type { Decision, Requirement } from '../types.ts';
|
|
31
32
|
|
|
32
33
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -326,11 +327,14 @@ describe('db-writer', () => {
|
|
|
326
327
|
|
|
327
328
|
assert.deepStrictEqual(result.id, 'D001', 'saveDecisionToDb returns D001 as first ID');
|
|
328
329
|
|
|
329
|
-
//
|
|
330
|
-
const
|
|
331
|
-
assert.
|
|
332
|
-
|
|
333
|
-
assert.
|
|
330
|
+
// ADR-013 Stage 3: decisions land in memories, not the legacy table.
|
|
331
|
+
const memoryDecisions = getAllDecisionsFromMemories();
|
|
332
|
+
assert.equal(memoryDecisions.length, 1, 'one memory row exists after save');
|
|
333
|
+
const memDecision = memoryDecisions[0];
|
|
334
|
+
assert.ok(memDecision, 'memory decision exists after save');
|
|
335
|
+
assert.equal(memDecision.id, 'D001');
|
|
336
|
+
assert.equal(memDecision.scope, 'arch', 'memory decision has correct scope');
|
|
337
|
+
assert.equal(memDecision.choice, 'Option A', 'memory decision has correct choice');
|
|
334
338
|
|
|
335
339
|
// Verify markdown file was written
|
|
336
340
|
const mdPath = path.join(tmpDir, '.gsd', 'DECISIONS.md');
|
|
@@ -394,10 +398,11 @@ describe('db-writer', () => {
|
|
|
394
398
|
assert.match(id, /^D\d{3}$/, `ID ${id} should match D### pattern`);
|
|
395
399
|
}
|
|
396
400
|
|
|
397
|
-
//
|
|
401
|
+
// ADR-013 Stage 3: verify all 5 exist in the memories table (decisions
|
|
402
|
+
// table receives no writes from saveDecisionToDb post-cutover).
|
|
403
|
+
const memoryIds = new Set(getAllDecisionsFromMemories().map((d) => d.id));
|
|
398
404
|
for (const id of ids) {
|
|
399
|
-
|
|
400
|
-
assert.ok(row, `Decision ${id} should exist in DB`);
|
|
405
|
+
assert.ok(memoryIds.has(id), `Decision ${id} should exist in memories`);
|
|
401
406
|
}
|
|
402
407
|
} finally {
|
|
403
408
|
closeDatabase();
|