gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.c5f2443b3
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/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/github-sync/templates.js +55 -70
- package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
- package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
- package/dist/resources/extensions/gsd/auto/loop.js +359 -523
- package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
- package/dist/resources/extensions/gsd/auto/phases.js +55 -6
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
- package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
- package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
- package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
- package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
- package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
- package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +168 -3
- package/dist/resources/extensions/gsd/auto-recovery.js +45 -52
- package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
- package/dist/resources/extensions/gsd/auto-verification.js +2 -11
- package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
- package/dist/resources/extensions/gsd/auto.js +159 -2
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +11 -5
- package/dist/resources/extensions/gsd/commands-ship.js +23 -46
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
- package/dist/resources/extensions/gsd/component-loader.js +5 -11
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +4 -0
- package/dist/resources/extensions/gsd/db-adapter.js +47 -0
- package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
- package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
- package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
- package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
- package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
- package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
- package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
- package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
- package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
- package/dist/resources/extensions/gsd/db-open-state.js +32 -0
- package/dist/resources/extensions/gsd/db-provider.js +108 -0
- package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
- package/dist/resources/extensions/gsd/db-transaction.js +63 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
- package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
- package/dist/resources/extensions/gsd/escalation.js +2 -0
- package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
- package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +9 -6
- package/dist/resources/extensions/gsd/notification-widget.js +21 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
- package/dist/resources/extensions/gsd/pr-evidence.js +76 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
- package/dist/resources/extensions/gsd/process-task-path.js +61 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/dist/resources/extensions/gsd/prompts/system.md +65 -107
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/dist/resources/extensions/gsd/state.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
- package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
- package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
- package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
- package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
- package/dist/resources/extensions/shared/interview-ui.js +15 -4
- 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 +13 -13
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +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.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
- package/dist/web/standalone/.next/server/chunks/167.js +2 -0
- 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/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/package.json +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/package.json +9 -2
- package/packages/contracts/dist/index.d.ts +3 -0
- package/packages/contracts/dist/index.d.ts.map +1 -0
- package/packages/contracts/dist/index.js +5 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/dist/rpc.d.ts +549 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.js +53 -0
- package/packages/contracts/dist/rpc.js.map +1 -0
- package/packages/contracts/dist/rpc.test.d.ts +2 -0
- package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.test.js +47 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -0
- package/packages/contracts/dist/workflow.d.ts +180 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -0
- package/packages/contracts/dist/workflow.js +201 -0
- package/packages/contracts/dist/workflow.js.map +1 -0
- package/packages/contracts/package.json +39 -0
- package/packages/contracts/src/index.ts +5 -0
- package/packages/contracts/src/rpc.test.ts +72 -0
- package/packages/contracts/src/rpc.ts +286 -0
- package/packages/contracts/src/workflow.ts +213 -0
- package/packages/contracts/tsconfig.json +25 -0
- package/packages/contracts/tsconfig.tsbuildinfo +1 -0
- package/packages/daemon/package.json +3 -2
- package/packages/daemon/src/event-bridge.test.ts +2 -1
- package/packages/daemon/src/event-bridge.ts +1 -1
- package/packages/daemon/src/event-formatter.test.ts +1 -2
- package/packages/daemon/src/event-formatter.ts +1 -2
- package/packages/daemon/src/session-manager.ts +2 -2
- package/packages/daemon/src/types.ts +3 -18
- package/packages/mcp-server/dist/server.d.ts +13 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +77 -0
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/session-manager.js +1 -1
- package/packages/mcp-server/dist/session-manager.js.map +1 -1
- package/packages/mcp-server/dist/types.d.ts +3 -11
- package/packages/mcp-server/dist/types.d.ts.map +1 -1
- package/packages/mcp-server/dist/types.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +2 -40
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -2
- package/packages/mcp-server/src/mcp-server.test.ts +138 -0
- package/packages/mcp-server/src/server.ts +99 -1
- package/packages/mcp-server/src/session-manager.ts +2 -2
- package/packages/mcp-server/src/types.ts +7 -18
- package/packages/mcp-server/src/workflow-tools.ts +2 -40
- 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-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
- 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/tool-card-cleanup-and-success-runtime.test.js +20 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -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 +6 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
- package/packages/pi-coding-agent/package.json +2 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/tui.d.ts +1 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +8 -2
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/tui.ts +8 -2
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/README.md +3 -3
- package/packages/rpc-client/dist/index.d.ts +1 -1
- package/packages/rpc-client/dist/index.d.ts.map +1 -1
- package/packages/rpc-client/dist/index.js.map +1 -1
- package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-client.js.map +1 -1
- package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
- package/packages/rpc-client/dist/rpc-types.js +3 -11
- package/packages/rpc-client/dist/rpc-types.js.map +1 -1
- package/packages/rpc-client/package.json +4 -1
- package/packages/rpc-client/src/index.ts +1 -1
- package/packages/rpc-client/src/rpc-client.ts +3 -6
- package/packages/rpc-client/src/rpc-types.ts +3 -398
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/github-sync/templates.ts +59 -84
- package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
- package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
- package/src/resources/extensions/gsd/auto/loop.ts +411 -598
- package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
- package/src/resources/extensions/gsd/auto/phases.ts +82 -8
- package/src/resources/extensions/gsd/auto/session.ts +11 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +170 -3
- package/src/resources/extensions/gsd/auto-recovery.ts +42 -50
- package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
- package/src/resources/extensions/gsd/auto-verification.ts +5 -1
- package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
- package/src/resources/extensions/gsd/auto.ts +167 -1
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -5
- package/src/resources/extensions/gsd/commands-ship.ts +24 -51
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
- package/src/resources/extensions/gsd/component-loader.ts +5 -11
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +6 -0
- package/src/resources/extensions/gsd/db-adapter.ts +75 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
- package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
- package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
- package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
- package/src/resources/extensions/gsd/db-open-state.ts +47 -0
- package/src/resources/extensions/gsd/db-provider.ts +148 -0
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
- package/src/resources/extensions/gsd/db-transaction.ts +76 -0
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
- package/src/resources/extensions/gsd/escalation.ts +3 -1
- package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
- package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
- package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
- package/src/resources/extensions/gsd/model-router.ts +10 -6
- package/src/resources/extensions/gsd/notification-widget.ts +25 -4
- package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
- package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
- package/src/resources/extensions/gsd/process-task-path.ts +81 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
- package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
- package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
- package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
- package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
- package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
- package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
- package/src/resources/extensions/gsd/prompts/queue.md +46 -53
- package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
- package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
- package/src/resources/extensions/gsd/prompts/system.md +65 -107
- package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
- package/src/resources/extensions/gsd/state.ts +6 -3
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
- package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
- package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
- package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
- package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
- package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
- package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
- package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
- package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
- package/src/resources/extensions/shared/interview-ui.ts +18 -5
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
- package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → bQDK5_LtkGVS64AirQgQG}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → bQDK5_LtkGVS64AirQgQG}/_ssgManifest.js +0 -0
|
@@ -9,16 +9,36 @@ import { readFileSync } from "node:fs";
|
|
|
9
9
|
import { join, dirname } from "node:path";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
11
|
|
|
12
|
+
import { decideMemoryPressure } from "../auto/workflow-kernel.ts";
|
|
13
|
+
import { measureMemoryPressure } from "../auto/workflow-memory-pressure.ts";
|
|
14
|
+
|
|
12
15
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
13
16
|
const loopSource = readFileSync(join(__dirname, "..", "auto", "loop.ts"), "utf-8");
|
|
14
17
|
|
|
15
18
|
describe("memory pressure monitoring (#3331)", () => {
|
|
16
|
-
test("
|
|
17
|
-
|
|
19
|
+
test("measureMemoryPressure reports pressure above threshold", () => {
|
|
20
|
+
const snapshot = measureMemoryPressure({
|
|
21
|
+
threshold: 0.5,
|
|
22
|
+
deps: {
|
|
23
|
+
memoryUsage: () => ({ heapUsed: 768 * 1024 * 1024 }),
|
|
24
|
+
heapLimitBytes: () => 1024 * 1024 * 1024,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
assert.equal(snapshot.pressured, true);
|
|
29
|
+
assert.equal(snapshot.heapMB, 768);
|
|
30
|
+
assert.equal(snapshot.limitMB, 1024);
|
|
18
31
|
});
|
|
19
32
|
|
|
20
|
-
test("
|
|
21
|
-
|
|
33
|
+
test("measureMemoryPressure defaults to a sub-100-percent threshold", () => {
|
|
34
|
+
const snapshot = measureMemoryPressure({
|
|
35
|
+
deps: {
|
|
36
|
+
memoryUsage: () => ({ heapUsed: 3584 * 1024 * 1024 }),
|
|
37
|
+
heapLimitBytes: () => 4096 * 1024 * 1024,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
assert.equal(snapshot.pressured, true);
|
|
22
42
|
});
|
|
23
43
|
|
|
24
44
|
test("memory check runs every MEMORY_CHECK_INTERVAL iterations", () => {
|
|
@@ -26,8 +46,16 @@ describe("memory pressure monitoring (#3331)", () => {
|
|
|
26
46
|
});
|
|
27
47
|
|
|
28
48
|
test("memory pressure triggers graceful stopAuto", () => {
|
|
29
|
-
|
|
30
|
-
|
|
49
|
+
const decision = decideMemoryPressure({
|
|
50
|
+
pressured: true,
|
|
51
|
+
heapMB: 3900,
|
|
52
|
+
limitMB: 4096,
|
|
53
|
+
pct: 0.95,
|
|
54
|
+
iteration: 10,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
assert.equal(decision.action, "stop");
|
|
58
|
+
assert.match(decision.stopMessage, /Stopping gracefully to prevent OOM/);
|
|
31
59
|
});
|
|
32
60
|
});
|
|
33
61
|
|
|
@@ -55,15 +83,11 @@ describe("stuck detection persistence (#3704)", () => {
|
|
|
55
83
|
// unit_dispatches (recentUnits) + runtime_kv (stuckRecoveryAttempts).
|
|
56
84
|
// The stuck-state-via-db.test.ts suite covers the round-trip.
|
|
57
85
|
|
|
58
|
-
test("
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
assert.
|
|
64
|
-
callMatches.length >= 2,
|
|
65
|
-
`saveStuckState must be called in both the custom-engine path and the standard dev path ` +
|
|
66
|
-
`(found ${callMatches.length} call(s) — standard path is missing its call, #4382)`,
|
|
67
|
-
);
|
|
86
|
+
test("completeIteration centralizes stuck-state persistence for both loop paths (#4382)", () => {
|
|
87
|
+
assert.match(loopSource, /const completeIteration = \(\): void =>/);
|
|
88
|
+
assert.match(loopSource, /completeWorkflowIteration\(/);
|
|
89
|
+
assert.match(loopSource, /saveStuckState:\s*\(\)\s*=>\s*saveStuckState\(s,\s*loopState\)/);
|
|
90
|
+
assert.match(loopSource, /completeIteration,/);
|
|
91
|
+
assert.match(loopSource, /completeIteration\(\);/);
|
|
68
92
|
});
|
|
69
93
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Verifies model routing decisions and legacy provider-default telemetry.
|
|
1
3
|
import test, { describe } from "node:test";
|
|
2
4
|
import assert from "node:assert/strict";
|
|
3
5
|
|
|
@@ -14,6 +16,7 @@ import {
|
|
|
14
16
|
} from "../model-router.js";
|
|
15
17
|
import type { DynamicRoutingConfig, RoutingDecision, ModelCapabilities } from "../model-router.js";
|
|
16
18
|
import type { ClassificationResult } from "../complexity-classifier.js";
|
|
19
|
+
import { getLegacyTelemetry, resetLegacyTelemetry } from "../legacy-telemetry.js";
|
|
17
20
|
|
|
18
21
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
19
22
|
|
|
@@ -297,16 +300,28 @@ test("cross-provider: configured primary available by bare ID wins over equivale
|
|
|
297
300
|
// ─── resolveModelForTier (provider-agnostic tier resolution) ────────────────
|
|
298
301
|
|
|
299
302
|
test("resolveModelForTier: returns canonical Anthropic model when no available models", () => {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
+
try {
|
|
304
|
+
resetLegacyTelemetry();
|
|
305
|
+
assert.equal(resolveModelForTier("heavy", []), "claude-opus-4-6");
|
|
306
|
+
assert.equal(resolveModelForTier("standard", []), "claude-sonnet-4-6");
|
|
307
|
+
assert.equal(resolveModelForTier("light", []), "claude-haiku-4-5");
|
|
308
|
+
assert.equal(getLegacyTelemetry()["legacy.providerDefaultUsed"], 3);
|
|
309
|
+
} finally {
|
|
310
|
+
resetLegacyTelemetry();
|
|
311
|
+
}
|
|
303
312
|
});
|
|
304
313
|
|
|
305
314
|
test("resolveModelForTier: returns canonical model when it is available", () => {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
315
|
+
try {
|
|
316
|
+
resetLegacyTelemetry();
|
|
317
|
+
assert.equal(
|
|
318
|
+
resolveModelForTier("heavy", ["claude-opus-4-6", "claude-sonnet-4-6"]),
|
|
319
|
+
"claude-opus-4-6",
|
|
320
|
+
);
|
|
321
|
+
assert.equal(getLegacyTelemetry()["legacy.providerDefaultUsed"], 0);
|
|
322
|
+
} finally {
|
|
323
|
+
resetLegacyTelemetry();
|
|
324
|
+
}
|
|
310
325
|
});
|
|
311
326
|
|
|
312
327
|
test("resolveModelForTier: does not prefer canonical over cheaper same-tier model", () => {
|
|
@@ -341,11 +356,17 @@ test("resolveModelForTier: picks light-tier cross-provider model", () => {
|
|
|
341
356
|
});
|
|
342
357
|
|
|
343
358
|
test("resolveModelForTier: falls back to canonical when no tier match available", () => {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
359
|
+
try {
|
|
360
|
+
resetLegacyTelemetry();
|
|
361
|
+
// Only unknown models available — getModelTier classifies unknowns as
|
|
362
|
+
// "standard", so a request for "heavy" finds no match and the canonical
|
|
363
|
+
// Anthropic ID is returned as a documented fallback.
|
|
364
|
+
const result = resolveModelForTier("heavy", ["some-custom-model"]);
|
|
365
|
+
assert.equal(result, "claude-opus-4-6");
|
|
366
|
+
assert.equal(getLegacyTelemetry()["legacy.providerDefaultUsed"], 1);
|
|
367
|
+
} finally {
|
|
368
|
+
resetLegacyTelemetry();
|
|
369
|
+
}
|
|
349
370
|
});
|
|
350
371
|
|
|
351
372
|
test("resolveModelForTier: handles provider-prefixed available models", () => {
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
onNotificationStoreChange,
|
|
20
20
|
_resetNotificationStore,
|
|
21
21
|
} from "../notification-store.js";
|
|
22
|
+
import { resolveNotificationStoreBasePath } from "../bootstrap/register-hooks.js";
|
|
22
23
|
|
|
23
24
|
describe("notification-store", () => {
|
|
24
25
|
let tmp: string;
|
|
@@ -243,6 +244,13 @@ describe("notification-store", () => {
|
|
|
243
244
|
rmSync(tmp2, { recursive: true, force: true });
|
|
244
245
|
});
|
|
245
246
|
|
|
247
|
+
test("session notification base resolves auto-worktree paths to project root", () => {
|
|
248
|
+
const worktreePath = join(tmp, ".gsd", "worktrees", "M001");
|
|
249
|
+
mkdirSync(worktreePath, { recursive: true });
|
|
250
|
+
|
|
251
|
+
assert.equal(resolveNotificationStoreBasePath(worktreePath), tmp);
|
|
252
|
+
});
|
|
253
|
+
|
|
246
254
|
test("counters resync from disk after markAllRead", () => {
|
|
247
255
|
initNotificationStore(tmp);
|
|
248
256
|
appendNotification("msg1", "info");
|
|
@@ -5,7 +5,7 @@ import { join } from "node:path";
|
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
|
|
7
7
|
import { initNotificationStore, appendNotification, _resetNotificationStore } from "../notification-store.js";
|
|
8
|
-
import { buildNotificationWidgetLines } from "../notification-widget.js";
|
|
8
|
+
import { buildNotificationWidgetLines, initNotificationWidget, _resetNotificationWidgetForTests } from "../notification-widget.js";
|
|
9
9
|
|
|
10
10
|
test("buildNotificationWidgetLines shows unread count with shortcut pair", () => {
|
|
11
11
|
const tmp = mkdtempSync(join(tmpdir(), "gsd-notification-widget-"));
|
|
@@ -27,3 +27,42 @@ test("buildNotificationWidgetLines shows unread count with shortcut pair", () =>
|
|
|
27
27
|
rmSync(tmp, { recursive: true, force: true });
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
|
+
|
|
31
|
+
test("initNotificationWidget replaces prior interval and store subscription", () => {
|
|
32
|
+
const tmp = mkdtempSync(join(tmpdir(), "gsd-notification-widget-"));
|
|
33
|
+
const firstStatuses: Array<string | undefined> = [];
|
|
34
|
+
const secondStatuses: Array<string | undefined> = [];
|
|
35
|
+
try {
|
|
36
|
+
mkdirSync(join(tmp, ".gsd"), { recursive: true });
|
|
37
|
+
_resetNotificationStore();
|
|
38
|
+
_resetNotificationWidgetForTests();
|
|
39
|
+
initNotificationStore(tmp);
|
|
40
|
+
appendNotification("Need attention", "warning");
|
|
41
|
+
|
|
42
|
+
const firstCleanup = initNotificationWidget({
|
|
43
|
+
hasUI: true,
|
|
44
|
+
ui: { setStatus: (_key: string, value: string | undefined) => firstStatuses.push(value) },
|
|
45
|
+
} as any);
|
|
46
|
+
initNotificationWidget({
|
|
47
|
+
hasUI: true,
|
|
48
|
+
ui: { setStatus: (_key: string, value: string | undefined) => secondStatuses.push(value) },
|
|
49
|
+
} as any);
|
|
50
|
+
|
|
51
|
+
const firstCountAfterReplace = firstStatuses.length;
|
|
52
|
+
firstCleanup();
|
|
53
|
+
assert.equal(firstStatuses.length, firstCountAfterReplace, "stale cleanup must not clear the replaced status chip");
|
|
54
|
+
|
|
55
|
+
appendNotification("Need follow-up", "warning");
|
|
56
|
+
|
|
57
|
+
assert.equal(
|
|
58
|
+
firstStatuses.length,
|
|
59
|
+
firstCountAfterReplace,
|
|
60
|
+
"replaced widget must not receive store-change refreshes",
|
|
61
|
+
);
|
|
62
|
+
assert.match(secondStatuses.at(-1) ?? "", /2 unread/);
|
|
63
|
+
} finally {
|
|
64
|
+
_resetNotificationWidgetForTests();
|
|
65
|
+
_resetNotificationStore();
|
|
66
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
@@ -64,6 +64,7 @@ test("readPausedSessionMetadata round-trips a real PausedSessionMetadata payload
|
|
|
64
64
|
activeRunDir: null,
|
|
65
65
|
autoStartTime: Date.now(),
|
|
66
66
|
milestoneLock: null,
|
|
67
|
+
pauseReason: "Blocked: waiting for UAT",
|
|
67
68
|
};
|
|
68
69
|
setRuntimeKv("global", "", PAUSED_SESSION_KV_KEY, meta);
|
|
69
70
|
|
|
@@ -73,6 +74,7 @@ test("readPausedSessionMetadata round-trips a real PausedSessionMetadata payload
|
|
|
73
74
|
assert.equal(loaded!.unitType, "plan-slice");
|
|
74
75
|
assert.equal(loaded!.unitId, "M001/S01");
|
|
75
76
|
assert.equal(loaded!.sessionFile, "/tmp/session.jsonl");
|
|
77
|
+
assert.equal(loaded!.pauseReason, "Blocked: waiting for UAT");
|
|
76
78
|
});
|
|
77
79
|
|
|
78
80
|
test("readPausedSessionMetadata auto-deletes stale pseudo-milestone pause rows", (t) => {
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Verifies the milestone planning prompt renders compact required guidance.
|
|
3
|
+
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
|
|
10
|
+
test("plan-milestone prompt renders compact DB-backed planning guidance", async (t) => {
|
|
11
|
+
const previousGsdHome = process.env.GSD_HOME;
|
|
12
|
+
const providedGsdHome = process.env.GSD_TEST_HOME;
|
|
13
|
+
const isolatedHome = providedGsdHome ?? mkdtempSync(join(tmpdir(), "gsd-plan-milestone-render-"));
|
|
14
|
+
const fixtureRoot = process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd();
|
|
15
|
+
process.env.GSD_HOME = isolatedHome;
|
|
16
|
+
t.after(() => {
|
|
17
|
+
if (previousGsdHome === undefined) delete process.env.GSD_HOME;
|
|
18
|
+
else process.env.GSD_HOME = previousGsdHome;
|
|
19
|
+
if (!providedGsdHome) rmSync(isolatedHome, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const { loadPrompt } = await import(`../prompt-loader.ts?test=${Date.now()}`);
|
|
23
|
+
const prompt = loadPrompt("plan-milestone", {
|
|
24
|
+
milestoneId: "M001",
|
|
25
|
+
milestoneTitle: "Reduce prompt cost",
|
|
26
|
+
workingDirectory: fixtureRoot,
|
|
27
|
+
inlinedContext: "## Roadmap\n\nUse the roadmap template.",
|
|
28
|
+
outputPath: ".gsd/milestones/M001/M001-ROADMAP.md",
|
|
29
|
+
skillDiscoveryMode: "filtered",
|
|
30
|
+
skillDiscoveryInstructions: "Use only relevant skills.",
|
|
31
|
+
sourceFilePaths: "- src/resources/extensions/gsd/prompts/plan-milestone.md",
|
|
32
|
+
researchOutputPath: ".gsd/milestones/M001/M001-RESEARCH.md",
|
|
33
|
+
secretsOutputPath: ".gsd/milestones/M001/SECRETS.md",
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
assert.match(prompt, /Explore First, Then Decompose/);
|
|
37
|
+
assert.match(prompt, /Call `gsd_plan_milestone`/);
|
|
38
|
+
assert.match(prompt, /call `gsd_decision_save`/);
|
|
39
|
+
assert.match(prompt, /Every relevant Active requirement must end as mapped/);
|
|
40
|
+
assert.match(prompt, /Risk-first means proof-first/);
|
|
41
|
+
assert.match(prompt, /Progressive Planning \(ADR-011\)/);
|
|
42
|
+
assert.match(prompt, /Single-Slice Fast Path/);
|
|
43
|
+
assert.match(prompt, /Secret Forecasting/);
|
|
44
|
+
assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
|
|
45
|
+
});
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Verifies GSD planning prompt placeholder rendering and DB-backed tool guidance.
|
|
3
|
+
|
|
1
4
|
import test from "node:test";
|
|
2
5
|
import assert from "node:assert/strict";
|
|
3
6
|
import { readFileSync } from "node:fs";
|
|
@@ -6,6 +9,7 @@ import { fileURLToPath } from "node:url";
|
|
|
6
9
|
|
|
7
10
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
11
|
const worktreePromptsDir = join(__dirname, "..", "prompts");
|
|
12
|
+
const fixtureRoot = process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd();
|
|
9
13
|
|
|
10
14
|
function loadPrompt(name: string, vars: Record<string, string> = {}): string {
|
|
11
15
|
const path = join(worktreePromptsDir, `${name}.md`);
|
|
@@ -17,15 +21,18 @@ function loadPrompt(name: string, vars: Record<string, string> = {}): string {
|
|
|
17
21
|
}
|
|
18
22
|
|
|
19
23
|
const BASE_VARS = {
|
|
20
|
-
workingDirectory:
|
|
24
|
+
workingDirectory: fixtureRoot,
|
|
21
25
|
milestoneId: "M001", sliceId: "S01", sliceTitle: "Test Slice",
|
|
22
26
|
slicePath: ".gsd/milestones/M001/slices/S01",
|
|
23
27
|
roadmapPath: ".gsd/milestones/M001/M001-ROADMAP.md",
|
|
24
28
|
researchPath: ".gsd/milestones/M001/slices/S01/S01-RESEARCH.md",
|
|
25
|
-
outputPath: "
|
|
29
|
+
outputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md"),
|
|
26
30
|
inlinedContext: "--- test inlined context ---",
|
|
27
31
|
dependencySummaries: "", executorContextConstraints: "",
|
|
28
32
|
sourceFilePaths: "- **Requirements**: `.gsd/REQUIREMENTS.md`",
|
|
33
|
+
templatesDir: join(fixtureRoot, "templates"),
|
|
34
|
+
planTemplatePath: "C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\plan.md",
|
|
35
|
+
taskPlanTemplatePath: "C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\task-plan.md",
|
|
29
36
|
skillActivation: "Load the relevant skills.",
|
|
30
37
|
};
|
|
31
38
|
|
|
@@ -61,6 +68,19 @@ test("plan-slice prompt: DB-backed tool names survive template substitution", ()
|
|
|
61
68
|
assert.ok(result.includes("canonical write path"), "canonical write path language should survive substitution");
|
|
62
69
|
});
|
|
63
70
|
|
|
71
|
+
test("plan-slice prompt: compact planning gates survive template substitution", () => {
|
|
72
|
+
const result = loadPrompt("plan-slice", { ...BASE_VARS, commitInstruction: "Do not commit." });
|
|
73
|
+
assert.ok(result.includes("planning-dispatch"), "planning-dispatch policy should remain visible");
|
|
74
|
+
assert.ok(result.includes("Bias toward \"roadmap is fine.\""), "roadmap reassessment brake should remain visible");
|
|
75
|
+
assert.ok(result.includes("Self-audit before finishing"), "self-audit gate should remain visible");
|
|
76
|
+
assert.ok(result.includes("Quality gates: non-trivial slices/tasks include specific Q3-Q7 coverage where applicable."));
|
|
77
|
+
assert.ok(result.includes("C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\plan.md"));
|
|
78
|
+
assert.ok(result.includes("C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\task-plan.md"));
|
|
79
|
+
assert.ok(!result.includes("{{templatesDir}}/plan.md"));
|
|
80
|
+
assert.ok(!result.includes("{{templatesDir}}/task-plan.md"));
|
|
81
|
+
assert.ok(!result.includes("{{"));
|
|
82
|
+
});
|
|
83
|
+
|
|
64
84
|
test("plan-slice prompt: footer references gsd_plan_slice tool, not direct write", () => {
|
|
65
85
|
const result = loadPrompt("plan-slice", { ...BASE_VARS, commitInstruction: "Do not commit." });
|
|
66
86
|
assert.ok(
|
|
@@ -91,7 +111,7 @@ test("domain-work prompts use skillActivation placeholder", () => {
|
|
|
91
111
|
|
|
92
112
|
test("skillActivation default leaves no unresolved placeholder", () => {
|
|
93
113
|
const result = loadPromptWithDefaultSkillActivation("execute-task", {
|
|
94
|
-
workingDirectory:
|
|
114
|
+
workingDirectory: fixtureRoot,
|
|
95
115
|
milestoneId: "M001",
|
|
96
116
|
sliceId: "S01",
|
|
97
117
|
sliceTitle: "Test Slice",
|
|
@@ -104,7 +124,8 @@ test("skillActivation default leaves no unresolved placeholder", () => {
|
|
|
104
124
|
carryForwardSection: "Carry forward",
|
|
105
125
|
resumeSection: "Resume",
|
|
106
126
|
priorTaskLines: "- (no prior tasks)",
|
|
107
|
-
|
|
127
|
+
templatesDir: join(fixtureRoot, "templates"),
|
|
128
|
+
taskSummaryPath: join(fixtureRoot, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md"),
|
|
108
129
|
inlinedTemplates: "Template",
|
|
109
130
|
verificationBudget: "~10K chars",
|
|
110
131
|
overridesSection: "",
|
|
@@ -116,7 +137,7 @@ test("skillActivation default leaves no unresolved placeholder", () => {
|
|
|
116
137
|
|
|
117
138
|
test("custom skillActivation is substituted into execute-task", () => {
|
|
118
139
|
const result = loadPrompt("execute-task", {
|
|
119
|
-
workingDirectory:
|
|
140
|
+
workingDirectory: fixtureRoot,
|
|
120
141
|
milestoneId: "M001",
|
|
121
142
|
sliceId: "S01",
|
|
122
143
|
sliceTitle: "Test Slice",
|
|
@@ -129,7 +150,8 @@ test("custom skillActivation is substituted into execute-task", () => {
|
|
|
129
150
|
carryForwardSection: "Carry forward",
|
|
130
151
|
resumeSection: "Resume",
|
|
131
152
|
priorTaskLines: "- (no prior tasks)",
|
|
132
|
-
|
|
153
|
+
templatesDir: join(fixtureRoot, "templates"),
|
|
154
|
+
taskSummaryPath: join(fixtureRoot, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md"),
|
|
133
155
|
inlinedTemplates: "Template",
|
|
134
156
|
verificationBudget: "~10K chars",
|
|
135
157
|
overridesSection: "",
|
|
@@ -153,12 +175,12 @@ test("guided resume prompt substitutes skillActivation", () => {
|
|
|
153
175
|
|
|
154
176
|
test("research-milestone prompt substitutes skillActivation", () => {
|
|
155
177
|
const result = loadPrompt("research-milestone", {
|
|
156
|
-
workingDirectory:
|
|
178
|
+
workingDirectory: fixtureRoot,
|
|
157
179
|
milestoneId: "M001",
|
|
158
180
|
milestoneTitle: "Test Milestone",
|
|
159
181
|
milestonePath: ".gsd/milestones/M001",
|
|
160
182
|
contextPath: ".gsd/milestones/M001/M001-CONTEXT.md",
|
|
161
|
-
outputPath: "
|
|
183
|
+
outputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-RESEARCH.md"),
|
|
162
184
|
inlinedContext: "Context",
|
|
163
185
|
skillDiscoveryMode: "manual",
|
|
164
186
|
skillDiscoveryInstructions: " Discover skills manually.",
|
|
@@ -171,12 +193,12 @@ test("research-milestone prompt substitutes skillActivation", () => {
|
|
|
171
193
|
|
|
172
194
|
test("research-milestone prompt references gsd_summary_save, not direct write", () => {
|
|
173
195
|
const result = loadPrompt("research-milestone", {
|
|
174
|
-
workingDirectory:
|
|
196
|
+
workingDirectory: fixtureRoot,
|
|
175
197
|
milestoneId: "M001",
|
|
176
198
|
milestoneTitle: "Test Milestone",
|
|
177
199
|
milestonePath: ".gsd/milestones/M001",
|
|
178
200
|
contextPath: ".gsd/milestones/M001/M001-CONTEXT.md",
|
|
179
|
-
outputPath: "
|
|
201
|
+
outputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-RESEARCH.md"),
|
|
180
202
|
inlinedContext: "Context",
|
|
181
203
|
skillDiscoveryMode: "manual",
|
|
182
204
|
skillDiscoveryInstructions: " Discover skills manually.",
|
|
@@ -199,7 +221,7 @@ test("research-milestone prompt references gsd_summary_save, not direct write",
|
|
|
199
221
|
|
|
200
222
|
test("research-slice prompt substitutes skillActivation", () => {
|
|
201
223
|
const result = loadPrompt("research-slice", {
|
|
202
|
-
workingDirectory:
|
|
224
|
+
workingDirectory: fixtureRoot,
|
|
203
225
|
milestoneId: "M001",
|
|
204
226
|
sliceId: "S01",
|
|
205
227
|
sliceTitle: "Test Slice",
|
|
@@ -207,7 +229,7 @@ test("research-slice prompt substitutes skillActivation", () => {
|
|
|
207
229
|
roadmapPath: ".gsd/milestones/M001/M001-ROADMAP.md",
|
|
208
230
|
contextPath: ".gsd/milestones/M001/M001-CONTEXT.md",
|
|
209
231
|
milestoneResearchPath: ".gsd/milestones/M001/M001-RESEARCH.md",
|
|
210
|
-
outputPath: "
|
|
232
|
+
outputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "slices", "S01", "S01-RESEARCH.md"),
|
|
211
233
|
inlinedContext: "Context",
|
|
212
234
|
dependencySummaries: "",
|
|
213
235
|
skillDiscoveryMode: "manual",
|
|
@@ -221,15 +243,15 @@ test("research-slice prompt substitutes skillActivation", () => {
|
|
|
221
243
|
|
|
222
244
|
test("plan-milestone prompt substitutes skillActivation", () => {
|
|
223
245
|
const result = loadPrompt("plan-milestone", {
|
|
224
|
-
workingDirectory:
|
|
246
|
+
workingDirectory: fixtureRoot,
|
|
225
247
|
milestoneId: "M001",
|
|
226
248
|
milestoneTitle: "Test Milestone",
|
|
227
249
|
milestonePath: ".gsd/milestones/M001",
|
|
228
250
|
contextPath: ".gsd/milestones/M001/M001-CONTEXT.md",
|
|
229
251
|
researchPath: ".gsd/milestones/M001/M001-RESEARCH.md",
|
|
230
|
-
researchOutputPath: "
|
|
231
|
-
outputPath: "
|
|
232
|
-
secretsOutputPath: "
|
|
252
|
+
researchOutputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-RESEARCH.md"),
|
|
253
|
+
outputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
|
|
254
|
+
secretsOutputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-SECRETS.md"),
|
|
233
255
|
inlinedContext: "Context",
|
|
234
256
|
sourceFilePaths: "- source",
|
|
235
257
|
skillDiscoveryMode: "manual",
|
|
@@ -241,6 +263,33 @@ test("plan-milestone prompt substitutes skillActivation", () => {
|
|
|
241
263
|
assert.ok(!result.includes("{{skillActivation}}"));
|
|
242
264
|
});
|
|
243
265
|
|
|
266
|
+
test("plan-milestone prompt: compact planning gates survive template substitution", () => {
|
|
267
|
+
const result = loadPrompt("plan-milestone", {
|
|
268
|
+
workingDirectory: fixtureRoot,
|
|
269
|
+
milestoneId: "M001",
|
|
270
|
+
milestoneTitle: "Test Milestone",
|
|
271
|
+
milestonePath: ".gsd/milestones/M001",
|
|
272
|
+
contextPath: ".gsd/milestones/M001/M001-CONTEXT.md",
|
|
273
|
+
researchPath: ".gsd/milestones/M001/M001-RESEARCH.md",
|
|
274
|
+
researchOutputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-RESEARCH.md"),
|
|
275
|
+
outputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
|
|
276
|
+
secretsOutputPath: join(fixtureRoot, ".gsd", "milestones", "M001", "M001-SECRETS.md"),
|
|
277
|
+
inlinedContext: "Context",
|
|
278
|
+
sourceFilePaths: "- source",
|
|
279
|
+
skillDiscoveryMode: "manual",
|
|
280
|
+
skillDiscoveryInstructions: " Discover skills manually.",
|
|
281
|
+
skillActivation: "Load milestone planning skills first.",
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
assert.ok(result.includes("Already Planned? Soft Brake"));
|
|
285
|
+
assert.ok(result.includes("gsd_plan_milestone"));
|
|
286
|
+
assert.ok(result.includes("Dependency format is comma-separated"));
|
|
287
|
+
assert.ok(result.includes("phases.progressive_planning"));
|
|
288
|
+
assert.ok(result.includes("Single-Slice Fast Path"));
|
|
289
|
+
assert.ok(result.includes("Secrets Manifest"));
|
|
290
|
+
assert.ok(!result.includes("{{"));
|
|
291
|
+
});
|
|
292
|
+
|
|
244
293
|
test("guided research slice prompt substitutes skillActivation", () => {
|
|
245
294
|
const result = loadPrompt("guided-research-slice", {
|
|
246
295
|
milestoneId: "M001",
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// GSD Extension — Plan-slice tool integration tests.
|
|
2
|
+
|
|
1
3
|
import test from 'node:test';
|
|
2
4
|
import assert from 'node:assert/strict';
|
|
3
5
|
import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync, writeFileSync } from 'node:fs';
|
|
@@ -8,6 +10,7 @@ import { openDatabase, closeDatabase, insertMilestone, insertSlice, getSlice, ge
|
|
|
8
10
|
import { handlePlanSlice } from '../tools/plan-slice.ts';
|
|
9
11
|
import { parsePlan } from '../parsers-legacy.ts';
|
|
10
12
|
import { parseTaskPlanFile } from '../files.ts';
|
|
13
|
+
import { deriveState, invalidateStateCache } from '../state.ts';
|
|
11
14
|
|
|
12
15
|
function makeTmpBase(): string {
|
|
13
16
|
const base = mkdtempSync(join(tmpdir(), 'gsd-plan-slice-'));
|
|
@@ -98,6 +101,30 @@ test('handlePlanSlice writes slice/task planning state and renders plan artifact
|
|
|
98
101
|
}
|
|
99
102
|
});
|
|
100
103
|
|
|
104
|
+
test('handlePlanSlice advances DB-derived state out of planning immediately', async () => {
|
|
105
|
+
const base = makeTmpBase();
|
|
106
|
+
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
seedParentSlice();
|
|
110
|
+
|
|
111
|
+
invalidateStateCache();
|
|
112
|
+
const before = await deriveState(base);
|
|
113
|
+
assert.equal(before.phase, 'planning');
|
|
114
|
+
assert.equal(before.progress?.tasks?.total, 0);
|
|
115
|
+
|
|
116
|
+
const result = await handlePlanSlice(validParams(), base);
|
|
117
|
+
assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
|
|
118
|
+
|
|
119
|
+
invalidateStateCache();
|
|
120
|
+
const after = await deriveState(base);
|
|
121
|
+
assert.notEqual(after.phase, 'planning');
|
|
122
|
+
assert.equal(after.progress?.tasks?.total, 2);
|
|
123
|
+
} finally {
|
|
124
|
+
cleanup(base);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
101
128
|
test('handlePlanSlice leaves omitted enrichment fields empty instead of rendering placeholders', async () => {
|
|
102
129
|
const base = makeTmpBase();
|
|
103
130
|
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
@@ -304,6 +304,30 @@ describe("resolveImportPath", () => {
|
|
|
304
304
|
assert.ok(!result.exists);
|
|
305
305
|
assert.equal(result.resolvedPath, null);
|
|
306
306
|
});
|
|
307
|
+
|
|
308
|
+
test("resolves dotted TS module stem like .server via extension probing", (t) => {
|
|
309
|
+
const dir = mkdtempSync(join(tmpdir(), "post-exec-test-server-dot-"));
|
|
310
|
+
t.after(() => rmSync(dir, { recursive: true, force: true }));
|
|
311
|
+
mkdirSync(join(dir, "src"), { recursive: true });
|
|
312
|
+
writeFileSync(join(dir, "src", "route.server.ts"), "export {};\n");
|
|
313
|
+
writeFileSync(join(dir, "src", "main.ts"), "");
|
|
314
|
+
|
|
315
|
+
const result = resolveImportPath("./route.server", "src/main.ts", dir);
|
|
316
|
+
assert.ok(result.exists);
|
|
317
|
+
assert.ok(result.resolvedPath?.endsWith("route.server.ts"));
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test("missing unknown explicit extension does not match code-extension shadow", (t) => {
|
|
321
|
+
const dir = mkdtempSync(join(tmpdir(), "post-exec-test-unknown-shadow-"));
|
|
322
|
+
t.after(() => rmSync(dir, { recursive: true, force: true }));
|
|
323
|
+
mkdirSync(join(dir, "src"), { recursive: true });
|
|
324
|
+
writeFileSync(join(dir, "src", "video.mp4.ts"), "export {};\n");
|
|
325
|
+
writeFileSync(join(dir, "src", "main.ts"), "");
|
|
326
|
+
|
|
327
|
+
const result = resolveImportPath("./video.mp4", "src/main.ts", dir);
|
|
328
|
+
assert.ok(!result.exists);
|
|
329
|
+
assert.equal(result.resolvedPath, null);
|
|
330
|
+
});
|
|
307
331
|
});
|
|
308
332
|
|
|
309
333
|
// ─── Import Resolution Check Tests ───────────────────────────────────────────
|
|
@@ -334,6 +358,28 @@ describe("checkImportResolution", () => {
|
|
|
334
358
|
}
|
|
335
359
|
});
|
|
336
360
|
|
|
361
|
+
test("ignores generated React Router +types imports", () => {
|
|
362
|
+
tempDir = join(tmpdir(), `post-exec-test-${Date.now()}`);
|
|
363
|
+
mkdirSync(tempDir, { recursive: true });
|
|
364
|
+
mkdirSync(join(tempDir, "app", "routes"), { recursive: true });
|
|
365
|
+
writeFileSync(
|
|
366
|
+
join(tempDir, "app", "routes", "root.tsx"),
|
|
367
|
+
"import type { Route } from './+types/root';\nexport default function Root() { return null; }"
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
try {
|
|
371
|
+
const task = createTask({
|
|
372
|
+
id: "T01",
|
|
373
|
+
key_files: ["app/routes/root.tsx"],
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
const results = checkImportResolution(task, [], tempDir);
|
|
377
|
+
assert.deepEqual(results, []);
|
|
378
|
+
} finally {
|
|
379
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
|
|
337
383
|
test("fails when import doesn't resolve", () => {
|
|
338
384
|
tempDir = join(tmpdir(), `post-exec-test-${Date.now()}`);
|
|
339
385
|
mkdirSync(tempDir, { recursive: true });
|