@opengsd/gsd-pi 1.0.0
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/LICENSE +21 -0
- package/README.md +96 -0
- package/package.json +171 -0
- package/packages/contracts/dist/index.d.ts +3 -0
- package/packages/contracts/dist/index.d.ts.map +1 -0
- package/packages/contracts/dist/index.js +5 -0
- package/packages/contracts/dist/index.js.map +1 -0
- package/packages/contracts/dist/rpc.d.ts +549 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.js +53 -0
- package/packages/contracts/dist/rpc.js.map +1 -0
- package/packages/contracts/dist/rpc.test.d.ts +2 -0
- package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
- package/packages/contracts/dist/rpc.test.js +54 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -0
- package/packages/contracts/dist/workflow.d.ts +201 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -0
- package/packages/contracts/dist/workflow.js +225 -0
- package/packages/contracts/dist/workflow.js.map +1 -0
- package/packages/contracts/package.json +39 -0
- package/packages/contracts/src/index.ts +5 -0
- package/packages/contracts/src/rpc.test.ts +80 -0
- package/packages/contracts/src/rpc.ts +286 -0
- package/packages/contracts/src/workflow.ts +237 -0
- package/packages/contracts/tsconfig.json +25 -0
- package/packages/daemon/package.json +49 -0
- package/packages/daemon/src/channel-manager.ts +223 -0
- package/packages/daemon/src/cli.ts +96 -0
- package/packages/daemon/src/commands.ts +110 -0
- package/packages/daemon/src/config.ts +137 -0
- package/packages/daemon/src/daemon.test.ts +763 -0
- package/packages/daemon/src/daemon.ts +199 -0
- package/packages/daemon/src/discord-bot.test.ts +792 -0
- package/packages/daemon/src/discord-bot.ts +491 -0
- package/packages/daemon/src/event-bridge.test.ts +620 -0
- package/packages/daemon/src/event-bridge.ts +494 -0
- package/packages/daemon/src/event-formatter.test.ts +401 -0
- package/packages/daemon/src/event-formatter.ts +413 -0
- package/packages/daemon/src/index.ts +55 -0
- package/packages/daemon/src/launchd.test.ts +356 -0
- package/packages/daemon/src/launchd.ts +242 -0
- package/packages/daemon/src/logger.ts +89 -0
- package/packages/daemon/src/message-batcher.test.ts +308 -0
- package/packages/daemon/src/message-batcher.ts +216 -0
- package/packages/daemon/src/orchestrator.test.ts +584 -0
- package/packages/daemon/src/orchestrator.ts +469 -0
- package/packages/daemon/src/project-scanner.test.ts +235 -0
- package/packages/daemon/src/project-scanner.ts +99 -0
- package/packages/daemon/src/session-manager.test.ts +822 -0
- package/packages/daemon/src/session-manager.ts +400 -0
- package/packages/daemon/src/types.ts +184 -0
- package/packages/daemon/src/verbosity.test.ts +171 -0
- package/packages/daemon/src/verbosity.ts +101 -0
- package/packages/daemon/tsconfig.json +24 -0
- package/packages/mcp-server/README.md +275 -0
- package/packages/mcp-server/package.json +53 -0
- package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
- package/packages/mcp-server/src/alias-telemetry.ts +30 -0
- package/packages/mcp-server/src/cli.ts +70 -0
- package/packages/mcp-server/src/env-writer.test.ts +433 -0
- package/packages/mcp-server/src/env-writer.ts +292 -0
- package/packages/mcp-server/src/import-candidates.test.ts +53 -0
- package/packages/mcp-server/src/index.ts +43 -0
- package/packages/mcp-server/src/mcp-server.test.ts +1395 -0
- package/packages/mcp-server/src/parse-workflow-args.test.ts +80 -0
- package/packages/mcp-server/src/readers/captures.ts +119 -0
- package/packages/mcp-server/src/readers/doctor-lite.ts +225 -0
- package/packages/mcp-server/src/readers/graph.test.ts +679 -0
- package/packages/mcp-server/src/readers/graph.ts +863 -0
- package/packages/mcp-server/src/readers/index.ts +28 -0
- package/packages/mcp-server/src/readers/knowledge.ts +111 -0
- package/packages/mcp-server/src/readers/metrics.ts +118 -0
- package/packages/mcp-server/src/readers/paths.test.ts +67 -0
- package/packages/mcp-server/src/readers/paths.ts +334 -0
- package/packages/mcp-server/src/readers/readers.test.ts +513 -0
- package/packages/mcp-server/src/readers/roadmap.ts +263 -0
- package/packages/mcp-server/src/readers/state.ts +223 -0
- package/packages/mcp-server/src/remote-questions.test.ts +397 -0
- package/packages/mcp-server/src/remote-questions.ts +967 -0
- package/packages/mcp-server/src/secure-env-collect.test.ts +260 -0
- package/packages/mcp-server/src/server.ts +1342 -0
- package/packages/mcp-server/src/session-manager.ts +404 -0
- package/packages/mcp-server/src/tool-credentials.test.ts +95 -0
- package/packages/mcp-server/src/tool-credentials.ts +97 -0
- package/packages/mcp-server/src/types.ts +96 -0
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +257 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +2350 -0
- package/packages/mcp-server/src/workflow-tools.ts +2257 -0
- package/packages/mcp-server/tsconfig.json +25 -0
- package/packages/mcp-server/tsconfig.test.json +19 -0
- package/packages/native/dist/ast/index.d.ts +4 -0
- package/packages/native/dist/ast/index.js +11 -0
- package/packages/native/dist/ast/types.d.ts +69 -0
- package/packages/native/dist/ast/types.js +2 -0
- package/packages/native/dist/clipboard/index.d.ts +28 -0
- package/packages/native/dist/clipboard/index.js +38 -0
- package/packages/native/dist/clipboard/types.d.ts +7 -0
- package/packages/native/dist/clipboard/types.js +2 -0
- package/packages/native/dist/diff/index.d.ts +33 -0
- package/packages/native/dist/diff/index.js +43 -0
- package/packages/native/dist/diff/types.d.ts +23 -0
- package/packages/native/dist/diff/types.js +2 -0
- package/packages/native/dist/fd/index.d.ts +26 -0
- package/packages/native/dist/fd/index.js +30 -0
- package/packages/native/dist/fd/types.d.ts +29 -0
- package/packages/native/dist/fd/types.js +2 -0
- package/packages/native/dist/glob/index.d.ts +28 -0
- package/packages/native/dist/glob/index.js +35 -0
- package/packages/native/dist/glob/types.d.ts +50 -0
- package/packages/native/dist/glob/types.js +2 -0
- package/packages/native/dist/grep/index.d.ts +21 -0
- package/packages/native/dist/grep/index.js +28 -0
- package/packages/native/dist/grep/types.d.ts +99 -0
- package/packages/native/dist/grep/types.js +2 -0
- package/packages/native/dist/gsd-parser/index.d.ts +45 -0
- package/packages/native/dist/gsd-parser/index.js +61 -0
- package/packages/native/dist/gsd-parser/types.d.ts +55 -0
- package/packages/native/dist/gsd-parser/types.js +8 -0
- package/packages/native/dist/highlight/index.d.ts +28 -0
- package/packages/native/dist/highlight/index.js +38 -0
- package/packages/native/dist/highlight/types.d.ts +25 -0
- package/packages/native/dist/highlight/types.js +2 -0
- package/packages/native/dist/html/index.d.ts +15 -0
- package/packages/native/dist/html/index.js +19 -0
- package/packages/native/dist/html/types.d.ts +7 -0
- package/packages/native/dist/html/types.js +2 -0
- package/packages/native/dist/image/index.d.ts +15 -0
- package/packages/native/dist/image/index.js +23 -0
- package/packages/native/dist/image/types.d.ts +35 -0
- package/packages/native/dist/image/types.js +29 -0
- package/packages/native/dist/index.d.ts +46 -0
- package/packages/native/dist/index.js +85 -0
- package/packages/native/dist/json-parse/index.d.ts +23 -0
- package/packages/native/dist/json-parse/index.js +78 -0
- package/packages/native/dist/native.d.ts +57 -0
- package/packages/native/dist/native.js +113 -0
- package/packages/native/dist/ps/index.d.ts +38 -0
- package/packages/native/dist/ps/index.js +53 -0
- package/packages/native/dist/stream-process/index.d.ts +35 -0
- package/packages/native/dist/stream-process/index.js +254 -0
- package/packages/native/dist/text/index.d.ts +55 -0
- package/packages/native/dist/text/index.js +76 -0
- package/packages/native/dist/text/types.d.ts +27 -0
- package/packages/native/dist/text/types.js +13 -0
- package/packages/native/dist/truncate/index.d.ts +29 -0
- package/packages/native/dist/truncate/index.js +30 -0
- package/packages/native/dist/ttsr/index.d.ts +27 -0
- package/packages/native/dist/ttsr/index.js +37 -0
- package/packages/native/dist/ttsr/types.d.ts +9 -0
- package/packages/native/dist/ttsr/types.js +2 -0
- package/packages/native/dist/xxhash/index.d.ts +22 -0
- package/packages/native/dist/xxhash/index.js +89 -0
- package/packages/native/package.json +97 -0
- package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
- package/packages/native/src/__tests__/clipboard.test.mjs +126 -0
- package/packages/native/src/__tests__/diff.test.mjs +189 -0
- package/packages/native/src/__tests__/fd.test.mjs +199 -0
- package/packages/native/src/__tests__/glob.test.mjs +237 -0
- package/packages/native/src/__tests__/grep.test.mjs +179 -0
- package/packages/native/src/__tests__/highlight.test.mjs +156 -0
- package/packages/native/src/__tests__/html.test.mjs +98 -0
- package/packages/native/src/__tests__/image.test.mjs +137 -0
- package/packages/native/src/__tests__/json-parse.test.mjs +158 -0
- package/packages/native/src/__tests__/module-compat.test.mjs +123 -0
- package/packages/native/src/__tests__/ps.test.mjs +115 -0
- package/packages/native/src/__tests__/stream-process.test.mjs +108 -0
- package/packages/native/src/__tests__/text.test.mjs +295 -0
- package/packages/native/src/__tests__/truncate.test.mjs +160 -0
- package/packages/native/src/__tests__/ttsr.test.mjs +135 -0
- package/packages/native/src/__tests__/xxhash.test.mjs +122 -0
- package/packages/native/src/ast/index.ts +12 -0
- package/packages/native/src/ast/types.ts +75 -0
- package/packages/native/src/clipboard/index.ts +40 -0
- package/packages/native/src/clipboard/types.ts +7 -0
- package/packages/native/src/diff/index.ts +61 -0
- package/packages/native/src/diff/types.ts +24 -0
- package/packages/native/src/fd/index.ts +36 -0
- package/packages/native/src/fd/types.ts +31 -0
- package/packages/native/src/glob/index.ts +44 -0
- package/packages/native/src/glob/types.ts +53 -0
- package/packages/native/src/grep/index.ts +49 -0
- package/packages/native/src/grep/types.ts +105 -0
- package/packages/native/src/gsd-parser/index.ts +98 -0
- package/packages/native/src/gsd-parser/types.ts +62 -0
- package/packages/native/src/highlight/index.ts +44 -0
- package/packages/native/src/highlight/types.ts +25 -0
- package/packages/native/src/html/index.ts +24 -0
- package/packages/native/src/html/types.ts +7 -0
- package/packages/native/src/image/index.ts +28 -0
- package/packages/native/src/image/types.ts +41 -0
- package/packages/native/src/index.ts +128 -0
- package/packages/native/src/json-parse/index.ts +76 -0
- package/packages/native/src/native.ts +154 -0
- package/packages/native/src/ps/index.ts +52 -0
- package/packages/native/src/stream-process/index.ts +313 -0
- package/packages/native/src/text/index.ts +125 -0
- package/packages/native/src/text/types.ts +29 -0
- package/packages/native/src/truncate/index.ts +50 -0
- package/packages/native/src/ttsr/index.ts +39 -0
- package/packages/native/src/ttsr/types.ts +10 -0
- package/packages/native/src/xxhash/index.ts +98 -0
- package/packages/native/tsconfig.json +9 -0
- package/packages/native/tsconfig.tsbuildinfo +1 -0
- package/packages/pi-agent-core/package.json +23 -0
- package/packages/pi-agent-core/src/agent-loop.test.ts +733 -0
- package/packages/pi-agent-core/src/agent-loop.ts +851 -0
- package/packages/pi-agent-core/src/agent.test.ts +129 -0
- package/packages/pi-agent-core/src/agent.ts +668 -0
- package/packages/pi-agent-core/src/index.ts +10 -0
- package/packages/pi-agent-core/src/proxy.ts +334 -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 +358 -0
- package/packages/pi-agent-core/tsconfig.json +28 -0
- package/packages/pi-ai/bedrock-provider.d.ts +1 -0
- package/packages/pi-ai/bedrock-provider.js +1 -0
- package/packages/pi-ai/package.json +48 -0
- package/packages/pi-ai/scripts/generate-models.ts +1671 -0
- package/packages/pi-ai/src/api-registry.ts +86 -0
- package/packages/pi-ai/src/bedrock-provider.ts +6 -0
- package/packages/pi-ai/src/cli.ts +133 -0
- package/packages/pi-ai/src/env-api-keys.ts +148 -0
- package/packages/pi-ai/src/index.ts +36 -0
- package/packages/pi-ai/src/models/capability-patches.ts +51 -0
- package/packages/pi-ai/src/models/custom.ts +337 -0
- package/packages/pi-ai/src/models/fake-model.ts +30 -0
- package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +1554 -0
- package/packages/pi-ai/src/models/generated/anthropic.ts +398 -0
- package/packages/pi-ai/src/models/generated/azure-openai-responses.ts +704 -0
- package/packages/pi-ai/src/models/generated/cerebras.ts +75 -0
- package/packages/pi-ai/src/models/generated/github-copilot.ts +446 -0
- package/packages/pi-ai/src/models/generated/google-antigravity.ts +177 -0
- package/packages/pi-ai/src/models/generated/google-gemini-cli.ts +109 -0
- package/packages/pi-ai/src/models/generated/google-vertex.ts +211 -0
- package/packages/pi-ai/src/models/generated/google.ts +466 -0
- package/packages/pi-ai/src/models/generated/groq.ts +160 -0
- package/packages/pi-ai/src/models/generated/huggingface.ts +349 -0
- package/packages/pi-ai/src/models/generated/index.ts +52 -0
- package/packages/pi-ai/src/models/generated/kimi-coding.ts +41 -0
- package/packages/pi-ai/src/models/generated/minimax-cn.ts +109 -0
- package/packages/pi-ai/src/models/generated/minimax.ts +109 -0
- package/packages/pi-ai/src/models/generated/mistral.ts +449 -0
- package/packages/pi-ai/src/models/generated/openai-codex.ts +177 -0
- package/packages/pi-ai/src/models/generated/openai.ts +721 -0
- package/packages/pi-ai/src/models/generated/opencode-go.ts +126 -0
- package/packages/pi-ai/src/models/generated/opencode.ts +534 -0
- package/packages/pi-ai/src/models/generated/openrouter.ts +4291 -0
- package/packages/pi-ai/src/models/generated/vercel-ai-gateway.ts +2608 -0
- package/packages/pi-ai/src/models/generated/xai.ts +415 -0
- package/packages/pi-ai/src/models/generated/zai.ts +241 -0
- package/packages/pi-ai/src/models/index.ts +115 -0
- package/packages/pi-ai/src/models.generated.test.ts +362 -0
- package/packages/pi-ai/src/models.test.ts +404 -0
- package/packages/pi-ai/src/models.ts +3 -0
- package/packages/pi-ai/src/oauth.ts +1 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
- package/packages/pi-ai/src/providers/amazon-bedrock.ts +797 -0
- package/packages/pi-ai/src/providers/anthropic-auth.test.ts +92 -0
- package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +36 -0
- package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +134 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +899 -0
- package/packages/pi-ai/src/providers/anthropic-vertex.ts +130 -0
- package/packages/pi-ai/src/providers/anthropic.ts +240 -0
- package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
- package/packages/pi-ai/src/providers/api-family.ts +57 -0
- package/packages/pi-ai/src/providers/azure-openai-responses.ts +248 -0
- package/packages/pi-ai/src/providers/fake.ts +376 -0
- package/packages/pi-ai/src/providers/github-copilot-headers.ts +37 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +90 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +982 -0
- package/packages/pi-ai/src/providers/google-shared.test.ts +137 -0
- package/packages/pi-ai/src/providers/google-shared.ts +364 -0
- package/packages/pi-ai/src/providers/google-vertex.ts +500 -0
- package/packages/pi-ai/src/providers/google.ts +467 -0
- package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +118 -0
- package/packages/pi-ai/src/providers/mistral.ts +597 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +1007 -0
- package/packages/pi-ai/src/providers/openai-completions.test.ts +75 -0
- package/packages/pi-ai/src/providers/openai-completions.ts +830 -0
- package/packages/pi-ai/src/providers/openai-responses-shared.ts +496 -0
- package/packages/pi-ai/src/providers/openai-responses.ts +205 -0
- package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
- package/packages/pi-ai/src/providers/provider-capabilities.test.ts +174 -0
- package/packages/pi-ai/src/providers/provider-capabilities.ts +215 -0
- package/packages/pi-ai/src/providers/register-builtins.ts +216 -0
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +61 -0
- package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
- package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
- package/packages/pi-ai/src/providers/transform-messages-report.test.ts +189 -0
- package/packages/pi-ai/src/providers/transform-messages.ts +289 -0
- package/packages/pi-ai/src/stream.ts +59 -0
- package/packages/pi-ai/src/types.ts +413 -0
- package/packages/pi-ai/src/utils/event-stream.ts +87 -0
- package/packages/pi-ai/src/utils/hash.ts +13 -0
- package/packages/pi-ai/src/utils/json-parse.ts +51 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +282 -0
- package/packages/pi-ai/src/utils/oauth/github-copilot.ts +470 -0
- package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +80 -0
- package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +323 -0
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +80 -0
- package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +468 -0
- package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
- package/packages/pi-ai/src/utils/oauth/index.ts +134 -0
- package/packages/pi-ai/src/utils/oauth/openai-codex.ts +472 -0
- package/packages/pi-ai/src/utils/oauth/pkce.ts +34 -0
- package/packages/pi-ai/src/utils/oauth/types.ts +49 -0
- package/packages/pi-ai/src/utils/overflow.ts +129 -0
- package/packages/pi-ai/src/utils/repair-tool-json.ts +241 -0
- package/packages/pi-ai/src/utils/sanitize-unicode.ts +25 -0
- package/packages/pi-ai/src/utils/tests/json-parse.test.ts +17 -0
- package/packages/pi-ai/src/utils/tests/overflow.test.ts +58 -0
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +240 -0
- package/packages/pi-ai/src/utils/typebox-helpers.ts +24 -0
- package/packages/pi-ai/src/utils/validation.ts +69 -0
- package/packages/pi-ai/src/web-runtime-env-api-keys.ts +86 -0
- package/packages/pi-ai/src/web-runtime-oauth.ts +9 -0
- package/packages/pi-ai/tsconfig.json +28 -0
- package/packages/pi-coding-agent/package.json +52 -0
- package/packages/pi-coding-agent/scripts/copy-assets.cjs +55 -0
- package/packages/pi-coding-agent/src/cli/abort-signal-timeout.test.ts +73 -0
- package/packages/pi-coding-agent/src/cli/abort-signal-timeout.ts +18 -0
- package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
- package/packages/pi-coding-agent/src/cli/args.ts +357 -0
- package/packages/pi-coding-agent/src/cli/config-selector.ts +52 -0
- package/packages/pi-coding-agent/src/cli/file-processor.ts +96 -0
- package/packages/pi-coding-agent/src/cli/list-models.ts +164 -0
- package/packages/pi-coding-agent/src/cli/session-picker.ts +51 -0
- package/packages/pi-coding-agent/src/cli.ts +20 -0
- package/packages/pi-coding-agent/src/config.ts +245 -0
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +491 -0
- package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +93 -0
- package/packages/pi-coding-agent/src/core/agent-session-renderable-tools.test.ts +70 -0
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +172 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +3150 -0
- package/packages/pi-coding-agent/src/core/artifact-manager.ts +125 -0
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +654 -0
- package/packages/pi-coding-agent/src/core/auth-storage.ts +925 -0
- package/packages/pi-coding-agent/src/core/bash-executor.ts +316 -0
- package/packages/pi-coding-agent/src/core/blob-store.ts +154 -0
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1571 -0
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +307 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +598 -0
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +986 -0
- package/packages/pi-coding-agent/src/core/compaction/index.ts +7 -0
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +368 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +440 -0
- package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
- package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +117 -0
- package/packages/pi-coding-agent/src/core/constants.ts +59 -0
- package/packages/pi-coding-agent/src/core/contextual-tips.test.ts +259 -0
- package/packages/pi-coding-agent/src/core/contextual-tips.ts +232 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
- package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
- package/packages/pi-coding-agent/src/core/defaults.ts +3 -0
- package/packages/pi-coding-agent/src/core/diagnostics.ts +15 -0
- package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +163 -0
- package/packages/pi-coding-agent/src/core/discovery-cache.ts +104 -0
- package/packages/pi-coding-agent/src/core/event-bus.ts +33 -0
- package/packages/pi-coding-agent/src/core/exec.ts +106 -0
- package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +258 -0
- package/packages/pi-coding-agent/src/core/export-html/index.ts +306 -0
- package/packages/pi-coding-agent/src/core/export-html/template.css +971 -0
- package/packages/pi-coding-agent/src/core/export-html/template.html +54 -0
- package/packages/pi-coding-agent/src/core/export-html/template.js +1583 -0
- package/packages/pi-coding-agent/src/core/export-html/tool-renderer.ts +114 -0
- package/packages/pi-coding-agent/src/core/export-html/vendor/highlight.min.js +1213 -0
- package/packages/pi-coding-agent/src/core/export-html/vendor/marked.min.js +6 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
- package/packages/pi-coding-agent/src/core/extensions/index.ts +186 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +275 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +1139 -0
- package/packages/pi-coding-agent/src/core/extensions/project-trust.ts +51 -0
- package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +81 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +282 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +1241 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +1872 -0
- package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +127 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +242 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +164 -0
- package/packages/pi-coding-agent/src/core/footer-data-provider.ts +144 -0
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +54 -0
- package/packages/pi-coding-agent/src/core/fs-utils.ts +12 -0
- package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +271 -0
- package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
- package/packages/pi-coding-agent/src/core/index.ts +80 -0
- package/packages/pi-coding-agent/src/core/keybindings.ts +211 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +280 -0
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +968 -0
- package/packages/pi-coding-agent/src/core/lsp/config.ts +356 -0
- package/packages/pi-coding-agent/src/core/lsp/defaults.json +456 -0
- package/packages/pi-coding-agent/src/core/lsp/edits.ts +109 -0
- package/packages/pi-coding-agent/src/core/lsp/helpers.ts +54 -0
- package/packages/pi-coding-agent/src/core/lsp/index.ts +1065 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +451 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +70 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp.md +39 -0
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +190 -0
- package/packages/pi-coding-agent/src/core/lsp/types.ts +445 -0
- package/packages/pi-coding-agent/src/core/lsp/utils.ts +706 -0
- package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
- package/packages/pi-coding-agent/src/core/messages.ts +226 -0
- package/packages/pi-coding-agent/src/core/model-discovery.test.ts +144 -0
- package/packages/pi-coding-agent/src/core/model-discovery.ts +318 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +730 -0
- package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
- package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +210 -0
- package/packages/pi-coding-agent/src/core/model-registry-env-fallback.test.ts +59 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +1053 -0
- package/packages/pi-coding-agent/src/core/model-resolver-initial-model-auth.test.ts +78 -0
- package/packages/pi-coding-agent/src/core/model-resolver.test.ts +85 -0
- package/packages/pi-coding-agent/src/core/model-resolver.ts +511 -0
- package/packages/pi-coding-agent/src/core/models-json-writer.test.ts +145 -0
- package/packages/pi-coding-agent/src/core/models-json-writer.ts +188 -0
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +262 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/package-manager.ts +1845 -0
- package/packages/pi-coding-agent/src/core/prompt-templates.ts +299 -0
- package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
- package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +295 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.ts +118 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +107 -0
- package/packages/pi-coding-agent/src/core/resource-loader.ts +929 -0
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +518 -0
- package/packages/pi-coding-agent/src/core/retry-handler.ts +576 -0
- package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
- package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
- package/packages/pi-coding-agent/src/core/sdk.test.ts +113 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +688 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +129 -0
- package/packages/pi-coding-agent/src/core/session-manager.ts +1646 -0
- package/packages/pi-coding-agent/src/core/settings-manager-security.test.ts +102 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +1247 -0
- package/packages/pi-coding-agent/src/core/skill-tool.test.ts +117 -0
- package/packages/pi-coding-agent/src/core/skills.ts +490 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +43 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +296 -0
- package/packages/pi-coding-agent/src/core/timings.ts +25 -0
- package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
- package/packages/pi-coding-agent/src/core/tools/bash-background.test.ts +91 -0
- package/packages/pi-coding-agent/src/core/tools/bash-interceptor.test.ts +198 -0
- package/packages/pi-coding-agent/src/core/tools/bash-interceptor.ts +115 -0
- package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +77 -0
- package/packages/pi-coding-agent/src/core/tools/bash.ts +478 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +85 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.ts +402 -0
- package/packages/pi-coding-agent/src/core/tools/edit.ts +242 -0
- package/packages/pi-coding-agent/src/core/tools/find.ts +209 -0
- package/packages/pi-coding-agent/src/core/tools/grep.ts +356 -0
- package/packages/pi-coding-agent/src/core/tools/hashline-edit.ts +318 -0
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +207 -0
- package/packages/pi-coding-agent/src/core/tools/hashline.test.ts +456 -0
- package/packages/pi-coding-agent/src/core/tools/hashline.ts +525 -0
- package/packages/pi-coding-agent/src/core/tools/index.ts +226 -0
- package/packages/pi-coding-agent/src/core/tools/ls.ts +178 -0
- package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +67 -0
- package/packages/pi-coding-agent/src/core/tools/path-utils.ts +106 -0
- package/packages/pi-coding-agent/src/core/tools/read.ts +235 -0
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +31 -0
- package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +83 -0
- 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/truncate.ts +267 -0
- package/packages/pi-coding-agent/src/core/tools/write.ts +133 -0
- package/packages/pi-coding-agent/src/index.ts +422 -0
- package/packages/pi-coding-agent/src/main.ts +649 -0
- package/packages/pi-coding-agent/src/migrations.ts +295 -0
- package/packages/pi-coding-agent/src/modes/index.ts +16 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +128 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +93 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +111 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/login-dialog.test.ts +24 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +28 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +41 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +512 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +139 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +66 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +161 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +115 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +107 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +360 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +200 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +35 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +287 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +66 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +54 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +45 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +73 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +599 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +43 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +97 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +89 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +68 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +159 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +153 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +99 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +97 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-editor.ts +150 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +92 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +152 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +266 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +33 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +122 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/keybinding-hints.ts +84 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +256 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +693 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +127 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +231 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +22 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +342 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +63 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +194 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +1015 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +466 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/show-images-selector.ts +47 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +61 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +27 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +67 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/thinking-selector.ts +66 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +49 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +303 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1457 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +345 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +84 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1125 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +28 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +154 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +76 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/visual-truncate.ts +50 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +230 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1066 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/extension-ui-controller.ts +68 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +373 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +157 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/model-controller.ts +76 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +63 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +73 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +40 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4418 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +695 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +96 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +1130 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +388 -0
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +68 -0
- package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
- package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +39 -0
- package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +56 -0
- package/packages/pi-coding-agent/src/modes/print-mode.ts +106 -0
- package/packages/pi-coding-agent/src/modes/rpc/jsonl.ts +64 -0
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +109 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +574 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +891 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-protocol-v2.test.ts +971 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +4 -0
- package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/index.ts +270 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/pipeline.ts +567 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +98 -0
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +479 -0
- package/packages/pi-coding-agent/src/tests/path-display.test.ts +85 -0
- package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
- package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
- package/packages/pi-coding-agent/src/types/ambient-modules.d.ts +69 -0
- package/packages/pi-coding-agent/src/utils/changelog.ts +99 -0
- package/packages/pi-coding-agent/src/utils/clipboard-image.ts +227 -0
- package/packages/pi-coding-agent/src/utils/clipboard-native.ts +11 -0
- package/packages/pi-coding-agent/src/utils/clipboard.ts +14 -0
- package/packages/pi-coding-agent/src/utils/error.ts +6 -0
- package/packages/pi-coding-agent/src/utils/frontmatter.ts +39 -0
- package/packages/pi-coding-agent/src/utils/git.ts +192 -0
- package/packages/pi-coding-agent/src/utils/image-convert.ts +28 -0
- package/packages/pi-coding-agent/src/utils/image-resize.ts +225 -0
- package/packages/pi-coding-agent/src/utils/mime.ts +30 -0
- package/packages/pi-coding-agent/src/utils/path-display.ts +36 -0
- package/packages/pi-coding-agent/src/utils/photon.ts +2 -0
- package/packages/pi-coding-agent/src/utils/shell.ts +212 -0
- package/packages/pi-coding-agent/src/utils/sleep.ts +18 -0
- package/packages/pi-coding-agent/src/utils/tools-manager.ts +286 -0
- package/packages/pi-coding-agent/tsconfig.json +28 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +206 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.js +100 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/keys.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/keys.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/keys.test.js +18 -0
- package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
- package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +227 -0
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +80 -0
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/style.test.js +129 -0
- package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/tui.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +315 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/utils.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/utils.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/utils.test.js +17 -0
- package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -0
- package/packages/pi-tui/dist/autocomplete.d.ts +55 -0
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -0
- package/packages/pi-tui/dist/autocomplete.js +540 -0
- package/packages/pi-tui/dist/autocomplete.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/box.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/box.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/box.test.js +20 -0
- package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.js +38 -0
- package/packages/pi-tui/dist/components/__tests__/cancellable-loader.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.js +89 -0
- package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.js +81 -0
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/loader.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/loader.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/loader.test.js +81 -0
- package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-list.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-list.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-list.test.js +36 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-list.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +70 -0
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/select-list.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/select-list.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/select-list.test.js +42 -0
- package/packages/pi-tui/dist/components/__tests__/select-list.test.js.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/truncated-text.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/truncated-text.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +14 -0
- package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -0
- package/packages/pi-tui/dist/components/box.d.ts +23 -0
- package/packages/pi-tui/dist/components/box.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/box.js +111 -0
- package/packages/pi-tui/dist/components/box.js.map +1 -0
- package/packages/pi-tui/dist/components/cancellable-loader.d.ts +22 -0
- package/packages/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/cancellable-loader.js +38 -0
- package/packages/pi-tui/dist/components/cancellable-loader.js.map +1 -0
- package/packages/pi-tui/dist/components/editor.d.ts +245 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/editor.js +1825 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -0
- package/packages/pi-tui/dist/components/image.d.ts +37 -0
- package/packages/pi-tui/dist/components/image.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/image.js +84 -0
- package/packages/pi-tui/dist/components/image.js.map +1 -0
- package/packages/pi-tui/dist/components/image.test.d.ts +6 -0
- package/packages/pi-tui/dist/components/image.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/image.test.js +33 -0
- package/packages/pi-tui/dist/components/image.test.js.map +1 -0
- package/packages/pi-tui/dist/components/input.d.ts +42 -0
- package/packages/pi-tui/dist/components/input.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/input.js +479 -0
- package/packages/pi-tui/dist/components/input.js.map +1 -0
- package/packages/pi-tui/dist/components/loader.d.ts +24 -0
- package/packages/pi-tui/dist/components/loader.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/loader.js +74 -0
- package/packages/pi-tui/dist/components/loader.js.map +1 -0
- package/packages/pi-tui/dist/components/markdown.d.ts +106 -0
- package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/markdown.js +668 -0
- package/packages/pi-tui/dist/components/markdown.js.map +1 -0
- package/packages/pi-tui/dist/components/select-list.d.ts +32 -0
- package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/select-list.js +155 -0
- package/packages/pi-tui/dist/components/select-list.js.map +1 -0
- package/packages/pi-tui/dist/components/settings-list.d.ts +50 -0
- package/packages/pi-tui/dist/components/settings-list.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/settings-list.js +179 -0
- package/packages/pi-tui/dist/components/settings-list.js.map +1 -0
- package/packages/pi-tui/dist/components/spacer.d.ts +12 -0
- package/packages/pi-tui/dist/components/spacer.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/spacer.js +22 -0
- package/packages/pi-tui/dist/components/spacer.js.map +1 -0
- package/packages/pi-tui/dist/components/text.d.ts +19 -0
- package/packages/pi-tui/dist/components/text.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/text.js +83 -0
- package/packages/pi-tui/dist/components/text.js.map +1 -0
- package/packages/pi-tui/dist/components/truncated-text.d.ts +13 -0
- package/packages/pi-tui/dist/components/truncated-text.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/truncated-text.js +54 -0
- package/packages/pi-tui/dist/components/truncated-text.js.map +1 -0
- package/packages/pi-tui/dist/editor-component.d.ts +41 -0
- package/packages/pi-tui/dist/editor-component.d.ts.map +1 -0
- package/packages/pi-tui/dist/editor-component.js +2 -0
- package/packages/pi-tui/dist/editor-component.js.map +1 -0
- package/packages/pi-tui/dist/fuzzy.d.ts +16 -0
- package/packages/pi-tui/dist/fuzzy.d.ts.map +1 -0
- package/packages/pi-tui/dist/fuzzy.js +111 -0
- package/packages/pi-tui/dist/fuzzy.js.map +1 -0
- package/packages/pi-tui/dist/index.d.ts +24 -0
- package/packages/pi-tui/dist/index.d.ts.map +1 -0
- package/packages/pi-tui/dist/index.js +35 -0
- package/packages/pi-tui/dist/index.js.map +1 -0
- package/packages/pi-tui/dist/keybindings.d.ts +39 -0
- package/packages/pi-tui/dist/keybindings.d.ts.map +1 -0
- package/packages/pi-tui/dist/keybindings.js +116 -0
- package/packages/pi-tui/dist/keybindings.js.map +1 -0
- package/packages/pi-tui/dist/keys.d.ts +142 -0
- package/packages/pi-tui/dist/keys.d.ts.map +1 -0
- package/packages/pi-tui/dist/keys.js +994 -0
- package/packages/pi-tui/dist/keys.js.map +1 -0
- package/packages/pi-tui/dist/kill-ring.d.ts +28 -0
- package/packages/pi-tui/dist/kill-ring.d.ts.map +1 -0
- package/packages/pi-tui/dist/kill-ring.js +46 -0
- package/packages/pi-tui/dist/kill-ring.js.map +1 -0
- package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
- package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
- package/packages/pi-tui/dist/overlay-layout.js +314 -0
- package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
- package/packages/pi-tui/dist/stdin-buffer.d.ts +55 -0
- package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -0
- package/packages/pi-tui/dist/stdin-buffer.js +342 -0
- package/packages/pi-tui/dist/stdin-buffer.js.map +1 -0
- package/packages/pi-tui/dist/style.d.ts +52 -0
- package/packages/pi-tui/dist/style.d.ts.map +1 -0
- package/packages/pi-tui/dist/style.js +219 -0
- package/packages/pi-tui/dist/style.js.map +1 -0
- package/packages/pi-tui/dist/terminal-image.d.ts +68 -0
- package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -0
- package/packages/pi-tui/dist/terminal-image.js +181 -0
- package/packages/pi-tui/dist/terminal-image.js.map +1 -0
- package/packages/pi-tui/dist/terminal.d.ts +89 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -0
- package/packages/pi-tui/dist/terminal.js +295 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -0
- package/packages/pi-tui/dist/tui.d.ts +213 -0
- package/packages/pi-tui/dist/tui.d.ts.map +1 -0
- package/packages/pi-tui/dist/tui.js +978 -0
- package/packages/pi-tui/dist/tui.js.map +1 -0
- package/packages/pi-tui/dist/undo-stack.d.ts +17 -0
- package/packages/pi-tui/dist/undo-stack.d.ts.map +1 -0
- package/packages/pi-tui/dist/undo-stack.js +27 -0
- package/packages/pi-tui/dist/undo-stack.js.map +1 -0
- package/packages/pi-tui/dist/utils.d.ts +72 -0
- package/packages/pi-tui/dist/utils.d.ts.map +1 -0
- package/packages/pi-tui/dist/utils.js +120 -0
- package/packages/pi-tui/dist/utils.js.map +1 -0
- package/packages/pi-tui/package.json +35 -0
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +264 -0
- package/packages/pi-tui/src/__tests__/fuzzy.test.ts +120 -0
- package/packages/pi-tui/src/__tests__/keys.test.ts +21 -0
- package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +266 -0
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +99 -0
- package/packages/pi-tui/src/__tests__/style.test.ts +156 -0
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +377 -0
- package/packages/pi-tui/src/__tests__/utils.test.ts +22 -0
- package/packages/pi-tui/src/autocomplete.ts +675 -0
- package/packages/pi-tui/src/components/__tests__/box.test.ts +25 -0
- package/packages/pi-tui/src/components/__tests__/cancellable-loader.test.ts +45 -0
- package/packages/pi-tui/src/components/__tests__/editor.test.ts +119 -0
- package/packages/pi-tui/src/components/__tests__/input.test.ts +111 -0
- package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
- package/packages/pi-tui/src/components/__tests__/loader.test.ts +122 -0
- package/packages/pi-tui/src/components/__tests__/markdown-list.test.ts +40 -0
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +82 -0
- package/packages/pi-tui/src/components/__tests__/select-list.test.ts +70 -0
- package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +17 -0
- package/packages/pi-tui/src/components/box.ts +150 -0
- package/packages/pi-tui/src/components/cancellable-loader.ts +42 -0
- package/packages/pi-tui/src/components/editor.ts +2196 -0
- package/packages/pi-tui/src/components/image.test.ts +41 -0
- package/packages/pi-tui/src/components/image.ts +131 -0
- package/packages/pi-tui/src/components/input.ts +558 -0
- package/packages/pi-tui/src/components/loader.ts +83 -0
- package/packages/pi-tui/src/components/markdown.ts +842 -0
- package/packages/pi-tui/src/components/select-list.ts +194 -0
- package/packages/pi-tui/src/components/settings-list.ts +251 -0
- package/packages/pi-tui/src/components/spacer.ts +28 -0
- package/packages/pi-tui/src/components/text.ts +107 -0
- package/packages/pi-tui/src/components/truncated-text.ts +72 -0
- package/packages/pi-tui/src/editor-component.ts +77 -0
- package/packages/pi-tui/src/fuzzy.ts +138 -0
- package/packages/pi-tui/src/index.ts +98 -0
- package/packages/pi-tui/src/keybindings.ts +189 -0
- package/packages/pi-tui/src/keys.ts +1196 -0
- package/packages/pi-tui/src/kill-ring.ts +46 -0
- package/packages/pi-tui/src/overlay-layout.ts +408 -0
- package/packages/pi-tui/src/stdin-buffer.ts +419 -0
- package/packages/pi-tui/src/style.ts +295 -0
- package/packages/pi-tui/src/terminal-image.ts +260 -0
- package/packages/pi-tui/src/terminal.ts +377 -0
- package/packages/pi-tui/src/tui.ts +1182 -0
- package/packages/pi-tui/src/undo-stack.ts +28 -0
- package/packages/pi-tui/src/utils.ts +154 -0
- package/packages/pi-tui/tsconfig.json +28 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -0
- package/packages/rpc-client/README.md +132 -0
- package/packages/rpc-client/examples/basic-usage.ts +13 -0
- package/packages/rpc-client/package.json +42 -0
- package/packages/rpc-client/src/index.ts +10 -0
- package/packages/rpc-client/src/jsonl.ts +64 -0
- package/packages/rpc-client/src/rpc-client.test.ts +625 -0
- package/packages/rpc-client/src/rpc-client.ts +663 -0
- package/packages/rpc-client/src/rpc-types.ts +4 -0
- package/packages/rpc-client/tsconfig.examples.json +17 -0
- package/packages/rpc-client/tsconfig.json +25 -0
- package/pkg/dist/core/export-html/template.css +971 -0
- package/pkg/dist/core/export-html/template.html +54 -0
- package/pkg/dist/core/export-html/template.js +1583 -0
- package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
- package/pkg/package.json +8 -0
- package/scripts/ensure-workspace-builds.cjs +123 -0
- package/scripts/install.js +526 -0
- package/scripts/lib/workspace-manifest.cjs +86 -0
- package/scripts/link-workspace-packages.cjs +82 -0
- package/scripts/postinstall.js +11 -0
- package/src/resources/GSD-WORKFLOW.md +664 -0
- package/src/resources/agents/debugger.md +58 -0
- package/src/resources/agents/doc-writer.md +43 -0
- package/src/resources/agents/git-ops.md +56 -0
- package/src/resources/agents/javascript-pro.md +55 -0
- package/src/resources/agents/planner.md +55 -0
- package/src/resources/agents/refactorer.md +47 -0
- package/src/resources/agents/researcher.md +29 -0
- package/src/resources/agents/reviewer.md +48 -0
- package/src/resources/agents/scout.md +56 -0
- package/src/resources/agents/security.md +59 -0
- package/src/resources/agents/tester.md +50 -0
- package/src/resources/agents/typescript-pro.md +61 -0
- package/src/resources/agents/worker.md +31 -0
- package/src/resources/extensions/ask-user-questions.ts +478 -0
- package/src/resources/extensions/async-jobs/async-bash-timeout.test.ts +122 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +263 -0
- package/src/resources/extensions/async-jobs/await-tool.test.ts +200 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +136 -0
- package/src/resources/extensions/async-jobs/cancel-job-tool.ts +35 -0
- package/src/resources/extensions/async-jobs/extension-manifest.json +13 -0
- package/src/resources/extensions/async-jobs/index.ts +153 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +242 -0
- package/src/resources/extensions/aws-auth/index.ts +144 -0
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
- package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +413 -0
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
- package/src/resources/extensions/bg-shell/extension-manifest.json +14 -0
- package/src/resources/extensions/bg-shell/index.ts +54 -0
- package/src/resources/extensions/bg-shell/interaction.ts +200 -0
- package/src/resources/extensions/bg-shell/output-formatter.ts +262 -0
- package/src/resources/extensions/bg-shell/overlay.ts +441 -0
- package/src/resources/extensions/bg-shell/process-manager.ts +469 -0
- package/src/resources/extensions/bg-shell/readiness-detector.ts +126 -0
- package/src/resources/extensions/bg-shell/types.ts +291 -0
- package/src/resources/extensions/bg-shell/utilities.ts +93 -0
- package/src/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
- package/src/resources/extensions/browser-tools/capture.ts +229 -0
- package/src/resources/extensions/browser-tools/core.ts +1196 -0
- package/src/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
- package/src/resources/extensions/browser-tools/extension-manifest.json +37 -0
- package/src/resources/extensions/browser-tools/index.ts +163 -0
- package/src/resources/extensions/browser-tools/lifecycle.ts +270 -0
- package/src/resources/extensions/browser-tools/package.json +24 -0
- package/src/resources/extensions/browser-tools/refs.ts +264 -0
- package/src/resources/extensions/browser-tools/settle.ts +197 -0
- package/src/resources/extensions/browser-tools/state.ts +408 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
- package/src/resources/extensions/browser-tools/tools/action-cache.ts +216 -0
- package/src/resources/extensions/browser-tools/tools/assertions.ts +342 -0
- package/src/resources/extensions/browser-tools/tools/codegen.ts +274 -0
- package/src/resources/extensions/browser-tools/tools/device.ts +183 -0
- package/src/resources/extensions/browser-tools/tools/extract.ts +229 -0
- package/src/resources/extensions/browser-tools/tools/forms.ts +805 -0
- package/src/resources/extensions/browser-tools/tools/injection-detect.ts +221 -0
- package/src/resources/extensions/browser-tools/tools/inspection.ts +492 -0
- package/src/resources/extensions/browser-tools/tools/intent.ts +629 -0
- package/src/resources/extensions/browser-tools/tools/interaction.ts +865 -0
- package/src/resources/extensions/browser-tools/tools/navigation.ts +232 -0
- package/src/resources/extensions/browser-tools/tools/network-mock.ts +244 -0
- package/src/resources/extensions/browser-tools/tools/pages.ts +303 -0
- package/src/resources/extensions/browser-tools/tools/pdf.ts +92 -0
- package/src/resources/extensions/browser-tools/tools/refs.ts +541 -0
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +102 -0
- package/src/resources/extensions/browser-tools/tools/session.ts +400 -0
- package/src/resources/extensions/browser-tools/tools/state-persistence.ts +202 -0
- package/src/resources/extensions/browser-tools/tools/verify.ts +117 -0
- package/src/resources/extensions/browser-tools/tools/visual-diff.ts +209 -0
- package/src/resources/extensions/browser-tools/tools/wait.ts +247 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +105 -0
- package/src/resources/extensions/browser-tools/utils.ts +660 -0
- package/src/resources/extensions/claude-code-cli/index.ts +28 -0
- package/src/resources/extensions/claude-code-cli/models.ts +51 -0
- package/src/resources/extensions/claude-code-cli/package.json +11 -0
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +305 -0
- package/src/resources/extensions/claude-code-cli/readiness.ts +242 -0
- package/src/resources/extensions/claude-code-cli/sdk-types.ts +149 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1981 -0
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +256 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +2380 -0
- package/src/resources/extensions/cmux/index.ts +479 -0
- package/src/resources/extensions/cmux/package.json +7 -0
- package/src/resources/extensions/context7/extension-manifest.json +12 -0
- package/src/resources/extensions/context7/index.ts +435 -0
- package/src/resources/extensions/context7/package.json +11 -0
- package/src/resources/extensions/get-secrets-from-user.ts +608 -0
- package/src/resources/extensions/github-sync/cli.ts +367 -0
- package/src/resources/extensions/github-sync/index.ts +93 -0
- package/src/resources/extensions/github-sync/mapping.ts +81 -0
- package/src/resources/extensions/github-sync/sync.ts +594 -0
- package/src/resources/extensions/github-sync/templates.ts +339 -0
- package/src/resources/extensions/github-sync/tests/cli.test.ts +89 -0
- package/src/resources/extensions/github-sync/tests/commit-linking.test.ts +43 -0
- package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
- package/src/resources/extensions/github-sync/tests/mapping.test.ts +104 -0
- package/src/resources/extensions/github-sync/tests/sync-source.test.ts +14 -0
- package/src/resources/extensions/github-sync/tests/templates.test.ts +209 -0
- package/src/resources/extensions/github-sync/types.ts +47 -0
- package/src/resources/extensions/google-search/extension-manifest.json +13 -0
- package/src/resources/extensions/google-search/index.ts +6 -0
- package/src/resources/extensions/google-search/package.json +9 -0
- package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
- package/src/resources/extensions/gsd/activity-log.ts +184 -0
- package/src/resources/extensions/gsd/atomic-write.ts +185 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +159 -0
- package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
- package/src/resources/extensions/gsd/auto/detect-stuck.ts +138 -0
- package/src/resources/extensions/gsd/auto/finalize-timeout.ts +49 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +92 -0
- package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +62 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +302 -0
- package/src/resources/extensions/gsd/auto/loop.ts +1448 -0
- package/src/resources/extensions/gsd/auto/orchestrator.ts +417 -0
- package/src/resources/extensions/gsd/auto/phases.ts +3014 -0
- package/src/resources/extensions/gsd/auto/resolve.ts +176 -0
- package/src/resources/extensions/gsd/auto/run-unit.ts +306 -0
- package/src/resources/extensions/gsd/auto/session.ts +427 -0
- package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
- package/src/resources/extensions/gsd/auto/types.ts +130 -0
- package/src/resources/extensions/gsd/auto/unit-runner-events.ts +19 -0
- package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
- package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +179 -0
- package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
- package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
- package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +542 -0
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +71 -0
- package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
- package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
- package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
- package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
- package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +51 -0
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +218 -0
- package/src/resources/extensions/gsd/auto-budget.ts +57 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +1239 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +311 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +1827 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +755 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +2375 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +4108 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +1217 -0
- package/src/resources/extensions/gsd/auto-runtime-state.ts +63 -0
- package/src/resources/extensions/gsd/auto-start.ts +1561 -0
- package/src/resources/extensions/gsd/auto-status-message.ts +45 -0
- package/src/resources/extensions/gsd/auto-supervisor.ts +86 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +308 -0
- package/src/resources/extensions/gsd/auto-timers.ts +366 -0
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +156 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +138 -0
- package/src/resources/extensions/gsd/auto-utils.ts +25 -0
- package/src/resources/extensions/gsd/auto-verification.ts +955 -0
- package/src/resources/extensions/gsd/auto-worktree-repair.ts +194 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +2570 -0
- package/src/resources/extensions/gsd/auto.ts +3167 -0
- package/src/resources/extensions/gsd/blocked-models.ts +98 -0
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +685 -0
- package/src/resources/extensions/gsd/bootstrap/crash-log.ts +32 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1408 -0
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +144 -0
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +123 -0
- package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +67 -0
- package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +166 -0
- package/src/resources/extensions/gsd/bootstrap/notify-interceptor.ts +34 -0
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +61 -0
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +68 -0
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +154 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +1203 -0
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +101 -0
- package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +61 -0
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +32 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +770 -0
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +103 -0
- package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +103 -0
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1059 -0
- package/src/resources/extensions/gsd/branch-patterns.ts +16 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +29 -0
- package/src/resources/extensions/gsd/cache.ts +40 -0
- package/src/resources/extensions/gsd/captures.ts +571 -0
- package/src/resources/extensions/gsd/changelog.ts +213 -0
- package/src/resources/extensions/gsd/claude-import.ts +705 -0
- package/src/resources/extensions/gsd/clean-root-preflight.ts +564 -0
- package/src/resources/extensions/gsd/closeout-recovery.ts +290 -0
- package/src/resources/extensions/gsd/codebase-generator.ts +616 -0
- package/src/resources/extensions/gsd/collision-diagnostics.ts +332 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +577 -0
- package/src/resources/extensions/gsd/commands/context.ts +159 -0
- package/src/resources/extensions/gsd/commands/dispatcher.ts +101 -0
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +179 -0
- package/src/resources/extensions/gsd/commands/handlers/core.ts +597 -0
- package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
- package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +144 -0
- package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +359 -0
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +147 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +691 -0
- package/src/resources/extensions/gsd/commands/index.ts +20 -0
- package/src/resources/extensions/gsd/commands-add-tests.ts +137 -0
- package/src/resources/extensions/gsd/commands-backlog.ts +182 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +280 -0
- package/src/resources/extensions/gsd/commands-closeout.ts +109 -0
- package/src/resources/extensions/gsd/commands-cmux.ts +182 -0
- package/src/resources/extensions/gsd/commands-codebase.ts +198 -0
- package/src/resources/extensions/gsd/commands-config.ts +119 -0
- package/src/resources/extensions/gsd/commands-debug.ts +510 -0
- package/src/resources/extensions/gsd/commands-do.ts +110 -0
- package/src/resources/extensions/gsd/commands-eval-review.ts +716 -0
- package/src/resources/extensions/gsd/commands-extensions.ts +1088 -0
- package/src/resources/extensions/gsd/commands-extract-learnings.ts +493 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +510 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +99 -0
- package/src/resources/extensions/gsd/commands-logs.ts +537 -0
- package/src/resources/extensions/gsd/commands-maintenance.ts +544 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +402 -0
- package/src/resources/extensions/gsd/commands-memory.ts +551 -0
- package/src/resources/extensions/gsd/commands-pr-branch.ts +234 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1848 -0
- package/src/resources/extensions/gsd/commands-rate.ts +55 -0
- package/src/resources/extensions/gsd/commands-scan.ts +126 -0
- package/src/resources/extensions/gsd/commands-session-report.ts +101 -0
- package/src/resources/extensions/gsd/commands-ship.ts +292 -0
- package/src/resources/extensions/gsd/commands-verdict.ts +229 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +684 -0
- package/src/resources/extensions/gsd/commands-worktree.ts +383 -0
- package/src/resources/extensions/gsd/commands.ts +17 -0
- package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
- package/src/resources/extensions/gsd/complexity-classifier.ts +331 -0
- package/src/resources/extensions/gsd/component-loader.ts +592 -0
- package/src/resources/extensions/gsd/component-types.ts +362 -0
- package/src/resources/extensions/gsd/config-overlay.ts +331 -0
- package/src/resources/extensions/gsd/constants.ts +69 -0
- package/src/resources/extensions/gsd/context-budget.ts +309 -0
- package/src/resources/extensions/gsd/context-injector.ts +100 -0
- package/src/resources/extensions/gsd/context-masker.ts +74 -0
- package/src/resources/extensions/gsd/context-store.ts +497 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +427 -0
- package/src/resources/extensions/gsd/custom-execution-policy.ts +74 -0
- package/src/resources/extensions/gsd/custom-verification.ts +183 -0
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +274 -0
- package/src/resources/extensions/gsd/dashboard-overlay.ts +684 -0
- package/src/resources/extensions/gsd/db/auto-workers.ts +310 -0
- package/src/resources/extensions/gsd/db/command-queue.ts +149 -0
- package/src/resources/extensions/gsd/db/milestone-leases.ts +300 -0
- package/src/resources/extensions/gsd/db/runtime-kv.ts +127 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +554 -0
- package/src/resources/extensions/gsd/db-adapter.ts +75 -0
- package/src/resources/extensions/gsd/db-base-schema.ts +387 -0
- package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
- package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
- package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
- package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
- package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
- package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
- package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +464 -0
- package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
- package/src/resources/extensions/gsd/db-open-state.ts +47 -0
- package/src/resources/extensions/gsd/db-provider.ts +148 -0
- package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +150 -0
- package/src/resources/extensions/gsd/db-transaction.ts +76 -0
- package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
- package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
- package/src/resources/extensions/gsd/db-writer.ts +966 -0
- package/src/resources/extensions/gsd/debug-logger.ts +178 -0
- package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
- package/src/resources/extensions/gsd/deep-project-setup-policy.ts +257 -0
- package/src/resources/extensions/gsd/definition-io.ts +18 -0
- package/src/resources/extensions/gsd/definition-loader.ts +469 -0
- package/src/resources/extensions/gsd/delegation-policy.ts +197 -0
- package/src/resources/extensions/gsd/detection.ts +1339 -0
- package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
- package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
- package/src/resources/extensions/gsd/diff-context.ts +214 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +211 -0
- package/src/resources/extensions/gsd/docs/COORDINATION.md +42 -0
- package/src/resources/extensions/gsd/docs/claude-marketplace-import.md +214 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +755 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +5 -0
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +196 -0
- package/src/resources/extensions/gsd/doctor-environment.ts +643 -0
- package/src/resources/extensions/gsd/doctor-format.ts +99 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +622 -0
- package/src/resources/extensions/gsd/doctor-global-checks.ts +84 -0
- package/src/resources/extensions/gsd/doctor-proactive.ts +488 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +523 -0
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +793 -0
- package/src/resources/extensions/gsd/doctor-types.ts +134 -0
- package/src/resources/extensions/gsd/doctor.ts +802 -0
- package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +233 -0
- package/src/resources/extensions/gsd/ecosystem/loader.ts +201 -0
- package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
- package/src/resources/extensions/gsd/engine-types.ts +71 -0
- package/src/resources/extensions/gsd/env-utils.ts +31 -0
- package/src/resources/extensions/gsd/error-classifier.ts +188 -0
- package/src/resources/extensions/gsd/error-utils.ts +6 -0
- package/src/resources/extensions/gsd/errors.ts +29 -0
- package/src/resources/extensions/gsd/escalation.ts +369 -0
- package/src/resources/extensions/gsd/eval-review-schema.ts +243 -0
- package/src/resources/extensions/gsd/exec-history.ts +153 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +333 -0
- package/src/resources/extensions/gsd/execution-policy.ts +43 -0
- package/src/resources/extensions/gsd/exit-command.ts +30 -0
- package/src/resources/extensions/gsd/export-html.ts +1008 -0
- package/src/resources/extensions/gsd/export.ts +318 -0
- package/src/resources/extensions/gsd/extension-manifest.json +33 -0
- package/src/resources/extensions/gsd/file-lock.ts +132 -0
- package/src/resources/extensions/gsd/files.ts +1009 -0
- package/src/resources/extensions/gsd/forensics.ts +1342 -0
- package/src/resources/extensions/gsd/fresh-run-ui.ts +43 -0
- package/src/resources/extensions/gsd/gate-registry.ts +251 -0
- package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
- package/src/resources/extensions/gsd/git-constants.ts +41 -0
- package/src/resources/extensions/gsd/git-self-heal.ts +158 -0
- package/src/resources/extensions/gsd/git-service.ts +1412 -0
- package/src/resources/extensions/gsd/gitignore.ts +336 -0
- package/src/resources/extensions/gsd/graph-context.ts +212 -0
- package/src/resources/extensions/gsd/graph.ts +349 -0
- package/src/resources/extensions/gsd/gsd-command-home.ts +209 -0
- package/src/resources/extensions/gsd/gsd-db.ts +3190 -0
- package/src/resources/extensions/gsd/gsd-home.ts +30 -0
- package/src/resources/extensions/gsd/guided-flow-queue.ts +443 -0
- package/src/resources/extensions/gsd/guided-flow.ts +2887 -0
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/health-widget-core.ts +140 -0
- package/src/resources/extensions/gsd/health-widget.ts +148 -0
- package/src/resources/extensions/gsd/history.ts +144 -0
- package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
- package/src/resources/extensions/gsd/index.ts +37 -0
- package/src/resources/extensions/gsd/init-wizard.ts +704 -0
- package/src/resources/extensions/gsd/interrupted-session.ts +269 -0
- package/src/resources/extensions/gsd/journal.ts +218 -0
- package/src/resources/extensions/gsd/json-persistence.ts +78 -0
- package/src/resources/extensions/gsd/jsonl-utils.ts +21 -0
- package/src/resources/extensions/gsd/key-manager.ts +1018 -0
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +982 -0
- package/src/resources/extensions/gsd/marketplace-discovery.ts +508 -0
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +128 -0
- package/src/resources/extensions/gsd/md-importer.ts +748 -0
- package/src/resources/extensions/gsd/memory-backfill.ts +212 -0
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
- package/src/resources/extensions/gsd/memory-extractor.ts +434 -0
- package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
- package/src/resources/extensions/gsd/memory-relations.ts +240 -0
- package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
- package/src/resources/extensions/gsd/memory-store.ts +909 -0
- package/src/resources/extensions/gsd/metrics.ts +1040 -0
- package/src/resources/extensions/gsd/migrate/audit.ts +219 -0
- package/src/resources/extensions/gsd/migrate/command.ts +341 -0
- package/src/resources/extensions/gsd/migrate/index.ts +44 -0
- package/src/resources/extensions/gsd/migrate/parser.ts +323 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +676 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +58 -0
- package/src/resources/extensions/gsd/migrate/safety.ts +149 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +411 -0
- package/src/resources/extensions/gsd/migrate/types.ts +370 -0
- package/src/resources/extensions/gsd/migrate/validator.ts +55 -0
- package/src/resources/extensions/gsd/migrate/writer.ts +592 -0
- package/src/resources/extensions/gsd/migrate-external.ts +215 -0
- package/src/resources/extensions/gsd/migration-auto-check.ts +121 -0
- package/src/resources/extensions/gsd/milestone-actions.ts +193 -0
- package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
- package/src/resources/extensions/gsd/milestone-id-utils.ts +32 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +136 -0
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +373 -0
- package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +53 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +89 -0
- package/src/resources/extensions/gsd/model-router.ts +844 -0
- package/src/resources/extensions/gsd/namespaced-registry.ts +467 -0
- package/src/resources/extensions/gsd/namespaced-resolver.ts +307 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +1447 -0
- package/src/resources/extensions/gsd/native-parser-bridge.ts +267 -0
- package/src/resources/extensions/gsd/notification-overlay.ts +322 -0
- package/src/resources/extensions/gsd/notification-store.ts +342 -0
- package/src/resources/extensions/gsd/notification-widget.ts +69 -0
- package/src/resources/extensions/gsd/notifications.ts +153 -0
- package/src/resources/extensions/gsd/observability-validator.ts +456 -0
- package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
- package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
- package/src/resources/extensions/gsd/package.json +11 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +248 -0
- package/src/resources/extensions/gsd/parallel-merge.ts +270 -0
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +507 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +1077 -0
- package/src/resources/extensions/gsd/parsers-legacy.ts +292 -0
- package/src/resources/extensions/gsd/paths.ts +722 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +81 -0
- package/src/resources/extensions/gsd/phase-anchor.ts +71 -0
- package/src/resources/extensions/gsd/planning-depth.ts +137 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +45 -0
- package/src/resources/extensions/gsd/plugin-importer.ts +411 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +665 -0
- package/src/resources/extensions/gsd/post-unit-hooks.ts +86 -0
- package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +890 -0
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-models.ts +572 -0
- package/src/resources/extensions/gsd/preferences-skills.ts +147 -0
- package/src/resources/extensions/gsd/preferences-types.ts +579 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +1453 -0
- package/src/resources/extensions/gsd/preferences.ts +697 -0
- package/src/resources/extensions/gsd/preparation.ts +1419 -0
- package/src/resources/extensions/gsd/process-task-path.ts +81 -0
- package/src/resources/extensions/gsd/progress-score.ts +161 -0
- package/src/resources/extensions/gsd/project-research-policy.ts +259 -0
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +217 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +248 -0
- package/src/resources/extensions/gsd/prompt-ordering.ts +200 -0
- package/src/resources/extensions/gsd/prompt-validation.ts +157 -0
- package/src/resources/extensions/gsd/prompts/add-tests.md +36 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +91 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +49 -0
- package/src/resources/extensions/gsd/prompts/debug-diagnose.md +27 -0
- package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +252 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +368 -0
- package/src/resources/extensions/gsd/prompts/doctor-heal.md +31 -0
- package/src/resources/extensions/gsd/prompts/execute-task.md +73 -0
- package/src/resources/extensions/gsd/prompts/forensics.md +155 -0
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +32 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +116 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +113 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +99 -0
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +74 -0
- package/src/resources/extensions/gsd/prompts/guided-research-decision.md +70 -0
- package/src/resources/extensions/gsd/prompts/guided-research-project.md +102 -0
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +15 -0
- package/src/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
- package/src/resources/extensions/gsd/prompts/guided-workflow-preferences.md +68 -0
- package/src/resources/extensions/gsd/prompts/heal-skill.md +45 -0
- package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +28 -0
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +114 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +55 -0
- package/src/resources/extensions/gsd/prompts/queue.md +128 -0
- package/src/resources/extensions/gsd/prompts/quick-task.md +40 -0
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +44 -0
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +68 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +79 -0
- package/src/resources/extensions/gsd/prompts/replan-slice.md +39 -0
- package/src/resources/extensions/gsd/prompts/research-milestone.md +47 -0
- package/src/resources/extensions/gsd/prompts/research-slice.md +58 -0
- package/src/resources/extensions/gsd/prompts/rethink.md +95 -0
- package/src/resources/extensions/gsd/prompts/review-migration.md +66 -0
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +33 -0
- package/src/resources/extensions/gsd/prompts/run-uat.md +89 -0
- package/src/resources/extensions/gsd/prompts/scan.md +79 -0
- package/src/resources/extensions/gsd/prompts/system.md +180 -0
- package/src/resources/extensions/gsd/prompts/triage-captures.md +68 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +88 -0
- package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
- package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/src/resources/extensions/gsd/prompts/worktree-merge.md +125 -0
- package/src/resources/extensions/gsd/provider-error-pause.ts +49 -0
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/python-resolver.ts +76 -0
- package/src/resources/extensions/gsd/queue-order.ts +235 -0
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +295 -0
- package/src/resources/extensions/gsd/quick.ts +297 -0
- package/src/resources/extensions/gsd/reactive-graph.ts +337 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +139 -0
- package/src/resources/extensions/gsd/repo-identity.ts +683 -0
- package/src/resources/extensions/gsd/reports.ts +505 -0
- package/src/resources/extensions/gsd/repository-registry.ts +108 -0
- package/src/resources/extensions/gsd/rethink.ts +164 -0
- package/src/resources/extensions/gsd/roadmap-mutations.ts +134 -0
- package/src/resources/extensions/gsd/roadmap-slices.ts +294 -0
- package/src/resources/extensions/gsd/root-write-leak-guard.ts +101 -0
- package/src/resources/extensions/gsd/routing-history.ts +286 -0
- package/src/resources/extensions/gsd/rule-registry.ts +599 -0
- package/src/resources/extensions/gsd/rule-types.ts +68 -0
- package/src/resources/extensions/gsd/run-manager.ts +214 -0
- package/src/resources/extensions/gsd/safe-fs.ts +48 -0
- package/src/resources/extensions/gsd/safety/content-validator.ts +98 -0
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +49 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +265 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +155 -0
- package/src/resources/extensions/gsd/safety/file-change-validator.ts +124 -0
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +130 -0
- package/src/resources/extensions/gsd/safety/safety-harness.ts +114 -0
- package/src/resources/extensions/gsd/schemas/__fixtures__/valid-project.md +26 -0
- package/src/resources/extensions/gsd/schemas/__fixtures__/valid-requirements.md +57 -0
- package/src/resources/extensions/gsd/schemas/__fixtures__/valid-roadmap.md +19 -0
- package/src/resources/extensions/gsd/schemas/parsers.ts +346 -0
- package/src/resources/extensions/gsd/schemas/validate.ts +452 -0
- package/src/resources/extensions/gsd/service-tier.ts +199 -0
- package/src/resources/extensions/gsd/session-forensics.ts +580 -0
- package/src/resources/extensions/gsd/session-lock.ts +732 -0
- package/src/resources/extensions/gsd/session-model-override.ts +36 -0
- package/src/resources/extensions/gsd/session-status-io.ts +179 -0
- package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
- package/src/resources/extensions/gsd/shortcut-defs.ts +56 -0
- package/src/resources/extensions/gsd/skill-catalog.ts +1088 -0
- package/src/resources/extensions/gsd/skill-discovery.ts +157 -0
- package/src/resources/extensions/gsd/skill-health.ts +422 -0
- package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
- package/src/resources/extensions/gsd/skill-telemetry.ts +141 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +242 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +83 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +64 -0
- package/src/resources/extensions/gsd/skills/gsd-headless/references/multi-session.md +176 -0
- package/src/resources/extensions/gsd/slice-cadence.ts +411 -0
- package/src/resources/extensions/gsd/slice-parallel-conflict.ts +86 -0
- package/src/resources/extensions/gsd/slice-parallel-eligibility.ts +73 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +913 -0
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +417 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +66 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +101 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
- package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +65 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
- package/src/resources/extensions/gsd/state-reconciliation.ts +25 -0
- package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
- package/src/resources/extensions/gsd/state.ts +1730 -0
- package/src/resources/extensions/gsd/status-guards.ts +41 -0
- package/src/resources/extensions/gsd/structured-data-formatter.ts +146 -0
- package/src/resources/extensions/gsd/sync-lock.ts +152 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +101 -0
- package/src/resources/extensions/gsd/templates/context.md +108 -0
- package/src/resources/extensions/gsd/templates/decisions.md +8 -0
- package/src/resources/extensions/gsd/templates/knowledge.md +19 -0
- package/src/resources/extensions/gsd/templates/milestone-summary.md +81 -0
- package/src/resources/extensions/gsd/templates/milestone-validation.md +74 -0
- package/src/resources/extensions/gsd/templates/plan.md +152 -0
- package/src/resources/extensions/gsd/templates/project.md +41 -0
- package/src/resources/extensions/gsd/templates/reassessment.md +29 -0
- package/src/resources/extensions/gsd/templates/requirements.md +81 -0
- package/src/resources/extensions/gsd/templates/research.md +79 -0
- package/src/resources/extensions/gsd/templates/roadmap.md +131 -0
- package/src/resources/extensions/gsd/templates/runtime.md +21 -0
- package/src/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
- package/src/resources/extensions/gsd/templates/slice-context.md +58 -0
- package/src/resources/extensions/gsd/templates/slice-summary.md +108 -0
- package/src/resources/extensions/gsd/templates/state.md +17 -0
- package/src/resources/extensions/gsd/templates/task-plan.md +95 -0
- package/src/resources/extensions/gsd/templates/task-summary.md +66 -0
- package/src/resources/extensions/gsd/templates/uat.md +54 -0
- package/src/resources/extensions/gsd/tests/active-milestone-id-guard.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +524 -0
- package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/ask-user-questions-dedup.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/atomic-write.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +807 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +457 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +289 -0
- package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +190 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +5503 -0
- package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +742 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +479 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1300 -0
- package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +759 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +390 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1773 -0
- package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +277 -0
- package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +70 -0
- package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/auto-workers.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +80 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +143 -0
- package/src/resources/extensions/gsd/tests/block-db-writes.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +290 -0
- package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/capability-router.test.ts +371 -0
- package/src/resources/extensions/gsd/tests/captures.test.ts +524 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/claude-import-marketplace-discovery.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +350 -0
- package/src/resources/extensions/gsd/tests/claude-skill-dirs.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +509 -0
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/cmux.test.ts +333 -0
- package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +669 -0
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +506 -0
- package/src/resources/extensions/gsd/tests/collision-diagnostics.test.ts +705 -0
- package/src/resources/extensions/gsd/tests/command-queue.test.ts +141 -0
- package/src/resources/extensions/gsd/tests/commands-backlog.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/commands-config.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +188 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/commands-do.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +612 -0
- package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +663 -0
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/src/resources/extensions/gsd/tests/commands-pr-branch.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
- package/src/resources/extensions/gsd/tests/commands-session-report.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/commands-ship.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +311 -0
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +366 -0
- package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +743 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/complete-slice-gate-closure.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/complete-slice-prompt-task-summary-layout.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/complete-slice-string-coercion.test.ts +247 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +556 -0
- package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +513 -0
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +206 -0
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +582 -0
- package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +389 -0
- package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +715 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +185 -0
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +294 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +331 -0
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +709 -0
- package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +902 -0
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +415 -0
- package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +483 -0
- package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +360 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
- package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +130 -0
- package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +221 -0
- package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +980 -0
- package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +942 -0
- package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
- package/src/resources/extensions/gsd/tests/decision-scope-cascade.test.ts +370 -0
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +406 -0
- package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +923 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +1705 -0
- package/src/resources/extensions/gsd/tests/deep-project-setup-policy.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/defer-milestone-stamp.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/deferred-slice-dispatch.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/definition-io.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +762 -0
- package/src/resources/extensions/gsd/tests/delegation-policy.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +514 -0
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +1388 -0
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +641 -0
- package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +558 -0
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +1049 -0
- package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/detection.test.ts +1367 -0
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +314 -0
- package/src/resources/extensions/gsd/tests/diff-context.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/discuss-command-targeting-5471.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/dispatch-backgroundable-annotation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +276 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +446 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +279 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +358 -0
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +206 -0
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-fix-flag.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/doctor-heal-fixable-warnings.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +828 -0
- package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
- package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +531 -0
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +530 -0
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/escalation.test.ts +819 -0
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/eval-review-schema.test.ts +282 -0
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/exec-history.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +407 -0
- package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
- package/src/resources/extensions/gsd/tests/execute-task-prompt-existing-artifact-guard.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/export-html-all.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/file-lock.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
- package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
- package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/forensics-error-filter.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +215 -0
- package/src/resources/extensions/gsd/tests/format-shortcut.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +298 -0
- package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +246 -0
- package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +218 -0
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/gate-registry.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/graph-context.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
- package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1210 -0
- package/src/resources/extensions/gsd/tests/gsd-home.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
- package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +445 -0
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +140 -0
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/handler-worktree-write-isolation.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +130 -0
- package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +350 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/headless-query.test.ts +184 -0
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +251 -0
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +189 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/insert-slice-no-wipe.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/integration/atomic-task-closeout.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +966 -0
- package/src/resources/extensions/gsd/tests/integration/auto-secrets-gate.test.ts +194 -0
- package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +964 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +430 -0
- package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +256 -0
- package/src/resources/extensions/gsd/tests/integration/continue-here.test.ts +281 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-completion-deferral.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +243 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment-worktree.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-environment.test.ts +403 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +954 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +431 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-roadmap-summary-atomicity.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +549 -0
- package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +612 -0
- package/src/resources/extensions/gsd/tests/integration/e2e-workflow-pipeline-integration.test.ts +476 -0
- package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +415 -0
- package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +130 -0
- package/src/resources/extensions/gsd/tests/integration/git-self-heal.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +2040 -0
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
- package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +257 -0
- package/src/resources/extensions/gsd/tests/integration/headless-command.ts +534 -0
- package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/integration/inherited-repo-home-dir.test.ts +191 -0
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +274 -0
- package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +539 -0
- package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +634 -0
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +169 -0
- package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +77 -0
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +405 -0
- package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +669 -0
- package/src/resources/extensions/gsd/tests/integration/parallel-workers-multi-milestone-e2e.test.ts +337 -0
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/integration/plugin-importer-live.test.ts +481 -0
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +335 -0
- package/src/resources/extensions/gsd/tests/integration/quick-branch-lifecycle.test.ts +253 -0
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +689 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1356 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +980 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +832 -0
- package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +369 -0
- package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +248 -0
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +223 -0
- package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +119 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +241 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
- package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +1473 -0
- package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/journal.test.ts +373 -0
- package/src/resources/extensions/gsd/tests/json-persistence-atomic.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +501 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +434 -0
- package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/manifest-status.test.ts +274 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1292 -0
- package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +91 -0
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +416 -0
- package/src/resources/extensions/gsd/tests/measurement.test.ts +531 -0
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/memory-leak-guards.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +460 -0
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +327 -0
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +400 -0
- package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +141 -0
- package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +519 -0
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +782 -0
- package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +651 -0
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +448 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +347 -0
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +361 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/milestone-id-reservation.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +364 -0
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +206 -0
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +990 -0
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +278 -0
- package/src/resources/extensions/gsd/tests/namespaced-registry.test.ts +1027 -0
- package/src/resources/extensions/gsd/tests/namespaced-resolver.test.ts +671 -0
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +228 -0
- package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +200 -0
- package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/notifications.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +159 -0
- package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +374 -0
- package/src/resources/extensions/gsd/tests/overrides.test.ts +124 -0
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +330 -0
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +273 -0
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +736 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +332 -0
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +308 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +199 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +253 -0
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +420 -0
- package/src/resources/extensions/gsd/tests/parsers.test.ts +1892 -0
- package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/paths-cache.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +126 -0
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +404 -0
- package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-artifact-verification.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-queue-context.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +349 -0
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +474 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +306 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +712 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +183 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +172 -0
- package/src/resources/extensions/gsd/tests/plugin-importer.test.ts +1383 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +536 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +1065 -0
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +300 -0
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +567 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +149 -0
- package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +2246 -0
- package/src/resources/extensions/gsd/tests/pre-execution-fail-closed.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +708 -0
- package/src/resources/extensions/gsd/tests/preferences-formatting.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +1314 -0
- package/src/resources/extensions/gsd/tests/preflight-context-draft-filter.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +620 -0
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
- package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +35 -0
- package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +277 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +677 -0
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +326 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +574 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
- package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/prompt-loader-working-directory.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/prompt-system-gate-coverage.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +744 -0
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +344 -0
- package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +51 -0
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/rate-limit-model-fallback.test.ts +90 -0
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +511 -0
- package/src/resources/extensions/gsd/tests/reactive-graph.test.ts +363 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +728 -0
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +442 -0
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +126 -0
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +442 -0
- package/src/resources/extensions/gsd/tests/register-shortcuts.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +774 -0
- package/src/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +609 -0
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/requirements.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
- package/src/resources/extensions/gsd/tests/resolve-ts.mjs +9 -0
- package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +161 -0
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
- package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +399 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +464 -0
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +294 -0
- package/src/resources/extensions/gsd/tests/routing-history.test.ts +229 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +411 -0
- package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +94 -0
- package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +268 -0
- package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +364 -0
- package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +131 -0
- package/src/resources/extensions/gsd/tests/session-forensics-readonly-classification.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +166 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +379 -0
- package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +224 -0
- package/src/resources/extensions/gsd/tests/session-model-override.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +304 -0
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +182 -0
- package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +130 -0
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +244 -0
- package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +158 -0
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +352 -0
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/skill-lifecycle.test.ts +126 -0
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/skipped-validation-completion.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-eligibility.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +124 -0
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +45 -0
- package/src/resources/extensions/gsd/tests/stale-milestone-id-reservation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +334 -0
- package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +442 -0
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +424 -0
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1645 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1137 -0
- package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/status-db-open.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +285 -0
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +232 -0
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/subagent-agent-discovery.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +226 -0
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/symlink-extension-discovery.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +40 -0
- 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 +99 -0
- package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +162 -0
- package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/test-helpers.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/test-helpers.ts +214 -0
- package/src/resources/extensions/gsd/tests/test-utils.ts +165 -0
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +382 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +306 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +211 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +383 -0
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +138 -0
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +612 -0
- package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +330 -0
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +153 -0
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
- package/src/resources/extensions/gsd/tests/unborn-branch.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/undo.test.ts +462 -0
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +529 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +462 -0
- package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +326 -0
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +335 -0
- package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +245 -0
- package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/uok-flags.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +241 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/uok-preferences.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/update-command.test.ts +86 -0
- package/src/resources/extensions/gsd/tests/vacuous-truth-slices.test.ts +115 -0
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/validate-directory.test.ts +269 -0
- package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +300 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +371 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +766 -0
- package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +104 -0
- package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +178 -0
- package/src/resources/extensions/gsd/tests/validation.test.ts +72 -0
- package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +239 -0
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +601 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +1265 -0
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +204 -0
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +109 -0
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +359 -0
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +716 -0
- package/src/resources/extensions/gsd/tests/wave1-critical-regressions.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/wave2-events-regressions.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/wave3-session-regressions.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/wave4-write-safety-regressions.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/wave5-consistency-regressions.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +56 -0
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workflow-events.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +630 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-audit.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +92 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +411 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +336 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +771 -0
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +405 -0
- package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +91 -0
- package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +198 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1397 -0
- package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
- package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/workspace-index.test.ts +38 -0
- package/src/resources/extensions/gsd/tests/workspace.test.ts +196 -0
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +117 -0
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +219 -0
- package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +440 -0
- package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +207 -0
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +109 -0
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +181 -0
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +397 -0
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +992 -0
- package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +290 -0
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +110 -0
- package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +165 -0
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +206 -0
- package/src/resources/extensions/gsd/tests/worktree-root-resolution.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/worktree-root.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +417 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +228 -0
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +134 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +705 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +156 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +283 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +206 -0
- package/src/resources/extensions/gsd/tests/worktree.test.ts +304 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +476 -0
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +188 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +726 -0
- package/src/resources/extensions/gsd/tests/write-intercept.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +81 -0
- package/src/resources/extensions/gsd/token-counter.ts +83 -0
- package/src/resources/extensions/gsd/tool-contract.ts +82 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +273 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +568 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +473 -0
- package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
- package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +286 -0
- package/src/resources/extensions/gsd/tools/memory-tools.ts +427 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +370 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +443 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +161 -0
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +289 -0
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +152 -0
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +152 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +146 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +242 -0
- package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
- package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +301 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +991 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +578 -0
- package/src/resources/extensions/gsd/triage-ui.ts +196 -0
- package/src/resources/extensions/gsd/tui/render-kit.ts +153 -0
- package/src/resources/extensions/gsd/types.ts +721 -0
- package/src/resources/extensions/gsd/undo.ts +465 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +285 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +796 -0
- package/src/resources/extensions/gsd/unit-id.ts +14 -0
- package/src/resources/extensions/gsd/unit-ownership.ts +275 -0
- package/src/resources/extensions/gsd/unit-runtime.ts +267 -0
- package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +150 -0
- package/src/resources/extensions/gsd/uok/audit-toggle.ts +9 -0
- package/src/resources/extensions/gsd/uok/audit.ts +85 -0
- package/src/resources/extensions/gsd/uok/contracts.ts +306 -0
- package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +60 -0
- package/src/resources/extensions/gsd/uok/execution-graph.ts +263 -0
- package/src/resources/extensions/gsd/uok/flags.ts +45 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +206 -0
- package/src/resources/extensions/gsd/uok/gitops.ts +80 -0
- package/src/resources/extensions/gsd/uok/kernel.ts +124 -0
- package/src/resources/extensions/gsd/uok/loop-adapter.ts +212 -0
- package/src/resources/extensions/gsd/uok/model-policy.ts +112 -0
- package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +209 -0
- package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
- package/src/resources/extensions/gsd/uok/writer.ts +113 -0
- package/src/resources/extensions/gsd/user-input-boundary.ts +166 -0
- package/src/resources/extensions/gsd/validate-directory.ts +186 -0
- package/src/resources/extensions/gsd/validation-block-guard.ts +83 -0
- package/src/resources/extensions/gsd/validation.ts +45 -0
- package/src/resources/extensions/gsd/verdict-parser.ts +110 -0
- package/src/resources/extensions/gsd/verification-evidence.ts +270 -0
- package/src/resources/extensions/gsd/verification-gate.ts +848 -0
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +953 -0
- package/src/resources/extensions/gsd/visualizer-overlay.ts +570 -0
- package/src/resources/extensions/gsd/visualizer-views.ts +1229 -0
- package/src/resources/extensions/gsd/watch/header-renderer.ts +331 -0
- package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
- package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
- package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
- package/src/resources/extensions/gsd/workflow-events.ts +166 -0
- package/src/resources/extensions/gsd/workflow-install.ts +422 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +381 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +260 -0
- package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +60 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +459 -0
- package/src/resources/extensions/gsd/workflow-migration.ts +340 -0
- package/src/resources/extensions/gsd/workflow-plugins.ts +402 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +567 -0
- package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +681 -0
- package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +88 -0
- package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
- package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +75 -0
- package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
- package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +42 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +46 -0
- package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
- package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
- package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +84 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +269 -0
- package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
- package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +82 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +76 -0
- package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +278 -0
- package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
- package/src/resources/extensions/gsd/workspace-index.ts +277 -0
- package/src/resources/extensions/gsd/workspace.ts +95 -0
- package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
- package/src/resources/extensions/gsd/worktree-command.ts +834 -0
- package/src/resources/extensions/gsd/worktree-health.ts +178 -0
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +1989 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +909 -0
- package/src/resources/extensions/gsd/worktree-root.ts +182 -0
- package/src/resources/extensions/gsd/worktree-safety.ts +329 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +447 -0
- package/src/resources/extensions/gsd/worktree-telemetry.ts +366 -0
- package/src/resources/extensions/gsd/worktree.ts +235 -0
- package/src/resources/extensions/gsd/write-intercept.ts +99 -0
- package/src/resources/extensions/mac-tools/extension-manifest.json +16 -0
- package/src/resources/extensions/mac-tools/index.ts +852 -0
- package/src/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
- package/src/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
- package/src/resources/extensions/mcp-client/auth.ts +160 -0
- package/src/resources/extensions/mcp-client/index.ts +526 -0
- package/src/resources/extensions/mcp-client/manager.ts +516 -0
- package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
- package/src/resources/extensions/mcp-client/tests/manager.test.ts +165 -0
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +89 -0
- package/src/resources/extensions/ollama/index.ts +158 -0
- package/src/resources/extensions/ollama/model-capabilities.ts +186 -0
- package/src/resources/extensions/ollama/ndjson-stream.ts +63 -0
- package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +128 -0
- package/src/resources/extensions/ollama/ollama-chat-provider.ts +459 -0
- package/src/resources/extensions/ollama/ollama-client.ts +262 -0
- package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
- package/src/resources/extensions/ollama/ollama-discovery.ts +134 -0
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +215 -0
- package/src/resources/extensions/ollama/ollama-tool.ts +287 -0
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +258 -0
- package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +82 -0
- package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +55 -0
- package/src/resources/extensions/ollama/thinking-parser.ts +116 -0
- package/src/resources/extensions/ollama/types.ts +153 -0
- package/src/resources/extensions/package.json +3 -0
- package/src/resources/extensions/remote-questions/commands.ts +480 -0
- package/src/resources/extensions/remote-questions/config.ts +126 -0
- package/src/resources/extensions/remote-questions/discord-adapter.ts +148 -0
- package/src/resources/extensions/remote-questions/extension-manifest.json +11 -0
- package/src/resources/extensions/remote-questions/format.ts +315 -0
- package/src/resources/extensions/remote-questions/http-client.ts +76 -0
- package/src/resources/extensions/remote-questions/manager.ts +270 -0
- package/src/resources/extensions/remote-questions/mod.ts +16 -0
- package/src/resources/extensions/remote-questions/notify.ts +90 -0
- package/src/resources/extensions/remote-questions/remote-command.ts +437 -0
- package/src/resources/extensions/remote-questions/slack-adapter.ts +141 -0
- package/src/resources/extensions/remote-questions/status.ts +31 -0
- package/src/resources/extensions/remote-questions/store.ts +81 -0
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +231 -0
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +256 -0
- package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
- package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
- package/src/resources/extensions/remote-questions/types.ts +102 -0
- package/src/resources/extensions/search-the-web/cache.ts +78 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +105 -0
- package/src/resources/extensions/search-the-web/extension-manifest.json +13 -0
- package/src/resources/extensions/search-the-web/format.ts +258 -0
- package/src/resources/extensions/search-the-web/http.ts +238 -0
- package/src/resources/extensions/search-the-web/index.ts +64 -0
- package/src/resources/extensions/search-the-web/native-search.ts +276 -0
- package/src/resources/extensions/search-the-web/provider.ts +150 -0
- package/src/resources/extensions/search-the-web/tavily.ts +116 -0
- package/src/resources/extensions/search-the-web/tool-fetch-page.ts +589 -0
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +608 -0
- package/src/resources/extensions/search-the-web/tool-search.ts +677 -0
- package/src/resources/extensions/search-the-web/url-utils.ts +144 -0
- package/src/resources/extensions/shared/cmux-events.ts +59 -0
- package/src/resources/extensions/shared/confirm-ui.ts +126 -0
- package/src/resources/extensions/shared/format-utils.ts +99 -0
- package/src/resources/extensions/shared/frontmatter.ts +117 -0
- package/src/resources/extensions/shared/gsd-phase-state.ts +95 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +848 -0
- package/src/resources/extensions/shared/layout-utils.ts +75 -0
- package/src/resources/extensions/shared/mod.ts +31 -0
- package/src/resources/extensions/shared/next-action-ui.ts +226 -0
- package/src/resources/extensions/shared/path-display.ts +19 -0
- package/src/resources/extensions/shared/rtk-session-stats.ts +248 -0
- package/src/resources/extensions/shared/rtk-shared.ts +58 -0
- package/src/resources/extensions/shared/rtk.ts +98 -0
- package/src/resources/extensions/shared/sanitize.ts +55 -0
- package/src/resources/extensions/shared/terminal.ts +28 -0
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +161 -0
- package/src/resources/extensions/shared/tests/format-utils.test.ts +155 -0
- package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +90 -0
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +198 -0
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +185 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +144 -0
- package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
- package/src/resources/extensions/shared/tui.ts +11 -0
- package/src/resources/extensions/shared/ui.ts +401 -0
- package/src/resources/extensions/slash-commands/audit.ts +89 -0
- package/src/resources/extensions/slash-commands/clear.ts +10 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +311 -0
- package/src/resources/extensions/slash-commands/create-slash-command.ts +234 -0
- package/src/resources/extensions/slash-commands/extension-manifest.json +11 -0
- package/src/resources/extensions/slash-commands/index.ts +12 -0
- package/src/resources/extensions/subagent/agents.ts +166 -0
- package/src/resources/extensions/subagent/extension-manifest.json +13 -0
- package/src/resources/extensions/subagent/index.ts +1938 -0
- package/src/resources/extensions/subagent/isolation.ts +504 -0
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/agents-conflicts.test.ts +33 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/model-override.test.ts +55 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/subagent/worker-registry.ts +100 -0
- package/src/resources/extensions/ttsr/extension-manifest.json +11 -0
- package/src/resources/extensions/ttsr/index.ts +168 -0
- package/src/resources/extensions/ttsr/rule-loader.ts +75 -0
- package/src/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +465 -0
- package/src/resources/extensions/universal-config/discovery.ts +104 -0
- package/src/resources/extensions/universal-config/extension-manifest.json +13 -0
- package/src/resources/extensions/universal-config/format.ts +191 -0
- package/src/resources/extensions/universal-config/index.ts +120 -0
- package/src/resources/extensions/universal-config/package.json +11 -0
- package/src/resources/extensions/universal-config/scanners.ts +642 -0
- package/src/resources/extensions/universal-config/tests/discovery.test.ts +119 -0
- package/src/resources/extensions/universal-config/tests/format.test.ts +127 -0
- package/src/resources/extensions/universal-config/tests/scanners.test.ts +456 -0
- package/src/resources/extensions/universal-config/tools.ts +60 -0
- package/src/resources/extensions/universal-config/types.ts +135 -0
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/src/resources/extensions/voice/extension-manifest.json +12 -0
- package/src/resources/extensions/voice/index.ts +264 -0
- package/src/resources/extensions/voice/linux-ready.ts +86 -0
- package/src/resources/extensions/voice/speech-recognizer.py +504 -0
- package/src/resources/extensions/voice/speech-recognizer.swift +154 -0
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +140 -0
- package/src/resources/skills/accessibility/SKILL.md +522 -0
- package/src/resources/skills/accessibility/references/WCAG.md +162 -0
- package/src/resources/skills/agent-browser/SKILL.md +517 -0
- package/src/resources/skills/agent-browser/references/authentication.md +202 -0
- package/src/resources/skills/agent-browser/references/commands.md +263 -0
- package/src/resources/skills/agent-browser/references/profiling.md +120 -0
- package/src/resources/skills/agent-browser/references/proxy-support.md +194 -0
- package/src/resources/skills/agent-browser/references/session-management.md +193 -0
- package/src/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/src/resources/skills/agent-browser/references/video-recording.md +173 -0
- package/src/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/src/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/src/resources/skills/agent-browser/templates/form-automation.sh +62 -0
- package/src/resources/skills/api-design/SKILL.md +190 -0
- package/src/resources/skills/best-practices/SKILL.md +583 -0
- package/src/resources/skills/btw/SKILL.md +42 -0
- package/src/resources/skills/code-optimizer/SKILL.md +160 -0
- package/src/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
- package/src/resources/skills/code-optimizer/references/build-compilation.md +90 -0
- package/src/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
- package/src/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
- package/src/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
- package/src/resources/skills/code-optimizer/references/config-infra.md +71 -0
- package/src/resources/skills/code-optimizer/references/data-structures.md +80 -0
- package/src/resources/skills/code-optimizer/references/database-queries.md +76 -0
- package/src/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
- package/src/resources/skills/code-optimizer/references/error-resilience.md +80 -0
- package/src/resources/skills/code-optimizer/references/io-network.md +89 -0
- package/src/resources/skills/code-optimizer/references/logging-observability.md +64 -0
- package/src/resources/skills/code-optimizer/references/memory-resources.md +66 -0
- package/src/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
- package/src/resources/skills/code-optimizer/references/security-performance.md +68 -0
- package/src/resources/skills/core-web-vitals/SKILL.md +441 -0
- package/src/resources/skills/core-web-vitals/references/LCP.md +208 -0
- package/src/resources/skills/create-gsd-extension/SKILL.md +93 -0
- package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +37 -0
- package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +104 -0
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +176 -0
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +76 -0
- package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
- package/src/resources/skills/create-skill/SKILL.md +186 -0
- package/src/resources/skills/create-skill/references/api-security.md +226 -0
- package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/src/resources/skills/create-skill/references/core-principles.md +437 -0
- package/src/resources/skills/create-skill/references/executable-code.md +175 -0
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/src/resources/skills/create-skill/references/using-templates.md +112 -0
- package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/src/resources/skills/create-workflow/SKILL.md +130 -0
- package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
- package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
- package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
- package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
- package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
- package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
- package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
- package/src/resources/skills/debug-like-expert/SKILL.md +231 -0
- package/src/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
- package/src/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
- package/src/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
- package/src/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
- package/src/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
- package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
- package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
- package/src/resources/skills/design-an-interface/SKILL.md +102 -0
- package/src/resources/skills/forensics/SKILL.md +153 -0
- package/src/resources/skills/frontend-design/SKILL.md +45 -0
- package/src/resources/skills/github-workflows/SKILL.md +90 -0
- package/src/resources/skills/github-workflows/references/gh/SKILL.md +276 -0
- package/src/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
- package/src/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
- package/src/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
- package/src/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
- package/src/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
- package/src/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
- package/src/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/src/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
- package/src/resources/skills/grill-me/SKILL.md +93 -0
- package/src/resources/skills/handoff/SKILL.md +121 -0
- package/src/resources/skills/lint/SKILL.md +145 -0
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
- package/src/resources/skills/make-interfaces-feel-better/animations.md +379 -0
- package/src/resources/skills/make-interfaces-feel-better/performance.md +88 -0
- package/src/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
- package/src/resources/skills/make-interfaces-feel-better/typography.md +123 -0
- package/src/resources/skills/observability/SKILL.md +174 -0
- package/src/resources/skills/react-best-practices/README.md +123 -0
- package/src/resources/skills/react-best-practices/SKILL.md +136 -0
- package/src/resources/skills/react-best-practices/metadata.json +15 -0
- package/src/resources/skills/react-best-practices/rules/_sections.md +46 -0
- package/src/resources/skills/react-best-practices/rules/_template.md +28 -0
- package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/src/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/src/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/src/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
- package/src/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/src/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/src/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/src/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/src/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/src/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
- package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/src/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
- package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/src/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/src/resources/skills/review/SKILL.md +218 -0
- package/src/resources/skills/security-review/SKILL.md +181 -0
- package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
- package/src/resources/skills/tdd/SKILL.md +112 -0
- package/src/resources/skills/test/SKILL.md +204 -0
- package/src/resources/skills/userinterface-wiki/SKILL.md +253 -0
- package/src/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
- package/src/resources/skills/userinterface-wiki/rules/_template.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
- package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
- package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
- package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
- package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
- package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
- package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
- package/src/resources/skills/verify-before-complete/SKILL.md +98 -0
- package/src/resources/skills/web-design-guidelines/SKILL.md +39 -0
- package/src/resources/skills/web-quality-audit/SKILL.md +168 -0
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
- package/src/resources/skills/write-docs/SKILL.md +82 -0
- package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
|
@@ -0,0 +1,2570 @@
|
|
|
1
|
+
// Project/App: GSD-2
|
|
2
|
+
// File Purpose: Auto-mode worktree lifecycle, merge, and cleanup management.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* GSD Auto-Worktree -- lifecycle management for auto-mode worktrees.
|
|
6
|
+
*
|
|
7
|
+
* Auto-mode creates worktrees with `milestone/<MID>` branches (distinct from
|
|
8
|
+
* manual `/worktree` which uses `worktree/<name>` branches). This module
|
|
9
|
+
* manages create, enter, detect, and teardown for auto-mode worktrees.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
existsSync,
|
|
14
|
+
cpSync,
|
|
15
|
+
readFileSync,
|
|
16
|
+
readdirSync,
|
|
17
|
+
mkdirSync,
|
|
18
|
+
realpathSync,
|
|
19
|
+
rmSync,
|
|
20
|
+
unlinkSync,
|
|
21
|
+
lstatSync as lstatSyncFn,
|
|
22
|
+
} from "node:fs";
|
|
23
|
+
import { isAbsolute, join, relative, resolve, sep as pathSep } from "node:path";
|
|
24
|
+
import { GSDError, GSD_IO_ERROR, GSD_GIT_ERROR } from "./errors.js";
|
|
25
|
+
import {
|
|
26
|
+
reconcileWorktreeDb,
|
|
27
|
+
isDbAvailable,
|
|
28
|
+
getMilestone,
|
|
29
|
+
getMilestoneSlices,
|
|
30
|
+
getSliceTasks,
|
|
31
|
+
closeDatabase,
|
|
32
|
+
openDatabase,
|
|
33
|
+
getDbPath,
|
|
34
|
+
} from "./gsd-db.js";
|
|
35
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
36
|
+
import { execFileSync } from "node:child_process";
|
|
37
|
+
import { gsdRoot, resolveGsdPathContract } from "./paths.js";
|
|
38
|
+
import {
|
|
39
|
+
createWorktree,
|
|
40
|
+
removeWorktree,
|
|
41
|
+
resolveGitDir,
|
|
42
|
+
worktreePath,
|
|
43
|
+
isInsideWorktreesDir,
|
|
44
|
+
} from "./worktree-manager.js";
|
|
45
|
+
import {
|
|
46
|
+
detectWorktreeName,
|
|
47
|
+
resolveGitHeadPath,
|
|
48
|
+
nudgeGitBranchCache,
|
|
49
|
+
} from "./worktree.js";
|
|
50
|
+
import {
|
|
51
|
+
isGsdWorktreePath,
|
|
52
|
+
normalizeWorktreePathForCompare,
|
|
53
|
+
resolveWorktreeProjectRoot,
|
|
54
|
+
} from "./worktree-root.js";
|
|
55
|
+
import { MergeConflictError, createDraftPR, readIntegrationBranch, resolveMilestoneIntegrationBranch, RUNTIME_EXCLUSION_PATHS } from "./git-service.js";
|
|
56
|
+
import { buildPrEvidence } from "./pr-evidence.js";
|
|
57
|
+
import { debugLog } from "./debug-logger.js";
|
|
58
|
+
import { logWarning, logError } from "./workflow-logger.js";
|
|
59
|
+
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
60
|
+
import { MILESTONE_ID_RE } from "./milestone-ids.js";
|
|
61
|
+
import {
|
|
62
|
+
nativeGetCurrentBranch,
|
|
63
|
+
nativeDetectMainBranch,
|
|
64
|
+
nativeWorkingTreeStatus,
|
|
65
|
+
nativeAddAllWithExclusions,
|
|
66
|
+
nativeCommit,
|
|
67
|
+
nativeCheckoutBranch,
|
|
68
|
+
nativeMergeSquash,
|
|
69
|
+
nativeConflictFiles,
|
|
70
|
+
nativeCheckoutTheirs,
|
|
71
|
+
nativeAddPaths,
|
|
72
|
+
nativeRmForce,
|
|
73
|
+
nativeBranchDelete,
|
|
74
|
+
nativeBranchForceReset,
|
|
75
|
+
nativeBranchExists,
|
|
76
|
+
nativeDiffNumstat,
|
|
77
|
+
nativeUpdateRef,
|
|
78
|
+
nativeIsAncestor,
|
|
79
|
+
nativeMergeAbort,
|
|
80
|
+
nativeWorktreeList,
|
|
81
|
+
nativeLsFiles,
|
|
82
|
+
} from "./native-git-bridge.js";
|
|
83
|
+
import { gsdHome } from "./gsd-home.js";
|
|
84
|
+
import { type MilestoneScope, type GsdWorkspace, createWorkspace } from "./workspace.js";
|
|
85
|
+
import {
|
|
86
|
+
_finalizeProjectionForMergeImpl,
|
|
87
|
+
_projectRootToWorktreeImpl,
|
|
88
|
+
_projectWorktreeToRootImpl,
|
|
89
|
+
} from "./worktree-state-projection.js";
|
|
90
|
+
|
|
91
|
+
const PROJECT_PREFERENCES_FILE = "PREFERENCES.md";
|
|
92
|
+
const LEGACY_PROJECT_PREFERENCES_FILE = "preferences.md";
|
|
93
|
+
const LEGACY_DEEP_SETUP_RUNTIME_UNIT_FILES = new Set([
|
|
94
|
+
"workflow-preferences-WORKFLOW-PREFS.json",
|
|
95
|
+
"discuss-project-PROJECT.json",
|
|
96
|
+
"discuss-requirements-REQUIREMENTS.json",
|
|
97
|
+
"research-decision-RESEARCH-DECISION.json",
|
|
98
|
+
"research-project-RESEARCH-PROJECT.json",
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
// ─── Shared Constants & Helpers ─────────────────────────────────────────────
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Root-level .gsd/ projections copied from project root into worktrees for
|
|
105
|
+
* compatibility. Project root remains the canonical state/projection root.
|
|
106
|
+
*/
|
|
107
|
+
const ROOT_STATE_FILES = [
|
|
108
|
+
"DECISIONS.md",
|
|
109
|
+
"REQUIREMENTS.md",
|
|
110
|
+
"PROJECT.md",
|
|
111
|
+
"KNOWLEDGE.md",
|
|
112
|
+
"OVERRIDES.md",
|
|
113
|
+
"QUEUE.md",
|
|
114
|
+
"completed-units.json",
|
|
115
|
+
"metrics.json",
|
|
116
|
+
"mcp.json",
|
|
117
|
+
// NOTE: project preferences are intentionally NOT in ROOT_STATE_FILES.
|
|
118
|
+
// Forward-sync (main → worktree) is handled explicitly in syncGsdStateToWorktree().
|
|
119
|
+
// Back-sync (worktree → main) must NEVER overwrite the project root's copy
|
|
120
|
+
// because the project root is authoritative for preferences (#2684).
|
|
121
|
+
] as const;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Pop a stash entry by tracking the unique marker embedded in its message so
|
|
125
|
+
* concurrent stash operations against the same project root cannot cause us to
|
|
126
|
+
* pop the wrong entry.
|
|
127
|
+
*
|
|
128
|
+
* If `stashMarker` is null or no longer present in the stash list (e.g. a
|
|
129
|
+
* concurrent process popped/dropped it), leaves the stash list untouched and
|
|
130
|
+
* returns null.
|
|
131
|
+
*
|
|
132
|
+
* Throws on pop failure so callers can handle conflict cases the same way
|
|
133
|
+
* they would with the prior `git stash pop` form. When throwing after a
|
|
134
|
+
* targeted pop attempt, the error is annotated with the targeted stash ref.
|
|
135
|
+
*
|
|
136
|
+
* (Issue #4980 HIGH-6)
|
|
137
|
+
*/
|
|
138
|
+
function popStashByRef(basePath: string, stashMarker: string | null): string | null {
|
|
139
|
+
let popArg: string | null = null;
|
|
140
|
+
if (stashMarker) {
|
|
141
|
+
try {
|
|
142
|
+
const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
|
|
143
|
+
cwd: basePath,
|
|
144
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
145
|
+
encoding: "utf-8",
|
|
146
|
+
}).trim().split("\n").filter(Boolean);
|
|
147
|
+
for (const entry of list) {
|
|
148
|
+
const [ref, subject] = entry.split("\0");
|
|
149
|
+
if (ref && subject?.includes(stashMarker)) {
|
|
150
|
+
popArg = ref;
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
logWarning("worktree", `stash list lookup failed; leaving stash untouched: ${err instanceof Error ? err.message : String(err)}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (!popArg) {
|
|
159
|
+
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic pop");
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
execFileSync("git", ["stash", "pop", popArg], {
|
|
164
|
+
cwd: basePath,
|
|
165
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
166
|
+
encoding: "utf-8",
|
|
167
|
+
});
|
|
168
|
+
} catch (err) {
|
|
169
|
+
if (err && typeof err === "object") {
|
|
170
|
+
(err as { stashRef?: string }).stashRef = popArg;
|
|
171
|
+
}
|
|
172
|
+
throw err;
|
|
173
|
+
}
|
|
174
|
+
return popArg;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Extract a stash ref annotation injected by popStashByRef() when git stash
|
|
179
|
+
* pop fails and we need to conditionally drop the exact stash entry later.
|
|
180
|
+
*/
|
|
181
|
+
function stashRefFromError(err: unknown): string | null {
|
|
182
|
+
if (!err || typeof err !== "object") return null;
|
|
183
|
+
const stashRef = (err as { stashRef?: unknown }).stashRef;
|
|
184
|
+
return typeof stashRef === "string" && stashRef.length > 0 ? stashRef : null;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function stashAlreadyExistsFilesFromError(err: unknown): string[] {
|
|
188
|
+
if (!err || typeof err !== "object") return [];
|
|
189
|
+
const stderr = (err as { stderr?: unknown }).stderr;
|
|
190
|
+
const stderrText = typeof stderr === "string"
|
|
191
|
+
? stderr
|
|
192
|
+
: stderr instanceof Uint8Array
|
|
193
|
+
? Buffer.from(stderr).toString("utf-8")
|
|
194
|
+
: "";
|
|
195
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
196
|
+
const text = `${stderrText}\n${message}`;
|
|
197
|
+
const files = new Set<string>();
|
|
198
|
+
for (const line of text.split("\n")) {
|
|
199
|
+
const m = line.match(/^(.*?)\s+already exists, no checkout\s*$/i);
|
|
200
|
+
if (!m) continue;
|
|
201
|
+
const filePath = m[1]?.trim();
|
|
202
|
+
if (filePath) files.add(filePath);
|
|
203
|
+
}
|
|
204
|
+
return [...files];
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Detect whether an on-disk file still contains unresolved merge conflict
|
|
209
|
+
* markers from a failed stash-pop or merge attempt.
|
|
210
|
+
*
|
|
211
|
+
* Returns false when the file cannot be read.
|
|
212
|
+
*/
|
|
213
|
+
function hasConflictMarkers(filePath: string): boolean {
|
|
214
|
+
try {
|
|
215
|
+
const content = readFileSync(filePath, "utf-8");
|
|
216
|
+
return content.includes("<<<<<<<") && content.includes("=======") && content.includes(">>>>>>>");
|
|
217
|
+
} catch {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Check if two filesystem paths resolve to the same real location.
|
|
224
|
+
* Returns false if either path cannot be resolved (e.g. doesn't exist).
|
|
225
|
+
*/
|
|
226
|
+
function isSamePath(a: string, b: string): boolean {
|
|
227
|
+
try {
|
|
228
|
+
return realpathSync(a) === realpathSync(b);
|
|
229
|
+
} catch (e) {
|
|
230
|
+
if ((e as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
231
|
+
logWarning("worktree", `isSamePath failed: ${(e as Error).message}`);
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export function _isSamePath(a: string, b: string): boolean {
|
|
237
|
+
return isSamePath(a, b);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function _resolveAutoWorktreeStartPoint(
|
|
241
|
+
integrationBranch: string | null | undefined,
|
|
242
|
+
gitMainBranch: string | null | undefined,
|
|
243
|
+
branchExists: (branch: string) => boolean,
|
|
244
|
+
): string | undefined {
|
|
245
|
+
if (integrationBranch) return integrationBranch;
|
|
246
|
+
return gitMainBranch &&
|
|
247
|
+
typeof gitMainBranch === "string" &&
|
|
248
|
+
gitMainBranch.length > 0 &&
|
|
249
|
+
branchExists(gitMainBranch)
|
|
250
|
+
? gitMainBranch
|
|
251
|
+
: undefined;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export function _shouldReconcileWorktreeDb(
|
|
255
|
+
worktreeDbPath: string,
|
|
256
|
+
mainDbPath: string,
|
|
257
|
+
pathExists: (path: string) => boolean = existsSync,
|
|
258
|
+
samePath: (a: string, b: string) => boolean = isSamePath,
|
|
259
|
+
): boolean {
|
|
260
|
+
return pathExists(worktreeDbPath) && !samePath(worktreeDbPath, mainDbPath);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function _isExpectedWorktreeUnlinkError(
|
|
264
|
+
code: string | undefined,
|
|
265
|
+
): boolean {
|
|
266
|
+
return code === "ENOENT" || code === "EISDIR";
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function stripGsdDisplayPrefix(value: string | undefined | null, id: string): string | undefined {
|
|
270
|
+
const raw = String(value ?? "").trim();
|
|
271
|
+
if (!raw) return undefined;
|
|
272
|
+
const lower = raw.toLowerCase();
|
|
273
|
+
const idLower = id.toLowerCase();
|
|
274
|
+
if (lower.startsWith(`${idLower}:`)) return raw.slice(id.length + 1).trim() || undefined;
|
|
275
|
+
return raw;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ─── Module State ──────────────────────────────────────────────────────────
|
|
279
|
+
|
|
280
|
+
/** Active workspace registry — replaces the legacy `originalBase` singleton. */
|
|
281
|
+
let activeWorkspace: GsdWorkspace | null = null;
|
|
282
|
+
|
|
283
|
+
function setActiveWorkspace(ws: GsdWorkspace | null): void {
|
|
284
|
+
activeWorkspace = ws;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function getActiveWorkspace(): GsdWorkspace | null {
|
|
288
|
+
return activeWorkspace;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function gitPathspecForWorktreePath(basePath: string, targetPath: string): string | null {
|
|
292
|
+
let base = basePath;
|
|
293
|
+
let target = targetPath;
|
|
294
|
+
try {
|
|
295
|
+
base = execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
296
|
+
cwd: basePath,
|
|
297
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
298
|
+
encoding: "utf-8",
|
|
299
|
+
}).trim() || basePath;
|
|
300
|
+
} catch {
|
|
301
|
+
/* keep original */
|
|
302
|
+
void base;
|
|
303
|
+
}
|
|
304
|
+
try {
|
|
305
|
+
base = realpathSync.native(base);
|
|
306
|
+
} catch {
|
|
307
|
+
/* keep original */
|
|
308
|
+
void base;
|
|
309
|
+
}
|
|
310
|
+
try {
|
|
311
|
+
target = realpathSync.native(targetPath);
|
|
312
|
+
} catch {
|
|
313
|
+
/* keep original */
|
|
314
|
+
void target;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const rel = relative(base, target);
|
|
318
|
+
if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) return null;
|
|
319
|
+
return rel.replaceAll("\\", "/");
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
export function _gitPathspecForWorktreePath(basePath: string, targetPath: string): string | null {
|
|
323
|
+
return gitPathspecForWorktreePath(basePath, targetPath);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function gitRemoteExists(basePath: string, remote: string): boolean {
|
|
327
|
+
try {
|
|
328
|
+
execFileSync("git", ["remote", "get-url", remote], {
|
|
329
|
+
cwd: basePath,
|
|
330
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
331
|
+
encoding: "utf-8",
|
|
332
|
+
});
|
|
333
|
+
return true;
|
|
334
|
+
} catch {
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function findRegularMergeChangedPaths(basePath: string, milestoneBranch: string, mainBranch: string): Set<string> {
|
|
340
|
+
const changedPaths = new Set<string>();
|
|
341
|
+
let mergeLog = "";
|
|
342
|
+
try {
|
|
343
|
+
mergeLog = execFileSync("git", ["rev-list", "--merges", "--parents", mainBranch], {
|
|
344
|
+
cwd: basePath,
|
|
345
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
346
|
+
encoding: "utf-8",
|
|
347
|
+
}).trim();
|
|
348
|
+
} catch (err) {
|
|
349
|
+
logWarning("worktree", `regular merge lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
350
|
+
return changedPaths;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
for (const line of mergeLog.split("\n").filter(Boolean)) {
|
|
354
|
+
const [mergeCommit, firstParent, ...otherParents] = line.split(" ");
|
|
355
|
+
if (!mergeCommit || !firstParent || otherParents.length === 0) continue;
|
|
356
|
+
const mergedMilestone = otherParents.some((parent) => {
|
|
357
|
+
try {
|
|
358
|
+
return nativeIsAncestor(basePath, milestoneBranch, parent);
|
|
359
|
+
} catch {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
if (!mergedMilestone) continue;
|
|
364
|
+
|
|
365
|
+
try {
|
|
366
|
+
const output = execFileSync("git", ["diff", "--name-only", firstParent, mergeCommit], {
|
|
367
|
+
cwd: basePath,
|
|
368
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
369
|
+
encoding: "utf-8",
|
|
370
|
+
}).trim();
|
|
371
|
+
for (const path of output.split("\n").filter(Boolean)) {
|
|
372
|
+
if (!path.startsWith(".gsd/")) changedPaths.add(path);
|
|
373
|
+
}
|
|
374
|
+
} catch (err) {
|
|
375
|
+
logWarning("worktree", `regular merge diff lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
376
|
+
}
|
|
377
|
+
return changedPaths;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return changedPaths;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
function clearProjectRootStateFiles(basePath: string, milestoneId: string): void {
|
|
384
|
+
const gsdDir = gsdRoot(basePath);
|
|
385
|
+
// Phase C pt 2: auto.lock removed from this list — the file is gone
|
|
386
|
+
// (migrated to the workers + unit_dispatches + runtime_kv tables). The
|
|
387
|
+
// remaining transient files (STATE.md, {MID}-META.json) are still
|
|
388
|
+
// worth removing on teardown.
|
|
389
|
+
const transientFiles = [
|
|
390
|
+
join(gsdDir, "STATE.md"),
|
|
391
|
+
join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
|
|
392
|
+
];
|
|
393
|
+
|
|
394
|
+
for (const file of transientFiles) {
|
|
395
|
+
try {
|
|
396
|
+
unlinkSync(file);
|
|
397
|
+
} catch (err) {
|
|
398
|
+
// ENOENT is expected — file may not exist (#3597)
|
|
399
|
+
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
400
|
+
logWarning("worktree", `file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// Clean up legacy synced milestone directories and runtime/units.
|
|
406
|
+
// Older versions copied these into the project root during execution.
|
|
407
|
+
// If they remain as untracked files when we attempt
|
|
408
|
+
// `git merge --squash`, git rejects the merge with "local changes would
|
|
409
|
+
// be overwritten", causing silent data loss (#1738).
|
|
410
|
+
const syncedDirs = [
|
|
411
|
+
join(gsdDir, "milestones", milestoneId),
|
|
412
|
+
join(gsdDir, "runtime", "units"),
|
|
413
|
+
];
|
|
414
|
+
|
|
415
|
+
for (const dir of syncedDirs) {
|
|
416
|
+
try {
|
|
417
|
+
if (existsSync(dir)) {
|
|
418
|
+
const pathspec = gitPathspecForWorktreePath(basePath, dir);
|
|
419
|
+
if (!pathspec) continue;
|
|
420
|
+
|
|
421
|
+
// Only remove files that are untracked by git — tracked files are
|
|
422
|
+
// managed by the branch checkout and should not be deleted.
|
|
423
|
+
const untrackedOutput = execFileSync(
|
|
424
|
+
"git",
|
|
425
|
+
["ls-files", "--others", "--exclude-standard", pathspec],
|
|
426
|
+
{ cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
427
|
+
).trim();
|
|
428
|
+
if (untrackedOutput) {
|
|
429
|
+
for (const f of untrackedOutput.split("\n").filter(Boolean)) {
|
|
430
|
+
try {
|
|
431
|
+
unlinkSync(join(basePath, f));
|
|
432
|
+
} catch (err) {
|
|
433
|
+
// ENOENT/EISDIR are expected for already-removed or directory entries (#3597)
|
|
434
|
+
const code = (err as NodeJS.ErrnoException).code;
|
|
435
|
+
if (!_isExpectedWorktreeUnlinkError(code)) {
|
|
436
|
+
logWarning("worktree", `untracked file unlink failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
} catch (err) {
|
|
443
|
+
/* non-fatal — git command may fail if not in repo */
|
|
444
|
+
logWarning("worktree", `untracked file cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// ─── Build Artifact Auto-Resolve ─────────────────────────────────────────────
|
|
450
|
+
|
|
451
|
+
/** Patterns for machine-generated build artifacts that can be safely
|
|
452
|
+
* auto-resolved by accepting --theirs during merge. These files are
|
|
453
|
+
* regenerable and never contain meaningful manual edits. */
|
|
454
|
+
export const SAFE_AUTO_RESOLVE_PATTERNS: RegExp[] = [
|
|
455
|
+
/\.tsbuildinfo$/,
|
|
456
|
+
/\.pyc$/,
|
|
457
|
+
/\/__pycache__\//,
|
|
458
|
+
/\.DS_Store$/,
|
|
459
|
+
/\.map$/,
|
|
460
|
+
];
|
|
461
|
+
|
|
462
|
+
/** Returns true if the file path is safe to auto-resolve during merge.
|
|
463
|
+
* Covers `.gsd/` state files and common build artifacts. */
|
|
464
|
+
export const isSafeToAutoResolve = (filePath: string): boolean =>
|
|
465
|
+
filePath.startsWith(".gsd/") ||
|
|
466
|
+
SAFE_AUTO_RESOLVE_PATTERNS.some((re) => re.test(filePath));
|
|
467
|
+
|
|
468
|
+
function removeMergeStateFiles(basePath: string, contextLabel: string): void {
|
|
469
|
+
try {
|
|
470
|
+
for (const f of ["SQUASH_MSG", "MERGE_MSG", "MERGE_MODE", "MERGE_HEAD", "AUTO_MERGE"]) {
|
|
471
|
+
const rawPath = execFileSync("git", ["rev-parse", "--git-path", f], {
|
|
472
|
+
cwd: basePath,
|
|
473
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
474
|
+
encoding: "utf-8",
|
|
475
|
+
}).trim();
|
|
476
|
+
const p = rawPath.length > 0
|
|
477
|
+
? (isAbsolute(rawPath) ? rawPath : resolve(basePath, rawPath))
|
|
478
|
+
: join(resolveGitDir(basePath), f);
|
|
479
|
+
if (existsSync(p)) unlinkSync(p);
|
|
480
|
+
}
|
|
481
|
+
} catch (err) {
|
|
482
|
+
logError("worktree", `${contextLabel} merge state cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
function cleanupSquashConflictState(basePath: string): void {
|
|
487
|
+
// `git merge --squash` conflicts can leave unmerged index entries without
|
|
488
|
+
// MERGE_HEAD, so merge-abort alone is not enough. Reset the merge index, then
|
|
489
|
+
// remove merge message files that native/libgit2 paths may have created.
|
|
490
|
+
try {
|
|
491
|
+
nativeMergeAbort(basePath);
|
|
492
|
+
} catch (err) {
|
|
493
|
+
// Expected for squash conflicts when MERGE_HEAD was never written.
|
|
494
|
+
debugLog("squash-conflict-cleanup:merge-abort-skipped", {
|
|
495
|
+
error: err instanceof Error ? err.message : String(err),
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
try {
|
|
499
|
+
execFileSync("git", ["reset", "--merge"], {
|
|
500
|
+
cwd: basePath,
|
|
501
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
502
|
+
encoding: "utf-8",
|
|
503
|
+
});
|
|
504
|
+
} catch (err) {
|
|
505
|
+
logError("worktree", `git reset --merge failed after squash conflict: ${err instanceof Error ? err.message : String(err)}`);
|
|
506
|
+
}
|
|
507
|
+
removeMergeStateFiles(basePath, "squash conflict");
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// ─── Dispatch-Level Sync (project root ↔ worktree) ──────────────────────────
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Sync milestone artifacts from project root INTO worktree before deriveState.
|
|
514
|
+
* Covers the case where the LLM wrote artifacts to the main repo filesystem
|
|
515
|
+
* (e.g. via absolute paths) but the worktree has stale data. Also deletes
|
|
516
|
+
* gsd.db in the worktree so it rebuilds from fresh disk state (#853).
|
|
517
|
+
* Non-fatal — sync failure should never block dispatch.
|
|
518
|
+
*/
|
|
519
|
+
/**
|
|
520
|
+
* Path-string entry point to WorktreeStateProjection.projectRootToWorktree.
|
|
521
|
+
* Production code goes through the Module class; this delegator survives so
|
|
522
|
+
* the projection-invariant tests (#1886, #2184, #2478, #2821) can exercise
|
|
523
|
+
* the bodies with raw paths.
|
|
524
|
+
*/
|
|
525
|
+
export function syncProjectRootToWorktree(
|
|
526
|
+
projectRoot: string,
|
|
527
|
+
worktreePath_: string,
|
|
528
|
+
milestoneId: string | null,
|
|
529
|
+
): void {
|
|
530
|
+
_projectRootToWorktreeImpl(projectRoot, worktreePath_, milestoneId);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Path-string entry point to WorktreeStateProjection.projectWorktreeToRoot.
|
|
535
|
+
* Production code goes through the Module class; this delegator survives so
|
|
536
|
+
* the projection-invariant tests can exercise the body with raw paths.
|
|
537
|
+
*/
|
|
538
|
+
export function syncStateToProjectRoot(
|
|
539
|
+
worktreePath_: string,
|
|
540
|
+
projectRoot: string,
|
|
541
|
+
milestoneId: string | null,
|
|
542
|
+
): void {
|
|
543
|
+
_projectWorktreeToRootImpl(worktreePath_, projectRoot, milestoneId);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
// ─── Resource Staleness ───────────────────────────────────────────────────
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* Read the resource version (semver) from the managed-resources manifest.
|
|
550
|
+
* Uses gsdVersion instead of syncedAt so that launching a second session
|
|
551
|
+
* doesn't falsely trigger staleness (#804).
|
|
552
|
+
*/
|
|
553
|
+
export function readResourceVersion(): string | null {
|
|
554
|
+
const agentDir =
|
|
555
|
+
process.env.GSD_CODING_AGENT_DIR || join(gsdHome(), "agent");
|
|
556
|
+
const manifestPath = join(agentDir, "managed-resources.json");
|
|
557
|
+
try {
|
|
558
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
559
|
+
return typeof manifest?.gsdVersion === "string"
|
|
560
|
+
? manifest.gsdVersion
|
|
561
|
+
: null;
|
|
562
|
+
} catch (e) {
|
|
563
|
+
logWarning("worktree", `readResourceVersion failed: ${(e as Error).message}`);
|
|
564
|
+
return null;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Check if managed resources have been updated since session start.
|
|
570
|
+
* Returns a warning message if stale, null otherwise.
|
|
571
|
+
*/
|
|
572
|
+
export function checkResourcesStale(
|
|
573
|
+
versionOnStart: string | null,
|
|
574
|
+
): string | null {
|
|
575
|
+
if (versionOnStart === null) return null;
|
|
576
|
+
const current = readResourceVersion();
|
|
577
|
+
if (current === null) return null;
|
|
578
|
+
if (current !== versionOnStart) {
|
|
579
|
+
return "GSD resources were updated since this session started. Restart gsd to load the new code.";
|
|
580
|
+
}
|
|
581
|
+
return null;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// ─── Stale Worktree Escape ────────────────────────────────────────────────
|
|
585
|
+
|
|
586
|
+
/**
|
|
587
|
+
* Detect and escape a stale worktree cwd (#608).
|
|
588
|
+
*
|
|
589
|
+
* After milestone completion + merge, the worktree directory is removed but
|
|
590
|
+
* the process cwd may still point inside `.gsd/worktrees/<MID>/`.
|
|
591
|
+
* When a new session starts, `process.cwd()` is passed as `base` to startAuto
|
|
592
|
+
* and all subsequent writes land in the wrong directory. This function detects
|
|
593
|
+
* that scenario and chdir back to the project root.
|
|
594
|
+
*
|
|
595
|
+
* Returns the corrected base path.
|
|
596
|
+
*/
|
|
597
|
+
export function escapeStaleWorktree(base: string): string {
|
|
598
|
+
// Direct layout: /.gsd/worktrees/
|
|
599
|
+
const directMarker = `${pathSep}.gsd${pathSep}worktrees${pathSep}`;
|
|
600
|
+
let idx = base.indexOf(directMarker);
|
|
601
|
+
if (idx === -1) {
|
|
602
|
+
// Symlink-resolved layout: /.gsd/projects/<hash>/worktrees/
|
|
603
|
+
const symlinkRe = new RegExp(
|
|
604
|
+
`\\${pathSep}\\.gsd\\${pathSep}projects\\${pathSep}[a-f0-9]+\\${pathSep}worktrees\\${pathSep}`,
|
|
605
|
+
);
|
|
606
|
+
const match = base.match(symlinkRe);
|
|
607
|
+
if (!match || match.index === undefined) return base;
|
|
608
|
+
idx = match.index;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
// base is inside .gsd/worktrees/<something> — extract the project root
|
|
612
|
+
const projectRoot = base.slice(0, idx);
|
|
613
|
+
|
|
614
|
+
// Guard: If the candidate project root's .gsd IS the user-level ~/.gsd,
|
|
615
|
+
// the string-slice heuristic matched the wrong /.gsd/ boundary. This happens
|
|
616
|
+
// when .gsd is a symlink into ~/.gsd/projects/<hash> and process.cwd()
|
|
617
|
+
// resolved through the symlink. Returning ~ would be catastrophic (#1676).
|
|
618
|
+
const candidateGsd = normalizeWorktreePathForCompare(join(projectRoot, ".gsd"));
|
|
619
|
+
const gsdHomeNorm = normalizeWorktreePathForCompare(gsdHome());
|
|
620
|
+
if (candidateGsd === gsdHomeNorm || candidateGsd.startsWith(gsdHomeNorm + "/")) {
|
|
621
|
+
// Don't chdir to home — return base unchanged.
|
|
622
|
+
// resolveProjectRoot() in worktree.ts has the full git-file-based recovery
|
|
623
|
+
// and will be called by the caller (startAuto → projectRoot()).
|
|
624
|
+
return base;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
try {
|
|
628
|
+
process.chdir(projectRoot);
|
|
629
|
+
} catch (e) {
|
|
630
|
+
// If chdir fails, return the original — caller will handle errors downstream
|
|
631
|
+
logWarning("worktree", `escapeStaleWorktree chdir failed: ${(e as Error).message}`);
|
|
632
|
+
return base;
|
|
633
|
+
}
|
|
634
|
+
return projectRoot;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* Clean stale runtime unit files for completed milestones.
|
|
639
|
+
*
|
|
640
|
+
* After restart, stale runtime/units/*.json from prior milestones can
|
|
641
|
+
* cause deriveState to resume the wrong milestone (#887). Removes files
|
|
642
|
+
* for milestones that have a SUMMARY (fully complete).
|
|
643
|
+
*/
|
|
644
|
+
export function cleanStaleRuntimeUnits(
|
|
645
|
+
gsdRootPath: string,
|
|
646
|
+
hasMilestoneSummary: (mid: string) => boolean,
|
|
647
|
+
): number {
|
|
648
|
+
const runtimeUnitsDir = join(gsdRootPath, "runtime", "units");
|
|
649
|
+
if (!existsSync(runtimeUnitsDir)) return 0;
|
|
650
|
+
|
|
651
|
+
let cleaned = 0;
|
|
652
|
+
try {
|
|
653
|
+
for (const file of readdirSync(runtimeUnitsDir)) {
|
|
654
|
+
if (!file.endsWith(".json")) continue;
|
|
655
|
+
if (LEGACY_DEEP_SETUP_RUNTIME_UNIT_FILES.has(file)) {
|
|
656
|
+
try {
|
|
657
|
+
unlinkSync(join(runtimeUnitsDir, file));
|
|
658
|
+
cleaned++;
|
|
659
|
+
} catch (err) {
|
|
660
|
+
/* non-fatal */
|
|
661
|
+
logWarning("worktree", `stale runtime unit unlink failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
|
|
662
|
+
}
|
|
663
|
+
continue;
|
|
664
|
+
}
|
|
665
|
+
const staleDiscussMatch = file.match(/^discuss-milestone-(.+)\.json$/);
|
|
666
|
+
if (staleDiscussMatch && !MILESTONE_ID_RE.test(staleDiscussMatch[1])) {
|
|
667
|
+
try {
|
|
668
|
+
unlinkSync(join(runtimeUnitsDir, file));
|
|
669
|
+
cleaned++;
|
|
670
|
+
} catch (err) {
|
|
671
|
+
/* non-fatal */
|
|
672
|
+
logWarning("worktree", `stale runtime unit unlink failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
|
|
673
|
+
}
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
676
|
+
const midMatch = file.match(/(M\d+(?:-[a-z0-9]{6})?)/);
|
|
677
|
+
if (!midMatch) continue;
|
|
678
|
+
if (hasMilestoneSummary(midMatch[1])) {
|
|
679
|
+
try {
|
|
680
|
+
unlinkSync(join(runtimeUnitsDir, file));
|
|
681
|
+
cleaned++;
|
|
682
|
+
} catch (err) {
|
|
683
|
+
/* non-fatal */
|
|
684
|
+
logWarning("worktree", `stale runtime unit unlink failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
} catch (err) {
|
|
689
|
+
/* non-fatal */
|
|
690
|
+
logWarning("worktree", `stale runtime unit cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
691
|
+
}
|
|
692
|
+
return cleaned;
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
// ─── Worktree ↔ Main Repo Sync (#1311) ──────────────────────────────────────
|
|
696
|
+
|
|
697
|
+
/**
|
|
698
|
+
* Scope-typed variant of syncGsdStateToWorktree.
|
|
699
|
+
*
|
|
700
|
+
* Takes an explicit (rootScope, worktreeScope) pair. Note: milestoneId is not
|
|
701
|
+
* used by syncGsdStateToWorktree — this variant only requires workspace
|
|
702
|
+
* identity. Asserts both scopes belong to the same workspace identity to
|
|
703
|
+
* prevent silent mismatch bugs.
|
|
704
|
+
*/
|
|
705
|
+
export function syncGsdStateToWorktreeByScope(
|
|
706
|
+
rootScope: MilestoneScope,
|
|
707
|
+
worktreeScope: MilestoneScope,
|
|
708
|
+
): { synced: string[] } {
|
|
709
|
+
if (rootScope.workspace.identityKey !== worktreeScope.workspace.identityKey) {
|
|
710
|
+
throw new Error(
|
|
711
|
+
`syncGsdStateToWorktreeByScope: scope identity mismatch — ` +
|
|
712
|
+
`rootScope.identityKey="${rootScope.workspace.identityKey}" ` +
|
|
713
|
+
`worktreeScope.identityKey="${worktreeScope.workspace.identityKey}"`,
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
const mainBasePath = rootScope.workspace.projectRoot;
|
|
717
|
+
const worktreePath_ = worktreeScope.workspace.worktreeRoot ?? worktreeScope.workspace.projectRoot;
|
|
718
|
+
return syncGsdStateToWorktree(mainBasePath, worktreePath_);
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* Sync .gsd/ state from the main repo into the worktree.
|
|
723
|
+
*
|
|
724
|
+
* When .gsd/ is a symlink to the external state directory, both the main
|
|
725
|
+
* repo and worktree share the same directory — no sync needed.
|
|
726
|
+
*
|
|
727
|
+
* When .gsd/ is a real directory (e.g., git-tracked or manage_gitignore:false),
|
|
728
|
+
* the worktree has its own copy that may be stale. This function copies
|
|
729
|
+
* missing milestones, CONTEXT, ROADMAP, DECISIONS, REQUIREMENTS, and
|
|
730
|
+
* PROJECT files from the main repo's .gsd/ into the worktree's .gsd/.
|
|
731
|
+
*
|
|
732
|
+
* Only adds missing content — never overwrites existing files in the worktree.
|
|
733
|
+
* Worktree files are compatibility projections; DB/project root remains
|
|
734
|
+
* authoritative for runtime state.
|
|
735
|
+
* @deprecated Use syncGsdStateToWorktreeByScope instead.
|
|
736
|
+
* TODO(C-future): remove once all callers migrated.
|
|
737
|
+
*/
|
|
738
|
+
export function syncGsdStateToWorktree(
|
|
739
|
+
mainBasePath: string,
|
|
740
|
+
worktreePath_: string,
|
|
741
|
+
): { synced: string[] } {
|
|
742
|
+
const contract = resolveGsdPathContract(worktreePath_, mainBasePath);
|
|
743
|
+
const mainGsd = contract.projectGsd;
|
|
744
|
+
const wtGsd = contract.worktreeGsd ?? join(worktreePath_, ".gsd");
|
|
745
|
+
const synced: string[] = [];
|
|
746
|
+
|
|
747
|
+
// If both resolve to the same directory (symlink), no sync needed
|
|
748
|
+
if (isSamePath(mainGsd, wtGsd)) return { synced };
|
|
749
|
+
|
|
750
|
+
if (!existsSync(mainGsd)) return { synced };
|
|
751
|
+
mkdirSync(wtGsd, { recursive: true });
|
|
752
|
+
|
|
753
|
+
// Sync root-level .gsd/ files (DECISIONS, REQUIREMENTS, PROJECT, KNOWLEDGE, etc.)
|
|
754
|
+
for (const f of ROOT_STATE_FILES) {
|
|
755
|
+
const src = join(mainGsd, f);
|
|
756
|
+
const dst = join(wtGsd, f);
|
|
757
|
+
if (existsSync(src) && !existsSync(dst)) {
|
|
758
|
+
try {
|
|
759
|
+
cpSync(src, dst);
|
|
760
|
+
synced.push(f);
|
|
761
|
+
} catch (err) {
|
|
762
|
+
/* non-fatal */
|
|
763
|
+
logWarning("worktree", `file copy failed (${f}): ${err instanceof Error ? err.message : String(err)}`);
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// Forward-sync project preferences from project root to worktree (additive only).
|
|
769
|
+
// Prefer the canonical uppercase file name, but keep the legacy lowercase
|
|
770
|
+
// fallback so older repos still work on case-sensitive filesystems.
|
|
771
|
+
{
|
|
772
|
+
const worktreeHasPreferences = existsSync(join(wtGsd, PROJECT_PREFERENCES_FILE))
|
|
773
|
+
|| existsSync(join(wtGsd, LEGACY_PROJECT_PREFERENCES_FILE));
|
|
774
|
+
if (!worktreeHasPreferences) {
|
|
775
|
+
for (const file of [PROJECT_PREFERENCES_FILE, LEGACY_PROJECT_PREFERENCES_FILE] as const) {
|
|
776
|
+
const src = join(mainGsd, file);
|
|
777
|
+
const dst = join(wtGsd, file);
|
|
778
|
+
if (existsSync(src)) {
|
|
779
|
+
try {
|
|
780
|
+
cpSync(src, dst);
|
|
781
|
+
synced.push(file);
|
|
782
|
+
} catch (err) {
|
|
783
|
+
/* non-fatal */
|
|
784
|
+
logWarning("worktree", `preferences copy failed (${file}): ${err instanceof Error ? err.message : String(err)}`);
|
|
785
|
+
}
|
|
786
|
+
break;
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// Sync milestones: copy entire milestone directories that are missing
|
|
793
|
+
const mainMilestonesDir = join(mainGsd, "milestones");
|
|
794
|
+
const wtMilestonesDir = join(wtGsd, "milestones");
|
|
795
|
+
if (existsSync(mainMilestonesDir)) {
|
|
796
|
+
try {
|
|
797
|
+
mkdirSync(wtMilestonesDir, { recursive: true });
|
|
798
|
+
const mainMilestones = readdirSync(mainMilestonesDir, {
|
|
799
|
+
withFileTypes: true,
|
|
800
|
+
})
|
|
801
|
+
.filter((d) => d.isDirectory())
|
|
802
|
+
.map((d) => d.name);
|
|
803
|
+
|
|
804
|
+
for (const mid of mainMilestones) {
|
|
805
|
+
const srcDir = join(mainMilestonesDir, mid);
|
|
806
|
+
const dstDir = join(wtMilestonesDir, mid);
|
|
807
|
+
|
|
808
|
+
if (!existsSync(dstDir)) {
|
|
809
|
+
// Entire milestone missing from worktree — copy it
|
|
810
|
+
try {
|
|
811
|
+
cpSync(srcDir, dstDir, { recursive: true });
|
|
812
|
+
synced.push(`milestones/${mid}/`);
|
|
813
|
+
} catch (err) {
|
|
814
|
+
/* non-fatal */
|
|
815
|
+
logWarning("worktree", `milestone copy failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
816
|
+
}
|
|
817
|
+
} else {
|
|
818
|
+
// Milestone directory exists but may be missing files (stale snapshot).
|
|
819
|
+
// Sync individual top-level milestone files (CONTEXT, ROADMAP, RESEARCH, etc.)
|
|
820
|
+
try {
|
|
821
|
+
const srcFiles = readdirSync(srcDir).filter(
|
|
822
|
+
(f) => f.endsWith(".md") || f.endsWith(".json"),
|
|
823
|
+
);
|
|
824
|
+
for (const f of srcFiles) {
|
|
825
|
+
const srcFile = join(srcDir, f);
|
|
826
|
+
const dstFile = join(dstDir, f);
|
|
827
|
+
if (!existsSync(dstFile)) {
|
|
828
|
+
try {
|
|
829
|
+
const srcStat = lstatSyncFn(srcFile);
|
|
830
|
+
if (srcStat.isFile()) {
|
|
831
|
+
cpSync(srcFile, dstFile);
|
|
832
|
+
synced.push(`milestones/${mid}/${f}`);
|
|
833
|
+
}
|
|
834
|
+
} catch (err) {
|
|
835
|
+
/* non-fatal */
|
|
836
|
+
logWarning("worktree", `milestone file copy failed (${mid}/${f}): ${err instanceof Error ? err.message : String(err)}`);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
// Sync slices directory if it exists in main but not in worktree
|
|
842
|
+
const srcSlicesDir = join(srcDir, "slices");
|
|
843
|
+
const dstSlicesDir = join(dstDir, "slices");
|
|
844
|
+
if (existsSync(srcSlicesDir) && !existsSync(dstSlicesDir)) {
|
|
845
|
+
try {
|
|
846
|
+
cpSync(srcSlicesDir, dstSlicesDir, { recursive: true });
|
|
847
|
+
synced.push(`milestones/${mid}/slices/`);
|
|
848
|
+
} catch (err) {
|
|
849
|
+
/* non-fatal */
|
|
850
|
+
logWarning("worktree", `slices copy failed (${mid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
851
|
+
}
|
|
852
|
+
} else if (existsSync(srcSlicesDir) && existsSync(dstSlicesDir)) {
|
|
853
|
+
// Both exist — sync missing slice directories
|
|
854
|
+
const srcSlices = readdirSync(srcSlicesDir, {
|
|
855
|
+
withFileTypes: true,
|
|
856
|
+
})
|
|
857
|
+
.filter((d) => d.isDirectory())
|
|
858
|
+
.map((d) => d.name);
|
|
859
|
+
for (const sid of srcSlices) {
|
|
860
|
+
const srcSlice = join(srcSlicesDir, sid);
|
|
861
|
+
const dstSlice = join(dstSlicesDir, sid);
|
|
862
|
+
if (!existsSync(dstSlice)) {
|
|
863
|
+
try {
|
|
864
|
+
cpSync(srcSlice, dstSlice, { recursive: true });
|
|
865
|
+
synced.push(`milestones/${mid}/slices/${sid}/`);
|
|
866
|
+
} catch (err) {
|
|
867
|
+
/* non-fatal */
|
|
868
|
+
logWarning("worktree", `slice copy failed (${mid}/${sid}): ${err instanceof Error ? err.message : String(err)}`);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
} catch (err) {
|
|
874
|
+
/* non-fatal */
|
|
875
|
+
logWarning("worktree", `milestone file sync failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
} catch (err) {
|
|
880
|
+
/* non-fatal */
|
|
881
|
+
logWarning("worktree", `milestone directory sync failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
return { synced };
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* Sync compatibility artifacts from worktree back to the main external state
|
|
890
|
+
* directory. Canonical workflow state lives in the project DB; worktree .gsd
|
|
891
|
+
* content is legacy projection/diagnostic data only.
|
|
892
|
+
*
|
|
893
|
+
* Syncs:
|
|
894
|
+
* 1. Legacy worktree DBs are reconciled into the canonical project DB.
|
|
895
|
+
* 2. Runtime diagnostic files may be copied for operator visibility.
|
|
896
|
+
*
|
|
897
|
+
* Markdown milestone directories are projections and are not copied from
|
|
898
|
+
* worktrees into the project root. Current workflow state must arrive through
|
|
899
|
+
* the shared project DB or the pre-upgrade DB reconciliation path above.
|
|
900
|
+
*/
|
|
901
|
+
export function syncWorktreeStateBack(
|
|
902
|
+
mainBasePath: string,
|
|
903
|
+
worktreePath: string,
|
|
904
|
+
milestoneId: string,
|
|
905
|
+
): { synced: string[] } {
|
|
906
|
+
return _finalizeProjectionForMergeImpl(mainBasePath, worktreePath, milestoneId);
|
|
907
|
+
}
|
|
908
|
+
// ─── Worktree Post-Create Hook (#597) ────────────────────────────────────────
|
|
909
|
+
|
|
910
|
+
/**
|
|
911
|
+
* Run the user-configured post-create hook script after worktree creation.
|
|
912
|
+
* The script receives SOURCE_DIR and WORKTREE_DIR as environment variables.
|
|
913
|
+
* Failure is non-fatal — returns the error message or null on success.
|
|
914
|
+
*
|
|
915
|
+
* Reads the hook path from git.worktree_post_create in preferences.
|
|
916
|
+
* Pass hookPath directly to bypass preference loading (useful for testing).
|
|
917
|
+
*/
|
|
918
|
+
export function runWorktreePostCreateHook(
|
|
919
|
+
sourceDir: string,
|
|
920
|
+
worktreeDir: string,
|
|
921
|
+
hookPath?: string,
|
|
922
|
+
): string | null {
|
|
923
|
+
if (hookPath === undefined) {
|
|
924
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
925
|
+
hookPath = prefs?.worktree_post_create;
|
|
926
|
+
}
|
|
927
|
+
if (!hookPath) return null;
|
|
928
|
+
|
|
929
|
+
// Resolve relative paths against the source project root.
|
|
930
|
+
// On Windows, convert 8.3 short paths (e.g. RUNNER~1) to long paths
|
|
931
|
+
// so execFileSync can locate the file correctly.
|
|
932
|
+
let resolved = isAbsolute(hookPath) ? hookPath : join(sourceDir, hookPath);
|
|
933
|
+
if (!existsSync(resolved)) {
|
|
934
|
+
return `Worktree post-create hook not found: ${resolved}`;
|
|
935
|
+
}
|
|
936
|
+
if (process.platform === "win32") {
|
|
937
|
+
try { resolved = realpathSync.native(resolved); } catch (err) { /* keep original */
|
|
938
|
+
logWarning("worktree", `realpath failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
try {
|
|
943
|
+
// .bat/.cmd files on Windows require shell mode — execFileSync cannot
|
|
944
|
+
// spawn them directly (EINVAL).
|
|
945
|
+
const needsShell = process.platform === "win32" && /\.(bat|cmd)$/i.test(resolved);
|
|
946
|
+
execFileSync(resolved, [], {
|
|
947
|
+
cwd: worktreeDir,
|
|
948
|
+
env: {
|
|
949
|
+
...process.env,
|
|
950
|
+
SOURCE_DIR: sourceDir,
|
|
951
|
+
WORKTREE_DIR: worktreeDir,
|
|
952
|
+
},
|
|
953
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
954
|
+
encoding: "utf-8",
|
|
955
|
+
timeout: 30_000, // 30 second timeout
|
|
956
|
+
shell: needsShell,
|
|
957
|
+
});
|
|
958
|
+
return null;
|
|
959
|
+
} catch (err) {
|
|
960
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
961
|
+
return `Worktree post-create hook failed: ${msg}`;
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
// ─── Auto-Worktree Branch Naming ───────────────────────────────────────────
|
|
966
|
+
|
|
967
|
+
/** Returns the git branch name for a milestone worktree (`milestone/<MID>`). */
|
|
968
|
+
export function autoWorktreeBranch(milestoneId: string): string {
|
|
969
|
+
return `milestone/${milestoneId}`;
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
function normalizeLocalBranchRef(branch: string): string {
|
|
973
|
+
return branch.startsWith("refs/heads/")
|
|
974
|
+
? branch.slice("refs/heads/".length)
|
|
975
|
+
: branch;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
// ─── Branch-mode Entry ─────────────────────────────────────────────────────
|
|
979
|
+
|
|
980
|
+
/**
|
|
981
|
+
* Enter branch isolation mode for a milestone.
|
|
982
|
+
*
|
|
983
|
+
* Creates `milestone/<MID>` from the integration branch (if it doesn't
|
|
984
|
+
* exist yet) and checks out to it. No worktree directory is created — the
|
|
985
|
+
* project root is the working copy; only HEAD changes.
|
|
986
|
+
*
|
|
987
|
+
* Uses the same 3-tier integration-branch fallback as createAutoWorktree:
|
|
988
|
+
* 1. META.json recorded integration branch
|
|
989
|
+
* 2. git.main_branch preference
|
|
990
|
+
* 3. nativeDetectMainBranch (origin/HEAD auto-detection)
|
|
991
|
+
*/
|
|
992
|
+
export function enterBranchModeForMilestone(
|
|
993
|
+
basePath: string,
|
|
994
|
+
milestoneId: string,
|
|
995
|
+
): void {
|
|
996
|
+
const branch = autoWorktreeBranch(milestoneId);
|
|
997
|
+
const branchExists = nativeBranchExists(basePath, branch);
|
|
998
|
+
|
|
999
|
+
if (!branchExists) {
|
|
1000
|
+
// Create the milestone branch from the integration branch start-point.
|
|
1001
|
+
const integrationBranch =
|
|
1002
|
+
readIntegrationBranch(basePath, milestoneId) ?? undefined;
|
|
1003
|
+
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
1004
|
+
const startPoint =
|
|
1005
|
+
_resolveAutoWorktreeStartPoint(
|
|
1006
|
+
integrationBranch,
|
|
1007
|
+
gitPrefs?.main_branch,
|
|
1008
|
+
(branchName) => nativeBranchExists(basePath, branchName),
|
|
1009
|
+
) ??
|
|
1010
|
+
nativeDetectMainBranch(basePath);
|
|
1011
|
+
|
|
1012
|
+
// TOCTOU ancestry guard (Issue #4980 HIGH-3).
|
|
1013
|
+
//
|
|
1014
|
+
// The outer `branchExists` check at line 1012 is racy: a concurrent
|
|
1015
|
+
// process (parallel-orchestrator worker, side-by-side `gsd` instance,
|
|
1016
|
+
// or manual `git branch` invocation) may have created the branch with
|
|
1017
|
+
// real commits between that check and this point. `nativeBranchForceReset`
|
|
1018
|
+
// does `git branch -f`, which silently overwrites the branch ref —
|
|
1019
|
+
// orphaning any commits not reachable from `startPoint`. Re-check
|
|
1020
|
+
// immediately before the destructive call and refuse if the branch
|
|
1021
|
+
// suddenly exists with non-ancestor commits.
|
|
1022
|
+
//
|
|
1023
|
+
// Note: under single-threaded execution this is rarely reached, but it
|
|
1024
|
+
// is NOT dead code — it is the only barrier against a TOCTOU-induced
|
|
1025
|
+
// commit loss in this code path.
|
|
1026
|
+
const concurrentlyCreated = nativeBranchExists(basePath, branch);
|
|
1027
|
+
if (
|
|
1028
|
+
concurrentlyCreated &&
|
|
1029
|
+
!nativeIsAncestor(basePath, branch, startPoint)
|
|
1030
|
+
) {
|
|
1031
|
+
throw new GSDError(
|
|
1032
|
+
GSD_GIT_ERROR,
|
|
1033
|
+
`Branch "${branch}" was created concurrently with commits not reachable from "${startPoint}". ` +
|
|
1034
|
+
`Refusing to force-reset — would orphan prior work. ` +
|
|
1035
|
+
`Resume the existing milestone or run \`git branch -D ${branch}\` to discard.`,
|
|
1036
|
+
);
|
|
1037
|
+
}
|
|
1038
|
+
// nativeBranchForceReset creates (or resets) branch at startPoint,
|
|
1039
|
+
// then checkout switches HEAD to it.
|
|
1040
|
+
nativeBranchForceReset(basePath, branch, startPoint);
|
|
1041
|
+
debugLog("auto-worktree", {
|
|
1042
|
+
action: "enterBranchMode",
|
|
1043
|
+
milestoneId,
|
|
1044
|
+
branch,
|
|
1045
|
+
startPoint,
|
|
1046
|
+
created: true,
|
|
1047
|
+
});
|
|
1048
|
+
} else {
|
|
1049
|
+
debugLog("auto-worktree", {
|
|
1050
|
+
action: "enterBranchMode",
|
|
1051
|
+
milestoneId,
|
|
1052
|
+
branch,
|
|
1053
|
+
reused: true,
|
|
1054
|
+
});
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
checkoutBranchWithStashGuard(basePath, branch, `enter-branch-mode:${milestoneId}`);
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
export function checkoutBranchWithStashGuard(
|
|
1061
|
+
basePath: string,
|
|
1062
|
+
branch: string,
|
|
1063
|
+
reason: string,
|
|
1064
|
+
): void {
|
|
1065
|
+
let stashMarker: string | null = null;
|
|
1066
|
+
let stashed = false;
|
|
1067
|
+
|
|
1068
|
+
const status = nativeWorkingTreeStatus(basePath).trim();
|
|
1069
|
+
if (status.length > 0) {
|
|
1070
|
+
stashMarker = `gsd-checkout-stash:${reason}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
1071
|
+
const stashListBefore = execFileSync("git", ["stash", "list"], {
|
|
1072
|
+
cwd: basePath,
|
|
1073
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1074
|
+
encoding: "utf-8",
|
|
1075
|
+
});
|
|
1076
|
+
execFileSync(
|
|
1077
|
+
"git",
|
|
1078
|
+
["stash", "push", "--include-untracked", "-m", `gsd: checkout stash [${stashMarker}]`],
|
|
1079
|
+
{
|
|
1080
|
+
cwd: basePath,
|
|
1081
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1082
|
+
encoding: "utf-8",
|
|
1083
|
+
},
|
|
1084
|
+
);
|
|
1085
|
+
const stashListAfter = execFileSync("git", ["stash", "list"], {
|
|
1086
|
+
cwd: basePath,
|
|
1087
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1088
|
+
encoding: "utf-8",
|
|
1089
|
+
});
|
|
1090
|
+
stashed = stashListAfter !== stashListBefore;
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// Checkout and stash-restore are split so we can distinguish two failure
|
|
1094
|
+
// modes: (a) checkout failed → HEAD did not move, restore stash and rethrow;
|
|
1095
|
+
// (b) checkout succeeded but stash pop failed → HEAD moved to `branch` but
|
|
1096
|
+
// the working-tree changes remain in the stash list. We surface a distinct
|
|
1097
|
+
// error in case (b) so callers don't assume the branch switch was rolled back.
|
|
1098
|
+
try {
|
|
1099
|
+
nativeCheckoutBranch(basePath, branch);
|
|
1100
|
+
} catch (checkoutErr) {
|
|
1101
|
+
if (stashed) {
|
|
1102
|
+
try {
|
|
1103
|
+
popStashByRef(basePath, stashMarker);
|
|
1104
|
+
} catch (restoreErr) {
|
|
1105
|
+
logWarning("worktree", `git stash pop failed during checkout restore: ${restoreErr instanceof Error ? restoreErr.message : String(restoreErr)}`);
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
throw checkoutErr;
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
if (stashed) {
|
|
1112
|
+
try {
|
|
1113
|
+
popStashByRef(basePath, stashMarker);
|
|
1114
|
+
} catch (popErr) {
|
|
1115
|
+
const msg = popErr instanceof Error ? popErr.message : String(popErr);
|
|
1116
|
+
const wrapped = new Error(
|
|
1117
|
+
`checkout to '${branch}' succeeded but stash restore failed; working tree changes remain in the stash list. Original error: ${msg}`,
|
|
1118
|
+
);
|
|
1119
|
+
const ref = (popErr as { stashRef?: string } | null)?.stashRef;
|
|
1120
|
+
if (ref) (wrapped as { stashRef?: string }).stashRef = ref;
|
|
1121
|
+
throw wrapped;
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
// ─── Public API ────────────────────────────────────────────────────────────
|
|
1127
|
+
|
|
1128
|
+
/**
|
|
1129
|
+
* Create a new auto-worktree for a milestone, chdir into it, and store
|
|
1130
|
+
* the original base path for later teardown.
|
|
1131
|
+
*
|
|
1132
|
+
* Atomic: chdir + originalBase update happen in the same try block
|
|
1133
|
+
* to prevent split-brain.
|
|
1134
|
+
*/
|
|
1135
|
+
|
|
1136
|
+
/**
|
|
1137
|
+
* Forward-merge plan checkbox state from the project root into a freshly
|
|
1138
|
+
* re-attached worktree (#778).
|
|
1139
|
+
*
|
|
1140
|
+
* Phase C: deleted. Writers in workflow-projections.ts, triage-resolution.ts,
|
|
1141
|
+
* rule-registry.ts, and auto-post-unit.ts now route through
|
|
1142
|
+
* s.canonicalProjectRoot, so non-symlinked worktrees no longer need a local
|
|
1143
|
+
* .gsd/ projection — the project-root .gsd/ is the only authoritative source
|
|
1144
|
+
* for both reads and writes. copyPlanningArtifacts and reconcilePlanCheckboxes
|
|
1145
|
+
* (both formerly here) became dead.
|
|
1146
|
+
*/
|
|
1147
|
+
|
|
1148
|
+
/**
|
|
1149
|
+
* True when `branch` is checked out in any worktree listed by
|
|
1150
|
+
* `git worktree list --porcelain`. Used to gate ref updates that would
|
|
1151
|
+
* otherwise leave a concurrent worktree's HEAD inconsistent with its
|
|
1152
|
+
* index/working tree (Codex peer-review of #5538-followup).
|
|
1153
|
+
*
|
|
1154
|
+
* Best-effort: a `nativeWorktreeList` failure returns true so we err on
|
|
1155
|
+
* the side of NOT moving the ref. Better to skip a fast-forward than to
|
|
1156
|
+
* silently corrupt another worktree.
|
|
1157
|
+
*/
|
|
1158
|
+
export function _isBranchCheckedOutElsewhere(
|
|
1159
|
+
basePath: string,
|
|
1160
|
+
branch: string,
|
|
1161
|
+
): boolean {
|
|
1162
|
+
try {
|
|
1163
|
+
const entries = nativeWorktreeList(basePath);
|
|
1164
|
+
return entries.some((entry) => entry.branch === branch);
|
|
1165
|
+
} catch {
|
|
1166
|
+
return true;
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
/**
|
|
1171
|
+
* Resolve the integration branch using the same 3-tier fallback as the
|
|
1172
|
+
* fresh-create path: META.json → git.main_branch preference → detected
|
|
1173
|
+
* main branch. Returns null when no usable target exists.
|
|
1174
|
+
*/
|
|
1175
|
+
function _resolveIntegrationBranchForReuse(
|
|
1176
|
+
basePath: string,
|
|
1177
|
+
milestoneId: string,
|
|
1178
|
+
): string | null {
|
|
1179
|
+
const fromMeta = readIntegrationBranch(basePath, milestoneId);
|
|
1180
|
+
if (fromMeta) return fromMeta;
|
|
1181
|
+
|
|
1182
|
+
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
1183
|
+
const fromPref = gitPrefs?.main_branch &&
|
|
1184
|
+
typeof gitPrefs.main_branch === "string" &&
|
|
1185
|
+
gitPrefs.main_branch.length > 0 &&
|
|
1186
|
+
nativeBranchExists(basePath, gitPrefs.main_branch)
|
|
1187
|
+
? gitPrefs.main_branch
|
|
1188
|
+
: null;
|
|
1189
|
+
if (fromPref) return fromPref;
|
|
1190
|
+
|
|
1191
|
+
try {
|
|
1192
|
+
return nativeDetectMainBranch(basePath);
|
|
1193
|
+
} catch {
|
|
1194
|
+
return null;
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
/**
|
|
1199
|
+
* When reusing an existing milestone branch, fast-forward it onto the
|
|
1200
|
+
* integration branch when that's safe (branch is a strict ancestor of
|
|
1201
|
+
* integration — no commits would be lost). Skips when the branch has its
|
|
1202
|
+
* own commits ahead of integration, when the integration branch can't be
|
|
1203
|
+
* resolved, or when any git operation fails — the merge gate at milestone
|
|
1204
|
+
* completion will surface real divergence as a conflict.
|
|
1205
|
+
*
|
|
1206
|
+
* The previous behavior re-attached the worktree to whatever stale tip
|
|
1207
|
+
* the branch held, which caused new milestone work to fork from a base
|
|
1208
|
+
* missing prior milestones' merges (#5538-followup).
|
|
1209
|
+
*/
|
|
1210
|
+
export function fastForwardReusedMilestoneBranchIfSafe(
|
|
1211
|
+
basePath: string,
|
|
1212
|
+
milestoneId: string,
|
|
1213
|
+
branch: string,
|
|
1214
|
+
): void {
|
|
1215
|
+
try {
|
|
1216
|
+
const integrationBranch = _resolveIntegrationBranchForReuse(basePath, milestoneId);
|
|
1217
|
+
if (!integrationBranch || integrationBranch === branch) return;
|
|
1218
|
+
if (!nativeBranchExists(basePath, integrationBranch)) return;
|
|
1219
|
+
|
|
1220
|
+
// Pure fast-forward only: branch must be a strict ancestor of integration.
|
|
1221
|
+
// If the branch has its own commits ahead, leave it alone.
|
|
1222
|
+
if (!nativeIsAncestor(basePath, branch, integrationBranch)) {
|
|
1223
|
+
debugLog("createAutoWorktree", {
|
|
1224
|
+
phase: "skip-ff-branch-not-ancestor",
|
|
1225
|
+
milestoneId,
|
|
1226
|
+
branch,
|
|
1227
|
+
integration: integrationBranch,
|
|
1228
|
+
});
|
|
1229
|
+
return;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
// Codex peer-review: `nativeUpdateRef` succeeds even when the branch is
|
|
1233
|
+
// currently checked out in another worktree, leaving that worktree's HEAD
|
|
1234
|
+
// inconsistent with its index/work tree. Skip the fast-forward if any
|
|
1235
|
+
// listed worktree has this branch checked out — the merge gate at
|
|
1236
|
+
// milestone-completion will surface stale-base divergence as a conflict
|
|
1237
|
+
// instead of silently corrupting the other worktree's state.
|
|
1238
|
+
if (_isBranchCheckedOutElsewhere(basePath, branch)) {
|
|
1239
|
+
debugLog("createAutoWorktree", {
|
|
1240
|
+
phase: "skip-ff-branch-checked-out-elsewhere",
|
|
1241
|
+
milestoneId,
|
|
1242
|
+
branch,
|
|
1243
|
+
});
|
|
1244
|
+
return;
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
nativeUpdateRef(basePath, `refs/heads/${branch}`, integrationBranch);
|
|
1248
|
+
debugLog("createAutoWorktree", {
|
|
1249
|
+
phase: "fast-forward-reused-branch",
|
|
1250
|
+
milestoneId,
|
|
1251
|
+
branch,
|
|
1252
|
+
integration: integrationBranch,
|
|
1253
|
+
});
|
|
1254
|
+
} catch (err) {
|
|
1255
|
+
debugLog("createAutoWorktree", {
|
|
1256
|
+
phase: "fast-forward-reused-branch-failed",
|
|
1257
|
+
milestoneId,
|
|
1258
|
+
branch,
|
|
1259
|
+
error: err instanceof Error ? err.message : String(err),
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
export function createAutoWorktree(
|
|
1265
|
+
basePath: string,
|
|
1266
|
+
milestoneId: string,
|
|
1267
|
+
): string {
|
|
1268
|
+
basePath = resolveWorktreeProjectRoot(basePath);
|
|
1269
|
+
|
|
1270
|
+
// Check if repo has commits — git worktree requires a valid HEAD
|
|
1271
|
+
try {
|
|
1272
|
+
execFileSync("git", ["rev-parse", "--verify", "HEAD"], { cwd: basePath, stdio: "pipe" });
|
|
1273
|
+
} catch {
|
|
1274
|
+
throw new GSDError(
|
|
1275
|
+
GSD_GIT_ERROR,
|
|
1276
|
+
`Cannot create worktree: repository has no commits yet. Worktree isolation requires at least one commit.`,
|
|
1277
|
+
);
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
const branch = autoWorktreeBranch(milestoneId);
|
|
1281
|
+
|
|
1282
|
+
// Check if the milestone branch already exists — it survives auto-mode
|
|
1283
|
+
// stop/pause and contains committed work from prior sessions. If it exists,
|
|
1284
|
+
// re-attach the worktree to it WITHOUT resetting. Only create a fresh branch
|
|
1285
|
+
// from the integration branch when no prior work exists.
|
|
1286
|
+
const branchExists = nativeBranchExists(basePath, branch);
|
|
1287
|
+
|
|
1288
|
+
let info: { name: string; path: string; branch: string; exists: boolean };
|
|
1289
|
+
if (branchExists) {
|
|
1290
|
+
// #5538-followup: fast-forward the reused branch onto the integration
|
|
1291
|
+
// branch when safe so the next milestone forks from up-to-date code.
|
|
1292
|
+
// Without this, a milestone that was created before another milestone
|
|
1293
|
+
// merged into main would carry a stale base into its worktree.
|
|
1294
|
+
fastForwardReusedMilestoneBranchIfSafe(basePath, milestoneId, branch);
|
|
1295
|
+
|
|
1296
|
+
// Re-attach worktree to the existing milestone branch (preserving commits)
|
|
1297
|
+
info = createWorktree(basePath, milestoneId, {
|
|
1298
|
+
branch,
|
|
1299
|
+
reuseExistingBranch: true,
|
|
1300
|
+
});
|
|
1301
|
+
} else {
|
|
1302
|
+
// Fresh start — create branch from integration branch.
|
|
1303
|
+
// Use the same 3-tier fallback as mergeMilestoneToMain (#3461):
|
|
1304
|
+
// 1. META.json integration branch (explicit per-milestone override)
|
|
1305
|
+
// 2. git.main_branch preference (user's configured working branch)
|
|
1306
|
+
// 3. nativeDetectMainBranch (origin/HEAD auto-detection)
|
|
1307
|
+
// Without tier 2, projects with main_branch=dev but origin/HEAD→master
|
|
1308
|
+
// would fork worktrees from the wrong (stale) branch.
|
|
1309
|
+
const integrationBranch =
|
|
1310
|
+
readIntegrationBranch(basePath, milestoneId) ?? undefined;
|
|
1311
|
+
const gitPrefs = loadEffectiveGSDPreferences()?.preferences?.git;
|
|
1312
|
+
const startPoint = _resolveAutoWorktreeStartPoint(
|
|
1313
|
+
integrationBranch,
|
|
1314
|
+
gitPrefs?.main_branch,
|
|
1315
|
+
(branchName) => nativeBranchExists(basePath, branchName),
|
|
1316
|
+
);
|
|
1317
|
+
info = createWorktree(basePath, milestoneId, {
|
|
1318
|
+
branch,
|
|
1319
|
+
startPoint,
|
|
1320
|
+
});
|
|
1321
|
+
}
|
|
1322
|
+
|
|
1323
|
+
// Phase C: copyPlanningArtifacts and reconcilePlanCheckboxes were
|
|
1324
|
+
// deleted. Both addressed the same problem (worktree-local .gsd/
|
|
1325
|
+
// projection lagging behind project-root state) by maintaining a stale
|
|
1326
|
+
// copy. Now that auto-mode writers in workflow-projections.ts,
|
|
1327
|
+
// triage-resolution.ts, rule-registry.ts, and auto-post-unit.ts route
|
|
1328
|
+
// through s.canonicalProjectRoot, the worktree never needs a local
|
|
1329
|
+
// .gsd/ — both reads and writes converge on the project-root .gsd/.
|
|
1330
|
+
// The original concerns (#759, #778) no longer apply because there is
|
|
1331
|
+
// no second copy to drift.
|
|
1332
|
+
|
|
1333
|
+
// Run user-configured post-create hook (#597) — e.g. copy .env, symlink assets
|
|
1334
|
+
const hookError = runWorktreePostCreateHook(basePath, info.path);
|
|
1335
|
+
if (hookError) {
|
|
1336
|
+
// Non-fatal — log but don't prevent worktree usage
|
|
1337
|
+
logWarning("reconcile", hookError, { worktree: info.name });
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
const previousCwd = process.cwd();
|
|
1341
|
+
|
|
1342
|
+
try {
|
|
1343
|
+
process.chdir(info.path);
|
|
1344
|
+
setActiveWorkspace(createWorkspace(basePath));
|
|
1345
|
+
} catch (err) {
|
|
1346
|
+
// If chdir fails, the worktree was created but we couldn't enter it.
|
|
1347
|
+
// Don't set activeWorkspace -- caller can retry or clean up.
|
|
1348
|
+
throw new GSDError(
|
|
1349
|
+
GSD_IO_ERROR,
|
|
1350
|
+
`Auto-worktree created at ${info.path} but chdir failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
1351
|
+
);
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
nudgeGitBranchCache(previousCwd);
|
|
1355
|
+
return info.path;
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
// Phase C: copyPlanningArtifacts removed. Planning artifacts now live
|
|
1359
|
+
// only at the project root .gsd/; auto-mode writers (workflow-projections,
|
|
1360
|
+
// triage-resolution, rule-registry, regenerateIfMissing,
|
|
1361
|
+
// resolveHookArtifactPath) all route through s.canonicalProjectRoot.
|
|
1362
|
+
// Worktrees are pure git checkouts — they no longer maintain a parallel
|
|
1363
|
+
// .gsd/ projection. The gsd.db has always lived at the project root via
|
|
1364
|
+
// the shared-WAL R012 contract; that is unchanged.
|
|
1365
|
+
|
|
1366
|
+
/**
|
|
1367
|
+
* Teardown an auto-worktree: chdir back to original base, then remove
|
|
1368
|
+
* the worktree and its branch.
|
|
1369
|
+
*/
|
|
1370
|
+
export function teardownAutoWorktree(
|
|
1371
|
+
originalBasePath: string,
|
|
1372
|
+
milestoneId: string,
|
|
1373
|
+
opts: { preserveBranch?: boolean; preserveWorktree?: boolean } = {},
|
|
1374
|
+
): void {
|
|
1375
|
+
originalBasePath = resolveWorktreeProjectRoot(originalBasePath);
|
|
1376
|
+
|
|
1377
|
+
const branch = autoWorktreeBranch(milestoneId);
|
|
1378
|
+
const { preserveBranch = false, preserveWorktree = false } = opts;
|
|
1379
|
+
const previousCwd = process.cwd();
|
|
1380
|
+
|
|
1381
|
+
// Wrap the entire teardown body in a single try/finally so activeWorkspace
|
|
1382
|
+
// is ALWAYS cleared — even if process.chdir throws (e.g. originalBasePath
|
|
1383
|
+
// was deleted before teardown ran). Previously the finally only covered
|
|
1384
|
+
// removeWorktree, leaving the registry stale on a chdir failure (H3 fix).
|
|
1385
|
+
try {
|
|
1386
|
+
try {
|
|
1387
|
+
process.chdir(originalBasePath);
|
|
1388
|
+
} catch (err) {
|
|
1389
|
+
throw new GSDError(
|
|
1390
|
+
GSD_IO_ERROR,
|
|
1391
|
+
`Failed to chdir back to ${originalBasePath} during teardown: ${err instanceof Error ? err.message : String(err)}`,
|
|
1392
|
+
);
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
// Mirror cleanup steps from mergeMilestoneToMain abort path:
|
|
1396
|
+
|
|
1397
|
+
// 1. Remove transient state files (STATE.md, auto.lock, {MID}-META.json).
|
|
1398
|
+
// Non-fatal — must not block teardown.
|
|
1399
|
+
try {
|
|
1400
|
+
clearProjectRootStateFiles(originalBasePath, milestoneId);
|
|
1401
|
+
} catch (err) {
|
|
1402
|
+
logWarning("worktree", `clearProjectRootStateFiles failed during teardown: ${err instanceof Error ? err.message : String(err)}`);
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
// 2. Reconcile worktree-local gsd.db into project root DB if both exist.
|
|
1406
|
+
// Non-fatal — handles legacy worktrees that have a local copy.
|
|
1407
|
+
if (isDbAvailable()) {
|
|
1408
|
+
try {
|
|
1409
|
+
const contract = resolveGsdPathContract(previousCwd, originalBasePath);
|
|
1410
|
+
const worktreeDbPath = join(contract.worktreeGsd ?? join(previousCwd, ".gsd"), "gsd.db");
|
|
1411
|
+
const mainDbPath = contract.projectDb;
|
|
1412
|
+
if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
|
|
1413
|
+
reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
1414
|
+
}
|
|
1415
|
+
} catch (err) {
|
|
1416
|
+
/* non-fatal */
|
|
1417
|
+
logError("worktree", `DB reconciliation failed during teardown: ${err instanceof Error ? err.message : String(err)}`);
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
|
|
1421
|
+
nudgeGitBranchCache(previousCwd);
|
|
1422
|
+
|
|
1423
|
+
// 3. Remove the worktree unless this exit path explicitly preserves it
|
|
1424
|
+
// (slice-parallel dispatch stops the parent loop but keeps the parent
|
|
1425
|
+
// milestone worktree for restart/re-entry).
|
|
1426
|
+
if (!preserveWorktree) {
|
|
1427
|
+
removeWorktree(originalBasePath, milestoneId, {
|
|
1428
|
+
branch,
|
|
1429
|
+
deleteBranch: !preserveBranch,
|
|
1430
|
+
});
|
|
1431
|
+
}
|
|
1432
|
+
|
|
1433
|
+
// Verify cleanup succeeded — warn if the worktree directory is still on disk.
|
|
1434
|
+
// On Windows, bash-based cleanup can silently fail when paths contain
|
|
1435
|
+
// backslashes (#1436), leaving ~1 GB+ orphaned directories.
|
|
1436
|
+
const wtDir = worktreePath(originalBasePath, milestoneId);
|
|
1437
|
+
if (!preserveWorktree && existsSync(wtDir)) {
|
|
1438
|
+
logWarning(
|
|
1439
|
+
"reconcile",
|
|
1440
|
+
`Worktree directory still exists after teardown: ${wtDir}. ` +
|
|
1441
|
+
`This is likely an orphaned directory consuming disk space. ` +
|
|
1442
|
+
`Remove it manually with: rm -rf "${wtDir.replaceAll("\\", "/")}"`,
|
|
1443
|
+
{ worktree: milestoneId },
|
|
1444
|
+
);
|
|
1445
|
+
// Attempt a direct filesystem removal as a fallback — but ONLY if the
|
|
1446
|
+
// path is safely inside .gsd/worktrees/ to prevent #2365 data loss.
|
|
1447
|
+
if (isInsideWorktreesDir(originalBasePath, wtDir)) {
|
|
1448
|
+
try {
|
|
1449
|
+
rmSync(wtDir, { recursive: true, force: true });
|
|
1450
|
+
} catch (err) {
|
|
1451
|
+
// Non-fatal — the warning above tells the user how to clean up
|
|
1452
|
+
logWarning("worktree", `worktree directory removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1453
|
+
}
|
|
1454
|
+
} else {
|
|
1455
|
+
console.error(
|
|
1456
|
+
`[GSD] REFUSING fallback rmSync — path is outside .gsd/worktrees/: ${wtDir}`,
|
|
1457
|
+
);
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
} finally {
|
|
1461
|
+
// Clear module state unconditionally — regardless of which step above
|
|
1462
|
+
// failed. A stale activeWorkspace causes getActiveAutoWorktreeContext()
|
|
1463
|
+
// to return wrong data for subsequent operations.
|
|
1464
|
+
setActiveWorkspace(null);
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
/**
|
|
1469
|
+
* Detect if the process is currently inside an auto-worktree.
|
|
1470
|
+
* Uses the current directory structure plus git branch prefix so detection
|
|
1471
|
+
* still works after process restart when module state has been reset.
|
|
1472
|
+
*/
|
|
1473
|
+
export function isInAutoWorktree(basePath: string): boolean {
|
|
1474
|
+
const targetPath = isGsdWorktreePath(basePath) ? basePath : process.cwd();
|
|
1475
|
+
if (!isGsdWorktreePath(targetPath)) return false;
|
|
1476
|
+
|
|
1477
|
+
const storedBase = getAutoWorktreeOriginalBase();
|
|
1478
|
+
const projectRoot = resolveWorktreeProjectRoot(basePath, storedBase);
|
|
1479
|
+
const targetProjectRoot = resolveWorktreeProjectRoot(targetPath, storedBase);
|
|
1480
|
+
if (
|
|
1481
|
+
normalizeWorktreePathForCompare(projectRoot) !==
|
|
1482
|
+
normalizeWorktreePathForCompare(targetProjectRoot)
|
|
1483
|
+
) {
|
|
1484
|
+
return false;
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
try {
|
|
1488
|
+
const branch = nativeGetCurrentBranch(targetPath);
|
|
1489
|
+
return branch.startsWith("milestone/");
|
|
1490
|
+
} catch {
|
|
1491
|
+
return false;
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
|
|
1495
|
+
/**
|
|
1496
|
+
* Get the filesystem path for an auto-worktree, or null if it doesn't exist
|
|
1497
|
+
* or is not a valid git worktree.
|
|
1498
|
+
*
|
|
1499
|
+
* Validates that the path is a real git worktree (has a .git file with a
|
|
1500
|
+
* gitdir: pointer) rather than just a stray directory. This prevents
|
|
1501
|
+
* mis-detection of leftover directories as active worktrees (#695).
|
|
1502
|
+
*/
|
|
1503
|
+
export function getAutoWorktreePath(
|
|
1504
|
+
basePath: string,
|
|
1505
|
+
milestoneId: string,
|
|
1506
|
+
): string | null {
|
|
1507
|
+
basePath = resolveWorktreeProjectRoot(basePath);
|
|
1508
|
+
|
|
1509
|
+
const p = worktreePath(basePath, milestoneId);
|
|
1510
|
+
if (!existsSync(p)) return null;
|
|
1511
|
+
|
|
1512
|
+
// Validate this is a real git worktree, not a stray directory.
|
|
1513
|
+
// A git worktree has a .git *file* (not directory) containing "gitdir: <path>".
|
|
1514
|
+
const gitPath = join(p, ".git");
|
|
1515
|
+
if (!existsSync(gitPath)) return null;
|
|
1516
|
+
try {
|
|
1517
|
+
const content = readFileSync(gitPath, "utf8").trim();
|
|
1518
|
+
if (!content.startsWith("gitdir: ")) return null;
|
|
1519
|
+
} catch (e) {
|
|
1520
|
+
logWarning("worktree", `getAutoWorktreePath .git read failed: ${(e as Error).message}`);
|
|
1521
|
+
return null;
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
return p;
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
/**
|
|
1528
|
+
* Enter an existing auto-worktree (chdir into it, store originalBase).
|
|
1529
|
+
* Use for resume -- the worktree already exists from a prior create.
|
|
1530
|
+
*
|
|
1531
|
+
* Atomic: chdir + originalBase update in same try block.
|
|
1532
|
+
*/
|
|
1533
|
+
export function enterAutoWorktree(
|
|
1534
|
+
basePath: string,
|
|
1535
|
+
milestoneId: string,
|
|
1536
|
+
): string {
|
|
1537
|
+
basePath = resolveWorktreeProjectRoot(basePath);
|
|
1538
|
+
|
|
1539
|
+
const p = worktreePath(basePath, milestoneId);
|
|
1540
|
+
if (!existsSync(p)) {
|
|
1541
|
+
throw new GSDError(
|
|
1542
|
+
GSD_IO_ERROR,
|
|
1543
|
+
`Auto-worktree for ${milestoneId} does not exist at ${p}`,
|
|
1544
|
+
);
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
// Validate this is a real git worktree, not a stray directory (#695)
|
|
1548
|
+
const gitPath = join(p, ".git");
|
|
1549
|
+
if (!existsSync(gitPath)) {
|
|
1550
|
+
throw new GSDError(
|
|
1551
|
+
GSD_GIT_ERROR,
|
|
1552
|
+
`Auto-worktree path ${p} exists but is not a git worktree (no .git)`,
|
|
1553
|
+
);
|
|
1554
|
+
}
|
|
1555
|
+
try {
|
|
1556
|
+
const content = readFileSync(gitPath, "utf8").trim();
|
|
1557
|
+
if (!content.startsWith("gitdir: ")) {
|
|
1558
|
+
throw new GSDError(
|
|
1559
|
+
GSD_GIT_ERROR,
|
|
1560
|
+
`Auto-worktree path ${p} has a .git but it is not a worktree gitdir pointer`,
|
|
1561
|
+
);
|
|
1562
|
+
}
|
|
1563
|
+
} catch (err) {
|
|
1564
|
+
if (err instanceof Error && err.message.includes("worktree")) throw err;
|
|
1565
|
+
throw new GSDError(
|
|
1566
|
+
GSD_IO_ERROR,
|
|
1567
|
+
`Auto-worktree path ${p} exists but .git is unreadable`,
|
|
1568
|
+
);
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1571
|
+
const previousCwd = process.cwd();
|
|
1572
|
+
|
|
1573
|
+
try {
|
|
1574
|
+
process.chdir(p);
|
|
1575
|
+
setActiveWorkspace(createWorkspace(basePath));
|
|
1576
|
+
} catch (err) {
|
|
1577
|
+
throw new GSDError(
|
|
1578
|
+
GSD_IO_ERROR,
|
|
1579
|
+
`Failed to enter auto-worktree at ${p}: ${err instanceof Error ? err.message : String(err)}`,
|
|
1580
|
+
);
|
|
1581
|
+
}
|
|
1582
|
+
|
|
1583
|
+
nudgeGitBranchCache(previousCwd);
|
|
1584
|
+
return p;
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
/**
|
|
1588
|
+
* Get the original project root stored when entering an auto-worktree.
|
|
1589
|
+
* Returns null if not currently in an auto-worktree.
|
|
1590
|
+
*/
|
|
1591
|
+
export function getAutoWorktreeOriginalBase(): string | null {
|
|
1592
|
+
return getActiveWorkspace()?.projectRoot ?? null;
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
/**
|
|
1596
|
+
* Test-only — resets the module-level `activeWorkspace` registry between
|
|
1597
|
+
* runs. Production code never clears the registry directly; tests call this
|
|
1598
|
+
* in `beforeEach`/`afterEach` to isolate registry-mutating cases. Renaming
|
|
1599
|
+
* the underscore-prefixed `_*ForTest` exports it joins (slice 7 / step G of
|
|
1600
|
+
* ADR-016) was deliberate: those wrapped real production helpers and lost
|
|
1601
|
+
* the suffix; this one stays as the only legitimate test-scaffolding export
|
|
1602
|
+
* because it has no production caller.
|
|
1603
|
+
*/
|
|
1604
|
+
export function _resetAutoWorktreeOriginalBaseForTests(): void {
|
|
1605
|
+
setActiveWorkspace(null);
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
export function getActiveAutoWorktreeContext(): {
|
|
1609
|
+
originalBase: string;
|
|
1610
|
+
worktreeName: string;
|
|
1611
|
+
branch: string;
|
|
1612
|
+
} | null {
|
|
1613
|
+
const ws = getActiveWorkspace();
|
|
1614
|
+
if (!ws) return null;
|
|
1615
|
+
const originalBase = ws.projectRoot;
|
|
1616
|
+
const cwd = process.cwd();
|
|
1617
|
+
if (!isGsdWorktreePath(cwd)) return null;
|
|
1618
|
+
const cwdProjectRoot = resolveWorktreeProjectRoot(cwd, originalBase);
|
|
1619
|
+
if (
|
|
1620
|
+
normalizeWorktreePathForCompare(cwdProjectRoot) !==
|
|
1621
|
+
normalizeWorktreePathForCompare(originalBase)
|
|
1622
|
+
) {
|
|
1623
|
+
return null;
|
|
1624
|
+
}
|
|
1625
|
+
const worktreeName = detectWorktreeName(cwd);
|
|
1626
|
+
if (!worktreeName) return null;
|
|
1627
|
+
const branch = nativeGetCurrentBranch(cwd);
|
|
1628
|
+
if (!branch.startsWith("milestone/")) return null;
|
|
1629
|
+
return {
|
|
1630
|
+
originalBase,
|
|
1631
|
+
worktreeName,
|
|
1632
|
+
branch,
|
|
1633
|
+
};
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
// ─── Merge Milestone -> Main ───────────────────────────────────────────────
|
|
1637
|
+
|
|
1638
|
+
/**
|
|
1639
|
+
* Auto-commit any dirty (uncommitted) state in the given directory.
|
|
1640
|
+
* Returns true if a commit was made, false if working tree was clean.
|
|
1641
|
+
*/
|
|
1642
|
+
function autoCommitDirtyState(cwd: string): boolean {
|
|
1643
|
+
try {
|
|
1644
|
+
const status = nativeWorkingTreeStatus(cwd);
|
|
1645
|
+
if (!status) return false;
|
|
1646
|
+
nativeAddAllWithExclusions(cwd, RUNTIME_EXCLUSION_PATHS);
|
|
1647
|
+
const result = nativeCommit(
|
|
1648
|
+
cwd,
|
|
1649
|
+
"chore: auto-commit before milestone merge",
|
|
1650
|
+
);
|
|
1651
|
+
return result !== null;
|
|
1652
|
+
} catch (e) {
|
|
1653
|
+
debugLog("autoCommitDirtyState", { error: String(e) });
|
|
1654
|
+
throw new GSDError(
|
|
1655
|
+
GSD_GIT_ERROR,
|
|
1656
|
+
`Failed to auto-commit dirty worktree state before milestone merge: ${e instanceof Error ? e.message : String(e)}`,
|
|
1657
|
+
);
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
/**
|
|
1662
|
+
* Squash-merge the milestone branch into main with a rich commit message
|
|
1663
|
+
* listing all completed slices, then tear down the worktree.
|
|
1664
|
+
*
|
|
1665
|
+
* Sequence:
|
|
1666
|
+
* 1. Auto-commit dirty worktree state
|
|
1667
|
+
* 2. chdir to originalBasePath
|
|
1668
|
+
* 3. git checkout main
|
|
1669
|
+
* 4. git merge --squash milestone/<MID>
|
|
1670
|
+
* 5. git commit with rich message
|
|
1671
|
+
* 6. Auto-push if enabled
|
|
1672
|
+
* 7. Delete milestone branch
|
|
1673
|
+
* 8. Remove worktree directory
|
|
1674
|
+
* 9. Clear originalBase
|
|
1675
|
+
*
|
|
1676
|
+
* On merge conflict: throws MergeConflictError.
|
|
1677
|
+
* On "nothing to commit" after squash: safe only if milestone work is already
|
|
1678
|
+
* on the integration branch. Throws if unanchored code changes would be lost.
|
|
1679
|
+
*
|
|
1680
|
+
* @internal **Do not call directly.** This is the inner squash-merge primitive
|
|
1681
|
+
* for the Worktree Lifecycle Module (ADR-016 phase 2 / A3, issue #5619).
|
|
1682
|
+
* Production callers must go through `WorktreeLifecycle.mergeMilestoneStandalone`
|
|
1683
|
+
* or `WorktreeLifecycle.exitMilestone({ merge: true })`. The export keyword
|
|
1684
|
+
* is preserved only so `auto.ts:buildWorktreeLifecycleDeps()` can wire this
|
|
1685
|
+
* function through the Module's deps seam — that is the construction of the
|
|
1686
|
+
* seam, not a bypass.
|
|
1687
|
+
*/
|
|
1688
|
+
export function mergeMilestoneToMain(
|
|
1689
|
+
originalBasePath_: string,
|
|
1690
|
+
milestoneId: string,
|
|
1691
|
+
roadmapContent: string,
|
|
1692
|
+
): { commitMessage: string; pushed: boolean; prCreated: boolean; codeFilesChanged: boolean } {
|
|
1693
|
+
const worktreeCwd = process.cwd();
|
|
1694
|
+
const milestoneBranch = autoWorktreeBranch(milestoneId);
|
|
1695
|
+
|
|
1696
|
+
// 1. Auto-commit dirty state before leaving.
|
|
1697
|
+
// Guard: when we entered through an auto-worktree (originalBase is set),
|
|
1698
|
+
// only auto-commit when cwd is on the milestone branch. In parallel mode,
|
|
1699
|
+
// cwd may be on the integration branch after a prior merge's
|
|
1700
|
+
// MergeConflictError left cwd unrestored. Auto-committing on the
|
|
1701
|
+
// integration branch captures dirty files from OTHER milestones under a
|
|
1702
|
+
// misleading commit message, contaminating the main branch (#2929).
|
|
1703
|
+
//
|
|
1704
|
+
// When activeWorkspace is null (branch mode, no worktree), autoCommitDirtyState
|
|
1705
|
+
// runs unconditionally — the caller is responsible for cwd placement.
|
|
1706
|
+
{
|
|
1707
|
+
let shouldAutoCommit = true;
|
|
1708
|
+
if (getActiveWorkspace() !== null) {
|
|
1709
|
+
try {
|
|
1710
|
+
const currentBranch = nativeGetCurrentBranch(worktreeCwd);
|
|
1711
|
+
shouldAutoCommit = currentBranch === milestoneBranch;
|
|
1712
|
+
} catch {
|
|
1713
|
+
// If we can't determine the branch, skip the auto-commit to be safe
|
|
1714
|
+
shouldAutoCommit = false;
|
|
1715
|
+
}
|
|
1716
|
+
}
|
|
1717
|
+
if (shouldAutoCommit) {
|
|
1718
|
+
autoCommitDirtyState(worktreeCwd);
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
|
|
1722
|
+
// Reconcile worktree DB into main DB before leaving worktree context.
|
|
1723
|
+
// Skip when both paths resolve to the same physical file (shared WAL /
|
|
1724
|
+
// symlink layout) — ATTACHing a WAL-mode file to itself corrupts the
|
|
1725
|
+
// database (#2823).
|
|
1726
|
+
if (isDbAvailable()) {
|
|
1727
|
+
try {
|
|
1728
|
+
const contract = resolveGsdPathContract(worktreeCwd, originalBasePath_);
|
|
1729
|
+
const worktreeDbPath = join(contract.worktreeGsd ?? join(worktreeCwd, ".gsd"), "gsd.db");
|
|
1730
|
+
const mainDbPath = contract.projectDb;
|
|
1731
|
+
if (_shouldReconcileWorktreeDb(worktreeDbPath, mainDbPath)) {
|
|
1732
|
+
reconcileWorktreeDb(mainDbPath, worktreeDbPath);
|
|
1733
|
+
}
|
|
1734
|
+
} catch (err) {
|
|
1735
|
+
/* non-fatal */
|
|
1736
|
+
logError("worktree", `DB reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
// 2. Get completed slices for commit message
|
|
1741
|
+
let completedSlices: { id: string; title: string; tasks: Array<{ id: string; title: string }> }[] = [];
|
|
1742
|
+
if (isDbAvailable()) {
|
|
1743
|
+
completedSlices = getMilestoneSlices(milestoneId)
|
|
1744
|
+
.filter(s => s.status === "complete")
|
|
1745
|
+
.map(s => ({
|
|
1746
|
+
id: s.id,
|
|
1747
|
+
title: stripGsdDisplayPrefix(s.title, s.id) ?? s.id,
|
|
1748
|
+
tasks: getSliceTasks(milestoneId, s.id)
|
|
1749
|
+
.filter((task) => task.status === "complete")
|
|
1750
|
+
.map((task) => ({
|
|
1751
|
+
id: task.id,
|
|
1752
|
+
title: stripGsdDisplayPrefix(task.title, task.id) ?? task.id,
|
|
1753
|
+
})),
|
|
1754
|
+
}));
|
|
1755
|
+
}
|
|
1756
|
+
// Fallback: parse roadmap content when DB is unavailable
|
|
1757
|
+
if (completedSlices.length === 0 && roadmapContent) {
|
|
1758
|
+
const sliceRe = /- \[x\] \*\*(\w+):\s*(.+?)\*\*/gi;
|
|
1759
|
+
let m: RegExpExecArray | null;
|
|
1760
|
+
while ((m = sliceRe.exec(roadmapContent)) !== null) {
|
|
1761
|
+
completedSlices.push({ id: m[1], title: m[2], tasks: [] });
|
|
1762
|
+
}
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
// 3. chdir to original base
|
|
1766
|
+
// Note: previousCwd captures the cwd at this point — i.e. the worktree cwd
|
|
1767
|
+
// entering the function. Subsequent throws restore to previousCwd, leaving
|
|
1768
|
+
// the caller in worktree-cwd; callers (worktree-resolver) are responsible
|
|
1769
|
+
// for any further cwd movement on the error path.
|
|
1770
|
+
const previousCwd = process.cwd();
|
|
1771
|
+
process.chdir(originalBasePath_);
|
|
1772
|
+
|
|
1773
|
+
// 4. Resolve integration branch via shared resolver so stale/invalid
|
|
1774
|
+
// milestone metadata can recover to configured/detected fallbacks.
|
|
1775
|
+
const prefs = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
|
|
1776
|
+
const branchResolution = resolveMilestoneIntegrationBranch(originalBasePath_, milestoneId, prefs);
|
|
1777
|
+
const mainBranch = branchResolution.effectiveBranch ?? nativeDetectMainBranch(originalBasePath_);
|
|
1778
|
+
|
|
1779
|
+
// Fail closed when the resolved integration branch is the milestone branch
|
|
1780
|
+
// itself (#5024). Stale or corrupt metadata (e.g. integrationBranch recorded
|
|
1781
|
+
// as "milestone/<MID>") would otherwise let the squash merge resolve to a
|
|
1782
|
+
// self-merge: nothing-to-commit + empty self-diff in the post-merge safety
|
|
1783
|
+
// check (#1792) collapse to a false success, and the worktree-resolver
|
|
1784
|
+
// emits worktree-merged for work that never landed on a distinct
|
|
1785
|
+
// integration branch.
|
|
1786
|
+
if (normalizeLocalBranchRef(mainBranch) === milestoneBranch) {
|
|
1787
|
+
process.chdir(previousCwd);
|
|
1788
|
+
throw new GSDError(
|
|
1789
|
+
GSD_GIT_ERROR,
|
|
1790
|
+
`Resolved integration branch "${mainBranch}" is the same ref as milestone branch ` +
|
|
1791
|
+
`"${milestoneBranch}" — refusing to self-merge. ${branchResolution.reason}. ` +
|
|
1792
|
+
`Repair milestone integration metadata before retrying milestone completion.`,
|
|
1793
|
+
);
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
// Remove transient project-root state files before any branch or merge
|
|
1797
|
+
// operation. Untracked milestone metadata can otherwise block squash merges.
|
|
1798
|
+
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
1799
|
+
|
|
1800
|
+
// 5. Checkout integration branch (skip if already current — avoids git error
|
|
1801
|
+
// when main is already checked out in the project-root worktree, #757)
|
|
1802
|
+
//
|
|
1803
|
+
// Refuse to proceed if the project root is in detached HEAD state. Silently
|
|
1804
|
+
// running `nativeCheckoutBranch(mainBranch)` on a detached HEAD would
|
|
1805
|
+
// abandon the user's deliberately-checked-out commit (mid-bisect, reviewing
|
|
1806
|
+
// a tag, CI checkout-sha) without warning. (Issue #4980 HIGH-10)
|
|
1807
|
+
const currentBranchAtBase = nativeGetCurrentBranch(originalBasePath_);
|
|
1808
|
+
if (!currentBranchAtBase || currentBranchAtBase.length === 0) {
|
|
1809
|
+
process.chdir(previousCwd);
|
|
1810
|
+
throw new GSDError(
|
|
1811
|
+
GSD_GIT_ERROR,
|
|
1812
|
+
`Project root is in detached HEAD state — cannot perform milestone merge. ` +
|
|
1813
|
+
`Checkout an integration branch (e.g. \`git checkout ${mainBranch}\`) before resuming.`,
|
|
1814
|
+
);
|
|
1815
|
+
}
|
|
1816
|
+
if (currentBranchAtBase !== mainBranch) {
|
|
1817
|
+
nativeCheckoutBranch(originalBasePath_, mainBranch);
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1820
|
+
// 6. Build rich commit message
|
|
1821
|
+
const dbMilestone = getMilestone(milestoneId);
|
|
1822
|
+
let milestoneTitle = stripGsdDisplayPrefix(dbMilestone?.title, milestoneId) ?? "";
|
|
1823
|
+
// Fallback: parse title from roadmap content header (e.g. "# M020: Backend foundation")
|
|
1824
|
+
if (!milestoneTitle && roadmapContent) {
|
|
1825
|
+
const titleMatch = roadmapContent.match(new RegExp(`^#\\s+${milestoneId}:\\s*(.+)`, "m"));
|
|
1826
|
+
if (titleMatch) milestoneTitle = titleMatch[1].trim();
|
|
1827
|
+
}
|
|
1828
|
+
milestoneTitle = milestoneTitle || milestoneId;
|
|
1829
|
+
const subject = `feat: ${milestoneTitle}`;
|
|
1830
|
+
const milestoneContext = milestoneTitle === milestoneId
|
|
1831
|
+
? `Milestone: ${milestoneId}`
|
|
1832
|
+
: `Milestone: ${milestoneId} - ${milestoneTitle}`;
|
|
1833
|
+
let body = "";
|
|
1834
|
+
if (completedSlices.length > 0) {
|
|
1835
|
+
const sliceLines = completedSlices
|
|
1836
|
+
.map((s) => `- ${s.id}: ${s.title}`)
|
|
1837
|
+
.join("\n");
|
|
1838
|
+
const taskLines = completedSlices
|
|
1839
|
+
.flatMap((s) => s.tasks.map((task) => `- ${s.id}/${task.id}: ${task.title}`))
|
|
1840
|
+
.join("\n");
|
|
1841
|
+
const taskBlock = taskLines ? `\n\nCompleted tasks:\n${taskLines}` : "";
|
|
1842
|
+
body = `\n\nCompleted slices:\n${sliceLines}${taskBlock}\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
|
|
1843
|
+
} else {
|
|
1844
|
+
body = `\n\n${milestoneContext}\nGSD-Milestone: ${milestoneId}\nBranch: ${milestoneBranch}`;
|
|
1845
|
+
}
|
|
1846
|
+
const commitMessage = subject + body;
|
|
1847
|
+
|
|
1848
|
+
// 6b. Reconcile worktree HEAD with milestone branch ref (#1846).
|
|
1849
|
+
// When the worktree HEAD detaches and advances past the named branch,
|
|
1850
|
+
// the branch ref becomes stale. Squash-merging the stale ref silently
|
|
1851
|
+
// orphans all commits between the branch ref and the actual worktree HEAD.
|
|
1852
|
+
// Fix: fast-forward the branch ref to the worktree HEAD before merging.
|
|
1853
|
+
// Only applies when merging from an actual worktree (worktreeCwd differs
|
|
1854
|
+
// from originalBasePath_).
|
|
1855
|
+
if (worktreeCwd !== originalBasePath_) {
|
|
1856
|
+
try {
|
|
1857
|
+
const worktreeHead = execFileSync("git", ["rev-parse", "HEAD"], {
|
|
1858
|
+
cwd: worktreeCwd,
|
|
1859
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1860
|
+
encoding: "utf-8",
|
|
1861
|
+
}).trim();
|
|
1862
|
+
const branchHead = execFileSync("git", ["rev-parse", milestoneBranch], {
|
|
1863
|
+
cwd: originalBasePath_,
|
|
1864
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
1865
|
+
encoding: "utf-8",
|
|
1866
|
+
}).trim();
|
|
1867
|
+
|
|
1868
|
+
if (worktreeHead && branchHead && worktreeHead !== branchHead) {
|
|
1869
|
+
if (nativeIsAncestor(originalBasePath_, branchHead, worktreeHead)) {
|
|
1870
|
+
// Worktree HEAD is strictly ahead — fast-forward the branch ref
|
|
1871
|
+
nativeUpdateRef(
|
|
1872
|
+
originalBasePath_,
|
|
1873
|
+
`refs/heads/${milestoneBranch}`,
|
|
1874
|
+
worktreeHead,
|
|
1875
|
+
);
|
|
1876
|
+
debugLog("mergeMilestoneToMain", {
|
|
1877
|
+
action: "fast-forward-branch-ref",
|
|
1878
|
+
milestoneBranch,
|
|
1879
|
+
oldRef: branchHead.slice(0, 8),
|
|
1880
|
+
newRef: worktreeHead.slice(0, 8),
|
|
1881
|
+
});
|
|
1882
|
+
} else {
|
|
1883
|
+
// Diverged — fail loudly rather than silently losing commits
|
|
1884
|
+
process.chdir(previousCwd);
|
|
1885
|
+
throw new GSDError(
|
|
1886
|
+
GSD_GIT_ERROR,
|
|
1887
|
+
`Worktree HEAD (${worktreeHead.slice(0, 8)}) diverged from ` +
|
|
1888
|
+
`${milestoneBranch} (${branchHead.slice(0, 8)}). ` +
|
|
1889
|
+
`Manual reconciliation required before merge.`,
|
|
1890
|
+
);
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
} catch (err) {
|
|
1894
|
+
// Re-throw GSDError (divergence); swallow rev-parse failures
|
|
1895
|
+
// (e.g. worktree dir already removed by external cleanup)
|
|
1896
|
+
if (err instanceof GSDError) throw err;
|
|
1897
|
+
debugLog("mergeMilestoneToMain", {
|
|
1898
|
+
action: "reconcile-skipped",
|
|
1899
|
+
reason: String(err),
|
|
1900
|
+
});
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1903
|
+
|
|
1904
|
+
// Already regular-merged milestones can skip the squash path and proceed to cleanup (#5831).
|
|
1905
|
+
if (nativeIsAncestor(originalBasePath_, milestoneBranch, mainBranch)) {
|
|
1906
|
+
const codeChanges = nativeDiffNumstat(
|
|
1907
|
+
originalBasePath_,
|
|
1908
|
+
mainBranch,
|
|
1909
|
+
milestoneBranch,
|
|
1910
|
+
).filter((entry) => !entry.path.startsWith(".gsd/"));
|
|
1911
|
+
if (codeChanges.length > 0) {
|
|
1912
|
+
const regularMergeChangedPaths = findRegularMergeChangedPaths(
|
|
1913
|
+
originalBasePath_,
|
|
1914
|
+
milestoneBranch,
|
|
1915
|
+
mainBranch,
|
|
1916
|
+
);
|
|
1917
|
+
const unanchoredCodeChanges = codeChanges.filter((entry) =>
|
|
1918
|
+
regularMergeChangedPaths.has(entry.path)
|
|
1919
|
+
);
|
|
1920
|
+
if (unanchoredCodeChanges.length > 0) {
|
|
1921
|
+
process.chdir(previousCwd);
|
|
1922
|
+
throw new GSDError(
|
|
1923
|
+
GSD_GIT_ERROR,
|
|
1924
|
+
`Milestone branch "${milestoneBranch}" is reachable from "${mainBranch}" ` +
|
|
1925
|
+
`but has ${unanchoredCodeChanges.length} milestone-touched code file(s) not on current "${mainBranch}". ` +
|
|
1926
|
+
`Aborting worktree teardown to prevent data loss.`,
|
|
1927
|
+
);
|
|
1928
|
+
}
|
|
1929
|
+
}
|
|
1930
|
+
debugLog("mergeMilestoneToMain", {
|
|
1931
|
+
action: "skip-squash-already-merged",
|
|
1932
|
+
milestoneId,
|
|
1933
|
+
milestoneBranch,
|
|
1934
|
+
mainBranch,
|
|
1935
|
+
});
|
|
1936
|
+
try {
|
|
1937
|
+
clearProjectRootStateFiles(originalBasePath_, milestoneId);
|
|
1938
|
+
} catch (err) {
|
|
1939
|
+
logWarning("worktree", `clearProjectRootStateFiles failed during already-merged cleanup: ${err instanceof Error ? err.message : String(err)}`);
|
|
1940
|
+
}
|
|
1941
|
+
try {
|
|
1942
|
+
removeWorktree(originalBasePath_, milestoneId, {
|
|
1943
|
+
branch: milestoneBranch,
|
|
1944
|
+
deleteBranch: false,
|
|
1945
|
+
});
|
|
1946
|
+
} catch (err) {
|
|
1947
|
+
logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1948
|
+
}
|
|
1949
|
+
try {
|
|
1950
|
+
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
1951
|
+
} catch (err) {
|
|
1952
|
+
logWarning("worktree", `git branch-delete failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1953
|
+
}
|
|
1954
|
+
setActiveWorkspace(null);
|
|
1955
|
+
nudgeGitBranchCache(previousCwd);
|
|
1956
|
+
try {
|
|
1957
|
+
process.chdir(originalBasePath_);
|
|
1958
|
+
} catch (err) {
|
|
1959
|
+
logWarning("worktree", `chdir to project root after already-merged cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1960
|
+
}
|
|
1961
|
+
return { commitMessage, pushed: false, prCreated: false, codeFilesChanged: true };
|
|
1962
|
+
}
|
|
1963
|
+
|
|
1964
|
+
// 7. Shelter queued milestone directories before the squash merge (#2505).
|
|
1965
|
+
// The milestone branch may contain copies of queued milestone dirs (via
|
|
1966
|
+
// copyPlanningArtifacts), so `git merge --squash` rejects when those same
|
|
1967
|
+
// files exist as untracked in the working tree. Temporarily move them to
|
|
1968
|
+
// a backup location, then restore after the merge+commit.
|
|
1969
|
+
//
|
|
1970
|
+
// MUST run BEFORE the pre-merge stash (step 7a) so `--include-untracked`
|
|
1971
|
+
// does not sweep queued CONTEXT files into the stash. If stash pop later
|
|
1972
|
+
// fails, files trapped inside the stash are permanently lost (#2505).
|
|
1973
|
+
const milestonesDir = join(gsdRoot(originalBasePath_), "milestones");
|
|
1974
|
+
const shelterDir = join(gsdRoot(originalBasePath_), ".milestone-shelter");
|
|
1975
|
+
const shelteredDirs: string[] = [];
|
|
1976
|
+
let shelterRestored = false;
|
|
1977
|
+
|
|
1978
|
+
// Helper: restore sheltered milestone directories (#2505).
|
|
1979
|
+
// Called on both success and error paths to ensure queued CONTEXT files
|
|
1980
|
+
// are never permanently lost. Idempotent — the error path may fire after
|
|
1981
|
+
// the success path has already restored and removed the shelter dir; a
|
|
1982
|
+
// second call is a no-op instead of logging a misleading "shelter restore
|
|
1983
|
+
// failed: ENOENT" error for shelter sources that were cleaned up legitimately.
|
|
1984
|
+
const restoreShelter = (): void => {
|
|
1985
|
+
if (shelterRestored) return;
|
|
1986
|
+
shelterRestored = true;
|
|
1987
|
+
if (shelteredDirs.length === 0) return;
|
|
1988
|
+
let restoreFailed = false;
|
|
1989
|
+
for (const dirName of shelteredDirs) {
|
|
1990
|
+
const src = join(shelterDir, dirName);
|
|
1991
|
+
// If the shelter source is missing the restore cannot proceed for this
|
|
1992
|
+
// entry. Distinguish "legitimately missing" (shelter dir removed by a
|
|
1993
|
+
// prior successful restore or never copied) from a surprising ENOENT
|
|
1994
|
+
// inside an otherwise-populated shelter.
|
|
1995
|
+
if (!existsSync(src)) {
|
|
1996
|
+
logWarning(
|
|
1997
|
+
"worktree",
|
|
1998
|
+
`shelter source missing for ${dirName}; skipping restore (shelter already cleaned or entry never staged)`,
|
|
1999
|
+
);
|
|
2000
|
+
continue;
|
|
2001
|
+
}
|
|
2002
|
+
try {
|
|
2003
|
+
mkdirSync(milestonesDir, { recursive: true });
|
|
2004
|
+
cpSync(src, join(milestonesDir, dirName), { recursive: true, force: true });
|
|
2005
|
+
} catch (err) { /* best-effort */
|
|
2006
|
+
restoreFailed = true;
|
|
2007
|
+
logError("worktree", `shelter restore failed (${dirName}): ${err instanceof Error ? err.message : String(err)}`);
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2010
|
+
// Preserve the shelter if any per-entry restore failed — it is the only
|
|
2011
|
+
// surviving copy of the queued milestone dirs (sources were deleted during
|
|
2012
|
+
// shelter). Deleting it here would permanently lose those files (#2505).
|
|
2013
|
+
if (restoreFailed) {
|
|
2014
|
+
logWarning("worktree", `shelter retained at ${shelterDir} — manual recovery required for unrestored entries`);
|
|
2015
|
+
return;
|
|
2016
|
+
}
|
|
2017
|
+
if (existsSync(shelterDir)) {
|
|
2018
|
+
try { rmSync(shelterDir, { recursive: true, force: true }); } catch (err) { /* best-effort */
|
|
2019
|
+
logWarning("worktree", `shelter cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2020
|
+
}
|
|
2021
|
+
}
|
|
2022
|
+
};
|
|
2023
|
+
|
|
2024
|
+
try {
|
|
2025
|
+
if (existsSync(milestonesDir)) {
|
|
2026
|
+
const entries = readdirSync(milestonesDir, { withFileTypes: true });
|
|
2027
|
+
for (const entry of entries) {
|
|
2028
|
+
if (!entry.isDirectory()) continue;
|
|
2029
|
+
// Only shelter directories that do NOT belong to the milestone being merged
|
|
2030
|
+
if (entry.name === milestoneId) continue;
|
|
2031
|
+
const srcDir = join(milestonesDir, entry.name);
|
|
2032
|
+
const dstDir = join(shelterDir, entry.name);
|
|
2033
|
+
try {
|
|
2034
|
+
mkdirSync(shelterDir, { recursive: true });
|
|
2035
|
+
cpSync(srcDir, dstDir, { recursive: true, force: true });
|
|
2036
|
+
rmSync(srcDir, { recursive: true, force: true });
|
|
2037
|
+
shelteredDirs.push(entry.name);
|
|
2038
|
+
} catch (err) {
|
|
2039
|
+
// Non-fatal — if shelter fails, the merge may still succeed
|
|
2040
|
+
logWarning("worktree", `milestone shelter failed (${entry.name}): ${err instanceof Error ? err.message : String(err)}`);
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
}
|
|
2044
|
+
} catch (err) {
|
|
2045
|
+
// Non-fatal — proceed with merge; untracked files may block it
|
|
2046
|
+
logWarning("worktree", `milestone shelter operation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2047
|
+
}
|
|
2048
|
+
|
|
2049
|
+
// 7a. Stash pre-existing dirty files so the squash merge is not blocked by
|
|
2050
|
+
// unrelated local changes (#2151). Includes untracked files to handle
|
|
2051
|
+
// locally-added files that conflict with tracked files on the milestone
|
|
2052
|
+
// branch. Passing NO pathspec lets git skip gitignored paths silently;
|
|
2053
|
+
// adding an explicit pathspec trips a `git add`-style fatal on ignored
|
|
2054
|
+
// entries (e.g. a gitignored `.gsd` symlink under ADR-002) (#4573).
|
|
2055
|
+
// Queued CONTEXT files under `.gsd/milestones/*` are already sheltered
|
|
2056
|
+
// in step 7 above, so they won't be swept into the stash.
|
|
2057
|
+
// On Windows, SQLite holds mandatory file locks on the gsd.db WAL/SHM
|
|
2058
|
+
// sidecars while the connection is open. `git stash --include-untracked`
|
|
2059
|
+
// walks those files and fails with EBUSY (#4704). Close the DB before
|
|
2060
|
+
// stashing so Windows releases the handles; reopen after. No-op on
|
|
2061
|
+
// POSIX, where advisory locks don't block git.
|
|
2062
|
+
const needsDbCycle = process.platform === "win32" && isDbAvailable();
|
|
2063
|
+
const dbPathToReopen = needsDbCycle ? getDbPath() : null;
|
|
2064
|
+
if (needsDbCycle) {
|
|
2065
|
+
try {
|
|
2066
|
+
closeDatabase();
|
|
2067
|
+
} catch (err) {
|
|
2068
|
+
logWarning("worktree", `pre-stash db close failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2069
|
+
}
|
|
2070
|
+
}
|
|
2071
|
+
|
|
2072
|
+
let stashed = false;
|
|
2073
|
+
// Embed a unique marker in the stash message so subsequent pop/drop targets
|
|
2074
|
+
// the entry we created, not whatever happens to be at stash@{0} (concurrent
|
|
2075
|
+
// milestone merges share the project-root stash list and can shift positions).
|
|
2076
|
+
// (Issue #4980 HIGH-6)
|
|
2077
|
+
let stashMarker: string | null = null;
|
|
2078
|
+
try {
|
|
2079
|
+
const status = execFileSync("git", ["status", "--porcelain"], {
|
|
2080
|
+
cwd: originalBasePath_,
|
|
2081
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
2082
|
+
encoding: "utf-8",
|
|
2083
|
+
}).trim();
|
|
2084
|
+
if (status) {
|
|
2085
|
+
stashMarker = `gsd-pre-merge:${milestoneId}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
|
|
2086
|
+
execFileSync(
|
|
2087
|
+
"git",
|
|
2088
|
+
["stash", "push", "--include-untracked", "-m", `gsd: pre-merge stash for ${milestoneId} [${stashMarker}]`],
|
|
2089
|
+
{ cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
2090
|
+
);
|
|
2091
|
+
stashed = true;
|
|
2092
|
+
}
|
|
2093
|
+
} catch (err) {
|
|
2094
|
+
// Stash failure is non-fatal — proceed without stash and let the merge
|
|
2095
|
+
// report the dirty tree if it fails.
|
|
2096
|
+
logWarning("worktree", `git stash failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2097
|
+
}
|
|
2098
|
+
|
|
2099
|
+
// 7b. Clean up stale merge state before attempting squash merge (#2912).
|
|
2100
|
+
// A leftover MERGE_HEAD (from a previous failed merge, libgit2 native path,
|
|
2101
|
+
// or interrupted operation) causes `git merge --squash` to refuse with
|
|
2102
|
+
// "fatal: You have not concluded your merge (MERGE_HEAD exists)".
|
|
2103
|
+
// Defensively remove merge artifacts before starting.
|
|
2104
|
+
removeMergeStateFiles(originalBasePath_, "pre-merge");
|
|
2105
|
+
|
|
2106
|
+
// 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530)
|
|
2107
|
+
const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);
|
|
2108
|
+
if (needsDbCycle && dbPathToReopen) {
|
|
2109
|
+
try {
|
|
2110
|
+
openDatabase(dbPathToReopen);
|
|
2111
|
+
} catch (err) {
|
|
2112
|
+
logWarning("worktree", `post-merge db reopen failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2113
|
+
}
|
|
2114
|
+
}
|
|
2115
|
+
|
|
2116
|
+
if (!mergeResult.success) {
|
|
2117
|
+
// Dirty working tree — the merge was rejected before it started (e.g.
|
|
2118
|
+
// untracked .gsd/ files left by syncStateToProjectRoot). Preserve the
|
|
2119
|
+
// milestone branch so commits are not lost.
|
|
2120
|
+
if (mergeResult.conflicts.includes("__dirty_working_tree__")) {
|
|
2121
|
+
// Defensively clean merge state — the native path may leave MERGE_HEAD
|
|
2122
|
+
// even when the merge is rejected (#2912).
|
|
2123
|
+
removeMergeStateFiles(originalBasePath_, "dirty-tree rejection");
|
|
2124
|
+
|
|
2125
|
+
// Pop stash before throwing so local work is not lost.
|
|
2126
|
+
if (stashed) {
|
|
2127
|
+
try {
|
|
2128
|
+
popStashByRef(originalBasePath_, stashMarker);
|
|
2129
|
+
} catch (err) { /* stash pop conflict is non-fatal */
|
|
2130
|
+
logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2133
|
+
restoreShelter();
|
|
2134
|
+
// Restore cwd so the caller is not stranded on the integration branch
|
|
2135
|
+
process.chdir(previousCwd);
|
|
2136
|
+
// Surface the actual dirty filenames from git stderr instead of
|
|
2137
|
+
// generically blaming .gsd/ (#2151).
|
|
2138
|
+
const fileList = mergeResult.dirtyFiles?.length
|
|
2139
|
+
? `Dirty files:\n${mergeResult.dirtyFiles.map((f) => ` ${f}`).join("\n")}`
|
|
2140
|
+
: `Check \`git status\` in the project root for details.`;
|
|
2141
|
+
throw new GSDError(
|
|
2142
|
+
GSD_GIT_ERROR,
|
|
2143
|
+
`Squash merge of ${milestoneBranch} rejected: working tree has dirty or untracked files ` +
|
|
2144
|
+
`that conflict with the merge. ${fileList}`,
|
|
2145
|
+
);
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
// Check for conflicts — use merge result first, fall back to nativeConflictFiles
|
|
2149
|
+
const conflictedFiles =
|
|
2150
|
+
mergeResult.conflicts.length > 0
|
|
2151
|
+
? mergeResult.conflicts
|
|
2152
|
+
: nativeConflictFiles(originalBasePath_);
|
|
2153
|
+
|
|
2154
|
+
if (conflictedFiles.length > 0) {
|
|
2155
|
+
// Separate auto-resolvable conflicts (GSD state files + build artifacts)
|
|
2156
|
+
// from real code conflicts. GSD state files diverge between branches
|
|
2157
|
+
// during normal operation. Build artifacts are machine-generated and
|
|
2158
|
+
// regenerable. Both are safe to accept from the milestone branch.
|
|
2159
|
+
const autoResolvable = conflictedFiles.filter(isSafeToAutoResolve);
|
|
2160
|
+
const codeConflicts = conflictedFiles.filter(
|
|
2161
|
+
(f) => !isSafeToAutoResolve(f),
|
|
2162
|
+
);
|
|
2163
|
+
|
|
2164
|
+
// Auto-resolve safe conflicts by accepting the milestone branch version
|
|
2165
|
+
if (autoResolvable.length > 0) {
|
|
2166
|
+
for (const safeFile of autoResolvable) {
|
|
2167
|
+
try {
|
|
2168
|
+
nativeCheckoutTheirs(originalBasePath_, [safeFile]);
|
|
2169
|
+
nativeAddPaths(originalBasePath_, [safeFile]);
|
|
2170
|
+
} catch (e) {
|
|
2171
|
+
// If checkout --theirs fails, try removing the file from the merge
|
|
2172
|
+
// (it's a runtime file that shouldn't be committed anyway)
|
|
2173
|
+
logWarning("worktree", `checkout --theirs failed for ${safeFile}, removing: ${(e as Error).message}`);
|
|
2174
|
+
nativeRmForce(originalBasePath_, [safeFile]);
|
|
2175
|
+
}
|
|
2176
|
+
}
|
|
2177
|
+
}
|
|
2178
|
+
|
|
2179
|
+
// If there are still real code conflicts, escalate
|
|
2180
|
+
if (codeConflicts.length > 0) {
|
|
2181
|
+
cleanupSquashConflictState(originalBasePath_);
|
|
2182
|
+
|
|
2183
|
+
// Pop stash before throwing so local work is not lost (#2151).
|
|
2184
|
+
if (stashed) {
|
|
2185
|
+
try {
|
|
2186
|
+
popStashByRef(originalBasePath_, stashMarker);
|
|
2187
|
+
} catch (err) { /* stash pop conflict is non-fatal */
|
|
2188
|
+
logWarning("worktree", `git stash pop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2189
|
+
}
|
|
2190
|
+
}
|
|
2191
|
+
restoreShelter();
|
|
2192
|
+
// Restore cwd so the caller is not stranded on the integration branch.
|
|
2193
|
+
// Without this, the next mergeMilestoneToMain call in a parallel merge
|
|
2194
|
+
// sequence uses process.cwd() (now the project root) as worktreeCwd,
|
|
2195
|
+
// causing autoCommitDirtyState to commit unrelated milestone files to
|
|
2196
|
+
// the integration branch (#2929).
|
|
2197
|
+
process.chdir(previousCwd);
|
|
2198
|
+
throw new MergeConflictError(
|
|
2199
|
+
codeConflicts,
|
|
2200
|
+
"squash",
|
|
2201
|
+
milestoneBranch,
|
|
2202
|
+
mainBranch,
|
|
2203
|
+
);
|
|
2204
|
+
}
|
|
2205
|
+
}
|
|
2206
|
+
// No conflicts detected — possibly "already up to date", fall through to commit
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
// 9. Commit (handle nothing-to-commit gracefully)
|
|
2210
|
+
const commitResult = nativeCommit(originalBasePath_, commitMessage);
|
|
2211
|
+
const nothingToCommit = commitResult === null;
|
|
2212
|
+
|
|
2213
|
+
// 9a. Clean up merge state files left by git merge --squash (#1853, #2912).
|
|
2214
|
+
// git only removes SQUASH_MSG when the commit reads it directly (plain
|
|
2215
|
+
// `git commit`). nativeCommit uses `-F -` (stdin) or libgit2, neither
|
|
2216
|
+
// of which trigger git's SQUASH_MSG cleanup. MERGE_HEAD is created by
|
|
2217
|
+
// libgit2's merge even in squash mode and is not removed by nativeCommit.
|
|
2218
|
+
// If left on disk, doctor reports `corrupt_merge_state` on every subsequent run.
|
|
2219
|
+
removeMergeStateFiles(originalBasePath_, "post-commit");
|
|
2220
|
+
|
|
2221
|
+
// 9a-ii. Restore stashed files now that the merge+commit is complete (#2151).
|
|
2222
|
+
// Pop after commit so stashed changes do not interfere with the squash merge
|
|
2223
|
+
// or the commit content. Conflict on pop is non-fatal — the stash entry is
|
|
2224
|
+
// preserved and the user can resolve manually with `git stash pop`.
|
|
2225
|
+
if (stashed) {
|
|
2226
|
+
let stashRefForDrop: string | null = null;
|
|
2227
|
+
try {
|
|
2228
|
+
stashRefForDrop = popStashByRef(originalBasePath_, stashMarker);
|
|
2229
|
+
} catch (e) {
|
|
2230
|
+
stashRefForDrop = stashRefFromError(e);
|
|
2231
|
+
logWarning("worktree", `git stash pop failed, attempting conflict resolution: ${(e as Error).message}`);
|
|
2232
|
+
// Stash pop after squash merge can conflict on .gsd/ state files that
|
|
2233
|
+
// diverged between branches. Left unresolved, these UU entries block
|
|
2234
|
+
// every subsequent merge. Auto-resolve them the same way we handle
|
|
2235
|
+
// .gsd/ conflicts during the merge itself: accept HEAD (the just-committed
|
|
2236
|
+
// version) and drop the now-applied stash.
|
|
2237
|
+
const uu = nativeConflictFiles(originalBasePath_);
|
|
2238
|
+
const gsdUU = uu.filter((f) => f.startsWith(".gsd/"));
|
|
2239
|
+
const nonGsdUU = uu.filter((f) => !f.startsWith(".gsd/"));
|
|
2240
|
+
const stashPopMessage = e instanceof Error ? e.message : String(e);
|
|
2241
|
+
const isUntrackedRestoreFailure = stashPopMessage.includes("could not restore untracked files from stash");
|
|
2242
|
+
const gsdContentConflicts: string[] = [];
|
|
2243
|
+
const alreadyExists = stashAlreadyExistsFilesFromError(e);
|
|
2244
|
+
const gsdAlreadyExists = alreadyExists.filter((f) => f.startsWith(".gsd/"));
|
|
2245
|
+
const nonGsdAlreadyExists = alreadyExists.filter((f) => !f.startsWith(".gsd/"));
|
|
2246
|
+
|
|
2247
|
+
// Untracked-file restore failures can leave marker conflicts in tracked
|
|
2248
|
+
// .gsd JSONL files without producing `U` status entries.
|
|
2249
|
+
if (isUntrackedRestoreFailure) {
|
|
2250
|
+
for (const f of nativeLsFiles(originalBasePath_, ".gsd/*.jsonl")) {
|
|
2251
|
+
if (hasConflictMarkers(join(originalBasePath_, f))) {
|
|
2252
|
+
gsdContentConflicts.push(f);
|
|
2253
|
+
}
|
|
2254
|
+
}
|
|
2255
|
+
}
|
|
2256
|
+
const gsdConflictFiles = [...new Set([...gsdUU, ...gsdContentConflicts])];
|
|
2257
|
+
|
|
2258
|
+
if (gsdConflictFiles.length > 0) {
|
|
2259
|
+
for (const f of gsdConflictFiles) {
|
|
2260
|
+
try {
|
|
2261
|
+
// Accept the committed (HEAD) version of the state file
|
|
2262
|
+
execFileSync("git", ["checkout", "HEAD", "--", f], {
|
|
2263
|
+
cwd: originalBasePath_,
|
|
2264
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
2265
|
+
encoding: "utf-8",
|
|
2266
|
+
});
|
|
2267
|
+
nativeAddPaths(originalBasePath_, [f]);
|
|
2268
|
+
} catch (e) {
|
|
2269
|
+
// Last resort: remove the conflicted state file
|
|
2270
|
+
logWarning("worktree", `checkout HEAD failed for ${f}, removing: ${(e as Error).message}`);
|
|
2271
|
+
nativeRmForce(originalBasePath_, [f]);
|
|
2272
|
+
}
|
|
2273
|
+
}
|
|
2274
|
+
}
|
|
2275
|
+
|
|
2276
|
+
if (gsdConflictFiles.length > 0 && nonGsdUU.length === 0) {
|
|
2277
|
+
// All detected conflicts were .gsd/ files. Before dropping, verify no
|
|
2278
|
+
// unresolved non-.gsd conflict markers or unmerged entries remain.
|
|
2279
|
+
const remainingUnmerged = nativeConflictFiles(originalBasePath_);
|
|
2280
|
+
const nonGsdUnmerged = remainingUnmerged.filter((f) => !f.startsWith(".gsd/"));
|
|
2281
|
+
const markerCandidates = Array.from(new Set([
|
|
2282
|
+
...nonGsdUnmerged,
|
|
2283
|
+
...nativeLsFiles(originalBasePath_, "."),
|
|
2284
|
+
])).filter((f) => !f.startsWith(".gsd/"));
|
|
2285
|
+
const nonGsdMarkerConflicts = markerCandidates.filter((f) =>
|
|
2286
|
+
hasConflictMarkers(join(originalBasePath_, f)),
|
|
2287
|
+
);
|
|
2288
|
+
const hasRemainingNonGsdConflicts = nonGsdUnmerged.length > 0 || nonGsdMarkerConflicts.length > 0;
|
|
2289
|
+
if (hasRemainingNonGsdConflicts) {
|
|
2290
|
+
const files = Array.from(new Set([...nonGsdUnmerged, ...nonGsdMarkerConflicts]));
|
|
2291
|
+
logWarning("reconcile", "Leaving stash because non-.gsd conflicts remain after auto-resolution", {
|
|
2292
|
+
files: files.join(", "),
|
|
2293
|
+
});
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
// No non-.gsd conflicts remain — safe to drop the stash.
|
|
2297
|
+
if (!hasRemainingNonGsdConflicts && stashRefForDrop) {
|
|
2298
|
+
try {
|
|
2299
|
+
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
2300
|
+
cwd: originalBasePath_,
|
|
2301
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
2302
|
+
encoding: "utf-8",
|
|
2303
|
+
});
|
|
2304
|
+
} catch (err) { /* stash may already be consumed */
|
|
2305
|
+
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2306
|
+
}
|
|
2307
|
+
} else if (!hasRemainingNonGsdConflicts) {
|
|
2308
|
+
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
2309
|
+
}
|
|
2310
|
+
} else if (
|
|
2311
|
+
gsdUU.length === 0 &&
|
|
2312
|
+
nonGsdUU.length === 0 &&
|
|
2313
|
+
gsdAlreadyExists.length > 0 &&
|
|
2314
|
+
nonGsdAlreadyExists.length === 0
|
|
2315
|
+
) {
|
|
2316
|
+
// Untracked-file restore failure from stash pop where all collided
|
|
2317
|
+
// paths are .gsd/ artifacts that already exist after merge.
|
|
2318
|
+
if (stashRefForDrop) {
|
|
2319
|
+
try {
|
|
2320
|
+
execFileSync("git", ["stash", "drop", stashRefForDrop], {
|
|
2321
|
+
cwd: originalBasePath_,
|
|
2322
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
2323
|
+
encoding: "utf-8",
|
|
2324
|
+
});
|
|
2325
|
+
} catch (err) { /* stash may already be consumed */
|
|
2326
|
+
logWarning("worktree", `git stash drop failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2327
|
+
}
|
|
2328
|
+
} else {
|
|
2329
|
+
logWarning("worktree", "recorded stash entry could not be resolved; skipping automatic drop");
|
|
2330
|
+
}
|
|
2331
|
+
} else if (nonGsdUU.length > 0) {
|
|
2332
|
+
// Non-.gsd conflicts remain — leave stash for manual resolution
|
|
2333
|
+
logWarning("reconcile", "Stash pop conflict on non-.gsd files after merge", {
|
|
2334
|
+
files: nonGsdUU.join(", "),
|
|
2335
|
+
});
|
|
2336
|
+
} else if (nonGsdAlreadyExists.length > 0) {
|
|
2337
|
+
logWarning("reconcile", "Stash pop restore collision on non-.gsd files after merge", {
|
|
2338
|
+
files: nonGsdAlreadyExists.join(", "),
|
|
2339
|
+
});
|
|
2340
|
+
} else {
|
|
2341
|
+
logWarning(
|
|
2342
|
+
"worktree",
|
|
2343
|
+
"git stash pop failed without resolvable conflict files; leaving stash for manual recovery",
|
|
2344
|
+
);
|
|
2345
|
+
}
|
|
2346
|
+
}
|
|
2347
|
+
}
|
|
2348
|
+
|
|
2349
|
+
// 9a-iii. Restore sheltered queued milestone directories (#2505).
|
|
2350
|
+
restoreShelter();
|
|
2351
|
+
|
|
2352
|
+
// 9b. Safety check (#1792): if nothing was committed, verify the milestone
|
|
2353
|
+
// work is already on the integration branch before allowing teardown.
|
|
2354
|
+
// Compare only non-.gsd/ paths — .gsd/ state files diverge normally and
|
|
2355
|
+
// are auto-resolved during the squash merge.
|
|
2356
|
+
if (nothingToCommit) {
|
|
2357
|
+
const numstat = nativeDiffNumstat(
|
|
2358
|
+
originalBasePath_,
|
|
2359
|
+
mainBranch,
|
|
2360
|
+
milestoneBranch,
|
|
2361
|
+
);
|
|
2362
|
+
const codeChanges = numstat.filter(
|
|
2363
|
+
(entry) => !entry.path.startsWith(".gsd/"),
|
|
2364
|
+
);
|
|
2365
|
+
if (codeChanges.length > 0) {
|
|
2366
|
+
// Milestone has unanchored code changes — abort teardown.
|
|
2367
|
+
process.chdir(previousCwd);
|
|
2368
|
+
throw new GSDError(
|
|
2369
|
+
GSD_GIT_ERROR,
|
|
2370
|
+
`Squash merge produced nothing to commit but milestone branch "${milestoneBranch}" ` +
|
|
2371
|
+
`has ${codeChanges.length} code file(s) not on "${mainBranch}". ` +
|
|
2372
|
+
`Aborting worktree teardown to prevent data loss.`,
|
|
2373
|
+
);
|
|
2374
|
+
}
|
|
2375
|
+
}
|
|
2376
|
+
|
|
2377
|
+
// 9c. Detect whether any non-.gsd/ code files were actually merged (#1906).
|
|
2378
|
+
// When a milestone only produced .gsd/ metadata (summaries, roadmaps) but no
|
|
2379
|
+
// real code, the user sees "milestone complete" but nothing changed in their
|
|
2380
|
+
// codebase. Surface this so the caller can warn the user.
|
|
2381
|
+
//
|
|
2382
|
+
// Bug #4385 fix: use `git diff-tree --root` instead of `git diff HEAD~1 HEAD`.
|
|
2383
|
+
// `HEAD~1` does not exist on initial commits and is unreliable on shallow clones
|
|
2384
|
+
// and merge commits. `diff-tree --root` handles all three cases correctly.
|
|
2385
|
+
// The empty-tree hash (4b825dc…) is the universal fallback for refs that don't exist.
|
|
2386
|
+
const GIT_EMPTY_TREE = "4b825dc642cb6eb9a060e54bf8d69288fbee4904";
|
|
2387
|
+
let codeFilesChanged = false;
|
|
2388
|
+
if (!nothingToCommit) {
|
|
2389
|
+
try {
|
|
2390
|
+
const diffTreeOutput = execFileSync(
|
|
2391
|
+
"git",
|
|
2392
|
+
["diff-tree", "--root", "--no-commit-id", "-r", "--name-only", "HEAD"],
|
|
2393
|
+
{ cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
2394
|
+
).trim();
|
|
2395
|
+
const mergedFiles = diffTreeOutput ? diffTreeOutput.split("\n").filter(Boolean) : [];
|
|
2396
|
+
codeFilesChanged = mergedFiles.some((f) => !f.startsWith(".gsd/"));
|
|
2397
|
+
} catch (e) {
|
|
2398
|
+
// diff-tree failed (e.g. unborn HEAD in a brand-new repo) — fall back to
|
|
2399
|
+
// comparing against the empty tree so initial-commit repos still report changes.
|
|
2400
|
+
try {
|
|
2401
|
+
const fallbackOutput = execFileSync(
|
|
2402
|
+
"git",
|
|
2403
|
+
["diff", "--name-only", GIT_EMPTY_TREE, "HEAD"],
|
|
2404
|
+
{ cwd: originalBasePath_, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
2405
|
+
).trim();
|
|
2406
|
+
const fallbackFiles = fallbackOutput ? fallbackOutput.split("\n").filter(Boolean) : [];
|
|
2407
|
+
codeFilesChanged = fallbackFiles.some((f) => !f.startsWith(".gsd/"));
|
|
2408
|
+
} catch {
|
|
2409
|
+
// Truly unable to determine — assume code was changed to avoid silent data loss
|
|
2410
|
+
logWarning("worktree", `diff-tree and empty-tree fallback both failed (assuming code changed): ${(e as Error).message}`);
|
|
2411
|
+
codeFilesChanged = true;
|
|
2412
|
+
}
|
|
2413
|
+
}
|
|
2414
|
+
}
|
|
2415
|
+
|
|
2416
|
+
const finalizeMilestoneCleanup = (): void => {
|
|
2417
|
+
// 12. Remove worktree directory first (must happen before branch deletion)
|
|
2418
|
+
try {
|
|
2419
|
+
removeWorktree(originalBasePath_, milestoneId, {
|
|
2420
|
+
branch: milestoneBranch,
|
|
2421
|
+
deleteBranch: false,
|
|
2422
|
+
});
|
|
2423
|
+
} catch (err) {
|
|
2424
|
+
// Best-effort -- worktree dir may already be gone
|
|
2425
|
+
logWarning("worktree", `worktree removal failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2426
|
+
}
|
|
2427
|
+
|
|
2428
|
+
// 13. Delete milestone branch (after worktree removal so ref is unlocked)
|
|
2429
|
+
try {
|
|
2430
|
+
nativeBranchDelete(originalBasePath_, milestoneBranch);
|
|
2431
|
+
} catch (err) {
|
|
2432
|
+
// Best-effort
|
|
2433
|
+
logWarning("worktree", `git branch-delete failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2434
|
+
}
|
|
2435
|
+
|
|
2436
|
+
// 14. Clear module state
|
|
2437
|
+
setActiveWorkspace(null);
|
|
2438
|
+
nudgeGitBranchCache(previousCwd);
|
|
2439
|
+
|
|
2440
|
+
// 15. Anchor cwd at the project root on success-return. Step 12 removed
|
|
2441
|
+
// the worktree dir; if cwd was inside it, every subsequent process.cwd()
|
|
2442
|
+
// would throw ENOENT and trip auto/run-unit.ts:50's session-failed cancel
|
|
2443
|
+
// path (the de73fb43d regression that closes headless gsd auto). Step 3
|
|
2444
|
+
// already chdir'd here, but defending the success-return contract makes
|
|
2445
|
+
// future maintainers safe against intervening chdir's between step 3 and
|
|
2446
|
+
// here.
|
|
2447
|
+
try {
|
|
2448
|
+
// process.cwd() can throw ENOENT when cwd was removed, so attempt
|
|
2449
|
+
// recovery directly.
|
|
2450
|
+
process.chdir(originalBasePath_);
|
|
2451
|
+
} catch (err) {
|
|
2452
|
+
logWarning("worktree", `chdir to project root after merge failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2453
|
+
}
|
|
2454
|
+
};
|
|
2455
|
+
|
|
2456
|
+
let shouldCleanup = false;
|
|
2457
|
+
let pushed = false;
|
|
2458
|
+
let prCreated = false;
|
|
2459
|
+
try {
|
|
2460
|
+
// 10. Auto-push if enabled
|
|
2461
|
+
if (prefs.auto_push === true && prefs.auto_pr !== true && !nothingToCommit) {
|
|
2462
|
+
const remote = prefs.remote ?? "origin";
|
|
2463
|
+
if (gitRemoteExists(originalBasePath_, remote)) {
|
|
2464
|
+
try {
|
|
2465
|
+
execFileSync("git", ["push", remote, mainBranch], {
|
|
2466
|
+
cwd: originalBasePath_,
|
|
2467
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
2468
|
+
encoding: "utf-8",
|
|
2469
|
+
});
|
|
2470
|
+
pushed = true;
|
|
2471
|
+
} catch (err) {
|
|
2472
|
+
// Push failure is non-fatal
|
|
2473
|
+
logWarning("worktree", `git push failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2474
|
+
}
|
|
2475
|
+
}
|
|
2476
|
+
}
|
|
2477
|
+
|
|
2478
|
+
// 9b. Auto-create PR if enabled (#2302: no longer gated on pushed/auto_push)
|
|
2479
|
+
if (prefs.auto_pr === true && !nothingToCommit) {
|
|
2480
|
+
const remote = prefs.remote ?? "origin";
|
|
2481
|
+
const prTarget = prefs.pr_target_branch ?? mainBranch;
|
|
2482
|
+
if (gitRemoteExists(originalBasePath_, remote)) {
|
|
2483
|
+
try {
|
|
2484
|
+
// Push the milestone branch to remote first
|
|
2485
|
+
execFileSync("git", ["push", remote, milestoneBranch], {
|
|
2486
|
+
cwd: originalBasePath_,
|
|
2487
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
2488
|
+
encoding: "utf-8",
|
|
2489
|
+
});
|
|
2490
|
+
const prEvidence = buildPrEvidence({
|
|
2491
|
+
milestoneId,
|
|
2492
|
+
milestoneTitle,
|
|
2493
|
+
changeType: "feat",
|
|
2494
|
+
summaries: completedSlices.map((slice) => `### ${slice.id}\n${slice.title}`),
|
|
2495
|
+
testsRun: ["Auto-created after milestone merge. Run `npm run verify:pr` before marking this draft ready."],
|
|
2496
|
+
rollbackNotes: ["Close the draft PR or revert the merge commit if review finds a behavior regression."],
|
|
2497
|
+
how: "Generated by git.auto_pr after the milestone branch was pushed and merged locally.",
|
|
2498
|
+
});
|
|
2499
|
+
const prUrl = createDraftPR(originalBasePath_, milestoneId, prEvidence.title, prEvidence.body, {
|
|
2500
|
+
head: milestoneBranch,
|
|
2501
|
+
base: prTarget,
|
|
2502
|
+
});
|
|
2503
|
+
if (!prUrl) {
|
|
2504
|
+
throw new Error("gh pr create returned no URL");
|
|
2505
|
+
}
|
|
2506
|
+
prCreated = true;
|
|
2507
|
+
} catch (err) {
|
|
2508
|
+
// PR creation failure is non-fatal — gh may not be installed or authenticated
|
|
2509
|
+
logWarning("worktree", `PR creation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2510
|
+
}
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
|
|
2514
|
+
// 11. Guard removed — step 9b (#1792) now handles this with a smarter check:
|
|
2515
|
+
// throws only when the milestone has unanchored code changes, passes
|
|
2516
|
+
// through when the code is genuinely already on the integration branch.
|
|
2517
|
+
|
|
2518
|
+
// 11a. Pre-teardown safety net (#1853): if the worktree still has uncommitted
|
|
2519
|
+
// changes (e.g. nativeHasChanges cache returned stale false), abort teardown.
|
|
2520
|
+
// Committing here would be too late: the squash merge to the integration
|
|
2521
|
+
// branch already happened, so a new milestone-branch commit would not be
|
|
2522
|
+
// included and branch deletion could drop the only ref to that work.
|
|
2523
|
+
//
|
|
2524
|
+
// Guard: only run when worktreeCwd is on the milestone branch (#2929).
|
|
2525
|
+
// In parallel mode or branch-mode merges, worktreeCwd may be the project
|
|
2526
|
+
// root on the integration branch. Committing dirty state there would
|
|
2527
|
+
// capture unrelated files from other milestones.
|
|
2528
|
+
if (existsSync(worktreeCwd)) {
|
|
2529
|
+
let preTeardownBranch: string | null = null;
|
|
2530
|
+
try {
|
|
2531
|
+
preTeardownBranch = nativeGetCurrentBranch(worktreeCwd);
|
|
2532
|
+
} catch (err) {
|
|
2533
|
+
debugLog("mergeMilestoneToMain", { phase: "pre-teardown-branch-detect-failed", error: String(err) });
|
|
2534
|
+
}
|
|
2535
|
+
const isOnMilestoneBranch = preTeardownBranch === milestoneBranch;
|
|
2536
|
+
|
|
2537
|
+
if (isOnMilestoneBranch) {
|
|
2538
|
+
try {
|
|
2539
|
+
const dirtyCheck = nativeWorkingTreeStatus(worktreeCwd);
|
|
2540
|
+
if (dirtyCheck) {
|
|
2541
|
+
process.chdir(previousCwd);
|
|
2542
|
+
throw new GSDError(
|
|
2543
|
+
GSD_GIT_ERROR,
|
|
2544
|
+
`Milestone worktree still has uncommitted changes after squash merge. ` +
|
|
2545
|
+
`Aborting teardown to preserve ${milestoneBranch}. Status:\n${dirtyCheck}`,
|
|
2546
|
+
);
|
|
2547
|
+
}
|
|
2548
|
+
} catch (e) {
|
|
2549
|
+
if (e instanceof GSDError) throw e;
|
|
2550
|
+
debugLog("mergeMilestoneToMain", {
|
|
2551
|
+
phase: "pre-teardown-dirty-check-error",
|
|
2552
|
+
error: String(e),
|
|
2553
|
+
});
|
|
2554
|
+
}
|
|
2555
|
+
}
|
|
2556
|
+
}
|
|
2557
|
+
|
|
2558
|
+
shouldCleanup = true;
|
|
2559
|
+
return { commitMessage, pushed, prCreated, codeFilesChanged };
|
|
2560
|
+
} finally {
|
|
2561
|
+
if (shouldCleanup) {
|
|
2562
|
+
finalizeMilestoneCleanup();
|
|
2563
|
+
} else {
|
|
2564
|
+
logWarning(
|
|
2565
|
+
"worktree",
|
|
2566
|
+
`Skipping worktree cleanup for ${milestoneBranch}; merge did not reach safe-cleanup point and milestone work is preserved for manual recovery.`,
|
|
2567
|
+
);
|
|
2568
|
+
}
|
|
2569
|
+
}
|
|
2570
|
+
}
|