gsd-pi 2.77.0-dev.58d3d4d6c → 2.77.0-dev.cfd69e714
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/README.md +1 -1
- package/dist/claude-cli-check.js +5 -1
- package/dist/headless.js +49 -4
- package/dist/resource-loader.d.ts +40 -0
- package/dist/resource-loader.js +32 -13
- package/dist/resources/extensions/browser-tools/capture.js +9 -0
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/dist/resources/extensions/browser-tools/tools/forms.js +5 -1
- package/dist/resources/extensions/browser-tools/tools/intent.js +5 -1
- package/dist/resources/extensions/claude-code-cli/readiness.js +5 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +481 -17
- package/dist/resources/extensions/gsd/auto/loop.js +43 -0
- package/dist/resources/extensions/gsd/auto/phases.js +15 -21
- package/dist/resources/extensions/gsd/auto/session.js +0 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +102 -24
- package/dist/resources/extensions/gsd/auto-model-selection.js +124 -4
- package/dist/resources/extensions/gsd/auto-post-unit.js +71 -64
- package/dist/resources/extensions/gsd/auto-prompts.js +329 -102
- package/dist/resources/extensions/gsd/auto-recovery.js +195 -23
- package/dist/resources/extensions/gsd/auto-start.js +34 -24
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +47 -7
- package/dist/resources/extensions/gsd/auto-worktree.js +122 -26
- package/dist/resources/extensions/gsd/auto.js +31 -20
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +209 -0
- package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +3 -6
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +127 -9
- package/dist/resources/extensions/gsd/component-loader.js +447 -0
- package/dist/resources/extensions/gsd/component-types.js +69 -0
- package/dist/resources/extensions/gsd/detection.js +49 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/dist/resources/extensions/gsd/gate-registry.js +2 -2
- package/dist/resources/extensions/gsd/git-constants.js +28 -1
- package/dist/resources/extensions/gsd/git-self-heal.js +27 -0
- package/dist/resources/extensions/gsd/git-service.js +126 -2
- package/dist/resources/extensions/gsd/gsd-db.js +6 -3
- package/dist/resources/extensions/gsd/guided-flow.js +17 -5
- package/dist/resources/extensions/gsd/memory-extractor.js +7 -1
- package/dist/resources/extensions/gsd/milestone-scope-classifier.js +299 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +3 -0
- package/dist/resources/extensions/gsd/model-router.js +6 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +34 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/dist/resources/extensions/gsd/safety/git-checkpoint.js +11 -0
- package/dist/resources/extensions/gsd/service-tier.js +5 -2
- package/dist/resources/extensions/gsd/session-lock.js +19 -10
- package/dist/resources/extensions/gsd/skill-manifest.js +168 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +278 -8
- package/dist/resources/extensions/gsd/state.js +44 -33
- package/dist/resources/extensions/gsd/sync-lock.js +98 -42
- package/dist/resources/extensions/gsd/unit-context-composer.js +147 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +370 -0
- package/dist/resources/extensions/gsd/uok/gate-runner.js +53 -5
- package/dist/resources/extensions/gsd/workflow-mcp.js +6 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +34 -8
- package/dist/resources/extensions/mcp-client/index.js +3 -1
- package/dist/resources/extensions/ollama/index.js +5 -1
- package/dist/resources/extensions/remote-questions/manager.js +11 -5
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
- package/dist/web/standalone/.next/server/chunks/1926.js +1 -1
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +2 -3
- package/packages/daemon/src/logger.ts +4 -3
- package/packages/mcp-server/dist/server.d.ts +24 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +88 -87
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/src/mcp-server.test.ts +25 -3
- package/packages/mcp-server/src/readers/graph.test.ts +87 -15
- package/packages/mcp-server/src/secure-env-collect.test.ts +232 -237
- package/packages/mcp-server/src/server.ts +131 -105
- package/packages/mcp-server/src/workflow-tools.test.ts +80 -39
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/src/__tests__/_test-coverage-guard.test.mjs +98 -0
- package/packages/native/src/__tests__/module-compat.test.mjs +59 -27
- package/packages/native/src/__tests__/ps.test.mjs +14 -8
- package/packages/native/src/__tests__/stream-process.test.mjs +23 -2
- package/packages/native/src/__tests__/truncate.test.mjs +17 -2
- package/packages/pi-agent-core/src/agent-loop.test.ts +5 -15
- package/packages/pi-agent-core/src/agent.test.ts +96 -102
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/capability-patches.js +9 -2
- package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/index.d.ts +34 -0
- package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.d.ts +17 -0
- package/packages/pi-ai/dist/models/generated/openai.d.ts.map +1 -1
- package/packages/pi-ai/dist/models/generated/openai.js +17 -0
- package/packages/pi-ai/dist/models/generated/openai.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.test.js +43 -70
- package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +36 -11
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +44 -0
- package/packages/pi-ai/src/models/capability-patches.ts +10 -2
- package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
- package/packages/pi-ai/src/models/generated/openai.ts +17 -0
- package/packages/pi-ai/src/models.generated.test.ts +46 -73
- package/packages/pi-ai/src/models.test.ts +48 -11
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +96 -32
- package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js +75 -12
- package/packages/pi-coding-agent/dist/core/agent-session-model-switch.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +99 -31
- package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +61 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +30 -4
- package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +17 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js +76 -18
- package/packages/pi-coding-agent/dist/core/resource-loader-cache-reset.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +2 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +5 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js +18 -0
- package/packages/pi-coding-agent/dist/core/retryable-error-regex.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +20 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -2
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +20 -13
- package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +18 -3
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +125 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +105 -13
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js +130 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-skill-filter.test.js.map +1 -0
- package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +113 -37
- package/packages/pi-coding-agent/src/core/agent-session-model-switch.test.ts +89 -17
- package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +112 -43
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +58 -0
- package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +35 -4
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +20 -0
- package/packages/pi-coding-agent/src/core/resource-loader-cache-reset.test.ts +93 -28
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +5 -1
- package/packages/pi-coding-agent/src/core/retry-handler.ts +2 -8
- package/packages/pi-coding-agent/src/core/retryable-error-regex.ts +18 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +35 -1
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +26 -20
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +146 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +20 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +119 -13
- package/packages/pi-coding-agent/src/tests/system-prompt-skill-filter.test.ts +157 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +18 -8
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +128 -17
- package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +36 -12
- package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
- package/packages/pi-tui/dist/__tests__/tui.test.js +18 -30
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/input.test.js +10 -3
- package/packages/pi-tui/dist/components/__tests__/input.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/loader.test.js +53 -9
- package/packages/pi-tui/dist/components/__tests__/loader.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js +6 -2
- package/packages/pi-tui/dist/components/__tests__/markdown-maxlines.test.js.map +1 -1
- package/packages/pi-tui/dist/components/editor.d.ts +14 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +19 -0
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/dist/components/image.test.js +6 -5
- package/packages/pi-tui/dist/components/image.test.js.map +1 -1
- package/packages/pi-tui/dist/editor-component.d.ts +2 -0
- package/packages/pi-tui/dist/editor-component.d.ts.map +1 -1
- package/packages/pi-tui/dist/editor-component.js.map +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +24 -8
- package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +140 -17
- package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +41 -12
- package/packages/pi-tui/src/__tests__/tui.test.ts +18 -37
- package/packages/pi-tui/src/components/__tests__/input.test.ts +19 -3
- package/packages/pi-tui/src/components/__tests__/loader.test.ts +112 -35
- package/packages/pi-tui/src/components/__tests__/markdown-maxlines.test.ts +9 -2
- package/packages/pi-tui/src/components/editor.ts +22 -0
- package/packages/pi-tui/src/components/image.test.ts +10 -5
- package/packages/pi-tui/src/editor-component.ts +3 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/dist/rpc-client.test.js +101 -51
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -1
- package/packages/rpc-client/src/rpc-client.test.ts +109 -52
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/scripts/install.js +15 -1
- package/src/resources/extensions/browser-tools/capture.ts +12 -0
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +8 -59
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +36 -24
- package/src/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +69 -71
- package/src/resources/extensions/browser-tools/tools/forms.ts +5 -1
- package/src/resources/extensions/browser-tools/tools/intent.ts +5 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +5 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +518 -19
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +919 -75
- package/src/resources/extensions/github-sync/tests/cli.test.ts +76 -7
- package/src/resources/extensions/github-sync/tests/templates.test.ts +33 -1
- package/src/resources/extensions/gsd/auto/loop.ts +47 -0
- package/src/resources/extensions/gsd/auto/phases.ts +16 -20
- package/src/resources/extensions/gsd/auto/session.ts +0 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +113 -24
- package/src/resources/extensions/gsd/auto-model-selection.ts +131 -4
- package/src/resources/extensions/gsd/auto-post-unit.ts +82 -73
- package/src/resources/extensions/gsd/auto-prompts.ts +330 -90
- package/src/resources/extensions/gsd/auto-recovery.ts +225 -24
- package/src/resources/extensions/gsd/auto-start.ts +54 -6
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +51 -7
- package/src/resources/extensions/gsd/auto-worktree.ts +130 -26
- package/src/resources/extensions/gsd/auto.ts +43 -22
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +9 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +221 -0
- package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +3 -7
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +158 -9
- package/src/resources/extensions/gsd/component-loader.ts +598 -0
- package/src/resources/extensions/gsd/component-types.ts +362 -0
- package/src/resources/extensions/gsd/detection.ts +58 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
- package/src/resources/extensions/gsd/gate-registry.ts +2 -2
- package/src/resources/extensions/gsd/git-constants.ts +30 -1
- package/src/resources/extensions/gsd/git-self-heal.ts +31 -0
- package/src/resources/extensions/gsd/git-service.ts +133 -2
- package/src/resources/extensions/gsd/gsd-db.ts +6 -3
- package/src/resources/extensions/gsd/guided-flow.ts +20 -5
- package/src/resources/extensions/gsd/memory-extractor.ts +11 -3
- package/src/resources/extensions/gsd/milestone-scope-classifier.ts +366 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +3 -0
- package/src/resources/extensions/gsd/model-router.ts +6 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +34 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +6 -2
- package/src/resources/extensions/gsd/prompts/plan-slice.md +15 -2
- package/src/resources/extensions/gsd/safety/git-checkpoint.ts +15 -0
- package/src/resources/extensions/gsd/service-tier.ts +5 -2
- package/src/resources/extensions/gsd/session-lock.ts +20 -10
- package/src/resources/extensions/gsd/skill-manifest.ts +175 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +309 -8
- package/src/resources/extensions/gsd/state.ts +49 -44
- package/src/resources/extensions/gsd/sync-lock.ts +97 -39
- package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +270 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +341 -0
- package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +94 -289
- 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 +78 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +61 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +8 -197
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +15 -58
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +263 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +192 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +16 -8
- package/src/resources/extensions/gsd/tests/component-loader.test.ts +589 -0
- package/src/resources/extensions/gsd/tests/component-types.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +50 -1
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +40 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +91 -3
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +3 -2
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +139 -129
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +9 -105
- package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +4 -55
- package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +7 -57
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +18 -2
- package/src/resources/extensions/gsd/tests/integration/queue-completed-milestone-perf.test.ts +10 -4
- package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +144 -7
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +2 -16
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +6 -9
- package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +8 -37
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +5 -15
- package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +227 -62
- package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +187 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +6 -49
- package/src/resources/extensions/gsd/tests/notification-widget.test.ts +6 -3
- package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +273 -133
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +23 -24
- package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +75 -2
- package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +8 -40
- package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +136 -256
- package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +148 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/silent-catch-diagnostics.test.ts +55 -95
- 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 +120 -1
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +112 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +164 -1
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +11 -92
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +102 -101
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/test-helpers.test.ts +12 -61
- package/src/resources/extensions/gsd/tests/test-helpers.ts +21 -8
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +61 -1
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +355 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +258 -0
- package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/uok-gitops-wiring.test.ts +49 -26
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +144 -81
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -54
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +342 -277
- package/src/resources/extensions/gsd/tests/worker-model-override.test.ts +37 -29
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +226 -266
- package/src/resources/extensions/gsd/tests/worktree-health-monorepo.test.ts +103 -67
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +92 -90
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +238 -59
- package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +113 -161
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +80 -96
- package/src/resources/extensions/gsd/types.ts +3 -3
- package/src/resources/extensions/gsd/unit-context-composer.ts +218 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +574 -0
- package/src/resources/extensions/gsd/uok/gate-runner.ts +65 -5
- package/src/resources/extensions/gsd/workflow-mcp.ts +6 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +55 -7
- package/src/resources/extensions/mcp-client/index.ts +3 -1
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +70 -36
- package/src/resources/extensions/ollama/index.ts +5 -1
- package/src/resources/extensions/ollama/ollama-auth-mode.test.ts +123 -15
- package/src/resources/extensions/ollama/ollama-status-indicator.test.ts +206 -19
- package/src/resources/extensions/remote-questions/manager.ts +36 -4
- package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +200 -190
- package/src/resources/extensions/shared/tests/interview-preview.test.ts +11 -3
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +129 -113
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +0 -289
- package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +0 -1
- package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +0 -363
- package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +0 -144
- package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/dashboard-model-label-ordering.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -79
- package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +0 -75
- package/src/resources/extensions/gsd/tests/forensics-journal.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/forensics-worktree-telemetry.test.ts +0 -145
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/gsd-no-project-error.test.ts +0 -73
- package/src/resources/extensions/gsd/tests/idle-watchdog-stall-override.test.ts +0 -130
- package/src/resources/extensions/gsd/tests/import-done-milestones.test.ts +0 -43
- /package/dist/web/standalone/.next/static/{Cev5xrAYA3ZGTRLyjR2fX → SvCJDZPQW104bR1KnBQg1}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{Cev5xrAYA3ZGTRLyjR2fX → SvCJDZPQW104bR1KnBQg1}/_ssgManifest.js +0 -0
|
@@ -894,11 +894,37 @@ export function nativeResetPaths(basePath: string, paths: string[]): void {
|
|
|
894
894
|
}
|
|
895
895
|
}
|
|
896
896
|
|
|
897
|
+
/**
|
|
898
|
+
* Read `commit.gpgsign` from the repo config. Returns true only if the value
|
|
899
|
+
* is the literal string "true". Any other state (unset, false, error) → false.
|
|
900
|
+
*
|
|
901
|
+
* Used by nativeCommit to route signing-required commits through the git CLI,
|
|
902
|
+
* because the libgit2 native path does not invoke configured signers.
|
|
903
|
+
* (Issue #4980 CRIT-2)
|
|
904
|
+
*/
|
|
905
|
+
function shouldSignCommits(basePath: string): boolean {
|
|
906
|
+
try {
|
|
907
|
+
const result = execFileSync("git", ["config", "--get", "commit.gpgsign"], {
|
|
908
|
+
cwd: basePath,
|
|
909
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
910
|
+
encoding: "utf-8",
|
|
911
|
+
env: GIT_NO_PROMPT_ENV,
|
|
912
|
+
}).trim();
|
|
913
|
+
return result === "true";
|
|
914
|
+
} catch {
|
|
915
|
+
return false;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
|
|
897
919
|
/**
|
|
898
920
|
* Create a commit from the current index.
|
|
899
921
|
* Returns the commit SHA on success, or null if nothing to commit.
|
|
900
922
|
* Native: libgit2 commit create.
|
|
901
|
-
* Fallback: `git commit
|
|
923
|
+
* Fallback: `git commit -F -` (runs hooks; honors commit.gpgsign).
|
|
924
|
+
*
|
|
925
|
+
* The fallback intentionally does NOT use --no-verify — user pre-commit /
|
|
926
|
+
* commit-msg / prepare-commit-msg hooks must fire on every GSD-automated
|
|
927
|
+
* commit. (Issue #4980 CRIT-1)
|
|
902
928
|
*/
|
|
903
929
|
export function nativeCommit(
|
|
904
930
|
basePath: string,
|
|
@@ -906,7 +932,10 @@ export function nativeCommit(
|
|
|
906
932
|
options?: { allowEmpty?: boolean; input?: string },
|
|
907
933
|
): string | null {
|
|
908
934
|
const native = loadNative();
|
|
909
|
-
|
|
935
|
+
// libgit2's commit-create does not invoke configured GPG/SSH signers. When
|
|
936
|
+
// commit.gpgsign=true, route through the git CLI fallback so signing
|
|
937
|
+
// happens. (Issue #4980 CRIT-2)
|
|
938
|
+
if (native && !shouldSignCommits(basePath)) {
|
|
910
939
|
try {
|
|
911
940
|
return native.gitCommit(basePath, message, options?.allowEmpty);
|
|
912
941
|
} catch (e) {
|
|
@@ -916,9 +945,10 @@ export function nativeCommit(
|
|
|
916
945
|
}
|
|
917
946
|
}
|
|
918
947
|
|
|
919
|
-
// Fallback: use git
|
|
948
|
+
// Fallback / signed-commit path: use git CLI with stdin pipe for safe
|
|
949
|
+
// multi-line messages. Hooks run; commit.gpgsign honored.
|
|
920
950
|
try {
|
|
921
|
-
const args = ["commit", "
|
|
951
|
+
const args = ["commit", "-F", "-"];
|
|
922
952
|
if (options?.allowEmpty) args.push("--allow-empty");
|
|
923
953
|
const result = execFileSync("git", args, {
|
|
924
954
|
cwd: basePath,
|
|
@@ -10,14 +10,18 @@ Your working directory is `{{workingDirectory}}`. All file reads, writes, and sh
|
|
|
10
10
|
|
|
11
11
|
All slices are done. You are closing out the milestone — verifying that the assembled work actually delivers the promised outcome, writing the milestone summary, and updating project state. The milestone summary is the final record. After you finish, the system merges the worktree back to the integration branch. If there are queued milestones, the next one starts its own research → plan → execute cycle from a clean slate — the milestone summary is how it learns what was already built.
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Preloaded context below — the roadmap, compact slice-summary excerpts, requirements, decisions, and project context. **Slice summaries are excerpts, not full files.** They include frontmatter fields, section heads (deviations, known limitations, follow-ups), and short narrative only. When drafting LEARNINGS, the Decision Re-evaluation table, or cross-slice narrative, Read the full slice SUMMARY.md files listed under "On-demand Slice Summaries" — do that selectively as needed, not preemptively.
|
|
14
|
+
|
|
15
|
+
Start with what the excerpts give you. Read full files when the section heads signal richer context you need.
|
|
16
|
+
|
|
17
|
+
**On-demand Read ordering:** Complete all slice SUMMARY Reads you need for cross-slice synthesis, the Decision Re-evaluation table, and LEARNINGS **before** calling `gsd_complete_milestone` (step 10). Once that tool runs, the milestone is marked complete in the DB — running out of tool budget between step 10 and the LEARNINGS write (step 12) leaves the milestone committed without its LEARNINGS artifact.
|
|
14
18
|
|
|
15
19
|
{{inlinedContext}}
|
|
16
20
|
|
|
17
21
|
Then:
|
|
18
22
|
1. Use the **Milestone Summary** output template from the inlined context above
|
|
19
23
|
2. {{skillActivation}}
|
|
20
|
-
3. **Verify code changes exist.**
|
|
24
|
+
3. **Verify code changes exist.** Compare the milestone against its integration branch (usually `main`, `master`, or the recorded integration branch), using the merge-base as the older revision and `HEAD` as the newer revision. If that branch diff lists non-`.gsd/` files, code-change verification passes. If `HEAD` is already the same commit as the integration branch/merge-base (a retry-on-main self-diff), do **not** treat the empty branch diff as proof of missing code. Instead, inspect milestone-scoped commit evidence such as recent commits with `GSD-Unit: {{milestoneId}}` or production `GSD-Task: Sxx/Tyy` trailers whose diff also touches `.gsd/milestones/{{milestoneId}}/`, then check those commits for non-`.gsd/` files. Only record a **verification failure** when neither the branch diff nor milestone-scoped commit evidence shows implementation files.
|
|
21
25
|
4. Verify each **success criterion** from the milestone definition in `{{roadmapPath}}`. For each criterion, confirm it was met with specific evidence from slice summaries, test results, or observable behavior. Record any criterion that was NOT met as a **verification failure**.
|
|
22
26
|
5. Verify the milestone's **definition of done** — all slices are `[x]`, all slice summaries exist, and any cross-slice integration points work correctly. Record any unmet items as a **verification failure**.
|
|
23
27
|
6. If the roadmap includes a **Horizontal Checklist**, verify each item was addressed during the milestone. Note unchecked items in the milestone summary.
|
|
@@ -20,9 +20,22 @@ Pay particular attention to **Forward Intelligence** sections — they contain h
|
|
|
20
20
|
|
|
21
21
|
You have full tool access. Before decomposing, explore the relevant code to ground your plan in reality.
|
|
22
22
|
|
|
23
|
-
### Verify Roadmap Assumptions
|
|
23
|
+
### Verify Roadmap Assumptions (JIT Reassessment — ADR-003 §4)
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Before planning this slice, verify that the roadmap's assumptions still hold given prior slice summaries. Check inlined dependency summaries (below) for discovered constraints, changed approaches, or flagged fragility.
|
|
26
|
+
|
|
27
|
+
**If the remaining roadmap needs adjustment, modify it before proceeding:**
|
|
28
|
+
|
|
29
|
+
- If a downstream slice's title/demo/dependencies are now wrong, call `gsd_reassess_roadmap` with the corrected `sliceChanges.modified` entry.
|
|
30
|
+
- If new work surfaced that deserves its own slice, add it via `sliceChanges.added`.
|
|
31
|
+
- If a downstream slice is now redundant or out of scope, remove it via `sliceChanges.removed`.
|
|
32
|
+
- **Bias strongly toward "roadmap is fine."** Most slice completions produce no structural change. Only adjust when there is concrete evidence a downstream slice is wrong — not speculative concern. Over-reassessment is costlier than a later mid-slice replan.
|
|
33
|
+
|
|
34
|
+
Completed slices are immutable: never modify or remove a slice whose status is complete.
|
|
35
|
+
|
|
36
|
+
Then proceed with planning this slice against the (possibly updated) roadmap.
|
|
37
|
+
|
|
38
|
+
The roadmap description may be stale — verify it against the current codebase state.
|
|
26
39
|
|
|
27
40
|
### Explore Slice Scope
|
|
28
41
|
|
|
@@ -72,6 +72,21 @@ export function rollbackToCheckpoint(
|
|
|
72
72
|
return false;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
// Preserve any staged or untracked user work before the hard reset.
|
|
76
|
+
// The user may have a partial fix staged that they wanted to inspect;
|
|
77
|
+
// reset --hard wipes both staged and unstaged changes (reflog only
|
|
78
|
+
// covers committed state). Push a labeled stash first so recovery
|
|
79
|
+
// is possible. (Issue #4980 HIGH-4)
|
|
80
|
+
try {
|
|
81
|
+
execFileSync(
|
|
82
|
+
"git",
|
|
83
|
+
["stash", "push", "--include-untracked", "-m", `gsd: pre-rollback-stash ${unitId} ${new Date().toISOString()}`],
|
|
84
|
+
{ cwd: basePath, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
85
|
+
);
|
|
86
|
+
} catch {
|
|
87
|
+
/* nothing to stash, or stash refused — proceed with reset */
|
|
88
|
+
}
|
|
89
|
+
|
|
75
90
|
// Reset branch pointer and working tree to checkpoint SHA in one step.
|
|
76
91
|
// Using `git reset --hard <sha>` works on the currently checked-out branch
|
|
77
92
|
// (unlike `git branch -f` which is rejected for checked-out branches).
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Service Tier — gating, status formatting, icon resolution, and
|
|
3
3
|
* the /gsd fast command handler.
|
|
4
4
|
*
|
|
5
|
-
* Service tiers (priority/flex) are an OpenAI feature that only
|
|
6
|
-
* to gpt-5.4 variants. This module centralizes the model-gating logic
|
|
5
|
+
* Service tiers (priority/flex) are an OpenAI feature that currently only
|
|
6
|
+
* applies to gpt-5.4 variants in GSD. This module centralizes the model-gating logic
|
|
7
7
|
* so that icons, preferences, and the before_provider_request hook all
|
|
8
8
|
* use a single source of truth.
|
|
9
9
|
*/
|
|
@@ -35,6 +35,9 @@ const SERVICE_TIER_SCOPE_NOTE = "Only affects gpt-5.4 models, regardless of prov
|
|
|
35
35
|
* (set via CAPABILITY_PATCHES in packages/pi-ai/src/models.ts). When callers
|
|
36
36
|
* have access to the full Model object, prefer reading capabilities directly.
|
|
37
37
|
*
|
|
38
|
+
* GPT-5.5 is intentionally excluded until we verify its provider payload
|
|
39
|
+
* contract instead of assuming `service_tier` support.
|
|
40
|
+
*
|
|
38
41
|
* See: https://github.com/gsd-build/gsd-2/issues/2546
|
|
39
42
|
*/
|
|
40
43
|
const SERVICE_TIER_MODEL_PREFIXES = ["gpt-5.4"] as const;
|
|
@@ -188,13 +188,14 @@ function ensureExitHandler(_gsdDir: string): void {
|
|
|
188
188
|
// Lock files accumulate across main project .gsd/, worktree .gsd/,
|
|
189
189
|
// and projects registry paths — cleanup must cover all of them.
|
|
190
190
|
for (const dir of _lockDirRegistry) {
|
|
191
|
+
const lockFile = join(dir, LOCK_FILE);
|
|
192
|
+
const ownsRegisteredLock = isLockFileOwnedByCurrentProcess(lockFile);
|
|
191
193
|
try {
|
|
192
|
-
|
|
193
|
-
if (existsSync(lockFile)) unlinkSync(lockFile);
|
|
194
|
+
if (ownsRegisteredLock && existsSync(lockFile)) unlinkSync(lockFile);
|
|
194
195
|
} catch { /* best-effort */ }
|
|
195
196
|
try {
|
|
196
197
|
const lockDir = join(dir + ".lock");
|
|
197
|
-
if (existsSync(lockDir)) rmSync(lockDir, { recursive: true, force: true });
|
|
198
|
+
if (ownsRegisteredLock && existsSync(lockDir)) rmSync(lockDir, { recursive: true, force: true });
|
|
198
199
|
} catch { /* best-effort */ }
|
|
199
200
|
}
|
|
200
201
|
});
|
|
@@ -526,10 +527,13 @@ export function releaseSessionLock(basePath: string): void {
|
|
|
526
527
|
_releaseFunction = null;
|
|
527
528
|
}
|
|
528
529
|
|
|
529
|
-
// Remove the lock file at the current path
|
|
530
|
+
// Remove the lock file at the current path only if it still belongs to us.
|
|
531
|
+
// Lost-lock cleanup can run after another process has taken ownership; in
|
|
532
|
+
// that case deleting auto.lock would erase the newer owner's evidence.
|
|
530
533
|
const lp = lockPath(basePath);
|
|
534
|
+
const ownsPrimaryLock = isLockFileOwnedByCurrentProcess(lp);
|
|
531
535
|
try {
|
|
532
|
-
if (existsSync(lp)) unlinkSync(lp);
|
|
536
|
+
if (ownsPrimaryLock && existsSync(lp)) unlinkSync(lp);
|
|
533
537
|
} catch {
|
|
534
538
|
// Non-fatal
|
|
535
539
|
}
|
|
@@ -540,12 +544,12 @@ export function releaseSessionLock(basePath: string): void {
|
|
|
540
544
|
const lockTarget = effectiveLockTarget(gsdDir);
|
|
541
545
|
try {
|
|
542
546
|
const lockDir = join(lockTarget + ".lock");
|
|
543
|
-
if (existsSync(lockDir)) rmSync(lockDir, { recursive: true, force: true });
|
|
547
|
+
if (ownsPrimaryLock && existsSync(lockDir)) rmSync(lockDir, { recursive: true, force: true });
|
|
544
548
|
} catch {
|
|
545
549
|
// Non-fatal
|
|
546
550
|
}
|
|
547
551
|
// Also clean the per-milestone parallel directory itself if it exists
|
|
548
|
-
if (lockTarget !== gsdDir) {
|
|
552
|
+
if (ownsPrimaryLock && lockTarget !== gsdDir) {
|
|
549
553
|
try {
|
|
550
554
|
if (existsSync(lockTarget)) rmSync(lockTarget, { recursive: true, force: true });
|
|
551
555
|
} catch {
|
|
@@ -556,13 +560,14 @@ export function releaseSessionLock(basePath: string): void {
|
|
|
556
560
|
// Clean ALL registered lock paths (#1578) — lock files accumulate across
|
|
557
561
|
// main project .gsd/, worktree .gsd/, and projects registry paths.
|
|
558
562
|
for (const dir of _lockDirRegistry) {
|
|
563
|
+
const lockFile = join(dir, LOCK_FILE);
|
|
564
|
+
const ownsRegisteredLock = isLockFileOwnedByCurrentProcess(lockFile);
|
|
559
565
|
try {
|
|
560
|
-
|
|
561
|
-
if (existsSync(lockFile)) unlinkSync(lockFile);
|
|
566
|
+
if (ownsRegisteredLock && existsSync(lockFile)) unlinkSync(lockFile);
|
|
562
567
|
} catch { /* best-effort */ }
|
|
563
568
|
try {
|
|
564
569
|
const lockDir = join(dir + ".lock");
|
|
565
|
-
if (existsSync(lockDir)) rmSync(lockDir, { recursive: true, force: true });
|
|
570
|
+
if (ownsRegisteredLock && existsSync(lockDir)) rmSync(lockDir, { recursive: true, force: true });
|
|
566
571
|
} catch { /* best-effort */ }
|
|
567
572
|
}
|
|
568
573
|
_lockDirRegistry.clear();
|
|
@@ -619,6 +624,11 @@ function readExistingLockData(lp: string): SessionLockData | null {
|
|
|
619
624
|
}
|
|
620
625
|
}
|
|
621
626
|
|
|
627
|
+
function isLockFileOwnedByCurrentProcess(lp: string): boolean {
|
|
628
|
+
const existing = readExistingLockData(lp);
|
|
629
|
+
return existing?.pid === process.pid;
|
|
630
|
+
}
|
|
631
|
+
|
|
622
632
|
/**
|
|
623
633
|
* Retry-tolerant variant of readExistingLockData for use in onCompromised and
|
|
624
634
|
* other paths where a transient filesystem hiccup (NFS/CIFS latency, macOS APFS
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// GSD2 + skill-manifest — per-unit-type skill allowlist resolver (RFC #4779)
|
|
2
|
+
//
|
|
3
|
+
// Each auto-mode unit type can declare which skills are relevant to it. This
|
|
4
|
+
// trims the set of skills considered for activation in the per-unit prompt,
|
|
5
|
+
// reducing prompt token bloat and sharpening model focus.
|
|
6
|
+
//
|
|
7
|
+
// Contract:
|
|
8
|
+
// - Unknown unit types fall through to "all skills" (current behavior).
|
|
9
|
+
// - A manifest entry referencing a skill that is not installed is a silent
|
|
10
|
+
// no-op at filter time — the filter passes through installed skills only.
|
|
11
|
+
// - The allowlist is an inclusion list: only skills whose normalized name
|
|
12
|
+
// appears in the allowlist are retained. Order is not preserved.
|
|
13
|
+
//
|
|
14
|
+
// Phase 1 scope: seed manifests for a small number of unit types as proof.
|
|
15
|
+
// Additional unit types can be added incrementally; each addition is a pure
|
|
16
|
+
// data change with no wiring cost.
|
|
17
|
+
|
|
18
|
+
import { logWarning } from "./workflow-logger.js";
|
|
19
|
+
|
|
20
|
+
/** Normalize a skill reference the same way callers do (lowercase, trim). */
|
|
21
|
+
function normalize(name: string): string {
|
|
22
|
+
return name.trim().toLowerCase();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Allowlist per unit type. Keys match unit type identifiers used by auto-mode
|
|
27
|
+
* dispatch. Values are normalized skill names.
|
|
28
|
+
*
|
|
29
|
+
* Wildcard semantics: a unit type absent from this map resolves to `null`
|
|
30
|
+
* (wildcard) — meaning "all installed skills are eligible". Prefer absence
|
|
31
|
+
* over an exhaustive list when uncertain.
|
|
32
|
+
*/
|
|
33
|
+
const UNIT_TYPE_SKILL_MANIFEST: Record<string, string[]> = {
|
|
34
|
+
// Milestone-level planning / meta flows — predictable skill sets.
|
|
35
|
+
"research-milestone": [
|
|
36
|
+
"write-docs",
|
|
37
|
+
"write-milestone-brief",
|
|
38
|
+
"decompose-into-slices",
|
|
39
|
+
"grill-me",
|
|
40
|
+
"design-an-interface",
|
|
41
|
+
"api-design",
|
|
42
|
+
"observability",
|
|
43
|
+
],
|
|
44
|
+
"plan-milestone": [
|
|
45
|
+
"write-milestone-brief",
|
|
46
|
+
"decompose-into-slices",
|
|
47
|
+
"design-an-interface",
|
|
48
|
+
"grill-me",
|
|
49
|
+
"write-docs",
|
|
50
|
+
"api-design",
|
|
51
|
+
"tdd",
|
|
52
|
+
"verify-before-complete",
|
|
53
|
+
],
|
|
54
|
+
"complete-milestone": [
|
|
55
|
+
"verify-before-complete",
|
|
56
|
+
"write-docs",
|
|
57
|
+
"handoff",
|
|
58
|
+
"forensics",
|
|
59
|
+
"observability",
|
|
60
|
+
"security-review",
|
|
61
|
+
],
|
|
62
|
+
"validate-milestone": [
|
|
63
|
+
"verify-before-complete",
|
|
64
|
+
"review",
|
|
65
|
+
"test",
|
|
66
|
+
"lint",
|
|
67
|
+
"security-review",
|
|
68
|
+
"accessibility",
|
|
69
|
+
"forensics",
|
|
70
|
+
"observability",
|
|
71
|
+
],
|
|
72
|
+
"reassess-roadmap": [
|
|
73
|
+
"decompose-into-slices",
|
|
74
|
+
"grill-me",
|
|
75
|
+
"write-milestone-brief",
|
|
76
|
+
"write-docs",
|
|
77
|
+
"forensics",
|
|
78
|
+
],
|
|
79
|
+
// Slice-level research / planning.
|
|
80
|
+
"research-slice": [
|
|
81
|
+
"write-docs",
|
|
82
|
+
"decompose-into-slices",
|
|
83
|
+
"design-an-interface",
|
|
84
|
+
"grill-me",
|
|
85
|
+
"api-design",
|
|
86
|
+
"observability",
|
|
87
|
+
],
|
|
88
|
+
"plan-slice": [
|
|
89
|
+
"decompose-into-slices",
|
|
90
|
+
"design-an-interface",
|
|
91
|
+
"grill-me",
|
|
92
|
+
"write-docs",
|
|
93
|
+
"api-design",
|
|
94
|
+
"tdd",
|
|
95
|
+
"verify-before-complete",
|
|
96
|
+
],
|
|
97
|
+
"refine-slice": [
|
|
98
|
+
"decompose-into-slices",
|
|
99
|
+
"design-an-interface",
|
|
100
|
+
"grill-me",
|
|
101
|
+
"write-docs",
|
|
102
|
+
"api-design",
|
|
103
|
+
"tdd",
|
|
104
|
+
"verify-before-complete",
|
|
105
|
+
],
|
|
106
|
+
"replan-slice": [
|
|
107
|
+
"decompose-into-slices",
|
|
108
|
+
"grill-me",
|
|
109
|
+
"design-an-interface",
|
|
110
|
+
"write-docs",
|
|
111
|
+
"api-design",
|
|
112
|
+
],
|
|
113
|
+
"run-uat": [
|
|
114
|
+
"verify-before-complete",
|
|
115
|
+
"test",
|
|
116
|
+
"review",
|
|
117
|
+
"accessibility",
|
|
118
|
+
],
|
|
119
|
+
// `execute-task` intentionally omitted — implementation hot path covers a
|
|
120
|
+
// wide surface of technologies; wildcard fallback preserves today's
|
|
121
|
+
// behavior until per-task skill hints can be derived from task-plan
|
|
122
|
+
// frontmatter. See RFC #4779.
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Resolve the skill allowlist for a unit type.
|
|
127
|
+
*
|
|
128
|
+
* @returns Array of normalized skill names when an entry exists, or `null`
|
|
129
|
+
* when the unit type is unknown (wildcard — caller should not filter).
|
|
130
|
+
*/
|
|
131
|
+
export function resolveSkillManifest(unitType: string | undefined): string[] | null {
|
|
132
|
+
if (!unitType) return null;
|
|
133
|
+
const entry = UNIT_TYPE_SKILL_MANIFEST[unitType];
|
|
134
|
+
if (!entry) return null;
|
|
135
|
+
return entry.map(normalize);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Filter a skill list by the manifest for `unitType`. Pass-through when the
|
|
140
|
+
* manifest is wildcard (unknown unit type) or `unitType` is undefined.
|
|
141
|
+
*/
|
|
142
|
+
export function filterSkillsByManifest<T extends { name: string }>(
|
|
143
|
+
skills: T[],
|
|
144
|
+
unitType: string | undefined,
|
|
145
|
+
): T[] {
|
|
146
|
+
const allowlist = resolveSkillManifest(unitType);
|
|
147
|
+
if (allowlist === null) return skills;
|
|
148
|
+
const allowed = new Set(allowlist);
|
|
149
|
+
return skills.filter(skill => allowed.has(normalize(skill.name)));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Dev-mode guard: warn once per process if a manifest entry references a name
|
|
154
|
+
* that is not currently installed. Silent in production.
|
|
155
|
+
*/
|
|
156
|
+
const warnedMissing = new Set<string>();
|
|
157
|
+
|
|
158
|
+
export function warnIfManifestHasMissingSkills(
|
|
159
|
+
unitType: string | undefined,
|
|
160
|
+
installedNames: Set<string>,
|
|
161
|
+
): void {
|
|
162
|
+
// Strict mode is intentionally opt-in via exactly "1"; values like "0" or
|
|
163
|
+
// "false" must preserve the normal silent manifest behavior.
|
|
164
|
+
if (process.env.GSD_SKILL_MANIFEST_STRICT !== "1") return;
|
|
165
|
+
const allowlist = resolveSkillManifest(unitType);
|
|
166
|
+
if (!allowlist) return;
|
|
167
|
+
for (const name of allowlist) {
|
|
168
|
+
const key = `${unitType}:${name}`;
|
|
169
|
+
if (warnedMissing.has(key)) continue;
|
|
170
|
+
if (!installedNames.has(name)) {
|
|
171
|
+
warnedMissing.add(key);
|
|
172
|
+
logWarning("prompt", `skill-manifest: references uninstalled skill '${name}' for unit '${unitType}'`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|