@selvakumaresra/specship 0.1.3 → 0.4.0

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 (718) hide show
  1. package/README.md +2 -2
  2. package/commands/ss-design-implement.md +84 -0
  3. package/commands/ss-design-loop.md +125 -0
  4. package/commands/{cg-drifted.md → ss-drifted.md} +2 -2
  5. package/commands/{cg-fix.md → ss-fix.md} +1 -1
  6. package/commands/{cg-implement.md → ss-implement.md} +1 -1
  7. package/commands/ss-spec-author.md +43 -0
  8. package/commands/ss-spec-review.md +48 -0
  9. package/dist/bin/node-version-check.d.ts +37 -0
  10. package/dist/bin/node-version-check.d.ts.map +1 -0
  11. package/dist/bin/node-version-check.js +79 -0
  12. package/dist/bin/node-version-check.js.map +1 -0
  13. package/dist/bin/specship.d.ts +25 -0
  14. package/dist/bin/specship.d.ts.map +1 -0
  15. package/dist/bin/specship.js +2085 -0
  16. package/dist/bin/specship.js.map +1 -0
  17. package/dist/bin/uninstall.d.ts +13 -0
  18. package/dist/bin/uninstall.d.ts.map +1 -0
  19. package/dist/bin/uninstall.js +35 -0
  20. package/dist/bin/uninstall.js.map +1 -0
  21. package/dist/context/formatter.d.ts +30 -0
  22. package/dist/context/formatter.d.ts.map +1 -0
  23. package/dist/context/formatter.js +263 -0
  24. package/dist/context/formatter.js.map +1 -0
  25. package/dist/context/index.d.ts +119 -0
  26. package/dist/context/index.d.ts.map +1 -0
  27. package/dist/context/index.js +1289 -0
  28. package/dist/context/index.js.map +1 -0
  29. package/dist/context/markers.d.ts +19 -0
  30. package/dist/context/markers.d.ts.map +1 -0
  31. package/dist/context/markers.js +22 -0
  32. package/dist/context/markers.js.map +1 -0
  33. package/dist/db/index.d.ts +103 -0
  34. package/dist/db/index.d.ts.map +1 -0
  35. package/dist/db/index.js +279 -0
  36. package/dist/db/index.js.map +1 -0
  37. package/dist/db/migrations.d.ts +44 -0
  38. package/dist/db/migrations.d.ts.map +1 -0
  39. package/dist/db/migrations.js +462 -0
  40. package/dist/db/migrations.js.map +1 -0
  41. package/dist/db/queries.d.ts +357 -0
  42. package/dist/db/queries.d.ts.map +1 -0
  43. package/dist/db/queries.js +1504 -0
  44. package/dist/db/queries.js.map +1 -0
  45. package/dist/db/schema.sql +419 -0
  46. package/dist/db/spec-queries.d.ts +101 -0
  47. package/dist/db/spec-queries.d.ts.map +1 -0
  48. package/dist/db/spec-queries.js +675 -0
  49. package/dist/db/spec-queries.js.map +1 -0
  50. package/dist/db/sqlite-adapter.d.ts +65 -0
  51. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  52. package/dist/db/sqlite-adapter.js +214 -0
  53. package/dist/db/sqlite-adapter.js.map +1 -0
  54. package/dist/designer/artifact-store.js +54 -0
  55. package/dist/designer/browser.js +141 -0
  56. package/dist/designer/cdp-ensure.js +60 -0
  57. package/dist/designer/cdp-env.js +18 -0
  58. package/dist/designer/cdp-trace.js +599 -0
  59. package/dist/designer/cross-platform.js +74 -0
  60. package/dist/designer/designer-controller.js +1413 -0
  61. package/dist/designer/file-panel.js +39 -0
  62. package/dist/designer/interstitials.js +97 -0
  63. package/dist/designer/oopif-reader.js +176 -0
  64. package/dist/designer/package-meta.js +18 -0
  65. package/dist/designer/preview-host.js +50 -0
  66. package/dist/designer/repo-root.js +31 -0
  67. package/dist/designer/run-state.js +353 -0
  68. package/dist/designer/session-store.js +59 -0
  69. package/dist/designer/ui-anchors.js +651 -0
  70. package/dist/directory.d.ts +67 -0
  71. package/dist/directory.d.ts.map +1 -0
  72. package/dist/directory.js +267 -0
  73. package/dist/directory.js.map +1 -0
  74. package/dist/errors.d.ts +136 -0
  75. package/dist/errors.d.ts.map +1 -0
  76. package/dist/errors.js +219 -0
  77. package/dist/errors.js.map +1 -0
  78. package/dist/extraction/dfm-extractor.d.ts +31 -0
  79. package/dist/extraction/dfm-extractor.d.ts.map +1 -0
  80. package/dist/extraction/dfm-extractor.js +151 -0
  81. package/dist/extraction/dfm-extractor.js.map +1 -0
  82. package/dist/extraction/generated-detection.d.ts +30 -0
  83. package/dist/extraction/generated-detection.d.ts.map +1 -0
  84. package/dist/extraction/generated-detection.js +80 -0
  85. package/dist/extraction/generated-detection.js.map +1 -0
  86. package/dist/extraction/grammars.d.ts +100 -0
  87. package/dist/extraction/grammars.d.ts.map +1 -0
  88. package/dist/extraction/grammars.js +426 -0
  89. package/dist/extraction/grammars.js.map +1 -0
  90. package/dist/extraction/index.d.ts +138 -0
  91. package/dist/extraction/index.d.ts.map +1 -0
  92. package/dist/extraction/index.js +1394 -0
  93. package/dist/extraction/index.js.map +1 -0
  94. package/dist/extraction/languages/c-cpp.d.ts +4 -0
  95. package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
  96. package/dist/extraction/languages/c-cpp.js +171 -0
  97. package/dist/extraction/languages/c-cpp.js.map +1 -0
  98. package/dist/extraction/languages/csharp.d.ts +3 -0
  99. package/dist/extraction/languages/csharp.d.ts.map +1 -0
  100. package/dist/extraction/languages/csharp.js +73 -0
  101. package/dist/extraction/languages/csharp.js.map +1 -0
  102. package/dist/extraction/languages/dart.d.ts +3 -0
  103. package/dist/extraction/languages/dart.d.ts.map +1 -0
  104. package/dist/extraction/languages/dart.js +192 -0
  105. package/dist/extraction/languages/dart.js.map +1 -0
  106. package/dist/extraction/languages/go.d.ts +3 -0
  107. package/dist/extraction/languages/go.d.ts.map +1 -0
  108. package/dist/extraction/languages/go.js +74 -0
  109. package/dist/extraction/languages/go.js.map +1 -0
  110. package/dist/extraction/languages/index.d.ts +10 -0
  111. package/dist/extraction/languages/index.d.ts.map +1 -0
  112. package/dist/extraction/languages/index.js +51 -0
  113. package/dist/extraction/languages/index.js.map +1 -0
  114. package/dist/extraction/languages/java.d.ts +3 -0
  115. package/dist/extraction/languages/java.d.ts.map +1 -0
  116. package/dist/extraction/languages/java.js +70 -0
  117. package/dist/extraction/languages/java.js.map +1 -0
  118. package/dist/extraction/languages/javascript.d.ts +3 -0
  119. package/dist/extraction/languages/javascript.d.ts.map +1 -0
  120. package/dist/extraction/languages/javascript.js +90 -0
  121. package/dist/extraction/languages/javascript.js.map +1 -0
  122. package/dist/extraction/languages/kotlin.d.ts +3 -0
  123. package/dist/extraction/languages/kotlin.d.ts.map +1 -0
  124. package/dist/extraction/languages/kotlin.js +259 -0
  125. package/dist/extraction/languages/kotlin.js.map +1 -0
  126. package/dist/extraction/languages/lua.d.ts +3 -0
  127. package/dist/extraction/languages/lua.d.ts.map +1 -0
  128. package/dist/extraction/languages/lua.js +150 -0
  129. package/dist/extraction/languages/lua.js.map +1 -0
  130. package/dist/extraction/languages/luau.d.ts +3 -0
  131. package/dist/extraction/languages/luau.d.ts.map +1 -0
  132. package/dist/extraction/languages/luau.js +37 -0
  133. package/dist/extraction/languages/luau.js.map +1 -0
  134. package/dist/extraction/languages/objc.d.ts +3 -0
  135. package/dist/extraction/languages/objc.d.ts.map +1 -0
  136. package/dist/extraction/languages/objc.js +133 -0
  137. package/dist/extraction/languages/objc.js.map +1 -0
  138. package/dist/extraction/languages/pascal.d.ts +3 -0
  139. package/dist/extraction/languages/pascal.d.ts.map +1 -0
  140. package/dist/extraction/languages/pascal.js +66 -0
  141. package/dist/extraction/languages/pascal.js.map +1 -0
  142. package/dist/extraction/languages/php.d.ts +3 -0
  143. package/dist/extraction/languages/php.d.ts.map +1 -0
  144. package/dist/extraction/languages/php.js +107 -0
  145. package/dist/extraction/languages/php.js.map +1 -0
  146. package/dist/extraction/languages/python.d.ts +3 -0
  147. package/dist/extraction/languages/python.d.ts.map +1 -0
  148. package/dist/extraction/languages/python.js +56 -0
  149. package/dist/extraction/languages/python.js.map +1 -0
  150. package/dist/extraction/languages/ruby.d.ts +3 -0
  151. package/dist/extraction/languages/ruby.d.ts.map +1 -0
  152. package/dist/extraction/languages/ruby.js +114 -0
  153. package/dist/extraction/languages/ruby.js.map +1 -0
  154. package/dist/extraction/languages/rust.d.ts +3 -0
  155. package/dist/extraction/languages/rust.d.ts.map +1 -0
  156. package/dist/extraction/languages/rust.js +109 -0
  157. package/dist/extraction/languages/rust.js.map +1 -0
  158. package/dist/extraction/languages/scala.d.ts +3 -0
  159. package/dist/extraction/languages/scala.d.ts.map +1 -0
  160. package/dist/extraction/languages/scala.js +139 -0
  161. package/dist/extraction/languages/scala.js.map +1 -0
  162. package/dist/extraction/languages/swift.d.ts +3 -0
  163. package/dist/extraction/languages/swift.d.ts.map +1 -0
  164. package/dist/extraction/languages/swift.js +91 -0
  165. package/dist/extraction/languages/swift.js.map +1 -0
  166. package/dist/extraction/languages/typescript.d.ts +3 -0
  167. package/dist/extraction/languages/typescript.d.ts.map +1 -0
  168. package/dist/extraction/languages/typescript.js +129 -0
  169. package/dist/extraction/languages/typescript.js.map +1 -0
  170. package/dist/extraction/liquid-extractor.d.ts +52 -0
  171. package/dist/extraction/liquid-extractor.d.ts.map +1 -0
  172. package/dist/extraction/liquid-extractor.js +313 -0
  173. package/dist/extraction/liquid-extractor.js.map +1 -0
  174. package/dist/extraction/mybatis-extractor.d.ts +48 -0
  175. package/dist/extraction/mybatis-extractor.d.ts.map +1 -0
  176. package/dist/extraction/mybatis-extractor.js +198 -0
  177. package/dist/extraction/mybatis-extractor.js.map +1 -0
  178. package/dist/extraction/parse-worker.d.ts +8 -0
  179. package/dist/extraction/parse-worker.d.ts.map +1 -0
  180. package/dist/extraction/parse-worker.js +94 -0
  181. package/dist/extraction/parse-worker.js.map +1 -0
  182. package/dist/extraction/specs/markdown-spec-extractor.d.ts +59 -0
  183. package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -0
  184. package/dist/extraction/specs/markdown-spec-extractor.js +327 -0
  185. package/dist/extraction/specs/markdown-spec-extractor.js.map +1 -0
  186. package/dist/extraction/specs/types.d.ts +39 -0
  187. package/dist/extraction/specs/types.d.ts.map +1 -0
  188. package/dist/extraction/specs/types.js +8 -0
  189. package/dist/extraction/specs/types.js.map +1 -0
  190. package/dist/extraction/svelte-extractor.d.ts +56 -0
  191. package/dist/extraction/svelte-extractor.d.ts.map +1 -0
  192. package/dist/extraction/svelte-extractor.js +272 -0
  193. package/dist/extraction/svelte-extractor.js.map +1 -0
  194. package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  195. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
  196. package/dist/extraction/tree-sitter-helpers.js +103 -0
  197. package/dist/extraction/tree-sitter-helpers.js.map +1 -0
  198. package/dist/extraction/tree-sitter-types.d.ts +193 -0
  199. package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
  200. package/dist/extraction/tree-sitter-types.js +10 -0
  201. package/dist/extraction/tree-sitter-types.js.map +1 -0
  202. package/dist/extraction/tree-sitter.d.ts +317 -0
  203. package/dist/extraction/tree-sitter.d.ts.map +1 -0
  204. package/dist/extraction/tree-sitter.js +3092 -0
  205. package/dist/extraction/tree-sitter.js.map +1 -0
  206. package/dist/extraction/vue-extractor.d.ts +51 -0
  207. package/dist/extraction/vue-extractor.d.ts.map +1 -0
  208. package/dist/extraction/vue-extractor.js +251 -0
  209. package/dist/extraction/vue-extractor.js.map +1 -0
  210. package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  211. package/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
  212. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  213. package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  214. package/dist/extraction/wasm-runtime-flags.d.ts +38 -0
  215. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
  216. package/dist/extraction/wasm-runtime-flags.js +106 -0
  217. package/dist/extraction/wasm-runtime-flags.js.map +1 -0
  218. package/dist/graph/index.d.ts +8 -0
  219. package/dist/graph/index.d.ts.map +1 -0
  220. package/dist/graph/index.js +13 -0
  221. package/dist/graph/index.js.map +1 -0
  222. package/dist/graph/queries.d.ts +106 -0
  223. package/dist/graph/queries.d.ts.map +1 -0
  224. package/dist/graph/queries.js +366 -0
  225. package/dist/graph/queries.js.map +1 -0
  226. package/dist/graph/traversal.d.ts +127 -0
  227. package/dist/graph/traversal.d.ts.map +1 -0
  228. package/dist/graph/traversal.js +531 -0
  229. package/dist/graph/traversal.js.map +1 -0
  230. package/dist/index.d.ts +551 -0
  231. package/dist/index.d.ts.map +1 -0
  232. package/dist/index.js +1165 -0
  233. package/dist/index.js.map +1 -0
  234. package/dist/installer/config-writer.d.ts +28 -0
  235. package/dist/installer/config-writer.d.ts.map +1 -0
  236. package/dist/installer/config-writer.js +91 -0
  237. package/dist/installer/config-writer.js.map +1 -0
  238. package/dist/installer/index.d.ts +92 -0
  239. package/dist/installer/index.d.ts.map +1 -0
  240. package/dist/installer/index.js +416 -0
  241. package/dist/installer/index.js.map +1 -0
  242. package/dist/installer/instructions-template.d.ts +35 -0
  243. package/dist/installer/instructions-template.d.ts.map +1 -0
  244. package/dist/installer/instructions-template.js +51 -0
  245. package/dist/installer/instructions-template.js.map +1 -0
  246. package/dist/installer/targets/claude.d.ts +117 -0
  247. package/dist/installer/targets/claude.d.ts.map +1 -0
  248. package/dist/installer/targets/claude.js +736 -0
  249. package/dist/installer/targets/claude.js.map +1 -0
  250. package/dist/installer/targets/registry.d.ts +19 -0
  251. package/dist/installer/targets/registry.d.ts.map +1 -0
  252. package/dist/installer/targets/registry.js +31 -0
  253. package/dist/installer/targets/registry.js.map +1 -0
  254. package/dist/installer/targets/shared.d.ts +76 -0
  255. package/dist/installer/targets/shared.d.ts.map +1 -0
  256. package/dist/installer/targets/shared.js +256 -0
  257. package/dist/installer/targets/shared.js.map +1 -0
  258. package/dist/installer/targets/types.d.ts +84 -0
  259. package/dist/installer/targets/types.d.ts.map +1 -0
  260. package/dist/installer/targets/types.js +12 -0
  261. package/dist/installer/targets/types.js.map +1 -0
  262. package/dist/isolation/worktree.d.ts +65 -0
  263. package/dist/isolation/worktree.d.ts.map +1 -0
  264. package/dist/isolation/worktree.js +231 -0
  265. package/dist/isolation/worktree.js.map +1 -0
  266. package/dist/mcp/daemon-paths.d.ts +46 -0
  267. package/dist/mcp/daemon-paths.d.ts.map +1 -0
  268. package/dist/mcp/daemon-paths.js +125 -0
  269. package/dist/mcp/daemon-paths.js.map +1 -0
  270. package/dist/mcp/daemon.d.ts +161 -0
  271. package/dist/mcp/daemon.d.ts.map +1 -0
  272. package/dist/mcp/daemon.js +403 -0
  273. package/dist/mcp/daemon.js.map +1 -0
  274. package/dist/mcp/designer-tools.d.ts +33 -0
  275. package/dist/mcp/designer-tools.d.ts.map +1 -0
  276. package/dist/mcp/designer-tools.js +313 -0
  277. package/dist/mcp/designer-tools.js.map +1 -0
  278. package/dist/mcp/engine.d.ts +105 -0
  279. package/dist/mcp/engine.d.ts.map +1 -0
  280. package/dist/mcp/engine.js +270 -0
  281. package/dist/mcp/engine.js.map +1 -0
  282. package/dist/mcp/index.d.ts +112 -0
  283. package/dist/mcp/index.d.ts.map +1 -0
  284. package/dist/mcp/index.js +477 -0
  285. package/dist/mcp/index.js.map +1 -0
  286. package/dist/mcp/proxy.d.ts +81 -0
  287. package/dist/mcp/proxy.d.ts.map +1 -0
  288. package/dist/mcp/proxy.js +510 -0
  289. package/dist/mcp/proxy.js.map +1 -0
  290. package/dist/mcp/server-instructions.d.ts +18 -0
  291. package/dist/mcp/server-instructions.d.ts.map +1 -0
  292. package/dist/mcp/server-instructions.js +77 -0
  293. package/dist/mcp/server-instructions.js.map +1 -0
  294. package/dist/mcp/session.d.ts +77 -0
  295. package/dist/mcp/session.d.ts.map +1 -0
  296. package/dist/mcp/session.js +294 -0
  297. package/dist/mcp/session.js.map +1 -0
  298. package/dist/mcp/spec-tools.d.ts +39 -0
  299. package/dist/mcp/spec-tools.d.ts.map +1 -0
  300. package/dist/mcp/spec-tools.js +326 -0
  301. package/dist/mcp/spec-tools.js.map +1 -0
  302. package/dist/mcp/tools.d.ts +404 -0
  303. package/dist/mcp/tools.d.ts.map +1 -0
  304. package/dist/mcp/tools.js +3087 -0
  305. package/dist/mcp/tools.js.map +1 -0
  306. package/dist/mcp/transport.d.ts +188 -0
  307. package/dist/mcp/transport.d.ts.map +1 -0
  308. package/dist/mcp/transport.js +343 -0
  309. package/dist/mcp/transport.js.map +1 -0
  310. package/dist/mcp/version.d.ts +19 -0
  311. package/dist/mcp/version.d.ts.map +1 -0
  312. package/dist/mcp/version.js +71 -0
  313. package/dist/mcp/version.js.map +1 -0
  314. package/dist/resolution/callback-synthesizer.d.ts +10 -0
  315. package/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  316. package/dist/resolution/callback-synthesizer.js +1300 -0
  317. package/dist/resolution/callback-synthesizer.js.map +1 -0
  318. package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
  319. package/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
  320. package/dist/resolution/frameworks/cargo-workspace.js +225 -0
  321. package/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
  322. package/dist/resolution/frameworks/csharp.d.ts +8 -0
  323. package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
  324. package/dist/resolution/frameworks/csharp.js +241 -0
  325. package/dist/resolution/frameworks/csharp.js.map +1 -0
  326. package/dist/resolution/frameworks/drupal.d.ts +51 -0
  327. package/dist/resolution/frameworks/drupal.d.ts.map +1 -0
  328. package/dist/resolution/frameworks/drupal.js +367 -0
  329. package/dist/resolution/frameworks/drupal.js.map +1 -0
  330. package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  331. package/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
  332. package/dist/resolution/frameworks/expo-modules.js +143 -0
  333. package/dist/resolution/frameworks/expo-modules.js.map +1 -0
  334. package/dist/resolution/frameworks/express.d.ts +8 -0
  335. package/dist/resolution/frameworks/express.d.ts.map +1 -0
  336. package/dist/resolution/frameworks/express.js +308 -0
  337. package/dist/resolution/frameworks/express.js.map +1 -0
  338. package/dist/resolution/frameworks/fabric.d.ts +3 -0
  339. package/dist/resolution/frameworks/fabric.d.ts.map +1 -0
  340. package/dist/resolution/frameworks/fabric.js +354 -0
  341. package/dist/resolution/frameworks/fabric.js.map +1 -0
  342. package/dist/resolution/frameworks/go.d.ts +8 -0
  343. package/dist/resolution/frameworks/go.d.ts.map +1 -0
  344. package/dist/resolution/frameworks/go.js +161 -0
  345. package/dist/resolution/frameworks/go.js.map +1 -0
  346. package/dist/resolution/frameworks/index.d.ts +48 -0
  347. package/dist/resolution/frameworks/index.d.ts.map +1 -0
  348. package/dist/resolution/frameworks/index.js +161 -0
  349. package/dist/resolution/frameworks/index.js.map +1 -0
  350. package/dist/resolution/frameworks/java.d.ts +8 -0
  351. package/dist/resolution/frameworks/java.d.ts.map +1 -0
  352. package/dist/resolution/frameworks/java.js +504 -0
  353. package/dist/resolution/frameworks/java.js.map +1 -0
  354. package/dist/resolution/frameworks/laravel.d.ts +13 -0
  355. package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
  356. package/dist/resolution/frameworks/laravel.js +257 -0
  357. package/dist/resolution/frameworks/laravel.js.map +1 -0
  358. package/dist/resolution/frameworks/nestjs.d.ts +26 -0
  359. package/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
  360. package/dist/resolution/frameworks/nestjs.js +698 -0
  361. package/dist/resolution/frameworks/nestjs.js.map +1 -0
  362. package/dist/resolution/frameworks/play.d.ts +19 -0
  363. package/dist/resolution/frameworks/play.d.ts.map +1 -0
  364. package/dist/resolution/frameworks/play.js +111 -0
  365. package/dist/resolution/frameworks/play.js.map +1 -0
  366. package/dist/resolution/frameworks/python.d.ts +10 -0
  367. package/dist/resolution/frameworks/python.d.ts.map +1 -0
  368. package/dist/resolution/frameworks/python.js +396 -0
  369. package/dist/resolution/frameworks/python.js.map +1 -0
  370. package/dist/resolution/frameworks/react-native.d.ts +3 -0
  371. package/dist/resolution/frameworks/react-native.d.ts.map +1 -0
  372. package/dist/resolution/frameworks/react-native.js +360 -0
  373. package/dist/resolution/frameworks/react-native.js.map +1 -0
  374. package/dist/resolution/frameworks/react.d.ts +8 -0
  375. package/dist/resolution/frameworks/react.d.ts.map +1 -0
  376. package/dist/resolution/frameworks/react.js +365 -0
  377. package/dist/resolution/frameworks/react.js.map +1 -0
  378. package/dist/resolution/frameworks/ruby.d.ts +8 -0
  379. package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
  380. package/dist/resolution/frameworks/ruby.js +302 -0
  381. package/dist/resolution/frameworks/ruby.js.map +1 -0
  382. package/dist/resolution/frameworks/rust.d.ts +8 -0
  383. package/dist/resolution/frameworks/rust.d.ts.map +1 -0
  384. package/dist/resolution/frameworks/rust.js +304 -0
  385. package/dist/resolution/frameworks/rust.js.map +1 -0
  386. package/dist/resolution/frameworks/svelte.d.ts +9 -0
  387. package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
  388. package/dist/resolution/frameworks/svelte.js +249 -0
  389. package/dist/resolution/frameworks/svelte.js.map +1 -0
  390. package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  391. package/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
  392. package/dist/resolution/frameworks/swift-objc.js +252 -0
  393. package/dist/resolution/frameworks/swift-objc.js.map +1 -0
  394. package/dist/resolution/frameworks/swift.d.ts +10 -0
  395. package/dist/resolution/frameworks/swift.d.ts.map +1 -0
  396. package/dist/resolution/frameworks/swift.js +400 -0
  397. package/dist/resolution/frameworks/swift.js.map +1 -0
  398. package/dist/resolution/frameworks/vue.d.ts +9 -0
  399. package/dist/resolution/frameworks/vue.d.ts.map +1 -0
  400. package/dist/resolution/frameworks/vue.js +306 -0
  401. package/dist/resolution/frameworks/vue.js.map +1 -0
  402. package/dist/resolution/go-module.d.ts +26 -0
  403. package/dist/resolution/go-module.d.ts.map +1 -0
  404. package/dist/resolution/go-module.js +78 -0
  405. package/dist/resolution/go-module.js.map +1 -0
  406. package/dist/resolution/import-resolver.d.ts +68 -0
  407. package/dist/resolution/import-resolver.d.ts.map +1 -0
  408. package/dist/resolution/import-resolver.js +1275 -0
  409. package/dist/resolution/import-resolver.js.map +1 -0
  410. package/dist/resolution/index.d.ts +117 -0
  411. package/dist/resolution/index.d.ts.map +1 -0
  412. package/dist/resolution/index.js +895 -0
  413. package/dist/resolution/index.js.map +1 -0
  414. package/dist/resolution/lru-cache.d.ts +24 -0
  415. package/dist/resolution/lru-cache.d.ts.map +1 -0
  416. package/dist/resolution/lru-cache.js +62 -0
  417. package/dist/resolution/lru-cache.js.map +1 -0
  418. package/dist/resolution/name-matcher.d.ts +32 -0
  419. package/dist/resolution/name-matcher.d.ts.map +1 -0
  420. package/dist/resolution/name-matcher.js +596 -0
  421. package/dist/resolution/name-matcher.js.map +1 -0
  422. package/dist/resolution/path-aliases.d.ts +68 -0
  423. package/dist/resolution/path-aliases.d.ts.map +1 -0
  424. package/dist/resolution/path-aliases.js +238 -0
  425. package/dist/resolution/path-aliases.js.map +1 -0
  426. package/dist/resolution/spec-link-resolver.d.ts +103 -0
  427. package/dist/resolution/spec-link-resolver.d.ts.map +1 -0
  428. package/dist/resolution/spec-link-resolver.js +259 -0
  429. package/dist/resolution/spec-link-resolver.js.map +1 -0
  430. package/dist/resolution/strip-comments.d.ts +27 -0
  431. package/dist/resolution/strip-comments.d.ts.map +1 -0
  432. package/dist/resolution/strip-comments.js +441 -0
  433. package/dist/resolution/strip-comments.js.map +1 -0
  434. package/dist/resolution/swift-objc-bridge.d.ts +134 -0
  435. package/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
  436. package/dist/resolution/swift-objc-bridge.js +256 -0
  437. package/dist/resolution/swift-objc-bridge.js.map +1 -0
  438. package/dist/resolution/types.d.ts +216 -0
  439. package/dist/resolution/types.d.ts.map +1 -0
  440. package/dist/resolution/types.js +8 -0
  441. package/dist/resolution/types.js.map +1 -0
  442. package/dist/resolution/workspace-packages.d.ts +48 -0
  443. package/dist/resolution/workspace-packages.d.ts.map +1 -0
  444. package/dist/resolution/workspace-packages.js +208 -0
  445. package/dist/resolution/workspace-packages.js.map +1 -0
  446. package/dist/search/query-parser.d.ts +57 -0
  447. package/dist/search/query-parser.d.ts.map +1 -0
  448. package/dist/search/query-parser.js +177 -0
  449. package/dist/search/query-parser.js.map +1 -0
  450. package/dist/search/query-utils.d.ts +71 -0
  451. package/dist/search/query-utils.d.ts.map +1 -0
  452. package/dist/search/query-utils.js +380 -0
  453. package/dist/search/query-utils.js.map +1 -0
  454. package/dist/server/cli.js +152 -0
  455. package/dist/server/index.js +12 -0
  456. package/dist/server/ingest/index.js +18 -0
  457. package/dist/server/ingest/ingestor.js +506 -0
  458. package/dist/server/ingest/parser.js +104 -0
  459. package/dist/server/ingest/pricing.js +78 -0
  460. package/dist/server/ingest/types.js +9 -0
  461. package/dist/server/ingest/watcher.js +77 -0
  462. package/dist/server/package.json +3 -0
  463. package/dist/server/project-registry.js +101 -0
  464. package/dist/server/routes/claude.js +868 -0
  465. package/dist/server/routes/graph.js +211 -0
  466. package/dist/server/routes/memory.js +272 -0
  467. package/dist/server/routes/projects.js +197 -0
  468. package/dist/server/routes/spec.js +265 -0
  469. package/dist/server/routes/status.js +112 -0
  470. package/dist/server/routes/workflow.js +212 -0
  471. package/dist/server/server.js +206 -0
  472. package/dist/server/static-handler.js +87 -0
  473. package/dist/sync/git-hooks.d.ts +45 -0
  474. package/dist/sync/git-hooks.d.ts.map +1 -0
  475. package/dist/sync/git-hooks.js +225 -0
  476. package/dist/sync/git-hooks.js.map +1 -0
  477. package/dist/sync/index.d.ts +19 -0
  478. package/dist/sync/index.d.ts.map +1 -0
  479. package/dist/sync/index.js +35 -0
  480. package/dist/sync/index.js.map +1 -0
  481. package/dist/sync/watch-policy.d.ts +48 -0
  482. package/dist/sync/watch-policy.d.ts.map +1 -0
  483. package/dist/sync/watch-policy.js +124 -0
  484. package/dist/sync/watch-policy.js.map +1 -0
  485. package/dist/sync/watcher.d.ts +283 -0
  486. package/dist/sync/watcher.d.ts.map +1 -0
  487. package/dist/sync/watcher.js +606 -0
  488. package/dist/sync/watcher.js.map +1 -0
  489. package/dist/sync/worktree.d.ts +54 -0
  490. package/dist/sync/worktree.d.ts.map +1 -0
  491. package/dist/sync/worktree.js +137 -0
  492. package/dist/sync/worktree.js.map +1 -0
  493. package/dist/types.d.ts +623 -0
  494. package/dist/types.d.ts.map +1 -0
  495. package/dist/types.js +108 -0
  496. package/dist/types.js.map +1 -0
  497. package/dist/ui/glyphs.d.ts +42 -0
  498. package/dist/ui/glyphs.d.ts.map +1 -0
  499. package/dist/ui/glyphs.js +78 -0
  500. package/dist/ui/glyphs.js.map +1 -0
  501. package/dist/ui/shimmer-progress.d.ts +11 -0
  502. package/dist/ui/shimmer-progress.d.ts.map +1 -0
  503. package/dist/ui/shimmer-progress.js +90 -0
  504. package/dist/ui/shimmer-progress.js.map +1 -0
  505. package/dist/ui/shimmer-worker.d.ts +2 -0
  506. package/dist/ui/shimmer-worker.d.ts.map +1 -0
  507. package/dist/ui/shimmer-worker.js +118 -0
  508. package/dist/ui/shimmer-worker.js.map +1 -0
  509. package/dist/ui/types.d.ts +17 -0
  510. package/dist/ui/types.d.ts.map +1 -0
  511. package/dist/ui/types.js +3 -0
  512. package/dist/ui/types.js.map +1 -0
  513. package/dist/utils.d.ts +205 -0
  514. package/dist/utils.d.ts.map +1 -0
  515. package/dist/utils.js +549 -0
  516. package/dist/utils.js.map +1 -0
  517. package/dist/web/chunk-2AJCHB7P.js +1 -0
  518. package/dist/web/chunk-2CPLUFCH.js +2 -0
  519. package/dist/web/chunk-2GBEK2GM.js +1 -0
  520. package/dist/web/chunk-2I7L37NS.js +1 -0
  521. package/dist/web/chunk-2NAWAJB5.js +1 -0
  522. package/dist/web/chunk-2OJBIPE4.js +1 -0
  523. package/dist/web/chunk-2YUJNZ2Y.js +6 -0
  524. package/dist/web/chunk-3E2WB6D5.js +1 -0
  525. package/dist/web/chunk-3EBFYSCH.js +2 -0
  526. package/dist/web/chunk-3QCQ4BXS.js +1 -0
  527. package/dist/web/chunk-42XVAQ6I.js +1 -0
  528. package/dist/web/chunk-45QHGCB4.js +17 -0
  529. package/dist/web/chunk-4IMMPEYM.js +1 -0
  530. package/dist/web/chunk-4TJQJPCZ.js +1 -0
  531. package/dist/web/chunk-4WZIHTPC.js +1 -0
  532. package/dist/web/chunk-4YVSYOSD.js +1 -0
  533. package/dist/web/chunk-5BQIOYKW.js +1 -0
  534. package/dist/web/chunk-5HGWHUJA.js +1 -0
  535. package/dist/web/chunk-5Y244R4G.js +1 -0
  536. package/dist/web/chunk-6RRDPT5Z.js +1 -0
  537. package/dist/web/chunk-6VKB2ZWM.js +1 -0
  538. package/dist/web/chunk-7DMFVTU4.js +1 -0
  539. package/dist/web/chunk-7RNS77UP.js +1 -0
  540. package/dist/web/chunk-7SMPKVEP.js +1 -0
  541. package/dist/web/chunk-A5R3MJMO.js +1 -0
  542. package/dist/web/chunk-ASZ77FMZ.js +1 -0
  543. package/dist/web/chunk-AZJVTPLU.js +1 -0
  544. package/dist/web/chunk-B3YPFY6A.js +1 -0
  545. package/dist/web/chunk-BLBRMCN2.js +1 -0
  546. package/dist/web/chunk-BMIAXD2V.js +2 -0
  547. package/dist/web/chunk-BUXWEHIY.js +1 -0
  548. package/dist/web/chunk-BYZFQSM6.js +1 -0
  549. package/dist/web/chunk-D5OCNEJA.js +2 -0
  550. package/dist/web/chunk-DLQPZWSI.css +1 -0
  551. package/dist/web/chunk-DTRN7FZR.js +1 -0
  552. package/dist/web/chunk-DYRFLPJA.js +1 -0
  553. package/dist/web/chunk-E3J3CXR5.js +1 -0
  554. package/dist/web/chunk-E44X4RH2.js +1 -0
  555. package/dist/web/chunk-E73OX2P7.js +1 -0
  556. package/dist/web/chunk-EAXRKDLV.js +1 -0
  557. package/dist/web/chunk-EBKKDHYI.js +1 -0
  558. package/dist/web/chunk-EE7V7Q5P.js +1 -0
  559. package/dist/web/chunk-EKY2FUHU.js +1 -0
  560. package/dist/web/chunk-EMGMOEVR.js +1 -0
  561. package/dist/web/chunk-EP6XOPXH.js +1 -0
  562. package/dist/web/chunk-ESGDLJOJ.js +1 -0
  563. package/dist/web/chunk-ETJG7NCY.js +1 -0
  564. package/dist/web/chunk-EUUEFEDI.js +1 -0
  565. package/dist/web/chunk-FGNZDHTL.js +11 -0
  566. package/dist/web/chunk-FHZHD2ZG.js +1 -0
  567. package/dist/web/chunk-FIJW2UNJ.js +1 -0
  568. package/dist/web/chunk-FMV5PXRC.js +5 -0
  569. package/dist/web/chunk-G7VZT5KB.js +3 -0
  570. package/dist/web/chunk-GR72OOCN.js +1 -0
  571. package/dist/web/chunk-GRZYXPSO.js +7 -0
  572. package/dist/web/chunk-GWPVKJIY.js +1 -0
  573. package/dist/web/chunk-GYGPS3AN.js +1 -0
  574. package/dist/web/chunk-H7AF7YS4.js +1 -0
  575. package/dist/web/chunk-HDZDQILN.js +1 -0
  576. package/dist/web/chunk-HMK6UO6N.js +1 -0
  577. package/dist/web/chunk-HZA6NEAB.js +1 -0
  578. package/dist/web/chunk-IHEE5NYJ.js +1 -0
  579. package/dist/web/chunk-ISNEBICW.js +1 -0
  580. package/dist/web/chunk-J2GZVLHH.js +1 -0
  581. package/dist/web/chunk-JTFXTIPE.js +903 -0
  582. package/dist/web/chunk-L37MTFSG.js +3 -0
  583. package/dist/web/chunk-LB6JPLX2.js +1 -0
  584. package/dist/web/chunk-LNSVDHCI.js +1 -0
  585. package/dist/web/chunk-LVGIY3SO.js +1 -0
  586. package/dist/web/chunk-LXLHIHEN.js +1 -0
  587. package/dist/web/chunk-MC4DFIHG.js +1 -0
  588. package/dist/web/chunk-MVOMVPYB.js +1 -0
  589. package/dist/web/chunk-N6SS4G6S.js +1 -0
  590. package/dist/web/chunk-NTBJG6SJ.js +1 -0
  591. package/dist/web/chunk-NUDB3Q2Y.js +3 -0
  592. package/dist/web/chunk-NZEZCT65.js +1 -0
  593. package/dist/web/chunk-OXEF5E3E.js +1 -0
  594. package/dist/web/chunk-PDN6QYGJ.js +4 -0
  595. package/dist/web/chunk-PGGJPDJG.js +1 -0
  596. package/dist/web/chunk-PUYSJNJR.js +1 -0
  597. package/dist/web/chunk-Q2RVFS45.js +1 -0
  598. package/dist/web/chunk-Q7L6LLAK.js +1 -0
  599. package/dist/web/chunk-QCMKJIWY.js +1 -0
  600. package/dist/web/chunk-QH6CF3M3.js +1 -0
  601. package/dist/web/chunk-QQ5LD7PI.js +1 -0
  602. package/dist/web/chunk-QR6L3KAC.js +1 -0
  603. package/dist/web/chunk-R2DLK4HO.js +1 -0
  604. package/dist/web/chunk-R5W2MDZN.js +1 -0
  605. package/dist/web/chunk-RD6TVPOT.js +1 -0
  606. package/dist/web/chunk-RKY4EJYJ.js +1 -0
  607. package/dist/web/chunk-RONYWVY7.js +1 -0
  608. package/dist/web/chunk-RXKXYF2C.js +1 -0
  609. package/dist/web/chunk-SBWU7JFC.js +1 -0
  610. package/dist/web/chunk-SEXBRGYK.js +1 -0
  611. package/dist/web/chunk-SHPTC4RL.js +1 -0
  612. package/dist/web/chunk-SUZYBYDW.js +1 -0
  613. package/dist/web/chunk-SWKJRNYY.js +1 -0
  614. package/dist/web/chunk-T66XVKGB.js +1 -0
  615. package/dist/web/chunk-T7AZ65JP.js +1 -0
  616. package/dist/web/chunk-TCZDVOHD.js +1 -0
  617. package/dist/web/chunk-TPTITA3V.js +1 -0
  618. package/dist/web/chunk-TR335633.js +1 -0
  619. package/dist/web/chunk-UBOZGQNK.js +1 -0
  620. package/dist/web/chunk-UR5KDXPX.js +1 -0
  621. package/dist/web/chunk-UR6O2GEH.js +1 -0
  622. package/dist/web/chunk-UTNMGWTP.js +1 -0
  623. package/dist/web/chunk-UYC52MBC.js +1 -0
  624. package/dist/web/chunk-VECWMHJP.js +1 -0
  625. package/dist/web/chunk-VUACT35R.js +3 -0
  626. package/dist/web/chunk-VZI7H4SZ.js +1 -0
  627. package/dist/web/chunk-WAI2JMZP.js +1 -0
  628. package/dist/web/chunk-WB6YHOD4.js +1 -0
  629. package/dist/web/chunk-WBT64AWV.js +1 -0
  630. package/dist/web/chunk-WCKHQIYN.js +1 -0
  631. package/dist/web/chunk-WDU3WICG.js +1 -0
  632. package/dist/web/chunk-WFXJIXZE.js +4 -0
  633. package/dist/web/chunk-WLIMNDS3.js +1 -0
  634. package/dist/web/chunk-WTGYRH3Z.js +298 -0
  635. package/dist/web/chunk-WXTCVDTP.js +1 -0
  636. package/dist/web/chunk-X2HTISHL.js +1 -0
  637. package/dist/web/chunk-XCDHWLVH.js +1 -0
  638. package/dist/web/chunk-Y3H6FFUZ.js +1 -0
  639. package/dist/web/chunk-Y4F5ULGJ.js +1 -0
  640. package/dist/web/chunk-YAMRN47K.js +2 -0
  641. package/dist/web/chunk-YEGKAAEE.js +1 -0
  642. package/dist/web/chunk-YM2KU57F.js +1 -0
  643. package/dist/web/chunk-YRERBP6T.js +1 -0
  644. package/dist/web/chunk-ZLV4VCDG.js +3 -0
  645. package/dist/web/chunk-ZTVI5KFF.js +1 -0
  646. package/dist/web/favicon-16.png +0 -0
  647. package/dist/web/favicon-180.png +0 -0
  648. package/dist/web/favicon-32.png +0 -0
  649. package/dist/web/favicon-512.png +0 -0
  650. package/dist/web/favicon-small.svg +15 -0
  651. package/dist/web/favicon.ico +0 -0
  652. package/dist/web/favicon.svg +20 -0
  653. package/dist/web/index.html +145 -0
  654. package/dist/web/main-ESADRXN2.css +1 -0
  655. package/dist/web/main-R53HA54V.js +1 -0
  656. package/dist/web/media/codicon-LN6W7LCM.ttf +0 -0
  657. package/dist/web/styles-KSOPUVDA.css +1 -0
  658. package/dist/web/sw.js +69 -0
  659. package/dist/workflows/condition-evaluator.d.ts +75 -0
  660. package/dist/workflows/condition-evaluator.d.ts.map +1 -0
  661. package/dist/workflows/condition-evaluator.js +282 -0
  662. package/dist/workflows/condition-evaluator.js.map +1 -0
  663. package/dist/workflows/defaults/claude-design-implement.yaml +336 -0
  664. package/dist/workflows/defaults/index.d.ts +26 -0
  665. package/dist/workflows/defaults/index.d.ts.map +1 -0
  666. package/dist/workflows/defaults/index.js +94 -0
  667. package/dist/workflows/defaults/index.js.map +1 -0
  668. package/dist/workflows/defaults/spec-author.yaml +214 -0
  669. package/dist/workflows/defaults/spec-fix.yaml +110 -0
  670. package/dist/workflows/defaults/spec-implement.yaml +150 -0
  671. package/dist/workflows/defaults/spec-relink.yaml +81 -0
  672. package/dist/workflows/defaults/spec-verify.yaml +51 -0
  673. package/dist/workflows/discovery.d.ts +46 -0
  674. package/dist/workflows/discovery.d.ts.map +1 -0
  675. package/dist/workflows/discovery.js +193 -0
  676. package/dist/workflows/discovery.js.map +1 -0
  677. package/dist/workflows/executor.d.ts +83 -0
  678. package/dist/workflows/executor.d.ts.map +1 -0
  679. package/dist/workflows/executor.js +624 -0
  680. package/dist/workflows/executor.js.map +1 -0
  681. package/dist/workflows/runners/approval.d.ts +18 -0
  682. package/dist/workflows/runners/approval.d.ts.map +1 -0
  683. package/dist/workflows/runners/approval.js +34 -0
  684. package/dist/workflows/runners/approval.js.map +1 -0
  685. package/dist/workflows/runners/bash.d.ts +13 -0
  686. package/dist/workflows/runners/bash.d.ts.map +1 -0
  687. package/dist/workflows/runners/bash.js +143 -0
  688. package/dist/workflows/runners/bash.js.map +1 -0
  689. package/dist/workflows/runners/cancel.d.ts +10 -0
  690. package/dist/workflows/runners/cancel.d.ts.map +1 -0
  691. package/dist/workflows/runners/cancel.js +19 -0
  692. package/dist/workflows/runners/cancel.js.map +1 -0
  693. package/dist/workflows/runners/prompt.d.ts +28 -0
  694. package/dist/workflows/runners/prompt.d.ts.map +1 -0
  695. package/dist/workflows/runners/prompt.js +212 -0
  696. package/dist/workflows/runners/prompt.js.map +1 -0
  697. package/dist/workflows/runners/script.d.ts +17 -0
  698. package/dist/workflows/runners/script.d.ts.map +1 -0
  699. package/dist/workflows/runners/script.js +155 -0
  700. package/dist/workflows/runners/script.js.map +1 -0
  701. package/dist/workflows/runners/types.d.ts +51 -0
  702. package/dist/workflows/runners/types.d.ts.map +1 -0
  703. package/dist/workflows/runners/types.js +13 -0
  704. package/dist/workflows/runners/types.js.map +1 -0
  705. package/dist/workflows/schemas/workflow.d.ts +166 -0
  706. package/dist/workflows/schemas/workflow.d.ts.map +1 -0
  707. package/dist/workflows/schemas/workflow.js +437 -0
  708. package/dist/workflows/schemas/workflow.js.map +1 -0
  709. package/hooks/hooks.json +11 -0
  710. package/package.json +7 -3
  711. package/scripts/offline-install.sh +19 -6
  712. package/selectors.json +41 -0
  713. /package/commands/{cg-explore.md → ss-explore.md} +0 -0
  714. /package/commands/{cg-impact.md → ss-impact.md} +0 -0
  715. /package/commands/{cg-relink.md → ss-relink.md} +0 -0
  716. /package/commands/{cg-spec.md → ss-spec.md} +0 -0
  717. /package/commands/{cg-sync.md → ss-sync.md} +0 -0
  718. /package/commands/{cg-trace.md → ss-trace.md} +0 -0
@@ -0,0 +1,336 @@
1
+ name: claude-design-implement
2
+ description: Import a Claude Design (live URL or a designer handoff bundle) — snapshot + tokens + source record — draft the spec, gate at review, write the spec — ready to hand off to /ss-implement.
3
+ tags: [spec, ui, claude-design, default]
4
+ requires: [specship, git]
5
+
6
+ # Worktree isolation: the spec draft and snapshot live in the user's
7
+ # working tree (not the worktree) so the artifacts survive the run,
8
+ # but the worktree gives the spec author a clean diff to review and
9
+ # means a rejected run leaves no half-written specs/<slug>.md.
10
+ worktree:
11
+ enabled: true
12
+
13
+ # Two entry shapes (provide exactly one source):
14
+ # - CONNECTOR_URL — a live claude.ai/design URL (the `/ss-design-implement`
15
+ # command). The snapshot node fetches it, preferring the `designer` MCP.
16
+ # - HANDOFF_DIR — a designer handoff bundle already on disk (the
17
+ # `/ss-design-loop` command, after the human-tasted loop + designer_handoff).
18
+ # The snapshot node reads files straight from the bundle — no fetch, no CDP.
19
+ # Optional inputs default to "" (see the CLI's declared-default handling), so a
20
+ # `$INPUT.X` reference to an omitted optional input resolves to "" rather than
21
+ # throwing — that is what lets a single snapshot node branch on whichever
22
+ # source was supplied.
23
+ inputs:
24
+ - name: CONNECTOR_URL
25
+ description: A live Claude Design URL (https://claude.ai/design/p/<id>/?file=<name>.html). Provide this OR HANDOFF_DIR.
26
+ required: false
27
+ default: ""
28
+ - name: HANDOFF_DIR
29
+ description: Path to a designer handoff bundle (artifacts/<key>/handoff-<ts>/) containing project/ + decision-record.md. Provide this OR CONNECTOR_URL.
30
+ required: false
31
+ default: ""
32
+ - name: CHOSEN_FILE
33
+ description: When importing from HANDOFF_DIR, the variant filename inside project/ to spec (e.g. "dashboard.html"). Omit if the bundle has a single obvious file.
34
+ required: false
35
+ default: ""
36
+ - name: FILE_LABEL
37
+ description: Human label for the imported file (e.g. "Data Flow")
38
+ required: true
39
+ - name: SLUG
40
+ description: Kebab-case directory name under specs/ (e.g. "data-flow")
41
+ required: true
42
+ - name: OWNER
43
+ description: Spec owner — used in frontmatter when set
44
+ required: false
45
+ default: ""
46
+ - name: PRIORITY
47
+ description: high / medium / low — used in frontmatter when set
48
+ required: false
49
+ default: ""
50
+
51
+ systemPromptAppend: |
52
+ You are implementing a Claude Design import for SpecShip.
53
+
54
+ The fidelity principle: never paraphrase or summarise design content
55
+ when capturing it. The snapshot HTML and tokens.css are the
56
+ zero-loss reference layer; the spec captures contract only (behaviour,
57
+ accessibility, responsive, interaction states, data shape).
58
+
59
+ There are two import shapes — exactly one source input is non-empty:
60
+ - HANDOFF_DIR set → read the design files straight off disk from the
61
+ designer handoff bundle. No network, no CDP, no MCP fetch.
62
+ - CONNECTOR_URL set → pull the live design. Prefer the `designer`
63
+ MCP (it reads the real rendered HTML over CDP); a plain fetch of a
64
+ claude.ai/design URL returns only a ~1 KB loader shell.
65
+
66
+ Either way: save the source byte-for-byte to specs/$INPUT.SLUG/snapshot.html.
67
+ Never edit the snapshot during this workflow.
68
+
69
+ nodes:
70
+ - id: snapshot
71
+ kind: prompt
72
+ output_type: snapshot_summary
73
+ allowed_tools:
74
+ - Read
75
+ - Write
76
+ - Bash
77
+ - mcp__specship__specship_explore
78
+ - mcp__specship__specship_search
79
+ - mcp__specship__designer_snapshot
80
+ - mcp__specship__designer_handoff
81
+ prompt: |
82
+ File label: $INPUT.FILE_LABEL
83
+ Slug: $INPUT.SLUG
84
+ Handoff dir: $INPUT.HANDOFF_DIR
85
+ Chosen file: $INPUT.CHOSEN_FILE
86
+ Source URL: $INPUT.CONNECTOR_URL
87
+
88
+ Goal: snapshot the Claude Design source into specs/$INPUT.SLUG/
89
+ so the rest of the workflow has a zero-loss reference layer.
90
+
91
+ Exactly one of "Handoff dir" or "Source URL" above is non-empty.
92
+ If BOTH are empty, stop and report the error — there is nothing to
93
+ import. Pick the branch by which one is set.
94
+
95
+ 1. Create the directory `specs/$INPUT.SLUG/` if it doesn't exist.
96
+
97
+ ── BRANCH A — Handoff dir is set (preferred; reads disk, no fetch) ──
98
+
99
+ A1. Locate the chosen design file inside the bundle:
100
+ - If "Chosen file" is set, use `$INPUT.HANDOFF_DIR/project/$INPUT.CHOSEN_FILE`.
101
+ - Else list `$INPUT.HANDOFF_DIR/project/`: if there is exactly one
102
+ top-level `.html`, use it; if several, STOP and report the
103
+ candidate filenames, asking the caller to re-run with CHOSEN_FILE.
104
+ A2. Copy that file BYTE-FOR-BYTE to `specs/$INPUT.SLUG/snapshot.html`
105
+ (use `cp`, do not re-render). Copy any CSS / JS / asset files it
106
+ references from `project/` alongside it.
107
+ A3. Write `specs/$INPUT.SLUG/source.md` as the import audit record,
108
+ then APPEND the bundle's decision record verbatim — it is the
109
+ richest provenance you have (every prompt + reply + the human's
110
+ final reaction):
111
+
112
+ ```markdown
113
+ # $INPUT.FILE_LABEL — Claude Design import (handoff bundle)
114
+
115
+ **Imported:** <today's date in YYYY-MM-DD>
116
+ **Handoff bundle:** $INPUT.HANDOFF_DIR
117
+ **Chosen file:** <the file you copied>
118
+
119
+ **Snapshot:** snapshot.html (byte-for-byte capture)
120
+ **Tokens:** tokens.css (extracted CSS custom properties)
121
+
122
+ ## Design decision record (verbatim)
123
+
124
+ <full contents of $INPUT.HANDOFF_DIR/decision-record.md, copied in
125
+ unchanged — if that file is missing, say so here>
126
+ ```
127
+
128
+ ── BRANCH B — Source URL is set (live fetch) ──
129
+
130
+ B1. Fetch the design content from $INPUT.CONNECTOR_URL. Try in order:
131
+ a. The `designer` MCP — `mcp__specship__designer_snapshot`
132
+ (reads the real rendered HTML over CDP from inside the
133
+ cross-origin preview iframe). This is the only path that
134
+ reliably returns the real design for a claude.ai/design URL.
135
+ b. Any other Claude Design MCP connector tool in this session
136
+ (look for `mcp__*design*`), or the `figma-implement-design`
137
+ / `figma-use` skill if loaded.
138
+ c. A direct `curl` of the URL, as a last resort (warning: for
139
+ claude.ai/design this usually returns only a loader shell).
140
+ Save the FULL rendered HTML byte-for-byte to
141
+ `specs/$INPUT.SLUG/snapshot.html`. Do NOT filter, summarise, or
142
+ re-format. Save any linked CSS / asset files alongside.
143
+ B2. Write `specs/$INPUT.SLUG/source.md` with the import audit record:
144
+
145
+ ```markdown
146
+ # $INPUT.FILE_LABEL — Claude Design import
147
+
148
+ **Imported:** <today's date in YYYY-MM-DD>
149
+ **Connector URL:** $INPUT.CONNECTOR_URL
150
+ **Project ID:** <extracted from the URL — the segment after /p/>
151
+ **File:** $INPUT.FILE_LABEL
152
+
153
+ **Snapshot:** snapshot.html (byte-for-byte capture)
154
+ **Tokens:** tokens.css (extracted CSS custom properties)
155
+
156
+ **Original prompt:**
157
+ > Import this Claude Design project: $INPUT.CONNECTOR_URL
158
+ > Implement: $INPUT.FILE_LABEL
159
+ ```
160
+
161
+ ── BOTH BRANCHES ──
162
+
163
+ 4. Extract CSS custom properties + literal token-like values
164
+ (colors, spacing, font sizes, radii, transitions) from the
165
+ snapshot to `specs/$INPUT.SLUG/tokens.css`. Use
166
+ `specship_explore` first to find the project's existing token
167
+ system — if a value in the snapshot matches an existing
168
+ project token, map it by name instead of duplicating.
169
+
170
+ Output: a ≤250-word summary covering:
171
+ - Which branch ran and the file captured.
172
+ - Snapshot structure (top-level layout, key components).
173
+ - Token mapping (which match existing project tokens, which are
174
+ new and added to tokens.css).
175
+ - Any visible interaction or state cues in the CSS (`:hover`,
176
+ `:focus`, `:disabled`, `[aria-*]` selectors) the spec
177
+ author should be aware of.
178
+ - For Branch A: note that source.md carries the verbatim decision
179
+ record — the draft step should mine it for stated behaviour.
180
+
181
+ - id: draft_spec
182
+ kind: prompt
183
+ depends_on: [snapshot]
184
+ output_type: spec_markdown
185
+ allowed_tools:
186
+ - Read
187
+ - mcp__specship__specship_explore
188
+ - mcp__specship__specship_search
189
+ - mcp__specship__specship_node
190
+ - mcp__specship__specship_spec
191
+ prompt: |
192
+ Use the spec-author skill (~/.claude/skills/spec-author/SKILL.md
193
+ and its references/) to draft a SpecShip-compatible spec for the
194
+ Claude Design import. Inputs available on disk:
195
+
196
+ - specs/$INPUT.SLUG/snapshot.html (visual + structural source)
197
+ - specs/$INPUT.SLUG/tokens.css (design tokens)
198
+ - specs/$INPUT.SLUG/source.md (audit record)
199
+
200
+ Spec scope: $INPUT.FILE_LABEL component(s).
201
+ Optional inputs: owner=$INPUT.OWNER priority=$INPUT.PRIORITY
202
+ (an empty value means "not provided" — use "[needs review]").
203
+
204
+ If `source.md` contains a "Design decision record (verbatim)"
205
+ section (a handoff-bundle import), READ IT FIRST and mine it for
206
+ contract: interaction states, failure modes, data shapes, and the
207
+ human's stated intent are often spelled out in that transcript.
208
+ Prefer what the record states over guessing; reserve [needs review]
209
+ for items genuinely absent from both the snapshot and the record.
210
+
211
+ Cover, as separate REQs:
212
+ - Behavioural contract (what the component renders, given what data).
213
+ - Each visible state (default, hover, focused, pressed, disabled,
214
+ loading, error, empty) — derive from the CSS, gap-fill the rest.
215
+ - Accessibility (keyboard nav, ARIA roles, focus order, contrast,
216
+ screen-reader behaviour).
217
+ - Responsive behaviour (breakpoints by name, not pixels).
218
+ - Data shape + failure-mode contracts.
219
+ - Performance contract (initial render budget, interaction
220
+ latency, if applicable).
221
+
222
+ DO NOT put exact hex colors, pixel values, font names, or animation
223
+ durations in the spec. Reference design tokens by name
224
+ (`MUST use the --error color token`). The values themselves live
225
+ in tokens.css.
226
+
227
+ Embed the import-source record in the spec's frontmatter so the
228
+ spec carries its provenance:
229
+
230
+ ```yaml
231
+ ---
232
+ id: <SLUG-DOC>
233
+ title: <FILE_LABEL>
234
+ owner: <OWNER or "[needs review]">
235
+ priority: <PRIORITY or "[needs review]">
236
+ source: specs/<SLUG>/source.md
237
+ snapshot: specs/<SLUG>/snapshot.html
238
+ tokens: specs/<SLUG>/tokens.css
239
+ ---
240
+ ```
241
+
242
+ Output: the full Markdown body of the proposed spec
243
+ (with frontmatter, embedded `<!-- id: -->` markers, RFC 2119
244
+ keywords, acceptance bullets with .A1/.A2 IDs). DO NOT write
245
+ it to disk yet — the next node is a review gate.
246
+
247
+ - id: gap_review
248
+ kind: approval
249
+ depends_on: [draft_spec]
250
+ message: |
251
+ Spec draft ready for $INPUT.FILE_LABEL.
252
+
253
+ Walk the [needs review] markers and gap-fill questions, then
254
+ approve to write the file. Reject with feedback to revise.
255
+
256
+ ─────── DRAFT ───────
257
+ $draft_spec.output
258
+ capture_response: true
259
+ on_reject:
260
+ prompt: |
261
+ The draft was rejected with this feedback. Revise the spec
262
+ per the feedback; keep ALL existing REQ IDs stable so any
263
+ downstream tracking survives the rewrite.
264
+
265
+ Feedback:
266
+ $gap_review.output
267
+
268
+ Current draft:
269
+ $draft_spec.output
270
+
271
+ Output the revised draft.
272
+ max_attempts: 3
273
+
274
+ - id: write_spec
275
+ kind: prompt
276
+ depends_on: [gap_review]
277
+ output_type: file_path
278
+ allowed_tools:
279
+ - Write
280
+ - Read
281
+ - Bash
282
+ prompt: |
283
+ Write the approved spec to `specs/$INPUT.SLUG.md` using the Write
284
+ tool. The spec content is the DRAFT below; the reviewer's gate
285
+ response carries the gap-fill answers / edits to fold in.
286
+
287
+ APPROVED DRAFT (this is the spec to write):
288
+ $draft_spec.output
289
+
290
+ REVIEWER GATE RESPONSE (gap-fill answers / edits — apply these,
291
+ resolving any `[needs review]` markers the reviewer answered; if it
292
+ is just "approved" with no substantive content, write the draft as
293
+ is):
294
+ $gap_review.output
295
+
296
+ Rules:
297
+ - Write the full spec Markdown (frontmatter + REQ bodies +
298
+ acceptance bullets), NOT the reviewer's comment verbatim.
299
+ - Resolve `[needs review]` markers the reviewer answered; leave
300
+ any they didn't as `[needs review]`.
301
+ - Keep ALL existing REQ IDs stable.
302
+ - If `specs/$INPUT.SLUG.md` already exists (re-importing an
303
+ iteration), APPEND new requirements instead of overwriting and
304
+ preserve existing REQ IDs. Tell the user explicitly what you did.
305
+
306
+ Then run:
307
+ specship sync
308
+
309
+ Output: the relative path of the file written + the first REQ
310
+ ID (e.g. "REQ-DATA-FLOW-001") so the next step can hand it to
311
+ /ss-implement.
312
+
313
+ - id: handoff
314
+ kind: prompt
315
+ depends_on: [write_spec]
316
+ output_type: handoff_message
317
+ allowed_tools:
318
+ - Read
319
+ prompt: |
320
+ The spec is now indexed. Output a short hand-off message for the
321
+ user with EXACTLY these elements:
322
+
323
+ 1. The path of the spec file: `specs/$INPUT.SLUG.md`.
324
+ 2. The full list of REQ IDs the spec defines, one per line.
325
+ 3. The reference files the implementation phase should read:
326
+ - specs/$INPUT.SLUG/snapshot.html
327
+ - specs/$INPUT.SLUG/tokens.css
328
+ - specs/$INPUT.SLUG/source.md
329
+ 4. The exact next command:
330
+ /ss-implement <first REQ ID>
331
+ 5. A one-line reminder that the implementation step should
332
+ load the snapshot for visual fidelity — the spec covers
333
+ contract only.
334
+
335
+ Keep the message ≤200 words. The user is about to switch from
336
+ this workflow to the implement workflow; this is the bridge.
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Bundled default workflows.
3
+ *
4
+ * Workflow YAMLs are stored as `.yaml` files in this directory and
5
+ * compile-time embedded by reading them at build time. We don't use a
6
+ * code-generator (matches the rest of the codebase that avoids generated
7
+ * files); instead, the build's `copy-assets` script copies the .yaml
8
+ * files into `dist/workflows/defaults/`, and this module reads them at
9
+ * import time from `__dirname`.
10
+ *
11
+ * Bundled workflows (v1):
12
+ * - spec-implement.yaml — implement an unimplemented spec
13
+ * - spec-fix.yaml — fix a drifted / broken link
14
+ * - spec-verify.yaml — run verification across `implemented` links
15
+ * - spec-relink.yaml — re-attach an orphaned link
16
+ *
17
+ * See workflow-discovery.ts for the three-tier precedence model.
18
+ */
19
+ export interface BundledWorkflow {
20
+ /** Filename stem (no .yaml extension). */
21
+ name: string;
22
+ /** Raw YAML source. */
23
+ yaml: string;
24
+ }
25
+ export declare const bundledDefaults: BundledWorkflow[];
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workflows/defaults/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AASD,eAAO,MAAM,eAAe,EAAE,eAAe,EAAmB,CAAC"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Bundled default workflows.
4
+ *
5
+ * Workflow YAMLs are stored as `.yaml` files in this directory and
6
+ * compile-time embedded by reading them at build time. We don't use a
7
+ * code-generator (matches the rest of the codebase that avoids generated
8
+ * files); instead, the build's `copy-assets` script copies the .yaml
9
+ * files into `dist/workflows/defaults/`, and this module reads them at
10
+ * import time from `__dirname`.
11
+ *
12
+ * Bundled workflows (v1):
13
+ * - spec-implement.yaml — implement an unimplemented spec
14
+ * - spec-fix.yaml — fix a drifted / broken link
15
+ * - spec-verify.yaml — run verification across `implemented` links
16
+ * - spec-relink.yaml — re-attach an orphaned link
17
+ *
18
+ * See workflow-discovery.ts for the three-tier precedence model.
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.bundledDefaults = void 0;
55
+ const fs = __importStar(require("fs"));
56
+ const path = __importStar(require("path"));
57
+ /**
58
+ * Lazy-loaded bundled defaults from `<dist|src>/workflows/defaults/*.yaml`.
59
+ * Populated on first read. Always re-reads from disk in tests where the
60
+ * file set may have been mutated; production callers call once at startup.
61
+ */
62
+ let cached = null;
63
+ exports.bundledDefaults = loadDefaults();
64
+ function loadDefaults() {
65
+ if (cached)
66
+ return cached;
67
+ const out = [];
68
+ let entries;
69
+ try {
70
+ entries = fs.readdirSync(__dirname, { withFileTypes: true });
71
+ }
72
+ catch {
73
+ cached = [];
74
+ return cached;
75
+ }
76
+ for (const entry of entries) {
77
+ if (!entry.isFile())
78
+ continue;
79
+ const lower = entry.name.toLowerCase();
80
+ if (!lower.endsWith('.yaml') && !lower.endsWith('.yml'))
81
+ continue;
82
+ try {
83
+ const yaml = fs.readFileSync(path.join(__dirname, entry.name), 'utf-8');
84
+ const stem = entry.name.replace(/\.(ya?ml)$/i, '');
85
+ out.push({ name: stem, yaml });
86
+ }
87
+ catch {
88
+ // Skip unreadable files; discovery will surface the gap on next load.
89
+ }
90
+ }
91
+ cached = out;
92
+ return cached;
93
+ }
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/workflows/defaults/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAS7B;;;;GAIG;AACH,IAAI,MAAM,GAA6B,IAAI,CAAC;AAE/B,QAAA,eAAe,GAAsB,YAAY,EAAE,CAAC;AAEjE,SAAS,YAAY;IACnB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,SAAS;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QAClE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACnD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,CAAC;IACb,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,214 @@
1
+ name: spec-author
2
+ description: Author a new spec. Draft → gap-fill review → quality review → final approval → write file.
3
+ tags: [spec, default]
4
+ requires: [specship, git]
5
+
6
+ # Worktree isolation isn't strictly needed for spec authoring (no code
7
+ # changes) — but enabling it keeps the artifact directory under the same
8
+ # umbrella the other spec workflows use, and a future expansion that adds
9
+ # example-code touches stays safe.
10
+ worktree:
11
+ enabled: true
12
+
13
+ inputs:
14
+ - name: DESCRIPTION
15
+ description: One-line description of the feature you want to spec
16
+ required: true
17
+ - name: PARENT_DOC
18
+ description: Optional spec ID of an existing doc to attach the new requirements under
19
+ required: false
20
+ - name: OWNER
21
+ description: Owner team or person (e.g. "security", "payments-team")
22
+ required: false
23
+ - name: PRIORITY
24
+ description: high / medium / low
25
+ required: false
26
+
27
+ systemPromptAppend: |
28
+ You are authoring a SpecShip-compatible Markdown spec. Use the
29
+ spec-author skill loop and references throughout this workflow.
30
+ The output of every node should be markdown that is ready for the
31
+ next stage — do NOT write the file until the `write_file` node.
32
+
33
+ nodes:
34
+ - id: ground
35
+ kind: prompt
36
+ output_type: code_grounding
37
+ allowed_tools:
38
+ - mcp__specship__specship_explore
39
+ - mcp__specship__specship_search
40
+ - mcp__specship__specship_files
41
+ - Read
42
+ prompt: |
43
+ Feature: $INPUT.DESCRIPTION
44
+
45
+ Walk the codebase to find where this feature would live:
46
+
47
+ 1. Use specship_explore on terms drawn from the description to
48
+ surface relevant existing symbols.
49
+ 2. Note any existing conventions, similar features, or shared
50
+ primitives the new spec should align with.
51
+ 3. List candidate file paths + qualified symbol names that the
52
+ new implementation might touch — these become the `implementations:`
53
+ block of the spec.
54
+
55
+ If this is greenfield (no relevant existing code), say so explicitly
56
+ and propose a target directory under src/ where the implementation
57
+ will live.
58
+
59
+ Output: a ≤300-word grounding report — paths, conventions, and
60
+ candidate symbols. Do NOT write the spec yet.
61
+
62
+ - id: draft
63
+ kind: prompt
64
+ depends_on: [ground]
65
+ output_type: spec_draft
66
+ allowed_tools:
67
+ - mcp__specship__specship_spec
68
+ - mcp__specship__specship_explore
69
+ - mcp__specship__specship_node
70
+ - Read
71
+ prompt: |
72
+ Feature: $INPUT.DESCRIPTION
73
+ Optional parent doc: $INPUT.PARENT_DOC
74
+ Optional owner: $INPUT.OWNER
75
+ Optional priority: $INPUT.PRIORITY
76
+
77
+ Code grounding:
78
+ $ground.output
79
+
80
+ Produce a complete first-draft Markdown spec following the spec-author
81
+ skill's `references/format.md`:
82
+
83
+ - YAML frontmatter with id/title/owner/priority (use the inputs if
84
+ provided; mark as `[needs review]` if not).
85
+ - Embedded `<!-- id: -->` markers above every heading.
86
+ - RFC 2119 keyword (MUST / SHOULD / MAY) in each requirement title.
87
+ - One concern per requirement.
88
+ - `## Acceptance` section with bulleted criteria, each carrying its
89
+ own `.A<N>` ID. Cover both happy path and failure path.
90
+ - Optional `implementations:` block, populated from the grounding
91
+ report (or empty for greenfield).
92
+ - Wherever the description doesn't tell you something, insert a
93
+ `[needs user confirmation]` marker — DO NOT invent.
94
+
95
+ Output: the full spec markdown, ready for the gap-fill review.
96
+
97
+ - id: gap_review
98
+ kind: approval
99
+ depends_on: [draft]
100
+ message: |
101
+ Draft is ready. The gap-fill questions below identify areas the
102
+ description didn't cover. Approve with answers (e.g. "owner: security,
103
+ TTL: 1h, on non-existent email: 200 OK"), or reject with feedback to
104
+ revise.
105
+
106
+ Draft:
107
+ $draft.output
108
+
109
+ Gap-fill questions for THIS draft — walk references/gap-questions.md
110
+ and surface only the unanswered ones (max 5):
111
+ [the agent fills these in based on the draft above]
112
+ capture_response: true
113
+ on_reject:
114
+ prompt: |
115
+ The draft was rejected with this feedback. Revise the draft to
116
+ address it. Keep all existing IDs stable so any pre-existing links
117
+ survive.
118
+
119
+ Feedback:
120
+ $gap_review.output
121
+ max_attempts: 3
122
+
123
+ - id: incorporate
124
+ kind: prompt
125
+ depends_on: [gap_review]
126
+ output_type: spec_draft
127
+ allowed_tools:
128
+ - Read
129
+ prompt: |
130
+ Apply the gap-fill answers to the draft. Replace `[needs user
131
+ confirmation]` markers with the user's answers where given; leave
132
+ others as `[needs review]` if they explicitly skipped.
133
+
134
+ Draft:
135
+ $draft.output
136
+
137
+ Answers:
138
+ $gap_review.output
139
+
140
+ Output: the updated spec markdown.
141
+
142
+ - id: quality_review
143
+ kind: prompt
144
+ depends_on: [incorporate]
145
+ output_type: review_findings
146
+ allowed_tools:
147
+ - mcp__specship__specship_explore
148
+ - mcp__specship__specship_node
149
+ - mcp__specship__specship_search
150
+ - Read
151
+ prompt: |
152
+ Run the spec-author skill's `references/review-checklist.md` against
153
+ this draft and produce a structured findings list.
154
+
155
+ Updated draft:
156
+ $incorporate.output
157
+
158
+ Group findings into STRUCTURAL (blocks the file write), QUALITY (block
159
+ on critical, warn on minor), HYGIENE (warn only). For each, give:
160
+ line number, what's wrong, suggested fix. Don't be polite — sharp
161
+ signal is more useful than soft language.
162
+
163
+ If any STRUCTURAL findings exist, propose a corrected version of the
164
+ affected sections inline.
165
+
166
+ - id: finalize
167
+ kind: approval
168
+ depends_on: [quality_review]
169
+ message: |
170
+ Quality review complete. Approve to write the spec file, or reject to
171
+ revise further.
172
+
173
+ Review:
174
+ $quality_review.output
175
+
176
+ Final draft:
177
+ $incorporate.output
178
+ capture_response: true
179
+ on_reject:
180
+ prompt: |
181
+ Final approval was rejected. Revise the draft per the feedback,
182
+ re-run the quality review pass, and produce a new draft.
183
+
184
+ Feedback:
185
+ $finalize.output
186
+
187
+ Current draft:
188
+ $incorporate.output
189
+ max_attempts: 2
190
+
191
+ - id: write_file
192
+ kind: prompt
193
+ depends_on: [finalize]
194
+ output_type: file_path
195
+ allowed_tools:
196
+ - Write
197
+ - Read
198
+ - Bash
199
+ prompt: |
200
+ Write the approved spec to disk.
201
+
202
+ Final draft:
203
+ $incorporate.output
204
+
205
+ Use the `Write` tool to create `specs/<slug>.md` at the project root,
206
+ where `<slug>` is derived from the feature name (kebab-case, no date
207
+ prefix). If a file with that name already exists, APPEND the new
208
+ requirements to it (preserving any pre-existing content) instead of
209
+ overwriting; the user will resolve the merge in review.
210
+
211
+ After writing:
212
+ - Run `specship sync` to index the new spec.
213
+ - Output the relative path of the file written + a one-line note
214
+ about what to do next (typically: `/ss-implement <REQ-ID>`).