gsd-pi 2.80.0-dev.42bd34838 → 2.80.0-dev.488219eb6
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/claude-cli-check.d.ts +30 -0
- package/dist/claude-cli-check.js +18 -7
- package/dist/cli.js +0 -19
- package/dist/headless-query.d.ts +10 -0
- package/dist/headless-query.js +6 -4
- package/dist/loader-entrypoint.d.ts +8 -0
- package/dist/loader-entrypoint.js +27 -0
- package/dist/loader.js +2 -11
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +6 -3
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +29 -0
- package/dist/resources/extensions/github-sync/sync.js +4 -1
- package/dist/resources/extensions/gsd/auto/loop.js +71 -8
- package/dist/resources/extensions/gsd/auto/phases.js +179 -99
- package/dist/resources/extensions/gsd/auto/resolve.js +12 -0
- package/dist/resources/extensions/gsd/auto/run-unit.js +10 -30
- package/dist/resources/extensions/gsd/auto/session.js +8 -0
- package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
- package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
- package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +94 -76
- package/dist/resources/extensions/gsd/auto-prompts.js +90 -15
- package/dist/resources/extensions/gsd/auto-start.js +238 -12
- package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
- package/dist/resources/extensions/gsd/auto.js +95 -44
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +96 -26
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +6 -3
- package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
- package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +298 -54
- package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
- package/dist/resources/extensions/gsd/clean-root-preflight.js +24 -6
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
- package/dist/resources/extensions/gsd/commands-config.js +1 -1
- package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
- package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +53 -0
- package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
- package/dist/resources/extensions/gsd/git-service.js +37 -1
- package/dist/resources/extensions/gsd/guided-flow.js +61 -32
- package/dist/resources/extensions/gsd/init-wizard.js +4 -1
- package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
- package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
- package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
- package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
- package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
- package/dist/resources/extensions/gsd/worktree-resolver.js +57 -5
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/8359.e059d86b255fce1c.js +10 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/welcome-screen.d.ts +2 -0
- package/dist/welcome-screen.js +9 -7
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +4 -1
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -0
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +2 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
- package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
- package/packages/pi-agent-core/dist/token-audit.js +221 -0
- package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
- package/packages/pi-agent-core/dist/types.d.ts +9 -0
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
- package/packages/pi-agent-core/src/agent-loop.ts +4 -1
- package/packages/pi-agent-core/src/agent.ts +8 -0
- package/packages/pi-agent-core/src/index.ts +2 -0
- package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
- package/packages/pi-agent-core/src/token-audit.ts +287 -0
- package/packages/pi-agent-core/src/types.ts +14 -0
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
- package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
- package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +9 -7
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
- package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
- package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
- package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
- package/packages/pi-ai/src/providers/anthropic.ts +22 -9
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +36 -7
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +3 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -6
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +3 -3
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +34 -3
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
- package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
- package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
- package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
- package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
- package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
- package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
- package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
- 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 +25 -1
- 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 +5 -0
- 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 +153 -8
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +18 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +23 -5
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- 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 +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +23 -5
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +40 -7
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +3 -1
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +3 -3
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +5 -5
- package/packages/pi-coding-agent/src/core/extensions/types.ts +37 -2
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
- package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
- package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
- package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
- package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
- package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +177 -8
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +24 -5
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +21 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +25 -8
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
- package/src/resources/extensions/github-sync/sync.ts +8 -1
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
- package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -2
- package/src/resources/extensions/gsd/auto/loop.ts +84 -8
- package/src/resources/extensions/gsd/auto/phases.ts +258 -159
- package/src/resources/extensions/gsd/auto/resolve.ts +19 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -29
- package/src/resources/extensions/gsd/auto/session.ts +8 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
- package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +107 -78
- package/src/resources/extensions/gsd/auto-prompts.ts +95 -14
- package/src/resources/extensions/gsd/auto-start.ts +286 -15
- package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
- package/src/resources/extensions/gsd/auto.ts +132 -40
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +116 -24
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -3
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +347 -54
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
- package/src/resources/extensions/gsd/clean-root-preflight.ts +32 -7
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
- package/src/resources/extensions/gsd/commands-config.ts +1 -1
- package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
- package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +66 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
- package/src/resources/extensions/gsd/git-service.ts +41 -2
- package/src/resources/extensions/gsd/guided-flow.ts +71 -39
- package/src/resources/extensions/gsd/init-wizard.ts +5 -1
- package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
- package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -4
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
- package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +361 -10
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +15 -6
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
- package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
- package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +35 -31
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -125
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -97
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +33 -47
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
- package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +14 -13
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +140 -3
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
- package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/worktree-resolver.ts +83 -5
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
- package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{tht0ltP8EIjsohPOA_WZf → G68KoLv5claox_Dyd4pZn}/_ssgManifest.js +0 -0
|
@@ -113,8 +113,9 @@ test("#4782 phase 3: buildCompleteSlicePrompt composes roadmap → plan → task
|
|
|
113
113
|
"task summaries precede slice-summary template",
|
|
114
114
|
);
|
|
115
115
|
|
|
116
|
-
// Task
|
|
117
|
-
assert.match(prompt,
|
|
116
|
+
// Task summary excerpt is inlined; full narrative remains on-demand.
|
|
117
|
+
assert.match(prompt, /### Task Summary: T01 \(excerpt\)/);
|
|
118
|
+
assert.doesNotMatch(prompt, /Task one did the thing/);
|
|
118
119
|
});
|
|
119
120
|
|
|
120
121
|
test("#4782 phase 3: buildCompleteSlicePrompt handles missing task summaries gracefully", async (t) => {
|
|
@@ -9,46 +9,42 @@
|
|
|
9
9
|
|
|
10
10
|
import { describe, test } from 'node:test';
|
|
11
11
|
import assert from 'node:assert/strict';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { dirname, join } from 'node:path';
|
|
15
|
-
|
|
16
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
-
const __dirname = dirname(__filename);
|
|
18
|
-
|
|
19
|
-
const completeTaskSrc = readFileSync(
|
|
20
|
-
join(__dirname, '..', 'tools', 'complete-task.ts'),
|
|
21
|
-
'utf-8',
|
|
22
|
-
);
|
|
23
|
-
const roadmapSlicesSrc = readFileSync(
|
|
24
|
-
join(__dirname, '..', 'roadmap-slices.ts'),
|
|
25
|
-
'utf-8',
|
|
26
|
-
);
|
|
12
|
+
import { normalizeListParam } from "../tools/complete-task.ts";
|
|
13
|
+
import { parseRoadmapSlices } from "../roadmap-slices.ts";
|
|
27
14
|
|
|
28
15
|
describe('complete-task normalizeListParam (#3692)', () => {
|
|
29
|
-
test('
|
|
30
|
-
assert.
|
|
31
|
-
|
|
16
|
+
test('normalizes newline-delimited key file strings', () => {
|
|
17
|
+
assert.deepEqual(
|
|
18
|
+
normalizeListParam("- src/app.ts\n* tests/app.test.ts\n docs/notes.md"),
|
|
19
|
+
["src/app.ts", "tests/app.test.ts", "docs/notes.md"],
|
|
20
|
+
);
|
|
32
21
|
});
|
|
33
22
|
|
|
34
|
-
test('
|
|
35
|
-
assert.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
test('normalizeListParam is applied to keyDecisions', () => {
|
|
40
|
-
assert.match(completeTaskSrc, /normalizeListParam\(params\.keyDecisions\)/,
|
|
41
|
-
'normalizeListParam should be applied to keyDecisions');
|
|
23
|
+
test('normalizes arrays and empty values', () => {
|
|
24
|
+
assert.deepEqual(normalizeListParam(["api", 42]), ["api", "42"]);
|
|
25
|
+
assert.deepEqual(normalizeListParam(" "), []);
|
|
26
|
+
assert.deepEqual(normalizeListParam(undefined), []);
|
|
42
27
|
});
|
|
43
28
|
});
|
|
44
29
|
|
|
45
30
|
describe('roadmap-slices depColumnIndex detection (#3692)', () => {
|
|
46
|
-
test('
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
31
|
+
test('parses dependencies from the dependency table column only', () => {
|
|
32
|
+
const slices = parseRoadmapSlices([
|
|
33
|
+
"## Slices",
|
|
34
|
+
"| ID | Title | Risk | Depends | Status |",
|
|
35
|
+
"| -- | ----- | ---- | ------- | ------ |",
|
|
36
|
+
"| S01 | Foundation | low | none | Done |",
|
|
37
|
+
"| S02 | Title mentions S01 but no dependency | medium | none | Pending |",
|
|
38
|
+
"| S03 | Integration | high | S01, S02 | Pending |",
|
|
39
|
+
].join("\n"));
|
|
40
|
+
|
|
41
|
+
assert.deepEqual(
|
|
42
|
+
slices.map((slice) => ({ id: slice.id, depends: slice.depends })),
|
|
43
|
+
[
|
|
44
|
+
{ id: "S01", depends: [] },
|
|
45
|
+
{ id: "S02", depends: [] },
|
|
46
|
+
{ id: "S03", depends: ["S01", "S02"] },
|
|
47
|
+
],
|
|
48
|
+
);
|
|
53
49
|
});
|
|
54
50
|
});
|
|
@@ -1,124 +1,61 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* completed-units-metrics-sync.test.ts — Regression tests for #2313.
|
|
3
|
-
*
|
|
4
|
-
* 1. completed-units.json should be archived (not wiped) on milestone transition
|
|
5
|
-
* 2. metrics.json should be in the worktree → project root sync file list
|
|
6
3
|
*/
|
|
7
4
|
|
|
8
5
|
import test from "node:test";
|
|
9
6
|
import assert from "node:assert/strict";
|
|
10
|
-
import { readFileSync, mkdtempSync, mkdirSync, writeFileSync, existsSync, cpSync } from "node:fs";
|
|
7
|
+
import { readFileSync, mkdtempSync, mkdirSync, writeFileSync, existsSync, cpSync, rmSync } from "node:fs";
|
|
11
8
|
import { join } from "node:path";
|
|
12
9
|
import { tmpdir } from "node:os";
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
window.includes("cpsync") ||
|
|
39
|
-
window.includes("safecopy") ||
|
|
40
|
-
window.includes("completed-units-");
|
|
41
|
-
|
|
42
|
-
assert.ok(
|
|
43
|
-
hasArchive,
|
|
44
|
-
"completed-units.json should be archived before reset during milestone transition",
|
|
45
|
-
);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// ─── Bug 2: metrics.json should be in the sync file lists ──────────────────
|
|
49
|
-
|
|
50
|
-
test("#2313: syncStateToProjectRoot should sync metrics.json", () => {
|
|
51
|
-
const syncSrcPath = join(import.meta.dirname, "..", "auto-worktree.ts");
|
|
52
|
-
const syncSrc = readFileSync(syncSrcPath, "utf-8");
|
|
53
|
-
|
|
54
|
-
// syncStateToProjectRoot should copy metrics.json from worktree to project root
|
|
55
|
-
assert.ok(
|
|
56
|
-
syncSrc.includes("metrics.json"),
|
|
57
|
-
"auto-worktree.ts should reference metrics.json for sync",
|
|
58
|
-
);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test("syncStateToProjectRoot should back-sync completed-units.json", () => {
|
|
62
|
-
const syncSrcPath = join(import.meta.dirname, "..", "auto-worktree.ts");
|
|
63
|
-
const syncSrc = readFileSync(syncSrcPath, "utf-8");
|
|
64
|
-
const fnIdx = syncSrc.indexOf("export function syncStateToProjectRoot(");
|
|
65
|
-
assert.ok(fnIdx !== -1, "syncStateToProjectRoot exists");
|
|
66
|
-
const fnBlock = syncSrc.slice(fnIdx, syncSrc.indexOf("// ─── Resource Staleness", fnIdx));
|
|
67
|
-
|
|
68
|
-
assert.ok(
|
|
69
|
-
fnBlock.includes('"completed-units.json"'),
|
|
70
|
-
"syncStateToProjectRoot should copy completed-units.json back to the project root",
|
|
71
|
-
);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test("#2313: syncWorktreeStateBack should include metrics.json in ROOT_DIAGNOSTIC_FILES", () => {
|
|
75
|
-
const autoWorktreeSrcPath = join(import.meta.dirname, "..", "auto-worktree.ts");
|
|
76
|
-
const autoWorktreeSrc = readFileSync(autoWorktreeSrcPath, "utf-8");
|
|
77
|
-
|
|
78
|
-
// Find the ROOT_DIAGNOSTIC_FILES constant used for worktree copy-back.
|
|
79
|
-
const constIdx = autoWorktreeSrc.indexOf("ROOT_DIAGNOSTIC_FILES");
|
|
80
|
-
assert.ok(constIdx !== -1, "ROOT_DIAGNOSTIC_FILES constant exists");
|
|
81
|
-
|
|
82
|
-
// Get the array content
|
|
83
|
-
const arrayStart = autoWorktreeSrc.indexOf("[", constIdx);
|
|
84
|
-
const arrayEnd = autoWorktreeSrc.indexOf("]", arrayStart);
|
|
85
|
-
const rootFilesBlock = autoWorktreeSrc.slice(arrayStart, arrayEnd);
|
|
86
|
-
|
|
87
|
-
assert.ok(
|
|
88
|
-
rootFilesBlock.includes("metrics.json"),
|
|
89
|
-
"metrics.json should be in ROOT_DIAGNOSTIC_FILES list",
|
|
90
|
-
);
|
|
10
|
+
import { syncStateToProjectRoot } from "../auto-worktree.ts";
|
|
11
|
+
|
|
12
|
+
test("#2313: syncStateToProjectRoot copies metrics and completed-units to the project root", () => {
|
|
13
|
+
const root = mkdtempSync(join(tmpdir(), "gsd-sync-metrics-"));
|
|
14
|
+
const projectRoot = join(root, "project");
|
|
15
|
+
const worktree = join(root, "worktree");
|
|
16
|
+
mkdirSync(join(projectRoot, ".gsd"), { recursive: true });
|
|
17
|
+
mkdirSync(join(worktree, ".gsd"), { recursive: true });
|
|
18
|
+
writeFileSync(join(worktree, ".gsd", "metrics.json"), JSON.stringify({ tokens: 42 }));
|
|
19
|
+
writeFileSync(join(worktree, ".gsd", "completed-units.json"), JSON.stringify([{ id: "T01" }]));
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
syncStateToProjectRoot(worktree, projectRoot, "M001");
|
|
23
|
+
|
|
24
|
+
assert.deepEqual(
|
|
25
|
+
JSON.parse(readFileSync(join(projectRoot, ".gsd", "metrics.json"), "utf-8")),
|
|
26
|
+
{ tokens: 42 },
|
|
27
|
+
);
|
|
28
|
+
assert.deepEqual(
|
|
29
|
+
JSON.parse(readFileSync(join(projectRoot, ".gsd", "completed-units.json"), "utf-8")),
|
|
30
|
+
[{ id: "T01" }],
|
|
31
|
+
);
|
|
32
|
+
} finally {
|
|
33
|
+
rmSync(root, { recursive: true, force: true });
|
|
34
|
+
}
|
|
91
35
|
});
|
|
92
36
|
|
|
93
|
-
// ─── Functional test: completed-units archive ────────────────────────────────
|
|
94
|
-
|
|
95
37
|
test("#2313: functional — completed-units archive creates milestone-specific file", () => {
|
|
96
38
|
const tmpBase = mkdtempSync(join(tmpdir(), "gsd-completed-units-"));
|
|
97
39
|
const gsdDir = join(tmpBase, ".gsd");
|
|
98
40
|
mkdirSync(gsdDir, { recursive: true });
|
|
99
41
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
assert.deepEqual(archived, existing, "archived data should match original");
|
|
120
|
-
|
|
121
|
-
// Verify main file is reset
|
|
122
|
-
const current = JSON.parse(readFileSync(completedKeysPath, "utf-8"));
|
|
123
|
-
assert.deepEqual(current, [], "current completed-units should be empty after transition");
|
|
42
|
+
try {
|
|
43
|
+
const existing = [
|
|
44
|
+
{ type: "task", id: "T01" },
|
|
45
|
+
{ type: "slice", id: "S01" },
|
|
46
|
+
];
|
|
47
|
+
const completedKeysPath = join(gsdDir, "completed-units.json");
|
|
48
|
+
writeFileSync(completedKeysPath, JSON.stringify(existing, null, 2));
|
|
49
|
+
|
|
50
|
+
const milestoneId = "M001";
|
|
51
|
+
const archivePath = join(gsdDir, `completed-units-${milestoneId}.json`);
|
|
52
|
+
cpSync(completedKeysPath, archivePath);
|
|
53
|
+
writeFileSync(completedKeysPath, JSON.stringify([], null, 2));
|
|
54
|
+
|
|
55
|
+
assert.ok(existsSync(archivePath), "archive file should exist");
|
|
56
|
+
assert.deepEqual(JSON.parse(readFileSync(archivePath, "utf-8")), existing);
|
|
57
|
+
assert.deepEqual(JSON.parse(readFileSync(completedKeysPath, "utf-8")), []);
|
|
58
|
+
} finally {
|
|
59
|
+
rmSync(tmpBase, { recursive: true, force: true });
|
|
60
|
+
}
|
|
124
61
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// GSD-2 + context-store.test.ts — Regression coverage for DB-backed context query helpers.
|
|
2
|
+
|
|
1
3
|
import { describe, test, afterEach } from "node:test";
|
|
2
4
|
import assert from "node:assert/strict";
|
|
3
5
|
import {
|
|
@@ -362,7 +364,11 @@ describe("context-store: sub-5ms query timing", () => {
|
|
|
362
364
|
|
|
363
365
|
assert.strictEqual(decisions.length, 50, `got ${decisions.length} decisions (expected 50)`);
|
|
364
366
|
assert.strictEqual(requirements.length, 50, `got ${requirements.length} requirements (expected 50)`);
|
|
365
|
-
|
|
367
|
+
const maxLatencyMs = process.env.NODE_V8_COVERAGE ? 15 : 5;
|
|
368
|
+
assert.ok(
|
|
369
|
+
elapsed < maxLatencyMs,
|
|
370
|
+
`query latency ${elapsed.toFixed(2)}ms should be < ${maxLatencyMs}ms`,
|
|
371
|
+
);
|
|
366
372
|
});
|
|
367
373
|
});
|
|
368
374
|
|
|
@@ -13,11 +13,8 @@ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from 'node:f
|
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
import { tmpdir } from 'node:os';
|
|
15
15
|
import { randomUUID } from 'node:crypto';
|
|
16
|
-
import { fileURLToPath } from 'node:url';
|
|
17
|
-
import { dirname } from 'node:path';
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
const __dirname = dirname(__filename);
|
|
17
|
+
import { installEpipeGuard } from "../bootstrap/register-extension.ts";
|
|
21
18
|
|
|
22
19
|
function makeTmpBase(): string {
|
|
23
20
|
const base = join(tmpdir(), `gsd-test-${randomUUID()}`);
|
|
@@ -25,13 +22,6 @@ function makeTmpBase(): string {
|
|
|
25
22
|
return base;
|
|
26
23
|
}
|
|
27
24
|
|
|
28
|
-
// ─── register-extension source assertions ────────────────────────────────────
|
|
29
|
-
|
|
30
|
-
const registerExtSrc = readFileSync(
|
|
31
|
-
join(__dirname, '..', 'bootstrap', 'register-extension.ts'),
|
|
32
|
-
'utf-8',
|
|
33
|
-
);
|
|
34
|
-
|
|
35
25
|
describe('register-extension crash handler secondary fixes (#3348)', () => {
|
|
36
26
|
test('writeCrashLog is exported and writes a file to the crash directory', async () => {
|
|
37
27
|
// Dynamic import so GSD_HOME can be pointed at a temp dir without polluting ~/.gsd
|
|
@@ -60,30 +50,44 @@ describe('register-extension crash handler secondary fixes (#3348)', () => {
|
|
|
60
50
|
});
|
|
61
51
|
|
|
62
52
|
test('_gsdRejectionGuard is registered for unhandledRejection', () => {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
'_gsdRejectionGuard handler should be defined',
|
|
67
|
-
);
|
|
68
|
-
assert.match(
|
|
69
|
-
registerExtSrc,
|
|
70
|
-
/unhandledRejection/,
|
|
71
|
-
'installEpipeGuard should register an unhandledRejection handler',
|
|
53
|
+
installEpipeGuard();
|
|
54
|
+
const listener = process.listeners("unhandledRejection").find((candidate) =>
|
|
55
|
+
candidate.name === "_gsdRejectionGuard"
|
|
72
56
|
);
|
|
57
|
+
assert.ok(listener, 'installEpipeGuard should register an unhandledRejection handler');
|
|
73
58
|
});
|
|
74
59
|
|
|
75
|
-
test('_gsdEpipeGuard
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
!registerExtSrc.includes('process.stderr.write(`[gsd] uncaught extension error (non-fatal)'),
|
|
80
|
-
'_gsdEpipeGuard should NOT log errors as non-fatal and continue',
|
|
81
|
-
);
|
|
82
|
-
assert.match(
|
|
83
|
-
registerExtSrc,
|
|
84
|
-
/process\.exit\(1\)/,
|
|
85
|
-
'_gsdEpipeGuard should call process.exit(1) for unrecoverable errors',
|
|
60
|
+
test('_gsdEpipeGuard writes a crash log and exits for unrecoverable errors', () => {
|
|
61
|
+
installEpipeGuard();
|
|
62
|
+
const listener = process.listeners("uncaughtException").find((candidate) =>
|
|
63
|
+
candidate.name === "_gsdEpipeGuard"
|
|
86
64
|
);
|
|
65
|
+
assert.ok(listener, '_gsdEpipeGuard should be registered');
|
|
66
|
+
|
|
67
|
+
const tmpHome = join(tmpdir(), `gsd-crash-exit-test-${randomUUID()}`);
|
|
68
|
+
const origHome = process.env.GSD_HOME;
|
|
69
|
+
const originalExit = process.exit;
|
|
70
|
+
let exitCode: number | string | null | undefined;
|
|
71
|
+
(process as any).exit = (code?: number | string | null | undefined): never => {
|
|
72
|
+
exitCode = code;
|
|
73
|
+
throw new Error("process.exit intercepted");
|
|
74
|
+
};
|
|
75
|
+
process.env.GSD_HOME = tmpHome;
|
|
76
|
+
try {
|
|
77
|
+
assert.throws(
|
|
78
|
+
() => listener(new Error("unrecoverable crash guard test"), "uncaughtException"),
|
|
79
|
+
/process\.exit intercepted/,
|
|
80
|
+
);
|
|
81
|
+
assert.equal(exitCode, 1);
|
|
82
|
+
const crashDir = join(tmpHome, "crash");
|
|
83
|
+
const logs = readdirSync(crashDir).filter((f) => f.endsWith(".log"));
|
|
84
|
+
assert.equal(logs.length, 1);
|
|
85
|
+
assert.match(readFileSync(join(crashDir, logs[0]), "utf-8"), /unrecoverable crash guard test/);
|
|
86
|
+
} finally {
|
|
87
|
+
(process as any).exit = originalExit;
|
|
88
|
+
process.env.GSD_HOME = origHome;
|
|
89
|
+
rmSync(tmpHome, { recursive: true, force: true });
|
|
90
|
+
}
|
|
87
91
|
});
|
|
88
92
|
|
|
89
93
|
test('writeCrashLog never throws even when directory is unwritable', async () => {
|
|
@@ -192,7 +192,11 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
|
|
|
192
192
|
resolveMilestoneFile: () => null,
|
|
193
193
|
reconcileMergeState: () => "clean",
|
|
194
194
|
preflightCleanRoot: () => ({ stashPushed: false, summary: "" }),
|
|
195
|
-
postflightPopStash: () => {
|
|
195
|
+
postflightPopStash: () => ({
|
|
196
|
+
restored: true,
|
|
197
|
+
needsManualRecovery: false,
|
|
198
|
+
message: "restored",
|
|
199
|
+
}),
|
|
196
200
|
getLedger: () => null,
|
|
197
201
|
getProjectTotals: () => ({ cost: 0 }),
|
|
198
202
|
formatCost: (c: number) => `$${c.toFixed(2)}`,
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Behavior tests for deleted-cwd fallback handling.
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import assert from "node:assert/strict";
|
|
5
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
|
|
9
|
+
import { registerDbTools } from "../bootstrap/db-tools.ts";
|
|
10
|
+
import { registerDynamicTools, ensureDbOpen, safeWorkspaceCwd } from "../bootstrap/dynamic-tools.ts";
|
|
11
|
+
import { registerExecTools } from "../bootstrap/exec-tools.ts";
|
|
12
|
+
import { registerJournalTools } from "../bootstrap/journal-tools.ts";
|
|
13
|
+
import { registerMemoryTools } from "../bootstrap/memory-tools.ts";
|
|
14
|
+
import { registerQueryTools } from "../bootstrap/query-tools.ts";
|
|
15
|
+
|
|
16
|
+
async function withDeletedCwd(fn: (projectRoot: string) => Promise<void> | void): Promise<void> {
|
|
17
|
+
const previousCwd = process.cwd();
|
|
18
|
+
const previousProjectRoot = process.env.GSD_PROJECT_ROOT;
|
|
19
|
+
const projectRoot = mkdtempSync(join(tmpdir(), "gsd-safe-cwd-project-"));
|
|
20
|
+
const removedCwd = mkdtempSync(join(tmpdir(), "gsd-removed-cwd-"));
|
|
21
|
+
|
|
22
|
+
process.env.GSD_PROJECT_ROOT = projectRoot;
|
|
23
|
+
process.chdir(removedCwd);
|
|
24
|
+
rmSync(removedCwd, { recursive: true, force: true });
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
assert.throws(() => process.cwd(), /ENOENT/);
|
|
28
|
+
await fn(projectRoot);
|
|
29
|
+
} finally {
|
|
30
|
+
process.chdir(previousCwd);
|
|
31
|
+
if (previousProjectRoot === undefined) delete process.env.GSD_PROJECT_ROOT;
|
|
32
|
+
else process.env.GSD_PROJECT_ROOT = previousProjectRoot;
|
|
33
|
+
rmSync(projectRoot, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function collectTools(register: (pi: any) => void): any[] {
|
|
38
|
+
const tools: any[] = [];
|
|
39
|
+
register({
|
|
40
|
+
registerTool(tool: any) {
|
|
41
|
+
tools.push(tool);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
return tools;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
test("safeWorkspaceCwd falls back to captured project root when cwd was removed", async () => {
|
|
48
|
+
await withDeletedCwd((projectRoot) => {
|
|
49
|
+
assert.equal(safeWorkspaceCwd(), projectRoot);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("ensureDbOpen default path does not throw when cwd was removed", async () => {
|
|
54
|
+
await withDeletedCwd(async () => {
|
|
55
|
+
assert.equal(await ensureDbOpen(), false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("dynamic tools register when cwd was removed", async () => {
|
|
60
|
+
await withDeletedCwd(() => {
|
|
61
|
+
const tools = collectTools(registerDynamicTools);
|
|
62
|
+
assert.equal(tools.length, 4);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("db-backed tool fallbacks return normal unavailable-db errors when cwd was removed", async () => {
|
|
67
|
+
await withDeletedCwd(async () => {
|
|
68
|
+
const tools = collectTools(registerDbTools);
|
|
69
|
+
const decisionSave = tools.find((tool) => tool.name === "gsd_decision_save");
|
|
70
|
+
|
|
71
|
+
const result = await decisionSave.execute(
|
|
72
|
+
"call-1",
|
|
73
|
+
{
|
|
74
|
+
scope: "test",
|
|
75
|
+
decision: "Handle deleted cwd",
|
|
76
|
+
choice: "Use captured project root",
|
|
77
|
+
rationale: "The worktree cwd may disappear during cleanup.",
|
|
78
|
+
},
|
|
79
|
+
undefined,
|
|
80
|
+
undefined,
|
|
81
|
+
undefined,
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
assert.equal(result.details.error, "db_unavailable");
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("memory and query tools do not throw when cwd was removed", async () => {
|
|
89
|
+
await withDeletedCwd(async () => {
|
|
90
|
+
const memoryTools = collectTools(registerMemoryTools);
|
|
91
|
+
const queryTools = collectTools(registerQueryTools);
|
|
92
|
+
|
|
93
|
+
await assert.doesNotReject(() =>
|
|
94
|
+
memoryTools.find((tool) => tool.name === "memory_query").execute(
|
|
95
|
+
"call-1",
|
|
96
|
+
{ query: "cwd fallback" },
|
|
97
|
+
undefined,
|
|
98
|
+
undefined,
|
|
99
|
+
undefined,
|
|
100
|
+
),
|
|
101
|
+
);
|
|
102
|
+
await assert.doesNotReject(() =>
|
|
103
|
+
queryTools.find((tool) => tool.name === "gsd_milestone_status").execute(
|
|
104
|
+
"call-2",
|
|
105
|
+
{ milestoneId: "M001" },
|
|
106
|
+
undefined,
|
|
107
|
+
undefined,
|
|
108
|
+
undefined,
|
|
109
|
+
),
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("journal and exec tools do not throw when cwd was removed", async () => {
|
|
115
|
+
await withDeletedCwd(async () => {
|
|
116
|
+
const journalTools = collectTools(registerJournalTools);
|
|
117
|
+
const execTools = collectTools(registerExecTools);
|
|
118
|
+
|
|
119
|
+
await assert.doesNotReject(() =>
|
|
120
|
+
journalTools.find((tool) => tool.name === "gsd_journal_query").execute(
|
|
121
|
+
"call-1",
|
|
122
|
+
{ limit: 1 },
|
|
123
|
+
undefined,
|
|
124
|
+
undefined,
|
|
125
|
+
undefined,
|
|
126
|
+
),
|
|
127
|
+
);
|
|
128
|
+
await assert.doesNotReject(() =>
|
|
129
|
+
execTools.find((tool) => tool.name === "gsd_resume").execute(
|
|
130
|
+
"call-2",
|
|
131
|
+
{},
|
|
132
|
+
undefined,
|
|
133
|
+
undefined,
|
|
134
|
+
undefined,
|
|
135
|
+
),
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
@@ -1,21 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dashboard-custom-engine.test.ts —
|
|
3
|
-
* calls updateProgressWidget and that unitLabel handles "custom-step".
|
|
4
|
-
*
|
|
5
|
-
* Uses source-level assertions for the non-exported unitLabel function
|
|
6
|
-
* and the updateProgressWidget call placement. Tests exported helpers
|
|
7
|
-
* (unitVerb, unitPhaseLabel) directly.
|
|
2
|
+
* dashboard-custom-engine.test.ts — custom-step dashboard labels.
|
|
8
3
|
*/
|
|
9
4
|
|
|
10
5
|
import { describe, it } from "node:test";
|
|
11
6
|
import assert from "node:assert/strict";
|
|
12
|
-
import { readFileSync } from "node:fs";
|
|
13
|
-
import { resolve } from "node:path";
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
15
7
|
|
|
16
8
|
import { unitVerb, unitPhaseLabel } from "../auto-dashboard.js";
|
|
17
|
-
|
|
18
|
-
// ─── Tests ───────────────────────────────────────────────────────────────
|
|
9
|
+
import { unitLabel } from "../dashboard-overlay.ts";
|
|
19
10
|
|
|
20
11
|
describe("Dashboard custom-engine: unitLabel and related helpers", () => {
|
|
21
12
|
it('unitVerb("custom-step") returns "executing workflow step"', () => {
|
|
@@ -26,62 +17,7 @@ describe("Dashboard custom-engine: unitLabel and related helpers", () => {
|
|
|
26
17
|
assert.equal(unitPhaseLabel("custom-step"), "WORKFLOW");
|
|
27
18
|
});
|
|
28
19
|
|
|
29
|
-
it('
|
|
30
|
-
|
|
31
|
-
const overlayPath = resolve(__filename, "../../dashboard-overlay.ts");
|
|
32
|
-
const source = readFileSync(overlayPath, "utf-8");
|
|
33
|
-
assert.ok(
|
|
34
|
-
source.includes('"custom-step"') && source.includes('"Workflow Step"'),
|
|
35
|
-
'dashboard-overlay.ts should contain case "custom-step": return "Workflow Step"',
|
|
36
|
-
);
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
describe("Dashboard custom-engine: updateProgressWidget in custom engine path", () => {
|
|
41
|
-
it("loop.ts custom engine path includes updateProgressWidget call before runGuards", () => {
|
|
42
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
43
|
-
const loopPath = resolve(__filename, "../../auto/loop.ts");
|
|
44
|
-
const source = readFileSync(loopPath, "utf-8");
|
|
45
|
-
|
|
46
|
-
// Find the custom engine block
|
|
47
|
-
const customEngineStart = source.indexOf("shouldUseCustomEnginePath({");
|
|
48
|
-
assert.ok(customEngineStart > -1, "Should find custom engine path in loop.ts");
|
|
49
|
-
|
|
50
|
-
// The updateProgressWidget call should appear after the custom engine block start
|
|
51
|
-
// and before the runGuards call in that block
|
|
52
|
-
const afterCustomEngine = source.slice(customEngineStart);
|
|
53
|
-
const widgetCallIndex = afterCustomEngine.indexOf(
|
|
54
|
-
"deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state)",
|
|
55
|
-
);
|
|
56
|
-
const guardsCallIndex = afterCustomEngine.indexOf("runGuards(ic,");
|
|
57
|
-
assert.ok(widgetCallIndex > -1, "updateProgressWidget should be called in custom engine path");
|
|
58
|
-
assert.ok(
|
|
59
|
-
widgetCallIndex < guardsCallIndex,
|
|
60
|
-
"updateProgressWidget should be called before runGuards in custom engine path",
|
|
61
|
-
);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("updateProgressWidget call is placed after iterData is built", () => {
|
|
65
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
66
|
-
const loopPath = resolve(__filename, "../../auto/loop.ts");
|
|
67
|
-
const source = readFileSync(loopPath, "utf-8");
|
|
68
|
-
|
|
69
|
-
const customEngineStart = source.indexOf("shouldUseCustomEnginePath({");
|
|
70
|
-
const afterCustomEngine = source.slice(customEngineStart);
|
|
71
|
-
|
|
72
|
-
// Verify custom engine path has iterData built before the widget call
|
|
73
|
-
const iterDataIndex = afterCustomEngine.indexOf("buildCustomEngineIterationData({");
|
|
74
|
-
const widgetIndex = afterCustomEngine.indexOf("deps.updateProgressWidget");
|
|
75
|
-
assert.ok(iterDataIndex > -1 && widgetIndex > -1, "Both iterData and widget call should exist");
|
|
76
|
-
assert.ok(
|
|
77
|
-
iterDataIndex < widgetIndex,
|
|
78
|
-
"iterData should be built before updateProgressWidget is called",
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
// Verify the call uses iterData.state (which holds the derived GSD state)
|
|
82
|
-
assert.ok(
|
|
83
|
-
afterCustomEngine.includes("iterData.state"),
|
|
84
|
-
"Custom engine updateProgressWidget should reference iterData.state",
|
|
85
|
-
);
|
|
20
|
+
it('unitLabel("custom-step") returns "Workflow Step"', () => {
|
|
21
|
+
assert.equal(unitLabel("custom-step"), "Workflow Step");
|
|
86
22
|
});
|
|
87
23
|
});
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
clearPendingAutoStart,
|
|
21
21
|
checkDeepProjectSetupAfterTurn,
|
|
22
22
|
clearPendingDeepProjectSetup,
|
|
23
|
+
FOREGROUND_DEEP_SETUP_RULE_NAMES,
|
|
23
24
|
showSmartEntry,
|
|
24
25
|
startDeepProjectSetupForeground,
|
|
25
26
|
} from "../guided-flow.ts";
|
|
@@ -1013,15 +1014,9 @@ test("deep project setup: same project advances when agent_end session id change
|
|
|
1013
1014
|
});
|
|
1014
1015
|
|
|
1015
1016
|
test("deep project setup: foreground dispatcher does not probe research-project rule", () => {
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
assert.
|
|
1019
|
-
assert.doesNotMatch(
|
|
1020
|
-
match![1]!,
|
|
1021
|
-
/research-project/,
|
|
1022
|
-
"foreground setup must not evaluate research-project because that rule claims the inflight marker",
|
|
1023
|
-
);
|
|
1024
|
-
assert.match(source, /research-project have dispatch-time side effects/);
|
|
1017
|
+
assert.equal(FOREGROUND_DEEP_SETUP_RULE_NAMES.has("deep: pre-planning (no PROJECT) → discuss-project"), true);
|
|
1018
|
+
assert.equal(FOREGROUND_DEEP_SETUP_RULE_NAMES.has("deep: pre-planning (no research decision) → research-decision"), true);
|
|
1019
|
+
assert.equal(FOREGROUND_DEEP_SETUP_RULE_NAMES.has("deep: pre-planning (no PROJECT research) → research-project"), false);
|
|
1025
1020
|
});
|
|
1026
1021
|
|
|
1027
1022
|
test("deep project setup: project-level units verify their real artifacts", () => {
|