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
|
@@ -39,6 +39,7 @@ test("execute-task prompt renders compact execution and completion gates", async
|
|
|
39
39
|
taskPlanPath: ".gsd/milestones/M001/slices/S01/tasks/T01-PLAN.md",
|
|
40
40
|
priorTaskLines: "- None",
|
|
41
41
|
skillActivation: "Load relevant skills.",
|
|
42
|
+
inlinedTemplates: "### Output Template: Task Summary\nSource: `templates/task-summary.md`",
|
|
42
43
|
templatesDir: join(fixtureRoot, "templates"),
|
|
43
44
|
taskSummaryTemplatePath: "C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\task-summary.md",
|
|
44
45
|
verificationBudget: "~10K chars",
|
|
@@ -46,12 +47,14 @@ test("execute-task prompt renders compact execution and completion gates", async
|
|
|
46
47
|
});
|
|
47
48
|
|
|
48
49
|
assert.match(prompt, /You execute\./);
|
|
49
|
-
assert.match(prompt, /Call `memory_query
|
|
50
|
+
assert.match(prompt, /Call `memory_query`.*only when no injected memory block exists/s);
|
|
50
51
|
assert.match(prompt, /Before any `Write` that creates an artifact or output file/);
|
|
51
52
|
assert.match(prompt, /Build real behavior/);
|
|
52
53
|
assert.match(prompt, /Background process rule/);
|
|
53
54
|
assert.match(prompt, /blocker_discovered: true/);
|
|
54
|
-
assert.match(prompt, /
|
|
55
|
+
assert.match(prompt, /Use the inlined Task Summary template below/);
|
|
56
|
+
assert.match(prompt, /Read `C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\task-summary\.md` only if the inlined template is absent or visibly truncated/);
|
|
57
|
+
assert.match(prompt, /### Output Template: Task Summary/);
|
|
55
58
|
assert.doesNotMatch(prompt, /\{\{templatesDir\}\}\/task-summary\.md/);
|
|
56
59
|
assert.match(prompt, /Call `gsd_task_complete`/);
|
|
57
60
|
assert.match(prompt, /Do not run git commands/);
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// GSD-2 + src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts
|
|
2
|
+
// Regression: when createAutoWorktree reuses an existing milestone branch,
|
|
3
|
+
// it must be fast-forwarded onto integration so the next milestone forks
|
|
4
|
+
// from up-to-date code (#5538-followup).
|
|
5
|
+
|
|
6
|
+
import { describe, test, beforeEach, afterEach } from "node:test";
|
|
7
|
+
import assert from "node:assert/strict";
|
|
8
|
+
import { execFileSync } from "node:child_process";
|
|
9
|
+
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
import { basename, join } from "node:path";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
fastForwardReusedMilestoneBranchIfSafe,
|
|
15
|
+
_isBranchCheckedOutElsewhere,
|
|
16
|
+
} from "../auto-worktree.js";
|
|
17
|
+
|
|
18
|
+
const NO_PROMPT_ENV = {
|
|
19
|
+
...process.env,
|
|
20
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
21
|
+
GIT_AUTHOR_NAME: "test",
|
|
22
|
+
GIT_AUTHOR_EMAIL: "test@example.com",
|
|
23
|
+
GIT_COMMITTER_NAME: "test",
|
|
24
|
+
GIT_COMMITTER_EMAIL: "test@example.com",
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function git(cwd: string, ...args: string[]): string {
|
|
28
|
+
return execFileSync("git", args, {
|
|
29
|
+
cwd,
|
|
30
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
31
|
+
encoding: "utf-8",
|
|
32
|
+
env: NO_PROMPT_ENV,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function rev(cwd: string, ref: string): string {
|
|
37
|
+
return git(cwd, "rev-parse", ref).trim();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
describe("fastForwardReusedMilestoneBranchIfSafe", () => {
|
|
41
|
+
let repo: string;
|
|
42
|
+
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
repo = mkdtempSync(join(tmpdir(), "ff-reused-branch-"));
|
|
45
|
+
git(repo, "init", "-q", "-b", "main");
|
|
46
|
+
git(repo, "config", "user.email", "test@example.com");
|
|
47
|
+
git(repo, "config", "user.name", "test");
|
|
48
|
+
writeFileSync(join(repo, "seed.txt"), "seed\n");
|
|
49
|
+
git(repo, "add", "seed.txt");
|
|
50
|
+
git(repo, "commit", "-q", "-m", "initial");
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
afterEach(() => {
|
|
54
|
+
rmSync(repo, { recursive: true, force: true });
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("fast-forwards a milestone branch that is strictly behind integration (regression: stale base)", () => {
|
|
58
|
+
// Create milestone/M001 from main's initial commit, then advance main.
|
|
59
|
+
git(repo, "branch", "milestone/M001");
|
|
60
|
+
const m001Initial = rev(repo, "milestone/M001");
|
|
61
|
+
|
|
62
|
+
writeFileSync(join(repo, "seed.txt"), "advanced\n");
|
|
63
|
+
git(repo, "add", "seed.txt");
|
|
64
|
+
git(repo, "commit", "-q", "-m", "main moved forward");
|
|
65
|
+
const mainTip = rev(repo, "main");
|
|
66
|
+
|
|
67
|
+
assert.notEqual(m001Initial, mainTip, "main must be ahead before the test");
|
|
68
|
+
|
|
69
|
+
fastForwardReusedMilestoneBranchIfSafe(repo, "M001", "milestone/M001");
|
|
70
|
+
|
|
71
|
+
assert.equal(
|
|
72
|
+
rev(repo, "milestone/M001"),
|
|
73
|
+
mainTip,
|
|
74
|
+
"milestone/M001 must be fast-forwarded to main's tip",
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("does not touch a milestone branch that has its own commits ahead", () => {
|
|
79
|
+
// Branch from main, add a unique commit, then advance main.
|
|
80
|
+
git(repo, "checkout", "-q", "-b", "milestone/M001");
|
|
81
|
+
writeFileSync(join(repo, "milestone-only.txt"), "milestone work\n");
|
|
82
|
+
git(repo, "add", "milestone-only.txt");
|
|
83
|
+
git(repo, "commit", "-q", "-m", "M001 work");
|
|
84
|
+
const milestoneTip = rev(repo, "milestone/M001");
|
|
85
|
+
|
|
86
|
+
git(repo, "checkout", "-q", "main");
|
|
87
|
+
writeFileSync(join(repo, "seed.txt"), "advanced\n");
|
|
88
|
+
git(repo, "add", "seed.txt");
|
|
89
|
+
git(repo, "commit", "-q", "-m", "main moved forward");
|
|
90
|
+
|
|
91
|
+
fastForwardReusedMilestoneBranchIfSafe(repo, "M001", "milestone/M001");
|
|
92
|
+
|
|
93
|
+
assert.equal(
|
|
94
|
+
rev(repo, "milestone/M001"),
|
|
95
|
+
milestoneTip,
|
|
96
|
+
"diverged milestone branch must NOT be touched (would lose work)",
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("is a no-op when milestone branch is already up-to-date with main", () => {
|
|
101
|
+
git(repo, "branch", "milestone/M001");
|
|
102
|
+
const before = rev(repo, "milestone/M001");
|
|
103
|
+
|
|
104
|
+
fastForwardReusedMilestoneBranchIfSafe(repo, "M001", "milestone/M001");
|
|
105
|
+
|
|
106
|
+
assert.equal(rev(repo, "milestone/M001"), before, "ref must not move");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test("does nothing when the milestone branch does not exist", () => {
|
|
110
|
+
// Should silently return — no error, no side effects.
|
|
111
|
+
assert.doesNotThrow(() =>
|
|
112
|
+
fastForwardReusedMilestoneBranchIfSafe(repo, "M999", "milestone/M999"),
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("does nothing in a non-git directory", () => {
|
|
117
|
+
const nonRepo = mkdtempSync(join(tmpdir(), "ff-not-a-repo-"));
|
|
118
|
+
try {
|
|
119
|
+
assert.doesNotThrow(() =>
|
|
120
|
+
fastForwardReusedMilestoneBranchIfSafe(nonRepo, "M001", "milestone/M001"),
|
|
121
|
+
);
|
|
122
|
+
} finally {
|
|
123
|
+
rmSync(nonRepo, { recursive: true, force: true });
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("skips fast-forward when branch is checked out in another worktree (peer-review regression)", () => {
|
|
128
|
+
// Codex peer review caught: `nativeUpdateRef` succeeds even when the
|
|
129
|
+
// branch is checked out in a linked worktree, leaving that worktree's
|
|
130
|
+
// HEAD inconsistent with its index/work tree. The fix calls
|
|
131
|
+
// `nativeWorktreeList` first and skips the FF if any worktree owns the
|
|
132
|
+
// target branch. This test sets up the exact scenario.
|
|
133
|
+
git(repo, "branch", "milestone/M001");
|
|
134
|
+
const m001Initial = rev(repo, "milestone/M001");
|
|
135
|
+
|
|
136
|
+
// Add a linked worktree that checks out milestone/M001.
|
|
137
|
+
const wtPath = join(repo, "..", `${basename(repo)}-wt`);
|
|
138
|
+
git(repo, "worktree", "add", wtPath, "milestone/M001");
|
|
139
|
+
|
|
140
|
+
// Advance main so a fast-forward would otherwise apply.
|
|
141
|
+
writeFileSync(join(repo, "seed.txt"), "advanced\n");
|
|
142
|
+
git(repo, "add", "seed.txt");
|
|
143
|
+
git(repo, "commit", "-q", "-m", "main moved forward");
|
|
144
|
+
|
|
145
|
+
try {
|
|
146
|
+
fastForwardReusedMilestoneBranchIfSafe(repo, "M001", "milestone/M001");
|
|
147
|
+
|
|
148
|
+
assert.equal(
|
|
149
|
+
rev(repo, "milestone/M001"),
|
|
150
|
+
m001Initial,
|
|
151
|
+
"milestone/M001 must NOT move while a linked worktree has it checked out",
|
|
152
|
+
);
|
|
153
|
+
} finally {
|
|
154
|
+
git(repo, "worktree", "remove", "--force", wtPath);
|
|
155
|
+
rmSync(wtPath, { recursive: true, force: true });
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe("_isBranchCheckedOutElsewhere", () => {
|
|
161
|
+
let repo: string;
|
|
162
|
+
|
|
163
|
+
beforeEach(() => {
|
|
164
|
+
repo = mkdtempSync(join(tmpdir(), "is-checked-out-"));
|
|
165
|
+
git(repo, "init", "-q", "-b", "main");
|
|
166
|
+
git(repo, "config", "user.email", "test@example.com");
|
|
167
|
+
git(repo, "config", "user.name", "test");
|
|
168
|
+
writeFileSync(join(repo, "seed.txt"), "seed\n");
|
|
169
|
+
git(repo, "add", "seed.txt");
|
|
170
|
+
git(repo, "commit", "-q", "-m", "initial");
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
afterEach(() => {
|
|
174
|
+
rmSync(repo, { recursive: true, force: true });
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test("returns true when branch is checked out in a linked worktree", () => {
|
|
178
|
+
git(repo, "branch", "milestone/M001");
|
|
179
|
+
const wtPath = join(repo, "..", `${basename(repo)}-wt`);
|
|
180
|
+
git(repo, "worktree", "add", wtPath, "milestone/M001");
|
|
181
|
+
try {
|
|
182
|
+
assert.equal(_isBranchCheckedOutElsewhere(repo, "milestone/M001"), true);
|
|
183
|
+
} finally {
|
|
184
|
+
git(repo, "worktree", "remove", "--force", wtPath);
|
|
185
|
+
rmSync(wtPath, { recursive: true, force: true });
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test("returns true when branch is checked out in the main worktree itself", () => {
|
|
190
|
+
// The default checkout. `git worktree list --porcelain` reports the
|
|
191
|
+
// primary worktree too, so a branch checked out there counts as
|
|
192
|
+
// "checked out elsewhere" relative to a fresh ref update intent.
|
|
193
|
+
git(repo, "checkout", "-q", "-b", "milestone/M002");
|
|
194
|
+
assert.equal(_isBranchCheckedOutElsewhere(repo, "milestone/M002"), true);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test("returns false when branch exists but is not checked out anywhere", () => {
|
|
198
|
+
git(repo, "branch", "milestone/M003");
|
|
199
|
+
assert.equal(_isBranchCheckedOutElsewhere(repo, "milestone/M003"), false);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test("returns false for an unknown branch in a clean repo", () => {
|
|
203
|
+
assert.equal(_isBranchCheckedOutElsewhere(repo, "milestone/M999"), false);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("returns false on a non-git directory (empty worktree list)", () => {
|
|
207
|
+
// nativeWorktreeList does not throw on a non-repo — it returns []. The
|
|
208
|
+
// parent function `fastForwardReusedMilestoneBranchIfSafe` never reaches
|
|
209
|
+
// this code path on a non-repo because `nativeBranchExists` short-circuits
|
|
210
|
+
// earlier. Documenting actual behavior so future readers don't expect a
|
|
211
|
+
// fail-safe `true` here.
|
|
212
|
+
const nonRepo = mkdtempSync(join(tmpdir(), "is-checked-out-not-repo-"));
|
|
213
|
+
try {
|
|
214
|
+
assert.equal(_isBranchCheckedOutElsewhere(nonRepo, "milestone/M001"), false);
|
|
215
|
+
} finally {
|
|
216
|
+
rmSync(nonRepo, { recursive: true, force: true });
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
});
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// GSD-2 + src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts
|
|
2
|
+
// Regression: a thrown error from `_mergeBranchMode` (made fail-loud in
|
|
3
|
+
// commit 68ef58a3c) must be caught at the survivor-finalize call site so
|
|
4
|
+
// bootstrap surfaces an error notify instead of an unhandled exception
|
|
5
|
+
// propagating to the slash-command caller (#5549 post-merge audit, R2).
|
|
6
|
+
|
|
7
|
+
import test from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
|
|
10
|
+
import { _finalizeSurvivorBranch } from "../auto-start.js";
|
|
11
|
+
import type { WorktreeResolver } from "../worktree-resolver.js";
|
|
12
|
+
|
|
13
|
+
interface FakeResolverState {
|
|
14
|
+
mergeCalls: Array<{ milestoneId: string }>;
|
|
15
|
+
shouldThrow?: unknown;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function fakeResolver(state: FakeResolverState): WorktreeResolver {
|
|
19
|
+
return {
|
|
20
|
+
mergeAndExit: (milestoneId: string) => {
|
|
21
|
+
state.mergeCalls.push({ milestoneId });
|
|
22
|
+
if (state.shouldThrow) throw state.shouldThrow;
|
|
23
|
+
},
|
|
24
|
+
} as unknown as WorktreeResolver;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface FakeUiState {
|
|
28
|
+
notifications: Array<{ message: string; level: string }>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function fakeUi(state: FakeUiState): {
|
|
32
|
+
notify: (msg: string, level?: "info" | "warning" | "error" | "success") => void;
|
|
33
|
+
} {
|
|
34
|
+
return {
|
|
35
|
+
notify: (message: string, level?: "info" | "warning" | "error" | "success") => {
|
|
36
|
+
state.notifications.push({ message, level: level ?? "info" });
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
test("happy path: survivor merge runs, returns merged:true, info notify announces the merge", () => {
|
|
42
|
+
const resolverState: FakeResolverState = { mergeCalls: [] };
|
|
43
|
+
const uiState: FakeUiState = { notifications: [] };
|
|
44
|
+
const result = _finalizeSurvivorBranch(
|
|
45
|
+
fakeResolver(resolverState),
|
|
46
|
+
"M001",
|
|
47
|
+
fakeUi(uiState),
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
assert.deepEqual(result, { merged: true });
|
|
51
|
+
assert.deepEqual(resolverState.mergeCalls, [{ milestoneId: "M001" }]);
|
|
52
|
+
assert.equal(uiState.notifications.length, 1);
|
|
53
|
+
assert.equal(uiState.notifications[0].level, "info");
|
|
54
|
+
assert.match(
|
|
55
|
+
uiState.notifications[0].message,
|
|
56
|
+
/Milestone M001 is complete but branch\/worktree was not finalized/,
|
|
57
|
+
);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("regression: thrown error from mergeAndExit (e.g. wrong-branch) is caught and surfaced as error notify", () => {
|
|
61
|
+
// Pre-PR-5549 commit 5: `_mergeBranchMode` returned false silently.
|
|
62
|
+
// Post-commit 5: it throws. Without this fix, the throw at auto-start.ts
|
|
63
|
+
// line ~810 would bubble through `bootstrapAutoSession` to
|
|
64
|
+
// `startAutoDetached`'s top-level .catch as an unhandled-exception log
|
|
65
|
+
// — observable as a stack trace instead of a clean failure notification.
|
|
66
|
+
const boom = new Error("dirty working tree blocks checkout");
|
|
67
|
+
const resolverState: FakeResolverState = { mergeCalls: [], shouldThrow: boom };
|
|
68
|
+
const uiState: FakeUiState = { notifications: [] };
|
|
69
|
+
|
|
70
|
+
// Must not throw.
|
|
71
|
+
const result = _finalizeSurvivorBranch(
|
|
72
|
+
fakeResolver(resolverState),
|
|
73
|
+
"M001",
|
|
74
|
+
fakeUi(uiState),
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
assert.equal(result.merged, false);
|
|
78
|
+
assert.equal(result.error, boom);
|
|
79
|
+
|
|
80
|
+
// Two notifies: info (announce) + error (the failure detail).
|
|
81
|
+
assert.equal(uiState.notifications.length, 2);
|
|
82
|
+
assert.equal(uiState.notifications[0].level, "info");
|
|
83
|
+
assert.equal(uiState.notifications[1].level, "error");
|
|
84
|
+
assert.match(
|
|
85
|
+
uiState.notifications[1].message,
|
|
86
|
+
/Survivor-branch finalization for M001 failed/,
|
|
87
|
+
);
|
|
88
|
+
assert.match(uiState.notifications[1].message, /dirty working tree blocks checkout/);
|
|
89
|
+
assert.match(uiState.notifications[1].message, /Resolve manually/);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test("non-Error thrown values are stringified into the user-facing message", () => {
|
|
93
|
+
const resolverState: FakeResolverState = {
|
|
94
|
+
mergeCalls: [],
|
|
95
|
+
shouldThrow: "git lock contention",
|
|
96
|
+
};
|
|
97
|
+
const uiState: FakeUiState = { notifications: [] };
|
|
98
|
+
|
|
99
|
+
const result = _finalizeSurvivorBranch(
|
|
100
|
+
fakeResolver(resolverState),
|
|
101
|
+
"M001",
|
|
102
|
+
fakeUi(uiState),
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
assert.equal(result.merged, false);
|
|
106
|
+
assert.equal(result.error, resolverState.shouldThrow);
|
|
107
|
+
assert.equal(uiState.notifications[1].level, "error");
|
|
108
|
+
assert.match(uiState.notifications[1].message, /git lock contention/);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("inner notifications from mergeAndExit's NotifyCtx reach the same UI", () => {
|
|
112
|
+
// The resolver's NotifyCtx must be wired to ui.notify so messages emitted
|
|
113
|
+
// inside mergeAndExit (e.g. "Milestone Mxxx merged. Pushed to remote.")
|
|
114
|
+
// appear in the same UI stream as the outer notifies.
|
|
115
|
+
const uiState: FakeUiState = { notifications: [] };
|
|
116
|
+
const ui = fakeUi(uiState);
|
|
117
|
+
|
|
118
|
+
const resolver = {
|
|
119
|
+
mergeAndExit: (_milestoneId: string, ctx: { notify: (msg: string, level?: "info" | "warning" | "error" | "success") => void }) => {
|
|
120
|
+
ctx.notify("Milestone M001 merged.", "success");
|
|
121
|
+
},
|
|
122
|
+
} as unknown as WorktreeResolver;
|
|
123
|
+
|
|
124
|
+
const result = _finalizeSurvivorBranch(resolver, "M001", ui);
|
|
125
|
+
|
|
126
|
+
assert.equal(result.merged, true);
|
|
127
|
+
// 1: outer announce
|
|
128
|
+
// 2: inner success
|
|
129
|
+
assert.equal(uiState.notifications.length, 2);
|
|
130
|
+
assert.equal(uiState.notifications[1].level, "success");
|
|
131
|
+
assert.equal(uiState.notifications[1].message, "Milestone M001 merged.");
|
|
132
|
+
});
|
|
@@ -6,14 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
import { describe, test } from "node:test";
|
|
8
8
|
import assert from "node:assert/strict";
|
|
9
|
-
import { mkdtempSync, mkdirSync, writeFileSync,
|
|
9
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
|
|
10
10
|
import { tmpdir } from "node:os";
|
|
11
|
-
import {
|
|
12
|
-
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { join } from "node:path";
|
|
13
12
|
import { buildFlatRateContext, isFlatRateProvider, resolvePreferredModelConfig } from "../auto-model-selection.ts";
|
|
14
13
|
|
|
15
|
-
const __dirname_4386 = dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
|
|
17
14
|
describe("flat-rate provider routing guard (#3453)", () => {
|
|
18
15
|
|
|
19
16
|
test("isFlatRateProvider returns true for github-copilot", () => {
|
|
@@ -306,18 +303,3 @@ describe("flat-rate routing opt-in (#4386)", () => {
|
|
|
306
303
|
);
|
|
307
304
|
});
|
|
308
305
|
});
|
|
309
|
-
|
|
310
|
-
// ─── Banner transparency: auto-start respects the opt-in (#4386) ────────────
|
|
311
|
-
|
|
312
|
-
describe("auto-start banner respects allow_flat_rate_providers (#4386)", () => {
|
|
313
|
-
test("banner expression gates flat-rate disable on allow_flat_rate_providers", () => {
|
|
314
|
-
const src = readFileSync(
|
|
315
|
-
join(__dirname_4386, "..", "auto-start.ts"),
|
|
316
|
-
"utf-8",
|
|
317
|
-
);
|
|
318
|
-
assert.ok(
|
|
319
|
-
src.includes("routingConfig.allow_flat_rate_providers"),
|
|
320
|
-
"auto-start banner must read allow_flat_rate_providers so the banner reflects the opt-in",
|
|
321
|
-
);
|
|
322
|
-
});
|
|
323
|
-
});
|
|
@@ -7,36 +7,28 @@
|
|
|
7
7
|
|
|
8
8
|
import { describe, test } from 'node:test';
|
|
9
9
|
import assert from 'node:assert/strict';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import { dirname, join } from 'node:path';
|
|
13
|
-
|
|
14
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
-
const __dirname = dirname(__filename);
|
|
16
|
-
|
|
17
|
-
const prefsSrc = readFileSync(
|
|
18
|
-
join(__dirname, '..', 'preferences.ts'),
|
|
19
|
-
'utf-8',
|
|
20
|
-
);
|
|
10
|
+
import { _resetParseWarningFlag, parsePreferencesMarkdown } from "../preferences.ts";
|
|
11
|
+
import { drainLogs } from "../workflow-logger.ts";
|
|
21
12
|
|
|
22
13
|
describe('frontmatter parse noise suppression (#3693)', () => {
|
|
23
|
-
test('
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
});
|
|
14
|
+
test('invalid frontmatter emits one warning per reset', () => {
|
|
15
|
+
_resetParseWarningFlag();
|
|
16
|
+
drainLogs();
|
|
27
17
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
18
|
+
const invalidPrefs = [
|
|
19
|
+
"---",
|
|
20
|
+
"models: [unterminated",
|
|
21
|
+
"---",
|
|
22
|
+
].join("\n");
|
|
32
23
|
|
|
33
|
-
|
|
34
|
-
assert.
|
|
35
|
-
'should check !_warnedFrontmatterParse before logging');
|
|
36
|
-
});
|
|
24
|
+
assert.deepEqual(parsePreferencesMarkdown(invalidPrefs), {});
|
|
25
|
+
assert.deepEqual(parsePreferencesMarkdown(invalidPrefs), {});
|
|
37
26
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
27
|
+
const warnings = drainLogs().filter((entry) =>
|
|
28
|
+
entry.severity === "warn" &&
|
|
29
|
+
entry.component === "guided" &&
|
|
30
|
+
entry.message.includes("YAML parse error in preferences frontmatter")
|
|
31
|
+
);
|
|
32
|
+
assert.equal(warnings.length, 1);
|
|
41
33
|
});
|
|
42
34
|
});
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
3
|
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { shouldWriteGitFiles } from "../init-wizard.ts";
|
|
5
|
+
import { shouldSkipGitBootstrapAfterInit } from "../guided-flow.ts";
|
|
8
6
|
|
|
9
|
-
test("init wizard
|
|
10
|
-
assert.
|
|
11
|
-
assert.
|
|
12
|
-
assert.match(initWizardSource, /if \(gitEnabled\) \{\s*ensureGitignore\(basePath\);/);
|
|
7
|
+
test("init wizard does not write git files when git setup is skipped", () => {
|
|
8
|
+
assert.equal(shouldWriteGitFiles(false), false);
|
|
9
|
+
assert.equal(shouldWriteGitFiles(true), true);
|
|
13
10
|
});
|
|
14
11
|
|
|
15
|
-
test("guided flow
|
|
16
|
-
assert.
|
|
17
|
-
assert.
|
|
18
|
-
assert.
|
|
12
|
+
test("guided flow skips git bootstrap after the init wizard skip-git choice", () => {
|
|
13
|
+
assert.equal(shouldSkipGitBootstrapAfterInit({ gitEnabled: false }), true);
|
|
14
|
+
assert.equal(shouldSkipGitBootstrapAfterInit({ gitEnabled: true }), false);
|
|
15
|
+
assert.equal(shouldSkipGitBootstrapAfterInit({}), false);
|
|
19
16
|
});
|
package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Auto-worktree milestone squash-merge integration tests.
|
|
1
3
|
/**
|
|
2
4
|
* auto-worktree-milestone-merge.test.ts — Integration tests for mergeMilestoneToMain.
|
|
3
5
|
*
|
|
@@ -25,6 +27,13 @@ import {
|
|
|
25
27
|
import { getSliceBranchName } from "../../worktree.ts";
|
|
26
28
|
import { nativeMergeSquash } from "../../native-git-bridge.ts";
|
|
27
29
|
import { drainLogs, setStderrLoggingEnabled } from "../../workflow-logger.ts";
|
|
30
|
+
import {
|
|
31
|
+
closeDatabase,
|
|
32
|
+
insertMilestone,
|
|
33
|
+
insertSlice,
|
|
34
|
+
insertTask,
|
|
35
|
+
openDatabase,
|
|
36
|
+
} from "../../gsd-db.ts";
|
|
28
37
|
|
|
29
38
|
function run(cmd: string, cwd: string): string {
|
|
30
39
|
// Safe: all inputs are hardcoded test strings, not user input
|
|
@@ -117,6 +126,7 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
117
126
|
|
|
118
127
|
afterEach(() => {
|
|
119
128
|
process.chdir(savedCwd);
|
|
129
|
+
closeDatabase();
|
|
120
130
|
for (const d of tempDirs) {
|
|
121
131
|
if (existsSync(d)) rmSync(d, { recursive: true, force: true });
|
|
122
132
|
}
|
|
@@ -179,6 +189,24 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
179
189
|
addSliceToMilestone(repo, wtPath, "M020", "S03", "Logging infra", [
|
|
180
190
|
{ file: "logger.ts", content: "export const log = () => {};\n", message: "add logger" },
|
|
181
191
|
]);
|
|
192
|
+
openDatabase(":memory:");
|
|
193
|
+
insertMilestone({ id: "M020", title: "M020: Backend foundation", status: "complete" });
|
|
194
|
+
for (const slice of [
|
|
195
|
+
{ id: "S01", title: "Core API", tasks: [{ id: "T01", title: "Create API router" }] },
|
|
196
|
+
{ id: "S02", title: "Error handling", tasks: [{ id: "T02", title: "Handle API errors" }] },
|
|
197
|
+
{ id: "S03", title: "Logging infra", tasks: [{ id: "T03", title: "Wire request logging" }] },
|
|
198
|
+
]) {
|
|
199
|
+
insertSlice({ id: slice.id, milestoneId: "M020", title: slice.title, status: "complete" });
|
|
200
|
+
for (const task of slice.tasks) {
|
|
201
|
+
insertTask({
|
|
202
|
+
id: task.id,
|
|
203
|
+
sliceId: slice.id,
|
|
204
|
+
milestoneId: "M020",
|
|
205
|
+
title: task.title,
|
|
206
|
+
status: "complete",
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
182
210
|
|
|
183
211
|
const roadmap = makeRoadmap("M020", "Backend foundation", [
|
|
184
212
|
{ id: "S01", title: "Core API" },
|
|
@@ -193,13 +221,20 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
193
221
|
assert.ok(result.commitMessage.includes("- S01: Core API"), "body lists S01");
|
|
194
222
|
assert.ok(result.commitMessage.includes("- S02: Error handling"), "body lists S02");
|
|
195
223
|
assert.ok(result.commitMessage.includes("- S03: Logging infra"), "body lists S03");
|
|
224
|
+
assert.ok(result.commitMessage.includes("Completed tasks:"), "body lists completed tasks");
|
|
225
|
+
assert.ok(result.commitMessage.includes("- S01/T01: Create API router"), "body lists S01 task");
|
|
226
|
+
assert.ok(result.commitMessage.includes("- S02/T02: Handle API errors"), "body lists S02 task");
|
|
227
|
+
assert.ok(result.commitMessage.includes("Milestone: M020 - Backend foundation"), "body has human milestone context");
|
|
196
228
|
assert.ok(result.commitMessage.includes("GSD-Milestone: M020"), "body has GSD-Milestone trailer");
|
|
197
229
|
assert.ok(result.commitMessage.includes("Branch: milestone/M020"), "body has branch metadata");
|
|
230
|
+
assert.ok(!result.commitMessage.includes("auto-commit after complete-milestone"), "body avoids generic complete-milestone fallback");
|
|
231
|
+
assert.ok(!result.commitMessage.includes("GSD-Unit:"), "body avoids generic unit trailer");
|
|
198
232
|
|
|
199
233
|
const gitMsg = run("git log -1 --format=%B main", repo).trim();
|
|
200
234
|
assert.match(gitMsg, /^feat:/, "git commit message starts with feat:");
|
|
201
235
|
assert.ok(gitMsg.includes("GSD-Milestone: M020"), "git commit has GSD-Milestone trailer");
|
|
202
236
|
assert.ok(gitMsg.includes("- S01: Core API"), "git commit body has S01");
|
|
237
|
+
assert.ok(gitMsg.includes("- S03/T03: Wire request logging"), "git commit body has task names");
|
|
203
238
|
});
|
|
204
239
|
|
|
205
240
|
test("nothing to commit — safe when no code changes (#1738, #1792)", () => {
|
|
@@ -780,6 +815,11 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
|
|
|
780
815
|
!existsSync(mergeHeadPath),
|
|
781
816
|
"#2912: MERGE_HEAD must be cleaned up after merge conflict error",
|
|
782
817
|
);
|
|
818
|
+
assert.equal(
|
|
819
|
+
run("git diff --name-only --diff-filter=U", repo),
|
|
820
|
+
"",
|
|
821
|
+
"squash conflict cleanup must clear unmerged index entries",
|
|
822
|
+
);
|
|
783
823
|
});
|
|
784
824
|
|
|
785
825
|
test("#2912: stale MERGE_HEAD from native merge is cleaned after successful commit", () => {
|
package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Integration tests for the /gsd eval-review helper chain.
|
|
1
3
|
/**
|
|
2
4
|
* Integration test for `/gsd eval-review` .
|
|
3
5
|
*
|
|
@@ -10,7 +12,7 @@
|
|
|
10
12
|
|
|
11
13
|
import { describe, it, beforeEach, afterEach } from "node:test";
|
|
12
14
|
import assert from "node:assert/strict";
|
|
13
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
15
|
+
import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
14
16
|
import { join } from "node:path";
|
|
15
17
|
import { tmpdir } from "node:os";
|
|
16
18
|
|
|
@@ -119,7 +121,7 @@ describe("integration: /gsd eval-review helper chain on a real on-disk slice", (
|
|
|
119
121
|
);
|
|
120
122
|
assert.equal(ctx.truncated, false);
|
|
121
123
|
assert.equal(ctx.sliceId, "S07");
|
|
122
|
-
assert.equal(ctx.outputPath, evalReviewWritePath(layout.sliceDir, "S07"));
|
|
124
|
+
assert.equal(ctx.outputPath, evalReviewWritePath(realpathSync(layout.sliceDir), "S07"));
|
|
123
125
|
|
|
124
126
|
const prompt = buildEvalReviewPrompt(ctx);
|
|
125
127
|
|