@specship/specship 0.11.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 (879) hide show
  1. package/.claude-plugin/plugin.json +6 -0
  2. package/LICENSE +21 -0
  3. package/README.md +583 -0
  4. package/agents/specship-explorer.md +29 -0
  5. package/commands/ss-behaviour.md +116 -0
  6. package/commands/ss-check.md +43 -0
  7. package/commands/ss-design-implement.md +84 -0
  8. package/commands/ss-design-loop.md +125 -0
  9. package/commands/ss-explore.md +43 -0
  10. package/commands/ss-spec.md +118 -0
  11. package/dist/activation/starter-prompt.d.ts +57 -0
  12. package/dist/activation/starter-prompt.d.ts.map +1 -0
  13. package/dist/activation/starter-prompt.js +164 -0
  14. package/dist/activation/starter-prompt.js.map +1 -0
  15. package/dist/analytics/specship-impact.d.ts +72 -0
  16. package/dist/analytics/specship-impact.d.ts.map +1 -0
  17. package/dist/analytics/specship-impact.js +216 -0
  18. package/dist/analytics/specship-impact.js.map +1 -0
  19. package/dist/behaviour/behaviour-surface.d.ts +59 -0
  20. package/dist/behaviour/behaviour-surface.d.ts.map +1 -0
  21. package/dist/behaviour/behaviour-surface.js +112 -0
  22. package/dist/behaviour/behaviour-surface.js.map +1 -0
  23. package/dist/bin/node-version-check.d.ts +37 -0
  24. package/dist/bin/node-version-check.d.ts.map +1 -0
  25. package/dist/bin/node-version-check.js +79 -0
  26. package/dist/bin/node-version-check.js.map +1 -0
  27. package/dist/bin/specship.d.ts +25 -0
  28. package/dist/bin/specship.d.ts.map +1 -0
  29. package/dist/bin/specship.js +2823 -0
  30. package/dist/bin/specship.js.map +1 -0
  31. package/dist/bin/uninstall.d.ts +13 -0
  32. package/dist/bin/uninstall.d.ts.map +1 -0
  33. package/dist/bin/uninstall.js +35 -0
  34. package/dist/bin/uninstall.js.map +1 -0
  35. package/dist/context/formatter.d.ts +30 -0
  36. package/dist/context/formatter.d.ts.map +1 -0
  37. package/dist/context/formatter.js +263 -0
  38. package/dist/context/formatter.js.map +1 -0
  39. package/dist/context/index.d.ts +119 -0
  40. package/dist/context/index.d.ts.map +1 -0
  41. package/dist/context/index.js +1289 -0
  42. package/dist/context/index.js.map +1 -0
  43. package/dist/context/markers.d.ts +19 -0
  44. package/dist/context/markers.d.ts.map +1 -0
  45. package/dist/context/markers.js +22 -0
  46. package/dist/context/markers.js.map +1 -0
  47. package/dist/db/index.d.ts +103 -0
  48. package/dist/db/index.d.ts.map +1 -0
  49. package/dist/db/index.js +279 -0
  50. package/dist/db/index.js.map +1 -0
  51. package/dist/db/migrations.d.ts +44 -0
  52. package/dist/db/migrations.d.ts.map +1 -0
  53. package/dist/db/migrations.js +503 -0
  54. package/dist/db/migrations.js.map +1 -0
  55. package/dist/db/queries.d.ts +357 -0
  56. package/dist/db/queries.d.ts.map +1 -0
  57. package/dist/db/queries.js +1504 -0
  58. package/dist/db/queries.js.map +1 -0
  59. package/dist/db/schema.sql +451 -0
  60. package/dist/db/spec-queries.d.ts +130 -0
  61. package/dist/db/spec-queries.d.ts.map +1 -0
  62. package/dist/db/spec-queries.js +738 -0
  63. package/dist/db/spec-queries.js.map +1 -0
  64. package/dist/db/sqlite-adapter.d.ts +65 -0
  65. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  66. package/dist/db/sqlite-adapter.js +214 -0
  67. package/dist/db/sqlite-adapter.js.map +1 -0
  68. package/dist/designer/artifact-store.js +54 -0
  69. package/dist/designer/browser.js +141 -0
  70. package/dist/designer/cdp-ensure.js +60 -0
  71. package/dist/designer/cdp-env.js +18 -0
  72. package/dist/designer/cdp-trace.js +599 -0
  73. package/dist/designer/cross-platform.js +74 -0
  74. package/dist/designer/designer-controller.js +1413 -0
  75. package/dist/designer/file-panel.js +39 -0
  76. package/dist/designer/interstitials.js +97 -0
  77. package/dist/designer/oopif-reader.js +176 -0
  78. package/dist/designer/package-meta.js +18 -0
  79. package/dist/designer/preview-host.js +50 -0
  80. package/dist/designer/repo-root.js +31 -0
  81. package/dist/designer/run-state.js +353 -0
  82. package/dist/designer/session-store.js +59 -0
  83. package/dist/designer/ui-anchors.js +651 -0
  84. package/dist/directory.d.ts +67 -0
  85. package/dist/directory.d.ts.map +1 -0
  86. package/dist/directory.js +267 -0
  87. package/dist/directory.js.map +1 -0
  88. package/dist/enforce/enforce.d.ts +70 -0
  89. package/dist/enforce/enforce.d.ts.map +1 -0
  90. package/dist/enforce/enforce.js +125 -0
  91. package/dist/enforce/enforce.js.map +1 -0
  92. package/dist/errors.d.ts +136 -0
  93. package/dist/errors.d.ts.map +1 -0
  94. package/dist/errors.js +219 -0
  95. package/dist/errors.js.map +1 -0
  96. package/dist/extraction/dfm-extractor.d.ts +31 -0
  97. package/dist/extraction/dfm-extractor.d.ts.map +1 -0
  98. package/dist/extraction/dfm-extractor.js +151 -0
  99. package/dist/extraction/dfm-extractor.js.map +1 -0
  100. package/dist/extraction/generated-detection.d.ts +30 -0
  101. package/dist/extraction/generated-detection.d.ts.map +1 -0
  102. package/dist/extraction/generated-detection.js +80 -0
  103. package/dist/extraction/generated-detection.js.map +1 -0
  104. package/dist/extraction/grammars.d.ts +100 -0
  105. package/dist/extraction/grammars.d.ts.map +1 -0
  106. package/dist/extraction/grammars.js +426 -0
  107. package/dist/extraction/grammars.js.map +1 -0
  108. package/dist/extraction/index.d.ts +138 -0
  109. package/dist/extraction/index.d.ts.map +1 -0
  110. package/dist/extraction/index.js +1394 -0
  111. package/dist/extraction/index.js.map +1 -0
  112. package/dist/extraction/languages/c-cpp.d.ts +4 -0
  113. package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
  114. package/dist/extraction/languages/c-cpp.js +171 -0
  115. package/dist/extraction/languages/c-cpp.js.map +1 -0
  116. package/dist/extraction/languages/csharp.d.ts +3 -0
  117. package/dist/extraction/languages/csharp.d.ts.map +1 -0
  118. package/dist/extraction/languages/csharp.js +73 -0
  119. package/dist/extraction/languages/csharp.js.map +1 -0
  120. package/dist/extraction/languages/dart.d.ts +3 -0
  121. package/dist/extraction/languages/dart.d.ts.map +1 -0
  122. package/dist/extraction/languages/dart.js +192 -0
  123. package/dist/extraction/languages/dart.js.map +1 -0
  124. package/dist/extraction/languages/go.d.ts +3 -0
  125. package/dist/extraction/languages/go.d.ts.map +1 -0
  126. package/dist/extraction/languages/go.js +74 -0
  127. package/dist/extraction/languages/go.js.map +1 -0
  128. package/dist/extraction/languages/index.d.ts +10 -0
  129. package/dist/extraction/languages/index.d.ts.map +1 -0
  130. package/dist/extraction/languages/index.js +51 -0
  131. package/dist/extraction/languages/index.js.map +1 -0
  132. package/dist/extraction/languages/java.d.ts +3 -0
  133. package/dist/extraction/languages/java.d.ts.map +1 -0
  134. package/dist/extraction/languages/java.js +70 -0
  135. package/dist/extraction/languages/java.js.map +1 -0
  136. package/dist/extraction/languages/javascript.d.ts +3 -0
  137. package/dist/extraction/languages/javascript.d.ts.map +1 -0
  138. package/dist/extraction/languages/javascript.js +90 -0
  139. package/dist/extraction/languages/javascript.js.map +1 -0
  140. package/dist/extraction/languages/kotlin.d.ts +3 -0
  141. package/dist/extraction/languages/kotlin.d.ts.map +1 -0
  142. package/dist/extraction/languages/kotlin.js +259 -0
  143. package/dist/extraction/languages/kotlin.js.map +1 -0
  144. package/dist/extraction/languages/lua.d.ts +3 -0
  145. package/dist/extraction/languages/lua.d.ts.map +1 -0
  146. package/dist/extraction/languages/lua.js +150 -0
  147. package/dist/extraction/languages/lua.js.map +1 -0
  148. package/dist/extraction/languages/luau.d.ts +3 -0
  149. package/dist/extraction/languages/luau.d.ts.map +1 -0
  150. package/dist/extraction/languages/luau.js +37 -0
  151. package/dist/extraction/languages/luau.js.map +1 -0
  152. package/dist/extraction/languages/objc.d.ts +3 -0
  153. package/dist/extraction/languages/objc.d.ts.map +1 -0
  154. package/dist/extraction/languages/objc.js +133 -0
  155. package/dist/extraction/languages/objc.js.map +1 -0
  156. package/dist/extraction/languages/pascal.d.ts +3 -0
  157. package/dist/extraction/languages/pascal.d.ts.map +1 -0
  158. package/dist/extraction/languages/pascal.js +66 -0
  159. package/dist/extraction/languages/pascal.js.map +1 -0
  160. package/dist/extraction/languages/php.d.ts +3 -0
  161. package/dist/extraction/languages/php.d.ts.map +1 -0
  162. package/dist/extraction/languages/php.js +107 -0
  163. package/dist/extraction/languages/php.js.map +1 -0
  164. package/dist/extraction/languages/python.d.ts +3 -0
  165. package/dist/extraction/languages/python.d.ts.map +1 -0
  166. package/dist/extraction/languages/python.js +56 -0
  167. package/dist/extraction/languages/python.js.map +1 -0
  168. package/dist/extraction/languages/ruby.d.ts +3 -0
  169. package/dist/extraction/languages/ruby.d.ts.map +1 -0
  170. package/dist/extraction/languages/ruby.js +114 -0
  171. package/dist/extraction/languages/ruby.js.map +1 -0
  172. package/dist/extraction/languages/rust.d.ts +3 -0
  173. package/dist/extraction/languages/rust.d.ts.map +1 -0
  174. package/dist/extraction/languages/rust.js +109 -0
  175. package/dist/extraction/languages/rust.js.map +1 -0
  176. package/dist/extraction/languages/scala.d.ts +3 -0
  177. package/dist/extraction/languages/scala.d.ts.map +1 -0
  178. package/dist/extraction/languages/scala.js +139 -0
  179. package/dist/extraction/languages/scala.js.map +1 -0
  180. package/dist/extraction/languages/swift.d.ts +3 -0
  181. package/dist/extraction/languages/swift.d.ts.map +1 -0
  182. package/dist/extraction/languages/swift.js +91 -0
  183. package/dist/extraction/languages/swift.js.map +1 -0
  184. package/dist/extraction/languages/typescript.d.ts +3 -0
  185. package/dist/extraction/languages/typescript.d.ts.map +1 -0
  186. package/dist/extraction/languages/typescript.js +129 -0
  187. package/dist/extraction/languages/typescript.js.map +1 -0
  188. package/dist/extraction/liquid-extractor.d.ts +52 -0
  189. package/dist/extraction/liquid-extractor.d.ts.map +1 -0
  190. package/dist/extraction/liquid-extractor.js +313 -0
  191. package/dist/extraction/liquid-extractor.js.map +1 -0
  192. package/dist/extraction/mybatis-extractor.d.ts +48 -0
  193. package/dist/extraction/mybatis-extractor.d.ts.map +1 -0
  194. package/dist/extraction/mybatis-extractor.js +198 -0
  195. package/dist/extraction/mybatis-extractor.js.map +1 -0
  196. package/dist/extraction/parse-worker.d.ts +8 -0
  197. package/dist/extraction/parse-worker.d.ts.map +1 -0
  198. package/dist/extraction/parse-worker.js +94 -0
  199. package/dist/extraction/parse-worker.js.map +1 -0
  200. package/dist/extraction/specs/markdown-spec-extractor.d.ts +114 -0
  201. package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -0
  202. package/dist/extraction/specs/markdown-spec-extractor.js +699 -0
  203. package/dist/extraction/specs/markdown-spec-extractor.js.map +1 -0
  204. package/dist/extraction/specs/types.d.ts +39 -0
  205. package/dist/extraction/specs/types.d.ts.map +1 -0
  206. package/dist/extraction/specs/types.js +8 -0
  207. package/dist/extraction/specs/types.js.map +1 -0
  208. package/dist/extraction/svelte-extractor.d.ts +56 -0
  209. package/dist/extraction/svelte-extractor.d.ts.map +1 -0
  210. package/dist/extraction/svelte-extractor.js +272 -0
  211. package/dist/extraction/svelte-extractor.js.map +1 -0
  212. package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  213. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
  214. package/dist/extraction/tree-sitter-helpers.js +103 -0
  215. package/dist/extraction/tree-sitter-helpers.js.map +1 -0
  216. package/dist/extraction/tree-sitter-types.d.ts +193 -0
  217. package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
  218. package/dist/extraction/tree-sitter-types.js +10 -0
  219. package/dist/extraction/tree-sitter-types.js.map +1 -0
  220. package/dist/extraction/tree-sitter.d.ts +317 -0
  221. package/dist/extraction/tree-sitter.d.ts.map +1 -0
  222. package/dist/extraction/tree-sitter.js +3092 -0
  223. package/dist/extraction/tree-sitter.js.map +1 -0
  224. package/dist/extraction/vue-extractor.d.ts +51 -0
  225. package/dist/extraction/vue-extractor.d.ts.map +1 -0
  226. package/dist/extraction/vue-extractor.js +251 -0
  227. package/dist/extraction/vue-extractor.js.map +1 -0
  228. package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  229. package/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
  230. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  231. package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  232. package/dist/extraction/wasm-runtime-flags.d.ts +38 -0
  233. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
  234. package/dist/extraction/wasm-runtime-flags.js +106 -0
  235. package/dist/extraction/wasm-runtime-flags.js.map +1 -0
  236. package/dist/fitness/fitness.d.ts +75 -0
  237. package/dist/fitness/fitness.d.ts.map +1 -0
  238. package/dist/fitness/fitness.js +204 -0
  239. package/dist/fitness/fitness.js.map +1 -0
  240. package/dist/graph/index.d.ts +8 -0
  241. package/dist/graph/index.d.ts.map +1 -0
  242. package/dist/graph/index.js +13 -0
  243. package/dist/graph/index.js.map +1 -0
  244. package/dist/graph/maintainability.d.ts +115 -0
  245. package/dist/graph/maintainability.d.ts.map +1 -0
  246. package/dist/graph/maintainability.js +299 -0
  247. package/dist/graph/maintainability.js.map +1 -0
  248. package/dist/graph/queries.d.ts +106 -0
  249. package/dist/graph/queries.d.ts.map +1 -0
  250. package/dist/graph/queries.js +366 -0
  251. package/dist/graph/queries.js.map +1 -0
  252. package/dist/graph/traversal.d.ts +127 -0
  253. package/dist/graph/traversal.d.ts.map +1 -0
  254. package/dist/graph/traversal.js +531 -0
  255. package/dist/graph/traversal.js.map +1 -0
  256. package/dist/health/smoke-check.d.ts +85 -0
  257. package/dist/health/smoke-check.d.ts.map +1 -0
  258. package/dist/health/smoke-check.js +246 -0
  259. package/dist/health/smoke-check.js.map +1 -0
  260. package/dist/index.d.ts +674 -0
  261. package/dist/index.d.ts.map +1 -0
  262. package/dist/index.js +1473 -0
  263. package/dist/index.js.map +1 -0
  264. package/dist/installer/config-writer.d.ts +28 -0
  265. package/dist/installer/config-writer.d.ts.map +1 -0
  266. package/dist/installer/config-writer.js +91 -0
  267. package/dist/installer/config-writer.js.map +1 -0
  268. package/dist/installer/index.d.ts +100 -0
  269. package/dist/installer/index.d.ts.map +1 -0
  270. package/dist/installer/index.js +442 -0
  271. package/dist/installer/index.js.map +1 -0
  272. package/dist/installer/init-offer.d.ts +31 -0
  273. package/dist/installer/init-offer.d.ts.map +1 -0
  274. package/dist/installer/init-offer.js +30 -0
  275. package/dist/installer/init-offer.js.map +1 -0
  276. package/dist/installer/instructions-template.d.ts +36 -0
  277. package/dist/installer/instructions-template.d.ts.map +1 -0
  278. package/dist/installer/instructions-template.js +57 -0
  279. package/dist/installer/instructions-template.js.map +1 -0
  280. package/dist/installer/targets/claude.d.ts +146 -0
  281. package/dist/installer/targets/claude.d.ts.map +1 -0
  282. package/dist/installer/targets/claude.js +864 -0
  283. package/dist/installer/targets/claude.js.map +1 -0
  284. package/dist/installer/targets/registry.d.ts +19 -0
  285. package/dist/installer/targets/registry.d.ts.map +1 -0
  286. package/dist/installer/targets/registry.js +31 -0
  287. package/dist/installer/targets/registry.js.map +1 -0
  288. package/dist/installer/targets/shared.d.ts +76 -0
  289. package/dist/installer/targets/shared.d.ts.map +1 -0
  290. package/dist/installer/targets/shared.js +260 -0
  291. package/dist/installer/targets/shared.js.map +1 -0
  292. package/dist/installer/targets/types.d.ts +95 -0
  293. package/dist/installer/targets/types.d.ts.map +1 -0
  294. package/dist/installer/targets/types.js +12 -0
  295. package/dist/installer/targets/types.js.map +1 -0
  296. package/dist/isolation/worktree.d.ts +65 -0
  297. package/dist/isolation/worktree.d.ts.map +1 -0
  298. package/dist/isolation/worktree.js +231 -0
  299. package/dist/isolation/worktree.js.map +1 -0
  300. package/dist/mcp/daemon-paths.d.ts +46 -0
  301. package/dist/mcp/daemon-paths.d.ts.map +1 -0
  302. package/dist/mcp/daemon-paths.js +125 -0
  303. package/dist/mcp/daemon-paths.js.map +1 -0
  304. package/dist/mcp/daemon.d.ts +161 -0
  305. package/dist/mcp/daemon.d.ts.map +1 -0
  306. package/dist/mcp/daemon.js +403 -0
  307. package/dist/mcp/daemon.js.map +1 -0
  308. package/dist/mcp/designer-tools.d.ts +33 -0
  309. package/dist/mcp/designer-tools.d.ts.map +1 -0
  310. package/dist/mcp/designer-tools.js +313 -0
  311. package/dist/mcp/designer-tools.js.map +1 -0
  312. package/dist/mcp/engine.d.ts +105 -0
  313. package/dist/mcp/engine.d.ts.map +1 -0
  314. package/dist/mcp/engine.js +270 -0
  315. package/dist/mcp/engine.js.map +1 -0
  316. package/dist/mcp/fitness-tool.d.ts +12 -0
  317. package/dist/mcp/fitness-tool.d.ts.map +1 -0
  318. package/dist/mcp/fitness-tool.js +46 -0
  319. package/dist/mcp/fitness-tool.js.map +1 -0
  320. package/dist/mcp/index.d.ts +112 -0
  321. package/dist/mcp/index.d.ts.map +1 -0
  322. package/dist/mcp/index.js +477 -0
  323. package/dist/mcp/index.js.map +1 -0
  324. package/dist/mcp/maintainability-tool.d.ts +13 -0
  325. package/dist/mcp/maintainability-tool.d.ts.map +1 -0
  326. package/dist/mcp/maintainability-tool.js +64 -0
  327. package/dist/mcp/maintainability-tool.js.map +1 -0
  328. package/dist/mcp/proxy.d.ts +81 -0
  329. package/dist/mcp/proxy.d.ts.map +1 -0
  330. package/dist/mcp/proxy.js +510 -0
  331. package/dist/mcp/proxy.js.map +1 -0
  332. package/dist/mcp/server-instructions.d.ts +18 -0
  333. package/dist/mcp/server-instructions.d.ts.map +1 -0
  334. package/dist/mcp/server-instructions.js +79 -0
  335. package/dist/mcp/server-instructions.js.map +1 -0
  336. package/dist/mcp/session.d.ts +77 -0
  337. package/dist/mcp/session.d.ts.map +1 -0
  338. package/dist/mcp/session.js +294 -0
  339. package/dist/mcp/session.js.map +1 -0
  340. package/dist/mcp/spec-tools.d.ts +39 -0
  341. package/dist/mcp/spec-tools.d.ts.map +1 -0
  342. package/dist/mcp/spec-tools.js +534 -0
  343. package/dist/mcp/spec-tools.js.map +1 -0
  344. package/dist/mcp/tools.d.ts +417 -0
  345. package/dist/mcp/tools.d.ts.map +1 -0
  346. package/dist/mcp/tools.js +3179 -0
  347. package/dist/mcp/tools.js.map +1 -0
  348. package/dist/mcp/transport.d.ts +188 -0
  349. package/dist/mcp/transport.d.ts.map +1 -0
  350. package/dist/mcp/transport.js +343 -0
  351. package/dist/mcp/transport.js.map +1 -0
  352. package/dist/mcp/version.d.ts +19 -0
  353. package/dist/mcp/version.d.ts.map +1 -0
  354. package/dist/mcp/version.js +71 -0
  355. package/dist/mcp/version.js.map +1 -0
  356. package/dist/reflect/apply.d.ts +31 -0
  357. package/dist/reflect/apply.d.ts.map +1 -0
  358. package/dist/reflect/apply.js +286 -0
  359. package/dist/reflect/apply.js.map +1 -0
  360. package/dist/reflect/hash.d.ts +20 -0
  361. package/dist/reflect/hash.d.ts.map +1 -0
  362. package/dist/reflect/hash.js +36 -0
  363. package/dist/reflect/hash.js.map +1 -0
  364. package/dist/reflect/index.d.ts +16 -0
  365. package/dist/reflect/index.d.ts.map +1 -0
  366. package/dist/reflect/index.js +43 -0
  367. package/dist/reflect/index.js.map +1 -0
  368. package/dist/reflect/miner.d.ts +21 -0
  369. package/dist/reflect/miner.d.ts.map +1 -0
  370. package/dist/reflect/miner.js +463 -0
  371. package/dist/reflect/miner.js.map +1 -0
  372. package/dist/reflect/store.d.ts +31 -0
  373. package/dist/reflect/store.d.ts.map +1 -0
  374. package/dist/reflect/store.js +101 -0
  375. package/dist/reflect/store.js.map +1 -0
  376. package/dist/reflect/sweep.d.ts +26 -0
  377. package/dist/reflect/sweep.d.ts.map +1 -0
  378. package/dist/reflect/sweep.js +42 -0
  379. package/dist/reflect/sweep.js.map +1 -0
  380. package/dist/reflect/targets.d.ts +52 -0
  381. package/dist/reflect/targets.d.ts.map +1 -0
  382. package/dist/reflect/targets.js +192 -0
  383. package/dist/reflect/targets.js.map +1 -0
  384. package/dist/reflect/types.d.ts +96 -0
  385. package/dist/reflect/types.d.ts.map +1 -0
  386. package/dist/reflect/types.js +13 -0
  387. package/dist/reflect/types.js.map +1 -0
  388. package/dist/resolution/brief-link-resolver.d.ts +114 -0
  389. package/dist/resolution/brief-link-resolver.d.ts.map +1 -0
  390. package/dist/resolution/brief-link-resolver.js +261 -0
  391. package/dist/resolution/brief-link-resolver.js.map +1 -0
  392. package/dist/resolution/callback-synthesizer.d.ts +10 -0
  393. package/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  394. package/dist/resolution/callback-synthesizer.js +1300 -0
  395. package/dist/resolution/callback-synthesizer.js.map +1 -0
  396. package/dist/resolution/domain-gap-seed.d.ts +60 -0
  397. package/dist/resolution/domain-gap-seed.d.ts.map +1 -0
  398. package/dist/resolution/domain-gap-seed.js +87 -0
  399. package/dist/resolution/domain-gap-seed.js.map +1 -0
  400. package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
  401. package/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
  402. package/dist/resolution/frameworks/cargo-workspace.js +225 -0
  403. package/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
  404. package/dist/resolution/frameworks/csharp.d.ts +8 -0
  405. package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
  406. package/dist/resolution/frameworks/csharp.js +241 -0
  407. package/dist/resolution/frameworks/csharp.js.map +1 -0
  408. package/dist/resolution/frameworks/drupal.d.ts +51 -0
  409. package/dist/resolution/frameworks/drupal.d.ts.map +1 -0
  410. package/dist/resolution/frameworks/drupal.js +367 -0
  411. package/dist/resolution/frameworks/drupal.js.map +1 -0
  412. package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  413. package/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
  414. package/dist/resolution/frameworks/expo-modules.js +143 -0
  415. package/dist/resolution/frameworks/expo-modules.js.map +1 -0
  416. package/dist/resolution/frameworks/express.d.ts +8 -0
  417. package/dist/resolution/frameworks/express.d.ts.map +1 -0
  418. package/dist/resolution/frameworks/express.js +308 -0
  419. package/dist/resolution/frameworks/express.js.map +1 -0
  420. package/dist/resolution/frameworks/fabric.d.ts +3 -0
  421. package/dist/resolution/frameworks/fabric.d.ts.map +1 -0
  422. package/dist/resolution/frameworks/fabric.js +354 -0
  423. package/dist/resolution/frameworks/fabric.js.map +1 -0
  424. package/dist/resolution/frameworks/go.d.ts +8 -0
  425. package/dist/resolution/frameworks/go.d.ts.map +1 -0
  426. package/dist/resolution/frameworks/go.js +161 -0
  427. package/dist/resolution/frameworks/go.js.map +1 -0
  428. package/dist/resolution/frameworks/index.d.ts +48 -0
  429. package/dist/resolution/frameworks/index.d.ts.map +1 -0
  430. package/dist/resolution/frameworks/index.js +161 -0
  431. package/dist/resolution/frameworks/index.js.map +1 -0
  432. package/dist/resolution/frameworks/java.d.ts +8 -0
  433. package/dist/resolution/frameworks/java.d.ts.map +1 -0
  434. package/dist/resolution/frameworks/java.js +504 -0
  435. package/dist/resolution/frameworks/java.js.map +1 -0
  436. package/dist/resolution/frameworks/laravel.d.ts +13 -0
  437. package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
  438. package/dist/resolution/frameworks/laravel.js +257 -0
  439. package/dist/resolution/frameworks/laravel.js.map +1 -0
  440. package/dist/resolution/frameworks/nestjs.d.ts +26 -0
  441. package/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
  442. package/dist/resolution/frameworks/nestjs.js +698 -0
  443. package/dist/resolution/frameworks/nestjs.js.map +1 -0
  444. package/dist/resolution/frameworks/play.d.ts +19 -0
  445. package/dist/resolution/frameworks/play.d.ts.map +1 -0
  446. package/dist/resolution/frameworks/play.js +111 -0
  447. package/dist/resolution/frameworks/play.js.map +1 -0
  448. package/dist/resolution/frameworks/python.d.ts +10 -0
  449. package/dist/resolution/frameworks/python.d.ts.map +1 -0
  450. package/dist/resolution/frameworks/python.js +396 -0
  451. package/dist/resolution/frameworks/python.js.map +1 -0
  452. package/dist/resolution/frameworks/react-native.d.ts +3 -0
  453. package/dist/resolution/frameworks/react-native.d.ts.map +1 -0
  454. package/dist/resolution/frameworks/react-native.js +360 -0
  455. package/dist/resolution/frameworks/react-native.js.map +1 -0
  456. package/dist/resolution/frameworks/react.d.ts +8 -0
  457. package/dist/resolution/frameworks/react.d.ts.map +1 -0
  458. package/dist/resolution/frameworks/react.js +365 -0
  459. package/dist/resolution/frameworks/react.js.map +1 -0
  460. package/dist/resolution/frameworks/ruby.d.ts +8 -0
  461. package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
  462. package/dist/resolution/frameworks/ruby.js +302 -0
  463. package/dist/resolution/frameworks/ruby.js.map +1 -0
  464. package/dist/resolution/frameworks/rust.d.ts +8 -0
  465. package/dist/resolution/frameworks/rust.d.ts.map +1 -0
  466. package/dist/resolution/frameworks/rust.js +304 -0
  467. package/dist/resolution/frameworks/rust.js.map +1 -0
  468. package/dist/resolution/frameworks/svelte.d.ts +9 -0
  469. package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
  470. package/dist/resolution/frameworks/svelte.js +249 -0
  471. package/dist/resolution/frameworks/svelte.js.map +1 -0
  472. package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  473. package/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
  474. package/dist/resolution/frameworks/swift-objc.js +252 -0
  475. package/dist/resolution/frameworks/swift-objc.js.map +1 -0
  476. package/dist/resolution/frameworks/swift.d.ts +10 -0
  477. package/dist/resolution/frameworks/swift.d.ts.map +1 -0
  478. package/dist/resolution/frameworks/swift.js +400 -0
  479. package/dist/resolution/frameworks/swift.js.map +1 -0
  480. package/dist/resolution/frameworks/vue.d.ts +9 -0
  481. package/dist/resolution/frameworks/vue.d.ts.map +1 -0
  482. package/dist/resolution/frameworks/vue.js +306 -0
  483. package/dist/resolution/frameworks/vue.js.map +1 -0
  484. package/dist/resolution/go-module.d.ts +26 -0
  485. package/dist/resolution/go-module.d.ts.map +1 -0
  486. package/dist/resolution/go-module.js +78 -0
  487. package/dist/resolution/go-module.js.map +1 -0
  488. package/dist/resolution/import-resolver.d.ts +68 -0
  489. package/dist/resolution/import-resolver.d.ts.map +1 -0
  490. package/dist/resolution/import-resolver.js +1275 -0
  491. package/dist/resolution/import-resolver.js.map +1 -0
  492. package/dist/resolution/index.d.ts +117 -0
  493. package/dist/resolution/index.d.ts.map +1 -0
  494. package/dist/resolution/index.js +895 -0
  495. package/dist/resolution/index.js.map +1 -0
  496. package/dist/resolution/lru-cache.d.ts +24 -0
  497. package/dist/resolution/lru-cache.d.ts.map +1 -0
  498. package/dist/resolution/lru-cache.js +62 -0
  499. package/dist/resolution/lru-cache.js.map +1 -0
  500. package/dist/resolution/name-matcher.d.ts +32 -0
  501. package/dist/resolution/name-matcher.d.ts.map +1 -0
  502. package/dist/resolution/name-matcher.js +596 -0
  503. package/dist/resolution/name-matcher.js.map +1 -0
  504. package/dist/resolution/path-aliases.d.ts +68 -0
  505. package/dist/resolution/path-aliases.d.ts.map +1 -0
  506. package/dist/resolution/path-aliases.js +238 -0
  507. package/dist/resolution/path-aliases.js.map +1 -0
  508. package/dist/resolution/spec-link-resolver.d.ts +148 -0
  509. package/dist/resolution/spec-link-resolver.d.ts.map +1 -0
  510. package/dist/resolution/spec-link-resolver.js +337 -0
  511. package/dist/resolution/spec-link-resolver.js.map +1 -0
  512. package/dist/resolution/strip-comments.d.ts +27 -0
  513. package/dist/resolution/strip-comments.d.ts.map +1 -0
  514. package/dist/resolution/strip-comments.js +441 -0
  515. package/dist/resolution/strip-comments.js.map +1 -0
  516. package/dist/resolution/swift-objc-bridge.d.ts +134 -0
  517. package/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
  518. package/dist/resolution/swift-objc-bridge.js +256 -0
  519. package/dist/resolution/swift-objc-bridge.js.map +1 -0
  520. package/dist/resolution/types.d.ts +216 -0
  521. package/dist/resolution/types.d.ts.map +1 -0
  522. package/dist/resolution/types.js +8 -0
  523. package/dist/resolution/types.js.map +1 -0
  524. package/dist/resolution/workspace-packages.d.ts +48 -0
  525. package/dist/resolution/workspace-packages.d.ts.map +1 -0
  526. package/dist/resolution/workspace-packages.js +208 -0
  527. package/dist/resolution/workspace-packages.js.map +1 -0
  528. package/dist/search/query-parser.d.ts +57 -0
  529. package/dist/search/query-parser.d.ts.map +1 -0
  530. package/dist/search/query-parser.js +177 -0
  531. package/dist/search/query-parser.js.map +1 -0
  532. package/dist/search/query-utils.d.ts +71 -0
  533. package/dist/search/query-utils.d.ts.map +1 -0
  534. package/dist/search/query-utils.js +380 -0
  535. package/dist/search/query-utils.js.map +1 -0
  536. package/dist/server/cli.js +152 -0
  537. package/dist/server/index.js +12 -0
  538. package/dist/server/ingest/impact-backfill.js +69 -0
  539. package/dist/server/ingest/impact-query.js +343 -0
  540. package/dist/server/ingest/index.js +19 -0
  541. package/dist/server/ingest/ingestor.js +541 -0
  542. package/dist/server/ingest/parser.js +104 -0
  543. package/dist/server/ingest/pricing.js +78 -0
  544. package/dist/server/ingest/specship-classify.js +153 -0
  545. package/dist/server/ingest/types.js +9 -0
  546. package/dist/server/ingest/watcher.js +77 -0
  547. package/dist/server/package.json +3 -0
  548. package/dist/server/project-registry.js +101 -0
  549. package/dist/server/routes/claude.js +907 -0
  550. package/dist/server/routes/domain.js +0 -0
  551. package/dist/server/routes/events.js +134 -0
  552. package/dist/server/routes/graph.js +248 -0
  553. package/dist/server/routes/maintainability.js +18 -0
  554. package/dist/server/routes/memory.js +272 -0
  555. package/dist/server/routes/projects.js +197 -0
  556. package/dist/server/routes/reflect.js +93 -0
  557. package/dist/server/routes/spec.js +373 -0
  558. package/dist/server/routes/status.js +112 -0
  559. package/dist/server/routes/workflow.js +253 -0
  560. package/dist/server/server.js +238 -0
  561. package/dist/server/static-handler.js +87 -0
  562. package/dist/statusline/active-run.d.ts +16 -0
  563. package/dist/statusline/active-run.d.ts.map +1 -0
  564. package/dist/statusline/active-run.js +73 -0
  565. package/dist/statusline/active-run.js.map +1 -0
  566. package/dist/statusline/cache.d.ts +21 -0
  567. package/dist/statusline/cache.d.ts.map +1 -0
  568. package/dist/statusline/cache.js +34 -0
  569. package/dist/statusline/cache.js.map +1 -0
  570. package/dist/statusline/index.d.ts +24 -0
  571. package/dist/statusline/index.d.ts.map +1 -0
  572. package/dist/statusline/index.js +128 -0
  573. package/dist/statusline/index.js.map +1 -0
  574. package/dist/statusline/paths.d.ts +27 -0
  575. package/dist/statusline/paths.d.ts.map +1 -0
  576. package/dist/statusline/paths.js +101 -0
  577. package/dist/statusline/paths.js.map +1 -0
  578. package/dist/statusline/render.d.ts +25 -0
  579. package/dist/statusline/render.d.ts.map +1 -0
  580. package/dist/statusline/render.js +72 -0
  581. package/dist/statusline/render.js.map +1 -0
  582. package/dist/statusline/session-marker.d.ts +30 -0
  583. package/dist/statusline/session-marker.d.ts.map +1 -0
  584. package/dist/statusline/session-marker.js +71 -0
  585. package/dist/statusline/session-marker.js.map +1 -0
  586. package/dist/statusline/types.d.ts +67 -0
  587. package/dist/statusline/types.d.ts.map +1 -0
  588. package/dist/statusline/types.js +16 -0
  589. package/dist/statusline/types.js.map +1 -0
  590. package/dist/sync/git-hooks.d.ts +45 -0
  591. package/dist/sync/git-hooks.d.ts.map +1 -0
  592. package/dist/sync/git-hooks.js +225 -0
  593. package/dist/sync/git-hooks.js.map +1 -0
  594. package/dist/sync/index.d.ts +19 -0
  595. package/dist/sync/index.d.ts.map +1 -0
  596. package/dist/sync/index.js +35 -0
  597. package/dist/sync/index.js.map +1 -0
  598. package/dist/sync/watch-policy.d.ts +48 -0
  599. package/dist/sync/watch-policy.d.ts.map +1 -0
  600. package/dist/sync/watch-policy.js +124 -0
  601. package/dist/sync/watch-policy.js.map +1 -0
  602. package/dist/sync/watcher.d.ts +283 -0
  603. package/dist/sync/watcher.d.ts.map +1 -0
  604. package/dist/sync/watcher.js +606 -0
  605. package/dist/sync/watcher.js.map +1 -0
  606. package/dist/sync/worktree.d.ts +54 -0
  607. package/dist/sync/worktree.d.ts.map +1 -0
  608. package/dist/sync/worktree.js +137 -0
  609. package/dist/sync/worktree.js.map +1 -0
  610. package/dist/types.d.ts +625 -0
  611. package/dist/types.d.ts.map +1 -0
  612. package/dist/types.js +118 -0
  613. package/dist/types.js.map +1 -0
  614. package/dist/ui/glyphs.d.ts +42 -0
  615. package/dist/ui/glyphs.d.ts.map +1 -0
  616. package/dist/ui/glyphs.js +78 -0
  617. package/dist/ui/glyphs.js.map +1 -0
  618. package/dist/ui/shimmer-progress.d.ts +11 -0
  619. package/dist/ui/shimmer-progress.d.ts.map +1 -0
  620. package/dist/ui/shimmer-progress.js +90 -0
  621. package/dist/ui/shimmer-progress.js.map +1 -0
  622. package/dist/ui/shimmer-worker.d.ts +2 -0
  623. package/dist/ui/shimmer-worker.d.ts.map +1 -0
  624. package/dist/ui/shimmer-worker.js +118 -0
  625. package/dist/ui/shimmer-worker.js.map +1 -0
  626. package/dist/ui/types.d.ts +17 -0
  627. package/dist/ui/types.d.ts.map +1 -0
  628. package/dist/ui/types.js +3 -0
  629. package/dist/ui/types.js.map +1 -0
  630. package/dist/utils.d.ts +205 -0
  631. package/dist/utils.d.ts.map +1 -0
  632. package/dist/utils.js +549 -0
  633. package/dist/utils.js.map +1 -0
  634. package/dist/web/chunk-2AJCHB7P.js +1 -0
  635. package/dist/web/chunk-2CPLUFCH.js +2 -0
  636. package/dist/web/chunk-2I7L37NS.js +1 -0
  637. package/dist/web/chunk-2NAWAJB5.js +1 -0
  638. package/dist/web/chunk-2OJBIPE4.js +1 -0
  639. package/dist/web/chunk-372AYXK6.js +17 -0
  640. package/dist/web/chunk-3E2WB6D5.js +1 -0
  641. package/dist/web/chunk-3EBFYSCH.js +2 -0
  642. package/dist/web/chunk-3QCQ4BXS.js +1 -0
  643. package/dist/web/chunk-42XVAQ6I.js +1 -0
  644. package/dist/web/chunk-4IMMPEYM.js +1 -0
  645. package/dist/web/chunk-4JYHAP7B.js +1 -0
  646. package/dist/web/chunk-4TJQJPCZ.js +1 -0
  647. package/dist/web/chunk-4WZIHTPC.js +1 -0
  648. package/dist/web/chunk-4YVSYOSD.js +1 -0
  649. package/dist/web/chunk-52PO6IMB.js +2 -0
  650. package/dist/web/chunk-54D6RFSW.js +1 -0
  651. package/dist/web/chunk-5BQIOYKW.js +1 -0
  652. package/dist/web/chunk-5HGWHUJA.js +1 -0
  653. package/dist/web/chunk-5XRUOPZE.js +1 -0
  654. package/dist/web/chunk-5Y244R4G.js +1 -0
  655. package/dist/web/chunk-6O7Z3P2M.js +1 -0
  656. package/dist/web/chunk-6QXULGLG.js +1 -0
  657. package/dist/web/chunk-6RRDPT5Z.js +1 -0
  658. package/dist/web/chunk-6VKB2ZWM.js +1 -0
  659. package/dist/web/chunk-7DMFVTU4.js +1 -0
  660. package/dist/web/chunk-7P5CVBJZ.js +1 -0
  661. package/dist/web/chunk-7SMPKVEP.js +1 -0
  662. package/dist/web/chunk-AHLX543M.js +1 -0
  663. package/dist/web/chunk-AMGJBO7D.js +3 -0
  664. package/dist/web/chunk-AZJVTPLU.js +1 -0
  665. package/dist/web/chunk-B3CWIVBW.js +1 -0
  666. package/dist/web/chunk-BLBRMCN2.js +1 -0
  667. package/dist/web/chunk-BMIAXD2V.js +2 -0
  668. package/dist/web/chunk-BPCJLNBS.js +47 -0
  669. package/dist/web/chunk-BRHEUDLY.js +6 -0
  670. package/dist/web/chunk-BUXWEHIY.js +1 -0
  671. package/dist/web/chunk-CD5IZM7Y.js +1 -0
  672. package/dist/web/chunk-DLQPZWSI.css +1 -0
  673. package/dist/web/chunk-DSGNOCKQ.js +1 -0
  674. package/dist/web/chunk-DT5LJYFX.js +1 -0
  675. package/dist/web/chunk-DYRFLPJA.js +1 -0
  676. package/dist/web/chunk-E3J3CXR5.js +1 -0
  677. package/dist/web/chunk-E73OX2P7.js +1 -0
  678. package/dist/web/chunk-EAXRKDLV.js +1 -0
  679. package/dist/web/chunk-EBKKDHYI.js +1 -0
  680. package/dist/web/chunk-EE7V7Q5P.js +1 -0
  681. package/dist/web/chunk-EKY2FUHU.js +1 -0
  682. package/dist/web/chunk-EP6XOPXH.js +1 -0
  683. package/dist/web/chunk-ESGDLJOJ.js +1 -0
  684. package/dist/web/chunk-ETJG7NCY.js +1 -0
  685. package/dist/web/chunk-EUUEFEDI.js +1 -0
  686. package/dist/web/chunk-EX4ZHR4F.js +1 -0
  687. package/dist/web/chunk-F5UNCSXP.js +1 -0
  688. package/dist/web/chunk-FFGJXUHI.js +1 -0
  689. package/dist/web/chunk-FGNZDHTL.js +11 -0
  690. package/dist/web/chunk-FIJW2UNJ.js +1 -0
  691. package/dist/web/chunk-FMV5PXRC.js +5 -0
  692. package/dist/web/chunk-G7VZT5KB.js +3 -0
  693. package/dist/web/chunk-GCOM4JPR.js +2 -0
  694. package/dist/web/chunk-GEIIDO6C.js +1 -0
  695. package/dist/web/chunk-GRZYXPSO.js +7 -0
  696. package/dist/web/chunk-GWBABPZ5.js +1 -0
  697. package/dist/web/chunk-GYGPS3AN.js +1 -0
  698. package/dist/web/chunk-H4GLRD3Q.js +1 -0
  699. package/dist/web/chunk-H5TWEFYX.js +1 -0
  700. package/dist/web/chunk-H7AF7YS4.js +1 -0
  701. package/dist/web/chunk-HCB2N2KH.js +1 -0
  702. package/dist/web/chunk-HDZDQILN.js +1 -0
  703. package/dist/web/chunk-HMK6UO6N.js +1 -0
  704. package/dist/web/chunk-HVVXPI4D.js +1 -0
  705. package/dist/web/chunk-IHEE5NYJ.js +1 -0
  706. package/dist/web/chunk-IPB746BT.js +1 -0
  707. package/dist/web/chunk-ISNEBICW.js +1 -0
  708. package/dist/web/chunk-J2GZVLHH.js +1 -0
  709. package/dist/web/chunk-JTFXTIPE.js +903 -0
  710. package/dist/web/chunk-KHU5M2AL.js +1 -0
  711. package/dist/web/chunk-KW3DHCFV.js +1 -0
  712. package/dist/web/chunk-LB6JPLX2.js +1 -0
  713. package/dist/web/chunk-LBXLFPVN.js +1 -0
  714. package/dist/web/chunk-LGNSHRCE.js +1 -0
  715. package/dist/web/chunk-LNSVDHCI.js +1 -0
  716. package/dist/web/chunk-LVGIY3SO.js +1 -0
  717. package/dist/web/chunk-LXLHIHEN.js +1 -0
  718. package/dist/web/chunk-MFHO2F2U.js +4 -0
  719. package/dist/web/chunk-N5OSSQFZ.js +1 -0
  720. package/dist/web/chunk-N6SS4G6S.js +1 -0
  721. package/dist/web/chunk-NAJYJNHS.js +1 -0
  722. package/dist/web/chunk-NHD66NOI.js +1 -0
  723. package/dist/web/chunk-NNLJ55MY.js +1 -0
  724. package/dist/web/chunk-NTBJG6SJ.js +1 -0
  725. package/dist/web/chunk-NUDB3Q2Y.js +3 -0
  726. package/dist/web/chunk-OM7JVWQQ.js +1 -0
  727. package/dist/web/chunk-OXEF5E3E.js +1 -0
  728. package/dist/web/chunk-PGGJPDJG.js +1 -0
  729. package/dist/web/chunk-PUYSJNJR.js +1 -0
  730. package/dist/web/chunk-Q2RVFS45.js +1 -0
  731. package/dist/web/chunk-Q7L6LLAK.js +1 -0
  732. package/dist/web/chunk-QCMKJIWY.js +1 -0
  733. package/dist/web/chunk-QEQRY4QQ.js +1 -0
  734. package/dist/web/chunk-QH6CF3M3.js +1 -0
  735. package/dist/web/chunk-QQ5LD7PI.js +1 -0
  736. package/dist/web/chunk-QR6L3KAC.js +1 -0
  737. package/dist/web/chunk-QXJS6F3U.js +1 -0
  738. package/dist/web/chunk-R2DLK4HO.js +1 -0
  739. package/dist/web/chunk-RD6TVPOT.js +1 -0
  740. package/dist/web/chunk-RKY4EJYJ.js +1 -0
  741. package/dist/web/chunk-RONYWVY7.js +1 -0
  742. package/dist/web/chunk-RSZZWGGC.js +1 -0
  743. package/dist/web/chunk-RXKXYF2C.js +1 -0
  744. package/dist/web/chunk-SCNDZRN2.js +1 -0
  745. package/dist/web/chunk-SH6UVHQC.js +1 -0
  746. package/dist/web/chunk-SWKJRNYY.js +1 -0
  747. package/dist/web/chunk-T7AZ65JP.js +1 -0
  748. package/dist/web/chunk-TCZDVOHD.js +1 -0
  749. package/dist/web/chunk-TF5TF6IP.js +1 -0
  750. package/dist/web/chunk-TPTITA3V.js +1 -0
  751. package/dist/web/chunk-TR335633.js +1 -0
  752. package/dist/web/chunk-UR5KDXPX.js +1 -0
  753. package/dist/web/chunk-UR6O2GEH.js +1 -0
  754. package/dist/web/chunk-UTNMGWTP.js +1 -0
  755. package/dist/web/chunk-VECWMHJP.js +1 -0
  756. package/dist/web/chunk-VUACT35R.js +3 -0
  757. package/dist/web/chunk-VZI7H4SZ.js +1 -0
  758. package/dist/web/chunk-W22AVG3N.js +1 -0
  759. package/dist/web/chunk-W6NGHRHX.js +1 -0
  760. package/dist/web/chunk-WB6YHOD4.js +1 -0
  761. package/dist/web/chunk-WBT64AWV.js +1 -0
  762. package/dist/web/chunk-WFXJIXZE.js +4 -0
  763. package/dist/web/chunk-WTGYRH3Z.js +298 -0
  764. package/dist/web/chunk-WXTCVDTP.js +1 -0
  765. package/dist/web/chunk-XCDHWLVH.js +1 -0
  766. package/dist/web/chunk-Y3H6FFUZ.js +1 -0
  767. package/dist/web/chunk-Y4F5ULGJ.js +1 -0
  768. package/dist/web/chunk-YEGKAAEE.js +1 -0
  769. package/dist/web/chunk-YM2KU57F.js +1 -0
  770. package/dist/web/chunk-YRERBP6T.js +1 -0
  771. package/dist/web/chunk-ZLV4VCDG.js +3 -0
  772. package/dist/web/chunk-ZQUJMA5K.js +4 -0
  773. package/dist/web/chunk-ZTVI5KFF.js +1 -0
  774. package/dist/web/favicon-16.png +0 -0
  775. package/dist/web/favicon-180.png +0 -0
  776. package/dist/web/favicon-32.png +0 -0
  777. package/dist/web/favicon-512.png +0 -0
  778. package/dist/web/favicon-small.svg +15 -0
  779. package/dist/web/favicon.ico +0 -0
  780. package/dist/web/favicon.svg +20 -0
  781. package/dist/web/icon-192.png +0 -0
  782. package/dist/web/icon-512.png +0 -0
  783. package/dist/web/index.html +146 -0
  784. package/dist/web/main-ESADRXN2.css +1 -0
  785. package/dist/web/main-SQFUMVQA.js +1 -0
  786. package/dist/web/manifest.webmanifest +15 -0
  787. package/dist/web/media/codicon-LN6W7LCM.ttf +0 -0
  788. package/dist/web/styles-KSOPUVDA.css +1 -0
  789. package/dist/web/sw.js +69 -0
  790. package/dist/workflows/condition-evaluator.d.ts +75 -0
  791. package/dist/workflows/condition-evaluator.d.ts.map +1 -0
  792. package/dist/workflows/condition-evaluator.js +282 -0
  793. package/dist/workflows/condition-evaluator.js.map +1 -0
  794. package/dist/workflows/defaults/claude-design-implement.yaml +336 -0
  795. package/dist/workflows/defaults/index.d.ts +26 -0
  796. package/dist/workflows/defaults/index.d.ts.map +1 -0
  797. package/dist/workflows/defaults/index.js +94 -0
  798. package/dist/workflows/defaults/index.js.map +1 -0
  799. package/dist/workflows/defaults/spec-author.yaml +214 -0
  800. package/dist/workflows/defaults/spec-fix.yaml +110 -0
  801. package/dist/workflows/defaults/spec-implement.yaml +150 -0
  802. package/dist/workflows/defaults/spec-relink.yaml +81 -0
  803. package/dist/workflows/defaults/spec-verify.yaml +51 -0
  804. package/dist/workflows/discovery.d.ts +46 -0
  805. package/dist/workflows/discovery.d.ts.map +1 -0
  806. package/dist/workflows/discovery.js +193 -0
  807. package/dist/workflows/discovery.js.map +1 -0
  808. package/dist/workflows/executor.d.ts +98 -0
  809. package/dist/workflows/executor.d.ts.map +1 -0
  810. package/dist/workflows/executor.js +664 -0
  811. package/dist/workflows/executor.js.map +1 -0
  812. package/dist/workflows/runners/approval.d.ts +18 -0
  813. package/dist/workflows/runners/approval.d.ts.map +1 -0
  814. package/dist/workflows/runners/approval.js +34 -0
  815. package/dist/workflows/runners/approval.js.map +1 -0
  816. package/dist/workflows/runners/bash.d.ts +13 -0
  817. package/dist/workflows/runners/bash.d.ts.map +1 -0
  818. package/dist/workflows/runners/bash.js +143 -0
  819. package/dist/workflows/runners/bash.js.map +1 -0
  820. package/dist/workflows/runners/cancel.d.ts +10 -0
  821. package/dist/workflows/runners/cancel.d.ts.map +1 -0
  822. package/dist/workflows/runners/cancel.js +19 -0
  823. package/dist/workflows/runners/cancel.js.map +1 -0
  824. package/dist/workflows/runners/prompt.d.ts +51 -0
  825. package/dist/workflows/runners/prompt.d.ts.map +1 -0
  826. package/dist/workflows/runners/prompt.js +306 -0
  827. package/dist/workflows/runners/prompt.js.map +1 -0
  828. package/dist/workflows/runners/script.d.ts +17 -0
  829. package/dist/workflows/runners/script.d.ts.map +1 -0
  830. package/dist/workflows/runners/script.js +155 -0
  831. package/dist/workflows/runners/script.js.map +1 -0
  832. package/dist/workflows/runners/types.d.ts +57 -0
  833. package/dist/workflows/runners/types.d.ts.map +1 -0
  834. package/dist/workflows/runners/types.js +13 -0
  835. package/dist/workflows/runners/types.js.map +1 -0
  836. package/dist/workflows/schemas/workflow.d.ts +166 -0
  837. package/dist/workflows/schemas/workflow.d.ts.map +1 -0
  838. package/dist/workflows/schemas/workflow.js +437 -0
  839. package/dist/workflows/schemas/workflow.js.map +1 -0
  840. package/hooks/hooks.json +38 -0
  841. package/package.json +78 -0
  842. package/scripts/add-lang/bench.sh +60 -0
  843. package/scripts/add-lang/check-grammar.mjs +75 -0
  844. package/scripts/add-lang/dump-ast.mjs +103 -0
  845. package/scripts/add-lang/verify-extraction.mjs +70 -0
  846. package/scripts/agent-eval/arms-F.sh +21 -0
  847. package/scripts/agent-eval/arms-matrix.sh +37 -0
  848. package/scripts/agent-eval/audit.sh +68 -0
  849. package/scripts/agent-eval/bench-readme.sh +28 -0
  850. package/scripts/agent-eval/bench-why-repo.sh +22 -0
  851. package/scripts/agent-eval/block-read-hook.sh +19 -0
  852. package/scripts/agent-eval/hook-settings.json +15 -0
  853. package/scripts/agent-eval/itrun.sh +120 -0
  854. package/scripts/agent-eval/parse-arms.mjs +116 -0
  855. package/scripts/agent-eval/parse-bench-readme.mjs +84 -0
  856. package/scripts/agent-eval/parse-run.mjs +45 -0
  857. package/scripts/agent-eval/parse-session.mjs +93 -0
  858. package/scripts/agent-eval/probe-context.mjs +21 -0
  859. package/scripts/agent-eval/probe-explore.mjs +40 -0
  860. package/scripts/agent-eval/probe-node.mjs +20 -0
  861. package/scripts/agent-eval/probe-sweep.mjs +119 -0
  862. package/scripts/agent-eval/probe-trace.mjs +20 -0
  863. package/scripts/agent-eval/run-agent.sh +34 -0
  864. package/scripts/agent-eval/run-all.sh +67 -0
  865. package/scripts/agent-eval/run-arms.sh +56 -0
  866. package/scripts/agent-eval/seq-matrix.mjs +137 -0
  867. package/scripts/build-bundle.sh +118 -0
  868. package/scripts/build-server-bundle.mjs +80 -0
  869. package/scripts/build-web-bundle.mjs +66 -0
  870. package/scripts/extract-release-notes.mjs +130 -0
  871. package/scripts/local-install.sh +41 -0
  872. package/scripts/npm-sdk.js +75 -0
  873. package/scripts/npm-shim.js +246 -0
  874. package/scripts/offline-install.ps1 +148 -0
  875. package/scripts/offline-install.sh +149 -0
  876. package/scripts/pack-npm.sh +119 -0
  877. package/scripts/prepare-release.mjs +270 -0
  878. package/scripts/sync-shim-version.mjs +64 -0
  879. package/selectors.json +41 -0
@@ -0,0 +1,112 @@
1
+ /**
2
+ * GET /api/status — backend, journal mode, node/edge counts, drift count,
3
+ * last index time. Drives the UI's persistent status strip.
4
+ *
5
+ * POST /api/refresh — force-sync the SpecShip index AND trigger an
6
+ * immediate Claude Code transcript re-ingest. Wired to the global
7
+ * refresh button in the dashboard's status strip so users can pull
8
+ * Sessions / Heatmap / Costs / Memory current without waiting on the
9
+ * watcher's debounce.
10
+ *
11
+ * Project-scoped: accepts `?project=<slug>` and serves the matching
12
+ * SpecShip instance from the registry. When no project is selectable
13
+ * (no `?project=`, no primary), returns a 409 with `code: 'no_project'`
14
+ * so the UI can show the picker without blowing up.
15
+ */
16
+ export async function registerStatusRoutes(app) {
17
+ app.get('/api/status', async (req, reply) => {
18
+ const cg = await app.activeCg(req);
19
+ if (!cg) {
20
+ return reply.code(409).send({ error: 'no project selected', code: 'no_project' });
21
+ }
22
+ const stats = cg.getStats();
23
+ const lastIndexed = cg.getLastIndexedAt();
24
+ const drift = cg
25
+ .getSpecQueries()
26
+ .getLinksByState(['drifted', 'broken', 'orphaned']).length;
27
+ return {
28
+ projectPath: cg.getProjectRoot ? cg.getProjectRoot() : '',
29
+ backend: cg.getBackend(),
30
+ journalMode: cg.getJournalMode(),
31
+ nodeCount: stats.nodeCount,
32
+ edgeCount: stats.edgeCount,
33
+ fileCount: stats.fileCount,
34
+ drift,
35
+ lastIndexed: lastIndexed != null ? new Date(lastIndexed).toISOString() : null,
36
+ nodesByKind: stats.nodesByKind,
37
+ filesByLanguage: stats.filesByLanguage,
38
+ dbSizeBytes: stats.dbSizeBytes,
39
+ };
40
+ });
41
+ /**
42
+ * Force a synchronous re-sync of the project's SpecShip index AND a
43
+ * fresh Claude Code transcript ingest pass. The status strip's
44
+ * refresh button calls this so users can pull every project-scoped
45
+ * surface (Sessions, Heatmap, Costs, Memory, Drift, Graph) to
46
+ * current without waiting on the JSONL watcher's debounce window or
47
+ * the next file-watcher tick.
48
+ *
49
+ * Returns the same shape as GET /api/status (so the UI can update
50
+ * its strip and `lastIndexed` label in one round-trip) plus the
51
+ * ingest stats for surfaces interested in "how many new sessions
52
+ * landed."
53
+ *
54
+ * Both steps run sequentially. Errors in either are surfaced under
55
+ * `syncError` / `ingestError` so a transient ingest hiccup doesn't
56
+ * mask a successful index sync (or vice versa) — and the UI can
57
+ * decide whether to retry or surface the failure.
58
+ */
59
+ app.post('/api/refresh', async (req, reply) => {
60
+ const cg = await app.activeCg(req);
61
+ if (!cg) {
62
+ return reply.code(409).send({ error: 'no project selected', code: 'no_project' });
63
+ }
64
+ let syncError = null;
65
+ let ingestError = null;
66
+ let ingestStats = null;
67
+ // 1. Re-index the project. Picks up code AND specs/ changes the
68
+ // auto-sync hook may not have caught yet.
69
+ try {
70
+ await cg.sync();
71
+ }
72
+ catch (e) {
73
+ syncError = e instanceof Error ? e.message : String(e);
74
+ }
75
+ // 2. Re-ingest Claude Code transcripts. Skipped silently when the
76
+ // server was booted with `--no-ingest` (app.watcher == null).
77
+ if (app.watcher) {
78
+ try {
79
+ ingestStats = await app.watcher.ingestNow();
80
+ }
81
+ catch (e) {
82
+ ingestError = e instanceof Error ? e.message : String(e);
83
+ }
84
+ }
85
+ // 3. Echo the new status so the UI updates its strip + lastIndexed
86
+ // label without a separate GET.
87
+ const stats = cg.getStats();
88
+ const lastIndexed = cg.getLastIndexedAt();
89
+ const drift = cg
90
+ .getSpecQueries()
91
+ .getLinksByState(['drifted', 'broken', 'orphaned']).length;
92
+ return {
93
+ ok: syncError === null && ingestError === null,
94
+ syncError,
95
+ ingestError,
96
+ ingestStats,
97
+ status: {
98
+ projectPath: cg.getProjectRoot ? cg.getProjectRoot() : '',
99
+ backend: cg.getBackend(),
100
+ journalMode: cg.getJournalMode(),
101
+ nodeCount: stats.nodeCount,
102
+ edgeCount: stats.edgeCount,
103
+ fileCount: stats.fileCount,
104
+ drift,
105
+ lastIndexed: lastIndexed != null ? new Date(lastIndexed).toISOString() : null,
106
+ nodesByKind: stats.nodesByKind,
107
+ filesByLanguage: stats.filesByLanguage,
108
+ dbSizeBytes: stats.dbSizeBytes,
109
+ },
110
+ };
111
+ });
112
+ }
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Workflow routes — discover / run / resume / cancel / approve / reject /
3
+ * runs list / run detail + SSE event stream.
4
+ *
5
+ * All project-scoped via `?project=<slug>` (falls back to primary). Each
6
+ * handler resolves the active SpecShip instance from the registry and
7
+ * constructs the WorktreeProvider + WorkflowExecutor on demand against
8
+ * that instance's queries. Construction is cheap (both classes just stash
9
+ * references), and pinning a single executor across all projects would
10
+ * tie the entire surface to whichever instance loaded first.
11
+ *
12
+ * The SSE endpoint streams workflow_events as they're appended to the DB
13
+ * (polling 500ms). For v1 polling the same SQLite the executor writes to is
14
+ * faster + more reliable than wiring an in-process event bus across packages.
15
+ */
16
+ import path from 'node:path';
17
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
18
+ import { fileURLToPath, pathToFileURL } from 'node:url';
19
+ async function resolveCg(app, req, reply) {
20
+ const cg = await app.activeCg(req);
21
+ if (!cg) {
22
+ reply.code(409).send({ error: 'no project selected', code: 'no_project' });
23
+ return null;
24
+ }
25
+ return cg;
26
+ }
27
+ export async function registerWorkflowRoutes(app) {
28
+ // Lazy import — keeps the server bootable even if the workflow engine
29
+ // is disabled in the current build profile.
30
+ //
31
+ // Two delivery shapes (same pattern as loadSpecShip() in ../server.ts):
32
+ // 1. **Bundled** — `dist/server/routes/workflow.js` sits two levels under
33
+ // `dist/`, so the core workflow modules live at `../../workflows/*.js`
34
+ // and `../../isolation/*.js`. We try this relative path first because
35
+ // the bundled tarball stages the specship core without a resolvable
36
+ // `@selvakumaresra/specship` package on Node's module graph (offline
37
+ // installs hit this — see scripts/offline-install.sh).
38
+ // 2. **Workspace / dev** — the `file:../..` workspace dep resolves the
39
+ // named import via Node's normal package resolution.
40
+ let discovery;
41
+ let executorMod;
42
+ let worktreeMod;
43
+ const here = path.dirname(fileURLToPath(import.meta.url));
44
+ const bundledDiscovery = path.resolve(here, '..', '..', 'workflows', 'discovery.js');
45
+ if (existsSync(bundledDiscovery)) {
46
+ discovery = await import(pathToFileURL(bundledDiscovery).href);
47
+ executorMod = await import(pathToFileURL(path.resolve(here, '..', '..', 'workflows', 'executor.js')).href);
48
+ worktreeMod = await import(pathToFileURL(path.resolve(here, '..', '..', 'isolation', 'worktree.js')).href);
49
+ }
50
+ else {
51
+ discovery = await import('@selvakumaresra/specship/dist/workflows/discovery.js');
52
+ executorMod = await import('@selvakumaresra/specship/dist/workflows/executor.js');
53
+ worktreeMod = await import('@selvakumaresra/specship/dist/isolation/worktree.js');
54
+ }
55
+ const { discoverWorkflows, loadWorkflowByName } = discovery;
56
+ const { WorkflowExecutor } = executorMod;
57
+ const { WorktreeProvider } = worktreeMod;
58
+ const executorCache = new WeakMap();
59
+ /** Build (or fetch cached) executor + worktree provider for a project. */
60
+ function executorFor(cg) {
61
+ const sq = cg.getSpecQueries();
62
+ const cached = executorCache.get(sq);
63
+ if (cached)
64
+ return { sq, executor: cached.executor, projectRoot: cached.projectRoot };
65
+ const projectRoot = cg.getProjectRoot ? cg.getProjectRoot() : process.cwd();
66
+ const worktrees = new WorktreeProvider(sq);
67
+ const executor = new WorkflowExecutor(sq, worktrees);
68
+ executorCache.set(sq, { executor, projectRoot });
69
+ return { sq, executor, projectRoot };
70
+ }
71
+ app.get('/api/workflows', async (req, reply) => {
72
+ const cg = await resolveCg(app, req, reply);
73
+ if (!cg)
74
+ return;
75
+ const { projectRoot } = executorFor(cg);
76
+ return discoverWorkflows(projectRoot);
77
+ });
78
+ app.post('/api/workflows/runs', async (req, reply) => {
79
+ const cg = await resolveCg(app, req, reply);
80
+ if (!cg)
81
+ return;
82
+ const { executor, projectRoot } = executorFor(cg);
83
+ const body = req.body;
84
+ if (!body?.workflowName)
85
+ return reply.code(400).send({ error: 'workflowName required' });
86
+ const loaded = loadWorkflowByName(projectRoot, body.workflowName);
87
+ if (!loaded)
88
+ return reply.code(404).send({ error: 'workflow not found' });
89
+ const startPromise = executor.start(loaded.workflow, {
90
+ projectRoot,
91
+ inputs: body.inputs,
92
+ variables: body.variables,
93
+ });
94
+ const result = await Promise.race([
95
+ startPromise,
96
+ new Promise((resolve) => setTimeout(() => resolve({ run: { id: 'pending', status: 'starting' } }), 50)),
97
+ ]);
98
+ startPromise.catch(() => { });
99
+ return { runId: result.run.id, status: result.run.status };
100
+ });
101
+ app.get('/api/workflows/runs', async (req, reply) => {
102
+ const cg = await resolveCg(app, req, reply);
103
+ if (!cg)
104
+ return;
105
+ const { sq } = executorFor(cg);
106
+ const limit = Math.min(parseInt(req.query.limit ?? '50', 10) || 50, 500);
107
+ return { runs: sq.getAllWorkflowRuns(limit) };
108
+ });
109
+ app.get('/api/workflows/runs/:id', async (req, reply) => {
110
+ const cg = await resolveCg(app, req, reply);
111
+ if (!cg)
112
+ return;
113
+ const { sq } = executorFor(cg);
114
+ const run = sq.getWorkflowRunById(req.params.id);
115
+ if (!run)
116
+ return reply.code(404).send({ error: 'run not found' });
117
+ const events = sq.getEventsByRun(req.params.id, 500);
118
+ return { run, events };
119
+ });
120
+ /**
121
+ * Read-only artifacts for a run. The executor writes each completed node's
122
+ * output to `<.specship>/artifacts/runs/<id>/nodes/<nodeId>.{md,meta.json}`;
123
+ * this lists + returns them (body inline — a run has a handful of nodes). No
124
+ * execution-path change: it only reads what's already on disk.
125
+ */
126
+ app.get('/api/workflows/runs/:id/artifacts', async (req, reply) => {
127
+ const cg = await resolveCg(app, req, reply);
128
+ if (!cg)
129
+ return;
130
+ const { projectRoot } = executorFor(cg);
131
+ const dir = path.join(projectRoot, '.specship', 'artifacts', 'runs', req.params.id, 'nodes');
132
+ const artifacts = [];
133
+ if (existsSync(dir)) {
134
+ try {
135
+ for (const file of readdirSync(dir).filter((f) => f.endsWith('.md')).sort()) {
136
+ const stem = file.slice(0, -3);
137
+ let meta = {};
138
+ try {
139
+ meta = JSON.parse(readFileSync(path.join(dir, `${stem}.meta.json`), 'utf8'));
140
+ }
141
+ catch { /* no/invalid meta */ }
142
+ let body = '';
143
+ try {
144
+ body = readFileSync(path.join(dir, file), 'utf8');
145
+ }
146
+ catch { /* unreadable */ }
147
+ artifacts.push({
148
+ nodeId: meta.nodeId ?? stem,
149
+ name: file,
150
+ kind: meta.kind,
151
+ outputType: meta.outputType,
152
+ length: meta.length ?? body.length,
153
+ body,
154
+ });
155
+ }
156
+ }
157
+ catch { /* dir vanished mid-read — return what we have */ }
158
+ }
159
+ return { artifacts };
160
+ });
161
+ /**
162
+ * SSE event stream. Polls the events table every 500ms for any events
163
+ * newer than the last id sent. Closes when the run hits a terminal state.
164
+ */
165
+ app.get('/api/workflows/runs/:id/events', async (req, reply) => {
166
+ const cg = await resolveCg(app, req, reply);
167
+ if (!cg)
168
+ return;
169
+ const { sq } = executorFor(cg);
170
+ const runId = req.params.id;
171
+ let lastId = parseInt(req.query.since ?? '0', 10) || 0;
172
+ reply.raw.setHeader('Content-Type', 'text/event-stream');
173
+ reply.raw.setHeader('Cache-Control', 'no-cache');
174
+ reply.raw.setHeader('Connection', 'keep-alive');
175
+ reply.raw.flushHeaders();
176
+ let closed = false;
177
+ req.raw.on('close', () => { closed = true; });
178
+ const tick = async () => {
179
+ if (closed)
180
+ return;
181
+ const events = sq.getEventsByRun(runId, 1000);
182
+ const fresh = events.filter((e) => e.id > lastId);
183
+ for (const e of fresh) {
184
+ reply.raw.write(`id: ${e.id}\n`);
185
+ reply.raw.write(`event: ${e.eventType}\n`);
186
+ reply.raw.write(`data: ${JSON.stringify(e)}\n\n`);
187
+ lastId = e.id;
188
+ }
189
+ const run = sq.getWorkflowRunById(runId);
190
+ if (!run || ['completed', 'failed', 'cancelled'].includes(run.status)) {
191
+ reply.raw.write(`event: done\ndata: ${JSON.stringify({ status: run?.status })}\n\n`);
192
+ reply.raw.end();
193
+ return;
194
+ }
195
+ setTimeout(() => { void tick(); }, 500);
196
+ };
197
+ void tick();
198
+ });
199
+ app.post('/api/workflows/runs/:id/approve', async (req, reply) => {
200
+ const cg = await resolveCg(app, req, reply);
201
+ if (!cg)
202
+ return;
203
+ const { executor } = executorFor(cg);
204
+ try {
205
+ executor.approve(req.params.id, req.body?.comment);
206
+ return { ok: true };
207
+ }
208
+ catch (err) {
209
+ return reply.code(400).send({ error: err instanceof Error ? err.message : String(err) });
210
+ }
211
+ });
212
+ app.post('/api/workflows/runs/:id/reject', async (req, reply) => {
213
+ const cg = await resolveCg(app, req, reply);
214
+ if (!cg)
215
+ return;
216
+ const { executor } = executorFor(cg);
217
+ try {
218
+ executor.reject(req.params.id, req.body?.reason);
219
+ return { ok: true };
220
+ }
221
+ catch (err) {
222
+ return reply.code(400).send({ error: err instanceof Error ? err.message : String(err) });
223
+ }
224
+ });
225
+ app.post('/api/workflows/runs/:id/cancel', async (req, reply) => {
226
+ const cg = await resolveCg(app, req, reply);
227
+ if (!cg)
228
+ return;
229
+ const { executor } = executorFor(cg);
230
+ try {
231
+ executor.cancel(req.params.id, req.body?.reason);
232
+ return { ok: true };
233
+ }
234
+ catch (err) {
235
+ return reply.code(400).send({ error: err instanceof Error ? err.message : String(err) });
236
+ }
237
+ });
238
+ app.post('/api/workflows/runs/:id/resume', async (req, reply) => {
239
+ const cg = await resolveCg(app, req, reply);
240
+ if (!cg)
241
+ return;
242
+ const { sq, executor, projectRoot } = executorFor(cg);
243
+ const run = sq.getWorkflowRunById(req.params.id);
244
+ if (!run)
245
+ return reply.code(404).send({ error: 'run not found' });
246
+ const loaded = loadWorkflowByName(projectRoot, run.workflowName);
247
+ if (!loaded)
248
+ return reply.code(404).send({ error: 'workflow definition missing' });
249
+ const promise = executor.resume(loaded.workflow, req.params.id, { projectRoot });
250
+ promise.catch(() => { });
251
+ return { ok: true };
252
+ });
253
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Fastify HTTP server for specship + SpecShip Desktop UI.
3
+ *
4
+ * Routes follow the design spec — `/api/graph/*`, `/api/spec/*`,
5
+ * `/api/drift`, `/api/workflows/*`, `/api/claude/*`. Each route group lives
6
+ * in its own file under `./routes/` and registers itself on a passed
7
+ * Fastify instance.
8
+ *
9
+ * Why Fastify: lighter than Express, faster, first-class TypeScript types,
10
+ * built-in JSON schema validation, plugins for CORS + SSE. The 30K LoC
11
+ * Archon UI port pulls ~20+ API routes — Fastify's plugin model keeps the
12
+ * registration code tidy.
13
+ */
14
+ import path from 'node:path';
15
+ import { existsSync, promises as fs } from 'node:fs';
16
+ import { fileURLToPath, pathToFileURL } from 'node:url';
17
+ import Fastify from 'fastify';
18
+ import cors from '@fastify/cors';
19
+ import { startWatcher, primaryProjectMatcher } from './ingest/index.js';
20
+ import { backfillDisplaced } from './ingest/impact-backfill.js';
21
+ import { ProjectRegistry } from './project-registry.js';
22
+ import { makeStaticHandler } from './static-handler.js';
23
+ import { registerGraphRoutes } from './routes/graph.js';
24
+ import { registerSpecRoutes } from './routes/spec.js';
25
+ import { registerWorkflowRoutes } from './routes/workflow.js';
26
+ import { registerClaudeRoutes } from './routes/claude.js';
27
+ import { registerStatusRoutes } from './routes/status.js';
28
+ import { registerMemoryRoutes } from './routes/memory.js';
29
+ import { registerProjectsRoutes } from './routes/projects.js';
30
+ import { registerEventsRoutes } from './routes/events.js';
31
+ import { registerReflectRoutes } from './routes/reflect.js';
32
+ import { registerMaintainabilityRoutes } from './routes/maintainability.js';
33
+ import { registerDomainRoutes } from './routes/domain.js';
34
+ /**
35
+ * Lazy-import the specship core. Two delivery shapes are supported:
36
+ *
37
+ * 1. **Bundled** — the platform-specific npm tarball lays the compiled
38
+ * server out at `<bundle>/lib/dist/server/server.js` and the specship
39
+ * core at `<bundle>/lib/dist/index.js`. We try this relative path
40
+ * first so the bundled mode never depends on Node's package
41
+ * resolution finding `@selvakumaresra/specship` (it won't, the
42
+ * bundle stages a single package by name `@selvakumaresra/specship`).
43
+ *
44
+ * 2. **Workspace / dev** — `packages/server/dist/server.js` imports via
45
+ * the workspace `file:../..` dep. Falls through to the named import.
46
+ *
47
+ * The function caches the resolved module so the lookup only runs once.
48
+ */
49
+ let cachedSpecShip = null;
50
+ async function loadSpecShip() {
51
+ if (cachedSpecShip)
52
+ return cachedSpecShip;
53
+ // Bundled mode: dist/server/server.js → ../index.js (root dist/index.js).
54
+ try {
55
+ const here = path.dirname(fileURLToPath(import.meta.url));
56
+ const candidate = path.resolve(here, '..', 'index.js');
57
+ if (existsSync(candidate)) {
58
+ cachedSpecShip = (await import(pathToFileURL(candidate).href));
59
+ return cachedSpecShip;
60
+ }
61
+ }
62
+ catch { /* fall through */ }
63
+ // Workspace/dev: resolve via the named dep.
64
+ cachedSpecShip = await import('@selvakumaresra/specship');
65
+ return cachedSpecShip;
66
+ }
67
+ export async function createServer(options) {
68
+ const host = options.host ?? '127.0.0.1';
69
+ const port = options.port ?? 4242;
70
+ const verbose = options.verbose ?? false;
71
+ const app = Fastify({
72
+ logger: verbose
73
+ ? { transport: { target: 'pino-pretty', options: { translateTime: 'HH:MM:ss.l' } } }
74
+ : false,
75
+ });
76
+ if (options.cors !== false) {
77
+ // Permissive CORS for local dev. The server is bound to loopback by
78
+ // default, so the broad allowlist is fine — Browsers won't get to it
79
+ // from a non-localhost origin without explicit user override.
80
+ await app.register(cors, {
81
+ origin: true,
82
+ credentials: false,
83
+ });
84
+ }
85
+ // Lazy-load specship. Used as the open() impl for the registry, and
86
+ // (only when a primary path is set) to open the primary instance below.
87
+ const cgMod = await loadSpecShip();
88
+ const registry = new ProjectRegistry({ verbose }, (p) => cgMod.SpecShip.open(p));
89
+ // Primary project (optional). When set, specship-scoped routes default to
90
+ // it when no `?project=<slug>` is provided, and the analytics ingest
91
+ // hooks into its SQLite handle.
92
+ let primaryCg = null;
93
+ if (options.projectRoot) {
94
+ primaryCg = await registry.get(options.projectRoot);
95
+ if (!primaryCg && verbose) {
96
+ console.error(`[specship-server] primary project ${options.projectRoot} not initialized — booting projectless`);
97
+ }
98
+ }
99
+ // Start the JSONL ingest watcher in-process unless the caller already
100
+ // provided one or explicitly opted out. Hooks into the primary project's
101
+ // SQLite handle — when there's no primary, analytics endpoints will return
102
+ // 409 until one is set (typically the next server restart with -p).
103
+ let watcher = options.watcher ?? null;
104
+ let ownedWatcher = false;
105
+ if (!watcher && options.ingest !== false && primaryCg) {
106
+ const cgAny = primaryCg;
107
+ const dbHandle = cgAny.db?.getDb ? cgAny.db.getDb() : cgAny.queries?.db;
108
+ if (dbHandle) {
109
+ // Build a sync resolveGraph: for the primary project path return the
110
+ // already-open SpecShip instance (which satisfies GraphLike).
111
+ // Sessions from other project paths resolve to null — they'll be left
112
+ // as 'unresolved' and retried on the next boot when that project is primary.
113
+ // The stored project_path is the lossy-decoded slug (every '-' → '/'), so
114
+ // an exact compare against the real primaryPath never matched and savings
115
+ // stayed 0. primaryProjectMatcher accepts both the real path and its
116
+ // mangled stored form. Sessions from OTHER projects still resolve to null
117
+ // (left 'unresolved', retried when that project is primary).
118
+ const primaryPath = options.projectRoot ?? null;
119
+ const isPrimary = primaryPath ? primaryProjectMatcher(primaryPath) : () => false;
120
+ const resolveGraph = (projectPath) => primaryPath && isPrimary(projectPath) ? primaryCg : null;
121
+ watcher = startWatcher(dbHandle, { verbose, resolveGraph });
122
+ ownedWatcher = true;
123
+ if (verbose)
124
+ console.error('[specship-server] JSONL ingest watcher started');
125
+ // Backfill displaced_files / resolution for pre-upgrade rows (is_specship=1,
126
+ // resolution IS NULL). Idempotent — safe to run on every boot. Non-fatal:
127
+ // a failure here must never abort server startup.
128
+ try {
129
+ backfillDisplaced(dbHandle, resolveGraph);
130
+ if (verbose)
131
+ console.error('[specship-server] specship-impact backfill complete');
132
+ }
133
+ catch (err) {
134
+ console.error('[specship-server] specship-impact backfill failed (non-fatal):', err instanceof Error ? err.message : String(err));
135
+ }
136
+ }
137
+ }
138
+ else if (!primaryCg && options.ingest !== false && verbose) {
139
+ console.error('[specship-server] no primary project — analytics will be empty until one is set');
140
+ }
141
+ // Decorate the Fastify instance so route handlers can access shared state
142
+ // without globals or DI containers.
143
+ app.decorate('projects', registry);
144
+ app.decorate('primaryCg', primaryCg);
145
+ app.decorate('watcher', watcher);
146
+ // activeCg(req): resolve `?project=<slug>` → SpecShip instance, with the
147
+ // primary as fallback. Returns null when nothing is selectable; route
148
+ // handlers respond 409 in that case.
149
+ app.decorate('activeCg', async function (req) {
150
+ const q = (req.query ?? {});
151
+ if (q.project) {
152
+ const bySlug = await registry.getBySlug(q.project);
153
+ if (bySlug)
154
+ return bySlug;
155
+ }
156
+ if (q.projectPath) {
157
+ const byPath = await registry.get(q.projectPath);
158
+ if (byPath)
159
+ return byPath;
160
+ }
161
+ return primaryCg;
162
+ });
163
+ // Register route groups.
164
+ await registerStatusRoutes(app);
165
+ await registerGraphRoutes(app);
166
+ await registerSpecRoutes(app);
167
+ await registerWorkflowRoutes(app);
168
+ await registerClaudeRoutes(app);
169
+ await registerMemoryRoutes(app);
170
+ await registerProjectsRoutes(app);
171
+ await registerEventsRoutes(app);
172
+ await registerReflectRoutes(app);
173
+ await registerMaintainabilityRoutes(app);
174
+ await registerDomainRoutes(app);
175
+ // Optional: serve the built Angular UI from `webDir` and fall back to
176
+ // index.html for client-side routes. Must register AFTER the /api/*
177
+ // routes so they take precedence over the SPA wildcard.
178
+ if (options.webDir) {
179
+ const indexPath = path.join(options.webDir, 'index.html');
180
+ let indexBuffer = null;
181
+ try {
182
+ indexBuffer = await fs.readFile(indexPath);
183
+ }
184
+ catch {
185
+ if (verbose) {
186
+ console.error(`[specship-server] webDir provided but index.html not found at ${indexPath} — skipping static mount`);
187
+ }
188
+ }
189
+ if (indexBuffer) {
190
+ const cachedIndex = indexBuffer;
191
+ const serveStatic = makeStaticHandler(options.webDir);
192
+ // A single 404 handler does both jobs:
193
+ // 1. Try the requested URL as a real file under webDir → serve it
194
+ // with the right content-type. Covers the SPA's chunk-*.js,
195
+ // styles.css, favicons, fonts, etc.
196
+ // 2. Fall through to index.html for any other GET so Angular's
197
+ // client-side router can take over (`/memory`, `/graph`, …).
198
+ // Non-GET methods and `/api/*` paths still 404 cleanly so the UI
199
+ // can surface them.
200
+ app.setNotFoundHandler((request, reply) => {
201
+ if (request.method !== 'GET') {
202
+ reply.code(404).send({ error: 'not found' });
203
+ return;
204
+ }
205
+ if (request.url.startsWith('/api/')) {
206
+ reply.code(404).send({ error: 'not found' });
207
+ return;
208
+ }
209
+ const hit = serveStatic(request.url);
210
+ if (hit) {
211
+ reply.code(200).type(hit.contentType).send(hit.body);
212
+ return;
213
+ }
214
+ reply.code(200).type('text/html').send(cachedIndex);
215
+ });
216
+ if (verbose)
217
+ console.error(`[specship-server] serving SPA from ${options.webDir}`);
218
+ }
219
+ }
220
+ await app.listen({ host, port });
221
+ const url = `http://${host}:${port}`;
222
+ return {
223
+ app,
224
+ url,
225
+ host,
226
+ port,
227
+ stop: async () => {
228
+ if (ownedWatcher && watcher) {
229
+ try {
230
+ watcher.stop();
231
+ }
232
+ catch { /* ignore */ }
233
+ }
234
+ registry.closeAll();
235
+ await app.close();
236
+ },
237
+ };
238
+ }