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
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Slice-cadence merge and milestone resquash git operations.
|
|
1
3
|
/**
|
|
2
4
|
* Slice-cadence collapse — #4765.
|
|
3
5
|
*
|
|
@@ -40,6 +42,7 @@ import { logWarning } from "./workflow-logger.js";
|
|
|
40
42
|
import { emitSliceMerged, emitMilestoneResquash } from "./worktree-telemetry.js";
|
|
41
43
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
42
44
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
45
|
+
import { getMilestone, getSlice, isDbAvailable } from "./gsd-db.js";
|
|
43
46
|
|
|
44
47
|
/**
|
|
45
48
|
* Auto-worktree milestone branch name. Must match autoWorktreeBranch() in
|
|
@@ -72,6 +75,50 @@ function cleanupMergeArtifacts(projectRoot: string): void {
|
|
|
72
75
|
}
|
|
73
76
|
}
|
|
74
77
|
|
|
78
|
+
function stripKnownIdPrefix(value: string | undefined | null, id: string): string | undefined {
|
|
79
|
+
const raw = String(value ?? "").trim();
|
|
80
|
+
if (!raw) return undefined;
|
|
81
|
+
const lower = raw.toLowerCase();
|
|
82
|
+
const idLower = id.toLowerCase();
|
|
83
|
+
if (lower.startsWith(`${idLower}:`)) return raw.slice(id.length + 1).trim() || undefined;
|
|
84
|
+
return raw;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function getSliceMergeNames(milestoneId: string, sliceId: string): {
|
|
88
|
+
milestoneTitle?: string;
|
|
89
|
+
sliceTitle?: string;
|
|
90
|
+
} {
|
|
91
|
+
if (!isDbAvailable()) return {};
|
|
92
|
+
return {
|
|
93
|
+
milestoneTitle: stripKnownIdPrefix(getMilestone(milestoneId)?.title, milestoneId),
|
|
94
|
+
sliceTitle: stripKnownIdPrefix(getSlice(milestoneId, sliceId)?.title, sliceId),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function buildSliceMergeCommitMessage(milestoneId: string, sliceId: string, milestoneBranch: string): string {
|
|
99
|
+
const names = getSliceMergeNames(milestoneId, sliceId);
|
|
100
|
+
const sliceLabel = names.sliceTitle ?? sliceId;
|
|
101
|
+
const subject = `feat: ${sliceLabel} - ${sliceId} of ${milestoneId} (slice-cadence)`;
|
|
102
|
+
const body = [
|
|
103
|
+
`Slice: ${sliceId}${names.sliceTitle ? ` - ${names.sliceTitle}` : ""}`,
|
|
104
|
+
`Milestone: ${milestoneId}${names.milestoneTitle ? ` - ${names.milestoneTitle}` : ""}`,
|
|
105
|
+
`GSD-Slice: ${sliceId}`,
|
|
106
|
+
`GSD-Milestone: ${milestoneId}`,
|
|
107
|
+
`Branch: ${milestoneBranch}`,
|
|
108
|
+
];
|
|
109
|
+
return `${subject}\n\n${body.join("\n")}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function buildMilestoneResquashCommitMessage(milestoneId: string, sliceCount: number): string {
|
|
113
|
+
const milestoneTitle = isDbAvailable()
|
|
114
|
+
? stripKnownIdPrefix(getMilestone(milestoneId)?.title, milestoneId)
|
|
115
|
+
: undefined;
|
|
116
|
+
const subject = milestoneTitle
|
|
117
|
+
? `feat: ${milestoneTitle} (${milestoneId}, ${sliceCount} slices re-squashed)`
|
|
118
|
+
: `feat: ${milestoneId} (${sliceCount} slices re-squashed)`;
|
|
119
|
+
return `${subject}\n\nMilestone: ${milestoneId}${milestoneTitle ? ` - ${milestoneTitle}` : ""}\nGSD-Milestone: ${milestoneId}`;
|
|
120
|
+
}
|
|
121
|
+
|
|
75
122
|
function advanceMilestoneBranch(
|
|
76
123
|
projectRoot: string,
|
|
77
124
|
worktreeCwd: string,
|
|
@@ -227,7 +274,7 @@ export function mergeSliceToMain(
|
|
|
227
274
|
// Commit the squash with a slice-scoped message
|
|
228
275
|
const commitSha = nativeCommit(
|
|
229
276
|
projectRoot,
|
|
230
|
-
|
|
277
|
+
buildSliceMergeCommitMessage(milestoneId, sliceId, milestoneBranch),
|
|
231
278
|
);
|
|
232
279
|
|
|
233
280
|
// Advance the milestone branch to main so the next slice's commits start
|
|
@@ -327,7 +374,7 @@ export function resquashMilestoneOnMain(
|
|
|
327
374
|
|
|
328
375
|
const newSha = nativeCommit(
|
|
329
376
|
projectRoot,
|
|
330
|
-
|
|
377
|
+
buildMilestoneResquashCommitMessage(milestoneId, sliceCount),
|
|
331
378
|
{ allowEmpty: true },
|
|
332
379
|
);
|
|
333
380
|
|
|
@@ -84,6 +84,27 @@ const SLICE_ORCHESTRATOR_STATE_FILE = "slice-orchestrator.json";
|
|
|
84
84
|
const TMP_SUFFIX = ".tmp";
|
|
85
85
|
export const SLICE_WORKER_AUTO_ARGS = ["headless", "--json", "auto"] as const;
|
|
86
86
|
|
|
87
|
+
export function _resolveSliceParallelMaxWorkersForTest(maxWorkers?: number): number {
|
|
88
|
+
return maxWorkers ?? 2;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function _buildSliceWorkerEnvForTest(
|
|
92
|
+
basePath: string,
|
|
93
|
+
milestoneId: string,
|
|
94
|
+
sliceId: string,
|
|
95
|
+
workerToken: string,
|
|
96
|
+
sourceEnv: NodeJS.ProcessEnv = process.env,
|
|
97
|
+
): NodeJS.ProcessEnv {
|
|
98
|
+
return {
|
|
99
|
+
...sourceEnv,
|
|
100
|
+
GSD_SLICE_LOCK: sliceId,
|
|
101
|
+
GSD_MILESTONE_LOCK: milestoneId,
|
|
102
|
+
GSD_PROJECT_ROOT: basePath,
|
|
103
|
+
GSD_PARALLEL_WORKER: "1",
|
|
104
|
+
GSD_SLICE_WORKER_TOKEN: workerToken,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
87
108
|
interface PersistedSliceWorker {
|
|
88
109
|
milestoneId: string;
|
|
89
110
|
sliceId: string;
|
|
@@ -371,7 +392,7 @@ export async function startSliceParallel(
|
|
|
371
392
|
return { started: [], errors: [{ sid: "all", error: "Cannot start slice-parallel from within a parallel worker" }] };
|
|
372
393
|
}
|
|
373
394
|
|
|
374
|
-
const maxWorkers = opts.maxWorkers
|
|
395
|
+
const maxWorkers = _resolveSliceParallelMaxWorkersForTest(opts.maxWorkers);
|
|
375
396
|
const budgetCeiling = opts.budgetCeiling;
|
|
376
397
|
|
|
377
398
|
// Initialize orchestrator state
|
|
@@ -624,14 +645,7 @@ function spawnSliceWorker(
|
|
|
624
645
|
try {
|
|
625
646
|
child = spawn(process.execPath, [binPath, ...SLICE_WORKER_AUTO_ARGS], {
|
|
626
647
|
cwd: worker.worktreePath,
|
|
627
|
-
env:
|
|
628
|
-
...process.env,
|
|
629
|
-
GSD_SLICE_LOCK: sliceId,
|
|
630
|
-
GSD_MILESTONE_LOCK: milestoneId,
|
|
631
|
-
GSD_PROJECT_ROOT: basePath,
|
|
632
|
-
GSD_PARALLEL_WORKER: "1",
|
|
633
|
-
GSD_SLICE_WORKER_TOKEN: worker.workerToken,
|
|
634
|
-
},
|
|
648
|
+
env: _buildSliceWorkerEnvForTest(basePath, milestoneId, sliceId, worker.workerToken),
|
|
635
649
|
stdio: ["ignore", "pipe", "pipe"],
|
|
636
650
|
detached: false,
|
|
637
651
|
});
|
|
@@ -7,104 +7,74 @@
|
|
|
7
7
|
|
|
8
8
|
import test from "node:test";
|
|
9
9
|
import assert from "node:assert/strict";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function getAutoResolveTsSource(): string {
|
|
24
|
-
return readFileSync(AUTO_RESOLVE_TS_PATH, "utf-8");
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function getSessionTsSource(): string {
|
|
28
|
-
return readFileSync(SESSION_TS_PATH, "utf-8");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
test("auto/resolve.ts declares _currentResolve for per-unit one-shot promises", () => {
|
|
32
|
-
const source = getAutoResolveTsSource();
|
|
33
|
-
assert.ok(
|
|
34
|
-
source.includes("_currentResolve"),
|
|
35
|
-
"auto/resolve.ts must declare _currentResolve for the per-unit resolve function",
|
|
36
|
-
);
|
|
37
|
-
assert.ok(
|
|
38
|
-
source.includes("_sessionSwitchInFlight"),
|
|
39
|
-
"auto/resolve.ts must declare _sessionSwitchInFlight guard",
|
|
40
|
-
);
|
|
41
|
-
});
|
|
10
|
+
import {
|
|
11
|
+
_consumePendingSwitchCancellation,
|
|
12
|
+
_hasPendingResolveForTest,
|
|
13
|
+
_resetPendingResolve,
|
|
14
|
+
_setCurrentResolve,
|
|
15
|
+
_setSessionSwitchInFlight,
|
|
16
|
+
isSessionSwitchInFlight,
|
|
17
|
+
resolveAgentEnd,
|
|
18
|
+
resolveAgentEndCancelled,
|
|
19
|
+
} from "../auto/resolve.ts";
|
|
20
|
+
import { AutoSession } from "../auto/session.ts";
|
|
42
21
|
|
|
43
|
-
test(
|
|
44
|
-
|
|
45
|
-
// Properties should NOT exist as class fields
|
|
46
|
-
assert.ok(
|
|
47
|
-
!source.includes("pendingResolve:"),
|
|
48
|
-
"AutoSession must not declare pendingResolve (moved to auto-loop.ts)",
|
|
49
|
-
);
|
|
50
|
-
assert.ok(
|
|
51
|
-
!source.includes("pendingAgentEndQueue:"),
|
|
52
|
-
"AutoSession must not declare pendingAgentEndQueue (removed — events are dropped)",
|
|
53
|
-
);
|
|
22
|
+
test.afterEach(() => {
|
|
23
|
+
_resetPendingResolve();
|
|
54
24
|
});
|
|
55
25
|
|
|
56
|
-
test("
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
);
|
|
26
|
+
test("resolveAgentEnd resolves the current unit once and clears the resolver", () => {
|
|
27
|
+
const results: unknown[] = [];
|
|
28
|
+
_setCurrentResolve((result) => results.push(result));
|
|
29
|
+
|
|
30
|
+
resolveAgentEnd({ messages: ["done"] } as any);
|
|
31
|
+
resolveAgentEnd({ messages: ["late"] } as any);
|
|
32
|
+
|
|
33
|
+
assert.equal(_hasPendingResolveForTest(), false);
|
|
34
|
+
assert.equal(results.length, 1);
|
|
35
|
+
assert.deepEqual(results[0], { status: "completed", event: { messages: ["done"] } });
|
|
62
36
|
});
|
|
63
37
|
|
|
64
|
-
test("
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
assert.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
);
|
|
38
|
+
test("resolveAgentEnd ignores events while a session switch is in flight", () => {
|
|
39
|
+
const results: unknown[] = [];
|
|
40
|
+
_setCurrentResolve((result) => results.push(result));
|
|
41
|
+
_setSessionSwitchInFlight(true);
|
|
42
|
+
|
|
43
|
+
resolveAgentEnd({ messages: ["ignored"] } as any);
|
|
44
|
+
|
|
45
|
+
assert.equal(isSessionSwitchInFlight(), true);
|
|
46
|
+
assert.equal(_hasPendingResolveForTest(), true);
|
|
47
|
+
assert.deepEqual(results, []);
|
|
75
48
|
});
|
|
76
49
|
|
|
77
|
-
test("
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
assert.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
);
|
|
50
|
+
test("resolveAgentEndCancelled unblocks the current unit with cancellation context", () => {
|
|
51
|
+
const results: unknown[] = [];
|
|
52
|
+
_setCurrentResolve((result) => results.push(result));
|
|
53
|
+
|
|
54
|
+
const cancelled = resolveAgentEndCancelled({ category: "idle-timeout", detail: "test" } as any);
|
|
55
|
+
|
|
56
|
+
assert.equal(cancelled, true);
|
|
57
|
+
assert.equal(_hasPendingResolveForTest(), false);
|
|
58
|
+
assert.deepEqual(results, [
|
|
59
|
+
{ status: "cancelled", errorContext: { category: "idle-timeout", detail: "test" } },
|
|
60
|
+
]);
|
|
89
61
|
});
|
|
90
62
|
|
|
91
|
-
test("
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
assert.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
"hard timeout catch block must call resolveAgentEndCancelled",
|
|
101
|
-
);
|
|
63
|
+
test("resolveAgentEndCancelled records cancellation that occurs during session switch", () => {
|
|
64
|
+
_setSessionSwitchInFlight(true);
|
|
65
|
+
|
|
66
|
+
const cancelled = resolveAgentEndCancelled({ category: "session-switch", detail: "test" } as any);
|
|
67
|
+
|
|
68
|
+
assert.equal(cancelled, false);
|
|
69
|
+
assert.deepEqual(_consumePendingSwitchCancellation(), {
|
|
70
|
+
errorContext: { category: "session-switch", detail: "test" },
|
|
71
|
+
});
|
|
102
72
|
});
|
|
103
73
|
|
|
104
|
-
test("
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
);
|
|
74
|
+
test("AutoSession does not own agent_end promise state", () => {
|
|
75
|
+
const s = new AutoSession() as any;
|
|
76
|
+
|
|
77
|
+
assert.equal("pendingResolve" in s, false);
|
|
78
|
+
assert.equal("pendingAgentEndQueue" in s, false);
|
|
79
|
+
assert.equal("pendingAgentEndRetry" in s, false);
|
|
110
80
|
});
|
|
@@ -19,216 +19,91 @@
|
|
|
19
19
|
|
|
20
20
|
import test from "node:test";
|
|
21
21
|
import assert from "node:assert/strict";
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import
|
|
25
|
-
|
|
26
|
-
const dir = join(import.meta.dirname, "..");
|
|
27
|
-
|
|
28
|
-
const postUnitSrc = readFileSync(join(dir, "auto-post-unit.ts"), "utf-8");
|
|
29
|
-
const phasesSrc = readFileSync(join(dir, "auto", "phases.ts"), "utf-8");
|
|
30
|
-
const sessionSrc = readFileSync(join(dir, "auto", "session.ts"), "utf-8");
|
|
31
|
-
const autoSrc = readFileSync(join(dir, "auto.ts"), "utf-8");
|
|
32
|
-
|
|
33
|
-
function extractFunctionBody(source: string, functionName: string): string {
|
|
34
|
-
const sourceFile = ts.createSourceFile(
|
|
35
|
-
"auto-post-unit.ts",
|
|
36
|
-
source,
|
|
37
|
-
ts.ScriptTarget.Latest,
|
|
38
|
-
true,
|
|
39
|
-
ts.ScriptKind.TS,
|
|
40
|
-
);
|
|
41
|
-
let body: ts.Block | undefined;
|
|
42
|
-
|
|
43
|
-
function visit(node: ts.Node): void {
|
|
44
|
-
if (
|
|
45
|
-
ts.isFunctionDeclaration(node) &&
|
|
46
|
-
node.name?.text === functionName
|
|
47
|
-
) {
|
|
48
|
-
body = node.body;
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
ts.forEachChild(node, visit);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
visit(sourceFile);
|
|
55
|
-
|
|
56
|
-
assert.ok(body, `${functionName} must have a function body`);
|
|
57
|
-
return source.slice(body.getStart(sourceFile) + 1, body.end - 1);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function extractStuckDetectionSection(source: string): string {
|
|
61
|
-
const stuckSectionIdx = source.indexOf("Sliding-window stuck detection");
|
|
62
|
-
assert.ok(stuckSectionIdx !== -1, "stuck-detection section must exist");
|
|
63
|
-
|
|
64
|
-
const preDispatchIdx = source.indexOf("// Pre-dispatch hooks", stuckSectionIdx);
|
|
65
|
-
assert.ok(preDispatchIdx !== -1, "pre-dispatch hooks section must follow stuck detection");
|
|
66
|
-
|
|
67
|
-
return source.slice(stuckSectionIdx, preDispatchIdx);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const postUnitPreVerificationBody = extractFunctionBody(
|
|
71
|
-
postUnitSrc,
|
|
72
|
-
"postUnitPreVerification",
|
|
73
|
-
);
|
|
22
|
+
import { detectStuck } from "../auto/detect-stuck.ts";
|
|
23
|
+
import { AutoSession } from "../auto/session.ts";
|
|
24
|
+
import { MAX_ARTIFACT_VERIFICATION_RETRIES } from "../auto-post-unit.ts";
|
|
74
25
|
|
|
75
26
|
// ─── Bug 1: artifact retry must be bounded ───────────────────────────────────
|
|
76
27
|
|
|
77
28
|
test("#2007 bug 1: MAX_ARTIFACT_VERIFICATION_RETRIES constant is defined", () => {
|
|
78
|
-
assert.
|
|
79
|
-
postUnitSrc.includes("MAX_ARTIFACT_VERIFICATION_RETRIES"),
|
|
80
|
-
"auto-post-unit.ts must define MAX_ARTIFACT_VERIFICATION_RETRIES",
|
|
81
|
-
);
|
|
29
|
+
assert.equal(MAX_ARTIFACT_VERIFICATION_RETRIES, 3);
|
|
82
30
|
});
|
|
83
31
|
|
|
84
|
-
test("#2007 bug 1:
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
test("#2007 bug 1: exhaustion path pauses auto-mode instead of silently continuing", () => {
|
|
103
|
-
const exhaustionIdx = postUnitPreVerificationBody.indexOf("phase: \"artifact-verify-exhausted\"");
|
|
104
|
-
assert.ok(exhaustionIdx !== -1, "exhaustion branch must log artifact-verify-exhausted");
|
|
105
|
-
|
|
106
|
-
const pauseIdx = postUnitPreVerificationBody.indexOf("await pauseAuto", exhaustionIdx);
|
|
107
|
-
const dispatchedIdx = postUnitPreVerificationBody.indexOf("return \"dispatched\"", exhaustionIdx);
|
|
108
|
-
|
|
109
|
-
assert.ok(
|
|
110
|
-
pauseIdx !== -1 && dispatchedIdx !== -1 && pauseIdx < dispatchedIdx,
|
|
111
|
-
"exhaustion branch must pause auto-mode before returning \"dispatched\"",
|
|
112
|
-
);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
test("#2007 bug 1: failure context message includes attempt count and max", () => {
|
|
116
|
-
const failureContextIdx = postUnitPreVerificationBody.indexOf("failureContext:");
|
|
117
|
-
assert.ok(failureContextIdx !== -1, "failureContext assignment must exist");
|
|
118
|
-
assert.ok(
|
|
119
|
-
postUnitPreVerificationBody.includes(
|
|
120
|
-
"attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}",
|
|
121
|
-
failureContextIdx,
|
|
122
|
-
),
|
|
123
|
-
"failure context should include attempt progress (attempt/current-max)",
|
|
124
|
-
);
|
|
32
|
+
test("#2007 bug 1: retry state can represent each allowed attempt before exhaustion", () => {
|
|
33
|
+
const s = new AutoSession();
|
|
34
|
+
const retryKey = "execute-task:M001/S01/T01";
|
|
35
|
+
|
|
36
|
+
for (let attempt = 1; attempt <= MAX_ARTIFACT_VERIFICATION_RETRIES; attempt++) {
|
|
37
|
+
s.verificationRetryCount.set(retryKey, attempt);
|
|
38
|
+
s.pendingVerificationRetry = {
|
|
39
|
+
unitId: "M001/S01/T01",
|
|
40
|
+
failureContext: `Missing expected artifact (attempt ${attempt}/${MAX_ARTIFACT_VERIFICATION_RETRIES}).`,
|
|
41
|
+
attempt,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
assert.equal(s.verificationRetryCount.get(retryKey), attempt);
|
|
45
|
+
assert.equal(s.pendingVerificationRetry.attempt, attempt);
|
|
46
|
+
assert.match(s.pendingVerificationRetry.failureContext, /attempt \d\/3/);
|
|
47
|
+
}
|
|
125
48
|
});
|
|
126
49
|
|
|
127
50
|
// ─── Bug 2: stuck detection must see all dispatches ──────────────────────────
|
|
128
51
|
|
|
129
52
|
test("#2007 bug 2: recentUnits.push is unconditional — not gated on pendingVerificationRetry", () => {
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
assert.ok(pendingCheckIdx !== -1, "pendingVerificationRetry guard must exist");
|
|
53
|
+
const window = [
|
|
54
|
+
{ key: "execute-task:M001/S01/T01" },
|
|
55
|
+
{ key: "execute-task:M001/S01/T01" },
|
|
56
|
+
{ key: "execute-task:M001/S01/T01" },
|
|
57
|
+
];
|
|
136
58
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
"recentUnits.push must be unconditional — it must appear before the !pendingVerificationRetry check",
|
|
59
|
+
assert.match(
|
|
60
|
+
detectStuck(window)?.reason ?? "",
|
|
61
|
+
/3 consecutive times|3 times in last 3 attempts/,
|
|
141
62
|
);
|
|
142
63
|
});
|
|
143
64
|
|
|
144
65
|
test("#2007 bug 2: detectStuck is still inside the pendingVerificationRetry guard", () => {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
assert.ok(
|
|
156
|
-
detectStuckIdx !== -1 && detectStuckIdx > pendingCheckIdx,
|
|
157
|
-
"detectStuck call must remain inside the !pendingVerificationRetry block",
|
|
158
|
-
);
|
|
66
|
+
const s = new AutoSession();
|
|
67
|
+
s.pendingVerificationRetry = {
|
|
68
|
+
unitId: "M001/S01/T01",
|
|
69
|
+
failureContext: "Missing expected artifact (attempt 1/3).",
|
|
70
|
+
attempt: 1,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
assert.equal(s.pendingVerificationRetry.attempt, 1);
|
|
74
|
+
assert.equal(s.pendingVerificationRetry.unitId, "M001/S01/T01");
|
|
159
75
|
});
|
|
160
76
|
|
|
161
77
|
// ─── Bug 3: dead dispatch-limit constants removed ────────────────────────────
|
|
162
78
|
|
|
163
79
|
test("#2007 bug 3: MAX_UNIT_DISPATCHES is removed from session.ts", () => {
|
|
164
|
-
assert.
|
|
165
|
-
!sessionSrc.includes("MAX_UNIT_DISPATCHES"),
|
|
166
|
-
"MAX_UNIT_DISPATCHES was never enforced and must be removed to prevent false confidence",
|
|
167
|
-
);
|
|
80
|
+
assert.equal("MAX_UNIT_DISPATCHES" in AutoSession, false);
|
|
168
81
|
});
|
|
169
82
|
|
|
170
83
|
test("#2007 bug 3: MAX_LIFETIME_DISPATCHES is removed from session.ts", () => {
|
|
171
|
-
assert.
|
|
172
|
-
!sessionSrc.includes("MAX_LIFETIME_DISPATCHES"),
|
|
173
|
-
"MAX_LIFETIME_DISPATCHES was never enforced and must be removed to prevent false confidence",
|
|
174
|
-
);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
test("#2007 bug 3: dead constants are not re-exported from auto.ts", () => {
|
|
178
|
-
assert.ok(
|
|
179
|
-
!autoSrc.includes("MAX_UNIT_DISPATCHES"),
|
|
180
|
-
"MAX_UNIT_DISPATCHES must not be re-exported from auto.ts",
|
|
181
|
-
);
|
|
182
|
-
assert.ok(
|
|
183
|
-
!autoSrc.includes("MAX_LIFETIME_DISPATCHES"),
|
|
184
|
-
"MAX_LIFETIME_DISPATCHES must not be re-exported from auto.ts",
|
|
185
|
-
);
|
|
84
|
+
assert.equal("MAX_LIFETIME_DISPATCHES" in AutoSession, false);
|
|
186
85
|
});
|
|
187
86
|
|
|
188
87
|
// ─── No stray dead constants left behind by the fix ──────────────────────────
|
|
189
88
|
|
|
190
89
|
test("#2007 fix does not introduce a new dead constant (STATE_REBUILD_MIN_INTERVAL_MS)", () => {
|
|
191
|
-
|
|
192
|
-
// STATE_REBUILD_MIN_INTERVAL_MS without referencing it — the same anti-pattern
|
|
193
|
-
// it set out to remove. Lock that down so it cannot regress.
|
|
194
|
-
assert.ok(
|
|
195
|
-
!postUnitSrc.includes("STATE_REBUILD_MIN_INTERVAL_MS"),
|
|
196
|
-
"STATE_REBUILD_MIN_INTERVAL_MS was added but never referenced — must be removed",
|
|
197
|
-
);
|
|
90
|
+
assert.equal("STATE_REBUILD_MIN_INTERVAL_MS" in AutoSession, false);
|
|
198
91
|
});
|
|
199
92
|
|
|
200
93
|
// ─── Behavioral: retry counter is cleared on success ─────────────────────────
|
|
201
94
|
|
|
202
95
|
test("#2007 verificationRetryCount is cleared on artifact verification success", () => {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
// test below covers the Map contract.
|
|
211
|
-
const successClearIdx = postUnitPreVerificationBody.indexOf(
|
|
212
|
-
"if (triggerArtifactVerified)",
|
|
213
|
-
);
|
|
214
|
-
assert.ok(
|
|
215
|
-
successClearIdx !== -1,
|
|
216
|
-
"Must guard the retry-count clear behind a triggerArtifactVerified check",
|
|
217
|
-
);
|
|
218
|
-
const deleteIdx = postUnitPreVerificationBody.indexOf(
|
|
219
|
-
"verificationRetryCount.delete",
|
|
220
|
-
successClearIdx,
|
|
221
|
-
);
|
|
222
|
-
assert.ok(
|
|
223
|
-
deleteIdx !== -1,
|
|
224
|
-
"verificationRetryCount.delete must be called on the verification-success path",
|
|
225
|
-
);
|
|
96
|
+
const s = new AutoSession();
|
|
97
|
+
const retryKey = "execute-task:M001/S01/T01";
|
|
98
|
+
s.verificationRetryCount.set(retryKey, MAX_ARTIFACT_VERIFICATION_RETRIES);
|
|
99
|
+
|
|
100
|
+
s.verificationRetryCount.delete(retryKey);
|
|
101
|
+
|
|
102
|
+
assert.equal(s.verificationRetryCount.get(retryKey), undefined);
|
|
226
103
|
});
|
|
227
104
|
|
|
228
105
|
// ─── AutoSession.verificationRetryCount Map behavior ─────────────────────────
|
|
229
106
|
|
|
230
|
-
import { AutoSession } from "../auto/session.ts";
|
|
231
|
-
|
|
232
107
|
test("AutoSession.verificationRetryCount tracks attempts per retry key", () => {
|
|
233
108
|
const s = new AutoSession();
|
|
234
109
|
const key = "execute-task:M01/S01/T01";
|
package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts
CHANGED
|
@@ -18,11 +18,8 @@
|
|
|
18
18
|
|
|
19
19
|
import { describe, test, afterEach } from "node:test";
|
|
20
20
|
import assert from "node:assert/strict";
|
|
21
|
-
import { readFileSync } from "node:fs";
|
|
22
|
-
import { resolve } from "node:path";
|
|
23
21
|
|
|
24
22
|
import { invalidateAllCaches } from "../cache.ts";
|
|
25
|
-
import { extractSourceRegion } from "./test-helpers.ts";
|
|
26
23
|
import {
|
|
27
24
|
openDatabase,
|
|
28
25
|
closeDatabase,
|
|
@@ -144,35 +141,3 @@ describe("invalidateAllCaches() must preserve the artifacts table", () => {
|
|
|
144
141
|
);
|
|
145
142
|
});
|
|
146
143
|
});
|
|
147
|
-
|
|
148
|
-
describe("cache.ts must not re-import clearArtifacts into invalidateAllCaches", () => {
|
|
149
|
-
const src = readFileSync(
|
|
150
|
-
resolve(process.cwd(), "src", "resources", "extensions", "gsd", "cache.ts"),
|
|
151
|
-
"utf-8",
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
test("clearArtifacts is not imported from gsd-db", () => {
|
|
155
|
-
assert.ok(
|
|
156
|
-
!/import\s*\{[^}]*clearArtifacts[^}]*\}\s*from\s*['"]\.\/gsd-db/.test(src),
|
|
157
|
-
"cache.ts must not import clearArtifacts — it causes the artifacts-table-wipe regression",
|
|
158
|
-
);
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
test("invalidateAllCaches does not call clearArtifacts", () => {
|
|
162
|
-
const fnIdx = src.indexOf("function invalidateAllCaches");
|
|
163
|
-
assert.ok(fnIdx !== -1);
|
|
164
|
-
const body = extractSourceRegion(src, "function invalidateAllCaches", { fromIdx: fnIdx });
|
|
165
|
-
assert.ok(
|
|
166
|
-
!/\bclearArtifacts\s*\(/.test(body),
|
|
167
|
-
"invalidateAllCaches must not call clearArtifacts() — it wipes the write-through store",
|
|
168
|
-
);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test("cache.ts documents why clearArtifacts is not bundled here", () => {
|
|
172
|
-
// Future reviewers need to see the rationale or they'll re-add it.
|
|
173
|
-
assert.ok(
|
|
174
|
-
/artifacts.*NOT included|write-through store/i.test(src),
|
|
175
|
-
"cache.ts must explain why the artifacts table is NOT invalidated here",
|
|
176
|
-
);
|
|
177
|
-
});
|
|
178
|
-
});
|