@opengsd/gsd-pi 1.2.0-dev.955e4da0 → 1.2.0-dev.fb12b103
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/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.js +28 -0
- package/dist/cli.js +1 -1
- package/dist/headless-events.d.ts +4 -2
- package/dist/headless-events.js +7 -29
- package/dist/models-resolver.d.ts +3 -13
- package/dist/models-resolver.js +3 -22
- package/dist/resource-loader.js +2 -14
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +30 -64
- package/dist/resources/extensions/async-jobs/await-tool.js +80 -12
- package/dist/resources/extensions/async-jobs/index.js +65 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +12 -1
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +6 -6
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +10 -7
- package/dist/resources/extensions/bg-shell/overlay.js +9 -6
- package/dist/resources/extensions/bg-shell/process-manager.js +54 -25
- package/dist/resources/extensions/bg-shell/readiness-detector.js +11 -0
- package/dist/resources/extensions/bg-shell/utilities.js +3 -0
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
- package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
- package/dist/resources/extensions/browser-tools/index.js +69 -12
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +30 -4
- package/dist/resources/extensions/gsd/auto/orchestrator.js +7 -5
- package/dist/resources/extensions/gsd/auto-dispatch.js +12 -1
- package/dist/resources/extensions/gsd/auto-model-selection.js +25 -6
- package/dist/resources/extensions/gsd/auto-post-unit.js +11 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +15 -10
- package/dist/resources/extensions/gsd/auto-start.js +15 -10
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +18 -0
- package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +7 -16
- package/dist/resources/extensions/gsd/auto-worktree.js +30 -90
- package/dist/resources/extensions/gsd/auto.js +4 -13
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +3 -2
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +23 -6
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +122 -20
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +6 -2
- package/dist/resources/extensions/gsd/branch-patterns.js +2 -0
- package/dist/resources/extensions/gsd/browser-daemon-auto-prep.js +83 -0
- package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
- package/dist/resources/extensions/gsd/captures.js +4 -6
- package/dist/resources/extensions/gsd/constants.js +0 -2
- package/dist/resources/extensions/gsd/crash-recovery.js +4 -12
- package/dist/resources/extensions/gsd/doctor-environment.js +2 -6
- package/dist/resources/extensions/gsd/doctor-format.js +9 -6
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -15
- package/dist/resources/extensions/gsd/error-classifier.js +9 -0
- package/dist/resources/extensions/gsd/exec-sandbox.js +30 -10
- package/dist/resources/extensions/gsd/guidance.js +98 -0
- package/dist/resources/extensions/gsd/guided-flow.js +17 -2
- package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
- package/dist/resources/extensions/gsd/mcp-tool-name.js +5 -13
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
- package/dist/resources/extensions/gsd/migrate/safety.js +4 -1
- package/dist/resources/extensions/gsd/notification-store.js +11 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +6 -4
- package/dist/resources/extensions/gsd/paths.js +27 -0
- package/dist/resources/extensions/gsd/pre-execution-checks.js +91 -3
- package/dist/resources/extensions/gsd/preferences-models.js +14 -48
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +5 -2
- package/dist/resources/extensions/gsd/provider-error-guidance.js +1 -5
- package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
- package/dist/resources/extensions/gsd/publication.js +87 -0
- package/dist/resources/extensions/gsd/recovery-classification.js +37 -94
- package/dist/resources/extensions/gsd/safety/destructive-confirmation.js +108 -0
- package/dist/resources/extensions/gsd/state.js +1 -20
- package/dist/resources/extensions/gsd/stop-notice.js +57 -0
- package/dist/resources/extensions/gsd/tool-surface-readiness.js +56 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +9 -7
- package/dist/resources/extensions/gsd/tools/plan-slice.js +12 -6
- package/dist/resources/extensions/gsd/uat-policy.js +2 -1
- package/dist/resources/extensions/gsd/unit-closeout.js +138 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +74 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +4 -27
- package/dist/resources/extensions/gsd/unit-registry.js +337 -0
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +9 -182
- package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
- package/dist/resources/extensions/gsd/workflow-tool-surface.js +1 -1
- package/dist/resources/extensions/gsd/worktree-git-recovery.js +15 -9
- package/dist/resources/extensions/gsd/worktree-root.js +11 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +4 -5
- package/dist/resources/extensions/search-the-web/native-search.js +5 -3
- package/dist/resources/extensions/shared/browser-contract.js +59 -0
- package/dist/resources/extensions/shared/gsd-browser-cli.js +96 -5
- package/dist/resources/shared/package.json +3 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
- package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- 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/api/update/route.js.nft.json +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 +13 -13
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-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/.next/static/chunks/{796.cf859a427a2cb2ac.js → 796.e0bdc932325d7e03.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-fbea77b5f9953368.js → webpack-f0285ce91d4ec9ef.js} +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
- package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
- package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
- package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
- package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
- package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
- package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
- package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
- package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
- package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
- package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
- package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
- package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
- package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
- package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
- package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
- package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
- package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
- package/dist/web/standalone/node_modules/postcss/package.json +48 -48
- package/dist/web/standalone/package.json +1 -1
- package/dist/worktree-cli.js +3 -6
- package/dist/worktree-status-banner.js +7 -15
- package/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -0
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +4 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +5 -0
- 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 +5 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +7 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +8 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +11 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- 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 +4 -4
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/cli.js +6 -3
- package/packages/mcp-server/dist/cli.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +8 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +17 -1
- 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/harness/env/nodejs.d.ts +1 -0
- package/packages/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/env/nodejs.js +34 -3
- package/packages/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
- package/packages/pi-agent-core/dist/index.d.ts +1 -0
- package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/index.js +3 -0
- package/packages/pi-agent-core/dist/index.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +94 -382
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +149 -422
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +19 -13
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/provider-readiness.js +13 -6
- package/packages/pi-coding-agent/dist/core/provider-readiness.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +11 -0
- package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/bash.js +53 -11
- package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.d.ts +28 -2
- package/packages/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/shell.js +56 -10
- package/packages/pi-coding-agent/dist/utils/shell.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +9 -0
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/extensions/async-jobs/async-bash-cancel.test.ts +360 -0
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +33 -56
- package/src/resources/extensions/async-jobs/await-tool.test.ts +139 -0
- package/src/resources/extensions/async-jobs/await-tool.ts +82 -12
- package/src/resources/extensions/async-jobs/index.ts +79 -0
- package/src/resources/extensions/async-jobs/job-manager.ts +21 -1
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +6 -6
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +10 -6
- package/src/resources/extensions/bg-shell/overlay.ts +9 -5
- package/src/resources/extensions/bg-shell/process-manager.ts +50 -25
- package/src/resources/extensions/bg-shell/readiness-detector.ts +12 -0
- package/src/resources/extensions/bg-shell/tests/lifecycle-and-utilities.test.ts +48 -1
- package/src/resources/extensions/bg-shell/utilities.ts +3 -0
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
- package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
- package/src/resources/extensions/browser-tools/index.ts +71 -13
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +29 -1
- package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +34 -4
- package/src/resources/extensions/gsd/auto/orchestrator.ts +7 -5
- package/src/resources/extensions/gsd/auto-dispatch.ts +12 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +25 -5
- package/src/resources/extensions/gsd/auto-post-unit.ts +13 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +40 -26
- package/src/resources/extensions/gsd/auto-start.ts +15 -10
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +19 -0
- package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +10 -17
- package/src/resources/extensions/gsd/auto-worktree.ts +30 -93
- package/src/resources/extensions/gsd/auto.ts +8 -15
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +3 -5
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +23 -6
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +151 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +6 -2
- package/src/resources/extensions/gsd/branch-patterns.ts +3 -0
- package/src/resources/extensions/gsd/browser-daemon-auto-prep.ts +108 -0
- package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
- package/src/resources/extensions/gsd/captures.ts +4 -6
- package/src/resources/extensions/gsd/constants.ts +0 -3
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -9
- package/src/resources/extensions/gsd/doctor-environment.ts +2 -7
- package/src/resources/extensions/gsd/doctor-format.ts +12 -7
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +13 -15
- package/src/resources/extensions/gsd/error-classifier.ts +11 -0
- package/src/resources/extensions/gsd/exec-sandbox.ts +49 -9
- package/src/resources/extensions/gsd/guidance.ts +139 -0
- package/src/resources/extensions/gsd/guided-flow.ts +16 -2
- package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
- package/src/resources/extensions/gsd/mcp-tool-name.ts +6 -11
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
- package/src/resources/extensions/gsd/migrate/safety.ts +4 -1
- package/src/resources/extensions/gsd/notification-store.ts +26 -3
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +6 -4
- package/src/resources/extensions/gsd/paths.ts +33 -0
- package/src/resources/extensions/gsd/pre-execution-checks.ts +109 -3
- package/src/resources/extensions/gsd/preferences-models.ts +12 -47
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +5 -2
- package/src/resources/extensions/gsd/provider-error-guidance.ts +4 -9
- package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
- package/src/resources/extensions/gsd/publication.ts +122 -0
- package/src/resources/extensions/gsd/recovery-classification.ts +42 -96
- package/src/resources/extensions/gsd/safety/destructive-confirmation.ts +134 -0
- package/src/resources/extensions/gsd/state.ts +4 -21
- package/src/resources/extensions/gsd/stop-notice.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +16 -19
- package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
- package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/browser-daemon-auto-prep.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +66 -1
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +8 -7
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/dynamic-bash-no-cap.test.ts +132 -0
- package/src/resources/extensions/gsd/tests/exec-graceful-kill.test.ts +193 -0
- package/src/resources/extensions/gsd/tests/exec-tool.test.ts +29 -1
- package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
- package/src/resources/extensions/gsd/tests/guidance.test.ts +125 -0
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +53 -11
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +73 -58
- package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +32 -1
- package/src/resources/extensions/gsd/tests/notification-store.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +167 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +193 -1
- package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +3 -3
- package/src/resources/extensions/gsd/tests/publication.test.ts +120 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +76 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -29
- package/src/resources/extensions/gsd/tests/unit-closeout.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +67 -2
- package/src/resources/extensions/gsd/tests/unit-registry.test.ts +163 -0
- package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +2 -2
- package/src/resources/extensions/gsd/tool-surface-readiness.ts +76 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +8 -7
- package/src/resources/extensions/gsd/tools/plan-slice.ts +12 -6
- package/src/resources/extensions/gsd/uat-policy.ts +2 -1
- package/src/resources/extensions/gsd/unit-closeout.ts +201 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +111 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +4 -28
- package/src/resources/extensions/gsd/unit-registry.ts +412 -0
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +27 -192
- package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
- package/src/resources/extensions/gsd/workflow-tool-surface.ts +4 -1
- package/src/resources/extensions/gsd/worktree-git-recovery.ts +15 -9
- package/src/resources/extensions/gsd/worktree-root.ts +12 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +3 -5
- package/src/resources/extensions/search-the-web/native-search.ts +5 -3
- package/src/resources/extensions/shared/browser-contract.ts +66 -0
- package/src/resources/extensions/shared/gsd-browser-cli.ts +119 -5
- package/src/resources/shared/package.json +3 -0
- package/src/resources/skills/create-skill/references/executable-code.md +1 -1
- package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
- package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
- package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
- package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
- package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
- package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → mU4QIDlpVHDdjDpeEKh5W}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C24pqUd-aru-l0Dp0gLZP → mU4QIDlpVHDdjDpeEKh5W}/_ssgManifest.js +0 -0
|
@@ -55,6 +55,14 @@ function parseGsdBrowserVersion(output: string): string | null {
|
|
|
55
55
|
return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
59
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function resolveExplicitGsdBrowserCliPath(env: NodeJS.ProcessEnv): string | undefined {
|
|
63
|
+
return env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim() || undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
58
66
|
function resolveBundledGsdBrowserPackageVersion(): string | null {
|
|
59
67
|
try {
|
|
60
68
|
const requireFromHere = createRequire(import.meta.url);
|
|
@@ -66,20 +74,28 @@ function resolveBundledGsdBrowserPackageVersion(): string | null {
|
|
|
66
74
|
}
|
|
67
75
|
}
|
|
68
76
|
|
|
77
|
+
// The `gsd-browser --version` subprocess result cannot change mid-session (the
|
|
78
|
+
// engine-switch guard forbids restarting with a different engine), and both the
|
|
79
|
+
// availability probe and the launch-config resolution ask for it at session
|
|
80
|
+
// start — memoize so the up-to-2s spawn happens once per process.
|
|
81
|
+
let cachedPathProbeVersion: string | null | undefined;
|
|
82
|
+
|
|
69
83
|
function resolvePathGsdBrowserVersion(env: NodeJS.ProcessEnv): string | null {
|
|
70
84
|
const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
|
|
71
85
|
if (explicit) return parseGsdBrowserVersion(explicit);
|
|
86
|
+
if (cachedPathProbeVersion !== undefined) return cachedPathProbeVersion;
|
|
72
87
|
|
|
73
88
|
try {
|
|
74
|
-
|
|
89
|
+
cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync("gsd-browser", ["--version"], {
|
|
75
90
|
encoding: "utf-8",
|
|
76
91
|
env,
|
|
77
92
|
stdio: ["ignore", "pipe", "ignore"],
|
|
78
93
|
timeout: 2000,
|
|
79
94
|
}));
|
|
80
95
|
} catch {
|
|
81
|
-
|
|
96
|
+
cachedPathProbeVersion = null;
|
|
82
97
|
}
|
|
98
|
+
return cachedPathProbeVersion;
|
|
83
99
|
}
|
|
84
100
|
|
|
85
101
|
function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
|
|
@@ -91,7 +107,7 @@ function shouldPreferPathGsdBrowser(env: NodeJS.ProcessEnv): boolean {
|
|
|
91
107
|
}
|
|
92
108
|
|
|
93
109
|
export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process.env): string | null {
|
|
94
|
-
const explicit =
|
|
110
|
+
const explicit = resolveExplicitGsdBrowserCliPath(env);
|
|
95
111
|
if (explicit) return explicit;
|
|
96
112
|
|
|
97
113
|
try {
|
|
@@ -115,6 +131,45 @@ export function resolveBundledGsdBrowserCliPath(env: NodeJS.ProcessEnv = process
|
|
|
115
131
|
return null;
|
|
116
132
|
}
|
|
117
133
|
|
|
134
|
+
export type GsdBrowserCliAvailability =
|
|
135
|
+
| { available: true; via: "explicit-env" | "bundled" | "path"; detail: string }
|
|
136
|
+
| { available: false; detail: string };
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Cheap availability probe for the gsd-browser CLI: explicit env overrides,
|
|
140
|
+
* then the bundled @opengsd/gsd-browser binary (filesystem checks only), then
|
|
141
|
+
* a PATH lookup (one short subprocess, memoized). Used by Browser Automation
|
|
142
|
+
* Engine resolution to decide whether the managed engine is provable before
|
|
143
|
+
* preferring it over legacy Playwright. `via` names the provable source, not
|
|
144
|
+
* necessarily the launch source — resolveGsdBrowserMcpLaunchConfig may still
|
|
145
|
+
* prefer a newer PATH CLI over the bundled one.
|
|
146
|
+
*/
|
|
147
|
+
export function resolveGsdBrowserCliAvailability(env: NodeJS.ProcessEnv = process.env): GsdBrowserCliAvailability {
|
|
148
|
+
const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
149
|
+
if (explicitCommand) {
|
|
150
|
+
return { available: true, via: "explicit-env", detail: `GSD_BROWSER_MCP_COMMAND=${explicitCommand}` };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
154
|
+
if (explicitCliPath) {
|
|
155
|
+
return existsSync(explicitCliPath)
|
|
156
|
+
? { available: true, via: "explicit-env", detail: `CLI at ${explicitCliPath}` }
|
|
157
|
+
: { available: false, detail: `configured gsd-browser CLI path does not exist: ${explicitCliPath}` };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const bundledCliPath = resolveBundledGsdBrowserCliPath(env);
|
|
161
|
+
if (bundledCliPath) {
|
|
162
|
+
return { available: true, via: "bundled", detail: `bundled CLI at ${bundledCliPath}` };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const pathVersion = resolvePathGsdBrowserVersion(env);
|
|
166
|
+
if (pathVersion) {
|
|
167
|
+
return { available: true, via: "path", detail: `gsd-browser ${pathVersion} on PATH` };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return { available: false, detail: "no bundled or PATH gsd-browser CLI found" };
|
|
171
|
+
}
|
|
172
|
+
|
|
118
173
|
export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string): string {
|
|
119
174
|
const resolvedProjectRoot = resolve(projectRoot);
|
|
120
175
|
const base = sanitizeSessionSegment(basename(resolvedProjectRoot)) || "project";
|
|
@@ -123,6 +178,35 @@ export function buildGsdBrowserSessionName(projectRoot: string, suffix?: string)
|
|
|
123
178
|
return cleanSuffix ? `gsd-${base}-${hash}-${cleanSuffix}` : `gsd-${base}-${hash}`;
|
|
124
179
|
}
|
|
125
180
|
|
|
181
|
+
/**
|
|
182
|
+
* Recognize an MCP server config (from .mcp.json / Claude settings) as a
|
|
183
|
+
* gsd-browser server. Paired with resolveGsdBrowserMcpLaunchConfig: this module
|
|
184
|
+
* writes the config shape, so it also owns recognizing it. New launch shapes
|
|
185
|
+
* are taught here, in one place.
|
|
186
|
+
*/
|
|
187
|
+
export function isGsdBrowserMcpServerConfig(config: unknown): boolean {
|
|
188
|
+
if (!isRecord(config)) return false;
|
|
189
|
+
|
|
190
|
+
const command = typeof config.command === "string" ? config.command : "";
|
|
191
|
+
if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (isRecord(config.env)) {
|
|
196
|
+
const env = config.env;
|
|
197
|
+
if (
|
|
198
|
+
typeof env.GSD_BROWSER_CLI_PATH === "string"
|
|
199
|
+
|| typeof env.GSD_BROWSER_BIN_PATH === "string"
|
|
200
|
+
|| typeof env.GSD_BROWSER_MCP_COMMAND === "string"
|
|
201
|
+
) {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const args = Array.isArray(config.args) ? config.args.filter((arg): arg is string => typeof arg === "string") : [];
|
|
207
|
+
return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
|
|
208
|
+
}
|
|
209
|
+
|
|
126
210
|
export function resolveGsdBrowserMcpLaunchConfig(
|
|
127
211
|
projectRoot: string,
|
|
128
212
|
env: NodeJS.ProcessEnv = process.env,
|
|
@@ -133,7 +217,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
|
|
|
133
217
|
const explicitArgs = parseJsonEnv<unknown>(env, "GSD_BROWSER_MCP_ARGS");
|
|
134
218
|
const explicitEnv = parseJsonEnv<Record<string, string>>(env, "GSD_BROWSER_MCP_ENV");
|
|
135
219
|
const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
|
|
136
|
-
const explicitCliPath =
|
|
220
|
+
const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
|
|
137
221
|
const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
|
|
138
222
|
const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
|
|
139
223
|
? resolveBundledGsdBrowserCliPath(env)
|
|
@@ -144,6 +228,10 @@ export function resolveGsdBrowserMcpLaunchConfig(
|
|
|
144
228
|
// profile/cookies persist across pi sessions for the same project. gsd-browser
|
|
145
229
|
// rejects --identity-scope unless --identity-key is also supplied.
|
|
146
230
|
const identityKey = env.GSD_BROWSER_IDENTITY_KEY?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
|
|
231
|
+
// identity-project must be a safe identifier (no path separators); full paths
|
|
232
|
+
// cause daemon startup to fail with "invalid name".
|
|
233
|
+
const identityProject =
|
|
234
|
+
env.GSD_BROWSER_IDENTITY_PROJECT?.trim() || buildGsdBrowserSessionName(resolvedProjectRoot);
|
|
147
235
|
const command =
|
|
148
236
|
explicitCommand
|
|
149
237
|
|| explicitCliPath
|
|
@@ -162,7 +250,7 @@ export function resolveGsdBrowserMcpLaunchConfig(
|
|
|
162
250
|
"--identity-key",
|
|
163
251
|
identityKey,
|
|
164
252
|
"--identity-project",
|
|
165
|
-
|
|
253
|
+
identityProject,
|
|
166
254
|
];
|
|
167
255
|
const cwd = env.GSD_BROWSER_MCP_CWD?.trim() || resolvedProjectRoot;
|
|
168
256
|
|
|
@@ -176,3 +264,29 @@ export function resolveGsdBrowserMcpLaunchConfig(
|
|
|
176
264
|
sessionName,
|
|
177
265
|
};
|
|
178
266
|
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* CLI invocation that starts the gsd-browser session daemon with the same
|
|
270
|
+
* session and identity flags as {@link resolveGsdBrowserMcpLaunchConfig}, so
|
|
271
|
+
* browser UAT can warm Chrome/CDP before the first MCP navigation.
|
|
272
|
+
*/
|
|
273
|
+
export function resolveGsdBrowserDaemonStartInvocation(
|
|
274
|
+
projectRoot: string,
|
|
275
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
276
|
+
options: GsdBrowserMcpLaunchOptions = {},
|
|
277
|
+
): Pick<GsdBrowserMcpLaunchConfig, "command" | "args" | "cwd" | "env"> {
|
|
278
|
+
const launch = resolveGsdBrowserMcpLaunchConfig(projectRoot, env, options);
|
|
279
|
+
const mcpIndex = launch.args.indexOf("mcp");
|
|
280
|
+
if (mcpIndex < 0) {
|
|
281
|
+
throw new Error("gsd-browser launch config is missing mcp subcommand");
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const prefix = launch.args.slice(0, mcpIndex);
|
|
285
|
+
const sessionFlags = launch.args.slice(mcpIndex + 1);
|
|
286
|
+
return {
|
|
287
|
+
command: launch.command,
|
|
288
|
+
args: [...prefix, "daemon", "start", ...sessionFlags],
|
|
289
|
+
cwd: launch.cwd,
|
|
290
|
+
...(launch.env ? { env: launch.env } : {}),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
@@ -45,7 +45,7 @@ skill-name/
|
|
|
45
45
|
**Reference pattern**: In SKILL.md, reference scripts using the `scripts/` path:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
python ~/.
|
|
48
|
+
python ~/.agents/skills/skill-name/scripts/analyze.py input.har
|
|
49
49
|
```
|
|
50
50
|
</scripts_directory>
|
|
51
51
|
</file_organization>
|
|
@@ -10,16 +10,21 @@
|
|
|
10
10
|
## Step 1: Select the Skill
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
|
|
13
|
+
# User-global skills
|
|
14
|
+
ls ~/.agents/skills/ 2>/dev/null
|
|
15
|
+
# Project-local skills
|
|
16
|
+
ls .agents/skills/ 2>/dev/null
|
|
14
17
|
```
|
|
15
18
|
|
|
16
19
|
Present numbered list, ask: "Which skill needs a new reference?"
|
|
17
20
|
|
|
21
|
+
Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
|
|
22
|
+
|
|
18
23
|
## Step 2: Analyze Current Structure
|
|
19
24
|
|
|
20
25
|
```bash
|
|
21
|
-
cat
|
|
22
|
-
ls
|
|
26
|
+
cat {skill-path}/SKILL.md
|
|
27
|
+
ls {skill-path}/references/ 2>/dev/null
|
|
23
28
|
```
|
|
24
29
|
|
|
25
30
|
Determine:
|
|
@@ -12,6 +12,8 @@ Ask (if not already provided):
|
|
|
12
12
|
- Which skill needs a script?
|
|
13
13
|
- What operation should the script perform?
|
|
14
14
|
|
|
15
|
+
Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
|
|
16
|
+
|
|
15
17
|
## Step 2: Analyze Script Need
|
|
16
18
|
|
|
17
19
|
Confirm this is a good script candidate:
|
|
@@ -24,7 +26,7 @@ If not a good fit, suggest alternatives (inline code in workflow, reference exam
|
|
|
24
26
|
## Step 3: Create Scripts Directory
|
|
25
27
|
|
|
26
28
|
```bash
|
|
27
|
-
mkdir -p
|
|
29
|
+
mkdir -p {skill-path}/scripts
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
## Step 4: Design Script
|
|
@@ -58,7 +60,7 @@ set -euo pipefail
|
|
|
58
60
|
## Step 6: Make Executable (if bash)
|
|
59
61
|
|
|
60
62
|
```bash
|
|
61
|
-
chmod +x
|
|
63
|
+
chmod +x {skill-path}/scripts/{script-name}.sh
|
|
62
64
|
```
|
|
63
65
|
|
|
64
66
|
## Step 7: Update Workflow to Use Script
|
|
@@ -12,6 +12,8 @@ Ask (if not already provided):
|
|
|
12
12
|
- Which skill needs a template?
|
|
13
13
|
- What output does this template structure?
|
|
14
14
|
|
|
15
|
+
Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
|
|
16
|
+
|
|
15
17
|
## Step 2: Analyze Template Need
|
|
16
18
|
|
|
17
19
|
Confirm this is a good template candidate:
|
|
@@ -24,7 +26,7 @@ If not a good fit, suggest alternatives (workflow guidance, reference examples).
|
|
|
24
26
|
## Step 3: Create Templates Directory
|
|
25
27
|
|
|
26
28
|
```bash
|
|
27
|
-
mkdir -p
|
|
29
|
+
mkdir -p {skill-path}/templates
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
## Step 4: Design Template Structure
|
|
@@ -12,17 +12,22 @@
|
|
|
12
12
|
**DO NOT use AskUserQuestion** - there may be many skills.
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
|
|
15
|
+
# User-global skills
|
|
16
|
+
ls ~/.agents/skills/ 2>/dev/null
|
|
17
|
+
# Project-local skills
|
|
18
|
+
ls .agents/skills/ 2>/dev/null
|
|
16
19
|
```
|
|
17
20
|
|
|
18
21
|
Present numbered list, ask: "Which skill needs a new workflow?"
|
|
19
22
|
|
|
23
|
+
Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
|
|
24
|
+
|
|
20
25
|
## Step 2: Analyze Current Structure
|
|
21
26
|
|
|
22
27
|
Read the skill:
|
|
23
28
|
```bash
|
|
24
|
-
cat
|
|
25
|
-
ls
|
|
29
|
+
cat {skill-path}/SKILL.md
|
|
30
|
+
ls {skill-path}/workflows/ 2>/dev/null
|
|
26
31
|
```
|
|
27
32
|
|
|
28
33
|
Determine:
|
|
@@ -10,17 +10,22 @@
|
|
|
10
10
|
## Step 1: Select the Skill
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
|
|
13
|
+
# User-global skills
|
|
14
|
+
ls ~/.agents/skills/ 2>/dev/null
|
|
15
|
+
# Project-local skills
|
|
16
|
+
ls .agents/skills/ 2>/dev/null
|
|
14
17
|
```
|
|
15
18
|
|
|
16
19
|
Present numbered list, ask: "Which skill should be upgraded to the router pattern?"
|
|
17
20
|
|
|
21
|
+
Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
|
|
22
|
+
|
|
18
23
|
## Step 2: Verify It Needs Upgrading
|
|
19
24
|
|
|
20
25
|
Read the skill:
|
|
21
26
|
```bash
|
|
22
|
-
cat
|
|
23
|
-
ls
|
|
27
|
+
cat {skill-path}/SKILL.md
|
|
28
|
+
ls {skill-path}/
|
|
24
29
|
```
|
|
25
30
|
|
|
26
31
|
**Already a router?** (has workflows/ and intake question)
|
|
@@ -65,8 +70,8 @@ Ask: "Does this breakdown look right? Any adjustments?"
|
|
|
65
70
|
## Step 4: Create Directory Structure
|
|
66
71
|
|
|
67
72
|
```bash
|
|
68
|
-
mkdir -p
|
|
69
|
-
mkdir -p
|
|
73
|
+
mkdir -p {skill-path}/workflows
|
|
74
|
+
mkdir -p {skill-path}/references
|
|
70
75
|
```
|
|
71
76
|
|
|
72
77
|
## Step 5: Extract Workflows
|
|
@@ -15,18 +15,23 @@ Skills contain claims about external things: APIs, CLI tools, frameworks, servic
|
|
|
15
15
|
## Step 1: Select the Skill
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
|
|
18
|
+
# User-global skills
|
|
19
|
+
ls ~/.agents/skills/ 2>/dev/null
|
|
20
|
+
# Project-local skills
|
|
21
|
+
ls .agents/skills/ 2>/dev/null
|
|
19
22
|
```
|
|
20
23
|
|
|
21
24
|
Present numbered list, ask: "Which skill should I verify for accuracy?"
|
|
22
25
|
|
|
26
|
+
Determine `{skill-path}`: use `.agents/skills/{skill-name}` (project-local) if found there, otherwise `~/.agents/skills/{skill-name}` (user-global). Project-local takes precedence because the skill catalog loads it first on name collision.
|
|
27
|
+
|
|
23
28
|
## Step 2: Read and Categorize
|
|
24
29
|
|
|
25
30
|
Read the entire skill (SKILL.md + workflows/ + references/):
|
|
26
31
|
```bash
|
|
27
|
-
cat
|
|
28
|
-
cat
|
|
29
|
-
cat
|
|
32
|
+
cat {skill-path}/SKILL.md
|
|
33
|
+
cat {skill-path}/workflows/*.md 2>/dev/null
|
|
34
|
+
cat {skill-path}/references/*.md 2>/dev/null
|
|
30
35
|
```
|
|
31
36
|
|
|
32
37
|
Categorize by primary dependency type:
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spike-wrap-up
|
|
3
|
-
description: Package findings from a completed spike into a durable project-local skill that auto-loads on future similar work. Reads the latest `.gsd/workflows/spikes/` dir, interviews the user on what's reusable, then writes `.
|
|
3
|
+
description: Package findings from a completed spike into a durable project-local skill that auto-loads on future similar work. Reads the latest `.gsd/workflows/spikes/` dir, interviews the user on what's reusable, then writes `.agents/skills/<name>/SKILL.md`. Use when asked to "wrap up the spike", "package this as a skill", "make this reusable", "turn findings into a skill", or at the synthesize phase of `/gsd start spike`.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
<objective>
|
|
7
|
-
Convert the output of a research spike (`SCOPE.md`, `research/*.md`, `RECOMMENDATION.md`) into a project-local skill under `.
|
|
7
|
+
Convert the output of a research spike (`SCOPE.md`, `research/*.md`, `RECOMMENDATION.md`) into a project-local skill under `.agents/skills/` so that the next time a similar task comes up, the agent loads the skill automatically. This is how throwaway spikes become durable capital.
|
|
8
8
|
</objective>
|
|
9
9
|
|
|
10
10
|
<context>
|
|
11
11
|
GSD's spike workflow (`src/resources/extensions/gsd/workflow-templates/spike.md`) produces documents in `.gsd/workflows/spikes/<slug>/`. Those documents are useful once and then forgotten unless something packages them for reuse.
|
|
12
12
|
|
|
13
|
-
GSD already watches `.
|
|
13
|
+
GSD already watches `.agents/skills/` (and `.claude/skills/` as a legacy compat path) at both user and project levels — see `src/resources/extensions/gsd/skill-discovery.ts`. Any skill written there is picked up on the next session without further wiring. This skill is the bridge from "spike done" to "skill available."
|
|
14
14
|
|
|
15
15
|
Invocation points:
|
|
16
16
|
- End of Phase 3 (synthesize) in `/gsd start spike` — prompt suggests running this skill
|
|
@@ -21,7 +21,7 @@ Invocation points:
|
|
|
21
21
|
<core_principle>
|
|
22
22
|
**NOT EVERY SPIKE DESERVES A SKILL.** If the recommendation was "don't do X," there may be no reusable guidance. Ask the user first; exit without writing if the answer is no.
|
|
23
23
|
|
|
24
|
-
**PROJECT-LOCAL, NOT USER-GLOBAL.** Write to `.
|
|
24
|
+
**PROJECT-LOCAL, NOT USER-GLOBAL.** Write to `.agents/skills/` in the project root, not `~/.agents/skills/`. The skill encodes project-specific choices that should not leak into unrelated projects.
|
|
25
25
|
|
|
26
26
|
**DESCRIPTION IS THE DISCOVERABILITY SIGNAL.** The `description` field in frontmatter is the primary signal the agent uses to judge relevance and decide whether to load the skill — it is a heuristic, not a deterministic trigger. Write it as keywords the future agent will plausibly encounter, not a summary.
|
|
27
27
|
</core_principle>
|
|
@@ -65,7 +65,7 @@ Show this sketch to the user. One round of feedback. Iterate.
|
|
|
65
65
|
|
|
66
66
|
## Step 4: Write the skill
|
|
67
67
|
|
|
68
|
-
Write to `.
|
|
68
|
+
Write to `.agents/skills/<name>/SKILL.md` (create the directory). Match the frontmatter + XML-tag structure used by other bundled skills — see `src/resources/skills/review/SKILL.md` for the canonical shape.
|
|
69
69
|
|
|
70
70
|
Minimum structure:
|
|
71
71
|
|
|
@@ -102,7 +102,7 @@ description: <one sentence with trigger keywords>
|
|
|
102
102
|
</success_criteria>
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
If the spike produced a reusable template (a config file, a starter script), copy it into `.
|
|
105
|
+
If the spike produced a reusable template (a config file, a starter script), copy it into `.agents/skills/<name>/templates/` or `.agents/skills/<name>/references/` and reference it from the skill body.
|
|
106
106
|
|
|
107
107
|
## Step 5: Archive the spike, link from the skill
|
|
108
108
|
|
|
@@ -112,13 +112,13 @@ If the spike produced a reusable template (a config file, a starter script), cop
|
|
|
112
112
|
|
|
113
113
|
## Step 6: Confirm pickup
|
|
114
114
|
|
|
115
|
-
Tell the user the skill will be surfaced on the next session via `skill-discovery.ts`. If they want to use it immediately, they can `Read .
|
|
115
|
+
Tell the user the skill will be surfaced on the next session via `skill-discovery.ts`. If they want to use it immediately, they can `Read .agents/skills/<name>/SKILL.md` now.
|
|
116
116
|
|
|
117
117
|
</process>
|
|
118
118
|
|
|
119
119
|
<anti_patterns>
|
|
120
120
|
|
|
121
|
-
- **Writing to `~/.claude/skills/`.**
|
|
121
|
+
- **Writing to `~/.claude/skills/` or `.claude/skills/`.** These are legacy Claude Code compatibility paths. Write project skills to `.agents/skills/` in the project root instead.
|
|
122
122
|
- **Verbose frontmatter description.** The description is an index entry, not a tutorial. Keywords over prose.
|
|
123
123
|
- **Packaging every spike.** If the outcome was "we decided X once," append to DECISIONS.md and move on.
|
|
124
124
|
- **Copy-pasting the spike verbatim into the skill.** The spike is research; the skill is executable guidance. Re-author.
|
|
@@ -128,7 +128,7 @@ Tell the user the skill will be surfaced on the next session via `skill-discover
|
|
|
128
128
|
|
|
129
129
|
<success_criteria>
|
|
130
130
|
|
|
131
|
-
- [ ] A new `.
|
|
131
|
+
- [ ] A new `.agents/skills/<name>/SKILL.md` exists with well-formed frontmatter.
|
|
132
132
|
- [ ] The `description` field uses keywords that will plausibly match future agent work.
|
|
133
133
|
- [ ] The skill body is executable on its own without re-reading the originating spike.
|
|
134
134
|
- [ ] The originating spike is referenced from the skill.
|
|
File without changes
|
|
File without changes
|