@opengsd/gsd-pi 1.2.0-dev.5457a158 → 1.2.0-dev.84c56d87

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.
Files changed (135) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +209 -88
  3. package/dist/resources/extensions/browser-tools/engine/selection.js +73 -5
  4. package/dist/resources/extensions/browser-tools/index.js +69 -12
  5. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +3 -2
  6. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +19 -0
  7. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +27 -9
  8. package/dist/resources/extensions/gsd/browser-evidence.js +8 -2
  9. package/dist/resources/extensions/gsd/mcp-filter.js +2 -19
  10. package/dist/resources/extensions/gsd/uat-policy.js +2 -1
  11. package/dist/resources/extensions/gsd/unit-registry.js +7 -20
  12. package/dist/resources/extensions/gsd/web-app-uat.js +45 -8
  13. package/dist/resources/extensions/search-the-web/native-search.js +5 -3
  14. package/dist/resources/extensions/shared/browser-contract.js +59 -0
  15. package/dist/resources/extensions/shared/gsd-browser-cli.js +72 -4
  16. package/dist/resources/skills/create-skill/references/executable-code.md +1 -1
  17. package/dist/resources/skills/create-skill/workflows/add-reference.md +8 -3
  18. package/dist/resources/skills/create-skill/workflows/add-script.md +4 -2
  19. package/dist/resources/skills/create-skill/workflows/add-template.md +3 -1
  20. package/dist/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  21. package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  22. package/dist/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  23. package/dist/resources/skills/spike-wrap-up/SKILL.md +9 -9
  24. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  25. package/dist/web/standalone/.next/BUILD_ID +1 -1
  26. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  27. package/dist/web/standalone/.next/build-manifest.json +2 -2
  28. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  29. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  30. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  38. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  43. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  44. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/index.html +1 -1
  46. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  52. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  53. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  54. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  55. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  56. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  57. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  58. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  59. package/dist/web/standalone/node_modules/postcss/lib/container.js +18 -26
  60. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +14 -47
  61. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  62. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  63. package/dist/web/standalone/node_modules/postcss/lib/input.js +29 -54
  64. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +37 -47
  65. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +9 -26
  66. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +55 -57
  67. package/dist/web/standalone/node_modules/postcss/lib/node.js +31 -99
  68. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  69. package/dist/web/standalone/node_modules/postcss/lib/parser.js +9 -10
  70. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  71. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +11 -30
  72. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  73. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  74. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  75. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +28 -69
  76. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +2 -6
  77. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  78. package/dist/web/standalone/package.json +1 -1
  79. package/package.json +1 -1
  80. package/packages/cloud-mcp-gateway/package.json +2 -2
  81. package/packages/contracts/package.json +1 -1
  82. package/packages/daemon/package.json +4 -4
  83. package/packages/gsd-agent-core/package.json +5 -5
  84. package/packages/gsd-agent-modes/package.json +7 -7
  85. package/packages/mcp-server/package.json +3 -3
  86. package/packages/native/package.json +1 -1
  87. package/packages/pi-agent-core/package.json +1 -1
  88. package/packages/pi-ai/dist/models.generated.d.ts +66 -178
  89. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  90. package/packages/pi-ai/dist/models.generated.js +116 -204
  91. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  92. package/packages/pi-ai/package.json +1 -1
  93. package/packages/pi-coding-agent/package.json +7 -7
  94. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  95. package/packages/pi-tui/dist/tui.js +9 -0
  96. package/packages/pi-tui/dist/tui.js.map +1 -1
  97. package/packages/pi-tui/package.json +2 -2
  98. package/packages/rpc-client/package.json +2 -2
  99. package/pkg/package.json +1 -1
  100. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +265 -98
  101. package/src/resources/extensions/browser-tools/engine/selection.ts +90 -4
  102. package/src/resources/extensions/browser-tools/index.ts +71 -13
  103. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +83 -13
  104. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +136 -0
  105. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +3 -2
  106. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +24 -0
  107. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +48 -4
  108. package/src/resources/extensions/gsd/browser-evidence.ts +18 -2
  109. package/src/resources/extensions/gsd/mcp-filter.ts +2 -23
  110. package/src/resources/extensions/gsd/tests/browser-automation-contract-fixture.ts +39 -0
  111. package/src/resources/extensions/gsd/tests/browser-contract.test.ts +44 -0
  112. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +2 -1
  113. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +35 -1
  114. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +7 -11
  115. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +20 -58
  116. package/src/resources/extensions/gsd/tests/integration/gsd-integration-fixture.ts +80 -0
  117. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  118. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +24 -29
  119. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +44 -1
  120. package/src/resources/extensions/gsd/uat-policy.ts +2 -1
  121. package/src/resources/extensions/gsd/unit-registry.ts +7 -20
  122. package/src/resources/extensions/gsd/web-app-uat.ts +51 -8
  123. package/src/resources/extensions/search-the-web/native-search.ts +5 -3
  124. package/src/resources/extensions/shared/browser-contract.ts +66 -0
  125. package/src/resources/extensions/shared/gsd-browser-cli.ts +88 -4
  126. package/src/resources/skills/create-skill/references/executable-code.md +1 -1
  127. package/src/resources/skills/create-skill/workflows/add-reference.md +8 -3
  128. package/src/resources/skills/create-skill/workflows/add-script.md +4 -2
  129. package/src/resources/skills/create-skill/workflows/add-template.md +3 -1
  130. package/src/resources/skills/create-skill/workflows/add-workflow.md +8 -3
  131. package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +10 -5
  132. package/src/resources/skills/create-skill/workflows/verify-skill.md +9 -4
  133. package/src/resources/skills/spike-wrap-up/SKILL.md +9 -9
  134. /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → AOpDeK_gJHU8OZjRo31gQ}/_buildManifest.js +0 -0
  135. /package/dist/web/standalone/.next/static/{2p9Rv9pQflAxCBbGVI2vb → AOpDeK_gJHU8OZjRo31gQ}/_ssgManifest.js +0 -0
@@ -38,6 +38,12 @@ function compareSemverLocal(a, b) {
38
38
  function parseGsdBrowserVersion(output) {
39
39
  return output.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
40
40
  }
41
+ function isRecord(value) {
42
+ return !!value && typeof value === "object" && !Array.isArray(value);
43
+ }
44
+ function resolveExplicitGsdBrowserCliPath(env) {
45
+ return env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim() || undefined;
46
+ }
41
47
  function resolveBundledGsdBrowserPackageVersion() {
42
48
  try {
43
49
  const requireFromHere = createRequire(import.meta.url);
@@ -49,12 +55,19 @@ function resolveBundledGsdBrowserPackageVersion() {
49
55
  return null;
50
56
  }
51
57
  }
58
+ // The `gsd-browser --version` subprocess result cannot change mid-session (the
59
+ // engine-switch guard forbids restarting with a different engine), and both the
60
+ // availability probe and the launch-config resolution ask for it at session
61
+ // start — memoize so the up-to-2s spawn happens once per process.
62
+ let cachedPathProbeVersion;
52
63
  function resolvePathGsdBrowserVersion(env) {
53
64
  const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
54
65
  if (explicit)
55
66
  return parseGsdBrowserVersion(explicit);
67
+ if (cachedPathProbeVersion !== undefined)
68
+ return cachedPathProbeVersion;
56
69
  try {
57
- return parseGsdBrowserVersion(execFileSync("gsd-browser", ["--version"], {
70
+ cachedPathProbeVersion = parseGsdBrowserVersion(execFileSync("gsd-browser", ["--version"], {
58
71
  encoding: "utf-8",
59
72
  env,
60
73
  stdio: ["ignore", "pipe", "ignore"],
@@ -62,8 +75,9 @@ function resolvePathGsdBrowserVersion(env) {
62
75
  }));
63
76
  }
64
77
  catch {
65
- return null;
78
+ cachedPathProbeVersion = null;
66
79
  }
80
+ return cachedPathProbeVersion;
67
81
  }
68
82
  function shouldPreferPathGsdBrowser(env) {
69
83
  const pathVersion = resolvePathGsdBrowserVersion(env);
@@ -73,7 +87,7 @@ function shouldPreferPathGsdBrowser(env) {
73
87
  return !bundledVersion || compareSemverLocal(pathVersion, bundledVersion) > 0;
74
88
  }
75
89
  export function resolveBundledGsdBrowserCliPath(env = process.env) {
76
- const explicit = env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim();
90
+ const explicit = resolveExplicitGsdBrowserCliPath(env);
77
91
  if (explicit)
78
92
  return explicit;
79
93
  try {
@@ -96,6 +110,36 @@ export function resolveBundledGsdBrowserCliPath(env = process.env) {
96
110
  }
97
111
  return null;
98
112
  }
113
+ /**
114
+ * Cheap availability probe for the gsd-browser CLI: explicit env overrides,
115
+ * then the bundled @opengsd/gsd-browser binary (filesystem checks only), then
116
+ * a PATH lookup (one short subprocess, memoized). Used by Browser Automation
117
+ * Engine resolution to decide whether the managed engine is provable before
118
+ * preferring it over legacy Playwright. `via` names the provable source, not
119
+ * necessarily the launch source — resolveGsdBrowserMcpLaunchConfig may still
120
+ * prefer a newer PATH CLI over the bundled one.
121
+ */
122
+ export function resolveGsdBrowserCliAvailability(env = process.env) {
123
+ const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
124
+ if (explicitCommand) {
125
+ return { available: true, via: "explicit-env", detail: `GSD_BROWSER_MCP_COMMAND=${explicitCommand}` };
126
+ }
127
+ const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
128
+ if (explicitCliPath) {
129
+ return existsSync(explicitCliPath)
130
+ ? { available: true, via: "explicit-env", detail: `CLI at ${explicitCliPath}` }
131
+ : { available: false, detail: `configured gsd-browser CLI path does not exist: ${explicitCliPath}` };
132
+ }
133
+ const bundledCliPath = resolveBundledGsdBrowserCliPath(env);
134
+ if (bundledCliPath) {
135
+ return { available: true, via: "bundled", detail: `bundled CLI at ${bundledCliPath}` };
136
+ }
137
+ const pathVersion = resolvePathGsdBrowserVersion(env);
138
+ if (pathVersion) {
139
+ return { available: true, via: "path", detail: `gsd-browser ${pathVersion} on PATH` };
140
+ }
141
+ return { available: false, detail: "no bundled or PATH gsd-browser CLI found" };
142
+ }
99
143
  export function buildGsdBrowserSessionName(projectRoot, suffix) {
100
144
  const resolvedProjectRoot = resolve(projectRoot);
101
145
  const base = sanitizeSessionSegment(basename(resolvedProjectRoot)) || "project";
@@ -103,13 +147,37 @@ export function buildGsdBrowserSessionName(projectRoot, suffix) {
103
147
  const cleanSuffix = suffix ? sanitizeSessionSegment(suffix) : "";
104
148
  return cleanSuffix ? `gsd-${base}-${hash}-${cleanSuffix}` : `gsd-${base}-${hash}`;
105
149
  }
150
+ /**
151
+ * Recognize an MCP server config (from .mcp.json / Claude settings) as a
152
+ * gsd-browser server. Paired with resolveGsdBrowserMcpLaunchConfig: this module
153
+ * writes the config shape, so it also owns recognizing it. New launch shapes
154
+ * are taught here, in one place.
155
+ */
156
+ export function isGsdBrowserMcpServerConfig(config) {
157
+ if (!isRecord(config))
158
+ return false;
159
+ const command = typeof config.command === "string" ? config.command : "";
160
+ if (command.includes("gsd-browser") || command.includes("@opengsd/gsd-browser")) {
161
+ return true;
162
+ }
163
+ if (isRecord(config.env)) {
164
+ const env = config.env;
165
+ if (typeof env.GSD_BROWSER_CLI_PATH === "string"
166
+ || typeof env.GSD_BROWSER_BIN_PATH === "string"
167
+ || typeof env.GSD_BROWSER_MCP_COMMAND === "string") {
168
+ return true;
169
+ }
170
+ }
171
+ const args = Array.isArray(config.args) ? config.args.filter((arg) => typeof arg === "string") : [];
172
+ return args.some((arg) => arg.includes("gsd-browser") || arg.includes("@opengsd/gsd-browser"));
173
+ }
106
174
  export function resolveGsdBrowserMcpLaunchConfig(projectRoot, env = process.env, options = {}) {
107
175
  const resolvedProjectRoot = resolve(projectRoot);
108
176
  const serverName = env.GSD_BROWSER_MCP_NAME?.trim() || GSD_BROWSER_MCP_SERVER_NAME;
109
177
  const explicitArgs = parseJsonEnv(env, "GSD_BROWSER_MCP_ARGS");
110
178
  const explicitEnv = parseJsonEnv(env, "GSD_BROWSER_MCP_ENV");
111
179
  const explicitCommand = env.GSD_BROWSER_MCP_COMMAND?.trim();
112
- const explicitCliPath = env.GSD_BROWSER_CLI_PATH?.trim() || env.GSD_BROWSER_BIN_PATH?.trim();
180
+ const explicitCliPath = resolveExplicitGsdBrowserCliPath(env);
113
181
  const preferPathCli = !explicitCommand && !explicitCliPath && shouldPreferPathGsdBrowser(env);
114
182
  const bundledCliPath = !explicitCommand && !explicitCliPath && !preferPathCli
115
183
  ? resolveBundledGsdBrowserCliPath(env)
@@ -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 ~/.claude/skills/skill-name/scripts/analyze.py input.har
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
- ls ~/.claude/skills/
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 ~/.claude/skills/{skill-name}/SKILL.md
22
- ls ~/.claude/skills/{skill-name}/references/ 2>/dev/null
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 ~/.claude/skills/{skill-name}/scripts
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 ~/.claude/skills/{skill-name}/scripts/{script-name}.sh
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 ~/.claude/skills/{skill-name}/templates
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
- ls ~/.claude/skills/
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 ~/.claude/skills/{skill-name}/SKILL.md
25
- ls ~/.claude/skills/{skill-name}/workflows/ 2>/dev/null
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
- ls ~/.claude/skills/
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 ~/.claude/skills/{skill-name}/SKILL.md
23
- ls ~/.claude/skills/{skill-name}/
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 ~/.claude/skills/{skill-name}/workflows
69
- mkdir -p ~/.claude/skills/{skill-name}/references
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
- ls ~/.claude/skills/
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 ~/.claude/skills/{skill-name}/SKILL.md
28
- cat ~/.claude/skills/{skill-name}/workflows/*.md 2>/dev/null
29
- cat ~/.claude/skills/{skill-name}/references/*.md 2>/dev/null
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 `.claude/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`.
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 `.claude/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.
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 `.claude/skills/` (and `.agents/skills/`) 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."
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 `.claude/skills/` in the repo, not `~/.claude/skills/`. The skill encodes project-specific choices that should not leak into unrelated projects.
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 `.claude/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.
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 `.claude/skills/<name>/templates/` or `.claude/skills/<name>/references/` and reference it from the skill body.
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 .claude/skills/<name>/SKILL.md` now.
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/`.** That's user-global. Project spikes produce project skills keep them scoped.
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 `.claude/skills/<name>/SKILL.md` exists with well-formed frontmatter.
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.