spiracha 1.5.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/AGENTS.md +114 -205
  2. package/README.md +89 -269
  3. package/apps/ui/AGENTS.md +17 -7
  4. package/apps/ui/README.md +34 -8
  5. package/apps/ui/components.json +21 -0
  6. package/apps/ui/package.json +65 -0
  7. package/apps/ui/src/components/antigravity-conversations-table.tsx +206 -0
  8. package/apps/ui/src/components/antigravity-keychain-panel.tsx +76 -0
  9. package/apps/ui/src/components/antigravity-workspaces-table.tsx +63 -0
  10. package/apps/ui/src/components/app-shell.tsx +124 -0
  11. package/apps/ui/src/components/breadcrumbs.tsx +53 -0
  12. package/apps/ui/src/components/claude-code-sessions-table.tsx +114 -0
  13. package/apps/ui/src/components/claude-code-workspaces-table.tsx +55 -0
  14. package/apps/ui/src/components/cursor-threads-table.tsx +189 -0
  15. package/apps/ui/src/components/cursor-workspaces-table.tsx +140 -0
  16. package/apps/ui/src/components/data-table.tsx +241 -0
  17. package/apps/ui/src/components/delete-confirm-dialog.tsx +88 -0
  18. package/apps/ui/src/components/export-dialog.tsx +184 -0
  19. package/apps/ui/src/components/json-panel.tsx +17 -0
  20. package/apps/ui/src/components/kiro-sessions-table.tsx +112 -0
  21. package/apps/ui/src/components/kiro-workspaces-table.tsx +53 -0
  22. package/apps/ui/src/components/list-search-input.tsx +18 -0
  23. package/apps/ui/src/components/loading-panel.tsx +23 -0
  24. package/apps/ui/src/components/metadata-section.tsx +31 -0
  25. package/apps/ui/src/components/metric-card.tsx +19 -0
  26. package/apps/ui/src/components/opencode-sessions-table.tsx +128 -0
  27. package/apps/ui/src/components/opencode-workspaces-table.tsx +57 -0
  28. package/apps/ui/src/components/page-header.tsx +33 -0
  29. package/apps/ui/src/components/projects-loading-state.tsx +74 -0
  30. package/apps/ui/src/components/projects-table.tsx +108 -0
  31. package/apps/ui/src/components/qoder-sessions-table.tsx +112 -0
  32. package/apps/ui/src/components/qoder-workspaces-table.tsx +53 -0
  33. package/apps/ui/src/components/recent-threads-list.tsx +52 -0
  34. package/apps/ui/src/components/reload-error-panel.tsx +20 -0
  35. package/apps/ui/src/components/text-document-panel.tsx +19 -0
  36. package/apps/ui/src/components/theme-toggle.tsx +48 -0
  37. package/apps/ui/src/components/threads-table.tsx +202 -0
  38. package/apps/ui/src/components/transcript-view.tsx +552 -0
  39. package/apps/ui/src/components/ui/alert-dialog.tsx +160 -0
  40. package/apps/ui/src/components/ui/badge.tsx +45 -0
  41. package/apps/ui/src/components/ui/button.tsx +62 -0
  42. package/apps/ui/src/components/ui/checkbox.tsx +29 -0
  43. package/apps/ui/src/components/ui/dialog.tsx +137 -0
  44. package/apps/ui/src/components/ui/dropdown-menu.tsx +217 -0
  45. package/apps/ui/src/components/ui/input.tsx +21 -0
  46. package/apps/ui/src/components/ui/scroll-area.tsx +46 -0
  47. package/apps/ui/src/components/ui/select.tsx +163 -0
  48. package/apps/ui/src/components/ui/separator.tsx +28 -0
  49. package/apps/ui/src/components/ui/sheet.tsx +107 -0
  50. package/apps/ui/src/components/ui/skeleton.tsx +7 -0
  51. package/apps/ui/src/components/ui/table.tsx +76 -0
  52. package/apps/ui/src/components/ui/tabs.tsx +71 -0
  53. package/apps/ui/src/components/ui/tooltip.tsx +44 -0
  54. package/apps/ui/src/integrations/tanstack-query/devtools.tsx +6 -0
  55. package/apps/ui/src/integrations/tanstack-query/root-provider.tsx +10 -0
  56. package/apps/ui/src/lib/antigravity-conversation-state.ts +28 -0
  57. package/apps/ui/src/lib/antigravity-queries.ts +33 -0
  58. package/apps/ui/src/lib/antigravity-server.ts +128 -0
  59. package/apps/ui/src/lib/antigravity-transcript-events.ts +335 -0
  60. package/apps/ui/src/lib/claude-code-queries.ts +26 -0
  61. package/apps/ui/src/lib/claude-code-server.ts +75 -0
  62. package/apps/ui/src/lib/claude-code-transcript-events.ts +154 -0
  63. package/apps/ui/src/lib/codex-queries.ts +66 -0
  64. package/apps/ui/src/lib/codex-server.ts +209 -0
  65. package/apps/ui/src/lib/cursor-queries.ts +37 -0
  66. package/apps/ui/src/lib/cursor-server.ts +272 -0
  67. package/apps/ui/src/lib/cursor-transcript-events.ts +229 -0
  68. package/apps/ui/src/lib/download.ts +166 -0
  69. package/apps/ui/src/lib/formatters.ts +149 -0
  70. package/apps/ui/src/lib/kiro-queries.ts +22 -0
  71. package/apps/ui/src/lib/kiro-server.ts +73 -0
  72. package/apps/ui/src/lib/kiro-transcript-events.ts +113 -0
  73. package/apps/ui/src/lib/opencode-queries.ts +37 -0
  74. package/apps/ui/src/lib/opencode-server.ts +73 -0
  75. package/apps/ui/src/lib/opencode-transcript-events.ts +221 -0
  76. package/apps/ui/src/lib/package-metadata.ts +16 -0
  77. package/apps/ui/src/lib/path-utils.ts +13 -0
  78. package/apps/ui/src/lib/qoder-queries.ts +22 -0
  79. package/apps/ui/src/lib/qoder-server.ts +79 -0
  80. package/apps/ui/src/lib/qoder-transcript-events.ts +139 -0
  81. package/apps/ui/src/lib/route-search.ts +68 -0
  82. package/apps/ui/src/lib/settings-store.tsx +59 -0
  83. package/apps/ui/src/lib/source-session-export-server.ts +56 -0
  84. package/apps/ui/src/lib/text-filter.ts +22 -0
  85. package/apps/ui/src/lib/thread-id.ts +3 -0
  86. package/apps/ui/src/lib/thread-transcript-stats.ts +57 -0
  87. package/apps/ui/src/lib/utils.ts +7 -0
  88. package/apps/ui/src/routeTree.gen.ts +730 -0
  89. package/apps/ui/src/router.tsx +20 -0
  90. package/apps/ui/src/routes/$threadId.tsx +22 -0
  91. package/apps/ui/src/routes/__root.tsx +127 -0
  92. package/apps/ui/src/routes/analytics.tsx +143 -0
  93. package/apps/ui/src/routes/antigravity-conversations.$conversationId.tsx +438 -0
  94. package/apps/ui/src/routes/antigravity.$workspaceKey.tsx +127 -0
  95. package/apps/ui/src/routes/antigravity.index.tsx +51 -0
  96. package/apps/ui/src/routes/api.v1.conversation-query.ts +12 -0
  97. package/apps/ui/src/routes/api.v1.conversations.$source.$id.export.ts +12 -0
  98. package/apps/ui/src/routes/api.v1.conversations.$source.$id.ts +12 -0
  99. package/apps/ui/src/routes/api.v1.conversations.ts +12 -0
  100. package/apps/ui/src/routes/api.v1.resolve.ts +12 -0
  101. package/apps/ui/src/routes/api.v1.sources.ts +12 -0
  102. package/apps/ui/src/routes/claude-code-sessions.$sessionId.tsx +342 -0
  103. package/apps/ui/src/routes/claude-code.$workspaceKey.tsx +135 -0
  104. package/apps/ui/src/routes/claude-code.index.tsx +48 -0
  105. package/apps/ui/src/routes/codex.$project.tsx +390 -0
  106. package/apps/ui/src/routes/codex.index.tsx +116 -0
  107. package/apps/ui/src/routes/cursor-threads.$composerId.tsx +435 -0
  108. package/apps/ui/src/routes/cursor.$workspaceKey.tsx +416 -0
  109. package/apps/ui/src/routes/cursor.index.tsx +120 -0
  110. package/apps/ui/src/routes/index.tsx +124 -0
  111. package/apps/ui/src/routes/kiro-sessions.$sessionId.tsx +345 -0
  112. package/apps/ui/src/routes/kiro.$workspaceKey.tsx +136 -0
  113. package/apps/ui/src/routes/kiro.index.tsx +48 -0
  114. package/apps/ui/src/routes/opencode-sessions.$sessionId.tsx +334 -0
  115. package/apps/ui/src/routes/opencode.$workspaceKey.tsx +135 -0
  116. package/apps/ui/src/routes/opencode.index.tsx +48 -0
  117. package/apps/ui/src/routes/qoder-sessions.$sessionId.tsx +341 -0
  118. package/apps/ui/src/routes/qoder.$workspaceKey.tsx +139 -0
  119. package/apps/ui/src/routes/qoder.index.tsx +48 -0
  120. package/apps/ui/src/routes/settings.tsx +91 -0
  121. package/apps/ui/src/routes/threads.$threadId.tsx +619 -0
  122. package/apps/ui/src/styles.css +122 -0
  123. package/apps/ui/tsconfig.json +29 -0
  124. package/apps/ui/vite.config.ts +84 -0
  125. package/bin/spiracha.ts +32 -0
  126. package/package.json +46 -73
  127. package/src/client.ts +290 -0
  128. package/src/lib/antigravity-db.ts +213 -19
  129. package/src/lib/antigravity-exporter-types.ts +1 -0
  130. package/src/lib/codex-analytics.ts +1 -1
  131. package/src/lib/codex-browser-db.ts +410 -74
  132. package/src/lib/codex-browser-export.ts +6 -14
  133. package/src/lib/codex-browser-types.ts +1 -1
  134. package/src/lib/{codex-exporter-types.ts → codex-thread-types.ts} +2 -30
  135. package/src/lib/{codex-exporter-transcript.ts → codex-transcript-renderer.ts} +64 -28
  136. package/src/lib/conversation-api.ts +792 -0
  137. package/src/lib/conversation-data/adapter-helpers.ts +110 -0
  138. package/src/lib/conversation-data/antigravity-adapter.ts +148 -0
  139. package/src/lib/conversation-data/claude-code-adapter.ts +175 -0
  140. package/src/lib/conversation-data/codex-adapter.ts +245 -0
  141. package/src/lib/conversation-data/cursor-adapter.ts +171 -0
  142. package/src/lib/conversation-data/index.ts +311 -0
  143. package/src/lib/conversation-data/kiro-adapter.ts +140 -0
  144. package/src/lib/conversation-data/message-selector.ts +37 -0
  145. package/src/lib/conversation-data/opencode-adapter.ts +180 -0
  146. package/src/lib/conversation-data/path-match.ts +79 -0
  147. package/src/lib/conversation-data/qoder-adapter.ts +230 -0
  148. package/src/lib/conversation-data/types.ts +116 -0
  149. package/src/lib/cursor-db.ts +67 -21
  150. package/src/lib/cursor-exporter-types.ts +0 -19
  151. package/src/lib/qoder-acp-client.ts +268 -0
  152. package/src/lib/qoder-db.ts +1601 -0
  153. package/src/lib/qoder-exporter-types.ts +114 -0
  154. package/src/lib/qoder-transcript-phase.ts +41 -0
  155. package/src/lib/qoder-transcript.ts +112 -0
  156. package/apps/ui/dist/client/assets/_threadId-CAIeH5mq.js +0 -1
  157. package/apps/ui/dist/client/assets/analytics-DOy1b6Sh.js +0 -1
  158. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DqySVO2K.js +0 -7
  159. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +0 -1
  160. package/apps/ui/dist/client/assets/antigravity-keychain-panel-B77qJz6f.js +0 -1
  161. package/apps/ui/dist/client/assets/antigravity._workspaceKey-B3NM6gRH.js +0 -1
  162. package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +0 -1
  163. package/apps/ui/dist/client/assets/antigravity.index-DP9JC2P9.js +0 -1
  164. package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +0 -1
  165. package/apps/ui/dist/client/assets/badge-C3i4OKs8.js +0 -1
  166. package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +0 -1
  167. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-8pQ55ci2.js +0 -1
  168. package/apps/ui/dist/client/assets/claude-code-sessions._sessionId-DVz5UmtU.js +0 -1
  169. package/apps/ui/dist/client/assets/claude-code._workspaceKey-BBKskSum.js +0 -1
  170. package/apps/ui/dist/client/assets/claude-code._workspaceKey-OkikMUFs.js +0 -1
  171. package/apps/ui/dist/client/assets/claude-code.index-Cwu76dbb.js +0 -1
  172. package/apps/ui/dist/client/assets/claude-code.index-D6eMd08t.js +0 -1
  173. package/apps/ui/dist/client/assets/createServerFn-B-KkwmHU.js +0 -3
  174. package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +0 -1
  175. package/apps/ui/dist/client/assets/cursor-threads._composerId-hBWlP1D-.js +0 -1
  176. package/apps/ui/dist/client/assets/cursor._workspaceKey-BFPkIRi-.js +0 -1
  177. package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +0 -1
  178. package/apps/ui/dist/client/assets/cursor.index-8y4o20kb.js +0 -2
  179. package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +0 -1
  180. package/apps/ui/dist/client/assets/data-table-Br78_dk3.js +0 -4
  181. package/apps/ui/dist/client/assets/delete-confirm-dialog-Bxs07u-j.js +0 -7
  182. package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +0 -1
  183. package/apps/ui/dist/client/assets/dist-BrJhN2A0.js +0 -5
  184. package/apps/ui/dist/client/assets/dist-Cmd3AIfD.js +0 -1
  185. package/apps/ui/dist/client/assets/dist-DvMS2965.js +0 -1
  186. package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +0 -1
  187. package/apps/ui/dist/client/assets/dropdown-menu-D5cvPaZt.js +0 -1
  188. package/apps/ui/dist/client/assets/es2015-ad6040dw.js +0 -41
  189. package/apps/ui/dist/client/assets/export-dialog-Dr8d2MqD.js +0 -1
  190. package/apps/ui/dist/client/assets/formatters-BtqyrX_c.js +0 -1
  191. package/apps/ui/dist/client/assets/index-C-STgIH4.js +0 -166
  192. package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +0 -1
  193. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-CKgfJ7GR.js +0 -1
  194. package/apps/ui/dist/client/assets/kiro-sessions._sessionId-zvIJHtQF.js +0 -1
  195. package/apps/ui/dist/client/assets/kiro._workspaceKey-DhVuJuZB.js +0 -1
  196. package/apps/ui/dist/client/assets/kiro._workspaceKey-QArsjkTY.js +0 -1
  197. package/apps/ui/dist/client/assets/kiro.index-C-fr4m7i.js +0 -1
  198. package/apps/ui/dist/client/assets/kiro.index-OYgAdtZd.js +0 -1
  199. package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +0 -1
  200. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-DLjiTst-.js +0 -1
  201. package/apps/ui/dist/client/assets/opencode-sessions._sessionId-biBwrRbt.js +0 -8
  202. package/apps/ui/dist/client/assets/opencode._workspaceKey-C7OIzMOJ.js +0 -1
  203. package/apps/ui/dist/client/assets/opencode._workspaceKey-sBakX0oI.js +0 -1
  204. package/apps/ui/dist/client/assets/opencode.index-Bl_kNs9N.js +0 -1
  205. package/apps/ui/dist/client/assets/opencode.index-CN53bVmb.js +0 -1
  206. package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +0 -1
  207. package/apps/ui/dist/client/assets/preload-helper-B8fFrdxC.js +0 -1
  208. package/apps/ui/dist/client/assets/projects._project-D8WloxQN.js +0 -1
  209. package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +0 -1
  210. package/apps/ui/dist/client/assets/projects.index-5xRtuJdX.js +0 -3
  211. package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +0 -1
  212. package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +0 -1
  213. package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +0 -1
  214. package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +0 -1
  215. package/apps/ui/dist/client/assets/routes-DnzF_9CX.js +0 -1
  216. package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +0 -1
  217. package/apps/ui/dist/client/assets/select-CYF6pF37.js +0 -1
  218. package/apps/ui/dist/client/assets/settings-Dx70jgP_.js +0 -1
  219. package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +0 -1
  220. package/apps/ui/dist/client/assets/styles-B7Zi9EFA.css +0 -1
  221. package/apps/ui/dist/client/assets/tabs-CmuhkT-c.js +0 -7
  222. package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +0 -2
  223. package/apps/ui/dist/client/assets/thread-transcript-stats-BUNz6u7F.js +0 -1
  224. package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +0 -1
  225. package/apps/ui/dist/client/assets/threads._threadId-BMRSFow3.js +0 -1
  226. package/apps/ui/dist/client/assets/useMutation-BSFult2i.js +0 -1
  227. package/apps/ui/dist/client/assets/useQuery-CjINKZf1.js +0 -1
  228. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CQ8Jjs3B.js +0 -387
  229. package/apps/ui/dist/server/assets/_threadId-B6SrBR9E.js +0 -6
  230. package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +0 -16
  231. package/apps/ui/dist/server/assets/analytics-CtpOMVMO.js +0 -146
  232. package/apps/ui/dist/server/assets/antigravity-conversation-state-HgzS302O.js +0 -16
  233. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BKOyL2T6.js +0 -613
  234. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-D426O-64.js +0 -11
  235. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-eS87Dx7g.js +0 -20
  236. package/apps/ui/dist/server/assets/antigravity-db-Bh8_U9uw.js +0 -580
  237. package/apps/ui/dist/server/assets/antigravity-keychain-DOiuHDwK.js +0 -126
  238. package/apps/ui/dist/server/assets/antigravity-keychain-panel-CC7FLmAK.js +0 -55
  239. package/apps/ui/dist/server/assets/antigravity-queries-CGrJO9Vr.js +0 -37
  240. package/apps/ui/dist/server/assets/antigravity-server-CHRjVFqN.js +0 -114
  241. package/apps/ui/dist/server/assets/antigravity._workspaceKey-3m_MzNFA.js +0 -11
  242. package/apps/ui/dist/server/assets/antigravity._workspaceKey-B0QeYUOh.js +0 -28
  243. package/apps/ui/dist/server/assets/antigravity._workspaceKey-C3kP-qyN.js +0 -210
  244. package/apps/ui/dist/server/assets/antigravity.index-CPCYkqCi.js +0 -104
  245. package/apps/ui/dist/server/assets/antigravity.index-DudTB3Tq.js +0 -11
  246. package/apps/ui/dist/server/assets/badge-EvdhKK_Z.js +0 -26
  247. package/apps/ui/dist/server/assets/button-CmTDnzOn.js +0 -46
  248. package/apps/ui/dist/server/assets/checkbox-C0hovF41.js +0 -19
  249. package/apps/ui/dist/server/assets/claude-code-db-Ik3VStKZ.js +0 -361
  250. package/apps/ui/dist/server/assets/claude-code-queries-Cgzi4K-e.js +0 -37
  251. package/apps/ui/dist/server/assets/claude-code-server-PfraClXS.js +0 -72
  252. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-C55oe6zj.js +0 -18
  253. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-D1RYYi3j.js +0 -473
  254. package/apps/ui/dist/server/assets/claude-code-sessions._sessionId-DSvPLEUL.js +0 -11
  255. package/apps/ui/dist/server/assets/claude-code-transcript-C-bxh3cS.js +0 -139
  256. package/apps/ui/dist/server/assets/claude-code-transcript-phase-DmUMc8VU.js +0 -10
  257. package/apps/ui/dist/server/assets/claude-code._workspaceKey-B5Xg_-tE.js +0 -28
  258. package/apps/ui/dist/server/assets/claude-code._workspaceKey-BPlzyXPa.js +0 -11
  259. package/apps/ui/dist/server/assets/claude-code._workspaceKey-DqDve2wl.js +0 -191
  260. package/apps/ui/dist/server/assets/claude-code.index-B7yYR7dD.js +0 -92
  261. package/apps/ui/dist/server/assets/claude-code.index-BUHThG1W.js +0 -11
  262. package/apps/ui/dist/server/assets/codex-queries-CtgeZ7VL.js +0 -99
  263. package/apps/ui/dist/server/assets/codex-server-CGXU4H8-.js +0 -2294
  264. package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +0 -18
  265. package/apps/ui/dist/server/assets/createServerRpc-CF_DEwnm.js +0 -12
  266. package/apps/ui/dist/server/assets/createSsrRpc-C754NPki.js +0 -16
  267. package/apps/ui/dist/server/assets/cursor-db-CZnYy7aT.js +0 -830
  268. package/apps/ui/dist/server/assets/cursor-exporter-types-CI3goo-c.js +0 -34
  269. package/apps/ui/dist/server/assets/cursor-queries-NCIM0Nat.js +0 -67
  270. package/apps/ui/dist/server/assets/cursor-recovery-CXpO8KcD.js +0 -361
  271. package/apps/ui/dist/server/assets/cursor-server-DNu52A3K.js +0 -213
  272. package/apps/ui/dist/server/assets/cursor-threads._composerId-BB0Y_Mao.js +0 -11
  273. package/apps/ui/dist/server/assets/cursor-threads._composerId-Ckn6ItHI.js +0 -582
  274. package/apps/ui/dist/server/assets/cursor-threads._composerId-p9-ARAzc.js +0 -18
  275. package/apps/ui/dist/server/assets/cursor-transcript-B7tGnqtn.js +0 -125
  276. package/apps/ui/dist/server/assets/cursor._workspaceKey-CZuohIUL.js +0 -28
  277. package/apps/ui/dist/server/assets/cursor._workspaceKey-DPp5JSjy.js +0 -401
  278. package/apps/ui/dist/server/assets/cursor._workspaceKey-nmg3YIOQ.js +0 -11
  279. package/apps/ui/dist/server/assets/cursor.index-CcsX7DG0.js +0 -11
  280. package/apps/ui/dist/server/assets/cursor.index-DkWT-mxw.js +0 -189
  281. package/apps/ui/dist/server/assets/data-table-Cdct823O.js +0 -189
  282. package/apps/ui/dist/server/assets/delete-confirm-dialog-BcBNCxWB.js +0 -144
  283. package/apps/ui/dist/server/assets/download-DMmiy1xf.js +0 -92
  284. package/apps/ui/dist/server/assets/dropdown-menu-Dy_9t6TN.js +0 -36
  285. package/apps/ui/dist/server/assets/empty-plugin-adapters-B3lHh1La.js +0 -5
  286. package/apps/ui/dist/server/assets/export-dialog-D88ze9Gy.js +0 -240
  287. package/apps/ui/dist/server/assets/formatters-FJaGZgJk.js +0 -91
  288. package/apps/ui/dist/server/assets/kiro-db--fXrED_-.js +0 -552
  289. package/apps/ui/dist/server/assets/kiro-queries-CzNlM2ok.js +0 -37
  290. package/apps/ui/dist/server/assets/kiro-server-9WRxg2Au.js +0 -72
  291. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-CRY2c7YO.js +0 -11
  292. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-F1UlwxmR.js +0 -449
  293. package/apps/ui/dist/server/assets/kiro-sessions._sessionId-bvTulT7C.js +0 -18
  294. package/apps/ui/dist/server/assets/kiro-transcript-DoekQBaH.js +0 -112
  295. package/apps/ui/dist/server/assets/kiro-transcript-phase-CJG40nQg.js +0 -27
  296. package/apps/ui/dist/server/assets/kiro._workspaceKey-BDe9sQwo.js +0 -11
  297. package/apps/ui/dist/server/assets/kiro._workspaceKey-CJsjgNwO.js +0 -28
  298. package/apps/ui/dist/server/assets/kiro._workspaceKey-D_-4Qb7y.js +0 -193
  299. package/apps/ui/dist/server/assets/kiro.index-C__-UROk.js +0 -11
  300. package/apps/ui/dist/server/assets/kiro.index-CmTbqeYj.js +0 -93
  301. package/apps/ui/dist/server/assets/loading-panel-BGFnWseS.js +0 -27
  302. package/apps/ui/dist/server/assets/metric-card-ByEeLu0r.js +0 -23
  303. package/apps/ui/dist/server/assets/model-label-B1NWGc65.js +0 -13
  304. package/apps/ui/dist/server/assets/opencode-db-BM7KjOzc.js +0 -397
  305. package/apps/ui/dist/server/assets/opencode-queries-BeNYXnQv.js +0 -50
  306. package/apps/ui/dist/server/assets/opencode-server-BpQ_kRze.js +0 -72
  307. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-CGQ-t0vD.js +0 -518
  308. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-D8Q7in_Z.js +0 -18
  309. package/apps/ui/dist/server/assets/opencode-sessions._sessionId-DKOvi0lV.js +0 -11
  310. package/apps/ui/dist/server/assets/opencode-think-tags-CAoD-EcZ.js +0 -87
  311. package/apps/ui/dist/server/assets/opencode-transcript-BNTcGNym.js +0 -141
  312. package/apps/ui/dist/server/assets/opencode-transcript-phase-OqLkiQD0.js +0 -32
  313. package/apps/ui/dist/server/assets/opencode._workspaceKey-BdqcWHw1.js +0 -11
  314. package/apps/ui/dist/server/assets/opencode._workspaceKey-CfH96HTT.js +0 -28
  315. package/apps/ui/dist/server/assets/opencode._workspaceKey-DdbHPDrO.js +0 -207
  316. package/apps/ui/dist/server/assets/opencode.index-BbVzkJXP.js +0 -11
  317. package/apps/ui/dist/server/assets/opencode.index-Vh_Gq_1L.js +0 -93
  318. package/apps/ui/dist/server/assets/page-header-VNSaM3xd.js +0 -29
  319. package/apps/ui/dist/server/assets/path-transforms-DL2IwtYd.js +0 -31
  320. package/apps/ui/dist/server/assets/projects._project-4io5LO0E.js +0 -20
  321. package/apps/ui/dist/server/assets/projects._project-Bshqk7JA.js +0 -12
  322. package/apps/ui/dist/server/assets/projects._project-D6ZoGhJ8.js +0 -395
  323. package/apps/ui/dist/server/assets/projects.index-BLXOx5eL.js +0 -12
  324. package/apps/ui/dist/server/assets/projects.index-BkLiF2FF.js +0 -182
  325. package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +0 -14
  326. package/apps/ui/dist/server/assets/reload-error-panel-BJMxY3U1.js +0 -25
  327. package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +0 -38
  328. package/apps/ui/dist/server/assets/router-Sac2DGk6.js +0 -518
  329. package/apps/ui/dist/server/assets/routes-Bsact1uB.js +0 -184
  330. package/apps/ui/dist/server/assets/routes-BzkJgq4W.js +0 -34
  331. package/apps/ui/dist/server/assets/select-GW76p-ld.js +0 -76
  332. package/apps/ui/dist/server/assets/settings-OayxIYQQ.js +0 -100
  333. package/apps/ui/dist/server/assets/settings-store-DpEJEQ7M.js +0 -52
  334. package/apps/ui/dist/server/assets/shared-DyhChtHf.js +0 -137
  335. package/apps/ui/dist/server/assets/source-session-export-server-DNutCawb.js +0 -38
  336. package/apps/ui/dist/server/assets/sqlite-error-LZDrnxdd.js +0 -13
  337. package/apps/ui/dist/server/assets/start-B_HFwkkk.js +0 -4
  338. package/apps/ui/dist/server/assets/tabs-DkaChNVg.js +0 -501
  339. package/apps/ui/dist/server/assets/text-filter-CGKxMCKt.js +0 -36
  340. package/apps/ui/dist/server/assets/thread-transcript-stats-Dh34mt2u.js +0 -45
  341. package/apps/ui/dist/server/assets/threads._threadId-BSSK4nkI.js +0 -26
  342. package/apps/ui/dist/server/assets/threads._threadId-BeXEc4Lo.js +0 -648
  343. package/apps/ui/dist/server/assets/threads._threadId-Ci0S4mKU.js +0 -18
  344. package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +0 -83
  345. package/apps/ui/dist/server/assets/utils-C_uf36nf.js +0 -8
  346. package/apps/ui/dist/server/server.js +0 -5895
  347. package/bin/codex-chats-claude.js +0 -5
  348. package/bin/codex-chats.js +0 -5
  349. package/bin/spiracha.js +0 -5
  350. package/src/export-chats.ts +0 -120
  351. package/src/export-claude.ts +0 -36
  352. package/src/export-cursor.ts +0 -244
  353. package/src/lib/claude-exporter.ts +0 -864
  354. package/src/lib/codex-exporter-cli.ts +0 -277
  355. package/src/lib/codex-exporter-db.ts +0 -319
  356. package/src/lib/codex-exporter.ts +0 -115
  357. package/src/lib/cursor-exporter.ts +0 -266
  358. package/src/lib/interactive-cli.ts +0 -433
  359. package/src/lib/native-open.ts +0 -54
  360. package/src/mcp-server.ts +0 -137
  361. package/src/spiracha.ts +0 -116
  362. package/src/ui-cli.ts +0 -310
  363. /package/apps/ui/{dist/client → public}/icon.svg +0 -0
  364. /package/apps/ui/{dist/client → public}/manifest.json +0 -0
  365. /package/apps/ui/{dist/client → public}/robots.txt +0 -0
package/README.md CHANGED
@@ -4,331 +4,151 @@
4
4
  <img src="apps/ui/public/icon.svg" alt="Spiracha icon" width="96" height="100">
5
5
  </p>
6
6
 
7
- [![npm version](https://img.shields.io/npm/v/spiracha?label=npm)](https://www.npmjs.com/package/spiracha)
8
- [![downloads](https://img.shields.io/npm/dm/spiracha?label=downloads)](https://www.npmjs.com/package/spiracha)
9
7
  [![license](https://img.shields.io/npm/l/spiracha)](LICENSE.md)
10
8
  [![runtime](https://img.shields.io/badge/runtime-Bun-000000?logo=bun)](https://bun.sh)
11
- [![wakatime](https://wakatime.com/badge/user/a0b906ce-b8e7-4463-8bce-383238df6d4b/project/f035d5e2-fa44-4383-913b-53c2c326d8a7.svg)](https://wakatime.com/badge/user/a0b906ce-b8e7-4463-8bce-383238df6d4b/project/f035d5e2-fa44-4383-913b-53c2c326d8a7)
12
9
 
13
- Export local Codex, Claude Code, and Cursor transcripts to Markdown or plain text, and inspect or export Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode history through a browser UI.
10
+ Spiracha is a local TanStack Start app for browsing and exporting agent conversation history from Codex, Claude Code, Kiro, Qoder, Cursor, Antigravity, and OpenCode.
11
+
12
+ The legacy CLI, MCP server, and Codex plugin surfaces have been removed in the 2.0 hard cut. Spiracha now exposes the UI and a stable local data API; client-specific workflows such as review collection belong in the client that calls the API.
14
13
 
15
14
  ## Quick Start
16
15
 
17
- For repo-local development:
16
+ To run the packaged app:
18
17
 
19
18
  ```bash
20
- rtk bun start
21
- rtk bun run ui:dev
19
+ bunx spiracha
22
20
  ```
23
21
 
24
- Published package usage, once the package is available on npm:
25
-
26
- ```bash
27
- rtk bunx spiracha
28
- rtk bunx spiracha ui
29
- rtk bunx spiracha claude /path/to/session-export.jsonl --output-format txt
30
- rtk bunx spiracha cursor list
31
- ```
22
+ Spiracha asks Vite for port 3000 and automatically uses the next available port when 3000 is occupied.
32
23
 
33
- ## Features
34
-
35
- - Export Codex session transcripts from local `.codex` history
36
- - Export Cursor Agent/Composer threads from local Cursor storage
37
- - Browse Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode history in a TanStack Start UI
38
- - Inspect Codex thread timelines, tool calls, thread metadata, and raw event context
39
- - Inspect Claude Code project workspaces, dedicated session detail pages, reasoning/tool calls, token metadata, and export sessions directly from local `~/.claude/projects` JSONL files
40
- - Inspect Kiro workspace inventories, dedicated session detail pages, image attachments, prompt logs, execution-derived tool calls, and export sessions
41
- - Inspect Cursor workspace inventories, dedicated thread detail pages, recover split storage buckets, and export or delete workspace threads
42
- - Inspect Antigravity workspaces, dedicated conversation detail pages, unlock transcript export through macOS Keychain, and export conversation transcripts or generated artifacts
43
- - Inspect OpenCode project workspaces, dedicated session detail pages, reasoning/tool parts, MiniMax `<think>` blocks, token metadata, and export sessions
44
- - Delete threads or derived projects from the Codex SQLite database after confirmation
45
- - Download thread exports directly from the UI as Markdown, plain text, or optional zip archives, with optional metadata, commentary, and tool-call inclusion
46
- - Keep source-specific assistant commentary hidden by default while still showing final answers, with matching export filtering for Claude Code, Kiro, and OpenCode
47
- - View dashboard and analytics summaries, including token totals and tool-call frequency
48
- - Filter Codex exports by:
49
- - exact `cwd`
50
- - project basename via `--project`
51
- - specific thread deeplinks like `codex://threads/<id>`
52
- - Include command logs with `--tools`
53
- - Write Markdown or real plain-text output with `--output-format md|txt`
54
- - Export Claude Code transcript `.jsonl` files or export directories
55
- - Export, recover, and prune Cursor chat history from the CLI
56
- - Run the same export flows through an MCP server and a local Codex plugin
57
-
58
- ## Install
24
+ For repository development:
59
25
 
60
26
  ```bash
61
27
  rtk bun install
28
+ rtk bun start
62
29
  ```
63
30
 
64
- For package use after publish, no local install is required:
31
+ Open the local URL printed by Vite.
65
32
 
66
- ```bash
67
- rtk bunx spiracha --help
68
- rtk bunx spiracha ui --help
69
- ```
33
+ ## What It Does
70
34
 
71
- ## Usage
35
+ - Browse local conversations across Codex, Claude Code, Kiro, Qoder, Cursor, Antigravity, and OpenCode.
36
+ - Inspect source-specific detail pages with transcript, tool, reasoning, metadata, raw event, export, and delete flows where supported by the source.
37
+ - Export transcripts from the UI as Markdown, text, or zip bundles with source-specific commentary/final-answer filtering.
38
+ - Expose a stable API for local clients that need normalized conversation metadata and message payloads.
39
+ - Resolve Spiracha UI links and native source links into normalized `{ source, id }` references for cross-thread context lookup.
72
40
 
73
- ### Codex exports
41
+ ## Stable Data API
74
42
 
75
- Package entrypoint:
43
+ The API is served by the local UI server under `/api/v1`.
76
44
 
77
45
  ```bash
78
- rtk bunx spiracha [options] [codex://threads/<id> ...]
79
- rtk bunx spiracha codex [options] [codex://threads/<id> ...]
46
+ bunx spiracha
80
47
  ```
81
48
 
82
- With no arguments, `spiracha` starts in interactive mode and asks what you want to export.
83
-
84
- Examples:
49
+ Common read endpoints:
85
50
 
86
- ```bash
87
- rtk bunx spiracha
88
- rtk bunx spiracha --interactive
89
- rtk bunx spiracha --project summer
90
- rtk bunx spiracha --tools --project summer
91
- rtk bunx spiracha codex://threads/019da28f-ee5b-7881-afe0-68b3d3bd2c77
92
- rtk bunx spiracha codex://threads/019da28f-ee5b-7881-afe0-68b3d3bd2c77 --output-format txt
93
- rtk bunx spiracha --cwd ~/workspace/reversed/summer --flat
94
- rtk bunx spiracha codex://threads/<thread-id> --no-metadata
51
+ ```text
52
+ GET /api/v1/sources
53
+ GET /api/v1/conversations?cwd=/absolute/project&include_messages=true
54
+ POST /api/v1/conversation-query
55
+ GET /api/v1/conversations/:source/:id
56
+ GET /api/v1/conversations/:source/:id/export
57
+ GET /api/v1/resolve?ref=<url-or-deeplink>
95
58
  ```
96
59
 
97
- Important flags:
98
- - no args: start interactive mode
99
- - `--interactive`: force the interactive prompt flow
100
- - `--project <name>`: matches the final `cwd` path segment for both POSIX and Windows-style paths
101
- - `--cwd <path>`: exact cwd match
102
- - `--tools`: include `exec_command` call logs and summaries
103
- - `--no-metadata`: omit the metadata section from the top of each export
104
- - `--flat`: write files into a single output folder
105
- - `--output-format md|txt`: output as Markdown or plain text
60
+ The default list selector is `last_final_answer`, which keeps `fgh --collect` style clients fast and small. Use `message_selector=all` when a client needs the full normalized thread.
106
61
 
107
- ### Browser UI
62
+ Example:
108
63
 
109
64
  ```bash
110
- rtk bunx spiracha ui
65
+ curl 'http://localhost:3000/api/v1/conversations?cwd=/Users/me/workspace/fgh&include_messages=true'
111
66
  ```
112
67
 
113
- This launches the packaged production UI server, opens your browser by default, and keeps running in the foreground.
114
- Large download bundles are written to a Spiracha-managed directory under your OS temp folder and served directly by the UI server, so packaged `rtk bunx spiracha ui` exports do not depend on your current working directory.
68
+ Response envelope:
115
69
 
116
- Useful flags:
117
- - `--port <port>`: bind a specific port, default `3000`
118
- - `--host <host>`: bind a specific host, default `127.0.0.1`
119
- - `--db <path>`: override the Codex SQLite path used by the UI
120
- - `--no-open`: do not open the browser automatically
70
+ ```json
71
+ {
72
+ "data": [
73
+ {
74
+ "source": "codex",
75
+ "id": "019ecbfc-8a84-7421-ab3b-35653feb7896",
76
+ "title": "Review thread",
77
+ "workspacePath": "/Users/me/workspace/fgh",
78
+ "messages": [
79
+ {
80
+ "role": "assistant",
81
+ "phase": "final_answer",
82
+ "text": "Final review result..."
83
+ }
84
+ ],
85
+ "deepLinks": {
86
+ "ui": "/threads/019ecbfc-8a84-7421-ab3b-35653feb7896",
87
+ "native": "codex://threads/019ecbfc-8a84-7421-ab3b-35653feb7896",
88
+ "spiracha": "spiracha://conversation/codex/019ecbfc-8a84-7421-ab3b-35653feb7896"
89
+ }
90
+ }
91
+ ],
92
+ "meta": {
93
+ "hasNext": false,
94
+ "next_cursor": null
95
+ }
96
+ }
97
+ ```
121
98
 
122
- The UI currently includes:
123
- - a Codex inventory and derived-project detail flow
124
- - a Claude Code workspace inventory, workspace-session listing, and standalone session detail flow
125
- - a Kiro workspace inventory, workspace-session listing, and standalone session detail flow
126
- - a Cursor workspace inventory, workspace-thread listing, and standalone thread detail flow
127
- - an Antigravity workspace inventory, conversation listing, and standalone conversation detail flow
128
- - an OpenCode workspace inventory, session listing, and standalone session detail flow
129
- - a Codex dashboard, Codex thread detail view, and Codex analytics page
99
+ For serverless access from Bun, use the public client export:
130
100
 
131
- Transcript detail pages use the same compact controls across sources: show or hide user messages, commentary, tool calls, extra events, and raw JSON. Claude Code uses `stop_reason` to distinguish tool-use lead-ins from final answers. Kiro uses execution traces for assistant commentary/tool calls and keeps the final assistant response for each user turn visible. OpenCode strips MiniMax `<think>` blocks into commentary, preserves literal `<think>` examples inside Markdown code, and uses the final visible assistant text in each assistant run as the final answer.
101
+ ```ts
102
+ import { createConversationClient } from "spiracha/client";
132
103
 
133
- Default browser UI data locations:
104
+ const client = createConversationClient({ mode: "local" });
105
+ const page = await client.listConversations({
106
+ cwd: process.cwd(),
107
+ includeMessages: true,
108
+ messageSelector: "last_final_answer",
109
+ });
110
+ ```
111
+
112
+ ## Source Locations
134
113
 
135
114
  | Source | Default location | Primary override |
136
115
  | --- | --- | --- |
137
116
  | Codex | shared Codex DB probe list | `SPIRACHA_CODEX_DB` |
138
117
  | Claude Code | `~/.claude/projects` | `SPIRACHA_CLAUDE_CODE_PROJECTS_DIR` |
139
118
  | Kiro | `~/Library/Application Support/Kiro/User/globalStorage/kiro.kiroagent/workspace-sessions` | `SPIRACHA_KIRO_WORKSPACE_SESSIONS_DIR` |
119
+ | Qoder | `~/Library/Application Support/Qoder/User/globalStorage/state.vscdb` and `~/Library/Application Support/Qoder/User/workspaceStorage` | `SPIRACHA_QODER_GLOBAL_STATE_DB`, `SPIRACHA_QODER_WORKSPACE_STORAGE_DIR` |
120
+ | Cursor | `~/Library/Application Support/Cursor/User` on macOS | `SPIRACHA_CURSOR_USER_DIR`, `SPIRACHA_CURSOR_PROJECTS_DIR` |
121
+ | Antigravity | `~/.gemini/antigravity-ide` and `~/.gemini/antigravity` | `SPIRACHA_ANTIGRAVITY_DIRS`, `SPIRACHA_ANTIGRAVITY_DIR` |
140
122
  | OpenCode | `${XDG_DATA_HOME:-~/.local/share}/opencode/opencode.db` | `SPIRACHA_OPENCODE_DB` |
141
- | Export downloads | OS temp directory under `spiracha-ui-exports` | `SPIRACHA_UI_EXPORT_DIR` |
142
-
143
- Codex inventory search and analytics project filters are stored in route search params, so filtered views can be bookmarked or reloaded. `/projects` and `/projects/$project` use `q`, and `/analytics` uses `project`.
144
-
145
- Analytics cache keys are derived from Codex DB row metadata instead of statting every rollout file. This avoids large per-rollout stat storms on big histories and lets cached analytics resolve without touching transcript files. The hard tradeoff is that manual JSONL edits outside Codex do not invalidate analytics unless the corresponding DB row metadata changes or the temp UI cache is cleared. Transcript analytics parsing uses a bounded worker pool; tune it with `SPIRACHA_ANALYTICS_TRANSCRIPT_CONCURRENCY` when benchmarking large datasets.
146
-
147
- The thread detail page also supports a direct UUID shortcut route. Pasting `http://localhost:3000/<thread-id>` redirects to `/threads/<thread-id>`.
148
-
149
- Notable UI routes:
150
- - `/projects` and `/projects/$project` for Codex inventory and project threads
151
- - `/threads/$threadId` for Codex thread detail
152
- - `/claude-code` and `/claude-code/$workspaceKey` for Claude Code workspace inventory and session lists
153
- - `/claude-code-sessions/$sessionId` for Claude Code session detail
154
- - `/kiro` and `/kiro/$workspaceKey` for Kiro workspace inventory and session lists
155
- - `/kiro-sessions/$sessionId` for Kiro session detail
156
- - `/cursor` and `/cursor/$workspaceKey` for Cursor workspace inventory and thread lists
157
- - `/cursor-threads/$composerId` for Cursor thread detail
158
- - `/antigravity` and `/antigravity/$workspaceKey` for Antigravity workspace inventory and conversation lists
159
- - `/antigravity-conversations/$conversationId` for Antigravity conversation detail
160
- - `/opencode` and `/opencode/$workspaceKey` for OpenCode workspace inventory and session lists
161
- - `/opencode-sessions/$sessionId` for OpenCode session detail
162
-
163
- Examples:
164
-
165
- ```bash
166
- rtk bunx spiracha ui
167
- rtk bunx spiracha ui --port 43123 --no-open
168
- rtk bunx spiracha ui --db ~/.codex/state_5.sqlite
169
- ```
170
-
171
- Stop the UI with `Ctrl+C`.
172
-
173
- ### Claude exports
174
-
175
- ```bash
176
- rtk bunx spiracha claude <input-path> [options]
177
- ```
178
-
179
- Examples:
180
-
181
- ```bash
182
- rtk bunx spiracha claude /path/to/session.jsonl
183
- rtk bunx spiracha claude /path/to/export-dir --tools
184
- rtk bunx spiracha claude /path/to/export-dir --output-format txt
185
- ```
186
-
187
- Repo-local equivalents remain available during development:
188
-
189
- ```bash
190
- rtk bun start
191
- rtk bun start --interactive
192
- rtk bun start ...
193
- rtk bun run export:claude -- ...
194
- ```
123
+ | UI exports | OS temp directory under `spiracha-ui-exports` | `SPIRACHA_UI_EXPORT_DIR` |
195
124
 
196
- Legacy aliases remain available for compatibility:
125
+ ## UI Routes
197
126
 
198
- ```bash
199
- rtk bunx codex-chats
200
- rtk bunx codex-chats-claude
201
- ```
202
-
203
- ### Cursor exports
204
-
205
- ```bash
206
- rtk bunx spiracha cursor <subcommand> [options]
207
- ```
208
-
209
- Examples:
210
-
211
- ```bash
212
- rtk bunx spiracha cursor list
213
- rtk bunx spiracha cursor list --query summer
214
- rtk bunx spiracha cursor export --workspace summer --output-dir ./cursor-exports
215
- rtk bunx spiracha cursor export --thread <composer-id> --output-format txt
216
- rtk bunx spiracha cursor recover --workspace summer --apply
217
- rtk bunx spiracha cursor prune --workspace summer --apply
218
- ```
219
-
220
- Repo-local equivalent during development:
221
-
222
- ```bash
223
- rtk bun run ./src/export-cursor.ts --help
224
- ```
225
-
226
- Claude Code direct-history browsing, Kiro browsing/export, Antigravity, and OpenCode conversation browsing/export currently live in the browser UI rather than standalone CLI subcommands.
227
-
228
- ## MCP server
229
-
230
- Run the MCP server with:
231
-
232
- ```bash
233
- rtk bun run mcp
234
- ```
235
-
236
- Exposed tools:
237
- - `export_codex_chats`
238
- - `export_claude_transcript`
239
-
240
- The local plugin lives in [plugins/codex-chats-export](plugins/codex-chats-export) and is registered through [plugins/codex-chats-export/.mcp.json](plugins/codex-chats-export/.mcp.json).
127
+ - `/codex` and `/codex/$project` for Codex inventory and project threads.
128
+ - `/threads/$threadId` for Codex thread detail.
129
+ - `/claude-code`, `/kiro`, `/qoder`, `/cursor`, `/antigravity`, and `/opencode` for source inventories.
130
+ - Source detail routes include `/claude-code-sessions/$sessionId`, `/kiro-sessions/$sessionId`, `/qoder-sessions/$sessionId`, `/cursor-threads/$composerId`, `/antigravity-conversations/$conversationId`, and `/opencode-sessions/$sessionId`.
131
+ - `/analytics` for Codex token and tool-call analytics.
241
132
 
242
133
  ## Development
243
134
 
244
- Useful commands:
245
-
246
135
  ```bash
247
136
  rtk bun test
248
137
  rtk bun run lint
249
138
  rtk bun run typecheck
250
139
  rtk bun run build
251
140
  rtk bun run coverage
252
- rtk bun run ui:dev
253
- rtk bun run --cwd apps/ui test
254
- rtk bun run test:perf
255
141
  rtk bun start
256
- rtk bun start --interactive
257
- rtk bun start -- --help
258
- rtk bun run export:claude -- --help
259
- rtk bun run mcp
260
- ```
261
-
262
- Packed-tarball smoke test before publishing:
263
-
264
- ```bash
265
- rtk bun pm pack
266
- package_tgz="$PWD/spiracha-<version>.tgz"
267
- tmp_dir=$(mktemp -d)
268
- cd "$tmp_dir"
269
- printf '{"name":"codex-chats-smoke","private":true}\n' > package.json
270
- rtk bun add "$package_tgz"
271
- rtk bunx --package "$package_tgz" spiracha --help
272
- rtk bunx --package "$package_tgz" spiracha ui --help
273
- rtk bunx --package "$package_tgz" spiracha claude --help
274
- rtk bunx --package "$package_tgz" codex-chats --help
275
- rtk bunx --package "$package_tgz" codex-chats-claude --help
142
+ rtk bun run --cwd apps/ui test
276
143
  ```
277
144
 
278
- For the exact packaged UI launch path, run:
279
-
280
- ```bash
281
- rtk bun run smoke:package-ui
282
- ```
145
+ The UI package runs Vite through `bun --bun` because server functions import Bun-only modules such as `bun:sqlite`.
283
146
 
284
- This builds the app, packs a fresh tarball in a clean temp directory, launches `rtk bunx --package <tgz> spiracha ui --no-open`, probes the running UI for real SSR HTML, rejects Bun fallback responses, and shuts it down. The same packaged-path smoke is also covered by `src/package-ui-smoke.test.ts`.
285
-
286
- ## Project Layout
287
-
288
- - `apps/ui/`: TanStack Start browser app for Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode browsing plus export and delete flows
289
- - `src/export-chats.ts`: Codex CLI wrapper
290
- - `src/export-claude.ts`: Claude CLI wrapper
291
- - `src/export-cursor.ts`: Cursor CLI wrapper
292
- - `src/mcp-server.ts`: MCP server entrypoint
293
- - `src/lib/antigravity-*.ts`: Antigravity workspace discovery, transcript rendering, and Keychain helpers
294
- - `src/lib/codex-exporter-*.ts`: Codex exporter modules
295
- - `src/lib/codex-browser-*.ts`: shared browser/UI data, analytics, and export helpers
296
- - `src/lib/codex-thread-*.ts`: structured transcript parsing and caching helpers
297
- - `src/lib/concurrency.ts`: shared bounded-concurrency helper for large transcript and DB workloads
298
- - `src/lib/claude-code-*.ts`: Claude Code local project/session discovery, assistant phase classification, and transcript rendering helpers
299
- - `src/lib/kiro-*.ts`: Kiro workspace/session discovery, execution-trace enrichment, assistant phase classification, and transcript rendering helpers
300
- - `src/lib/claude-exporter.ts`: Claude exporter implementation
301
- - `src/lib/cursor-*.ts`: Cursor discovery, transcript rendering, recovery, and CLI helpers
302
- - `src/lib/opencode-*.ts`: OpenCode project/session discovery, MiniMax think-tag handling, assistant phase classification, and transcript rendering helpers
303
- - `src/lib/ui-export-archive.ts` and `src/lib/ui-export-files.ts`: browser download filename, MIME type, zip archive, temp file, and URL helpers
304
- - `plugins/codex-chats-export/`: local Codex plugin bundle
305
-
306
- ## Testing
307
-
308
- The test suite includes:
309
- - Codex exporter end-to-end coverage
310
- - Claude exporter end-to-end coverage
311
- - Claude Code direct-history discovery and export coverage
312
- - Kiro workspace session discovery and export coverage
313
- - source-specific assistant commentary/final-answer classification and export filtering coverage
314
- - Cursor exporter and recovery coverage
315
- - Antigravity discovery and export coverage
316
- - OpenCode discovery and export coverage
317
- - OpenCode MiniMax `<think>` extraction coverage, including literal tags in Markdown code
318
- - Codex CLI helper tests
319
- - transcript rendering helper tests
320
- - route search parsing and bounded concurrency tests
321
- - MCP stdio protocol round-trip tests
322
- - local packaging should be smoke-tested with a packed tarball before publishing
323
- - packaged source manifests are checked for UI server helper files used at runtime
324
-
325
- Coverage enforcement:
326
- - `rtk bun run coverage:root` checks the root Bun unit-test surface at a minimum of 90% line coverage.
327
- - `rtk bun run coverage:ui` checks the UI unit-test surface at a minimum of 90% line coverage.
328
- - `rtk bun run coverage` runs both checks.
329
-
330
- Run:
147
+ ## Breaking Consequences
331
148
 
332
- ```bash
333
- rtk bun test
334
- ```
149
+ - The only published `bin` entry is `spiracha`, and it only launches the local UI server.
150
+ - No `codex-chats`, `codex-chats-claude`, or legacy export command remains.
151
+ - No repo-local CLI export flow remains.
152
+ - No standalone Claude or Cursor export CLI remains.
153
+ - No MCP server or local Codex plugin remains.
154
+ - Programmatic consumers should call the stable local HTTP API or import `spiracha/client` from Bun.
package/apps/ui/AGENTS.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Purpose
4
4
 
5
- This package is the local browser UI for Spiracha. It reads Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode local data through TanStack Start server functions and shared root-package helpers.
5
+ This package is the local browser UI for Spiracha. It reads Codex, Claude Code, Kiro, Qoder, Cursor, Antigravity, and OpenCode local data through TanStack Start server functions and shared root-package helpers.
6
6
 
7
7
  ## Commands
8
8
 
@@ -17,22 +17,24 @@ rtk bun run coverage
17
17
  Important:
18
18
 
19
19
  - `dev`, `build`, and `preview` run through `bun --bun ...` on purpose. Do not switch them back to plain `vite` or Node execution, because the server functions import Bun-only modules such as `bun:sqlite`.
20
- - Keep TanStack/React runtime dependency versions aligned with the root package when both manifests list the same package. Version drift can break packaged server-function manifests in production.
20
+ - The root package mirrors UI runtime dependencies needed by the packaged `bunx spiracha` launcher. Keep `apps/ui/package.json` and the root `dependencies` aligned when browser/runtime dependencies change.
21
21
 
22
22
  ## Routing
23
23
 
24
24
  - This package uses TanStack Start with file-based routes in `src/routes/`.
25
25
  - `src/routeTree.gen.ts` is generated. Do not edit it manually.
26
26
  - If route typing behaves strangely, delete `src/routeTree.gen.ts` and rebuild with `rtk bun run build` to regenerate it cleanly.
27
+ - Stable API routes live in `src/routes/api.v1.*.ts` and should stay thin wrappers around `@spiracha/lib/conversation-api`.
27
28
  - The UI supports both `/threads/$threadId` and a root shortcut route `/$threadId` that redirects straight to the thread detail page.
28
- - Codex project inventory and project-thread search use route search params. `/projects` and `/projects/$project` use `q`.
29
+ - Codex project inventory and project-thread search use route search params. `/codex` and `/codex/$project` use `q`.
29
30
  - Codex analytics uses the `project` route search param so filtered analytics links can be bookmarked and reloaded.
30
31
  - Claude Code session detail lives at `/claude-code-sessions/$sessionId`.
31
32
  - Kiro session detail lives at `/kiro-sessions/$sessionId`.
33
+ - Qoder session detail lives at `/qoder-sessions/$sessionId`.
32
34
  - Cursor thread detail lives at `/cursor-threads/$composerId`.
33
35
  - Antigravity conversation detail lives at `/antigravity-conversations/$conversationId`.
34
36
  - OpenCode session detail lives at `/opencode-sessions/$sessionId`.
35
- - Keep the Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode list/detail pages aligned around the same table-driven index/detail pattern when adding new source integrations.
37
+ - Keep the Codex, Claude Code, Kiro, Qoder, Cursor, Antigravity, and OpenCode list/detail pages aligned around the same table-driven index/detail pattern when adding new source integrations.
36
38
 
37
39
  ## Shared Data Layer
38
40
 
@@ -49,6 +51,9 @@ The UI depends on root-package helpers via `@spiracha/*` path aliases:
49
51
  - `@spiracha/lib/kiro-db`
50
52
  - `@spiracha/lib/kiro-transcript-phase`
51
53
  - `@spiracha/lib/kiro-transcript`
54
+ - `@spiracha/lib/qoder-db`
55
+ - `@spiracha/lib/qoder-transcript-phase`
56
+ - `@spiracha/lib/qoder-transcript`
52
57
  - `@spiracha/lib/cursor-db`
53
58
  - `@spiracha/lib/cursor-recovery`
54
59
  - `@spiracha/lib/cursor-transcript`
@@ -58,6 +63,8 @@ The UI depends on root-package helpers via `@spiracha/*` path aliases:
58
63
  - `@spiracha/lib/opencode-transcript-phase`
59
64
  - `@spiracha/lib/opencode-think-tags`
60
65
  - `@spiracha/lib/opencode-transcript`
66
+ - `@spiracha/lib/conversation-api`
67
+ - `@spiracha/lib/conversation-data`
61
68
 
62
69
  Keep server-only imports inside server functions or route loaders. Do not import Bun-only modules into purely client-side components.
63
70
  The `*-transcript-phase` helpers are intentionally browser-safe and may be imported by client adapters.
@@ -66,15 +73,18 @@ The `*-transcript-phase` helpers are intentionally browser-safe and may be impor
66
73
 
67
74
  Use the existing layers consistently:
68
75
 
69
- - TanStack Start server functions in `src/lib/codex-server.ts`, `src/lib/claude-code-server.ts`, `src/lib/kiro-server.ts`, `src/lib/cursor-server.ts`, `src/lib/antigravity-server.ts`, and `src/lib/opencode-server.ts`
76
+ - TanStack Start server functions in `src/lib/codex-server.ts`, `src/lib/claude-code-server.ts`, `src/lib/kiro-server.ts`, `src/lib/qoder-server.ts`, `src/lib/cursor-server.ts`, `src/lib/antigravity-server.ts`, and `src/lib/opencode-server.ts`
70
77
  - Use for any browser-triggered read/write that needs Bun-only modules, DB access, filesystem access, Keychain access, or shared root-package helpers.
71
78
  - Use `.validator(...)` for input validation. Do not add new `.inputValidator(...)` calls.
72
- - TanStack Query query options in `src/lib/codex-queries.ts`, `src/lib/claude-code-queries.ts`, `src/lib/kiro-queries.ts`, `src/lib/cursor-queries.ts`, `src/lib/antigravity-queries.ts`, and `src/lib/opencode-queries.ts`
79
+ - TanStack Query query options in `src/lib/codex-queries.ts`, `src/lib/claude-code-queries.ts`, `src/lib/kiro-queries.ts`, `src/lib/qoder-queries.ts`, `src/lib/cursor-queries.ts`, `src/lib/antigravity-queries.ts`, and `src/lib/opencode-queries.ts`
73
80
  - Use for client-side fetching, caching, retries, and invalidation of server-function results.
74
81
  - Shared root-package helpers under `@spiracha/lib/*`
75
- - Extend these when the behavior should stay shared between the UI, CLI, and packaged launcher.
82
+ - Extend these when the behavior should stay shared between the UI and the stable data API.
76
83
  - Use the shared source-specific phase helpers for assistant commentary/final-answer rules instead of duplicating that logic in UI adapters.
77
84
  - Keep OpenCode think-tag handling in `@spiracha/lib/opencode-think-tags` so UI display and exports strip MiniMax reasoning tags consistently.
85
+ - Stable API route handlers in `src/routes/api.v1.*.ts`
86
+ - Use route-level `server.handlers`.
87
+ - Delegate to `@spiracha/lib/conversation-api` instead of duplicating parsing or response-envelope logic.
78
88
  - `src/lib/source-session-export-server.ts`
79
89
  - Use for single-session source exports that may return either inline content or a temporary zip download URL.
80
90
  - `settings-store.tsx`
package/apps/ui/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Spiracha UI
2
2
 
3
- The browser UI for browsing local Codex, Claude Code, Kiro, Cursor, Antigravity, and OpenCode history, inspecting transcript details, exporting chats, and analyzing Codex usage patterns.
3
+ The browser UI for browsing local Codex, Claude Code, Kiro, Qoder, Cursor, Antigravity, and OpenCode history, inspecting transcript details, exporting chats, and analyzing Codex usage patterns.
4
4
 
5
5
  ## Stack
6
6
 
@@ -18,11 +18,13 @@ The browser UI for browsing local Codex, Claude Code, Kiro, Cursor, Antigravity,
18
18
  - lists derived Codex projects from the Codex SQLite database
19
19
  - lists Codex threads within a project in chronological order
20
20
  - shows Codex thread timelines, tool calls, metadata, and raw event context
21
- - exports Codex, Claude Code, Kiro, Cursor, and OpenCode sessions or threads as Markdown, plain text, or optional zip archives with optional metadata, commentary, and tool-call inclusion
21
+ - exports Codex, Claude Code, Kiro, Qoder, Cursor, and OpenCode sessions or threads as Markdown, plain text, or optional zip archives with optional metadata, commentary, and tool-call inclusion
22
22
  - lists Claude Code workspaces and sessions from local `~/.claude/projects` JSONL files
23
23
  - shows dedicated Claude Code session detail pages with reasoning, tool calls, token metadata, and export actions
24
24
  - lists Kiro workspaces and sessions from local Kiro workspace session files
25
25
  - shows dedicated Kiro session detail pages with image attachments, prompt logs, execution-derived tool calls, metadata, and export actions
26
+ - lists Qoder workspaces and sessions from local Qoder history and checkpoint storage
27
+ - shows dedicated Qoder session detail pages with prompts, checkpoint file operations, metadata, and export actions
26
28
  - lists Cursor workspaces and workspace threads with the same table-based index/detail flow as Codex
27
29
  - shows dedicated Cursor thread detail pages with breadcrumbs back to the workspace and source
28
30
  - recovers split Cursor storage buckets, exports Cursor threads, and deletes Cursor workspaces or threads
@@ -33,7 +35,7 @@ The browser UI for browsing local Codex, Claude Code, Kiro, Cursor, Antigravity,
33
35
  - shows dedicated OpenCode session detail pages with reasoning, tool parts, MiniMax `<think>` blocks, token metadata, and export actions
34
36
  - shows dashboard and analytics summaries, including Codex token totals and tool-call frequency
35
37
  - keeps Codex inventory search and analytics project filters in URL search params for reloadable and shareable views
36
- - keeps source-specific commentary hidden by default while preserving final answers, with matching export filtering for Claude Code, Kiro, and OpenCode
38
+ - keeps source-specific commentary hidden by default while preserving final answers, with matching export filtering for Claude Code, Kiro, Qoder, and OpenCode
37
39
 
38
40
  ## Commands
39
41
 
@@ -71,11 +73,26 @@ Runtime configuration is intentionally small:
71
73
  - `SPIRACHA_KIRO_WORKSPACE_SESSIONS_DIR`
72
74
  - Optional absolute path to the Kiro workspace sessions directory.
73
75
  - If unset, Spiracha reads `${SPIRACHA_KIRO_DATA_DIR:-~/Library/Application Support/Kiro/User/globalStorage/kiro.kiroagent}/workspace-sessions`. `SPIRACHA_KIRO_AGENT_DIR` and `SPIRACHA_KIRO_DIR` are also accepted aliases for the Kiro data directory.
76
+ - `SPIRACHA_QODER_GLOBAL_STATE_DB`
77
+ - Optional absolute path to Qoder's global `state.vscdb`.
78
+ - If unset, Spiracha reads `${SPIRACHA_QODER_USER_DIR:-~/Library/Application Support/Qoder/User}/globalStorage/state.vscdb`. `SPIRACHA_QODER_DATA_DIR` and `SPIRACHA_QODER_DIR` are also accepted aliases for the Qoder user directory.
79
+ - `SPIRACHA_QODER_WORKSPACE_STORAGE_DIR`
80
+ - Optional absolute path to Qoder's `workspaceStorage` directory.
81
+ - If unset, Spiracha reads `${SPIRACHA_QODER_USER_DIR:-~/Library/Application Support/Qoder/User}/workspaceStorage`.
74
82
  - `SPIRACHA_OPENCODE_DB`
75
83
  - Optional absolute path to the OpenCode SQLite database.
76
84
  - If unset, Spiracha reads `${SPIRACHA_OPENCODE_DATA_DIR:-${XDG_DATA_HOME:-~/.local/share}/opencode}/opencode.db`. `SPIRACHA_OPENCODE_DIR` is also accepted as an OpenCode data-directory alias.
77
-
78
- Export artifacts are served through the UI as attachment downloads from `/__exports/*`. The packaged `spiracha ui` launcher and the local dev server both use the same export-directory contract.
85
+ - `SPIRACHA_CURSOR_USER_DIR`
86
+ - Optional absolute path to Cursor's `User` directory.
87
+ - If unset, Spiracha reads the platform default Cursor user-data directory.
88
+ - `SPIRACHA_CURSOR_PROJECTS_DIR`
89
+ - Optional absolute path to Cursor's project transcript directory.
90
+ - If unset, Spiracha infers `.cursor/projects` from the Cursor user directory when possible.
91
+ - `SPIRACHA_ANTIGRAVITY_DIRS`
92
+ - Optional path-list of Antigravity roots.
93
+ - If unset, Spiracha reads `~/.gemini/antigravity-ide` and `~/.gemini/antigravity`. `SPIRACHA_ANTIGRAVITY_DIR` is accepted as a single-root alias.
94
+
95
+ Export artifacts are served through the UI as attachment downloads from `/__exports/*`. The local dev and preview servers use the same export-directory contract.
79
96
 
80
97
  Default source locations:
81
98
 
@@ -84,20 +101,23 @@ Default source locations:
84
101
  | Codex | shared Codex DB probe list | `SPIRACHA_CODEX_DB` |
85
102
  | Claude Code | `~/.claude/projects` | `SPIRACHA_CLAUDE_CODE_PROJECTS_DIR` |
86
103
  | Kiro | `~/Library/Application Support/Kiro/User/globalStorage/kiro.kiroagent/workspace-sessions` | `SPIRACHA_KIRO_WORKSPACE_SESSIONS_DIR` |
104
+ | Qoder | `~/Library/Application Support/Qoder/User/globalStorage/state.vscdb` + `~/Library/Application Support/Qoder/User/workspaceStorage` | `SPIRACHA_QODER_GLOBAL_STATE_DB`, `SPIRACHA_QODER_WORKSPACE_STORAGE_DIR` |
105
+ | Cursor | `~/Library/Application Support/Cursor/User` on macOS | `SPIRACHA_CURSOR_USER_DIR`, `SPIRACHA_CURSOR_PROJECTS_DIR` |
106
+ | Antigravity | `~/.gemini/antigravity-ide` + `~/.gemini/antigravity` | `SPIRACHA_ANTIGRAVITY_DIRS`, `SPIRACHA_ANTIGRAVITY_DIR` |
87
107
  | OpenCode | `${XDG_DATA_HOME:-~/.local/share}/opencode/opencode.db` | `SPIRACHA_OPENCODE_DB` |
88
108
  | Export downloads | OS temp directory under `spiracha-ui-exports` | `SPIRACHA_UI_EXPORT_DIR` |
89
109
 
90
110
  Codex analytics cache keys are based on Codex DB row metadata instead of statting every rollout file before cache hits. That keeps large histories responsive. The tradeoff is that manual JSONL edits outside Codex do not invalidate analytics unless DB row metadata changes or the temporary UI cache is cleared.
91
111
 
92
- Transcript detail pages expose the same display controls across sources: user messages, commentary, tool calls, extra events, and raw JSON. Claude Code assistant lead-ins are classified from `stop_reason`, Kiro assistant phases are classified per user turn from session and execution files, and OpenCode assistant phases are classified per assistant run after stripping MiniMax `<think>` blocks into commentary. OpenCode think-tag extraction preserves literal `<think>` examples inside Markdown code spans and fenced code blocks.
112
+ Transcript detail pages expose the same display controls across sources: user messages, commentary, tool calls, extra events, and raw JSON. Claude Code assistant lead-ins are classified from `stop_reason`, Kiro assistant phases are classified per user turn from session and execution files, Qoder shows local prompt history plus checkpoint file operations, and OpenCode assistant phases are classified per assistant run after stripping MiniMax `<think>` blocks into commentary. OpenCode think-tag extraction preserves literal `<think>` examples inside Markdown code spans and fenced code blocks.
93
113
 
94
114
  ## Routes
95
115
 
96
116
  - `/`
97
117
  - dashboard
98
- - `/projects`
118
+ - `/codex`
99
119
  - Codex inventory and search, with `q` as the route search param
100
- - `/projects/$project`
120
+ - `/codex/$project`
101
121
  - Codex project thread listing, with `q` as the route search param
102
122
  - `/claude-code`
103
123
  - Claude Code workspace inventory and search
@@ -111,6 +131,12 @@ Transcript detail pages expose the same display controls across sources: user me
111
131
  - Kiro workspace session listing
112
132
  - `/kiro-sessions/$sessionId`
113
133
  - Kiro session detail and export
134
+ - `/qoder`
135
+ - Qoder workspace inventory and search
136
+ - `/qoder/$workspaceKey`
137
+ - Qoder workspace session listing
138
+ - `/qoder-sessions/$sessionId`
139
+ - Qoder session detail and export
114
140
  - `/cursor`
115
141
  - Cursor workspace inventory and search
116
142
  - `/cursor/$workspaceKey`
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "aliases": {
4
+ "components": "#/components",
5
+ "hooks": "#/hooks",
6
+ "lib": "#/lib",
7
+ "ui": "#/components/ui",
8
+ "utils": "#/lib/utils"
9
+ },
10
+ "iconLibrary": "lucide",
11
+ "rsc": false,
12
+ "style": "new-york",
13
+ "tailwind": {
14
+ "baseColor": "zinc",
15
+ "config": "",
16
+ "css": "src/styles.css",
17
+ "cssVariables": true,
18
+ "prefix": ""
19
+ },
20
+ "tsx": true
21
+ }