@selvakumaresra/specship 0.1.2 → 0.1.3

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 (576) hide show
  1. package/package.json +8 -3
  2. package/scripts/sync-shim-version.mjs +64 -0
  3. package/dist/bin/node-version-check.d.ts +0 -37
  4. package/dist/bin/node-version-check.d.ts.map +0 -1
  5. package/dist/bin/node-version-check.js +0 -79
  6. package/dist/bin/node-version-check.js.map +0 -1
  7. package/dist/bin/specship.d.ts +0 -25
  8. package/dist/bin/specship.d.ts.map +0 -1
  9. package/dist/bin/specship.js +0 -2018
  10. package/dist/bin/specship.js.map +0 -1
  11. package/dist/bin/uninstall.d.ts +0 -13
  12. package/dist/bin/uninstall.d.ts.map +0 -1
  13. package/dist/bin/uninstall.js +0 -35
  14. package/dist/bin/uninstall.js.map +0 -1
  15. package/dist/context/formatter.d.ts +0 -30
  16. package/dist/context/formatter.d.ts.map +0 -1
  17. package/dist/context/formatter.js +0 -263
  18. package/dist/context/formatter.js.map +0 -1
  19. package/dist/context/index.d.ts +0 -119
  20. package/dist/context/index.d.ts.map +0 -1
  21. package/dist/context/index.js +0 -1289
  22. package/dist/context/index.js.map +0 -1
  23. package/dist/context/markers.d.ts +0 -19
  24. package/dist/context/markers.d.ts.map +0 -1
  25. package/dist/context/markers.js +0 -22
  26. package/dist/context/markers.js.map +0 -1
  27. package/dist/db/index.d.ts +0 -101
  28. package/dist/db/index.d.ts.map +0 -1
  29. package/dist/db/index.js +0 -276
  30. package/dist/db/index.js.map +0 -1
  31. package/dist/db/migrations.d.ts +0 -44
  32. package/dist/db/migrations.d.ts.map +0 -1
  33. package/dist/db/migrations.js +0 -427
  34. package/dist/db/migrations.js.map +0 -1
  35. package/dist/db/queries.d.ts +0 -357
  36. package/dist/db/queries.d.ts.map +0 -1
  37. package/dist/db/queries.js +0 -1504
  38. package/dist/db/queries.js.map +0 -1
  39. package/dist/db/schema.sql +0 -410
  40. package/dist/db/spec-queries.d.ts +0 -101
  41. package/dist/db/spec-queries.d.ts.map +0 -1
  42. package/dist/db/spec-queries.js +0 -675
  43. package/dist/db/spec-queries.js.map +0 -1
  44. package/dist/db/sqlite-adapter.d.ts +0 -65
  45. package/dist/db/sqlite-adapter.d.ts.map +0 -1
  46. package/dist/db/sqlite-adapter.js +0 -214
  47. package/dist/db/sqlite-adapter.js.map +0 -1
  48. package/dist/directory.d.ts +0 -57
  49. package/dist/directory.d.ts.map +0 -1
  50. package/dist/directory.js +0 -253
  51. package/dist/directory.js.map +0 -1
  52. package/dist/errors.d.ts +0 -136
  53. package/dist/errors.d.ts.map +0 -1
  54. package/dist/errors.js +0 -219
  55. package/dist/errors.js.map +0 -1
  56. package/dist/extraction/dfm-extractor.d.ts +0 -31
  57. package/dist/extraction/dfm-extractor.d.ts.map +0 -1
  58. package/dist/extraction/dfm-extractor.js +0 -151
  59. package/dist/extraction/dfm-extractor.js.map +0 -1
  60. package/dist/extraction/generated-detection.d.ts +0 -30
  61. package/dist/extraction/generated-detection.d.ts.map +0 -1
  62. package/dist/extraction/generated-detection.js +0 -80
  63. package/dist/extraction/generated-detection.js.map +0 -1
  64. package/dist/extraction/grammars.d.ts +0 -100
  65. package/dist/extraction/grammars.d.ts.map +0 -1
  66. package/dist/extraction/grammars.js +0 -426
  67. package/dist/extraction/grammars.js.map +0 -1
  68. package/dist/extraction/index.d.ts +0 -138
  69. package/dist/extraction/index.d.ts.map +0 -1
  70. package/dist/extraction/index.js +0 -1394
  71. package/dist/extraction/index.js.map +0 -1
  72. package/dist/extraction/languages/c-cpp.d.ts +0 -4
  73. package/dist/extraction/languages/c-cpp.d.ts.map +0 -1
  74. package/dist/extraction/languages/c-cpp.js +0 -171
  75. package/dist/extraction/languages/c-cpp.js.map +0 -1
  76. package/dist/extraction/languages/csharp.d.ts +0 -3
  77. package/dist/extraction/languages/csharp.d.ts.map +0 -1
  78. package/dist/extraction/languages/csharp.js +0 -73
  79. package/dist/extraction/languages/csharp.js.map +0 -1
  80. package/dist/extraction/languages/dart.d.ts +0 -3
  81. package/dist/extraction/languages/dart.d.ts.map +0 -1
  82. package/dist/extraction/languages/dart.js +0 -192
  83. package/dist/extraction/languages/dart.js.map +0 -1
  84. package/dist/extraction/languages/go.d.ts +0 -3
  85. package/dist/extraction/languages/go.d.ts.map +0 -1
  86. package/dist/extraction/languages/go.js +0 -74
  87. package/dist/extraction/languages/go.js.map +0 -1
  88. package/dist/extraction/languages/index.d.ts +0 -10
  89. package/dist/extraction/languages/index.d.ts.map +0 -1
  90. package/dist/extraction/languages/index.js +0 -51
  91. package/dist/extraction/languages/index.js.map +0 -1
  92. package/dist/extraction/languages/java.d.ts +0 -3
  93. package/dist/extraction/languages/java.d.ts.map +0 -1
  94. package/dist/extraction/languages/java.js +0 -70
  95. package/dist/extraction/languages/java.js.map +0 -1
  96. package/dist/extraction/languages/javascript.d.ts +0 -3
  97. package/dist/extraction/languages/javascript.d.ts.map +0 -1
  98. package/dist/extraction/languages/javascript.js +0 -90
  99. package/dist/extraction/languages/javascript.js.map +0 -1
  100. package/dist/extraction/languages/kotlin.d.ts +0 -3
  101. package/dist/extraction/languages/kotlin.d.ts.map +0 -1
  102. package/dist/extraction/languages/kotlin.js +0 -259
  103. package/dist/extraction/languages/kotlin.js.map +0 -1
  104. package/dist/extraction/languages/lua.d.ts +0 -3
  105. package/dist/extraction/languages/lua.d.ts.map +0 -1
  106. package/dist/extraction/languages/lua.js +0 -150
  107. package/dist/extraction/languages/lua.js.map +0 -1
  108. package/dist/extraction/languages/luau.d.ts +0 -3
  109. package/dist/extraction/languages/luau.d.ts.map +0 -1
  110. package/dist/extraction/languages/luau.js +0 -37
  111. package/dist/extraction/languages/luau.js.map +0 -1
  112. package/dist/extraction/languages/objc.d.ts +0 -3
  113. package/dist/extraction/languages/objc.d.ts.map +0 -1
  114. package/dist/extraction/languages/objc.js +0 -133
  115. package/dist/extraction/languages/objc.js.map +0 -1
  116. package/dist/extraction/languages/pascal.d.ts +0 -3
  117. package/dist/extraction/languages/pascal.d.ts.map +0 -1
  118. package/dist/extraction/languages/pascal.js +0 -66
  119. package/dist/extraction/languages/pascal.js.map +0 -1
  120. package/dist/extraction/languages/php.d.ts +0 -3
  121. package/dist/extraction/languages/php.d.ts.map +0 -1
  122. package/dist/extraction/languages/php.js +0 -107
  123. package/dist/extraction/languages/php.js.map +0 -1
  124. package/dist/extraction/languages/python.d.ts +0 -3
  125. package/dist/extraction/languages/python.d.ts.map +0 -1
  126. package/dist/extraction/languages/python.js +0 -56
  127. package/dist/extraction/languages/python.js.map +0 -1
  128. package/dist/extraction/languages/ruby.d.ts +0 -3
  129. package/dist/extraction/languages/ruby.d.ts.map +0 -1
  130. package/dist/extraction/languages/ruby.js +0 -114
  131. package/dist/extraction/languages/ruby.js.map +0 -1
  132. package/dist/extraction/languages/rust.d.ts +0 -3
  133. package/dist/extraction/languages/rust.d.ts.map +0 -1
  134. package/dist/extraction/languages/rust.js +0 -109
  135. package/dist/extraction/languages/rust.js.map +0 -1
  136. package/dist/extraction/languages/scala.d.ts +0 -3
  137. package/dist/extraction/languages/scala.d.ts.map +0 -1
  138. package/dist/extraction/languages/scala.js +0 -139
  139. package/dist/extraction/languages/scala.js.map +0 -1
  140. package/dist/extraction/languages/swift.d.ts +0 -3
  141. package/dist/extraction/languages/swift.d.ts.map +0 -1
  142. package/dist/extraction/languages/swift.js +0 -91
  143. package/dist/extraction/languages/swift.js.map +0 -1
  144. package/dist/extraction/languages/typescript.d.ts +0 -3
  145. package/dist/extraction/languages/typescript.d.ts.map +0 -1
  146. package/dist/extraction/languages/typescript.js +0 -129
  147. package/dist/extraction/languages/typescript.js.map +0 -1
  148. package/dist/extraction/liquid-extractor.d.ts +0 -52
  149. package/dist/extraction/liquid-extractor.d.ts.map +0 -1
  150. package/dist/extraction/liquid-extractor.js +0 -313
  151. package/dist/extraction/liquid-extractor.js.map +0 -1
  152. package/dist/extraction/mybatis-extractor.d.ts +0 -48
  153. package/dist/extraction/mybatis-extractor.d.ts.map +0 -1
  154. package/dist/extraction/mybatis-extractor.js +0 -198
  155. package/dist/extraction/mybatis-extractor.js.map +0 -1
  156. package/dist/extraction/parse-worker.d.ts +0 -8
  157. package/dist/extraction/parse-worker.d.ts.map +0 -1
  158. package/dist/extraction/parse-worker.js +0 -94
  159. package/dist/extraction/parse-worker.js.map +0 -1
  160. package/dist/extraction/specs/markdown-spec-extractor.d.ts +0 -59
  161. package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +0 -1
  162. package/dist/extraction/specs/markdown-spec-extractor.js +0 -327
  163. package/dist/extraction/specs/markdown-spec-extractor.js.map +0 -1
  164. package/dist/extraction/specs/types.d.ts +0 -39
  165. package/dist/extraction/specs/types.d.ts.map +0 -1
  166. package/dist/extraction/specs/types.js +0 -8
  167. package/dist/extraction/specs/types.js.map +0 -1
  168. package/dist/extraction/svelte-extractor.d.ts +0 -56
  169. package/dist/extraction/svelte-extractor.d.ts.map +0 -1
  170. package/dist/extraction/svelte-extractor.js +0 -272
  171. package/dist/extraction/svelte-extractor.js.map +0 -1
  172. package/dist/extraction/tree-sitter-helpers.d.ts +0 -28
  173. package/dist/extraction/tree-sitter-helpers.d.ts.map +0 -1
  174. package/dist/extraction/tree-sitter-helpers.js +0 -103
  175. package/dist/extraction/tree-sitter-helpers.js.map +0 -1
  176. package/dist/extraction/tree-sitter-types.d.ts +0 -193
  177. package/dist/extraction/tree-sitter-types.d.ts.map +0 -1
  178. package/dist/extraction/tree-sitter-types.js +0 -10
  179. package/dist/extraction/tree-sitter-types.js.map +0 -1
  180. package/dist/extraction/tree-sitter.d.ts +0 -317
  181. package/dist/extraction/tree-sitter.d.ts.map +0 -1
  182. package/dist/extraction/tree-sitter.js +0 -3092
  183. package/dist/extraction/tree-sitter.js.map +0 -1
  184. package/dist/extraction/vue-extractor.d.ts +0 -51
  185. package/dist/extraction/vue-extractor.d.ts.map +0 -1
  186. package/dist/extraction/vue-extractor.js +0 -251
  187. package/dist/extraction/vue-extractor.js.map +0 -1
  188. package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  189. package/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
  190. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  191. package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  192. package/dist/extraction/wasm-runtime-flags.d.ts +0 -38
  193. package/dist/extraction/wasm-runtime-flags.d.ts.map +0 -1
  194. package/dist/extraction/wasm-runtime-flags.js +0 -106
  195. package/dist/extraction/wasm-runtime-flags.js.map +0 -1
  196. package/dist/graph/index.d.ts +0 -8
  197. package/dist/graph/index.d.ts.map +0 -1
  198. package/dist/graph/index.js +0 -13
  199. package/dist/graph/index.js.map +0 -1
  200. package/dist/graph/queries.d.ts +0 -106
  201. package/dist/graph/queries.d.ts.map +0 -1
  202. package/dist/graph/queries.js +0 -366
  203. package/dist/graph/queries.js.map +0 -1
  204. package/dist/graph/traversal.d.ts +0 -127
  205. package/dist/graph/traversal.d.ts.map +0 -1
  206. package/dist/graph/traversal.js +0 -531
  207. package/dist/graph/traversal.js.map +0 -1
  208. package/dist/index.d.ts +0 -551
  209. package/dist/index.d.ts.map +0 -1
  210. package/dist/index.js +0 -1165
  211. package/dist/index.js.map +0 -1
  212. package/dist/installer/config-writer.d.ts +0 -28
  213. package/dist/installer/config-writer.d.ts.map +0 -1
  214. package/dist/installer/config-writer.js +0 -91
  215. package/dist/installer/config-writer.js.map +0 -1
  216. package/dist/installer/index.d.ts +0 -87
  217. package/dist/installer/index.d.ts.map +0 -1
  218. package/dist/installer/index.js +0 -409
  219. package/dist/installer/index.js.map +0 -1
  220. package/dist/installer/instructions-template.d.ts +0 -18
  221. package/dist/installer/instructions-template.d.ts.map +0 -1
  222. package/dist/installer/instructions-template.js +0 -21
  223. package/dist/installer/instructions-template.js.map +0 -1
  224. package/dist/installer/targets/claude.d.ts +0 -88
  225. package/dist/installer/targets/claude.d.ts.map +0 -1
  226. package/dist/installer/targets/claude.js +0 -582
  227. package/dist/installer/targets/claude.js.map +0 -1
  228. package/dist/installer/targets/registry.d.ts +0 -19
  229. package/dist/installer/targets/registry.d.ts.map +0 -1
  230. package/dist/installer/targets/registry.js +0 -31
  231. package/dist/installer/targets/registry.js.map +0 -1
  232. package/dist/installer/targets/shared.d.ts +0 -62
  233. package/dist/installer/targets/shared.d.ts.map +0 -1
  234. package/dist/installer/targets/shared.js +0 -207
  235. package/dist/installer/targets/shared.js.map +0 -1
  236. package/dist/installer/targets/types.d.ts +0 -76
  237. package/dist/installer/targets/types.d.ts.map +0 -1
  238. package/dist/installer/targets/types.js +0 -12
  239. package/dist/installer/targets/types.js.map +0 -1
  240. package/dist/isolation/worktree.d.ts +0 -65
  241. package/dist/isolation/worktree.d.ts.map +0 -1
  242. package/dist/isolation/worktree.js +0 -231
  243. package/dist/isolation/worktree.js.map +0 -1
  244. package/dist/mcp/daemon-paths.d.ts +0 -46
  245. package/dist/mcp/daemon-paths.d.ts.map +0 -1
  246. package/dist/mcp/daemon-paths.js +0 -125
  247. package/dist/mcp/daemon-paths.js.map +0 -1
  248. package/dist/mcp/daemon.d.ts +0 -161
  249. package/dist/mcp/daemon.d.ts.map +0 -1
  250. package/dist/mcp/daemon.js +0 -403
  251. package/dist/mcp/daemon.js.map +0 -1
  252. package/dist/mcp/engine.d.ts +0 -105
  253. package/dist/mcp/engine.d.ts.map +0 -1
  254. package/dist/mcp/engine.js +0 -270
  255. package/dist/mcp/engine.js.map +0 -1
  256. package/dist/mcp/index.d.ts +0 -112
  257. package/dist/mcp/index.d.ts.map +0 -1
  258. package/dist/mcp/index.js +0 -477
  259. package/dist/mcp/index.js.map +0 -1
  260. package/dist/mcp/proxy.d.ts +0 -81
  261. package/dist/mcp/proxy.d.ts.map +0 -1
  262. package/dist/mcp/proxy.js +0 -510
  263. package/dist/mcp/proxy.js.map +0 -1
  264. package/dist/mcp/server-instructions.d.ts +0 -18
  265. package/dist/mcp/server-instructions.d.ts.map +0 -1
  266. package/dist/mcp/server-instructions.js +0 -77
  267. package/dist/mcp/server-instructions.js.map +0 -1
  268. package/dist/mcp/session.d.ts +0 -77
  269. package/dist/mcp/session.d.ts.map +0 -1
  270. package/dist/mcp/session.js +0 -294
  271. package/dist/mcp/session.js.map +0 -1
  272. package/dist/mcp/spec-tools.d.ts +0 -39
  273. package/dist/mcp/spec-tools.d.ts.map +0 -1
  274. package/dist/mcp/spec-tools.js +0 -326
  275. package/dist/mcp/spec-tools.js.map +0 -1
  276. package/dist/mcp/tools.d.ts +0 -404
  277. package/dist/mcp/tools.d.ts.map +0 -1
  278. package/dist/mcp/tools.js +0 -3066
  279. package/dist/mcp/tools.js.map +0 -1
  280. package/dist/mcp/transport.d.ts +0 -188
  281. package/dist/mcp/transport.d.ts.map +0 -1
  282. package/dist/mcp/transport.js +0 -343
  283. package/dist/mcp/transport.js.map +0 -1
  284. package/dist/mcp/version.d.ts +0 -19
  285. package/dist/mcp/version.d.ts.map +0 -1
  286. package/dist/mcp/version.js +0 -71
  287. package/dist/mcp/version.js.map +0 -1
  288. package/dist/resolution/callback-synthesizer.d.ts +0 -10
  289. package/dist/resolution/callback-synthesizer.d.ts.map +0 -1
  290. package/dist/resolution/callback-synthesizer.js +0 -1300
  291. package/dist/resolution/callback-synthesizer.js.map +0 -1
  292. package/dist/resolution/frameworks/cargo-workspace.d.ts +0 -18
  293. package/dist/resolution/frameworks/cargo-workspace.d.ts.map +0 -1
  294. package/dist/resolution/frameworks/cargo-workspace.js +0 -225
  295. package/dist/resolution/frameworks/cargo-workspace.js.map +0 -1
  296. package/dist/resolution/frameworks/csharp.d.ts +0 -8
  297. package/dist/resolution/frameworks/csharp.d.ts.map +0 -1
  298. package/dist/resolution/frameworks/csharp.js +0 -241
  299. package/dist/resolution/frameworks/csharp.js.map +0 -1
  300. package/dist/resolution/frameworks/drupal.d.ts +0 -51
  301. package/dist/resolution/frameworks/drupal.d.ts.map +0 -1
  302. package/dist/resolution/frameworks/drupal.js +0 -367
  303. package/dist/resolution/frameworks/drupal.js.map +0 -1
  304. package/dist/resolution/frameworks/expo-modules.d.ts +0 -3
  305. package/dist/resolution/frameworks/expo-modules.d.ts.map +0 -1
  306. package/dist/resolution/frameworks/expo-modules.js +0 -143
  307. package/dist/resolution/frameworks/expo-modules.js.map +0 -1
  308. package/dist/resolution/frameworks/express.d.ts +0 -8
  309. package/dist/resolution/frameworks/express.d.ts.map +0 -1
  310. package/dist/resolution/frameworks/express.js +0 -308
  311. package/dist/resolution/frameworks/express.js.map +0 -1
  312. package/dist/resolution/frameworks/fabric.d.ts +0 -3
  313. package/dist/resolution/frameworks/fabric.d.ts.map +0 -1
  314. package/dist/resolution/frameworks/fabric.js +0 -354
  315. package/dist/resolution/frameworks/fabric.js.map +0 -1
  316. package/dist/resolution/frameworks/go.d.ts +0 -8
  317. package/dist/resolution/frameworks/go.d.ts.map +0 -1
  318. package/dist/resolution/frameworks/go.js +0 -161
  319. package/dist/resolution/frameworks/go.js.map +0 -1
  320. package/dist/resolution/frameworks/index.d.ts +0 -48
  321. package/dist/resolution/frameworks/index.d.ts.map +0 -1
  322. package/dist/resolution/frameworks/index.js +0 -161
  323. package/dist/resolution/frameworks/index.js.map +0 -1
  324. package/dist/resolution/frameworks/java.d.ts +0 -8
  325. package/dist/resolution/frameworks/java.d.ts.map +0 -1
  326. package/dist/resolution/frameworks/java.js +0 -504
  327. package/dist/resolution/frameworks/java.js.map +0 -1
  328. package/dist/resolution/frameworks/laravel.d.ts +0 -13
  329. package/dist/resolution/frameworks/laravel.d.ts.map +0 -1
  330. package/dist/resolution/frameworks/laravel.js +0 -257
  331. package/dist/resolution/frameworks/laravel.js.map +0 -1
  332. package/dist/resolution/frameworks/nestjs.d.ts +0 -26
  333. package/dist/resolution/frameworks/nestjs.d.ts.map +0 -1
  334. package/dist/resolution/frameworks/nestjs.js +0 -698
  335. package/dist/resolution/frameworks/nestjs.js.map +0 -1
  336. package/dist/resolution/frameworks/play.d.ts +0 -19
  337. package/dist/resolution/frameworks/play.d.ts.map +0 -1
  338. package/dist/resolution/frameworks/play.js +0 -111
  339. package/dist/resolution/frameworks/play.js.map +0 -1
  340. package/dist/resolution/frameworks/python.d.ts +0 -10
  341. package/dist/resolution/frameworks/python.d.ts.map +0 -1
  342. package/dist/resolution/frameworks/python.js +0 -396
  343. package/dist/resolution/frameworks/python.js.map +0 -1
  344. package/dist/resolution/frameworks/react-native.d.ts +0 -3
  345. package/dist/resolution/frameworks/react-native.d.ts.map +0 -1
  346. package/dist/resolution/frameworks/react-native.js +0 -360
  347. package/dist/resolution/frameworks/react-native.js.map +0 -1
  348. package/dist/resolution/frameworks/react.d.ts +0 -8
  349. package/dist/resolution/frameworks/react.d.ts.map +0 -1
  350. package/dist/resolution/frameworks/react.js +0 -365
  351. package/dist/resolution/frameworks/react.js.map +0 -1
  352. package/dist/resolution/frameworks/ruby.d.ts +0 -8
  353. package/dist/resolution/frameworks/ruby.d.ts.map +0 -1
  354. package/dist/resolution/frameworks/ruby.js +0 -302
  355. package/dist/resolution/frameworks/ruby.js.map +0 -1
  356. package/dist/resolution/frameworks/rust.d.ts +0 -8
  357. package/dist/resolution/frameworks/rust.d.ts.map +0 -1
  358. package/dist/resolution/frameworks/rust.js +0 -304
  359. package/dist/resolution/frameworks/rust.js.map +0 -1
  360. package/dist/resolution/frameworks/svelte.d.ts +0 -9
  361. package/dist/resolution/frameworks/svelte.d.ts.map +0 -1
  362. package/dist/resolution/frameworks/svelte.js +0 -249
  363. package/dist/resolution/frameworks/svelte.js.map +0 -1
  364. package/dist/resolution/frameworks/swift-objc.d.ts +0 -37
  365. package/dist/resolution/frameworks/swift-objc.d.ts.map +0 -1
  366. package/dist/resolution/frameworks/swift-objc.js +0 -252
  367. package/dist/resolution/frameworks/swift-objc.js.map +0 -1
  368. package/dist/resolution/frameworks/swift.d.ts +0 -10
  369. package/dist/resolution/frameworks/swift.d.ts.map +0 -1
  370. package/dist/resolution/frameworks/swift.js +0 -400
  371. package/dist/resolution/frameworks/swift.js.map +0 -1
  372. package/dist/resolution/frameworks/vue.d.ts +0 -9
  373. package/dist/resolution/frameworks/vue.d.ts.map +0 -1
  374. package/dist/resolution/frameworks/vue.js +0 -306
  375. package/dist/resolution/frameworks/vue.js.map +0 -1
  376. package/dist/resolution/go-module.d.ts +0 -26
  377. package/dist/resolution/go-module.d.ts.map +0 -1
  378. package/dist/resolution/go-module.js +0 -78
  379. package/dist/resolution/go-module.js.map +0 -1
  380. package/dist/resolution/import-resolver.d.ts +0 -68
  381. package/dist/resolution/import-resolver.d.ts.map +0 -1
  382. package/dist/resolution/import-resolver.js +0 -1275
  383. package/dist/resolution/import-resolver.js.map +0 -1
  384. package/dist/resolution/index.d.ts +0 -117
  385. package/dist/resolution/index.d.ts.map +0 -1
  386. package/dist/resolution/index.js +0 -895
  387. package/dist/resolution/index.js.map +0 -1
  388. package/dist/resolution/lru-cache.d.ts +0 -24
  389. package/dist/resolution/lru-cache.d.ts.map +0 -1
  390. package/dist/resolution/lru-cache.js +0 -62
  391. package/dist/resolution/lru-cache.js.map +0 -1
  392. package/dist/resolution/name-matcher.d.ts +0 -32
  393. package/dist/resolution/name-matcher.d.ts.map +0 -1
  394. package/dist/resolution/name-matcher.js +0 -596
  395. package/dist/resolution/name-matcher.js.map +0 -1
  396. package/dist/resolution/path-aliases.d.ts +0 -68
  397. package/dist/resolution/path-aliases.d.ts.map +0 -1
  398. package/dist/resolution/path-aliases.js +0 -238
  399. package/dist/resolution/path-aliases.js.map +0 -1
  400. package/dist/resolution/spec-link-resolver.d.ts +0 -103
  401. package/dist/resolution/spec-link-resolver.d.ts.map +0 -1
  402. package/dist/resolution/spec-link-resolver.js +0 -259
  403. package/dist/resolution/spec-link-resolver.js.map +0 -1
  404. package/dist/resolution/strip-comments.d.ts +0 -27
  405. package/dist/resolution/strip-comments.d.ts.map +0 -1
  406. package/dist/resolution/strip-comments.js +0 -441
  407. package/dist/resolution/strip-comments.js.map +0 -1
  408. package/dist/resolution/swift-objc-bridge.d.ts +0 -134
  409. package/dist/resolution/swift-objc-bridge.d.ts.map +0 -1
  410. package/dist/resolution/swift-objc-bridge.js +0 -256
  411. package/dist/resolution/swift-objc-bridge.js.map +0 -1
  412. package/dist/resolution/types.d.ts +0 -216
  413. package/dist/resolution/types.d.ts.map +0 -1
  414. package/dist/resolution/types.js +0 -8
  415. package/dist/resolution/types.js.map +0 -1
  416. package/dist/resolution/workspace-packages.d.ts +0 -48
  417. package/dist/resolution/workspace-packages.d.ts.map +0 -1
  418. package/dist/resolution/workspace-packages.js +0 -208
  419. package/dist/resolution/workspace-packages.js.map +0 -1
  420. package/dist/search/query-parser.d.ts +0 -57
  421. package/dist/search/query-parser.d.ts.map +0 -1
  422. package/dist/search/query-parser.js +0 -177
  423. package/dist/search/query-parser.js.map +0 -1
  424. package/dist/search/query-utils.d.ts +0 -71
  425. package/dist/search/query-utils.d.ts.map +0 -1
  426. package/dist/search/query-utils.js +0 -380
  427. package/dist/search/query-utils.js.map +0 -1
  428. package/dist/server/cli.js +0 -152
  429. package/dist/server/index.js +0 -12
  430. package/dist/server/ingest/index.js +0 -18
  431. package/dist/server/ingest/ingestor.js +0 -406
  432. package/dist/server/ingest/parser.js +0 -104
  433. package/dist/server/ingest/pricing.js +0 -78
  434. package/dist/server/ingest/types.js +0 -9
  435. package/dist/server/ingest/watcher.js +0 -77
  436. package/dist/server/package.json +0 -3
  437. package/dist/server/project-registry.js +0 -101
  438. package/dist/server/routes/claude.js +0 -480
  439. package/dist/server/routes/graph.js +0 -149
  440. package/dist/server/routes/memory.js +0 -272
  441. package/dist/server/routes/projects.js +0 -197
  442. package/dist/server/routes/spec.js +0 -105
  443. package/dist/server/routes/status.js +0 -35
  444. package/dist/server/routes/workflow.js +0 -184
  445. package/dist/server/server.js +0 -206
  446. package/dist/server/static-handler.js +0 -87
  447. package/dist/sync/git-hooks.d.ts +0 -45
  448. package/dist/sync/git-hooks.d.ts.map +0 -1
  449. package/dist/sync/git-hooks.js +0 -225
  450. package/dist/sync/git-hooks.js.map +0 -1
  451. package/dist/sync/index.d.ts +0 -19
  452. package/dist/sync/index.d.ts.map +0 -1
  453. package/dist/sync/index.js +0 -35
  454. package/dist/sync/index.js.map +0 -1
  455. package/dist/sync/watch-policy.d.ts +0 -48
  456. package/dist/sync/watch-policy.d.ts.map +0 -1
  457. package/dist/sync/watch-policy.js +0 -124
  458. package/dist/sync/watch-policy.js.map +0 -1
  459. package/dist/sync/watcher.d.ts +0 -283
  460. package/dist/sync/watcher.d.ts.map +0 -1
  461. package/dist/sync/watcher.js +0 -606
  462. package/dist/sync/watcher.js.map +0 -1
  463. package/dist/sync/worktree.d.ts +0 -54
  464. package/dist/sync/worktree.d.ts.map +0 -1
  465. package/dist/sync/worktree.js +0 -137
  466. package/dist/sync/worktree.js.map +0 -1
  467. package/dist/types.d.ts +0 -623
  468. package/dist/types.d.ts.map +0 -1
  469. package/dist/types.js +0 -108
  470. package/dist/types.js.map +0 -1
  471. package/dist/ui/glyphs.d.ts +0 -42
  472. package/dist/ui/glyphs.d.ts.map +0 -1
  473. package/dist/ui/glyphs.js +0 -78
  474. package/dist/ui/glyphs.js.map +0 -1
  475. package/dist/ui/shimmer-progress.d.ts +0 -11
  476. package/dist/ui/shimmer-progress.d.ts.map +0 -1
  477. package/dist/ui/shimmer-progress.js +0 -90
  478. package/dist/ui/shimmer-progress.js.map +0 -1
  479. package/dist/ui/shimmer-worker.d.ts +0 -2
  480. package/dist/ui/shimmer-worker.d.ts.map +0 -1
  481. package/dist/ui/shimmer-worker.js +0 -118
  482. package/dist/ui/shimmer-worker.js.map +0 -1
  483. package/dist/ui/types.d.ts +0 -17
  484. package/dist/ui/types.d.ts.map +0 -1
  485. package/dist/ui/types.js +0 -3
  486. package/dist/ui/types.js.map +0 -1
  487. package/dist/utils.d.ts +0 -205
  488. package/dist/utils.d.ts.map +0 -1
  489. package/dist/utils.js +0 -549
  490. package/dist/utils.js.map +0 -1
  491. package/dist/web/chunk-2YZXEHZ2.js +0 -1
  492. package/dist/web/chunk-3GIC555L.js +0 -18
  493. package/dist/web/chunk-3IIIGRMT.js +0 -1
  494. package/dist/web/chunk-47QYKLE5.js +0 -1
  495. package/dist/web/chunk-4LHBWWP7.js +0 -1
  496. package/dist/web/chunk-4OAZLD5W.js +0 -1
  497. package/dist/web/chunk-5OQKAJAE.js +0 -1
  498. package/dist/web/chunk-7B525GKQ.js +0 -1
  499. package/dist/web/chunk-BPDXCOOZ.js +0 -1
  500. package/dist/web/chunk-DT37HTZB.js +0 -1
  501. package/dist/web/chunk-EIMUHJND.js +0 -1
  502. package/dist/web/chunk-FTESTUEO.js +0 -1
  503. package/dist/web/chunk-GLJZV6MU.js +0 -1
  504. package/dist/web/chunk-I7LS67U5.js +0 -1
  505. package/dist/web/chunk-L4TVIPSR.js +0 -1
  506. package/dist/web/chunk-MASCULC2.js +0 -1
  507. package/dist/web/chunk-MW7ICSRM.js +0 -1
  508. package/dist/web/chunk-OI5VP2A3.js +0 -1
  509. package/dist/web/chunk-RA6EBF6I.js +0 -1
  510. package/dist/web/chunk-RP3WU5Y6.js +0 -1
  511. package/dist/web/chunk-RQDRMTXN.js +0 -1
  512. package/dist/web/chunk-TQMT6UDU.js +0 -1
  513. package/dist/web/chunk-U7IYOV7T.js +0 -1
  514. package/dist/web/chunk-UE227MWF.js +0 -1
  515. package/dist/web/chunk-WV573J4K.js +0 -1
  516. package/dist/web/chunk-WVCKOJZL.js +0 -4
  517. package/dist/web/chunk-XZKLVPHE.js +0 -1
  518. package/dist/web/chunk-ZABKKHJ3.js +0 -1
  519. package/dist/web/favicon-16.png +0 -0
  520. package/dist/web/favicon-180.png +0 -0
  521. package/dist/web/favicon-32.png +0 -0
  522. package/dist/web/favicon-512.png +0 -0
  523. package/dist/web/favicon-small.svg +0 -15
  524. package/dist/web/favicon.ico +0 -0
  525. package/dist/web/favicon.svg +0 -20
  526. package/dist/web/index.html +0 -145
  527. package/dist/web/main-RI5CO5Z4.js +0 -1
  528. package/dist/web/styles-CYN7IKT4.css +0 -1
  529. package/dist/workflows/condition-evaluator.d.ts +0 -75
  530. package/dist/workflows/condition-evaluator.d.ts.map +0 -1
  531. package/dist/workflows/condition-evaluator.js +0 -282
  532. package/dist/workflows/condition-evaluator.js.map +0 -1
  533. package/dist/workflows/defaults/index.d.ts +0 -26
  534. package/dist/workflows/defaults/index.d.ts.map +0 -1
  535. package/dist/workflows/defaults/index.js +0 -94
  536. package/dist/workflows/defaults/index.js.map +0 -1
  537. package/dist/workflows/defaults/spec-fix.yaml +0 -110
  538. package/dist/workflows/defaults/spec-implement.yaml +0 -150
  539. package/dist/workflows/defaults/spec-relink.yaml +0 -81
  540. package/dist/workflows/defaults/spec-verify.yaml +0 -51
  541. package/dist/workflows/discovery.d.ts +0 -46
  542. package/dist/workflows/discovery.d.ts.map +0 -1
  543. package/dist/workflows/discovery.js +0 -193
  544. package/dist/workflows/discovery.js.map +0 -1
  545. package/dist/workflows/executor.d.ts +0 -83
  546. package/dist/workflows/executor.d.ts.map +0 -1
  547. package/dist/workflows/executor.js +0 -623
  548. package/dist/workflows/executor.js.map +0 -1
  549. package/dist/workflows/runners/approval.d.ts +0 -18
  550. package/dist/workflows/runners/approval.d.ts.map +0 -1
  551. package/dist/workflows/runners/approval.js +0 -34
  552. package/dist/workflows/runners/approval.js.map +0 -1
  553. package/dist/workflows/runners/bash.d.ts +0 -13
  554. package/dist/workflows/runners/bash.d.ts.map +0 -1
  555. package/dist/workflows/runners/bash.js +0 -143
  556. package/dist/workflows/runners/bash.js.map +0 -1
  557. package/dist/workflows/runners/cancel.d.ts +0 -10
  558. package/dist/workflows/runners/cancel.d.ts.map +0 -1
  559. package/dist/workflows/runners/cancel.js +0 -19
  560. package/dist/workflows/runners/cancel.js.map +0 -1
  561. package/dist/workflows/runners/prompt.d.ts +0 -28
  562. package/dist/workflows/runners/prompt.d.ts.map +0 -1
  563. package/dist/workflows/runners/prompt.js +0 -212
  564. package/dist/workflows/runners/prompt.js.map +0 -1
  565. package/dist/workflows/runners/script.d.ts +0 -17
  566. package/dist/workflows/runners/script.d.ts.map +0 -1
  567. package/dist/workflows/runners/script.js +0 -155
  568. package/dist/workflows/runners/script.js.map +0 -1
  569. package/dist/workflows/runners/types.d.ts +0 -51
  570. package/dist/workflows/runners/types.d.ts.map +0 -1
  571. package/dist/workflows/runners/types.js +0 -13
  572. package/dist/workflows/runners/types.js.map +0 -1
  573. package/dist/workflows/schemas/workflow.d.ts +0 -166
  574. package/dist/workflows/schemas/workflow.d.ts.map +0 -1
  575. package/dist/workflows/schemas/workflow.js +0 -437
  576. package/dist/workflows/schemas/workflow.js.map +0 -1
@@ -1,149 +0,0 @@
1
- /**
2
- * Graph routes — node detail + explore + search.
3
- *
4
- * These are thin wrappers around methods on a SpecShip instance. Every
5
- * route resolves the active instance via `app.activeCg(req)`, which honors
6
- * `?project=<slug>` and falls back to the boot-time primary. When neither
7
- * is available, returns 409 / `no_project` so the desktop UI can show its
8
- * project picker instead of an opaque 500.
9
- *
10
- * The MCP layer's `specship_*` tools are markdown-formatted for agents;
11
- * here we return raw JSON so the UI can render visually.
12
- */
13
- /** Returns the active SpecShip or sends a 409. */
14
- async function resolveCg(app, req, reply) {
15
- const cg = await app.activeCg(req);
16
- if (!cg) {
17
- reply.code(409).send({ error: 'no project selected', code: 'no_project' });
18
- return null;
19
- }
20
- return cg;
21
- }
22
- export async function registerGraphRoutes(app) {
23
- app.get('/api/graph/stats', async (req, reply) => {
24
- const cg = await resolveCg(app, req, reply);
25
- if (!cg)
26
- return;
27
- return cg.getStats();
28
- });
29
- /**
30
- * List nodes with optional kind / file / limit filtering. For node-explorer
31
- * UI surfaces that want a flat paginated list.
32
- */
33
- app.get('/api/graph/nodes', async (req, reply) => {
34
- const cg = await resolveCg(app, req, reply);
35
- if (!cg)
36
- return;
37
- const limit = Math.min(Math.max(parseInt(req.query.limit ?? '100', 10) || 100, 1), 1000);
38
- const offset = Math.max(parseInt(req.query.offset ?? '0', 10) || 0, 0);
39
- const results = cg.searchNodes(req.query.kind ?? '', { limit: limit + offset });
40
- return {
41
- total: results.length,
42
- offset,
43
- limit,
44
- nodes: results.slice(offset, offset + limit).map((r) => r.node),
45
- };
46
- });
47
- /**
48
- * GET /api/graph/node — by symbol name (with optional file/line disambiguation)
49
- * or by exact id. Returns the node + callers + callees + linked specs.
50
- */
51
- app.get('/api/graph/node', async (req, reply) => {
52
- const cg = await resolveCg(app, req, reply);
53
- if (!cg)
54
- return;
55
- const { symbol, id, file, line } = req.query;
56
- if (!symbol && !id) {
57
- return reply.code(400).send({ error: 'symbol or id is required' });
58
- }
59
- let matches = [];
60
- if (id) {
61
- const node = cg.getNode(id);
62
- if (node)
63
- matches = [node];
64
- }
65
- else if (symbol) {
66
- matches = cg.searchNodes(symbol, { limit: 50 }).map((r) => r.node);
67
- if (file) {
68
- const f = file.toLowerCase();
69
- const narrowed = matches.filter((n) => n.filePath.toLowerCase().includes(f));
70
- if (narrowed.length > 0)
71
- matches = narrowed;
72
- }
73
- if (line) {
74
- const ln = parseInt(line, 10);
75
- if (Number.isFinite(ln)) {
76
- const containing = matches.filter((n) => n.startLine <= ln && (n.endLine ?? n.startLine) >= ln);
77
- matches = containing.length > 0 ? containing : matches.slice(0, 1);
78
- }
79
- }
80
- }
81
- if (matches.length === 0)
82
- return reply.code(404).send({ error: 'not found' });
83
- const enriched = matches.map((n) => {
84
- const callers = cg.getCallers(n.id).map((e) => e.node);
85
- const callees = cg.getCallees(n.id).map((e) => e.node);
86
- const links = cg.getSpecQueries().getLinksByNode(n.id);
87
- return { ...n, callers, callees, linkedSpecs: links };
88
- });
89
- return { matches: enriched };
90
- });
91
- app.post('/api/graph/explore', async (req, reply) => {
92
- const cg = await resolveCg(app, req, reply);
93
- if (!cg)
94
- return;
95
- const { query, maxFiles } = req.body ?? { query: '' };
96
- if (!query)
97
- return reply.code(400).send({ error: 'query is required' });
98
- void maxFiles;
99
- const ctx = await cg.buildContext(query, {
100
- maxNodes: 80,
101
- includeCode: true,
102
- format: 'markdown',
103
- });
104
- return ctx;
105
- });
106
- app.get('/api/graph/search', async (req, reply) => {
107
- const cg = await resolveCg(app, req, reply);
108
- if (!cg)
109
- return;
110
- const q = req.query.q ?? '';
111
- const limit = Math.min(parseInt(req.query.limit ?? '20', 10) || 20, 200);
112
- if (!q)
113
- return { results: [] };
114
- const kinds = req.query.kind ? [req.query.kind] : undefined;
115
- const results = cg.searchNodes(q, { kinds, limit });
116
- return { results };
117
- });
118
- app.get('/api/graph/callers/:id', async (req, reply) => {
119
- const cg = await resolveCg(app, req, reply);
120
- if (!cg)
121
- return;
122
- const node = cg.getNode(req.params.id);
123
- if (!node)
124
- return reply.code(404).send({ error: 'node not found' });
125
- return { callers: cg.getCallers(req.params.id).map((e) => e.node) };
126
- });
127
- app.get('/api/graph/callees/:id', async (req, reply) => {
128
- const cg = await resolveCg(app, req, reply);
129
- if (!cg)
130
- return;
131
- const node = cg.getNode(req.params.id);
132
- if (!node)
133
- return reply.code(404).send({ error: 'node not found' });
134
- return { callees: cg.getCallees(req.params.id).map((e) => e.node) };
135
- });
136
- app.get('/api/graph/impact/:id', async (req, reply) => {
137
- const cg = await resolveCg(app, req, reply);
138
- if (!cg)
139
- return;
140
- const depth = Math.min(parseInt(req.query.depth ?? '2', 10) || 2, 5);
141
- return { impact: cg.getImpactRadius(req.params.id, depth) };
142
- });
143
- app.get('/api/graph/files', async (req, reply) => {
144
- const cg = await resolveCg(app, req, reply);
145
- if (!cg)
146
- return;
147
- return { files: cg.getFiles() };
148
- });
149
- }
@@ -1,272 +0,0 @@
1
- /**
2
- * GET /api/memory — CLAUDE.md hierarchy + ~/.claude/memory notes.
3
- *
4
- * Walks the standard Claude Code memory locations and returns a flattened
5
- * list of MemoryFile records the desktop UI can render directly. Resolves
6
- * `@path` imports from each instruction file.
7
- *
8
- * Levels:
9
- * - enterprise — `/Library/Application Support/ClaudeCode/CLAUDE.md` (read-only)
10
- * - user — `~/.claude/CLAUDE.md`
11
- * - project — `<projectRoot>/CLAUDE.md`
12
- * - subdir — `<projectRoot>/<sub>/CLAUDE.md` (one level deep; common case)
13
- * - import — files referenced as `@path` from a project/subdir CLAUDE.md
14
- * - note — `~/.claude/memory/*.md` (agent-written via memory tool)
15
- */
16
- import { promises as fs } from 'node:fs';
17
- import path from 'node:path';
18
- import os from 'node:os';
19
- import { decodeProjectSlug } from '../ingest/ingestor.js';
20
- const ENTERPRISE_PATHS = [
21
- '/Library/Application Support/ClaudeCode/CLAUDE.md',
22
- '/etc/ClaudeCode/CLAUDE.md',
23
- process.env['ProgramData'] ? path.join(process.env['ProgramData'], 'ClaudeCode', 'CLAUDE.md') : '',
24
- ].filter(Boolean);
25
- function estimateTokens(body) {
26
- // Rough heuristic: ~4 chars per token. Cheap; the UI tolerates approximation.
27
- return Math.max(1, Math.round(body.length / 4));
28
- }
29
- function relativeTime(ms) {
30
- const diff = Date.now() - ms;
31
- const sec = Math.round(diff / 1000);
32
- if (sec < 60)
33
- return `${sec}s ago`;
34
- const min = Math.round(sec / 60);
35
- if (min < 60)
36
- return `${min}m ago`;
37
- const hr = Math.round(min / 60);
38
- if (hr < 24)
39
- return `${hr}h ago`;
40
- const day = Math.round(hr / 24);
41
- if (day < 7)
42
- return `${day}d ago`;
43
- const d = new Date(ms);
44
- return d.toLocaleDateString();
45
- }
46
- async function tryRead(filePath) {
47
- try {
48
- const [body, stat] = await Promise.all([fs.readFile(filePath, 'utf-8'), fs.stat(filePath)]);
49
- return { body, modified: stat.mtimeMs };
50
- }
51
- catch {
52
- return null;
53
- }
54
- }
55
- function extractImports(body) {
56
- const out = [];
57
- for (const line of body.split('\n')) {
58
- const m = line.match(/^@(\S+)/);
59
- if (m && m[1])
60
- out.push(m[1]);
61
- }
62
- return out;
63
- }
64
- function expandHome(p) {
65
- if (p.startsWith('~/'))
66
- return path.join(os.homedir(), p.slice(2));
67
- return p;
68
- }
69
- function pathForUi(absolute) {
70
- const home = os.homedir();
71
- if (absolute.startsWith(home + path.sep))
72
- return '~/' + absolute.slice(home.length + 1);
73
- return absolute;
74
- }
75
- function makeFile(opts) {
76
- return {
77
- id: opts.id,
78
- level: opts.level,
79
- type: opts.type,
80
- name: opts.name,
81
- scope: opts.scope,
82
- path: pathForUi(opts.absolutePath),
83
- tokens: estimateTokens(opts.body),
84
- lines: opts.body.split('\n').length,
85
- modified: relativeTime(opts.modifiedMs),
86
- body: opts.body,
87
- readOnly: opts.readOnly,
88
- imports: opts.imports?.length ? opts.imports : undefined,
89
- };
90
- }
91
- async function collectEnterprise() {
92
- const out = [];
93
- for (const p of ENTERPRISE_PATHS) {
94
- const file = await tryRead(p);
95
- if (file) {
96
- out.push(makeFile({
97
- id: 'm-ent',
98
- level: 'enterprise',
99
- type: 'instruction',
100
- name: 'CLAUDE.md',
101
- scope: 'managed',
102
- absolutePath: p,
103
- body: file.body,
104
- modifiedMs: file.modified,
105
- readOnly: true,
106
- }));
107
- break;
108
- }
109
- }
110
- return out;
111
- }
112
- async function collectUser() {
113
- const p = path.join(os.homedir(), '.claude', 'CLAUDE.md');
114
- const file = await tryRead(p);
115
- if (!file)
116
- return [];
117
- return [makeFile({
118
- id: 'm-user',
119
- level: 'user',
120
- type: 'instruction',
121
- name: 'CLAUDE.md',
122
- scope: '~/.claude',
123
- absolutePath: p,
124
- body: file.body,
125
- modifiedMs: file.modified,
126
- })];
127
- }
128
- async function collectProject(projectRoot) {
129
- const out = [];
130
- const proj = path.join(projectRoot, 'CLAUDE.md');
131
- const projFile = await tryRead(proj);
132
- const importMap = new Map();
133
- if (projFile) {
134
- const imports = extractImports(projFile.body);
135
- const resolvedIds = [];
136
- for (const imp of imports) {
137
- const abs = path.isAbsolute(imp) ? imp : path.join(projectRoot, imp);
138
- const sub = await tryRead(abs);
139
- if (sub) {
140
- const id = 'm-imp-' + Buffer.from(imp).toString('base64').replace(/=/g, '').slice(0, 10);
141
- importMap.set(imp, makeFile({
142
- id,
143
- level: 'import',
144
- type: 'import',
145
- name: path.basename(abs),
146
- scope: '@import',
147
- absolutePath: abs,
148
- body: sub.body,
149
- modifiedMs: sub.modified,
150
- }));
151
- resolvedIds.push(id);
152
- }
153
- }
154
- out.push(makeFile({
155
- id: 'm-proj',
156
- level: 'project',
157
- type: 'instruction',
158
- name: 'CLAUDE.md',
159
- scope: 'project root',
160
- absolutePath: proj,
161
- body: projFile.body,
162
- modifiedMs: projFile.modified,
163
- imports: resolvedIds,
164
- }));
165
- for (const im of importMap.values())
166
- out.push(im);
167
- }
168
- // Scan one level of subdirectories for nested CLAUDE.md files. Keeps the
169
- // walk cheap — going deeper would need ignoring node_modules etc.
170
- try {
171
- const entries = await fs.readdir(projectRoot, { withFileTypes: true });
172
- for (const ent of entries) {
173
- if (!ent.isDirectory())
174
- continue;
175
- if (ent.name.startsWith('.') || ent.name === 'node_modules' || ent.name === 'dist')
176
- continue;
177
- const subPath = path.join(projectRoot, ent.name, 'CLAUDE.md');
178
- const sub = await tryRead(subPath);
179
- if (sub) {
180
- out.push(makeFile({
181
- id: 'm-sub-' + ent.name,
182
- level: 'subdir',
183
- type: 'instruction',
184
- name: 'CLAUDE.md',
185
- scope: ent.name,
186
- absolutePath: subPath,
187
- body: sub.body,
188
- modifiedMs: sub.modified,
189
- }));
190
- }
191
- }
192
- }
193
- catch {
194
- // Project root not readable — ignore, return what we already have.
195
- }
196
- return out;
197
- }
198
- async function collectNotes() {
199
- const dir = path.join(os.homedir(), '.claude', 'memory');
200
- const out = [];
201
- let entries;
202
- try {
203
- entries = await fs.readdir(dir, { withFileTypes: true });
204
- }
205
- catch {
206
- return out;
207
- }
208
- for (const ent of entries) {
209
- if (!ent.isFile() || !ent.name.endsWith('.md'))
210
- continue;
211
- const abs = path.join(dir, ent.name);
212
- const file = await tryRead(abs);
213
- if (!file)
214
- continue;
215
- const tags = Array.from(file.body.matchAll(/#([A-Za-z][A-Za-z0-9_-]*)/g))
216
- .map((m) => m[1])
217
- .filter((t) => typeof t === 'string')
218
- .slice(0, 6);
219
- out.push(makeFile({
220
- id: 'n-' + ent.name.replace(/\.md$/, ''),
221
- level: 'note',
222
- type: 'note',
223
- name: ent.name,
224
- scope: 'memory tool',
225
- absolutePath: abs,
226
- body: file.body,
227
- modifiedMs: file.modified,
228
- }));
229
- if (tags.length) {
230
- const last = out[out.length - 1];
231
- if (last)
232
- last.tags = tags;
233
- }
234
- }
235
- return out;
236
- }
237
- export async function registerMemoryRoutes(app) {
238
- app.get('/api/memory', async (req) => {
239
- // Memory has three global tiers (enterprise / user / notes) and one
240
- // project tier. The global tiers always render; the project tier
241
- // requires a project path. We try, in order:
242
- // 1. The `?project=<slug>` query arg (decoded from Claude's slug).
243
- // 2. The `?projectPath=` arg if the caller has the absolute path handy.
244
- // 3. The primary SpecShip's projectRoot, if configured at boot.
245
- // When none is available, the response just omits the project tier
246
- // (no 409 — the user can still see their global memory).
247
- let projectRoot = null;
248
- if (req.query.project)
249
- projectRoot = decodeProjectSlug(req.query.project);
250
- else if (req.query.projectPath)
251
- projectRoot = req.query.projectPath;
252
- else if (app.primaryCg?.getProjectRoot)
253
- projectRoot = app.primaryCg.getProjectRoot();
254
- const [enterprise, user, project, notes] = await Promise.all([
255
- collectEnterprise(),
256
- collectUser(),
257
- projectRoot ? collectProject(projectRoot) : Promise.resolve([]),
258
- collectNotes(),
259
- ]);
260
- const files = [...enterprise, ...user, ...project, ...notes];
261
- const resp = {
262
- totalTokens: files.reduce((a, b) => a + b.tokens, 0),
263
- instructionCount: files.filter((f) => f.type === 'instruction').length,
264
- noteCount: files.filter((f) => f.type === 'note').length,
265
- importCount: files.filter((f) => f.type === 'import').length,
266
- files,
267
- };
268
- return resp;
269
- });
270
- }
271
- // Re-export the helper for tests
272
- export const _testing = { expandHome, pathForUi, estimateTokens, extractImports };
@@ -1,197 +0,0 @@
1
- /**
2
- * GET /api/projects — enumerate every project visible to Claude Code
3
- * (every dir under ~/.claude/projects/).
4
- * GET /api/projects/events — SSE stream that pushes a refresh whenever the
5
- * watcher sees the project list change. Used by
6
- * the desktop UI's Project picker so newly opened
7
- * projects appear without a refresh.
8
- *
9
- * Why this lives in its own route file: the rest of the analytics endpoints
10
- * already read ~/.claude/projects/ via the ingest pipeline. This route adds
11
- * a *navigation* primitive on top of that data — "what projects does the
12
- * user have at all?" — without coupling to the specship instance.
13
- */
14
- import { EventEmitter } from 'node:events';
15
- import { promises as fs, watch } from 'node:fs';
16
- import os from 'node:os';
17
- import path from 'node:path';
18
- import { decodeProjectSlug } from '../ingest/ingestor.js';
19
- const projectsBus = new EventEmitter();
20
- projectsBus.setMaxListeners(0); // many SSE subscribers + internal
21
- async function enumerate(claudeRoot) {
22
- let entries;
23
- try {
24
- entries = await fs.readdir(claudeRoot, { withFileTypes: true });
25
- }
26
- catch {
27
- return [];
28
- }
29
- const out = [];
30
- for (const ent of entries) {
31
- if (!ent.isDirectory())
32
- continue;
33
- const slug = ent.name;
34
- const decoded = decodeProjectSlug(slug);
35
- const projDir = path.join(claudeRoot, slug);
36
- let sessionCount = 0;
37
- let lastModifiedMs = 0;
38
- try {
39
- const inside = await fs.readdir(projDir, { withFileTypes: true });
40
- for (const f of inside) {
41
- if (f.isFile() && f.name.toLowerCase().endsWith('.jsonl')) {
42
- sessionCount++;
43
- try {
44
- const stat = await fs.stat(path.join(projDir, f.name));
45
- if (stat.mtimeMs > lastModifiedMs)
46
- lastModifiedMs = stat.mtimeMs;
47
- }
48
- catch { /* ignore */ }
49
- }
50
- }
51
- }
52
- catch { /* project dir disappeared mid-scan — skip its files */ }
53
- let exists = false;
54
- let initialized = false;
55
- try {
56
- const st = await fs.stat(decoded);
57
- exists = st.isDirectory();
58
- if (exists) {
59
- try {
60
- const cg = await fs.stat(path.join(decoded, '.specship'));
61
- initialized = cg.isDirectory();
62
- }
63
- catch { /* not initialized — OK */ }
64
- }
65
- }
66
- catch { /* path missing — OK, still surface it so UI can flag it */ }
67
- out.push({ slug, path: decoded, exists, initialized, sessionCount, lastModifiedMs });
68
- }
69
- // Recent activity first; ties broken by path.
70
- out.sort((a, b) => {
71
- if (b.lastModifiedMs !== a.lastModifiedMs)
72
- return b.lastModifiedMs - a.lastModifiedMs;
73
- return a.path.localeCompare(b.path);
74
- });
75
- return out;
76
- }
77
- // --- Watcher (singleton across the process) ---------------------------------
78
- let watcher = null;
79
- let lastSlugs = new Set();
80
- let debounceHandle = null;
81
- let watchedRoot = null;
82
- function startWatcher(claudeRoot, verbose) {
83
- if (watcher)
84
- return;
85
- watchedRoot = claudeRoot;
86
- try {
87
- watcher = watch(claudeRoot, { persistent: true }, () => {
88
- scheduleRescan(claudeRoot);
89
- });
90
- if (verbose)
91
- console.error(`[projects] watching ${claudeRoot}`);
92
- // Warm the cache so the first SSE snapshot has accurate state and the
93
- // first change diff is meaningful.
94
- void enumerate(claudeRoot).then((list) => {
95
- lastSlugs = new Set(list.map((p) => p.slug));
96
- });
97
- }
98
- catch (err) {
99
- if (verbose)
100
- console.error(`[projects] watch failed for ${claudeRoot}:`, err instanceof Error ? err.message : String(err));
101
- // Directory may not exist yet — that's OK, every /api/projects GET
102
- // returns [] until it does. We don't retry here; if the watcher is
103
- // critical the user can restart the server after creating it.
104
- }
105
- }
106
- function scheduleRescan(claudeRoot) {
107
- if (debounceHandle)
108
- clearTimeout(debounceHandle);
109
- debounceHandle = setTimeout(async () => {
110
- debounceHandle = null;
111
- const list = await enumerate(claudeRoot);
112
- const newSlugs = new Set(list.map((p) => p.slug));
113
- const added = list.filter((p) => !lastSlugs.has(p.slug));
114
- const removed = [...lastSlugs].filter((s) => !newSlugs.has(s));
115
- lastSlugs = newSlugs;
116
- if (added.length || removed.length) {
117
- projectsBus.emit('change', { added, removed, list });
118
- }
119
- // Refresh is always emitted so subscribers can pick up lastModified /
120
- // sessionCount drift even without slug-level changes.
121
- projectsBus.emit('refresh', { list });
122
- }, 350);
123
- }
124
- function stopWatcher() {
125
- if (watcher) {
126
- try {
127
- watcher.close();
128
- }
129
- catch { /* ignore */ }
130
- watcher = null;
131
- }
132
- if (debounceHandle) {
133
- clearTimeout(debounceHandle);
134
- debounceHandle = null;
135
- }
136
- watchedRoot = null;
137
- }
138
- // --- Route registration -----------------------------------------------------
139
- export async function registerProjectsRoutes(app) {
140
- const claudeRoot = path.join(os.homedir(), '.claude', 'projects');
141
- startWatcher(claudeRoot, false);
142
- app.addHook('onClose', async () => { stopWatcher(); });
143
- app.get('/api/projects', async () => {
144
- return { claudeRoot, projects: await enumerate(claudeRoot) };
145
- });
146
- app.get('/api/projects/events', async (req, reply) => {
147
- reply.raw.setHeader('Content-Type', 'text/event-stream');
148
- reply.raw.setHeader('Cache-Control', 'no-cache');
149
- reply.raw.setHeader('Connection', 'keep-alive');
150
- reply.raw.flushHeaders();
151
- let closed = false;
152
- const onClose = () => {
153
- closed = true;
154
- projectsBus.off('change', onChange);
155
- projectsBus.off('refresh', onRefresh);
156
- clearInterval(hb);
157
- };
158
- req.raw.on('close', onClose);
159
- const writeEvent = (event, data) => {
160
- if (closed)
161
- return;
162
- try {
163
- reply.raw.write(`event: ${event}\n`);
164
- reply.raw.write(`data: ${JSON.stringify(data)}\n\n`);
165
- }
166
- catch { /* socket gone */
167
- closed = true;
168
- }
169
- };
170
- const initial = await enumerate(claudeRoot);
171
- lastSlugs = new Set(initial.map((p) => p.slug));
172
- writeEvent('snapshot', { claudeRoot, projects: initial });
173
- const onChange = (payload) => {
174
- writeEvent('change', payload);
175
- };
176
- const onRefresh = (payload) => {
177
- writeEvent('refresh', payload);
178
- };
179
- projectsBus.on('change', onChange);
180
- projectsBus.on('refresh', onRefresh);
181
- // Heartbeat keeps proxies / NATs from dropping the idle connection.
182
- const hb = setInterval(() => {
183
- if (closed) {
184
- clearInterval(hb);
185
- return;
186
- }
187
- try {
188
- reply.raw.write(`: ping\n\n`);
189
- }
190
- catch {
191
- onClose();
192
- }
193
- }, 30000);
194
- });
195
- }
196
- /** Test seam — re-export so __tests__ can stop the watcher between cases. */
197
- export const _testing = { stopWatcher, watchedRoot: () => watchedRoot };