@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,101 +0,0 @@
1
- /**
2
- * ProjectRegistry — lazy-opens and caches SpecShip instances per project
3
- * path, keyed by absolute path. LRU evicts when the cache exceeds maxOpen
4
- * so a long-running server doesn't hold every project's SQLite handle
5
- * forever.
6
- *
7
- * Used by the Fastify routes (via `app.activeCg(req)`) to back the desktop
8
- * app's project picker: when the user switches projects in the UI, the
9
- * specship-scoped surfaces (graph, specs, drift, workflows, status) start
10
- * reading from the matching instance — opened on demand if it isn't
11
- * already cached.
12
- *
13
- * Analytics endpoints (`/api/claude/*`, `/api/memory`) read from a single
14
- * "primary" instance instead, since their data (JSONL ingest, CLAUDE.md
15
- * hierarchy) is global to the user, not scoped to one project.
16
- */
17
- import { decodeProjectSlug } from './ingest/ingestor.js';
18
- export class ProjectRegistry {
19
- cache = new Map();
20
- maxOpen;
21
- verbose;
22
- openImpl;
23
- constructor(opts, defaultOpenImpl) {
24
- this.maxOpen = opts.maxOpen ?? 5;
25
- this.verbose = opts.verbose ?? false;
26
- this.openImpl = opts.openImpl ?? defaultOpenImpl;
27
- }
28
- /**
29
- * Return the cached SpecShip for `projectPath`, opening it on demand.
30
- * Returns null when the path isn't initialized (no `.specship/`) or
31
- * the open throws — callers surface a friendly UI error.
32
- */
33
- async get(projectPath) {
34
- const existing = this.cache.get(projectPath);
35
- if (existing) {
36
- existing.lastAccess = Date.now();
37
- return existing.cg;
38
- }
39
- try {
40
- const cg = await this.openImpl(projectPath);
41
- this.cache.set(projectPath, { cg, lastAccess: Date.now() });
42
- this.evictIfNeeded();
43
- if (this.verbose)
44
- console.error(`[registry] opened ${projectPath} (cache size ${this.cache.size})`);
45
- return cg;
46
- }
47
- catch (err) {
48
- if (this.verbose)
49
- console.error(`[registry] open failed for ${projectPath}: ${err instanceof Error ? err.message : String(err)}`);
50
- return null;
51
- }
52
- }
53
- /**
54
- * Look up by Claude Code's slug-encoded project name
55
- * (`-Users-alice-foo` → `/Users/alice/foo`).
56
- */
57
- async getBySlug(slug) {
58
- return this.get(decodeProjectSlug(slug));
59
- }
60
- /** Currently-cached project paths (most-recent-access first). */
61
- openPaths() {
62
- return [...this.cache.entries()]
63
- .sort((a, b) => b[1].lastAccess - a[1].lastAccess)
64
- .map(([k]) => k);
65
- }
66
- has(projectPath) { return this.cache.has(projectPath); }
67
- /** Close + drop every cached instance. Called on server shutdown. */
68
- closeAll() {
69
- for (const [, v] of this.cache) {
70
- try {
71
- v.cg.close();
72
- }
73
- catch { /* ignore */ }
74
- }
75
- this.cache.clear();
76
- }
77
- evictIfNeeded() {
78
- if (this.cache.size <= this.maxOpen)
79
- return;
80
- let oldestKey = null;
81
- let oldestTime = Infinity;
82
- for (const [k, v] of this.cache) {
83
- if (v.lastAccess < oldestTime) {
84
- oldestTime = v.lastAccess;
85
- oldestKey = k;
86
- }
87
- }
88
- if (oldestKey) {
89
- const entry = this.cache.get(oldestKey);
90
- if (entry) {
91
- try {
92
- entry.cg.close();
93
- }
94
- catch { /* ignore */ }
95
- }
96
- this.cache.delete(oldestKey);
97
- if (this.verbose)
98
- console.error(`[registry] evicted ${oldestKey}`);
99
- }
100
- }
101
- }
@@ -1,480 +0,0 @@
1
- /**
2
- * Claude Code analytics routes.
3
- *
4
- * All queries hit specship's SQLite directly. The ingest worker
5
- * (`@selvakumaresra/specship-ingest`) writes to claude_* tables; this layer
6
- * just rolls up.
7
- *
8
- * Endpoints:
9
- * GET /api/claude/projects — every indexed Claude project
10
- * GET /api/claude/sessions?project=&limit= — sessions list
11
- * GET /api/claude/session/:id — session detail (prompts + tools)
12
- * GET /api/claude/heatmap?range= — file/tool/subagent heatmaps
13
- * GET /api/claude/costs?range= — cost rollup, timeseries, per-model
14
- * GET /api/claude/compare — per-project cost comparison
15
- * GET /api/claude/tips — rule-based tips engine output
16
- * POST /api/claude/ingest — force a one-shot ingest pass
17
- */
18
- const RANGE_WINDOW_MS = {
19
- today: 24 * 60 * 60 * 1000,
20
- week: 7 * 24 * 60 * 60 * 1000,
21
- month: 30 * 24 * 60 * 60 * 1000,
22
- all: Number.MAX_SAFE_INTEGER,
23
- };
24
- function rangeKey(input) {
25
- if (input === 'today' || input === 'week' || input === 'month' || input === 'all')
26
- return input;
27
- return 'week';
28
- }
29
- function rangeStart(key) {
30
- if (key === 'all')
31
- return 0;
32
- return Date.now() - RANGE_WINDOW_MS[key];
33
- }
34
- /**
35
- * Get the internal SQLite handle off the DatabaseConnection so we can run
36
- * Claude-specific aggregate queries directly. SpecShip exposes this via
37
- * `getDb()`-style accessors. Falls back to digging via the queries property.
38
- */
39
- function getDb(cg) {
40
- // SpecShip exposes the underlying DB via its DatabaseConnection. Look it
41
- // up via the private field as a fallback — works because it's the same
42
- // shape regardless of which adapter (better-sqlite3 / node:sqlite) is active.
43
- const anyCg = cg;
44
- if (anyCg.db?.getDb)
45
- return anyCg.db.getDb();
46
- if (anyCg.queries?.db)
47
- return anyCg.queries.db;
48
- throw new Error('specship DB handle not accessible from server context');
49
- }
50
- export async function registerClaudeRoutes(app) {
51
- /**
52
- * Analytics routes share one SQLite — the boot-time "primary" project's
53
- * specship.db hosts the cross-project claude_* tables. Without a primary
54
- * the JSONL ingest has nowhere to write and there's nothing to query, so
55
- * every analytics handler asks here first.
56
- */
57
- function requirePrimary(reply) {
58
- if (!app.primaryCg) {
59
- reply.code(409).send({ error: 'analytics unavailable: no primary project configured', code: 'no_primary' });
60
- return null;
61
- }
62
- return app.primaryCg;
63
- }
64
- app.get('/api/claude/projects', async (_req, reply) => {
65
- const cg = requirePrimary(reply);
66
- if (!cg)
67
- return;
68
- const db = getDb(cg);
69
- const rows = db.prepare(`
70
- SELECT p.path, p.name, p.first_seen, p.last_seen,
71
- COUNT(s.id) as sessions,
72
- COALESCE(SUM(s.total_cost_usd), 0) as cost,
73
- COALESCE(SUM(s.total_cache_read_tokens), 0) as cacheRead,
74
- COALESCE(SUM(s.total_cache_creation_tokens + s.total_input_tokens), 0) as totalInput,
75
- COALESCE(SUM(s.prompt_count), 0) as prompts
76
- FROM claude_projects p
77
- LEFT JOIN claude_sessions s ON s.project_path = p.path
78
- GROUP BY p.path
79
- ORDER BY cost DESC
80
- `).all();
81
- return { projects: rows };
82
- });
83
- app.get('/api/claude/sessions', async (req, reply) => {
84
- const cg = requirePrimary(reply);
85
- if (!cg)
86
- return;
87
- const db = getDb(cg);
88
- const limit = Math.min(parseInt(req.query.limit ?? '100', 10) || 100, 500);
89
- const since = rangeStart(rangeKey(req.query.range));
90
- const params = [since];
91
- let whereProject = '';
92
- if (req.query.project) {
93
- whereProject = ' AND project_path = ?';
94
- params.push(req.query.project);
95
- }
96
- params.push(limit);
97
- const sessions = db.prepare(`
98
- SELECT * FROM claude_sessions
99
- WHERE started_at >= ?${whereProject}
100
- ORDER BY started_at DESC
101
- LIMIT ?
102
- `).all(...params);
103
- return { sessions };
104
- });
105
- app.get('/api/claude/session/:id', async (req, reply) => {
106
- const cg = requirePrimary(reply);
107
- if (!cg)
108
- return;
109
- const db = getDb(cg);
110
- const session = db.prepare('SELECT * FROM claude_sessions WHERE id = ?').get(req.params.id);
111
- if (!session)
112
- return reply.code(404).send({ error: 'session not found' });
113
- const prompts = db.prepare(`
114
- SELECT * FROM claude_prompts WHERE session_id = ? ORDER BY ts ASC
115
- `).all(req.params.id);
116
- const toolCalls = db.prepare(`
117
- SELECT * FROM claude_tool_calls WHERE session_id = ? ORDER BY ts ASC
118
- `).all(req.params.id);
119
- return { session, prompts, toolCalls };
120
- });
121
- app.get('/api/claude/heatmap', async (req, reply) => {
122
- const cg = requirePrimary(reply);
123
- if (!cg)
124
- return;
125
- const db = getDb(cg);
126
- const since = rangeStart(rangeKey(req.query.range));
127
- // Files heatmap — input_summary doubles as the file path for Read/Edit/Write.
128
- const files = db.prepare(`
129
- SELECT input_summary as path, COUNT(*) as calls, SUM(result_length) as resultBytes
130
- FROM claude_tool_calls
131
- WHERE ts >= ? AND tool_name IN ('Read','Edit','Write','NotebookEdit') AND input_summary != ''
132
- GROUP BY input_summary
133
- ORDER BY calls DESC
134
- LIMIT 100
135
- `).all(since);
136
- // Tools heatmap.
137
- const tools = db.prepare(`
138
- SELECT tool_name as name, COUNT(*) as calls, SUM(result_length) as resultBytes
139
- FROM claude_tool_calls
140
- WHERE ts >= ?
141
- GROUP BY tool_name
142
- ORDER BY calls DESC
143
- `).all(since);
144
- // Subagent attribution (is_sidechain at the prompt level — main vs. sidechain rollup).
145
- const subagents = db.prepare(`
146
- SELECT
147
- CASE WHEN p.is_sidechain = 1 THEN 'subagent' ELSE 'main' END as type,
148
- COUNT(*) as prompts,
149
- SUM(p.input_tokens + p.output_tokens + p.cache_creation_tokens + p.cache_read_tokens) as tokens,
150
- SUM(p.cost_usd) as cost
151
- FROM claude_prompts p
152
- WHERE p.ts >= ?
153
- GROUP BY type
154
- `).all(since);
155
- // Subagent breakdown by name — Task tool calls grouped by subagent_type.
156
- // input_summary is the JSON-serialized tool input; json_extract pulls
157
- // out subagent_type (defaults to 'general-purpose' when unset).
158
- const subagentByName = db.prepare(`
159
- SELECT
160
- COALESCE(NULLIF(json_extract(input_summary, '$.subagent_type'), ''), 'general-purpose') as name,
161
- COUNT(*) as calls,
162
- MIN(ts) as firstSeen,
163
- MAX(ts) as lastSeen
164
- FROM claude_tool_calls
165
- WHERE ts >= ? AND tool_name = 'Task'
166
- GROUP BY name
167
- ORDER BY calls DESC
168
- `).all(since);
169
- return { files, tools, subagents, subagentByName };
170
- });
171
- /**
172
- * Drill-down: which sessions touched a given file (via Read/Edit/Write).
173
- * Used by the heatmap page when the user clicks a file cell.
174
- */
175
- app.get('/api/claude/heatmap/file', async (req, reply) => {
176
- const path = req.query.path;
177
- if (!path)
178
- return reply.code(400).send({ error: 'path required' });
179
- const cg = requirePrimary(reply);
180
- if (!cg)
181
- return;
182
- const db = getDb(cg);
183
- const since = rangeStart(rangeKey(req.query.range));
184
- const sessions = db.prepare(`
185
- SELECT t.session_id, s.last_model, s.project_path,
186
- COUNT(*) as calls, COALESCE(SUM(t.result_length), 0) as bytes,
187
- MAX(t.ts) as lastTs, MIN(t.ts) as firstTs
188
- FROM claude_tool_calls t
189
- LEFT JOIN claude_sessions s ON s.id = t.session_id
190
- WHERE t.input_summary = ? AND t.ts >= ? AND t.tool_name IN ('Read','Edit','Write','NotebookEdit')
191
- GROUP BY t.session_id
192
- ORDER BY calls DESC
193
- LIMIT 50
194
- `).all(path, since);
195
- const byTool = db.prepare(`
196
- SELECT tool_name as name, COUNT(*) as calls, COALESCE(SUM(result_length), 0) as bytes
197
- FROM claude_tool_calls
198
- WHERE input_summary = ? AND ts >= ? AND tool_name IN ('Read','Edit','Write','NotebookEdit')
199
- GROUP BY tool_name
200
- ORDER BY calls DESC
201
- `).all(path, since);
202
- return { path, sessions, byTool };
203
- });
204
- /**
205
- * Drill-down: the top distinct inputs for a given tool (file paths for
206
- * Read/Edit/Write, patterns for Grep/Glob, commands for Bash).
207
- */
208
- app.get('/api/claude/heatmap/tool', async (req, reply) => {
209
- const name = req.query.name;
210
- if (!name)
211
- return reply.code(400).send({ error: 'name required' });
212
- const cg = requirePrimary(reply);
213
- if (!cg)
214
- return;
215
- const db = getDb(cg);
216
- const since = rangeStart(rangeKey(req.query.range));
217
- const totals = db.prepare(`
218
- SELECT COUNT(*) as calls, COALESCE(SUM(result_length), 0) as bytes,
219
- COUNT(DISTINCT session_id) as sessions
220
- FROM claude_tool_calls
221
- WHERE tool_name = ? AND ts >= ?
222
- `).get(name, since);
223
- const inputs = db.prepare(`
224
- SELECT
225
- CASE WHEN length(input_summary) > 120 THEN substr(input_summary, 1, 120) || '…'
226
- ELSE input_summary END as input,
227
- COUNT(*) as calls,
228
- COALESCE(SUM(result_length), 0) as bytes,
229
- MAX(ts) as lastTs
230
- FROM claude_tool_calls
231
- WHERE tool_name = ? AND ts >= ? AND input_summary != ''
232
- GROUP BY input_summary
233
- ORDER BY calls DESC
234
- LIMIT 30
235
- `).all(name, since);
236
- const recentSessions = db.prepare(`
237
- SELECT t.session_id, s.last_model, s.project_path, COUNT(*) as calls, MAX(t.ts) as lastTs
238
- FROM claude_tool_calls t
239
- LEFT JOIN claude_sessions s ON s.id = t.session_id
240
- WHERE t.tool_name = ? AND t.ts >= ?
241
- GROUP BY t.session_id
242
- ORDER BY lastTs DESC
243
- LIMIT 20
244
- `).all(name, since);
245
- return { tool: name, totals, inputs, recentSessions };
246
- });
247
- /**
248
- * Drill-down: invocations of a specific subagent (by subagent_type name).
249
- */
250
- app.get('/api/claude/heatmap/subagent', async (req, reply) => {
251
- const type = req.query.type;
252
- if (!type)
253
- return reply.code(400).send({ error: 'type required' });
254
- const cg = requirePrimary(reply);
255
- if (!cg)
256
- return;
257
- const db = getDb(cg);
258
- const since = rangeStart(rangeKey(req.query.range));
259
- const totals = db.prepare(`
260
- SELECT COUNT(*) as calls, COUNT(DISTINCT session_id) as sessions
261
- FROM claude_tool_calls
262
- WHERE tool_name = 'Task' AND ts >= ?
263
- AND COALESCE(NULLIF(json_extract(input_summary, '$.subagent_type'), ''), 'general-purpose') = ?
264
- `).get(since, type);
265
- const invocations = db.prepare(`
266
- SELECT
267
- t.session_id,
268
- t.ts,
269
- COALESCE(json_extract(t.input_summary, '$.description'), '') as description,
270
- COALESCE(json_extract(t.input_summary, '$.prompt'), '') as prompt,
271
- s.last_model
272
- FROM claude_tool_calls t
273
- LEFT JOIN claude_sessions s ON s.id = t.session_id
274
- WHERE t.tool_name = 'Task' AND t.ts >= ?
275
- AND COALESCE(NULLIF(json_extract(t.input_summary, '$.subagent_type'), ''), 'general-purpose') = ?
276
- ORDER BY t.ts DESC
277
- LIMIT 50
278
- `).all(since, type);
279
- return { subagent: type, totals, invocations };
280
- });
281
- app.get('/api/claude/cache', async (req, reply) => {
282
- const cg = requirePrimary(reply);
283
- if (!cg)
284
- return;
285
- const db = getDb(cg);
286
- const since = rangeStart(rangeKey(req.query.range));
287
- // Aggregate cache totals from claude_sessions for sessions in window.
288
- const agg = db.prepare(`
289
- SELECT
290
- COALESCE(SUM(total_input_tokens), 0) as inp,
291
- COALESCE(SUM(total_output_tokens), 0) as out,
292
- COALESCE(SUM(total_cache_creation_tokens), 0) as cw,
293
- COALESCE(SUM(total_cache_read_tokens), 0) as cr,
294
- COALESCE(SUM(total_cost_usd), 0) as cost
295
- FROM claude_sessions
296
- WHERE started_at >= ?
297
- `).get(since);
298
- const total = (agg.inp ?? 0) + (agg.cw ?? 0) + (agg.cr ?? 0);
299
- const readRate = total > 0 ? agg.cr / total : 0;
300
- // Dollars saved estimate: cache_read tokens billed at ~10% of input;
301
- // savings vs charging them at input rate ≈ 0.9 × (cr / 1M) × inputRate.
302
- // Use Opus 4-7 input ($15/M) as a generous upper bound — the UI shows
303
- // this as an approximation.
304
- const dollarsSaved = ((agg.cr ?? 0) / 1_000_000) * 15 * 0.9;
305
- return {
306
- readRate,
307
- creationTokens: agg.cw ?? 0,
308
- readTokens: agg.cr ?? 0,
309
- inputTokens: agg.inp ?? 0,
310
- outputTokens: agg.out ?? 0,
311
- totalCost: agg.cost ?? 0,
312
- dollarsSaved,
313
- // wowDelta would need historical snapshotting; placeholder until we
314
- // add a rolling-window aggregate table. UI shows 0% with no arrow.
315
- wowDelta: 0,
316
- };
317
- });
318
- app.get('/api/claude/costs', async (req, reply) => {
319
- const cg = requirePrimary(reply);
320
- if (!cg)
321
- return;
322
- const db = getDb(cg);
323
- const since = rangeStart(rangeKey(req.query.range));
324
- const total = db.prepare(`SELECT SUM(total_cost_usd) as t FROM claude_sessions WHERE started_at >= ?`).get(since);
325
- // Top prompts by cost.
326
- const topPrompts = db.prepare(`
327
- SELECT id, session_id, substr(text, 1, 200) as text, model, cost_usd,
328
- input_tokens, output_tokens, cache_creation_tokens, cache_read_tokens, ts
329
- FROM claude_prompts
330
- WHERE ts >= ? AND cost_usd > 0
331
- ORDER BY cost_usd DESC
332
- LIMIT 50
333
- `).all(since);
334
- // Daily timeseries: bucket by 24h windows.
335
- const days = 30;
336
- const dayMs = 24 * 60 * 60 * 1000;
337
- const dayBoundary = Math.floor(Date.now() / dayMs) * dayMs - (days - 1) * dayMs;
338
- const series = db.prepare(`
339
- SELECT
340
- CAST((ts - ?) / ? AS INTEGER) as bucket,
341
- SUM(cost_usd) as cost,
342
- COUNT(*) as prompts
343
- FROM claude_prompts
344
- WHERE ts >= ?
345
- GROUP BY bucket
346
- ORDER BY bucket ASC
347
- `).all(dayBoundary, dayMs, dayBoundary);
348
- // Densify with zeros for missing days.
349
- const dense = [];
350
- for (let i = 0; i < days; i++) {
351
- const found = series.find((s) => s.bucket === i);
352
- dense.push({ day: days - 1 - i, cost: found?.cost ?? 0, prompts: found?.prompts ?? 0 });
353
- }
354
- // By model.
355
- const byModel = db.prepare(`
356
- SELECT model, COUNT(*) as prompts, SUM(cost_usd) as cost
357
- FROM claude_prompts
358
- WHERE ts >= ? AND model IS NOT NULL
359
- GROUP BY model
360
- ORDER BY cost DESC
361
- `).all(since);
362
- return { total: total.t ?? 0, topPrompts, series: dense, byModel };
363
- });
364
- app.get('/api/claude/compare', async (_req, reply) => {
365
- const cg = requirePrimary(reply);
366
- if (!cg)
367
- return;
368
- const db = getDb(cg);
369
- const rows = db.prepare(`
370
- SELECT
371
- p.path, p.name,
372
- COUNT(s.id) as sessions,
373
- COALESCE(SUM(s.total_cost_usd), 0) as cost,
374
- COALESCE(AVG(s.total_cost_usd), 0) as avgCost,
375
- COALESCE(SUM(s.prompt_count), 0) as prompts,
376
- CASE WHEN SUM(s.total_input_tokens + s.total_cache_creation_tokens + s.total_cache_read_tokens) > 0
377
- THEN CAST(SUM(s.total_cache_read_tokens) AS REAL) / SUM(s.total_input_tokens + s.total_cache_creation_tokens + s.total_cache_read_tokens)
378
- ELSE 0 END as cacheHit
379
- FROM claude_projects p
380
- LEFT JOIN claude_sessions s ON s.project_path = p.path
381
- GROUP BY p.path
382
- ORDER BY cost DESC
383
- `).all();
384
- return { projects: rows };
385
- });
386
- /**
387
- * Rule-based tips engine. Each rule is a SQL query that finds a wasteful
388
- * pattern in the user's recent transcripts; the result is shaped into a
389
- * tip card matching the design system's voice.
390
- */
391
- app.get('/api/claude/tips', async (_req, reply) => {
392
- const cg = requirePrimary(reply);
393
- if (!cg)
394
- return;
395
- const db = getDb(cg);
396
- const tips = [];
397
- // Rule 1: "you read X N times" — same file path Read more than 10 times in
398
- // a single session.
399
- const wastefulReads = db.prepare(`
400
- SELECT session_id, input_summary as file, COUNT(*) as n
401
- FROM claude_tool_calls
402
- WHERE tool_name = 'Read' AND input_summary != ''
403
- GROUP BY session_id, input_summary
404
- HAVING n >= 10
405
- ORDER BY n DESC
406
- LIMIT 5
407
- `).all();
408
- for (const r of wastefulReads) {
409
- tips.push({
410
- id: 'wasteful_reads:' + r.session_id + ':' + r.file,
411
- severity: 'error',
412
- icon: 'wrench',
413
- title: `You read ${r.file.split('/').pop()} ${r.n}× in one session — specship_explore covers it`,
414
- why: 'Re-reading the same file burns input tokens every turn. A single structural query returns callers, callees, and linked specs at once.',
415
- evidence: { session: r.session_id, detail: `Read(${r.file}) × ${r.n}` },
416
- fix: `specship_explore --symbol ${r.file.replace(/\.\w+$/, '').split('/').pop()}`,
417
- saving: '≈$0.10/read avoided',
418
- });
419
- }
420
- // Rule 2: "tool returned X tokens" — any single tool call with result_length > 50000.
421
- const heavyResults = db.prepare(`
422
- SELECT id, session_id, tool_name, input_summary, result_length
423
- FROM claude_tool_calls
424
- WHERE result_length > 50000
425
- ORDER BY result_length DESC
426
- LIMIT 5
427
- `).all();
428
- for (const r of heavyResults) {
429
- tips.push({
430
- id: 'heavy_result:' + r.id,
431
- severity: 'error',
432
- icon: 'flame',
433
- title: `${r.tool_name} returned ${Math.round(r.result_length / 1000)}k tokens — try a structural query`,
434
- why: 'Tools that dump raw content into context are the dominant cost driver. A structural query returns just what the agent needs.',
435
- evidence: { session: r.session_id, detail: `${r.tool_name}(${r.input_summary.slice(0, 100)}) → ${r.result_length} tokens` },
436
- fix: r.tool_name === 'Bash' ? 'specship_search instead of Bash(grep)' : 'specship_explore on the symbol',
437
- saving: `~$${((r.result_length / 1_000_000) * 15).toFixed(2)} on this call`,
438
- });
439
- }
440
- // Rule 3: "cache miss rate" — sessions with > 10 prompts and cache_read_rate < 0.3.
441
- const lowCache = db.prepare(`
442
- SELECT s.id, s.total_cache_read_tokens as cr, s.total_input_tokens as ti, s.total_cache_creation_tokens as cw, s.prompt_count, s.last_model
443
- FROM claude_sessions s
444
- WHERE s.prompt_count >= 10
445
- AND (s.total_input_tokens + s.total_cache_creation_tokens + s.total_cache_read_tokens) > 0
446
- ORDER BY (CAST(s.total_cache_read_tokens AS REAL) / (s.total_input_tokens + s.total_cache_creation_tokens + s.total_cache_read_tokens)) ASC
447
- LIMIT 3
448
- `).all();
449
- for (const r of lowCache) {
450
- const total = r.ti + r.cw + r.cr;
451
- const rate = total > 0 ? r.cr / total : 0;
452
- if (rate >= 0.3)
453
- continue;
454
- tips.push({
455
- id: 'low_cache:' + r.id,
456
- severity: 'warn',
457
- icon: 'database',
458
- title: `Cache read rate is ${Math.round(rate * 100)}% on a ${r.prompt_count}-prompt session`,
459
- why: 'When the prompt prefix changes every turn, the 1h cache gets invalidated. Pinning a stable system-prompt prefix lets the cache absorb most of your input.',
460
- evidence: { session: r.id, detail: `cache_read=${(r.cr / 1_000_000).toFixed(2)}M / total=${(total / 1_000_000).toFixed(2)}M` },
461
- fix: 'Pin a stable system-prompt prefix in .claude/settings.json',
462
- saving: '~$X.XX / session (model-dependent)',
463
- });
464
- }
465
- // Sort: errors before warns before info, then within bucket by saving heuristic.
466
- const order = { error: 0, warn: 1, info: 2 };
467
- tips.sort((a, b) => (order[a.severity] ?? 9) - (order[b.severity] ?? 9));
468
- return { tips };
469
- });
470
- /**
471
- * Force a one-shot ingest pass. Useful for "Refresh" button in the UI.
472
- */
473
- app.post('/api/claude/ingest', async () => {
474
- const watcher = app.watcher;
475
- if (!watcher)
476
- return { ok: false, error: 'watcher not running' };
477
- const stats = watcher.ingestNow();
478
- return { ok: true, stats };
479
- });
480
- }