@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
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
45
45
|
import { type Theme } from "@gsd/pi-coding-agent";
|
|
46
46
|
import { Key, matchesKey, type TUI } from "@gsd/pi-tui";
|
|
47
|
+
import { renderSharedDialogFrame } from "./dialog-frame.js";
|
|
47
48
|
import { makeUI } from "./ui.js";
|
|
48
49
|
|
|
49
50
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
@@ -142,14 +143,14 @@ export async function showNextAction(
|
|
|
142
143
|
|
|
143
144
|
function render(width: number): string[] {
|
|
144
145
|
if (cachedLines) return cachedLines;
|
|
145
|
-
const
|
|
146
|
+
const contentWidth = Math.max(1, width - 4);
|
|
147
|
+
const ui = makeUI(theme, contentWidth);
|
|
146
148
|
const lines: string[] = [];
|
|
147
149
|
const push = (...rows: string[][]) => { for (const r of rows) lines.push(...r); };
|
|
148
150
|
|
|
149
151
|
// ── Header — uses success colour to signal completion ────────────
|
|
150
152
|
// Note: next-action intentionally uses "success" for its bar/title
|
|
151
153
|
// to distinguish it from regular accent-coloured screens.
|
|
152
|
-
push(ui.bar());
|
|
153
154
|
push(ui.blank());
|
|
154
155
|
push(ui.header(` ✓ ${opts.title}`));
|
|
155
156
|
|
|
@@ -192,11 +193,10 @@ export async function showNextAction(
|
|
|
192
193
|
|
|
193
194
|
// ── Footer ────────────────────────────────────────────────────────
|
|
194
195
|
const numHint = allActions.map((_, i) => `${i + 1}`).join("/");
|
|
195
|
-
|
|
196
|
-
push(ui.bar());
|
|
196
|
+
const footer = ui.hints([`↑/↓ to choose`, `${numHint} to quick-select`, `enter to confirm`])[0] ?? "";
|
|
197
197
|
|
|
198
|
-
cachedLines = lines;
|
|
199
|
-
return
|
|
198
|
+
cachedLines = renderSharedDialogFrame(theme, "GSD Next Action", lines, width, { footer });
|
|
199
|
+
return cachedLines;
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
return { render, invalidate: () => { cachedLines = undefined; }, handleInput };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { stripVTControlCharacters } from "node:util";
|
|
4
|
+
|
|
5
|
+
import { visibleWidth } from "@gsd/pi-tui";
|
|
6
|
+
|
|
7
|
+
import { showConfirm } from "../confirm-ui.js";
|
|
8
|
+
|
|
9
|
+
function assertFullOuterBorder(lines: string[], width: number): void {
|
|
10
|
+
assert.ok(lines.length >= 2, "dialog must include top and bottom borders");
|
|
11
|
+
for (const [index, line] of lines.entries()) {
|
|
12
|
+
assert.equal(visibleWidth(line), width, `line ${index} must fill dialog width`);
|
|
13
|
+
}
|
|
14
|
+
const top = stripVTControlCharacters(lines[0] ?? "");
|
|
15
|
+
const bottom = stripVTControlCharacters(lines.at(-1) ?? "");
|
|
16
|
+
assert.match(top, /^[╭┌].*[╮┐]$/);
|
|
17
|
+
assert.match(bottom, /^[╰└].*[╯┘]$/);
|
|
18
|
+
for (let index = 1; index < lines.length - 1; index++) {
|
|
19
|
+
const line = stripVTControlCharacters(lines[index] ?? "");
|
|
20
|
+
assert.match(line, /^[│┃├]/, `line ${index} missing left border: ${line}`);
|
|
21
|
+
assert.match(line, /[│┃┤]$/, `line ${index} missing right border: ${line}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
describe("showConfirm", () => {
|
|
26
|
+
it("renders the confirmation prompt inside a full border", async () => {
|
|
27
|
+
let rendered: string[] = [];
|
|
28
|
+
const theme = {
|
|
29
|
+
fg: (_color: string, text: string) => text,
|
|
30
|
+
bold: (text: string) => text,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const ctx = {
|
|
34
|
+
hasUI: true,
|
|
35
|
+
ui: {
|
|
36
|
+
custom: async (factory: any) => {
|
|
37
|
+
let resolved: boolean | undefined;
|
|
38
|
+
const component = factory({ requestRender() {} }, theme, null, (value: boolean) => {
|
|
39
|
+
resolved = value;
|
|
40
|
+
});
|
|
41
|
+
rendered = component.render(80);
|
|
42
|
+
component.handleInput("\r");
|
|
43
|
+
return resolved as never;
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const result = await showConfirm(ctx as any, {
|
|
49
|
+
title: "Confirm action",
|
|
50
|
+
message: "Proceed with the change?",
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
assert.equal(result, true);
|
|
54
|
+
assertFullOuterBorder(rendered, 80);
|
|
55
|
+
assert.match(stripVTControlCharacters(rendered[0] ?? ""), /Confirm action/);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// gsd-pi — Shared interview UI dialog border contract
|
|
2
|
+
|
|
3
|
+
import assert from "node:assert/strict";
|
|
4
|
+
import { before, describe, it } from "node:test";
|
|
5
|
+
|
|
6
|
+
import { visibleWidth } from "@gsd/pi-tui";
|
|
7
|
+
import { initTheme } from "@gsd/pi-coding-agent";
|
|
8
|
+
import {
|
|
9
|
+
showInterviewRound,
|
|
10
|
+
showWrapUpScreen,
|
|
11
|
+
type Question,
|
|
12
|
+
type RoundResult,
|
|
13
|
+
type WrapUpResult,
|
|
14
|
+
} from "../interview-ui.js";
|
|
15
|
+
|
|
16
|
+
const ANSI_PATTERN = /\x1b\[[0-9;?]*[ -/]*[@-~]/g;
|
|
17
|
+
const ENTER = "\r";
|
|
18
|
+
const ESC = "\x1b";
|
|
19
|
+
|
|
20
|
+
before(() => { initTheme(); });
|
|
21
|
+
|
|
22
|
+
type RenderWidget = {
|
|
23
|
+
render(width: number): string[];
|
|
24
|
+
handleInput(input: string): void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function stripAnsi(text: string): string {
|
|
28
|
+
return text.replace(ANSI_PATTERN, "");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function assertFullOuterBorder(lines: string[], width: number): void {
|
|
32
|
+
assert.ok(lines.length >= 2, "dialog must include top and bottom borders");
|
|
33
|
+
|
|
34
|
+
for (const [index, line] of lines.entries()) {
|
|
35
|
+
assert.equal(visibleWidth(line), width, `line ${index} must fill dialog width`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const top = stripAnsi(lines[0] ?? "");
|
|
39
|
+
const bottom = stripAnsi(lines.at(-1) ?? "");
|
|
40
|
+
assert.match(top, /^╭.*╮$/, `top border missing full corners: ${top}`);
|
|
41
|
+
assert.match(bottom, /^╰.*╯$/, `bottom border missing full corners: ${bottom}`);
|
|
42
|
+
|
|
43
|
+
for (let index = 1; index < lines.length - 1; index++) {
|
|
44
|
+
const line = stripAnsi(lines[index] ?? "");
|
|
45
|
+
assert.match(line, /^[│├]/, `line ${index} missing left border: ${line}`);
|
|
46
|
+
assert.match(line, /[│┤]$/, `line ${index} missing right border: ${line}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function mockTheme() {
|
|
51
|
+
return {
|
|
52
|
+
fg: (_color: string, text: string) => text,
|
|
53
|
+
bold: (text: string) => text,
|
|
54
|
+
dim: (text: string) => text,
|
|
55
|
+
italic: (text: string) => text,
|
|
56
|
+
strikethrough: (text: string) => text,
|
|
57
|
+
accent: (text: string) => text,
|
|
58
|
+
success: (text: string) => text,
|
|
59
|
+
warning: (text: string) => text,
|
|
60
|
+
error: (text: string) => text,
|
|
61
|
+
info: (text: string) => text,
|
|
62
|
+
muted: (text: string) => text,
|
|
63
|
+
dimmed: (text: string) => text,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function captureInterviewWidget(
|
|
68
|
+
questions: Question[],
|
|
69
|
+
): Promise<RenderWidget> {
|
|
70
|
+
let widget: RenderWidget | undefined;
|
|
71
|
+
|
|
72
|
+
await showInterviewRound(questions, {}, {
|
|
73
|
+
ui: {
|
|
74
|
+
custom: (factory: any) => {
|
|
75
|
+
widget = factory(
|
|
76
|
+
{ requestRender: () => {} },
|
|
77
|
+
mockTheme(),
|
|
78
|
+
{},
|
|
79
|
+
(_result: RoundResult) => {},
|
|
80
|
+
);
|
|
81
|
+
return Promise.resolve({ endInterview: false, answers: {} });
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
} as any);
|
|
85
|
+
|
|
86
|
+
assert.ok(widget, "interview widget should be created");
|
|
87
|
+
return widget;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function captureWrapUpWidget(): Promise<RenderWidget> {
|
|
91
|
+
let widget: RenderWidget | undefined;
|
|
92
|
+
|
|
93
|
+
await showWrapUpScreen({
|
|
94
|
+
headline: "Ready to wrap up?",
|
|
95
|
+
progress: "4 questions answered",
|
|
96
|
+
keepGoingLabel: "Keep going",
|
|
97
|
+
satisfiedLabel: "I'm satisfied",
|
|
98
|
+
}, {
|
|
99
|
+
ui: {
|
|
100
|
+
custom: (factory: any) => {
|
|
101
|
+
widget = factory(
|
|
102
|
+
{ requestRender: () => {} },
|
|
103
|
+
mockTheme(),
|
|
104
|
+
{},
|
|
105
|
+
(_result: WrapUpResult) => {},
|
|
106
|
+
);
|
|
107
|
+
return Promise.resolve({ satisfied: false });
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
} as any);
|
|
111
|
+
|
|
112
|
+
assert.ok(widget, "wrap-up widget should be created");
|
|
113
|
+
return widget;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
describe("interview-ui dialog borders", () => {
|
|
117
|
+
const questions: Question[] = [
|
|
118
|
+
{
|
|
119
|
+
id: "project_type",
|
|
120
|
+
header: "Project Type",
|
|
121
|
+
question: "What type of project?",
|
|
122
|
+
options: [
|
|
123
|
+
{ label: "Web App", description: "Frontend or full-stack" },
|
|
124
|
+
{ label: "CLI Tool", description: "Command-line utility" },
|
|
125
|
+
],
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
it("renders the main question screen with a full border", async () => {
|
|
130
|
+
const widget = await captureInterviewWidget(questions);
|
|
131
|
+
assertFullOuterBorder(widget.render(80), 80);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("renders the preview split screen with a full border", async () => {
|
|
135
|
+
const widget = await captureInterviewWidget([{
|
|
136
|
+
...questions[0],
|
|
137
|
+
options: [
|
|
138
|
+
{
|
|
139
|
+
label: "Web App",
|
|
140
|
+
description: "Frontend or full-stack",
|
|
141
|
+
preview: "### Stack\n\nUse React with a typed API boundary.",
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
}]);
|
|
145
|
+
assertFullOuterBorder(widget.render(100), 100);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("renders review and exit confirmation screens with full borders", async () => {
|
|
149
|
+
const widget = await captureInterviewWidget(questions);
|
|
150
|
+
|
|
151
|
+
widget.handleInput(ENTER);
|
|
152
|
+
assertFullOuterBorder(widget.render(80), 80);
|
|
153
|
+
|
|
154
|
+
const exitWidget = await captureInterviewWidget(questions);
|
|
155
|
+
exitWidget.handleInput(ESC);
|
|
156
|
+
assertFullOuterBorder(exitWidget.render(80), 80);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("renders the wrap-up screen with a full border", async () => {
|
|
160
|
+
const widget = await captureWrapUpWidget();
|
|
161
|
+
assertFullOuterBorder(widget.render(80), 80);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
@@ -15,9 +15,27 @@
|
|
|
15
15
|
|
|
16
16
|
import { describe, it } from "node:test";
|
|
17
17
|
import assert from "node:assert/strict";
|
|
18
|
+
import { stripVTControlCharacters } from "node:util";
|
|
19
|
+
import { visibleWidth } from "@gsd/pi-tui";
|
|
18
20
|
|
|
19
21
|
import { showNextAction } from "../next-action-ui.js";
|
|
20
22
|
|
|
23
|
+
function assertFullOuterBorder(lines: string[], width: number): void {
|
|
24
|
+
assert.ok(lines.length >= 2, "dialog must include top and bottom borders");
|
|
25
|
+
for (const [index, line] of lines.entries()) {
|
|
26
|
+
assert.equal(visibleWidth(line), width, `line ${index} must fill dialog width`);
|
|
27
|
+
}
|
|
28
|
+
const top = stripVTControlCharacters(lines[0] ?? "");
|
|
29
|
+
const bottom = stripVTControlCharacters(lines.at(-1) ?? "");
|
|
30
|
+
assert.match(top, /^[╭┌].*[╮┐]$/);
|
|
31
|
+
assert.match(bottom, /^[╰└].*[╯┘]$/);
|
|
32
|
+
for (let index = 1; index < lines.length - 1; index++) {
|
|
33
|
+
const line = stripVTControlCharacters(lines[index] ?? "");
|
|
34
|
+
assert.match(line, /^[│┃├]/, `line ${index} missing left border: ${line}`);
|
|
35
|
+
assert.match(line, /[│┃┤]$/, `line ${index} missing right border: ${line}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
21
39
|
describe("showNextAction ctx.hasUI guard (#5125 lockup root protection)", () => {
|
|
22
40
|
it("returns 'not_yet' immediately when ctx.hasUI is false (no UI calls)", async () => {
|
|
23
41
|
let customCalled = 0;
|
|
@@ -152,4 +170,41 @@ describe("showNextAction ctx.hasUI guard (#5125 lockup root protection)", () =>
|
|
|
152
170
|
assert.equal(result, "beta", "TUI selection should be returned verbatim");
|
|
153
171
|
assert.equal(selectCalled, 0, "ctx.ui.select fallback must NOT fire when custom returns a value");
|
|
154
172
|
});
|
|
173
|
+
|
|
174
|
+
it("renders the interactive next-action menu inside a full border", async () => {
|
|
175
|
+
let rendered: string[] = [];
|
|
176
|
+
const theme = {
|
|
177
|
+
fg: (_color: string, text: string) => text,
|
|
178
|
+
bold: (text: string) => text,
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const ctx = {
|
|
182
|
+
hasUI: true,
|
|
183
|
+
ui: {
|
|
184
|
+
custom: async (factory: any) => {
|
|
185
|
+
let resolved: string | undefined;
|
|
186
|
+
const component = factory({ requestRender() {} }, theme, null, (value: string) => {
|
|
187
|
+
resolved = value;
|
|
188
|
+
});
|
|
189
|
+
rendered = component.render(80);
|
|
190
|
+
component.handleInput("\r");
|
|
191
|
+
return resolved as never;
|
|
192
|
+
},
|
|
193
|
+
select: async () => undefined,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const result = await showNextAction(ctx as any, {
|
|
198
|
+
title: "GSD — test",
|
|
199
|
+
summary: ["summary"],
|
|
200
|
+
actions: [
|
|
201
|
+
{ id: "alpha", label: "Alpha", description: "first", recommended: true },
|
|
202
|
+
{ id: "beta", label: "Beta", description: "second" },
|
|
203
|
+
],
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
assert.equal(result, "alpha");
|
|
207
|
+
assertFullOuterBorder(rendered, 80);
|
|
208
|
+
assert.match(stripVTControlCharacters(rendered[0] ?? ""), /GSD Next Action/);
|
|
209
|
+
});
|
|
155
210
|
});
|
|
@@ -732,18 +732,18 @@ const TaskItem = Type.Object({
|
|
|
732
732
|
cwd: Type.Optional(Type.String({ description: "Working directory for the agent process" })),
|
|
733
733
|
model: Type.Optional(Type.String({ description: "Model override for this task (e.g. 'claude-sonnet-4-6')" })),
|
|
734
734
|
context: Type.Optional(StringEnum(["fresh", "fork"] as const, {
|
|
735
|
-
description: 'Context mode for this task
|
|
735
|
+
description: 'Context mode for this task (see context field on the top-level params).',
|
|
736
736
|
default: "fresh",
|
|
737
737
|
})),
|
|
738
738
|
});
|
|
739
739
|
|
|
740
740
|
const ChainItem = Type.Object({
|
|
741
741
|
agent: Type.String({ description: "Name of the agent to invoke" }),
|
|
742
|
-
task: Type.String({ description: "Task with optional {previous} placeholder for prior output" }),
|
|
742
|
+
task: Type.String({ description: "Task with optional {previous} placeholder for prior step output" }),
|
|
743
743
|
cwd: Type.Optional(Type.String({ description: "Working directory for the agent process" })),
|
|
744
744
|
model: Type.Optional(Type.String({ description: "Model override for this step (e.g. 'claude-sonnet-4-6')" })),
|
|
745
745
|
context: Type.Optional(StringEnum(["fresh", "fork"] as const, {
|
|
746
|
-
description: 'Context mode for this step
|
|
746
|
+
description: 'Context mode for this step (see context field on the top-level params).',
|
|
747
747
|
default: "fresh",
|
|
748
748
|
})),
|
|
749
749
|
});
|
|
@@ -817,21 +817,14 @@ export default function (pi: ExtensionAPI) {
|
|
|
817
817
|
name: "subagent",
|
|
818
818
|
label: "Subagent",
|
|
819
819
|
description: [
|
|
820
|
-
"Delegate tasks to specialized subagents with isolated context
|
|
821
|
-
"
|
|
822
|
-
"
|
|
823
|
-
"Agents are defined as .md files in ~/.gsd/agent/agents/ (user) or .gsd/agents/ (project).",
|
|
824
|
-
"Use the /subagent command to list available agents and their descriptions.",
|
|
825
|
-
"Use chain mode to pipeline: scout finds context, planner designs, worker implements.",
|
|
820
|
+
"Delegate tasks to specialized subagents, each a separate pi process with its own isolated context window, tools, model, and system prompt.",
|
|
821
|
+
"Modes: single ({ agent, task }), parallel ({ tasks: [{agent, task},...] }), chain ({ chain: [{agent, task},...] } where each step's {previous} placeholder receives the prior output).",
|
|
822
|
+
"Agents are defined as .md files in ~/.gsd/agent/agents/ (user) or .gsd/agents/ (project); list them with the /subagent command.",
|
|
826
823
|
].join(" "),
|
|
827
824
|
promptGuidelines: [
|
|
828
|
-
"Prefer subagent dispatch over inline work
|
|
829
|
-
"Before reading more than ~3 files to understand something, dispatch the scout agent and work from its compressed report instead.",
|
|
830
|
-
"Before any change touching ≥2 packages, the orchestration kernel, auto-mode, or a public API, dispatch the planner agent first. Plan first, then implement.",
|
|
825
|
+
"Prefer subagent dispatch over inline work for self-contained tasks (recon, planning, review, refactor, test writing, security audit, docs); each dispatch gets a fresh context window so the main session stays focused on synthesis.",
|
|
831
826
|
"You MUST use parallel mode when ≥2 ready tasks are independent of each other's output. Do not serialize independent tasks manually — that wastes wall time and context.",
|
|
832
|
-
"
|
|
833
|
-
"Before opening a PR or marking a slice complete, dispatch the reviewer agent (and security agent if the change touches auth, network, parsing, file IO, or shell exec).",
|
|
834
|
-
"Always check available agents with /subagent before choosing one — there are bundled specialists plus any project-scoped agents.",
|
|
827
|
+
"Check available agents with /subagent before choosing one — there are bundled specialists plus any project-scoped agents.",
|
|
835
828
|
],
|
|
836
829
|
parameters: SubagentParams,
|
|
837
830
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { homedir } from 'node:os'
|
|
2
|
+
import { join, resolve as resolvePath, sep } from 'node:path'
|
|
3
|
+
|
|
4
|
+
function hasPnpmPath(value: string | undefined): boolean {
|
|
5
|
+
if (!value) return false
|
|
6
|
+
const normalized = value.replace(/\\/g, '/').toLowerCase()
|
|
7
|
+
return (
|
|
8
|
+
normalized.includes('/.pnpm/') ||
|
|
9
|
+
normalized.endsWith('/pnpm') ||
|
|
10
|
+
normalized.endsWith('/pnpm.cjs') ||
|
|
11
|
+
normalized.endsWith('/pnpm.js')
|
|
12
|
+
)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function pathStartsWith(pathValue: string | undefined, dir: string): boolean {
|
|
16
|
+
if (!pathValue) return false
|
|
17
|
+
const resolvedPath = resolvePath(pathValue)
|
|
18
|
+
const resolvedDir = resolvePath(dir)
|
|
19
|
+
return resolvedPath === resolvedDir || resolvedPath.startsWith(resolvedDir + sep)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Shared by update-check.ts and gsd command handlers. The JS installer keeps a
|
|
23
|
+
// parallel copy because it runs before TypeScript output exists.
|
|
24
|
+
export function isPnpmInstall(
|
|
25
|
+
argv1: string | undefined = process.argv[1],
|
|
26
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
27
|
+
): boolean {
|
|
28
|
+
if (env.npm_config_user_agent?.startsWith('pnpm/')) return true
|
|
29
|
+
if (hasPnpmPath(env.npm_execpath)) return true
|
|
30
|
+
if (hasPnpmPath(argv1)) return true
|
|
31
|
+
if (!argv1) return false
|
|
32
|
+
|
|
33
|
+
const pnpmBinDirs: string[] = []
|
|
34
|
+
if (env.PNPM_HOME) pnpmBinDirs.push(env.PNPM_HOME)
|
|
35
|
+
pnpmBinDirs.push(join(homedir(), 'Library', 'pnpm'))
|
|
36
|
+
pnpmBinDirs.push(join(homedir(), '.local', 'share', 'pnpm'))
|
|
37
|
+
|
|
38
|
+
return pnpmBinDirs.some((dir) => pathStartsWith(argv1, dir) || pathStartsWith(env.npm_execpath, dir))
|
|
39
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agent-browser
|
|
3
|
-
description: Browser automation CLI for AI agents. Use when
|
|
3
|
+
description: Browser automation CLI for AI agents. Use when interacting with websites — navigating pages, filling forms, clicking buttons, taking screenshots, scraping/extracting data, logging in, or testing web apps. Triggers on "open a website", "fill out a form", "take a screenshot", "scrape data from a page", "test this web app", "automate browser actions", or any programmatic web interaction.
|
|
4
4
|
allowed-tools: Bash(npx agent-browser:*), Bash(agent-browser:*)
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: api-design
|
|
3
|
-
description: Design or review an HTTP/REST/GraphQL API for versioning, pagination, error shapes, idempotency, auth, and
|
|
3
|
+
description: Design or review an HTTP/REST/GraphQL API for versioning, pagination, error shapes, idempotency, auth, status codes, cache headers, and breaking-change management. Use when asked to "design an API", "shape the endpoints", "design the schema", "add a new endpoint", "review this API", or when building/modifying a public or internal HTTP surface. HTTP-specific complement to `design-an-interface`.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-optimizer
|
|
3
3
|
description: >
|
|
4
|
-
Deep code optimization audit using parallel specialist agents
|
|
5
|
-
anti-patterns
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Use when asked to: "optimize my code", "find performance issues", "audit code quality",
|
|
11
|
-
"speed up my app", "find bottlenecks", "code review for performance", "find anti-patterns",
|
|
12
|
-
"improve code efficiency", "reduce latency", "optimize performance", "code smell detection",
|
|
13
|
-
"find slow code", "optimize this project", "performance audit", "code optimization".
|
|
14
|
-
Also triggers on: "optimizar codigo", "encontrar cuellos de botella", "mejorar rendimiento".
|
|
4
|
+
Deep code optimization audit using parallel specialist agents that hunt performance
|
|
5
|
+
anti-patterns via pattern-based detection, avoiding anchoring bias. Covers DB queries,
|
|
6
|
+
memory leaks, algorithmic complexity, concurrency, bundle size, dead code, I/O/network,
|
|
7
|
+
rendering, caching, and build config. Use when asked to optimize code, find performance
|
|
8
|
+
issues or bottlenecks, speed up an app, reduce latency, detect code smells, or run a
|
|
9
|
+
performance/quality audit.
|
|
15
10
|
---
|
|
16
11
|
|
|
17
12
|
# Code Optimizer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-gsd-extension
|
|
3
|
-
description: Create, debug, and iterate on GSD extensions (TypeScript modules
|
|
3
|
+
description: Create, debug, and iterate on GSD extensions (TypeScript modules adding tools, commands, event hooks, custom UI, and providers). Use when asked to build an extension, add a tool the LLM can call, register a slash command, hook into GSD events, create custom TUI components, or modify GSD behavior. Triggers on "create/build extension", "add a tool", "register command", "hook into gsd", "gsd plugin".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<essential_principles>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-mcp-server
|
|
3
|
-
description: Build, iterate, and evaluate Model Context Protocol (MCP) servers that expose external services as tools an LLM can call. Use when asked to "build an MCP server", "create an MCP tool", "wrap this API as MCP", "expose X to Claude", or when extending GSD with custom tool integrations.
|
|
3
|
+
description: Build, iterate, and evaluate Model Context Protocol (MCP) servers that expose external services as tools an LLM can call. Covers schema/tool design, error handling, pagination, MCP Inspector testing, and an eval set. Use when asked to "build an MCP server", "create an MCP tool", "wrap this API as MCP", "expose X to Claude", or when extending GSD with custom tool integrations.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|
|
@@ -31,7 +31,7 @@ GSD auto-discovers skills at session start and during auto-mode:
|
|
|
31
31
|
|
|
32
32
|
**Session start:** All discovered skills are enumerated and their names + descriptions are injected into the system prompt as `<available_skills>`.
|
|
33
33
|
|
|
34
|
-
**Auto-mode discovery:** `skill-discovery.ts`
|
|
34
|
+
**Auto-mode discovery:** `skill-discovery.ts` snapshots installed skill names at auto-mode start. When new skills appear mid-run, GSD reloads the resource catalog so they appear in the standard `<available_skills>` block (no separate XML injection).
|
|
35
35
|
|
|
36
36
|
**Manual reload:** Running `/reload` re-scans the skill directories and updates the available skills list mid-session.
|
|
37
37
|
</skill_discovery>
|
|
@@ -82,11 +82,7 @@ which {tool-name}
|
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
### For API/Service Skills
|
|
85
|
-
Use Context7 to fetch current documentation:
|
|
86
|
-
```
|
|
87
|
-
mcp__context7__resolve-library-id: {service-name}
|
|
88
|
-
mcp__context7__get-library-docs: {library-id}, topic: {relevant-topic}
|
|
89
|
-
```
|
|
85
|
+
Use the active Context7 documentation tools to fetch current documentation if they are available. Resolve the library ID first, then fetch docs for `{library-id}` with `topic: {relevant-topic}`; use the exact tool names from the active tool list.
|
|
90
86
|
|
|
91
87
|
Compare skill's documented patterns against current docs:
|
|
92
88
|
- Are endpoints still valid?
|
|
@@ -94,11 +90,7 @@ Compare skill's documented patterns against current docs:
|
|
|
94
90
|
- Are there deprecated methods being used?
|
|
95
91
|
|
|
96
92
|
### For Framework Skills
|
|
97
|
-
Use Context7:
|
|
98
|
-
```
|
|
99
|
-
mcp__context7__resolve-library-id: {framework-name}
|
|
100
|
-
mcp__context7__get-library-docs: {library-id}, topic: {specific-api}
|
|
101
|
-
```
|
|
93
|
+
Use the active Context7 documentation tools if they are available. Resolve the library ID first, then fetch docs for `{library-id}` with `topic: {specific-api}`; use the exact tool names from the active tool list.
|
|
102
94
|
|
|
103
95
|
Check:
|
|
104
96
|
- Are documented APIs still current?
|
|
@@ -175,11 +175,7 @@ DO reason through it:
|
|
|
175
175
|
- Learning correct usage patterns
|
|
176
176
|
|
|
177
177
|
**How**:
|
|
178
|
-
|
|
179
|
-
Use mcp__context7__resolve-library-id with library name
|
|
180
|
-
Then mcp__context7__get-library-docs with library ID
|
|
181
|
-
Ask specific questions about the library
|
|
182
|
-
```
|
|
178
|
+
Use the active Context7 documentation tools if they are available: resolve the library ID with the library name, then fetch docs with the library ID. Ask specific questions about the library, and use exact tool names from the active tool list.
|
|
183
179
|
|
|
184
180
|
**Good uses**:
|
|
185
181
|
- "How do I use Prisma transactions?"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: decompose-into-slices
|
|
3
|
-
description: Break a plan or milestone brief into independently-grabbable vertical slices (tracer bullets)
|
|
3
|
+
description: Break a plan or milestone brief into independently-grabbable vertical slices (tracer bullets), written to `M###-ROADMAP.md` by default (GitHub issues only on explicit confirmation). Prefers many thin slices over few thick ones and marks dependency order. Use when asked to "break this into slices", "decompose the plan", "vertical slices", "break into issues", or when a plan needs task-level decomposition.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|
|
@@ -31,7 +31,7 @@ Typical invocation points:
|
|
|
31
31
|
1. Read `M###-CONTEXT.md` for the active milestone — the brief is the source of truth for scope.
|
|
32
32
|
2. Read `M###-ROADMAP.md` if one exists — you may be refining rather than creating from scratch.
|
|
33
33
|
3. Read `src/resources/extensions/gsd/templates/roadmap.md` for the exact slice format. The parser depends on it.
|
|
34
|
-
4. If the plan came from a GitHub issue (user passed a URL or number), fetch it with
|
|
34
|
+
4. If the plan came from a GitHub issue (user passed a URL or number), fetch it with the active GitHub issue-read tool if one is available; use the exact tool name from the active tool list.
|
|
35
35
|
|
|
36
36
|
## Step 2: Explore the codebase briefly
|
|
37
37
|
|
|
@@ -84,7 +84,7 @@ Use `write` to the path `.gsd/milestones/<MID>/<MID>-ROADMAP.md`. Do not edit ch
|
|
|
84
84
|
|
|
85
85
|
## Step 6: Optionally file as GitHub issues
|
|
86
86
|
|
|
87
|
-
If the user explicitly asks (and only if — outward actions need confirmation), create one GitHub issue per slice with
|
|
87
|
+
If the user explicitly asks (and only if — outward actions need confirmation), create one GitHub issue per slice with the active GitHub issue-write tool if one is available; use the exact tool name from the active tool list. Create in dependency order so "Blocked by" references can cite real issue numbers.
|
|
88
88
|
|
|
89
89
|
### Issue body template
|
|
90
90
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dependency-upgrade
|
|
3
|
-
description: Plan, batch, and verify dependency upgrades safely. Triages outdated packages into risk tiers, upgrades in order (dev/minor/patch first, runtime majors last), verifies each batch
|
|
3
|
+
description: Plan, batch, and verify dependency upgrades safely. Triages outdated packages into risk tiers, upgrades in order (dev/minor/patch first, runtime majors last), verifies each batch, and produces an auditable commit sequence. Use when asked to "upgrade deps", "bump packages", "update node_modules", "fix vulnerabilities", "upgrade React/Node/TypeScript", or after `/gsd start dep-upgrade`.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: forensics
|
|
3
|
-
description: Post-mortem a failed GSD auto-mode run. Traces
|
|
3
|
+
description: Post-mortem a failed GSD auto-mode run. Traces symptom to root cause via `.gsd/` activity, journal, metrics, and lock artifacts, producing a filing-ready bug report with file:line refs and a fix suggestion. Use when asked to "forensics", "post-mortem", "why did auto-mode fail", "trace the stuck loop", "debug the crash", after `/gsd forensics`, or when a session ended in an unexpected terminal state. Reads artifacts only — re-runs nothing.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|
|
@@ -126,7 +126,7 @@ Format the output as a GitHub-issue-ready report:
|
|
|
126
126
|
<high / medium / low> — <what would change this confidence>
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
-
Offer to file this as a GitHub issue via
|
|
129
|
+
Offer to file this as a GitHub issue via the active GitHub issue-write tool if one is available, using its exact active tool name — explicit confirmation required per the outward-action rule. Also save a copy to `.gsd/forensics/<slug>.md` for future reference.
|
|
130
130
|
|
|
131
131
|
</process>
|
|
132
132
|
|
|
@@ -66,7 +66,7 @@ At the end, offer the user one of:
|
|
|
66
66
|
|
|
67
67
|
1. Append resolved decisions to `.gsd/DECISIONS.md` (one line each, dated).
|
|
68
68
|
2. Write or update `M###-CONTEXT.md` or `S##-CONTEXT.md` for the active milestone/slice.
|
|
69
|
-
3. Draft a GitHub issue via
|
|
69
|
+
3. Draft a GitHub issue via the active GitHub issue-write tool if one is available, using its exact active tool name (only with explicit confirmation per the outward-action rule).
|
|
70
70
|
4. Leave it as conversation context if the work is ephemeral.
|
|
71
71
|
|
|
72
72
|
Default: ask which they want. Do not auto-write.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: handoff
|
|
3
|
-
description: Prepare a clean cross-session handoff so the next agent
|
|
3
|
+
description: Prepare a clean cross-session handoff so the next agent can pick up where you left off. Writes a focused `continue.md` in the active slice dir and ensures `STATE.md` + summary artifacts are current. Use when asked to "hand off", "prepare handoff", "pause work", "bookmark this", "I'll come back to this later", before running out of context budget, or ending a long session with unfinished work.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: make-interfaces-feel-better
|
|
3
|
-
description: Design
|
|
3
|
+
description: Design-engineering principles for making interfaces feel polished. Use when building UI components or doing visual detail work — animations, hover states, shadows, borders, typography, micro-interactions. Triggers on "make it feel better", "feels off", stagger animations, border radius, optical alignment, font smoothing, tabular numbers, box shadows.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Details that make interfaces feel better
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: observability
|
|
3
|
-
description: Add agent-first observability
|
|
3
|
+
description: Add agent-first observability — structured logs, health endpoints, failure-state persistence, explicit failure modes — so the next agent can diagnose problems unattended. Use when asked to "add logging", "add observability", "add metrics", "make this observable", or when building/refactoring a subsystem that runs unattended (auto-mode engine, background jobs, servers, watchers).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|