@opengsd/gsd-pi 1.0.2-dev.e70300c → 1.0.2-dev.fb7ddf1
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 +63 -12
- package/dist/headless-answers.js +2 -1
- package/dist/headless-events.d.ts +1 -0
- package/dist/headless-events.js +8 -1
- package/dist/onboarding.js +22 -3
- package/dist/resource-loader.d.ts +7 -0
- package/dist/resource-loader.js +44 -9
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +34 -11
- package/dist/resources/extensions/context7/index.js +12 -2
- package/dist/resources/extensions/get-secrets-from-user.js +16 -16
- package/dist/resources/extensions/google-cli/index.js +30 -0
- package/dist/resources/extensions/google-cli/models.js +55 -0
- package/dist/resources/extensions/google-cli/package.json +11 -0
- package/dist/resources/extensions/google-cli/readiness.js +12 -0
- package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
- package/dist/resources/extensions/gsd/auto/loop.js +81 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +38 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +65 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-start.js +232 -49
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -1
- package/dist/resources/extensions/gsd/auto-verification.js +14 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +34 -1
- package/dist/resources/extensions/gsd/auto.js +40 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -27
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +4 -4
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
- package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +3 -0
- package/dist/resources/extensions/gsd/commands-usage.js +105 -1
- package/dist/resources/extensions/gsd/config-overlay.js +20 -14
- package/dist/resources/extensions/gsd/context-overlay.js +22 -16
- package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +70 -5
- package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
- package/dist/resources/extensions/gsd/doctor.js +7 -2
- package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
- package/dist/resources/extensions/gsd/guided-flow.js +5 -6
- package/dist/resources/extensions/gsd/key-manager.js +45 -13
- package/dist/resources/extensions/gsd/mcp-filter.js +57 -18
- package/dist/resources/extensions/gsd/mcp-project-config.js +15 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +5 -1
- package/dist/resources/extensions/gsd/milestone-actions.js +3 -0
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
- package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
- package/dist/resources/extensions/gsd/parallel-merge.js +6 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
- package/dist/resources/extensions/gsd/post-execution-checks.js +5 -4
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
- package/dist/resources/extensions/gsd/preferences.js +14 -2
- package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/system.md +3 -20
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
- package/dist/resources/extensions/gsd/repo-identity.js +36 -6
- package/dist/resources/extensions/gsd/repository-registry.js +3 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +13 -6
- package/dist/resources/extensions/gsd/skill-activation.js +233 -0
- package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
- package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
- package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
- package/dist/resources/extensions/gsd/skill-scope.js +52 -0
- package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
- package/dist/resources/extensions/gsd/skills.js +60 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
- package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
- package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
- package/dist/resources/extensions/gsd/vision-ask.js +22 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
- package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
- package/dist/resources/extensions/search-the-web/native-search.js +57 -8
- package/dist/resources/extensions/shared/confirm-ui.js +9 -6
- package/dist/resources/extensions/shared/dialog-frame.js +42 -0
- package/dist/resources/extensions/shared/interview-ui.js +42 -30
- package/dist/resources/extensions/shared/next-action-ui.js +6 -6
- package/dist/resources/extensions/subagent/index.js +8 -15
- package/dist/resources/shared/package-manager-detection.js +36 -0
- package/dist/resources/skills/agent-browser/SKILL.md +1 -1
- package/dist/resources/skills/api-design/SKILL.md +1 -1
- package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
- package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
- package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
- package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/dist/resources/skills/forensics/SKILL.md +2 -2
- package/dist/resources/skills/grill-me/SKILL.md +1 -1
- package/dist/resources/skills/handoff/SKILL.md +1 -1
- package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
- package/dist/resources/skills/observability/SKILL.md +1 -1
- package/dist/resources/skills/security-review/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
- package/dist/resources/skills/tdd/SKILL.md +1 -1
- package/dist/resources/skills/write-docs/SKILL.md +1 -1
- package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +7 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- 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/update/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 +8 -8
- package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +5 -2
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.test.js +5 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +15 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/dist/workflow.test.js +1 -0
- package/packages/contracts/dist/workflow.test.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +7 -1
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +47 -8
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +16 -14
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.js +6 -0
- package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +48 -206
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +67 -220
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +50 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
- package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
- package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
- package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +3 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/detect-existing.js +17 -3
- package/scripts/install/npm-global.js +103 -33
- package/scripts/install.js +1 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
- package/src/resources/extensions/context7/index.ts +15 -2
- package/src/resources/extensions/get-secrets-from-user.ts +17 -16
- package/src/resources/extensions/google-cli/index.ts +34 -0
- package/src/resources/extensions/google-cli/models.ts +57 -0
- package/src/resources/extensions/google-cli/package.json +11 -0
- package/src/resources/extensions/google-cli/readiness.ts +15 -0
- package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
- package/src/resources/extensions/gsd/auto/loop.ts +96 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +47 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
- package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
- package/src/resources/extensions/gsd/auto-start.ts +307 -56
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
- package/src/resources/extensions/gsd/auto-verification.ts +18 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -1
- package/src/resources/extensions/gsd/auto.ts +50 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
- package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-usage.ts +110 -5
- package/src/resources/extensions/gsd/config-overlay.ts +19 -16
- package/src/resources/extensions/gsd/context-overlay.ts +24 -19
- package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
- package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -2
- package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
- package/src/resources/extensions/gsd/guided-flow.ts +5 -6
- package/src/resources/extensions/gsd/key-manager.ts +57 -14
- package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
- package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
- package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
- package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
- package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
- package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
- package/src/resources/extensions/gsd/preferences.ts +17 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/system.md +3 -20
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
- package/src/resources/extensions/gsd/repo-identity.ts +35 -7
- package/src/resources/extensions/gsd/repository-registry.ts +3 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
- package/src/resources/extensions/gsd/skill-activation.ts +292 -0
- package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
- package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
- package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
- package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
- package/src/resources/extensions/gsd/skill-scope.ts +63 -0
- package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
- package/src/resources/extensions/gsd/skills.ts +75 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
- package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
- package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
- package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
- package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
- package/src/resources/extensions/gsd/vision-ask.ts +28 -0
- package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
- package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
- package/src/resources/extensions/search-the-web/native-search.ts +60 -8
- package/src/resources/extensions/shared/confirm-ui.ts +8 -12
- package/src/resources/extensions/shared/dialog-frame.ts +71 -0
- package/src/resources/extensions/shared/interview-ui.ts +43 -42
- package/src/resources/extensions/shared/next-action-ui.ts +6 -6
- package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
- package/src/resources/extensions/subagent/index.ts +8 -15
- package/src/resources/shared/package-manager-detection.ts +39 -0
- package/src/resources/skills/agent-browser/SKILL.md +1 -1
- package/src/resources/skills/api-design/SKILL.md +1 -1
- package/src/resources/skills/code-optimizer/SKILL.md +6 -11
- package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
- package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
- package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
- package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/src/resources/skills/forensics/SKILL.md +2 -2
- package/src/resources/skills/grill-me/SKILL.md +1 -1
- package/src/resources/skills/handoff/SKILL.md +1 -1
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
- package/src/resources/skills/observability/SKILL.md +1 -1
- package/src/resources/skills/security-review/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
- package/src/resources/skills/tdd/SKILL.md +1 -1
- package/src/resources/skills/write-docs/SKILL.md +1 -1
- package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
- /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_ssgManifest.js +0 -0
|
@@ -117,18 +117,20 @@ export async function mergeCompletedMilestone(basePath, milestoneId) {
|
|
|
117
117
|
// to read it from. Only use the worktree path when git actually knows
|
|
118
118
|
// about it (`getAutoWorktreePath` returns non-null). When the directory
|
|
119
119
|
// exists on disk but isn't a registered git worktree (e.g. a stale
|
|
120
|
-
// session-status marker dir),
|
|
121
|
-
//
|
|
122
|
-
//
|
|
123
|
-
//
|
|
120
|
+
// session-status marker dir), recover through branch mode from the project
|
|
121
|
+
// root. Letting worktree-mode run from the project root can auto-commit
|
|
122
|
+
// overlapping root files to the integration branch before the squash merge,
|
|
123
|
+
// creating a synthetic conflict.
|
|
124
124
|
const registeredWtPath = getAutoWorktreePath(basePath, milestoneId);
|
|
125
125
|
const worktreeBasePath = registeredWtPath ?? basePath;
|
|
126
|
+
const isolationModeOverride = registeredWtPath ? undefined : "branch";
|
|
126
127
|
let result;
|
|
127
128
|
try {
|
|
128
129
|
result = mergeMilestoneStandalone(buildWorktreeLifecycleDeps(), {
|
|
129
130
|
originalBasePath: basePath,
|
|
130
131
|
worktreeBasePath,
|
|
131
132
|
milestoneId,
|
|
133
|
+
isolationModeOverride,
|
|
132
134
|
// Parallel context never runs with degraded isolation — workers only
|
|
133
135
|
// exist when isolation succeeded. Pass `false` explicitly so the
|
|
134
136
|
// standalone's degraded-skip branch is not reached.
|
|
@@ -7,7 +7,7 @@ import { matchesKey, Key } from "@gsd/pi-tui";
|
|
|
7
7
|
import { formatDuration } from "../shared/mod.js";
|
|
8
8
|
import { formattedShortcutPair } from "./shortcut-defs.js";
|
|
9
9
|
import { resolveGsdPathContract } from "./paths.js";
|
|
10
|
-
import { renderBar, renderKeyHints, renderProgressBar, safeLine, statusGlyph, } from "./tui/render-kit.js";
|
|
10
|
+
import { renderBar, renderDialogFrame, renderKeyHints, renderProgressBar, safeLine, statusGlyph, } from "./tui/render-kit.js";
|
|
11
11
|
// ─── Data Helpers ─────────────────────────────────────────────────────────
|
|
12
12
|
function readJsonSafe(filePath) {
|
|
13
13
|
try {
|
|
@@ -306,15 +306,14 @@ export class ParallelMonitorOverlay {
|
|
|
306
306
|
const t = this.theme;
|
|
307
307
|
const lines = [];
|
|
308
308
|
const w = Math.max(1, width);
|
|
309
|
-
|
|
309
|
+
const contentWidth = Math.max(1, w - 4);
|
|
310
310
|
const totalCost = this.workers.reduce((s, wk) => s + wk.cost, 0);
|
|
311
311
|
const aliveCount = this.workers.filter((wk) => wk.alive).length;
|
|
312
312
|
const now = new Date().toLocaleTimeString();
|
|
313
|
-
lines.push(t.bold(t.fg("accent", " GSD Parallel Monitor ")));
|
|
314
313
|
lines.push(t.fg("muted", ` ${now} │ ${aliveCount}/${this.workers.length} alive │ Total: `) +
|
|
315
314
|
t.bold(`$${totalCost.toFixed(2)}`) +
|
|
316
315
|
t.fg("muted", " │ 5s refresh"));
|
|
317
|
-
lines.push(renderBar(t,
|
|
316
|
+
lines.push(renderBar(t, contentWidth));
|
|
318
317
|
if (this.workers.length === 0) {
|
|
319
318
|
lines.push("");
|
|
320
319
|
lines.push(t.fg("warning", " No parallel workers found."));
|
|
@@ -360,7 +359,7 @@ export class ParallelMonitorOverlay {
|
|
|
360
359
|
});
|
|
361
360
|
lines.push(` ${t.fg("muted", "slices")} ${chips.join(" ")}`);
|
|
362
361
|
// Task progress bar
|
|
363
|
-
const barWidth = Math.max(6, Math.min(25,
|
|
362
|
+
const barWidth = Math.max(6, Math.min(25, contentWidth - 32));
|
|
364
363
|
const bar = renderProgressBar(t, wk.doneTasks, wk.totalTasks, barWidth, {
|
|
365
364
|
filledChar: "█",
|
|
366
365
|
emptyChar: "░",
|
|
@@ -378,7 +377,7 @@ export class ParallelMonitorOverlay {
|
|
|
378
377
|
}
|
|
379
378
|
// Event feed
|
|
380
379
|
lines.push("");
|
|
381
|
-
lines.push(renderBar(t,
|
|
380
|
+
lines.push(renderBar(t, contentWidth));
|
|
382
381
|
lines.push(` ${t.bold("Recent Events")}`);
|
|
383
382
|
if (this.events.length === 0) {
|
|
384
383
|
lines.push(t.fg("muted", " No events yet..."));
|
|
@@ -389,7 +388,6 @@ export class ParallelMonitorOverlay {
|
|
|
389
388
|
lines.push(` ${t.fg("muted", "│")} ${t.fg("accent", mid)} ${evt.replace(/^✓ M\d+\//, "")}`);
|
|
390
389
|
}
|
|
391
390
|
}
|
|
392
|
-
// Footer
|
|
393
391
|
lines.push("");
|
|
394
392
|
const allDone = this.workers.length > 0 && this.workers.every((wk) => !wk.alive);
|
|
395
393
|
if (allDone) {
|
|
@@ -400,16 +398,20 @@ export class ParallelMonitorOverlay {
|
|
|
400
398
|
}
|
|
401
399
|
lines.push(` ${t.bold("Total: $" + this.workers.reduce((s, wk) => s + wk.cost, 0).toFixed(2))}`);
|
|
402
400
|
}
|
|
403
|
-
lines.push(renderKeyHints(t, [`ESC/q/${formattedShortcutPair("parallel")} close`, "↑↓ scroll"], w));
|
|
404
401
|
// Apply scroll — use terminal rows as height estimate
|
|
405
402
|
const termHeight = process.stdout.rows || 40;
|
|
406
|
-
const
|
|
403
|
+
const maxBodyRows = Math.max(1, Math.min(lines.length, termHeight - 12));
|
|
404
|
+
const maxScroll = Math.max(0, lines.length - maxBodyRows);
|
|
407
405
|
this.scrollOffset = Math.min(Math.max(this.scrollOffset, 0), maxScroll);
|
|
408
406
|
const visible = lines
|
|
409
|
-
.slice(this.scrollOffset, this.scrollOffset +
|
|
410
|
-
.map((line) => safeLine(line,
|
|
411
|
-
|
|
407
|
+
.slice(this.scrollOffset, this.scrollOffset + maxBodyRows)
|
|
408
|
+
.map((line) => safeLine(line, contentWidth));
|
|
409
|
+
const footer = renderKeyHints(t, [`ESC/q/${formattedShortcutPair("parallel")} close`, "↑↓ scroll"], contentWidth);
|
|
410
|
+
this.cachedLines = renderDialogFrame(t, "GSD Parallel Monitor", visible, w, {
|
|
411
|
+
footer,
|
|
412
|
+
scroll: { offset: this.scrollOffset, visibleRows: maxBodyRows, totalRows: lines.length },
|
|
413
|
+
});
|
|
412
414
|
this.cachedWidth = width;
|
|
413
|
-
return
|
|
415
|
+
return this.cachedLines;
|
|
414
416
|
}
|
|
415
417
|
}
|
|
@@ -242,10 +242,11 @@ export function checkImportResolution(taskRow, _priorTasks, basePath) {
|
|
|
242
242
|
}
|
|
243
243
|
const imports = extractRelativeImports(source);
|
|
244
244
|
for (const { importPath, lineNum } of imports) {
|
|
245
|
-
//
|
|
246
|
-
//
|
|
247
|
-
// completion on these imports.
|
|
248
|
-
if (/^\.{1,2}\/\+types\//.test(importPath)
|
|
245
|
+
// Framework-generated type modules may not exist on disk during post-exec
|
|
246
|
+
// checks (typically generated during framework builds/typegen). Don't
|
|
247
|
+
// block task completion on these imports.
|
|
248
|
+
if (/^\.{1,2}\/\+types\//.test(importPath) ||
|
|
249
|
+
/^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath)) {
|
|
249
250
|
continue;
|
|
250
251
|
}
|
|
251
252
|
const resolution = resolveImportPath(importPath, file, basePath);
|
|
@@ -11,10 +11,17 @@ import { gsdHome } from "./gsd-home.js";
|
|
|
11
11
|
import { statSync } from "node:fs";
|
|
12
12
|
import { validatePreferences } from "./preferences-validation.js";
|
|
13
13
|
/**
|
|
14
|
-
* Known skill directories
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* Known skill directories for **preference reference resolution** (bare skill names).
|
|
15
|
+
*
|
|
16
|
+
* Search order (first match wins):
|
|
17
|
+
* 1. ~/.gsd/agent/skills/ (GSD bundled)
|
|
18
|
+
* 2. ~/.agents/skills/ (ecosystem global)
|
|
19
|
+
* 3. .agents/skills/ (project ecosystem)
|
|
20
|
+
* 4. ~/.claude/skills/ and .claude/skills/ (Claude Code compatibility)
|
|
21
|
+
*
|
|
22
|
+
* Note: the ResourceLoader catalog uses PackageManager precedence instead —
|
|
23
|
+
* project `.gsd/skills` and `.agents/skills` can override bundled GSD skills
|
|
24
|
+
* on name collision. See docs/dev/what-is-pi/09-the-customization-stack.md.
|
|
18
25
|
*/
|
|
19
26
|
export function getSkillSearchDirs(cwd) {
|
|
20
27
|
const dirs = [
|
|
@@ -455,9 +455,10 @@ function mergePreDispatchHooks(base, override) {
|
|
|
455
455
|
return merged.length > 0 ? merged : undefined;
|
|
456
456
|
}
|
|
457
457
|
// ─── System Prompt Rendering ──────────────────────────────────────────────────
|
|
458
|
-
export function renderPreferencesForSystemPrompt(preferences, resolutions) {
|
|
458
|
+
export function renderPreferencesForSystemPrompt(preferences, resolutions, options) {
|
|
459
459
|
const validated = validatePreferences(preferences);
|
|
460
460
|
const lines = ["## GSD Skill Preferences"];
|
|
461
|
+
const includeResolvedPaths = options?.includeResolvedPaths ?? true;
|
|
461
462
|
if (validated.errors.length > 0) {
|
|
462
463
|
lines.push("- Validation: some preference values were ignored because they were invalid.");
|
|
463
464
|
}
|
|
@@ -466,7 +467,18 @@ export function renderPreferencesForSystemPrompt(preferences, resolutions) {
|
|
|
466
467
|
}
|
|
467
468
|
preferences = validated.preferences;
|
|
468
469
|
lines.push("- Treat these as explicit skill-selection policy for GSD work.", "- If a listed skill exists and is relevant, load and follow it instead of treating it as a vague suggestion.", "- Current user instructions still override these defaults.");
|
|
469
|
-
const fmt = (ref) =>
|
|
470
|
+
const fmt = (ref) => {
|
|
471
|
+
if (!resolutions)
|
|
472
|
+
return ref;
|
|
473
|
+
if (!includeResolvedPaths) {
|
|
474
|
+
const resolution = resolutions.get(ref);
|
|
475
|
+
if (!resolution || resolution.method === "unresolved") {
|
|
476
|
+
return `${ref} (⚠ not found — check skill name or path)`;
|
|
477
|
+
}
|
|
478
|
+
return ref;
|
|
479
|
+
}
|
|
480
|
+
return formatSkillRef(ref, resolutions);
|
|
481
|
+
};
|
|
470
482
|
if (preferences.always_use_skills && preferences.always_use_skills.length > 0) {
|
|
471
483
|
lines.push("- Always use these skills when relevant:");
|
|
472
484
|
for (const skill of preferences.always_use_skills) {
|
|
@@ -21,6 +21,7 @@ import { join, dirname } from "node:path";
|
|
|
21
21
|
import { fileURLToPath } from "node:url";
|
|
22
22
|
import { logWarning } from "./workflow-logger.js";
|
|
23
23
|
import { gsdHome } from "./gsd-home.js";
|
|
24
|
+
import { chooseVisionAskVariant } from "./vision-ask.js";
|
|
24
25
|
function hasRequiredExtensionAssets(rootDir, exists = existsSync) {
|
|
25
26
|
return (exists(join(rootDir, "prompts")) &&
|
|
26
27
|
exists(join(rootDir, "templates", "task-summary.md")));
|
|
@@ -168,6 +169,7 @@ export function loadPrompt(name, vars = {}) {
|
|
|
168
169
|
planTemplatePath: join(getTemplatesDir(), "plan.md"),
|
|
169
170
|
taskPlanTemplatePath: join(getTemplatesDir(), "task-plan.md"),
|
|
170
171
|
taskSummaryTemplatePath: join(getTemplatesDir(), "task-summary.md"),
|
|
172
|
+
visionAsk: chooseVisionAskVariant(),
|
|
171
173
|
skillActivation: "If a `GSD Skill Preferences` block is present in system context, use it and the `<available_skills>` catalog in your system prompt to decide which skills to load and follow for this unit, without relaxing required verification or artifact rules.",
|
|
172
174
|
...vars,
|
|
173
175
|
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{{preamble}}
|
|
2
2
|
|
|
3
|
-
Ask
|
|
3
|
+
Ask exactly this once: "{{visionAsk}}" Then use the user's reply as vision input.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The opener is intentionally variable so GSD feels alive across project starts. Keep it natural, easy to answer, and assistant/developer shaped: plain language, light guidance, no corporate wording, no roleplay.
|
|
6
|
+
|
|
7
|
+
**Special handling:** If the **user's** message is status, branch state, clarification, or any other non-project-description, treat it as vision input and proceed instead of repeating the opener. Do **not** treat the system preamble above (e.g. "New milestone M00X.") as vision input — wait for the user.
|
|
6
8
|
|
|
7
9
|
## Reflection Step
|
|
8
10
|
|
|
@@ -35,7 +35,7 @@ You are evaluating **quality gates in parallel** for this slice. Each gate is an
|
|
|
35
35
|
2. **Wait for all subagents** to complete.
|
|
36
36
|
3. **Verify each gate wrote its result** by checking that `gsd_save_gate_result` was called for each gate ID.
|
|
37
37
|
- Call it **directly** — do **not** use `ToolSearch` (it is not available in GSD).
|
|
38
|
-
- Inside Claude Code use `
|
|
38
|
+
- Inside Claude Code use the active MCP-scoped workflow name for `gsd_save_gate_result`; otherwise use `gsd_save_gate_result`.
|
|
39
39
|
- Always pass all required fields (camelCase): `milestoneId`, `sliceId`, `gateId`, `verdict`, `rationale`. Never call with an empty `{}` object.
|
|
40
40
|
4. **Report the batch outcome** — which gates passed, which flagged concerns, and which were omitted as not applicable.
|
|
41
41
|
|
|
@@ -4,6 +4,8 @@ Discuss milestone {{milestoneId}} ("{{milestoneTitle}}"). Identify real gray are
|
|
|
4
4
|
|
|
5
5
|
**Structured questions available: {{structuredQuestionsAvailable}}**
|
|
6
6
|
|
|
7
|
+
**Conversation opener:** For the first user-facing question round, if you need a broad starting question, use: "{{visionAsk}}" Pair it with investigation-shaped follow-ups. Keep the tone natural and easy to answer, like an assistant/developer helping the user shape the next piece of work.
|
|
8
|
+
|
|
7
9
|
{{inlinedTemplates}}
|
|
8
10
|
|
|
9
11
|
---
|
|
@@ -19,9 +19,7 @@ Leave the project ready for the next agent to understand and continue. Artifacts
|
|
|
19
19
|
|
|
20
20
|
## Skills
|
|
21
21
|
|
|
22
|
-
GSD ships with bundled skills.
|
|
23
|
-
|
|
24
|
-
{{bundledSkillsTable}}
|
|
22
|
+
GSD ships with bundled skills. Installed skills are listed in `<available_skills>` in your system prompt — load the relevant skill file with `read` using the path shown there before starting matching work. Use bare skill names in preferences; GSD resolves paths.
|
|
25
23
|
|
|
26
24
|
## Hard Rules
|
|
27
25
|
|
|
@@ -122,18 +120,7 @@ Templates are in `{{templatesDir}}`.
|
|
|
122
120
|
|
|
123
121
|
**Browser verification:** Verify frontend work against a running app. Discovery: `browser_find`/`browser_snapshot_refs`. Action: refs/selectors -> `browser_batch`. Verification: `browser_assert`. Diagnostics: `browser_diff` -> console/network logs -> full inspection as last resort. Retry only with a new hypothesis.
|
|
124
122
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
- Never use `cat` to read a file you might edit; use `read`.
|
|
128
|
-
- Never `grep` for a function definition when `lsp` go-to-definition is available.
|
|
129
|
-
- Never poll servers with `sleep` loops; use `bg_shell wait_for_ready`.
|
|
130
|
-
- Never background with `bash` + `&`; use `bg_shell start`.
|
|
131
|
-
- Never use `bg_shell output` for status; use `digest`.
|
|
132
|
-
- Never read files one-by-one to understand a subsystem; use `rg` or `scout` first.
|
|
133
|
-
- Never guess library APIs; use `get_library_docs`.
|
|
134
|
-
- Never ask the user to run/check/set something you can do.
|
|
135
|
-
- Never await stale async jobs after editing source; cancel then re-run.
|
|
136
|
-
- Never query `.gsd/gsd.db` directly via `sqlite3`, `better-sqlite3`, or `node -e require('better-sqlite3')`; the engine owns a single-writer WAL connection. Use `gsd_milestone_status`, `gsd_journal_query`, or other `gsd_*` tools.
|
|
123
|
+
**Database:** Never query `.gsd/gsd.db` directly via `sqlite3`, `better-sqlite3`, or `node -e require('better-sqlite3')`; the engine owns a single-writer WAL connection. Use `gsd_milestone_status`, `gsd_journal_query`, or other `gsd_*` tools.
|
|
137
124
|
|
|
138
125
|
### Ask vs infer
|
|
139
126
|
|
|
@@ -173,8 +160,4 @@ Fix root causes, not symptoms. If applying temporary mitigation, label it and pr
|
|
|
173
160
|
- When debugging, stay curious. Problems are puzzles. Say what's interesting about the failure before reaching for fixes.
|
|
174
161
|
- After completing a task, give a brief summary and 2-4 numbered next-step options; last option is always "Other". Omit the list for strict output formats.
|
|
175
162
|
|
|
176
|
-
Good narration: "Three
|
|
177
|
-
Good narration: "Tests pass. Running slice-level verification."
|
|
178
|
-
Good narration: "I need the task-plan template first, then I'll compare the existing T01 and T02 plans."
|
|
179
|
-
Bad narration: "Reading the file now." / "Let me check this." / "I'll look at the tests next."
|
|
180
|
-
Bad narration: "Need create plan artifact likely requires template maybe read existing task plans."
|
|
163
|
+
Good narration states a decision or finding: "Three handlers follow a middleware pattern - using that instead of a custom wrapper." Bad narration just announces the next call ("Reading the file now.") or emits compressed planner notes ("Need create plan artifact maybe read existing plans.").
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* Conflicting depends_on entries are auto-removed on confirm.
|
|
9
9
|
*/
|
|
10
10
|
import { Key, matchesKey, truncateToWidth } from "@gsd/pi-tui";
|
|
11
|
-
import { makeUI } from "../shared/tui.js";
|
|
12
11
|
import { GLYPH } from "../shared/mod.js";
|
|
13
12
|
import { validateQueueOrder } from "./queue-order.js";
|
|
13
|
+
import { renderDialogFrame, renderKeyHints } from "./tui/render-kit.js";
|
|
14
14
|
/**
|
|
15
15
|
* Show the queue reorder overlay.
|
|
16
16
|
* Returns the new order + deps to remove, or null if cancelled.
|
|
@@ -26,6 +26,7 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
26
26
|
let grabbed = false;
|
|
27
27
|
let scrollOffset = 0;
|
|
28
28
|
let cachedLines;
|
|
29
|
+
let cachedWidth;
|
|
29
30
|
let validation;
|
|
30
31
|
// Mutable deps map — tracks removals during this session
|
|
31
32
|
const liveDeps = new Map();
|
|
@@ -42,6 +43,7 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
42
43
|
revalidate();
|
|
43
44
|
function refresh() {
|
|
44
45
|
cachedLines = undefined;
|
|
46
|
+
cachedWidth = undefined;
|
|
45
47
|
tui.requestRender();
|
|
46
48
|
}
|
|
47
49
|
function swapItems(fromIdx, toIdx) {
|
|
@@ -125,17 +127,14 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
129
|
function render(width) {
|
|
128
|
-
if (cachedLines)
|
|
130
|
+
if (cachedLines && cachedWidth === width)
|
|
129
131
|
return cachedLines;
|
|
130
|
-
const
|
|
132
|
+
const contentWidth = Math.max(1, width - 4);
|
|
131
133
|
const lines = [];
|
|
132
134
|
const queueRows = [];
|
|
133
|
-
const
|
|
134
|
-
lines.push(...r); };
|
|
135
|
-
const add = (s) => truncateToWidth(s, width);
|
|
135
|
+
const add = (s) => truncateToWidth(s, contentWidth);
|
|
136
136
|
let cursorQueueRow = 0;
|
|
137
|
-
const headerText = grabbed ? "
|
|
138
|
-
push(ui.bar(), ui.blank(), ui.header(headerText), ui.blank());
|
|
137
|
+
const headerText = grabbed ? "Queue Reorder - Moving Item" : "Queue Reorder";
|
|
139
138
|
// Completed milestones (dimmed)
|
|
140
139
|
if (completed.length > 0) {
|
|
141
140
|
lines.push(add(theme.fg("dim", " Completed:")));
|
|
@@ -143,7 +142,7 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
143
142
|
const label = m.title && m.title !== m.id ? `${m.id} ${m.title}` : m.id;
|
|
144
143
|
lines.push(add(` ${theme.fg("dim", `${GLYPH.statusDone} ${label}`)}`));
|
|
145
144
|
}
|
|
146
|
-
push(
|
|
145
|
+
lines.push("");
|
|
147
146
|
}
|
|
148
147
|
// Pending milestones
|
|
149
148
|
const queueLabel = grabbed ? " Queue (space to release, ↑/↓ to move):" : " Queue (space to grab, ↑/↓ to navigate):";
|
|
@@ -190,7 +189,7 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
190
189
|
// Removed deps feedback
|
|
191
190
|
const trailingLines = [];
|
|
192
191
|
if (removedDeps.length > 0) {
|
|
193
|
-
trailingLines.push(
|
|
192
|
+
trailingLines.push("");
|
|
194
193
|
for (const r of removedDeps) {
|
|
195
194
|
trailingLines.push(add(` ${theme.fg("success", `${GLYPH.statusDone} Removed: ${r.milestone} depends_on ${r.dep}`)}`));
|
|
196
195
|
}
|
|
@@ -198,10 +197,9 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
198
197
|
// Circular warning
|
|
199
198
|
const circ = validation.violations.find(v => v.type === 'circular');
|
|
200
199
|
if (circ) {
|
|
201
|
-
trailingLines.push(
|
|
200
|
+
trailingLines.push("");
|
|
202
201
|
trailingLines.push(add(` ${theme.fg("error", `${GLYPH.statusWarning} ${circ.message}`)}`));
|
|
203
202
|
}
|
|
204
|
-
trailingLines.push(...ui.blank());
|
|
205
203
|
// Hints — context-sensitive based on grab state
|
|
206
204
|
const hints = [];
|
|
207
205
|
if (grabbed) {
|
|
@@ -221,9 +219,9 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
221
219
|
hints.push("enter ok");
|
|
222
220
|
}
|
|
223
221
|
hints.push("esc");
|
|
224
|
-
trailingLines.push(...ui.hints(hints), ...ui.bar());
|
|
225
222
|
const maxOverlayRows = Math.max(10, process.stdout.rows ? Math.floor(process.stdout.rows * 0.8) : 24);
|
|
226
|
-
const
|
|
223
|
+
const frameRows = 4;
|
|
224
|
+
const availableQueueRows = Math.max(1, maxOverlayRows - frameRows - lines.length - trailingLines.length);
|
|
227
225
|
const maxScroll = Math.max(0, queueRows.length - availableQueueRows);
|
|
228
226
|
if (cursorQueueRow < scrollOffset) {
|
|
229
227
|
scrollOffset = cursorQueueRow;
|
|
@@ -232,11 +230,23 @@ export async function showQueueReorder(ctx, completed, pending) {
|
|
|
232
230
|
scrollOffset = cursorQueueRow - availableQueueRows + 1;
|
|
233
231
|
}
|
|
234
232
|
scrollOffset = Math.min(Math.max(scrollOffset, 0), maxScroll);
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
233
|
+
const queueStartRow = lines.length;
|
|
234
|
+
const visibleQueueRows = queueRows.slice(scrollOffset, scrollOffset + availableQueueRows);
|
|
235
|
+
lines.push(...visibleQueueRows, ...trailingLines);
|
|
236
|
+
cachedLines = renderDialogFrame(theme, headerText, lines, width, {
|
|
237
|
+
footer: renderKeyHints(theme, hints, contentWidth),
|
|
238
|
+
scroll: {
|
|
239
|
+
offset: scrollOffset,
|
|
240
|
+
visibleRows: availableQueueRows,
|
|
241
|
+
totalRows: queueRows.length,
|
|
242
|
+
trackOffset: queueStartRow,
|
|
243
|
+
trackRows: visibleQueueRows.length,
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
cachedWidth = width;
|
|
247
|
+
return cachedLines;
|
|
238
248
|
}
|
|
239
|
-
return { render, invalidate: () => { cachedLines = undefined; }, handleInput };
|
|
249
|
+
return { render, invalidate: () => { cachedLines = undefined; cachedWidth = undefined; }, handleInput };
|
|
240
250
|
}, {
|
|
241
251
|
overlay: true,
|
|
242
252
|
overlayOptions: { width: "70%", minWidth: 50, maxHeight: "80%", anchor: "center" },
|
|
@@ -11,6 +11,7 @@ import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, re
|
|
|
11
11
|
import { basename, dirname, join, resolve } from "node:path";
|
|
12
12
|
import { gsdHome } from "./gsd-home.js";
|
|
13
13
|
import { isGsdWorktreePath, resolveExternalStateProjectGsdFromWorktreePath, resolveExternalStateProjectIdentityFromWorktreePath, } from "./worktree-root.js";
|
|
14
|
+
import { logWarning } from "./workflow-logger.js";
|
|
14
15
|
function isRepoMeta(value) {
|
|
15
16
|
if (!value || typeof value !== "object")
|
|
16
17
|
return false;
|
|
@@ -167,7 +168,9 @@ function isProjectGsd(gsdPath) {
|
|
|
167
168
|
}
|
|
168
169
|
// ─── Repo Identity ──────────────────────────────────────────────────────────
|
|
169
170
|
/**
|
|
170
|
-
* Get the git remote URL for "origin", or
|
|
171
|
+
* Get the git remote URL for "origin", or:
|
|
172
|
+
* - "" when git cleanly reports no remote
|
|
173
|
+
* - null when git command failed (transient/unknown)
|
|
171
174
|
* Uses `git config` rather than `git remote get-url` for broader compat.
|
|
172
175
|
*/
|
|
173
176
|
function getRemoteUrl(basePath) {
|
|
@@ -179,8 +182,25 @@ function getRemoteUrl(basePath) {
|
|
|
179
182
|
timeout: 5_000,
|
|
180
183
|
}).trim();
|
|
181
184
|
}
|
|
182
|
-
catch {
|
|
183
|
-
|
|
185
|
+
catch (error) {
|
|
186
|
+
const status = typeof error === "object" && error !== null && "status" in error
|
|
187
|
+
? error.status
|
|
188
|
+
: undefined;
|
|
189
|
+
if (status === 1) {
|
|
190
|
+
try {
|
|
191
|
+
if (existsSync(join(resolveGitCommonDir(basePath), "config")))
|
|
192
|
+
return "";
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Fall through to report unknown git/config failures.
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Keep transient git failures distinct from "no remote configured".
|
|
199
|
+
logWarning("state", "repo-identity: failed to resolve remote.origin.url", {
|
|
200
|
+
basePath,
|
|
201
|
+
error: String(error),
|
|
202
|
+
});
|
|
203
|
+
return null;
|
|
184
204
|
}
|
|
185
205
|
}
|
|
186
206
|
/**
|
|
@@ -275,6 +295,16 @@ export function repoIdentity(basePath) {
|
|
|
275
295
|
// This makes moves transparent for repos with remotes (#2750).
|
|
276
296
|
return createHash("sha256").update(remoteUrl).digest("hex").slice(0, 12);
|
|
277
297
|
}
|
|
298
|
+
if (remoteUrl === null) {
|
|
299
|
+
// Unknown remote status (transient git failure): prefer persisted identity.
|
|
300
|
+
const markerRoot = resolveGitRoot(basePath);
|
|
301
|
+
const markerId = readGsdIdMarker(markerRoot);
|
|
302
|
+
if (markerId) {
|
|
303
|
+
const markerPath = join(process.env.GSD_STATE_DIR || gsdHome(), "projects", markerId);
|
|
304
|
+
if (hasProjectState(markerPath) || readRepoMeta(markerPath))
|
|
305
|
+
return markerId;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
278
308
|
// Local-only repo: include git root since there's no remote to anchor identity.
|
|
279
309
|
const root = resolveGitRoot(basePath);
|
|
280
310
|
const input = `\n${root}`;
|
|
@@ -288,8 +318,7 @@ export function repoIdentity(basePath) {
|
|
|
288
318
|
* otherwise `~/.gsd/projects/<hash>`.
|
|
289
319
|
*/
|
|
290
320
|
export function externalGsdRoot(basePath) {
|
|
291
|
-
|
|
292
|
-
return join(base, "projects", repoIdentity(basePath));
|
|
321
|
+
return resolveExternalPathWithRecovery(basePath).path;
|
|
293
322
|
}
|
|
294
323
|
/**
|
|
295
324
|
* Resolve the root directory that stores project-scoped external state.
|
|
@@ -467,6 +496,7 @@ function resolveExternalPathWithRecovery(projectPath) {
|
|
|
467
496
|
rmSync(markerPath, { recursive: true, force: true });
|
|
468
497
|
}
|
|
469
498
|
catch { /* non-fatal */ }
|
|
499
|
+
writeGsdIdMarker(projectPath, computedId);
|
|
470
500
|
}
|
|
471
501
|
catch {
|
|
472
502
|
// If migration fails, just point at the old directory.
|
|
@@ -565,7 +595,7 @@ function ensureGsdSymlinkCore(projectPath) {
|
|
|
565
595
|
// Write repo metadata once so cleanup commands can identify this directory later.
|
|
566
596
|
// Skip refresh for external-state worktrees — parent store already has metadata.
|
|
567
597
|
if (!(isGsdWorktreePath(projectPath) && resolveExternalStateProjectGsdFromWorktreePath(projectPath))) {
|
|
568
|
-
writeRepoMeta(externalPath, getRemoteUrl(projectPath), resolveGitRoot(projectPath));
|
|
598
|
+
writeRepoMeta(externalPath, getRemoteUrl(projectPath) ?? "", resolveGitRoot(projectPath));
|
|
569
599
|
}
|
|
570
600
|
const replaceWithSymlink = () => {
|
|
571
601
|
rmSync(localGsd, { recursive: true, force: true });
|
|
@@ -50,7 +50,9 @@ function resolveGitWorkingTreeRoot(basePath) {
|
|
|
50
50
|
*/
|
|
51
51
|
export function createRepositoryRegistry(basePath, workspacePrefs) {
|
|
52
52
|
const contract = resolveGsdPathContract(basePath);
|
|
53
|
-
const projectRoot =
|
|
53
|
+
const projectRoot = contract.isWorktree
|
|
54
|
+
? resolveGitWorkingTreeRoot(contract.workRoot) ?? contract.projectRoot
|
|
55
|
+
: contract.projectRoot;
|
|
54
56
|
const mode = workspacePrefs?.mode ?? "project";
|
|
55
57
|
const repoMap = new Map();
|
|
56
58
|
// "project" is reserved: always maps to projectRoot and cannot be overridden.
|
|
@@ -15,15 +15,15 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, unlinkS
|
|
|
15
15
|
import { join, dirname } from "node:path";
|
|
16
16
|
import { randomBytes } from "node:crypto";
|
|
17
17
|
const EXECUTION_TOOL_NAMES = new Set([
|
|
18
|
-
"bash",
|
|
19
|
-
"Bash",
|
|
20
|
-
"PowerShell",
|
|
21
18
|
"async_bash",
|
|
19
|
+
"bash",
|
|
20
|
+
"exec_command",
|
|
21
|
+
"functions.exec_command",
|
|
22
22
|
"gsd_exec",
|
|
23
23
|
"gsd_exec_search",
|
|
24
|
-
"
|
|
25
|
-
"mcp__gsd-workflow__gsd_exec_search",
|
|
24
|
+
"powershell",
|
|
26
25
|
]);
|
|
26
|
+
const MCP_EXECUTION_TOOL_RE = /^mcp__.+__gsd_exec(?:_search)?$/;
|
|
27
27
|
// ─── Module State ───────────────────────────────────────────────────────────
|
|
28
28
|
let unitEvidence = [];
|
|
29
29
|
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
@@ -45,6 +45,13 @@ export function getFilePaths() {
|
|
|
45
45
|
.filter((e) => e.kind === "write" || e.kind === "edit")
|
|
46
46
|
.map(e => e.path);
|
|
47
47
|
}
|
|
48
|
+
/** True when a tool name represents a shell/command execution surface. */
|
|
49
|
+
export function isExecutionToolName(name) {
|
|
50
|
+
if (typeof name !== "string")
|
|
51
|
+
return false;
|
|
52
|
+
const normalized = name.trim().toLowerCase();
|
|
53
|
+
return EXECUTION_TOOL_NAMES.has(normalized) || MCP_EXECUTION_TOOL_RE.test(normalized);
|
|
54
|
+
}
|
|
48
55
|
// ─── Persistence (Bug #4385 — evidence must survive session restarts) ────────
|
|
49
56
|
/**
|
|
50
57
|
* Build the path for the evidence JSON file for a given unit.
|
|
@@ -139,7 +146,7 @@ export function clearEvidenceFromDisk(basePath, milestoneId, sliceId, taskId) {
|
|
|
139
146
|
* Exit codes and output are filled in by recordToolResult after execution.
|
|
140
147
|
*/
|
|
141
148
|
export function recordToolCall(toolCallId, toolName, input) {
|
|
142
|
-
if (
|
|
149
|
+
if (isExecutionToolName(toolName)) {
|
|
143
150
|
unitEvidence.push({
|
|
144
151
|
kind: "bash",
|
|
145
152
|
toolCallId,
|