gsd-pi 2.81.0 → 2.82.0-dev.ed17d078d
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 +60 -30
- package/dist/resources/.managed-resources-content-hash +1 -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/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 +7 -1
- package/dist/resources/extensions/gsd/auto-prompts.js +11 -3
- 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 +12 -6
- package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
- package/dist/resources/extensions/gsd/auto.js +386 -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/system-context.js +55 -12
- package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -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-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/tui/render-kit.js +74 -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 +722 -316
- package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
- 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 +6 -6
- 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/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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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/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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +6 -6
- 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.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/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/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 +3 -2
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +2 -0
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- 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/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/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -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 +7 -1
- package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
- 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 +12 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
- package/src/resources/extensions/gsd/auto.ts +424 -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/system-context.ts +58 -15
- package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -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-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 +291 -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/browser-tools-compatibility-declarations.test.ts +62 -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/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 +2 -2
- 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 +65 -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/verification-retry-policy.test.ts +83 -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 +572 -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 +18 -0
- package/src/resources/extensions/gsd/tui/render-kit.ts +109 -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 +1151 -524
- package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
- 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/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → YEvjuT-fsFfYQhDSWtueS}/_ssgManifest.js +0 -0
package/dist/welcome-screen.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Startup welcome screen rendering for the GSD terminal experience.
|
|
1
3
|
/**
|
|
2
4
|
* GSD Welcome Screen
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* Command-center layout: rounded terminal card with compact logo, project
|
|
7
|
+
* state, primary action, branch/workspace, and secondary hints.
|
|
6
8
|
* Falls back to simple text on narrow terminals (<70 cols) or non-TTY.
|
|
7
9
|
*/
|
|
8
10
|
import { readFileSync } from 'node:fs';
|
|
@@ -70,7 +72,27 @@ function visLen(s) {
|
|
|
70
72
|
}
|
|
71
73
|
/** Right-pad a string to the given visible width. */
|
|
72
74
|
function rpad(s, w) {
|
|
73
|
-
|
|
75
|
+
const clamped = clampVisible(s, w);
|
|
76
|
+
return clamped + ' '.repeat(Math.max(0, w - visLen(clamped)));
|
|
77
|
+
}
|
|
78
|
+
function rightAlign(left, right, width) {
|
|
79
|
+
if (!right)
|
|
80
|
+
return clampVisible(left, width);
|
|
81
|
+
const gap = Math.max(1, width - visLen(left) - visLen(right));
|
|
82
|
+
return clampVisible(left + ' '.repeat(gap) + right, width);
|
|
83
|
+
}
|
|
84
|
+
function frameLine(content, width) {
|
|
85
|
+
const inner = Math.max(1, width - 2);
|
|
86
|
+
return chalk.hex('#a7ba78')('│') + rpad(content, inner) + chalk.hex('#a7ba78')('│');
|
|
87
|
+
}
|
|
88
|
+
/** Clamp rendered terminal output by visible columns. Falls back to plain text only when truncating. */
|
|
89
|
+
function clampVisible(s, w) {
|
|
90
|
+
if (w <= 0)
|
|
91
|
+
return '';
|
|
92
|
+
if (visLen(s) <= w)
|
|
93
|
+
return s;
|
|
94
|
+
const plain = stripAnsi(s);
|
|
95
|
+
return plain.slice(0, Math.max(0, w - 1)) + '…';
|
|
74
96
|
}
|
|
75
97
|
export function buildWelcomeScreenLines(opts) {
|
|
76
98
|
const { version, remoteChannel } = opts;
|
|
@@ -80,20 +102,6 @@ export function buildWelcomeScreenLines(opts) {
|
|
|
80
102
|
if (termWidth < 70) {
|
|
81
103
|
return ['', ` Get Shit Done v${version}`, ` ${shortCwd}`, ''];
|
|
82
104
|
}
|
|
83
|
-
// ── Panel widths ────────────────────────────────────────────────────────────
|
|
84
|
-
// Layout: 1 leading space + LEFT_INNER logo content + 1 inner divider + RIGHT_INNER info
|
|
85
|
-
// Total: 1 + LEFT_INNER + 1 + RIGHT_INNER = termWidth
|
|
86
|
-
const LEFT_INNER = 34;
|
|
87
|
-
const RIGHT_INNER = termWidth - LEFT_INNER - 2; // 2 = leading space + inner divider
|
|
88
|
-
// ── Bar/divider chars (matching GLYPH.separator + widget ui.bar() style) ────
|
|
89
|
-
const H = '─', DV = '│', DS = '├';
|
|
90
|
-
// ── Left rows: blank + 6 logo lines + blank (8 total) ───────────────────────
|
|
91
|
-
const leftRows = ['', ...GSD_LOGO, ''];
|
|
92
|
-
// ── Right rows (8 total, null = divider) ────────────────────────────────────
|
|
93
|
-
const titleLeft = ` ${chalk.bold('Get Shit Done')}`;
|
|
94
|
-
const titleRight = chalk.dim(`v${version}`);
|
|
95
|
-
const titleFill = RIGHT_INNER - visLen(titleLeft) - visLen(titleRight);
|
|
96
|
-
const titleRow = titleLeft + ' '.repeat(Math.max(1, titleFill)) + titleRight;
|
|
97
105
|
const toolParts = [];
|
|
98
106
|
if (process.env.BRAVE_API_KEY)
|
|
99
107
|
toolParts.push('Brave ✓');
|
|
@@ -107,71 +115,54 @@ export function buildWelcomeScreenLines(opts) {
|
|
|
107
115
|
toolParts.push('Context7 ✓');
|
|
108
116
|
if (remoteChannel)
|
|
109
117
|
toolParts.push(`${remoteChannel.charAt(0).toUpperCase() + remoteChannel.slice(1)} ✓`);
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
|
|
118
|
+
const innerWidth = Math.max(1, termWidth - 2);
|
|
119
|
+
const logoWidth = Math.max(...GSD_LOGO.map((line) => visLen(line)));
|
|
120
|
+
const divider = ` ${chalk.dim('│')} `;
|
|
121
|
+
const panelWidth = innerWidth - logoWidth - visLen(divider);
|
|
122
|
+
if (panelWidth < 44) {
|
|
123
|
+
return ['', ` Get Shit Done v${version}`, ` ${shortCwd}`, ''];
|
|
124
|
+
}
|
|
115
125
|
// "Welcome back" context lines — GSD state if available, else hint.
|
|
116
126
|
// Intentionally avoids data already shown in the footer (model, provider,
|
|
117
127
|
// pwd, branch).
|
|
118
128
|
const state = readGsdState();
|
|
119
|
-
let
|
|
120
|
-
let
|
|
129
|
+
let projectText = 'No active GSD project';
|
|
130
|
+
let commandText = '/gsd start';
|
|
131
|
+
let modeText = 'manual';
|
|
121
132
|
if (state?.milestone) {
|
|
122
133
|
const statusParts = [state.milestone, state.phase, state.slice].filter(Boolean);
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
activeText = activeText.slice(0, maxActiveLen - 1) + '…';
|
|
128
|
-
line1 = `${activePrefix}${chalk.dim(activeText)}`;
|
|
129
|
-
line2 = state.nextAction
|
|
130
|
-
? ` Next ${chalk.dim(state.nextAction)}`
|
|
131
|
-
: '';
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
line1 = ` Status ${chalk.dim('No active GSD project')}`;
|
|
135
|
-
line2 = ` ${chalk.dim('/gsd to begin')}`;
|
|
134
|
+
projectText = statusParts.join(' · ');
|
|
135
|
+
const maxActionWidth = Math.max(10, panelWidth - 30);
|
|
136
|
+
commandText = state.nextAction ? clampVisible(state.nextAction, maxActionWidth) : '/gsd next';
|
|
137
|
+
modeText = state.phase ?? 'active';
|
|
136
138
|
}
|
|
137
|
-
const sessionLine = line1;
|
|
138
|
-
const projectLine = line2;
|
|
139
139
|
const mcpCount = countMcpServers();
|
|
140
|
-
const
|
|
141
|
-
?
|
|
142
|
-
:
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
'',
|
|
151
|
-
|
|
152
|
-
|
|
140
|
+
const mcpText = toolParts.length > 0
|
|
141
|
+
? toolParts.join(' · ')
|
|
142
|
+
: mcpCount > 0
|
|
143
|
+
? `${mcpCount} server${mcpCount === 1 ? '' : 's'} configured`
|
|
144
|
+
: 'none configured';
|
|
145
|
+
const label = (s) => chalk.dim(s);
|
|
146
|
+
const value = (s) => chalk.hex('#dce4f2')(s);
|
|
147
|
+
const accent = (s) => chalk.hex('#8db7ff')(s);
|
|
148
|
+
const panelRows = [
|
|
149
|
+
rightAlign(`${accent('GSD')} ${chalk.bold(value('Project Console'))}`, chalk.dim(`v${version}`), panelWidth),
|
|
150
|
+
rightAlign(`${label('Project')} ${value(projectText)}`, `${label('Command')} ${accent(commandText)}`, panelWidth),
|
|
151
|
+
rightAlign(`${label('Workspace')} ${value(shortCwd)}`, `${label('Mode')} ${value(modeText)}`, panelWidth),
|
|
152
|
+
rightAlign(`${label('MCP')} ${chalk.dim(mcpText)}`, `${label('Status')} ${value(state?.milestone ? 'active' : 'idle')}`, panelWidth),
|
|
153
|
+
rightAlign(`${label('Next')} ${accent('/gsd to begin')}`, `${label('Setup')} ${accent('/gsd start')}`, panelWidth),
|
|
154
|
+
rightAlign(chalk.dim('/gsd templates'), chalk.dim('/gsd help'), panelWidth),
|
|
153
155
|
];
|
|
154
156
|
// ── Render ──────────────────────────────────────────────────────────────────
|
|
155
157
|
const out = [''];
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const lContent = rpad(row ? chalk.cyan(row) : '', LEFT_INNER);
|
|
161
|
-
const rRow = rightRows[i];
|
|
162
|
-
if (rRow === null) {
|
|
163
|
-
// Section divider: left logo area + dim ├────... extending right
|
|
164
|
-
out.push(' ' + lContent + chalk.dim(DS + H.repeat(RIGHT_INNER)));
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
// Content row: 1 space + logo │ info (no outer vertical borders)
|
|
168
|
-
out.push(' ' + lContent + chalk.dim(DV) + rpad(rRow, RIGHT_INNER));
|
|
169
|
-
}
|
|
158
|
+
out.push(chalk.hex('#a7ba78')('╭' + '─'.repeat(termWidth - 2) + '╮'));
|
|
159
|
+
for (let i = 0; i < GSD_LOGO.length; i++) {
|
|
160
|
+
const logo = rpad(chalk.hex('#a7ba78')(GSD_LOGO[i]), logoWidth);
|
|
161
|
+
out.push(frameLine(`${logo}${divider}${panelRows[i] ?? ''}`, termWidth));
|
|
170
162
|
}
|
|
171
|
-
|
|
172
|
-
out.push(chalk.cyan(H.repeat(termWidth)));
|
|
163
|
+
out.push(chalk.hex('#a7ba78')('╰' + '─'.repeat(termWidth - 2) + '╯'));
|
|
173
164
|
out.push('');
|
|
174
|
-
return out;
|
|
165
|
+
return out.map((line) => clampVisible(line, termWidth));
|
|
175
166
|
}
|
|
176
167
|
export function printWelcomeScreen(opts) {
|
|
177
168
|
if (!process.stderr.isTTY)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-pi",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.82.0-dev.ed17d078d",
|
|
4
4
|
"description": "GSD — Get Shit Done coding agent",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"test:packages:compiled": "node scripts/run-package-tests.cjs",
|
|
74
74
|
"verify:workspace-coverage": "node scripts/verify-workspace-coverage.cjs",
|
|
75
75
|
"test:marketplace": "node scripts/with-env.mjs GSD_TEST_CLONE_MARKETPLACES=1 -- node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/resources/extensions/gsd/tests/claude-import-tui.test.ts src/resources/extensions/gsd/tests/plugin-importer-live.test.ts src/tests/marketplace-discovery.test.ts",
|
|
76
|
-
"test:coverage": "c8 --reporter=text --reporter=lcov --exclude=\"src/resources/extensions/gsd/tests/**\" --exclude=\"src/tests/**\" --exclude=\"scripts/**\" --exclude=\"native/**\" --exclude=\"node_modules/**\" --check-coverage --statements=40 --lines=40 --branches=20 --functions=20 node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --experimental-test-isolation=process --test src/resources/extensions/gsd/tests/*.test.ts src/resources/extensions/gsd/tests/*.test.mjs src/tests/*.test.ts src/resources/extensions/shared/tests/*.test.ts",
|
|
76
|
+
"test:coverage": "cross-env NODE_OPTIONS=--max-old-space-size=8192 c8 --reporter=text --reporter=lcov --exclude=\"src/resources/extensions/gsd/tests/**\" --exclude=\"src/tests/**\" --exclude=\"scripts/**\" --exclude=\"native/**\" --exclude=\"node_modules/**\" --check-coverage --statements=40 --lines=40 --branches=20 --functions=20 node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --experimental-test-isolation=process --test src/resources/extensions/gsd/tests/*.test.ts src/resources/extensions/gsd/tests/*.test.mjs src/tests/*.test.ts src/resources/extensions/shared/tests/*.test.ts",
|
|
77
77
|
"test:integration": "node --import ./src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test \"src/tests/integration/*.test.ts\" \"src/resources/extensions/gsd/tests/integration/*.test.ts\" \"src/resources/extensions/async-jobs/*.test.ts\" \"src/resources/extensions/browser-tools/tests/*.test.mjs\"",
|
|
78
78
|
"pretest": "npm run typecheck:extensions",
|
|
79
79
|
"test": "npm run test:unit && npm run test:integration && npm run test:packages",
|
|
@@ -149,6 +149,7 @@
|
|
|
149
149
|
"@types/node": "^24.12.0",
|
|
150
150
|
"@types/picomatch": "^4.0.2",
|
|
151
151
|
"c8": "^11.0.0",
|
|
152
|
+
"cross-env": "^7.0.3",
|
|
152
153
|
"esbuild": "^0.25.12",
|
|
153
154
|
"jiti": "^2.6.1",
|
|
154
155
|
"typescript": "^5.4.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gsd-build/daemon",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.82.0",
|
|
4
4
|
"description": "GSD daemon — background process for project monitoring and Discord integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@anthropic-ai/sdk": "^0.52.0",
|
|
32
32
|
"@gsd-build/contracts": "^2.80.0",
|
|
33
|
-
"@gsd-build/rpc-client": "^2.
|
|
33
|
+
"@gsd-build/rpc-client": "^2.82.0",
|
|
34
34
|
"discord.js": "^14.25.1",
|
|
35
35
|
"yaml": "^2.8.0",
|
|
36
36
|
"zod": "^3.24.0"
|
|
@@ -102,6 +102,8 @@ The workflow MCP surface includes:
|
|
|
102
102
|
|
|
103
103
|
These tools use the same GSD workflow handlers as the native in-process tool path wherever a shared handler exists.
|
|
104
104
|
|
|
105
|
+
`gsd_decision_save` and its `gsd_save_decision` alias persist new decisions to the ADR-013 memory store, not to the legacy `decisions` table. The assigned `D###` ID is recorded in `memories.structured_fields.sourceDecisionId`, and `.gsd/DECISIONS.md` is refreshed as a projection from memory-backed decisions. The legacy table may still be read by compatibility and inspection paths during the cutover window, but it is no longer a write target.
|
|
106
|
+
|
|
105
107
|
`gsd_summary_save` computes artifact paths from the supplied IDs. `milestone_id` is required for milestone-, slice-, and task-scoped artifact types (`SUMMARY`, `RESEARCH`, `CONTEXT`, `ASSESSMENT`, `CONTEXT-DRAFT`) and should be omitted only for root-level `PROJECT`, `PROJECT-DRAFT`, `REQUIREMENTS`, and `REQUIREMENTS-DRAFT` artifacts. For final `REQUIREMENTS` saves, the tool renders content from active database requirement rows; callers must create those rows with `gsd_requirement_save` first.
|
|
106
108
|
|
|
107
109
|
### Interactive tools
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gsd-build/mcp-server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.82.0",
|
|
4
4
|
"description": "MCP server exposing GSD orchestration tools for Claude Code, Cursor, and other MCP clients",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"gsd": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@gsd-build/contracts": "^2.80.0",
|
|
38
|
-
"@gsd-build/rpc-client": "^2.
|
|
38
|
+
"@gsd-build/rpc-client": "^2.82.0",
|
|
39
39
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
40
40
|
"zod": "^4.0.0"
|
|
41
41
|
},
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// ADR-008 validation criterion #3 — behavior-parity lock-in for gsd_task_complete.
|
|
2
|
+
//
|
|
3
|
+
// ADR-008 §1 ("One handler layer, multiple transports") is shipped: both
|
|
4
|
+
// native (`db-tools.ts`) and MCP (`workflow-tools.ts`) registrations wrap the
|
|
5
|
+
// same `executeTaskComplete` from `workflow-tool-executors.ts`. This test
|
|
6
|
+
// guards the equivalence so a future executor refactor cannot silently drift
|
|
7
|
+
// the two transports apart.
|
|
8
|
+
//
|
|
9
|
+
// Strategy: run the same completion against two equivalent fresh basePaths,
|
|
10
|
+
// one via the native path (direct call to the shared executor — which is
|
|
11
|
+
// faithfully what `db-tools.ts:670-674` does after `resolveCtxCwd`) and one
|
|
12
|
+
// via the MCP path (`registerWorkflowTools` + tool.handler). Snapshot DB row,
|
|
13
|
+
// summary file content, and journal events for each. Assert equivalence
|
|
14
|
+
// modulo expected diffs (timestamps).
|
|
15
|
+
|
|
16
|
+
import { describe, it } from "node:test";
|
|
17
|
+
import assert from "node:assert/strict";
|
|
18
|
+
import { mkdirSync, rmSync, writeFileSync, readFileSync, existsSync } from "node:fs";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
import { tmpdir } from "node:os";
|
|
21
|
+
import { randomUUID } from "node:crypto";
|
|
22
|
+
|
|
23
|
+
import {
|
|
24
|
+
closeDatabase,
|
|
25
|
+
getTask,
|
|
26
|
+
} from "../../../src/resources/extensions/gsd/gsd-db.ts";
|
|
27
|
+
import { executeTaskComplete } from "../../../src/resources/extensions/gsd/tools/workflow-tool-executors.ts";
|
|
28
|
+
import { registerWorkflowTools } from "./workflow-tools.ts";
|
|
29
|
+
|
|
30
|
+
function makeTmpBase(): string {
|
|
31
|
+
const base = join(tmpdir(), `gsd-mcp-parity-${randomUUID()}`);
|
|
32
|
+
mkdirSync(join(base, ".gsd"), { recursive: true });
|
|
33
|
+
return base;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function seedMilestoneAndSlice(base: string): void {
|
|
37
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
|
|
38
|
+
writeFileSync(
|
|
39
|
+
join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"),
|
|
40
|
+
"# S01\n\n- [ ] **T01: Demo** `est:5m`\n",
|
|
41
|
+
"utf-8",
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function cleanup(base: string): void {
|
|
46
|
+
try {
|
|
47
|
+
closeDatabase();
|
|
48
|
+
} catch {
|
|
49
|
+
// swallow
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
rmSync(base, { recursive: true, force: true });
|
|
53
|
+
} catch {
|
|
54
|
+
// swallow
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function makeMockServer() {
|
|
59
|
+
const tools: Array<{
|
|
60
|
+
name: string;
|
|
61
|
+
handler: (args: Record<string, unknown>) => Promise<unknown>;
|
|
62
|
+
}> = [];
|
|
63
|
+
return {
|
|
64
|
+
tools,
|
|
65
|
+
tool(
|
|
66
|
+
name: string,
|
|
67
|
+
_description: string,
|
|
68
|
+
_params: Record<string, unknown>,
|
|
69
|
+
handler: (args: Record<string, unknown>) => Promise<unknown>,
|
|
70
|
+
) {
|
|
71
|
+
tools.push({ name, handler });
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface SnapshotShape {
|
|
77
|
+
/** SUMMARY.md content, trimmed, with ISO timestamps replaced by a sentinel. */
|
|
78
|
+
summary: string;
|
|
79
|
+
/** Task row, with volatile fields (timestamps, derived ids) elided. */
|
|
80
|
+
taskRow: Record<string, unknown>;
|
|
81
|
+
/** Journal events for this completion, with timestamps and ids normalized. */
|
|
82
|
+
journalEvents: Array<{ cmd: string; params: Record<string, unknown>; actor: string }>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const ISO_TIMESTAMP_RE = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z/g;
|
|
86
|
+
|
|
87
|
+
function normalizeTimestamps(text: string): string {
|
|
88
|
+
return text.replace(ISO_TIMESTAMP_RE, "<NORMALIZED-TS>");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function normalizeParams(params: Record<string, unknown>): Record<string, unknown> {
|
|
92
|
+
// Recursively replace ISO timestamps in any string value so the deep-equal
|
|
93
|
+
// doesn't fail on `ts`/`completed_at` style fields nested in the payload.
|
|
94
|
+
const out: Record<string, unknown> = {};
|
|
95
|
+
for (const [k, v] of Object.entries(params)) {
|
|
96
|
+
if (typeof v === "string") {
|
|
97
|
+
out[k] = normalizeTimestamps(v);
|
|
98
|
+
} else if (Array.isArray(v)) {
|
|
99
|
+
out[k] = v.map((item) =>
|
|
100
|
+
typeof item === "string"
|
|
101
|
+
? normalizeTimestamps(item)
|
|
102
|
+
: item && typeof item === "object"
|
|
103
|
+
? normalizeParams(item as Record<string, unknown>)
|
|
104
|
+
: item,
|
|
105
|
+
);
|
|
106
|
+
} else if (v !== null && typeof v === "object") {
|
|
107
|
+
out[k] = normalizeParams(v as Record<string, unknown>);
|
|
108
|
+
} else {
|
|
109
|
+
out[k] = v;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function snapshotState(base: string, milestoneId: string, sliceId: string, taskId: string): SnapshotShape {
|
|
116
|
+
const summaryPath = join(base, ".gsd", "milestones", milestoneId, "slices", sliceId, "tasks", `${taskId}-SUMMARY.md`);
|
|
117
|
+
assert.ok(existsSync(summaryPath), `summary file must exist at ${summaryPath}`);
|
|
118
|
+
const summary = normalizeTimestamps(readFileSync(summaryPath, "utf-8").trim());
|
|
119
|
+
|
|
120
|
+
const row = getTask(milestoneId, sliceId, taskId);
|
|
121
|
+
assert.ok(row, "task row must exist in DB after completion");
|
|
122
|
+
// Recursively normalize ISO timestamps in the row (the SQLite row uses
|
|
123
|
+
// snake_case `completed_at` and embeds another ISO timestamp inside the
|
|
124
|
+
// string field `full_summary_md`). Recursive normalization is simpler and
|
|
125
|
+
// more robust than maintaining an elision list.
|
|
126
|
+
const taskRow = normalizeParams(row as Record<string, unknown>);
|
|
127
|
+
assert.equal(taskRow.status, "complete", "task status must be 'complete' after completion");
|
|
128
|
+
|
|
129
|
+
const journalPath = join(base, ".gsd", "event-log.jsonl");
|
|
130
|
+
const journalEvents: SnapshotShape["journalEvents"] = [];
|
|
131
|
+
if (existsSync(journalPath)) {
|
|
132
|
+
const lines = readFileSync(journalPath, "utf-8")
|
|
133
|
+
.split("\n")
|
|
134
|
+
.filter((l) => l.length > 0);
|
|
135
|
+
for (const line of lines) {
|
|
136
|
+
try {
|
|
137
|
+
const evt = JSON.parse(line) as { cmd: string; params: Record<string, unknown>; actor: string };
|
|
138
|
+
if (evt.cmd === "complete-task" || evt.cmd === "complete_task") {
|
|
139
|
+
// Normalize cmd to canonical hyphen form, and elide ISO timestamps
|
|
140
|
+
// in the payload so the wall-clock skew between the two runs doesn't
|
|
141
|
+
// produce a spurious diff.
|
|
142
|
+
journalEvents.push({
|
|
143
|
+
cmd: "complete-task",
|
|
144
|
+
params: normalizeParams(evt.params),
|
|
145
|
+
actor: evt.actor,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
} catch {
|
|
149
|
+
// Skip corrupted lines — non-fatal for parity comparison.
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return { summary, taskRow, journalEvents };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const COMPLETION_ARGS = {
|
|
158
|
+
taskId: "T01",
|
|
159
|
+
sliceId: "S01",
|
|
160
|
+
milestoneId: "M001",
|
|
161
|
+
oneLiner: "Completed the demo task",
|
|
162
|
+
narrative: "Did the work described in the plan. Verified by running the test suite.",
|
|
163
|
+
verification: "npm test — all passing",
|
|
164
|
+
deviations: "None.",
|
|
165
|
+
knownIssues: "None.",
|
|
166
|
+
keyFiles: ["src/demo.ts"],
|
|
167
|
+
keyDecisions: ["Used Option A from the plan."],
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
describe("ADR-008 parity: gsd_task_complete native vs MCP", () => {
|
|
171
|
+
it("native and MCP produce equivalent DB row, summary, and journal event", async () => {
|
|
172
|
+
let baseNative = "";
|
|
173
|
+
let baseMcp = "";
|
|
174
|
+
try {
|
|
175
|
+
// ─── Native path ─────────────────────────────────────────────────
|
|
176
|
+
// The native wrapper in db-tools.ts:670-674 is:
|
|
177
|
+
// const taskCompleteExecute = async (_tcid, params, ...) => {
|
|
178
|
+
// const { executeTaskComplete } = await loadWorkflowExecutors();
|
|
179
|
+
// return executeTaskComplete(params, resolveCtxCwd(_ctx));
|
|
180
|
+
// };
|
|
181
|
+
// Calling executeTaskComplete directly with a basePath is the same
|
|
182
|
+
// post-resolution call shape.
|
|
183
|
+
baseNative = makeTmpBase();
|
|
184
|
+
seedMilestoneAndSlice(baseNative);
|
|
185
|
+
const nativeResult = await executeTaskComplete(COMPLETION_ARGS, baseNative);
|
|
186
|
+
assert.ok(!nativeResult.isError, "native completion must succeed");
|
|
187
|
+
|
|
188
|
+
const snapshotNative = snapshotState(baseNative, "M001", "S01", "T01");
|
|
189
|
+
closeDatabase();
|
|
190
|
+
|
|
191
|
+
// ─── MCP path ────────────────────────────────────────────────────
|
|
192
|
+
baseMcp = makeTmpBase();
|
|
193
|
+
seedMilestoneAndSlice(baseMcp);
|
|
194
|
+
|
|
195
|
+
const server = makeMockServer();
|
|
196
|
+
registerWorkflowTools(server as Parameters<typeof registerWorkflowTools>[0]);
|
|
197
|
+
const taskTool = server.tools.find((t) => t.name === "gsd_task_complete");
|
|
198
|
+
assert.ok(taskTool, "gsd_task_complete must be registered on the MCP surface");
|
|
199
|
+
|
|
200
|
+
const mcpResult = await taskTool.handler({ projectDir: baseMcp, ...COMPLETION_ARGS });
|
|
201
|
+
assert.ok(!mcpResult.isError, "mcp completion must succeed");
|
|
202
|
+
|
|
203
|
+
const snapshotMcp = snapshotState(baseMcp, "M001", "S01", "T01");
|
|
204
|
+
|
|
205
|
+
// ─── Compare ─────────────────────────────────────────────────────
|
|
206
|
+
assert.equal(
|
|
207
|
+
snapshotNative.summary,
|
|
208
|
+
snapshotMcp.summary,
|
|
209
|
+
"SUMMARY.md content must be byte-equal between native and MCP completions",
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
assert.deepEqual(
|
|
213
|
+
snapshotNative.taskRow,
|
|
214
|
+
snapshotMcp.taskRow,
|
|
215
|
+
"tasks DB row (modulo volatile timestamps and ids) must be equal",
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
// Journal event count must match (1 complete-task event per completion).
|
|
219
|
+
assert.equal(
|
|
220
|
+
snapshotNative.journalEvents.length,
|
|
221
|
+
snapshotMcp.journalEvents.length,
|
|
222
|
+
"both transports must emit the same number of complete-task journal events",
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
// Each journal event's params must match (these encode the completion
|
|
226
|
+
// payload; cmd is normalized and actor must align).
|
|
227
|
+
for (let i = 0; i < snapshotNative.journalEvents.length; i++) {
|
|
228
|
+
assert.equal(
|
|
229
|
+
snapshotNative.journalEvents[i].actor,
|
|
230
|
+
snapshotMcp.journalEvents[i].actor,
|
|
231
|
+
`journal event #${i} actor must match between native and MCP`,
|
|
232
|
+
);
|
|
233
|
+
assert.deepEqual(
|
|
234
|
+
snapshotNative.journalEvents[i].params,
|
|
235
|
+
snapshotMcp.journalEvents[i].params,
|
|
236
|
+
`journal event #${i} params must match between native and MCP`,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
} finally {
|
|
240
|
+
if (baseNative) cleanup(baseNative);
|
|
241
|
+
if (baseMcp) cleanup(baseMcp);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
});
|