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
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Component Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Shared metadata for installable/discoverable skills and agents.
|
|
5
|
+
*
|
|
6
|
+
* Replaces the separate type systems in:
|
|
7
|
+
* - packages/pi-coding-agent/src/core/skills.ts (SkillFrontmatter, Skill)
|
|
8
|
+
* - src/resources/extensions/subagent/agents.ts (AgentConfig)
|
|
9
|
+
*
|
|
10
|
+
* Legacy skill and agent formats are supported via backward-compatible loading.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Component Kind
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
/** All supported component types for the first component-system slice. */
|
|
18
|
+
export type ComponentKind = 'skill' | 'agent';
|
|
19
|
+
|
|
20
|
+
/** API version for component.yaml spec */
|
|
21
|
+
export type ComponentApiVersion = 'gsd/v1';
|
|
22
|
+
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Component Metadata
|
|
25
|
+
// ============================================================================
|
|
26
|
+
|
|
27
|
+
export interface ComponentAuthor {
|
|
28
|
+
name: string;
|
|
29
|
+
email?: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ComponentMetadata {
|
|
34
|
+
/** Component name (lowercase a-z, 0-9, hyphens). Required. */
|
|
35
|
+
name: string;
|
|
36
|
+
|
|
37
|
+
/** Human-readable description. Required. */
|
|
38
|
+
description: string;
|
|
39
|
+
|
|
40
|
+
/** Namespace for plugin-sourced components (e.g., "my-plugin"). */
|
|
41
|
+
namespace?: string;
|
|
42
|
+
|
|
43
|
+
/** Semver version string. */
|
|
44
|
+
version?: string;
|
|
45
|
+
|
|
46
|
+
/** Author information. */
|
|
47
|
+
author?: ComponentAuthor;
|
|
48
|
+
|
|
49
|
+
/** Searchable tags. */
|
|
50
|
+
tags?: string[];
|
|
51
|
+
|
|
52
|
+
/** SPDX license identifier. */
|
|
53
|
+
license?: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Skill Spec
|
|
58
|
+
// ============================================================================
|
|
59
|
+
|
|
60
|
+
export interface SkillSpec {
|
|
61
|
+
/** Path to the prompt content file (relative to component dir). */
|
|
62
|
+
prompt: string;
|
|
63
|
+
|
|
64
|
+
/** If true, skill is excluded from LLM system prompt (invoke-only). */
|
|
65
|
+
disableModelInvocation?: boolean;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// Agent Spec
|
|
70
|
+
// ============================================================================
|
|
71
|
+
|
|
72
|
+
export interface AgentToolConfig {
|
|
73
|
+
/** Tools the agent is allowed to use. If set, only these tools are available. */
|
|
74
|
+
allow?: string[];
|
|
75
|
+
|
|
76
|
+
/** Tools the agent is explicitly denied. Applied after allow. */
|
|
77
|
+
deny?: string[];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface AgentContextConfig {
|
|
81
|
+
/** Files to always include in the agent's context. */
|
|
82
|
+
alwaysInclude?: string[];
|
|
83
|
+
|
|
84
|
+
/** Whether to inject project context (project files, structure). */
|
|
85
|
+
injectProjectContext?: boolean;
|
|
86
|
+
|
|
87
|
+
/** Whether to inject current git status. */
|
|
88
|
+
injectGitStatus?: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface AgentOutputSchema {
|
|
92
|
+
type: 'object' | 'string';
|
|
93
|
+
properties?: Record<string, { type: string; items?: { type: string }; description?: string }>;
|
|
94
|
+
required?: string[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface AgentSpec {
|
|
98
|
+
/** Path to the system prompt file (relative to component dir). */
|
|
99
|
+
systemPrompt: string;
|
|
100
|
+
|
|
101
|
+
/** Model override (e.g., "claude-sonnet-4-6"). */
|
|
102
|
+
model?: string;
|
|
103
|
+
|
|
104
|
+
/** Fallback models to try if primary fails. */
|
|
105
|
+
modelFallbacks?: string[];
|
|
106
|
+
|
|
107
|
+
/** Tool access configuration. */
|
|
108
|
+
tools?: AgentToolConfig | string[];
|
|
109
|
+
|
|
110
|
+
/** Maximum number of turns before the agent is stopped. */
|
|
111
|
+
maxTurns?: number;
|
|
112
|
+
|
|
113
|
+
/** Maximum tokens budget per invocation. */
|
|
114
|
+
maxTokens?: number;
|
|
115
|
+
|
|
116
|
+
/** Hard timeout in minutes. */
|
|
117
|
+
timeoutMinutes?: number;
|
|
118
|
+
|
|
119
|
+
/** Temperature override. */
|
|
120
|
+
temperature?: number;
|
|
121
|
+
|
|
122
|
+
/** Thinking level override. */
|
|
123
|
+
thinking?: 'off' | 'minimal' | 'standard' | 'full';
|
|
124
|
+
|
|
125
|
+
/** Output format preference. */
|
|
126
|
+
outputFormat?: 'text' | 'structured' | 'markdown';
|
|
127
|
+
|
|
128
|
+
/** Context injection configuration. */
|
|
129
|
+
context?: AgentContextConfig;
|
|
130
|
+
|
|
131
|
+
/** Isolation mode for execution. */
|
|
132
|
+
isolation?: 'none' | 'worktree';
|
|
133
|
+
|
|
134
|
+
/** Merge strategy when isolation is used. */
|
|
135
|
+
mergeStrategy?: 'patch' | 'squash' | 'manual';
|
|
136
|
+
|
|
137
|
+
/** Whether the agent accepts {previous} input from chain mode. */
|
|
138
|
+
acceptsInput?: boolean;
|
|
139
|
+
|
|
140
|
+
/** Structured output contract. */
|
|
141
|
+
outputSchema?: AgentOutputSchema;
|
|
142
|
+
|
|
143
|
+
/** Name of another agent to inherit configuration from. */
|
|
144
|
+
extends?: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// Dependency & Compatibility
|
|
149
|
+
// ============================================================================
|
|
150
|
+
|
|
151
|
+
export interface ComponentDependencies {
|
|
152
|
+
/** Required skills that must be installed. */
|
|
153
|
+
skills?: string[];
|
|
154
|
+
|
|
155
|
+
/** Required agents that must be installed. */
|
|
156
|
+
agents?: string[];
|
|
157
|
+
|
|
158
|
+
/** Required MCP servers. */
|
|
159
|
+
mcpServers?: string[];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export interface ComponentCompatibility {
|
|
163
|
+
/** Minimum GSD version (semver range). */
|
|
164
|
+
gsd?: string;
|
|
165
|
+
|
|
166
|
+
/** Minimum Node.js version (semver range). */
|
|
167
|
+
node?: string;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ============================================================================
|
|
171
|
+
// Agent Routing
|
|
172
|
+
// ============================================================================
|
|
173
|
+
|
|
174
|
+
export interface AgentRoutingRule {
|
|
175
|
+
/** Natural-language condition for when this agent should be used. */
|
|
176
|
+
when: string;
|
|
177
|
+
|
|
178
|
+
/** Confidence level for this rule. */
|
|
179
|
+
confidence?: 'low' | 'medium' | 'high';
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export type ComponentSpec = SkillSpec | AgentSpec;
|
|
183
|
+
|
|
184
|
+
// ============================================================================
|
|
185
|
+
// Full Component Definition
|
|
186
|
+
// ============================================================================
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Complete component.yaml definition.
|
|
190
|
+
* This is the parsed representation of a component.yaml file.
|
|
191
|
+
*/
|
|
192
|
+
export interface ComponentDefinition {
|
|
193
|
+
apiVersion: ComponentApiVersion;
|
|
194
|
+
kind: ComponentKind;
|
|
195
|
+
metadata: ComponentMetadata;
|
|
196
|
+
spec: ComponentSpec;
|
|
197
|
+
|
|
198
|
+
/** Dependencies on other components. */
|
|
199
|
+
requires?: ComponentDependencies;
|
|
200
|
+
|
|
201
|
+
/** Version compatibility constraints. */
|
|
202
|
+
compatibility?: ComponentCompatibility;
|
|
203
|
+
|
|
204
|
+
/** Agent routing rules (only for kind: agent). */
|
|
205
|
+
routing?: AgentRoutingRule[];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// ============================================================================
|
|
209
|
+
// Resolved Component (Runtime)
|
|
210
|
+
// ============================================================================
|
|
211
|
+
|
|
212
|
+
/** Source of a loaded component */
|
|
213
|
+
export type ComponentSource = 'user' | 'project' | 'builtin' | 'plugin' | 'path';
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* A fully resolved component at runtime.
|
|
217
|
+
* Combines the definition with resolution metadata.
|
|
218
|
+
*/
|
|
219
|
+
export interface Component {
|
|
220
|
+
/** Unique identifier: `${namespace}:${name}` or bare `name`. */
|
|
221
|
+
id: string;
|
|
222
|
+
|
|
223
|
+
/** Component kind. */
|
|
224
|
+
kind: ComponentKind;
|
|
225
|
+
|
|
226
|
+
/** Component metadata. */
|
|
227
|
+
metadata: ComponentMetadata;
|
|
228
|
+
|
|
229
|
+
/** Kind-specific specification. */
|
|
230
|
+
spec: ComponentSpec;
|
|
231
|
+
|
|
232
|
+
/** Dependencies. */
|
|
233
|
+
requires?: ComponentDependencies;
|
|
234
|
+
|
|
235
|
+
/** Compatibility constraints. */
|
|
236
|
+
compatibility?: ComponentCompatibility;
|
|
237
|
+
|
|
238
|
+
/** Routing rules (agents only). */
|
|
239
|
+
routing?: AgentRoutingRule[];
|
|
240
|
+
|
|
241
|
+
/** Absolute path to the component directory. */
|
|
242
|
+
dirPath: string;
|
|
243
|
+
|
|
244
|
+
/** Absolute path to the definition file (component.yaml or SKILL.md or agent.md). */
|
|
245
|
+
filePath: string;
|
|
246
|
+
|
|
247
|
+
/** How this component was discovered. */
|
|
248
|
+
source: ComponentSource;
|
|
249
|
+
|
|
250
|
+
/** Format of the original definition. */
|
|
251
|
+
format: 'component-yaml' | 'skill-md' | 'agent-md';
|
|
252
|
+
|
|
253
|
+
/** Whether the component is currently enabled. */
|
|
254
|
+
enabled: boolean;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// ============================================================================
|
|
258
|
+
// Registry Types
|
|
259
|
+
// ============================================================================
|
|
260
|
+
|
|
261
|
+
export interface ComponentFilter {
|
|
262
|
+
/** Filter by kind. */
|
|
263
|
+
kind?: ComponentKind | ComponentKind[];
|
|
264
|
+
|
|
265
|
+
/** Filter by source. */
|
|
266
|
+
source?: ComponentSource | ComponentSource[];
|
|
267
|
+
|
|
268
|
+
/** Filter by namespace. */
|
|
269
|
+
namespace?: string;
|
|
270
|
+
|
|
271
|
+
/** Filter by tags (any match). */
|
|
272
|
+
tags?: string[];
|
|
273
|
+
|
|
274
|
+
/** Text search across name and description. */
|
|
275
|
+
search?: string;
|
|
276
|
+
|
|
277
|
+
/** Only enabled components. Default: true. */
|
|
278
|
+
enabledOnly?: boolean;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export interface ComponentDiagnostic {
|
|
282
|
+
type: 'warning' | 'error' | 'collision';
|
|
283
|
+
message: string;
|
|
284
|
+
componentId?: string;
|
|
285
|
+
path?: string;
|
|
286
|
+
collision?: {
|
|
287
|
+
name: string;
|
|
288
|
+
winnerPath: string;
|
|
289
|
+
loserPath: string;
|
|
290
|
+
winnerSource?: string;
|
|
291
|
+
loserSource?: string;
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ============================================================================
|
|
296
|
+
// Validation
|
|
297
|
+
// ============================================================================
|
|
298
|
+
|
|
299
|
+
/** Max name length per spec */
|
|
300
|
+
export const MAX_NAME_LENGTH = 64;
|
|
301
|
+
|
|
302
|
+
/** Max description length per spec */
|
|
303
|
+
export const MAX_DESCRIPTION_LENGTH = 1024;
|
|
304
|
+
|
|
305
|
+
/** Valid name pattern: lowercase a-z, 0-9, hyphens, no leading/trailing/consecutive hyphens */
|
|
306
|
+
export const NAME_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Validate a component name.
|
|
310
|
+
* @returns Array of error messages (empty if valid).
|
|
311
|
+
*/
|
|
312
|
+
export function validateComponentName(name: string): string[] {
|
|
313
|
+
const errors: string[] = [];
|
|
314
|
+
|
|
315
|
+
if (!name || name.trim() === '') {
|
|
316
|
+
errors.push('name is required');
|
|
317
|
+
return errors;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (name.length > MAX_NAME_LENGTH) {
|
|
321
|
+
errors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (name.includes('--')) {
|
|
325
|
+
errors.push('name must not contain consecutive hyphens');
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (!NAME_PATTERN.test(name)) {
|
|
329
|
+
if (/[A-Z]/.test(name)) {
|
|
330
|
+
errors.push('name must be lowercase');
|
|
331
|
+
} else if (name.startsWith('-') || name.endsWith('-')) {
|
|
332
|
+
errors.push('name must not start or end with a hyphen');
|
|
333
|
+
} else if (!name.includes('--')) {
|
|
334
|
+
errors.push('name must contain only lowercase a-z, 0-9, and hyphens');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return errors;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Validate a component description.
|
|
343
|
+
* @returns Array of error messages (empty if valid).
|
|
344
|
+
*/
|
|
345
|
+
export function validateComponentDescription(description: string | undefined): string[] {
|
|
346
|
+
const errors: string[] = [];
|
|
347
|
+
|
|
348
|
+
if (!description || description.trim() === '') {
|
|
349
|
+
errors.push('description is required');
|
|
350
|
+
} else if (description.length > MAX_DESCRIPTION_LENGTH) {
|
|
351
|
+
errors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return errors;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Compute the canonical ID for a component.
|
|
359
|
+
*/
|
|
360
|
+
export function computeComponentId(name: string, namespace?: string): string {
|
|
361
|
+
return namespace ? `${namespace}:${name}` : name;
|
|
362
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { existsSync, openSync, readSync, closeSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
10
|
-
import { join } from "node:path";
|
|
10
|
+
import { dirname, join, parse as parsePath } from "node:path";
|
|
11
11
|
import { homedir } from "node:os";
|
|
12
12
|
import { gsdRoot } from "./paths.js";
|
|
13
13
|
|
|
@@ -1120,6 +1120,63 @@ function resolveVersionCatalogAccessors(
|
|
|
1120
1120
|
return accessors;
|
|
1121
1121
|
}
|
|
1122
1122
|
|
|
1123
|
+
/**
|
|
1124
|
+
* Walk ancestor directories of `startDir` looking for any file in
|
|
1125
|
+
* `PROJECT_FILES`. Stops at the filesystem root or at a `.git` boundary
|
|
1126
|
+
* (so ancestors above a git repo root — e.g. `$HOME` or `/usr/local` —
|
|
1127
|
+
* can't trigger false positives). Returns true if an ancestor contains
|
|
1128
|
+
* one of the project markers.
|
|
1129
|
+
*
|
|
1130
|
+
* Used by the worktree health check (#2347) to avoid warning about
|
|
1131
|
+
* monorepos where package.json / Cargo.toml / etc. live in a parent
|
|
1132
|
+
* directory rather than in the worktree's own checkout.
|
|
1133
|
+
*
|
|
1134
|
+
* `existsFn` is injectable so this remains deterministically testable
|
|
1135
|
+
* without touching the real filesystem; defaults to `fs.existsSync`.
|
|
1136
|
+
*/
|
|
1137
|
+
export function hasProjectFileInAncestor(
|
|
1138
|
+
startDir: string,
|
|
1139
|
+
existsFn: (p: string) => boolean = existsSync,
|
|
1140
|
+
): boolean {
|
|
1141
|
+
let checkDir = dirname(startDir);
|
|
1142
|
+
const { root } = parsePath(checkDir);
|
|
1143
|
+
while (checkDir !== root) {
|
|
1144
|
+
if (PROJECT_FILES.some((f) => existsFn(join(checkDir, f)))) {
|
|
1145
|
+
return true;
|
|
1146
|
+
}
|
|
1147
|
+
// Stop at git repository boundary — ancestors above the repo root
|
|
1148
|
+
// may contain unrelated project files. Check AFTER project-file scan
|
|
1149
|
+
// so a repo root containing both .git and a marker is still recognized.
|
|
1150
|
+
if (existsFn(join(checkDir, ".git"))) return false;
|
|
1151
|
+
checkDir = dirname(checkDir);
|
|
1152
|
+
}
|
|
1153
|
+
return false;
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
/**
|
|
1157
|
+
* Check whether a project's `.gsd/` directory contains the bootstrap artifacts
|
|
1158
|
+
* (`PREFERENCES.md` or `milestones/`) that indicate a completed init run.
|
|
1159
|
+
*
|
|
1160
|
+
* A zombie `.gsd/` state — symlink exists but neither artifact is present —
|
|
1161
|
+
* must be treated as "needs init wizard". The previous guard checked only
|
|
1162
|
+
* `existsSync(gsdRoot(basePath))`, which accepted zombie states and skipped
|
|
1163
|
+
* the wizard (#2942).
|
|
1164
|
+
*
|
|
1165
|
+
* `existsFn` is injectable so tests can run deterministically; defaults to
|
|
1166
|
+
* `fs.existsSync`.
|
|
1167
|
+
*/
|
|
1168
|
+
export function hasGsdBootstrapArtifacts(
|
|
1169
|
+
gsdPath: string,
|
|
1170
|
+
existsFn: (p: string) => boolean = existsSync,
|
|
1171
|
+
): boolean {
|
|
1172
|
+
return (
|
|
1173
|
+
existsFn(gsdPath) &&
|
|
1174
|
+
(existsFn(join(gsdPath, "PREFERENCES.md")) ||
|
|
1175
|
+
existsFn(join(gsdPath, "preferences.md")) ||
|
|
1176
|
+
existsFn(join(gsdPath, "milestones")))
|
|
1177
|
+
);
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1123
1180
|
export function scanProjectFiles(basePath: string): string[] {
|
|
1124
1181
|
const files: string[] = [];
|
|
1125
1182
|
const queue: Array<{ path: string; depth: number }> = [{ path: basePath, depth: 0 }];
|
|
@@ -159,7 +159,7 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
159
159
|
|
|
160
160
|
- `phases`: fine-grained control over which phases run. Usually set by `token_profile`, but can be overridden. Keys:
|
|
161
161
|
- `skip_research`: boolean — skip milestone-level research. Default: `false`.
|
|
162
|
-
- `reassess_after_slice`: boolean — run roadmap
|
|
162
|
+
- `reassess_after_slice`: boolean — run a dedicated roadmap-reassessment unit after each completed slice. Default: `false` (per ADR-003 §4). The plan-slice agent for the next slice performs JIT reassessment via a prompt preamble at zero additional token cost; a dedicated reassess session is opt-in. Set to `true` (e.g. via the `burn-max` profile) if you want the explicit session.
|
|
163
163
|
- `skip_reassess`: boolean — force-disable roadmap reassessment even if `reassess_after_slice` is enabled. Default: `false`.
|
|
164
164
|
- `skip_slice_research`: boolean — skip per-slice research. Default: `false`.
|
|
165
165
|
|
|
@@ -60,9 +60,9 @@ export const GATE_REGISTRY = {
|
|
|
60
60
|
id: "Q4",
|
|
61
61
|
scope: "slice",
|
|
62
62
|
ownerTurn: "gate-evaluate",
|
|
63
|
-
question: "
|
|
63
|
+
question: "Which existing requirements (R-IDs) does this slice touch, and which must be re-tested?",
|
|
64
64
|
guidance: [
|
|
65
|
-
"List
|
|
65
|
+
"List the R-IDs (e.g. R001, R003) touched by this slice; see the milestone requirements artifact at .gsd/milestones/<id>/REQUIREMENTS.md.",
|
|
66
66
|
"Identify what must be re-tested after shipping.",
|
|
67
67
|
"Flag decisions that should be revisited given the new scope.",
|
|
68
68
|
"If no existing requirements are affected, return verdict 'omitted'.",
|
|
@@ -2,9 +2,38 @@
|
|
|
2
2
|
* Shared git constants used across git-service and native-git-bridge.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Parent process env vars that, if leaked into a git child process, can
|
|
7
|
+
* silently redirect every operation to a different repo or index.
|
|
8
|
+
*
|
|
9
|
+
* Stripped from GIT_NO_PROMPT_ENV so a GSD invoked from inside a git hook,
|
|
10
|
+
* a different worktree's terminal, or any context that pre-set these vars
|
|
11
|
+
* cannot redirect GSD's git operations to the wrong target.
|
|
12
|
+
* (Issue #4980 NEW-1)
|
|
13
|
+
*/
|
|
14
|
+
const LEAKING_GIT_ENV_VARS = [
|
|
15
|
+
"GIT_DIR",
|
|
16
|
+
"GIT_WORK_TREE",
|
|
17
|
+
"GIT_INDEX_FILE",
|
|
18
|
+
"GIT_OBJECT_DIRECTORY",
|
|
19
|
+
"GIT_ALTERNATE_OBJECT_DIRECTORIES",
|
|
20
|
+
"GIT_COMMON_DIR",
|
|
21
|
+
"GIT_NAMESPACE",
|
|
22
|
+
] as const;
|
|
23
|
+
|
|
24
|
+
function buildSafeParentEnv(): NodeJS.ProcessEnv {
|
|
25
|
+
const safe: NodeJS.ProcessEnv = {};
|
|
26
|
+
for (const [k, v] of Object.entries(process.env)) {
|
|
27
|
+
if (!LEAKING_GIT_ENV_VARS.includes(k as (typeof LEAKING_GIT_ENV_VARS)[number])) {
|
|
28
|
+
safe[k] = v;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return safe;
|
|
32
|
+
}
|
|
33
|
+
|
|
5
34
|
/** Env overlay that suppresses interactive git credential prompts and git-svn noise. */
|
|
6
35
|
export const GIT_NO_PROMPT_ENV = {
|
|
7
|
-
...
|
|
36
|
+
...buildSafeParentEnv(),
|
|
8
37
|
GIT_TERMINAL_PROMPT: "0",
|
|
9
38
|
GIT_ASKPASS: "",
|
|
10
39
|
GIT_SVN_ID: "",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* user-friendly messages suggesting `/gsd doctor`.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import { execFileSync } from "node:child_process";
|
|
13
14
|
import { existsSync, unlinkSync } from "node:fs";
|
|
14
15
|
import { join } from "node:path";
|
|
15
16
|
import { MergeConflictError } from "./git-service.js";
|
|
@@ -24,6 +25,18 @@ export interface AbortAndResetResult {
|
|
|
24
25
|
cleaned: string[];
|
|
25
26
|
}
|
|
26
27
|
|
|
28
|
+
function hasWorkingTreeChanges(cwd: string): boolean {
|
|
29
|
+
try {
|
|
30
|
+
return execFileSync("git", ["status", "--porcelain"], {
|
|
31
|
+
cwd,
|
|
32
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
33
|
+
encoding: "utf-8",
|
|
34
|
+
}).trim().length > 0;
|
|
35
|
+
} catch {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
27
40
|
/**
|
|
28
41
|
* Detect and clean up leftover merge/rebase state, then hard-reset.
|
|
29
42
|
*
|
|
@@ -70,6 +83,24 @@ export function abortAndReset(cwd: string): AbortAndResetResult {
|
|
|
70
83
|
}
|
|
71
84
|
}
|
|
72
85
|
|
|
86
|
+
// Preserve any staged or untracked user work before the hard reset.
|
|
87
|
+
// Reset --hard discards staged changes (reflog only covers committed
|
|
88
|
+
// state), so a labeled stash gives the user a recovery handle if their
|
|
89
|
+
// in-flight inspection work would otherwise be silently lost.
|
|
90
|
+
// (Issue #4980 HIGH-5)
|
|
91
|
+
if (hasWorkingTreeChanges(cwd)) {
|
|
92
|
+
try {
|
|
93
|
+
execFileSync(
|
|
94
|
+
"git",
|
|
95
|
+
["stash", "push", "--include-untracked", "-m", `gsd: pre-self-heal-reset ${new Date().toISOString()}`],
|
|
96
|
+
{ cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
|
|
97
|
+
);
|
|
98
|
+
cleaned.push("stashed working tree before reset");
|
|
99
|
+
} catch {
|
|
100
|
+
/* nothing to stash, or stash refused (e.g. unresolved conflicts) — proceed */
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
73
104
|
// Always hard-reset to HEAD
|
|
74
105
|
try {
|
|
75
106
|
nativeResetHard(cwd);
|