@rulemetric/cli 0.2.1 → 0.2.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 (780) hide show
  1. package/dist/base-command.js +13 -52
  2. package/dist/base-command.js.map +7 -1
  3. package/dist/chunk-2AM54TUK.js +59 -0
  4. package/dist/chunk-2AM54TUK.js.map +7 -0
  5. package/dist/chunk-3TIMQ3O6.js +96 -0
  6. package/dist/chunk-3TIMQ3O6.js.map +7 -0
  7. package/dist/chunk-4BHDHHKL.js +48 -0
  8. package/dist/chunk-4BHDHHKL.js.map +7 -0
  9. package/dist/chunk-4D537GXE.js +99 -0
  10. package/dist/chunk-4D537GXE.js.map +7 -0
  11. package/dist/chunk-4SCZK7AL.js +129 -0
  12. package/dist/chunk-4SCZK7AL.js.map +7 -0
  13. package/dist/chunk-4WFE4PFP.js +61 -0
  14. package/dist/chunk-4WFE4PFP.js.map +7 -0
  15. package/dist/chunk-52WIYRZH.js +73 -0
  16. package/dist/chunk-52WIYRZH.js.map +7 -0
  17. package/dist/chunk-7FAA3YNB.js +1549 -0
  18. package/dist/chunk-7FAA3YNB.js.map +7 -0
  19. package/dist/chunk-7NYKWN7U.js +12 -0
  20. package/dist/chunk-7NYKWN7U.js.map +7 -0
  21. package/dist/chunk-AULP2OWH.js +99 -0
  22. package/dist/chunk-AULP2OWH.js.map +7 -0
  23. package/dist/chunk-B5KNTGMJ.js +1788 -0
  24. package/dist/chunk-B5KNTGMJ.js.map +7 -0
  25. package/dist/chunk-BD7CY42U.js +23 -0
  26. package/dist/chunk-BD7CY42U.js.map +7 -0
  27. package/dist/chunk-BO76WKJR.js +42 -0
  28. package/dist/chunk-BO76WKJR.js.map +7 -0
  29. package/dist/chunk-BRD5RUGM.js +53 -0
  30. package/dist/chunk-BRD5RUGM.js.map +7 -0
  31. package/dist/chunk-BT6Z6545.js +43 -0
  32. package/dist/chunk-BT6Z6545.js.map +7 -0
  33. package/dist/chunk-BZDKEQKU.js +39 -0
  34. package/dist/chunk-BZDKEQKU.js.map +7 -0
  35. package/dist/chunk-CROYS75W.js +161 -0
  36. package/dist/chunk-CROYS75W.js.map +7 -0
  37. package/dist/chunk-DGHWRQXL.js +17 -0
  38. package/dist/chunk-DGHWRQXL.js.map +7 -0
  39. package/dist/chunk-DQ3KELXD.js +74 -0
  40. package/dist/chunk-DQ3KELXD.js.map +7 -0
  41. package/dist/chunk-DTFXCHHI.js +108 -0
  42. package/dist/chunk-DTFXCHHI.js.map +7 -0
  43. package/dist/chunk-DU73QUS3.js +75 -0
  44. package/dist/chunk-DU73QUS3.js.map +7 -0
  45. package/dist/chunk-EHZJ6OXD.js +307 -0
  46. package/dist/chunk-EHZJ6OXD.js.map +7 -0
  47. package/dist/chunk-EJOI2ZGU.js +109 -0
  48. package/dist/chunk-EJOI2ZGU.js.map +7 -0
  49. package/dist/chunk-EKJ2CABV.js +76 -0
  50. package/dist/chunk-EKJ2CABV.js.map +7 -0
  51. package/dist/chunk-EKP32DLN.js +16 -0
  52. package/dist/chunk-EKP32DLN.js.map +7 -0
  53. package/dist/chunk-EOOP6WTC.js +148 -0
  54. package/dist/chunk-EOOP6WTC.js.map +7 -0
  55. package/dist/chunk-ERPMDAO3.js +20 -0
  56. package/dist/chunk-ERPMDAO3.js.map +7 -0
  57. package/dist/chunk-FTJRMUID.js +96 -0
  58. package/dist/chunk-FTJRMUID.js.map +7 -0
  59. package/dist/chunk-FZKLLNDS.js +228 -0
  60. package/dist/chunk-FZKLLNDS.js.map +7 -0
  61. package/dist/chunk-GQCISMAH.js +157 -0
  62. package/dist/chunk-GQCISMAH.js.map +7 -0
  63. package/dist/chunk-IGXX624H.js +55 -0
  64. package/dist/chunk-IGXX624H.js.map +7 -0
  65. package/dist/chunk-IJGF2ETG.js +68 -0
  66. package/dist/chunk-IJGF2ETG.js.map +7 -0
  67. package/dist/chunk-IWYCRLEK.js +220 -0
  68. package/dist/chunk-IWYCRLEK.js.map +7 -0
  69. package/dist/chunk-J7N3DLH6.js +117 -0
  70. package/dist/chunk-J7N3DLH6.js.map +7 -0
  71. package/dist/chunk-JX5UI6RW.js +99 -0
  72. package/dist/chunk-JX5UI6RW.js.map +7 -0
  73. package/dist/chunk-K3BFZ7KG.js +154 -0
  74. package/dist/chunk-K3BFZ7KG.js.map +7 -0
  75. package/dist/chunk-KHJUQFIK.js +51 -0
  76. package/dist/chunk-KHJUQFIK.js.map +7 -0
  77. package/dist/chunk-KRBQLMOP.js +41 -0
  78. package/dist/chunk-KRBQLMOP.js.map +7 -0
  79. package/dist/chunk-KZRFUXGF.js +145 -0
  80. package/dist/chunk-KZRFUXGF.js.map +7 -0
  81. package/dist/chunk-L674RNKQ.js +492 -0
  82. package/dist/chunk-L674RNKQ.js.map +7 -0
  83. package/dist/chunk-N52AHNBH.js +47 -0
  84. package/dist/chunk-N52AHNBH.js.map +7 -0
  85. package/dist/chunk-NIDLJO6F.js +228 -0
  86. package/dist/chunk-NIDLJO6F.js.map +7 -0
  87. package/dist/chunk-NSBPE2FW.js +17 -0
  88. package/dist/chunk-NSBPE2FW.js.map +7 -0
  89. package/dist/chunk-OGVORIFM.js +70 -0
  90. package/dist/chunk-OGVORIFM.js.map +7 -0
  91. package/dist/chunk-OQSQC7VB.js +77 -0
  92. package/dist/chunk-OQSQC7VB.js.map +7 -0
  93. package/dist/chunk-PHLMIZKM.js +153 -0
  94. package/dist/chunk-PHLMIZKM.js.map +7 -0
  95. package/dist/chunk-PQU7GZ7A.js +92 -0
  96. package/dist/chunk-PQU7GZ7A.js.map +7 -0
  97. package/dist/chunk-PXVQLD7S.js +196 -0
  98. package/dist/chunk-PXVQLD7S.js.map +7 -0
  99. package/dist/chunk-QD6X4L4L.js +79 -0
  100. package/dist/chunk-QD6X4L4L.js.map +7 -0
  101. package/dist/chunk-QJQS6TUN.js +44 -0
  102. package/dist/chunk-QJQS6TUN.js.map +7 -0
  103. package/dist/chunk-QJXAULRC.js +191 -0
  104. package/dist/chunk-QJXAULRC.js.map +7 -0
  105. package/dist/chunk-QN34TGD3.js +83 -0
  106. package/dist/chunk-QN34TGD3.js.map +7 -0
  107. package/dist/chunk-R5MFHGHR.js +122 -0
  108. package/dist/chunk-R5MFHGHR.js.map +7 -0
  109. package/dist/chunk-RH7NHVSK.js +16 -0
  110. package/dist/chunk-RH7NHVSK.js.map +7 -0
  111. package/dist/chunk-RJ7BHDLM.js +121 -0
  112. package/dist/chunk-RJ7BHDLM.js.map +7 -0
  113. package/dist/chunk-RQ2TMLKG.js +142 -0
  114. package/dist/chunk-RQ2TMLKG.js.map +7 -0
  115. package/dist/chunk-S56LOTGQ.js +63 -0
  116. package/dist/chunk-S56LOTGQ.js.map +7 -0
  117. package/dist/chunk-UF73WX2J.js +49 -0
  118. package/dist/chunk-UF73WX2J.js.map +7 -0
  119. package/dist/chunk-W53GKIZQ.js +50 -0
  120. package/dist/chunk-W53GKIZQ.js.map +7 -0
  121. package/dist/chunk-WA4MWYRW.js +254 -0
  122. package/dist/chunk-WA4MWYRW.js.map +7 -0
  123. package/dist/chunk-WFULKPEQ.js +269 -0
  124. package/dist/chunk-WFULKPEQ.js.map +7 -0
  125. package/dist/chunk-XC6M4CSW.js +44 -0
  126. package/dist/chunk-XC6M4CSW.js.map +7 -0
  127. package/dist/chunk-XPUEGHXN.js +243 -0
  128. package/dist/chunk-XPUEGHXN.js.map +7 -0
  129. package/dist/chunk-XZXS2W24.js +148 -0
  130. package/dist/chunk-XZXS2W24.js.map +7 -0
  131. package/dist/chunk-YBNW7ARH.js +167 -0
  132. package/dist/chunk-YBNW7ARH.js.map +7 -0
  133. package/dist/chunk-YNIH3KMU.js +121 -0
  134. package/dist/chunk-YNIH3KMU.js.map +7 -0
  135. package/dist/commands/antigravity/backfill.js +135 -0
  136. package/dist/commands/antigravity/backfill.js.map +7 -0
  137. package/dist/commands/auth/create-key.js +48 -33
  138. package/dist/commands/auth/create-key.js.map +7 -1
  139. package/dist/commands/auth/login.js +58 -46
  140. package/dist/commands/auth/login.js.map +7 -1
  141. package/dist/commands/auth/logout.js +28 -13
  142. package/dist/commands/auth/logout.js.map +7 -1
  143. package/dist/commands/auth/revoke-key.js +32 -18
  144. package/dist/commands/auth/revoke-key.js.map +7 -1
  145. package/dist/commands/auth/status.js +40 -22
  146. package/dist/commands/auth/status.js.map +7 -1
  147. package/dist/commands/catalog/index.js +50 -34
  148. package/dist/commands/catalog/index.js.map +7 -1
  149. package/dist/commands/catalog/recommend.js +41 -26
  150. package/dist/commands/catalog/recommend.js.map +7 -1
  151. package/dist/commands/convert.js +72 -54
  152. package/dist/commands/convert.js.map +7 -1
  153. package/dist/commands/converters.js +52 -38
  154. package/dist/commands/converters.js.map +7 -1
  155. package/dist/commands/crons/list.js +50 -24
  156. package/dist/commands/crons/list.js.map +7 -1
  157. package/dist/commands/crons/run.js +72 -47
  158. package/dist/commands/crons/run.js.map +7 -1
  159. package/dist/commands/dashboard.js +45 -24
  160. package/dist/commands/dashboard.js.map +7 -1
  161. package/dist/commands/eval-targets/create.js +51 -39
  162. package/dist/commands/eval-targets/create.js.map +7 -1
  163. package/dist/commands/eval-targets/list.js +52 -35
  164. package/dist/commands/eval-targets/list.js.map +7 -1
  165. package/dist/commands/evals/agent.js +292 -0
  166. package/dist/commands/evals/agent.js.map +7 -0
  167. package/dist/commands/evals/benchmark.js +70 -51
  168. package/dist/commands/evals/benchmark.js.map +7 -1
  169. package/dist/commands/evals/compare.js +90 -78
  170. package/dist/commands/evals/compare.js.map +7 -1
  171. package/dist/commands/evals/create.js +64 -50
  172. package/dist/commands/evals/create.js.map +7 -1
  173. package/dist/commands/evals/optimize-description.js +225 -222
  174. package/dist/commands/evals/optimize-description.js.map +7 -1
  175. package/dist/commands/evals/optimize.js +206 -196
  176. package/dist/commands/evals/optimize.js.map +7 -1
  177. package/dist/commands/evals/run.js +178 -164
  178. package/dist/commands/evals/run.js.map +7 -1
  179. package/dist/commands/gateway/ensure.js +33 -19
  180. package/dist/commands/gateway/ensure.js.map +7 -1
  181. package/dist/commands/hooks/install.js +335 -275
  182. package/dist/commands/hooks/install.js.map +7 -1
  183. package/dist/commands/hooks/run.js +72 -53
  184. package/dist/commands/hooks/run.js.map +7 -1
  185. package/dist/commands/hooks/uninstall.js +117 -94
  186. package/dist/commands/hooks/uninstall.js.map +7 -1
  187. package/dist/commands/import.js +63 -53
  188. package/dist/commands/import.js.map +7 -1
  189. package/dist/commands/instructions/create.js +71 -58
  190. package/dist/commands/instructions/create.js.map +7 -1
  191. package/dist/commands/instructions/delete.js +53 -36
  192. package/dist/commands/instructions/delete.js.map +7 -1
  193. package/dist/commands/instructions/fork.js +33 -19
  194. package/dist/commands/instructions/fork.js.map +7 -1
  195. package/dist/commands/instructions/get.js +66 -49
  196. package/dist/commands/instructions/get.js.map +7 -1
  197. package/dist/commands/instructions/list.js +63 -46
  198. package/dist/commands/instructions/list.js.map +7 -1
  199. package/dist/commands/instructions/promote.js +41 -27
  200. package/dist/commands/instructions/promote.js.map +7 -1
  201. package/dist/commands/instructions/pull.js +37 -21
  202. package/dist/commands/instructions/pull.js.map +7 -1
  203. package/dist/commands/instructions/upstream.js +36 -21
  204. package/dist/commands/instructions/upstream.js.map +7 -1
  205. package/dist/commands/instructions/versions.js +51 -33
  206. package/dist/commands/instructions/versions.js.map +7 -1
  207. package/dist/commands/launcher.js +39 -0
  208. package/dist/commands/launcher.js.map +7 -0
  209. package/dist/commands/org/current.js +74 -68
  210. package/dist/commands/org/current.js.map +7 -1
  211. package/dist/commands/org/list.js +50 -36
  212. package/dist/commands/org/list.js.map +7 -1
  213. package/dist/commands/org/switch.js +69 -51
  214. package/dist/commands/org/switch.js.map +7 -1
  215. package/dist/commands/packs/add-instruction.js +36 -22
  216. package/dist/commands/packs/add-instruction.js.map +7 -1
  217. package/dist/commands/packs/apply.js +38 -24
  218. package/dist/commands/packs/apply.js.map +7 -1
  219. package/dist/commands/packs/create.js +47 -33
  220. package/dist/commands/packs/create.js.map +7 -1
  221. package/dist/commands/packs/fork.js +33 -19
  222. package/dist/commands/packs/fork.js.map +7 -1
  223. package/dist/commands/packs/get.js +54 -35
  224. package/dist/commands/packs/get.js.map +7 -1
  225. package/dist/commands/packs/list.js +64 -47
  226. package/dist/commands/packs/list.js.map +7 -1
  227. package/dist/commands/packs/remove-instruction.js +34 -20
  228. package/dist/commands/packs/remove-instruction.js.map +7 -1
  229. package/dist/commands/proxy/env.js +126 -116
  230. package/dist/commands/proxy/env.js.map +7 -1
  231. package/dist/commands/proxy/logs.js +83 -74
  232. package/dist/commands/proxy/logs.js.map +7 -1
  233. package/dist/commands/proxy/restart.js +34 -36
  234. package/dist/commands/proxy/restart.js.map +7 -1
  235. package/dist/commands/proxy/setup.js +432 -375
  236. package/dist/commands/proxy/setup.js.map +7 -1
  237. package/dist/commands/proxy/start.js +289 -289
  238. package/dist/commands/proxy/start.js.map +7 -1
  239. package/dist/commands/proxy/status.js +74 -64
  240. package/dist/commands/proxy/status.js.map +7 -1
  241. package/dist/commands/proxy/stop.js +81 -75
  242. package/dist/commands/proxy/stop.js.map +7 -1
  243. package/dist/commands/research/backfill.js +58 -0
  244. package/dist/commands/research/backfill.js.map +7 -0
  245. package/dist/commands/research/tail-transcript.js +69 -0
  246. package/dist/commands/research/tail-transcript.js.map +7 -0
  247. package/dist/commands/service/install.js +639 -405
  248. package/dist/commands/service/install.js.map +7 -1
  249. package/dist/commands/service/status.js +178 -111
  250. package/dist/commands/service/status.js.map +7 -1
  251. package/dist/commands/service/uninstall.js +85 -110
  252. package/dist/commands/service/uninstall.js.map +7 -1
  253. package/dist/commands/sessions/analyze.js +46 -25
  254. package/dist/commands/sessions/analyze.js.map +7 -1
  255. package/dist/commands/sessions/end.js +81 -79
  256. package/dist/commands/sessions/end.js.map +7 -1
  257. package/dist/commands/sessions/import.js +44 -27
  258. package/dist/commands/sessions/import.js.map +7 -1
  259. package/dist/commands/sessions/list.js +46 -33
  260. package/dist/commands/sessions/list.js.map +7 -1
  261. package/dist/commands/sessions/start.js +88 -87
  262. package/dist/commands/sessions/start.js.map +7 -1
  263. package/dist/commands/signals/report.js +42 -34
  264. package/dist/commands/signals/report.js.map +7 -1
  265. package/dist/commands/skills/export-approved.js +44 -30
  266. package/dist/commands/skills/export-approved.js.map +7 -1
  267. package/dist/commands/skills/install.js +99 -84
  268. package/dist/commands/skills/install.js.map +7 -1
  269. package/dist/commands/skills/list.js +59 -42
  270. package/dist/commands/skills/list.js.map +7 -1
  271. package/dist/commands/skills/publish.js +95 -78
  272. package/dist/commands/skills/publish.js.map +7 -1
  273. package/dist/commands/skills/search.js +68 -53
  274. package/dist/commands/skills/search.js.map +7 -1
  275. package/dist/commands/skills/update.js +52 -39
  276. package/dist/commands/skills/update.js.map +7 -1
  277. package/dist/commands/suggestions/accept.js +82 -59
  278. package/dist/commands/suggestions/accept.js.map +7 -1
  279. package/dist/commands/suggestions/dismiss.js +44 -26
  280. package/dist/commands/suggestions/dismiss.js.map +7 -1
  281. package/dist/commands/suggestions/list.js +59 -39
  282. package/dist/commands/suggestions/list.js.map +7 -1
  283. package/dist/commands/suggestions/refresh.js +26 -11
  284. package/dist/commands/suggestions/refresh.js.map +7 -1
  285. package/dist/cursor-BGQJ4CWI.js +134 -0
  286. package/dist/cursor-BGQJ4CWI.js.map +7 -0
  287. package/dist/dashboard/Dashboard.js +229 -126
  288. package/dist/dashboard/Dashboard.js.map +7 -1
  289. package/dist/dashboard/data.js +13 -137
  290. package/dist/dashboard/data.js.map +7 -1
  291. package/dist/dashboard/launcher/ActiveJobsList.js +10 -0
  292. package/dist/dashboard/launcher/ActiveJobsList.js.map +7 -0
  293. package/dist/dashboard/launcher/LauncherOverlay.js +14 -0
  294. package/dist/dashboard/launcher/LauncherOverlay.js.map +7 -0
  295. package/dist/dashboard/launcher/NewLaunchForm.js +10 -0
  296. package/dist/dashboard/launcher/NewLaunchForm.js.map +7 -0
  297. package/dist/dashboard/launcher/api.js +14 -0
  298. package/dist/dashboard/launcher/api.js.map +7 -0
  299. package/dist/dashboard/launcher/tool-labels.js +10 -0
  300. package/dist/dashboard/launcher/tool-labels.js.map +7 -0
  301. package/dist/dashboard/launcher/types.js +1 -0
  302. package/dist/dashboard/launcher/types.js.map +7 -0
  303. package/dist/dashboard/launcher/useLaunchJobs.js +9 -0
  304. package/dist/dashboard/launcher/useLaunchJobs.js.map +7 -0
  305. package/dist/dashboard/panels/friction.js +10 -22
  306. package/dist/dashboard/panels/friction.js.map +7 -1
  307. package/dist/dashboard/panels/insights.js +10 -109
  308. package/dist/dashboard/panels/insights.js.map +7 -1
  309. package/dist/dashboard/panels/instructions.js +10 -17
  310. package/dist/dashboard/panels/instructions.js.map +7 -1
  311. package/dist/dashboard/panels/outcomes.js +9 -28
  312. package/dist/dashboard/panels/outcomes.js.map +7 -1
  313. package/dist/dashboard/panels/overview.js +10 -20
  314. package/dist/dashboard/panels/overview.js.map +7 -1
  315. package/dist/dashboard/panels/shared.js +18 -61
  316. package/dist/dashboard/panels/shared.js.map +7 -1
  317. package/dist/dashboard/types.js +23 -26
  318. package/dist/dashboard/types.js.map +7 -1
  319. package/dist/dist-CSUYFYKI.js +52 -0
  320. package/dist/dist-CSUYFYKI.js.map +7 -0
  321. package/dist/index.js +8 -2
  322. package/dist/index.js.map +7 -1
  323. package/dist/lib/active-org-refresh.js +15 -108
  324. package/dist/lib/active-org-refresh.js.map +7 -1
  325. package/dist/lib/active-org.js +15 -95
  326. package/dist/lib/active-org.js.map +7 -1
  327. package/dist/lib/agent-loop.js +44 -0
  328. package/dist/lib/agent-loop.js.map +7 -0
  329. package/dist/lib/antigravity-transcript.js +22 -0
  330. package/dist/lib/antigravity-transcript.js.map +7 -0
  331. package/dist/lib/api-client.js +21 -92
  332. package/dist/lib/api-client.js.map +7 -1
  333. package/dist/lib/auth.js +26 -137
  334. package/dist/lib/auth.js.map +7 -1
  335. package/dist/lib/detect-languages.js +8 -113
  336. package/dist/lib/detect-languages.js.map +7 -1
  337. package/dist/lib/detect-tmux.js +9 -0
  338. package/dist/lib/detect-tmux.js.map +7 -0
  339. package/dist/lib/eval-analyzer.js +9 -89
  340. package/dist/lib/eval-analyzer.js.map +7 -1
  341. package/dist/lib/eval-benchmark.js +12 -92
  342. package/dist/lib/eval-benchmark.js.map +7 -1
  343. package/dist/lib/eval-conversation-handler.js +13 -200
  344. package/dist/lib/eval-conversation-handler.js.map +7 -1
  345. package/dist/lib/eval-executor.js +8 -83
  346. package/dist/lib/eval-executor.js.map +7 -1
  347. package/dist/lib/eval-grader.js +9 -123
  348. package/dist/lib/eval-grader.js.map +7 -1
  349. package/dist/lib/eval-meta-judge.js +9 -116
  350. package/dist/lib/eval-meta-judge.js.map +7 -1
  351. package/dist/lib/eval-trigger-tester.js +11 -96
  352. package/dist/lib/eval-trigger-tester.js.map +7 -1
  353. package/dist/lib/eval-worktree.js +8 -87
  354. package/dist/lib/eval-worktree.js.map +7 -1
  355. package/dist/lib/gateway-entry.js +20 -18
  356. package/dist/lib/gateway-entry.js.map +7 -1
  357. package/dist/lib/gateway-lifecycle.js +22 -97
  358. package/dist/lib/gateway-lifecycle.js.map +7 -1
  359. package/dist/lib/gateway.js +12 -216
  360. package/dist/lib/gateway.js.map +7 -1
  361. package/dist/lib/handlers/cron-close-stale-sessions.js +18 -7
  362. package/dist/lib/handlers/cron-close-stale-sessions.js.map +7 -1
  363. package/dist/lib/handlers/cron-data-integrity-audit.js +21 -15
  364. package/dist/lib/handlers/cron-data-integrity-audit.js.map +7 -1
  365. package/dist/lib/handlers/cron-refresh-skills.js +7 -90
  366. package/dist/lib/handlers/cron-refresh-skills.js.map +7 -1
  367. package/dist/lib/handlers/cron-suggest-instructions.js +14 -158
  368. package/dist/lib/handlers/cron-suggest-instructions.js.map +7 -1
  369. package/dist/lib/handlers/process-announcement.js +11 -0
  370. package/dist/lib/handlers/process-announcement.js.map +7 -0
  371. package/dist/lib/handlers/process-changelog.js +11 -0
  372. package/dist/lib/handlers/process-changelog.js.map +7 -0
  373. package/dist/lib/handlers/process-conversation.js +14 -35
  374. package/dist/lib/handlers/process-conversation.js.map +7 -1
  375. package/dist/lib/handlers/process-eval.js +15 -207
  376. package/dist/lib/handlers/process-eval.js.map +7 -1
  377. package/dist/lib/handlers/process-insights.js +14 -300
  378. package/dist/lib/handlers/process-insights.js.map +7 -1
  379. package/dist/lib/handlers/process-launch.js +16 -41
  380. package/dist/lib/handlers/process-launch.js.map +7 -1
  381. package/dist/lib/handlers/process-run-cleanup.js +13 -0
  382. package/dist/lib/handlers/process-run-cleanup.js.map +7 -0
  383. package/dist/lib/handlers/process-send-message.js +10 -0
  384. package/dist/lib/handlers/process-send-message.js.map +7 -0
  385. package/dist/lib/handlers/process-session-goal.js +11 -74
  386. package/dist/lib/handlers/process-session-goal.js.map +7 -1
  387. package/dist/lib/hooks-config.js +52 -544
  388. package/dist/lib/hooks-config.js.map +7 -1
  389. package/dist/lib/insights-prompts.js +12 -145
  390. package/dist/lib/insights-prompts.js.map +7 -1
  391. package/dist/lib/job-helpers.js +1 -0
  392. package/dist/lib/job-helpers.js.map +7 -0
  393. package/dist/lib/llm-client.js +16 -274
  394. package/dist/lib/llm-client.js.map +7 -1
  395. package/dist/lib/manual-tasks.js +22 -0
  396. package/dist/lib/manual-tasks.js.map +7 -0
  397. package/dist/lib/output.js +12 -36
  398. package/dist/lib/output.js.map +7 -1
  399. package/dist/lib/permanent-job-error.js +10 -23
  400. package/dist/lib/permanent-job-error.js.map +7 -1
  401. package/dist/lib/provider-aggregator.js +57 -55
  402. package/dist/lib/provider-aggregator.js.map +7 -1
  403. package/dist/lib/research-client.js +12 -0
  404. package/dist/lib/research-client.js.map +7 -0
  405. package/dist/lib/skills-loader.js +8 -51
  406. package/dist/lib/skills-loader.js.map +7 -1
  407. package/dist/lib/statusline-shim.js +16 -0
  408. package/dist/lib/statusline-shim.js.map +7 -0
  409. package/dist/lib/terminal-target-heartbeat.js +15 -0
  410. package/dist/lib/terminal-target-heartbeat.js.map +7 -0
  411. package/dist/lib/tmux.js +16 -0
  412. package/dist/lib/tmux.js.map +7 -0
  413. package/dist/lib/transcript-rate-limit-watcher.js +22 -0
  414. package/dist/lib/transcript-rate-limit-watcher.js.map +7 -0
  415. package/dist/lib/types.js +8 -7
  416. package/dist/lib/types.js.map +7 -1
  417. package/dist/lib/version-check.js +10 -106
  418. package/dist/lib/version-check.js.map +7 -1
  419. package/dist/lib/which.js +8 -0
  420. package/dist/lib/which.js.map +7 -0
  421. package/dist/lib/worktree.js +17 -0
  422. package/dist/lib/worktree.js.map +7 -0
  423. package/dist/opencode-IQ7X5YMJ.js +190 -0
  424. package/dist/opencode-IQ7X5YMJ.js.map +7 -0
  425. package/oclif.manifest.json +299 -66
  426. package/package.json +26 -10
  427. package/dist/base-command.d.ts +0 -12
  428. package/dist/base-command.d.ts.map +0 -1
  429. package/dist/commands/auth/create-key.d.ts +0 -11
  430. package/dist/commands/auth/create-key.d.ts.map +0 -1
  431. package/dist/commands/auth/login.d.ts +0 -11
  432. package/dist/commands/auth/login.d.ts.map +0 -1
  433. package/dist/commands/auth/logout.d.ts +0 -7
  434. package/dist/commands/auth/logout.d.ts.map +0 -1
  435. package/dist/commands/auth/revoke-key.d.ts +0 -10
  436. package/dist/commands/auth/revoke-key.d.ts.map +0 -1
  437. package/dist/commands/auth/status.d.ts +0 -7
  438. package/dist/commands/auth/status.d.ts.map +0 -1
  439. package/dist/commands/catalog/index.d.ts +0 -11
  440. package/dist/commands/catalog/index.d.ts.map +0 -1
  441. package/dist/commands/catalog/recommend.d.ts +0 -9
  442. package/dist/commands/catalog/recommend.d.ts.map +0 -1
  443. package/dist/commands/convert.d.ts +0 -15
  444. package/dist/commands/convert.d.ts.map +0 -1
  445. package/dist/commands/converters.d.ts +0 -12
  446. package/dist/commands/converters.d.ts.map +0 -1
  447. package/dist/commands/crons/list.d.ts +0 -7
  448. package/dist/commands/crons/list.d.ts.map +0 -1
  449. package/dist/commands/crons/run.d.ts +0 -13
  450. package/dist/commands/crons/run.d.ts.map +0 -1
  451. package/dist/commands/dashboard.d.ts +0 -10
  452. package/dist/commands/dashboard.d.ts.map +0 -1
  453. package/dist/commands/eval-targets/create.d.ts +0 -14
  454. package/dist/commands/eval-targets/create.d.ts.map +0 -1
  455. package/dist/commands/eval-targets/list.d.ts +0 -10
  456. package/dist/commands/eval-targets/list.d.ts.map +0 -1
  457. package/dist/commands/evals/benchmark.d.ts +0 -13
  458. package/dist/commands/evals/benchmark.d.ts.map +0 -1
  459. package/dist/commands/evals/compare.d.ts +0 -15
  460. package/dist/commands/evals/compare.d.ts.map +0 -1
  461. package/dist/commands/evals/create.d.ts +0 -17
  462. package/dist/commands/evals/create.d.ts.map +0 -1
  463. package/dist/commands/evals/listen.d.ts +0 -37
  464. package/dist/commands/evals/listen.d.ts.map +0 -1
  465. package/dist/commands/evals/listen.js +0 -188
  466. package/dist/commands/evals/listen.js.map +0 -1
  467. package/dist/commands/evals/listen.test.d.ts +0 -2
  468. package/dist/commands/evals/listen.test.d.ts.map +0 -1
  469. package/dist/commands/evals/listen.test.js +0 -48
  470. package/dist/commands/evals/listen.test.js.map +0 -1
  471. package/dist/commands/evals/optimize-description.d.ts +0 -22
  472. package/dist/commands/evals/optimize-description.d.ts.map +0 -1
  473. package/dist/commands/evals/optimize.d.ts +0 -22
  474. package/dist/commands/evals/optimize.d.ts.map +0 -1
  475. package/dist/commands/evals/run.d.ts +0 -21
  476. package/dist/commands/evals/run.d.ts.map +0 -1
  477. package/dist/commands/gateway/ensure.d.ts +0 -7
  478. package/dist/commands/gateway/ensure.d.ts.map +0 -1
  479. package/dist/commands/hooks/install.d.ts +0 -16
  480. package/dist/commands/hooks/install.d.ts.map +0 -1
  481. package/dist/commands/hooks/run.d.ts +0 -11
  482. package/dist/commands/hooks/run.d.ts.map +0 -1
  483. package/dist/commands/hooks/uninstall.d.ts +0 -7
  484. package/dist/commands/hooks/uninstall.d.ts.map +0 -1
  485. package/dist/commands/import.d.ts +0 -17
  486. package/dist/commands/import.d.ts.map +0 -1
  487. package/dist/commands/instructions/create.d.ts +0 -17
  488. package/dist/commands/instructions/create.d.ts.map +0 -1
  489. package/dist/commands/instructions/delete.d.ts +0 -13
  490. package/dist/commands/instructions/delete.d.ts.map +0 -1
  491. package/dist/commands/instructions/fork.d.ts +0 -10
  492. package/dist/commands/instructions/fork.d.ts.map +0 -1
  493. package/dist/commands/instructions/get.d.ts +0 -15
  494. package/dist/commands/instructions/get.d.ts.map +0 -1
  495. package/dist/commands/instructions/list.d.ts +0 -12
  496. package/dist/commands/instructions/list.d.ts.map +0 -1
  497. package/dist/commands/instructions/promote.d.ts +0 -14
  498. package/dist/commands/instructions/promote.d.ts.map +0 -1
  499. package/dist/commands/instructions/pull.d.ts +0 -9
  500. package/dist/commands/instructions/pull.d.ts.map +0 -1
  501. package/dist/commands/instructions/upstream.d.ts +0 -9
  502. package/dist/commands/instructions/upstream.d.ts.map +0 -1
  503. package/dist/commands/instructions/versions.d.ts +0 -12
  504. package/dist/commands/instructions/versions.d.ts.map +0 -1
  505. package/dist/commands/org/current.d.ts +0 -7
  506. package/dist/commands/org/current.d.ts.map +0 -1
  507. package/dist/commands/org/list.d.ts +0 -7
  508. package/dist/commands/org/list.d.ts.map +0 -1
  509. package/dist/commands/org/switch.d.ts +0 -13
  510. package/dist/commands/org/switch.d.ts.map +0 -1
  511. package/dist/commands/packs/add-instruction.d.ts +0 -11
  512. package/dist/commands/packs/add-instruction.d.ts.map +0 -1
  513. package/dist/commands/packs/apply.d.ts +0 -13
  514. package/dist/commands/packs/apply.d.ts.map +0 -1
  515. package/dist/commands/packs/create.d.ts +0 -13
  516. package/dist/commands/packs/create.d.ts.map +0 -1
  517. package/dist/commands/packs/fork.d.ts +0 -10
  518. package/dist/commands/packs/fork.d.ts.map +0 -1
  519. package/dist/commands/packs/get.d.ts +0 -10
  520. package/dist/commands/packs/get.d.ts.map +0 -1
  521. package/dist/commands/packs/list.d.ts +0 -22
  522. package/dist/commands/packs/list.d.ts.map +0 -1
  523. package/dist/commands/packs/remove-instruction.d.ts +0 -11
  524. package/dist/commands/packs/remove-instruction.d.ts.map +0 -1
  525. package/dist/commands/proxy/env.d.ts +0 -14
  526. package/dist/commands/proxy/env.d.ts.map +0 -1
  527. package/dist/commands/proxy/logs.d.ts +0 -11
  528. package/dist/commands/proxy/logs.d.ts.map +0 -1
  529. package/dist/commands/proxy/restart.d.ts +0 -11
  530. package/dist/commands/proxy/restart.d.ts.map +0 -1
  531. package/dist/commands/proxy/setup.d.ts +0 -23
  532. package/dist/commands/proxy/setup.d.ts.map +0 -1
  533. package/dist/commands/proxy/start.d.ts +0 -17
  534. package/dist/commands/proxy/start.d.ts.map +0 -1
  535. package/dist/commands/proxy/status.d.ts +0 -7
  536. package/dist/commands/proxy/status.d.ts.map +0 -1
  537. package/dist/commands/proxy/stop.d.ts +0 -8
  538. package/dist/commands/proxy/stop.d.ts.map +0 -1
  539. package/dist/commands/service/install.d.ts +0 -33
  540. package/dist/commands/service/install.d.ts.map +0 -1
  541. package/dist/commands/service/install.test.d.ts +0 -2
  542. package/dist/commands/service/install.test.d.ts.map +0 -1
  543. package/dist/commands/service/install.test.js +0 -345
  544. package/dist/commands/service/install.test.js.map +0 -1
  545. package/dist/commands/service/status.d.ts +0 -6
  546. package/dist/commands/service/status.d.ts.map +0 -1
  547. package/dist/commands/service/uninstall.d.ts +0 -6
  548. package/dist/commands/service/uninstall.d.ts.map +0 -1
  549. package/dist/commands/sessions/analyze.d.ts +0 -10
  550. package/dist/commands/sessions/analyze.d.ts.map +0 -1
  551. package/dist/commands/sessions/end.d.ts +0 -9
  552. package/dist/commands/sessions/end.d.ts.map +0 -1
  553. package/dist/commands/sessions/import.d.ts +0 -13
  554. package/dist/commands/sessions/import.d.ts.map +0 -1
  555. package/dist/commands/sessions/list.d.ts +0 -11
  556. package/dist/commands/sessions/list.d.ts.map +0 -1
  557. package/dist/commands/sessions/start.d.ts +0 -11
  558. package/dist/commands/sessions/start.d.ts.map +0 -1
  559. package/dist/commands/signals/report.d.ts +0 -10
  560. package/dist/commands/signals/report.d.ts.map +0 -1
  561. package/dist/commands/signals/report.test.d.ts +0 -2
  562. package/dist/commands/signals/report.test.d.ts.map +0 -1
  563. package/dist/commands/signals/report.test.js +0 -65
  564. package/dist/commands/signals/report.test.js.map +0 -1
  565. package/dist/commands/skills/export-approved.d.ts +0 -10
  566. package/dist/commands/skills/export-approved.d.ts.map +0 -1
  567. package/dist/commands/skills/install.d.ts +0 -15
  568. package/dist/commands/skills/install.d.ts.map +0 -1
  569. package/dist/commands/skills/list.d.ts +0 -11
  570. package/dist/commands/skills/list.d.ts.map +0 -1
  571. package/dist/commands/skills/publish.d.ts +0 -17
  572. package/dist/commands/skills/publish.d.ts.map +0 -1
  573. package/dist/commands/skills/search.d.ts +0 -17
  574. package/dist/commands/skills/search.d.ts.map +0 -1
  575. package/dist/commands/skills/update.d.ts +0 -10
  576. package/dist/commands/skills/update.d.ts.map +0 -1
  577. package/dist/commands/suggestions/accept.d.ts +0 -16
  578. package/dist/commands/suggestions/accept.d.ts.map +0 -1
  579. package/dist/commands/suggestions/accept.test.d.ts +0 -2
  580. package/dist/commands/suggestions/accept.test.d.ts.map +0 -1
  581. package/dist/commands/suggestions/accept.test.js +0 -52
  582. package/dist/commands/suggestions/accept.test.js.map +0 -1
  583. package/dist/commands/suggestions/dismiss.d.ts +0 -10
  584. package/dist/commands/suggestions/dismiss.d.ts.map +0 -1
  585. package/dist/commands/suggestions/list.d.ts +0 -10
  586. package/dist/commands/suggestions/list.d.ts.map +0 -1
  587. package/dist/commands/suggestions/refresh.d.ts +0 -7
  588. package/dist/commands/suggestions/refresh.d.ts.map +0 -1
  589. package/dist/dashboard/Dashboard.d.ts +0 -3
  590. package/dist/dashboard/Dashboard.d.ts.map +0 -1
  591. package/dist/dashboard/data.d.ts +0 -11
  592. package/dist/dashboard/data.d.ts.map +0 -1
  593. package/dist/dashboard/panels/friction.d.ts +0 -7
  594. package/dist/dashboard/panels/friction.d.ts.map +0 -1
  595. package/dist/dashboard/panels/insights.d.ts +0 -8
  596. package/dist/dashboard/panels/insights.d.ts.map +0 -1
  597. package/dist/dashboard/panels/instructions.d.ts +0 -9
  598. package/dist/dashboard/panels/instructions.d.ts.map +0 -1
  599. package/dist/dashboard/panels/outcomes.d.ts +0 -7
  600. package/dist/dashboard/panels/outcomes.d.ts.map +0 -1
  601. package/dist/dashboard/panels/overview.d.ts +0 -8
  602. package/dist/dashboard/panels/overview.d.ts.map +0 -1
  603. package/dist/dashboard/panels/shared.d.ts +0 -17
  604. package/dist/dashboard/panels/shared.d.ts.map +0 -1
  605. package/dist/dashboard/types.d.ts +0 -80
  606. package/dist/dashboard/types.d.ts.map +0 -1
  607. package/dist/index.d.ts +0 -2
  608. package/dist/index.d.ts.map +0 -1
  609. package/dist/lib/active-org-refresh.d.ts +0 -22
  610. package/dist/lib/active-org-refresh.d.ts.map +0 -1
  611. package/dist/lib/active-org-refresh.test.d.ts +0 -2
  612. package/dist/lib/active-org-refresh.test.d.ts.map +0 -1
  613. package/dist/lib/active-org-refresh.test.js +0 -190
  614. package/dist/lib/active-org-refresh.test.js.map +0 -1
  615. package/dist/lib/active-org.d.ts +0 -43
  616. package/dist/lib/active-org.d.ts.map +0 -1
  617. package/dist/lib/active-org.test.d.ts +0 -2
  618. package/dist/lib/active-org.test.d.ts.map +0 -1
  619. package/dist/lib/active-org.test.js +0 -147
  620. package/dist/lib/active-org.test.js.map +0 -1
  621. package/dist/lib/api-client.d.ts +0 -17
  622. package/dist/lib/api-client.d.ts.map +0 -1
  623. package/dist/lib/api-client.test.d.ts +0 -2
  624. package/dist/lib/api-client.test.d.ts.map +0 -1
  625. package/dist/lib/api-client.test.js +0 -161
  626. package/dist/lib/api-client.test.js.map +0 -1
  627. package/dist/lib/auth.d.ts +0 -27
  628. package/dist/lib/auth.d.ts.map +0 -1
  629. package/dist/lib/auth.test.d.ts +0 -2
  630. package/dist/lib/auth.test.d.ts.map +0 -1
  631. package/dist/lib/auth.test.js +0 -110
  632. package/dist/lib/auth.test.js.map +0 -1
  633. package/dist/lib/cron-registry.d.ts +0 -47
  634. package/dist/lib/cron-registry.d.ts.map +0 -1
  635. package/dist/lib/cron-registry.js +0 -102
  636. package/dist/lib/cron-registry.js.map +0 -1
  637. package/dist/lib/cron-registry.test.d.ts +0 -2
  638. package/dist/lib/cron-registry.test.d.ts.map +0 -1
  639. package/dist/lib/cron-registry.test.js +0 -136
  640. package/dist/lib/cron-registry.test.js.map +0 -1
  641. package/dist/lib/cron-runner.d.ts +0 -16
  642. package/dist/lib/cron-runner.d.ts.map +0 -1
  643. package/dist/lib/cron-runner.js +0 -68
  644. package/dist/lib/cron-runner.js.map +0 -1
  645. package/dist/lib/detect-languages.d.ts +0 -7
  646. package/dist/lib/detect-languages.d.ts.map +0 -1
  647. package/dist/lib/detect-languages.test.d.ts +0 -2
  648. package/dist/lib/detect-languages.test.d.ts.map +0 -1
  649. package/dist/lib/detect-languages.test.js +0 -29
  650. package/dist/lib/detect-languages.test.js.map +0 -1
  651. package/dist/lib/eval-analyzer.d.ts +0 -23
  652. package/dist/lib/eval-analyzer.d.ts.map +0 -1
  653. package/dist/lib/eval-benchmark.d.ts +0 -17
  654. package/dist/lib/eval-benchmark.d.ts.map +0 -1
  655. package/dist/lib/eval-conversation-handler.d.ts +0 -9
  656. package/dist/lib/eval-conversation-handler.d.ts.map +0 -1
  657. package/dist/lib/eval-executor.d.ts +0 -21
  658. package/dist/lib/eval-executor.d.ts.map +0 -1
  659. package/dist/lib/eval-executor.test.d.ts +0 -2
  660. package/dist/lib/eval-executor.test.d.ts.map +0 -1
  661. package/dist/lib/eval-executor.test.js +0 -8
  662. package/dist/lib/eval-executor.test.js.map +0 -1
  663. package/dist/lib/eval-grader.d.ts +0 -38
  664. package/dist/lib/eval-grader.d.ts.map +0 -1
  665. package/dist/lib/eval-grader.test.d.ts +0 -2
  666. package/dist/lib/eval-grader.test.d.ts.map +0 -1
  667. package/dist/lib/eval-grader.test.js +0 -8
  668. package/dist/lib/eval-grader.test.js.map +0 -1
  669. package/dist/lib/eval-meta-judge.d.ts +0 -28
  670. package/dist/lib/eval-meta-judge.d.ts.map +0 -1
  671. package/dist/lib/eval-trigger-tester.d.ts +0 -19
  672. package/dist/lib/eval-trigger-tester.d.ts.map +0 -1
  673. package/dist/lib/eval-worktree.d.ts +0 -11
  674. package/dist/lib/eval-worktree.d.ts.map +0 -1
  675. package/dist/lib/eval-worktree.test.d.ts +0 -2
  676. package/dist/lib/eval-worktree.test.d.ts.map +0 -1
  677. package/dist/lib/eval-worktree.test.js +0 -68
  678. package/dist/lib/eval-worktree.test.js.map +0 -1
  679. package/dist/lib/gateway-entry.d.ts +0 -3
  680. package/dist/lib/gateway-entry.d.ts.map +0 -1
  681. package/dist/lib/gateway-lifecycle.d.ts +0 -9
  682. package/dist/lib/gateway-lifecycle.d.ts.map +0 -1
  683. package/dist/lib/gateway.d.ts +0 -11
  684. package/dist/lib/gateway.d.ts.map +0 -1
  685. package/dist/lib/graphile-worker-runner.d.ts +0 -124
  686. package/dist/lib/graphile-worker-runner.d.ts.map +0 -1
  687. package/dist/lib/graphile-worker-runner.js +0 -530
  688. package/dist/lib/graphile-worker-runner.js.map +0 -1
  689. package/dist/lib/graphile-worker-runner.test.d.ts +0 -2
  690. package/dist/lib/graphile-worker-runner.test.d.ts.map +0 -1
  691. package/dist/lib/graphile-worker-runner.test.js +0 -153
  692. package/dist/lib/graphile-worker-runner.test.js.map +0 -1
  693. package/dist/lib/handlers/cron-close-stale-sessions.d.ts +0 -3
  694. package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +0 -1
  695. package/dist/lib/handlers/cron-data-integrity-audit.d.ts +0 -3
  696. package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +0 -1
  697. package/dist/lib/handlers/cron-refresh-skills.d.ts +0 -3
  698. package/dist/lib/handlers/cron-refresh-skills.d.ts.map +0 -1
  699. package/dist/lib/handlers/cron-refresh-skills.test.d.ts +0 -2
  700. package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +0 -1
  701. package/dist/lib/handlers/cron-refresh-skills.test.js +0 -114
  702. package/dist/lib/handlers/cron-refresh-skills.test.js.map +0 -1
  703. package/dist/lib/handlers/cron-regenerate-insights.d.ts +0 -3
  704. package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +0 -1
  705. package/dist/lib/handlers/cron-regenerate-insights.js +0 -6
  706. package/dist/lib/handlers/cron-regenerate-insights.js.map +0 -1
  707. package/dist/lib/handlers/cron-suggest-instructions.d.ts +0 -3
  708. package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +0 -1
  709. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +0 -2
  710. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +0 -1
  711. package/dist/lib/handlers/cron-suggest-instructions.test.js +0 -80
  712. package/dist/lib/handlers/cron-suggest-instructions.test.js.map +0 -1
  713. package/dist/lib/handlers/process-conversation.d.ts +0 -35
  714. package/dist/lib/handlers/process-conversation.d.ts.map +0 -1
  715. package/dist/lib/handlers/process-eval.d.ts +0 -32
  716. package/dist/lib/handlers/process-eval.d.ts.map +0 -1
  717. package/dist/lib/handlers/process-insights.d.ts +0 -39
  718. package/dist/lib/handlers/process-insights.d.ts.map +0 -1
  719. package/dist/lib/handlers/process-launch.d.ts +0 -29
  720. package/dist/lib/handlers/process-launch.d.ts.map +0 -1
  721. package/dist/lib/handlers/process-session-goal.d.ts +0 -29
  722. package/dist/lib/handlers/process-session-goal.d.ts.map +0 -1
  723. package/dist/lib/handlers/process-session-goal.test.d.ts +0 -2
  724. package/dist/lib/handlers/process-session-goal.test.d.ts.map +0 -1
  725. package/dist/lib/handlers/process-session-goal.test.js +0 -134
  726. package/dist/lib/handlers/process-session-goal.test.js.map +0 -1
  727. package/dist/lib/hooks-config.d.ts +0 -119
  728. package/dist/lib/hooks-config.d.ts.map +0 -1
  729. package/dist/lib/hooks-config.test.d.ts +0 -2
  730. package/dist/lib/hooks-config.test.d.ts.map +0 -1
  731. package/dist/lib/hooks-config.test.js +0 -231
  732. package/dist/lib/hooks-config.test.js.map +0 -1
  733. package/dist/lib/insights-prompts.d.ts +0 -13
  734. package/dist/lib/insights-prompts.d.ts.map +0 -1
  735. package/dist/lib/llm-client.d.ts +0 -26
  736. package/dist/lib/llm-client.d.ts.map +0 -1
  737. package/dist/lib/llm-client.test.d.ts +0 -2
  738. package/dist/lib/llm-client.test.d.ts.map +0 -1
  739. package/dist/lib/llm-client.test.js +0 -62
  740. package/dist/lib/llm-client.test.js.map +0 -1
  741. package/dist/lib/mirror-writer-db.d.ts +0 -12
  742. package/dist/lib/mirror-writer-db.d.ts.map +0 -1
  743. package/dist/lib/mirror-writer-db.js +0 -51
  744. package/dist/lib/mirror-writer-db.js.map +0 -1
  745. package/dist/lib/mirror-writer.d.ts +0 -35
  746. package/dist/lib/mirror-writer.d.ts.map +0 -1
  747. package/dist/lib/mirror-writer.js +0 -27
  748. package/dist/lib/mirror-writer.js.map +0 -1
  749. package/dist/lib/mirror-writer.test.d.ts +0 -2
  750. package/dist/lib/mirror-writer.test.d.ts.map +0 -1
  751. package/dist/lib/mirror-writer.test.js +0 -47
  752. package/dist/lib/mirror-writer.test.js.map +0 -1
  753. package/dist/lib/output.d.ts +0 -4
  754. package/dist/lib/output.d.ts.map +0 -1
  755. package/dist/lib/output.test.d.ts +0 -2
  756. package/dist/lib/output.test.d.ts.map +0 -1
  757. package/dist/lib/output.test.js +0 -71
  758. package/dist/lib/output.test.js.map +0 -1
  759. package/dist/lib/permanent-job-error.d.ts +0 -17
  760. package/dist/lib/permanent-job-error.d.ts.map +0 -1
  761. package/dist/lib/permanent-job-error.test.d.ts +0 -2
  762. package/dist/lib/permanent-job-error.test.d.ts.map +0 -1
  763. package/dist/lib/permanent-job-error.test.js +0 -29
  764. package/dist/lib/permanent-job-error.test.js.map +0 -1
  765. package/dist/lib/provider-aggregator.d.ts +0 -24
  766. package/dist/lib/provider-aggregator.d.ts.map +0 -1
  767. package/dist/lib/provider-aggregator.test.d.ts +0 -2
  768. package/dist/lib/provider-aggregator.test.d.ts.map +0 -1
  769. package/dist/lib/provider-aggregator.test.js +0 -103
  770. package/dist/lib/provider-aggregator.test.js.map +0 -1
  771. package/dist/lib/skills-loader.d.ts +0 -6
  772. package/dist/lib/skills-loader.d.ts.map +0 -1
  773. package/dist/lib/types.d.ts +0 -48
  774. package/dist/lib/types.d.ts.map +0 -1
  775. package/dist/lib/version-check.d.ts +0 -11
  776. package/dist/lib/version-check.d.ts.map +0 -1
  777. package/dist/test-helpers.d.ts +0 -58
  778. package/dist/test-helpers.d.ts.map +0 -1
  779. package/dist/test-helpers.js +0 -58
  780. package/dist/test-helpers.js.map +0 -1
@@ -1,52 +1,13 @@
1
- import { Command, Flags } from '@oclif/core';
2
- import { isAuthenticated } from './lib/auth.js';
3
- import { ApiError } from './lib/api-client.js';
4
- import { maybeRefreshActiveOrg } from './lib/active-org-refresh.js';
5
- import { getUpgradeBanner, refreshVersionCacheInBackground } from './lib/version-check.js';
6
- export class BaseCommand extends Command {
7
- static baseFlags = {
8
- 'api-url': Flags.string({
9
- description: 'Override API base URL',
10
- env: 'RULEMETRIC_API_URL',
11
- hidden: true,
12
- }),
13
- };
14
- async init() {
15
- await super.init();
16
- const { flags } = await this.parse(this.constructor);
17
- if (flags['api-url']) {
18
- process.env.RULEMETRIC_API_URL = flags['api-url'];
19
- }
20
- // Print the upgrade banner from the cache (populated by the previous
21
- // command). To stderr so it doesn't pollute scriptable stdout. Then
22
- // kick off a background refresh for the *next* invocation. Suppressed
23
- // on commands meant to be machine-readable (`hooks run`, etc.) since
24
- // a banner there would corrupt JSON output piped to other tools.
25
- const banner = getUpgradeBanner(this.config.version);
26
- if (banner && !this.argv.includes('--quiet') && !process.env.RULEMETRIC_QUIET) {
27
- process.stderr.write(`\n${banner}\n\n`);
28
- }
29
- refreshVersionCacheInBackground();
30
- }
31
- requireAuth() {
32
- if (!isAuthenticated()) {
33
- this.error('Not logged in. Run `rulemetric auth login` to authenticate.');
34
- }
35
- // Fire-and-forget refresh of the local active-org cache. Doesn't block
36
- // the command — its only side effect is rewriting the cache file.
37
- void maybeRefreshActiveOrg();
38
- }
39
- async catch(err) {
40
- if (err instanceof ApiError) {
41
- if (err.statusCode === 401) {
42
- this.error('Session expired. Run `rulemetric auth login` to re-authenticate.');
43
- }
44
- this.error(err.message);
45
- }
46
- if (err.message?.includes('fetch failed') || err.message?.includes('ECONNREFUSED')) {
47
- this.error('Could not connect to the API server. Is it running?');
48
- }
49
- throw err;
50
- }
51
- }
52
- //# sourceMappingURL=base-command.js.map
1
+ import {
2
+ BaseCommand
3
+ } from "./chunk-S56LOTGQ.js";
4
+ import "./chunk-OGVORIFM.js";
5
+ import "./chunk-2AM54TUK.js";
6
+ import "./chunk-EJOI2ZGU.js";
7
+ import "./chunk-KZRFUXGF.js";
8
+ import "./chunk-EKJ2CABV.js";
9
+ import "./chunk-NSBPE2FW.js";
10
+ export {
11
+ BaseCommand
12
+ };
13
+ //# sourceMappingURL=base-command.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"base-command.js","sourceRoot":"","sources":["../src/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC;AAE3F,MAAM,OAAgB,WAAY,SAAQ,OAAO;IAC/C,MAAM,CAAU,SAAS,GAAG;QAC1B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,uBAAuB;YACpC,GAAG,EAAE,oBAAoB;YACzB,MAAM,EAAE,IAAI;SACb,CAAC;KACH,CAAC;IAEiB,KAAK,CAAC,IAAI;QAC3B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAiC,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QACD,qEAAqE;QACrE,oEAAoE;QACpE,sEAAsE;QACtE,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,MAAM,CAAC,CAAC;QAC1C,CAAC;QACD,+BAA+B,EAAE,CAAC;IACpC,CAAC;IAES,WAAW;QACnB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC5E,CAAC;QACD,uEAAuE;QACvE,kEAAkE;QAClE,KAAK,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEkB,KAAK,CAAC,KAAK,CAAC,GAAkC;QAC/D,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACjF,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACnF,IAAI,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,GAAG,CAAC;IACZ,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,59 @@
1
+ import {
2
+ apiGet
3
+ } from "./chunk-EJOI2ZGU.js";
4
+ import {
5
+ clearActiveOrg,
6
+ isStale,
7
+ readActiveOrg,
8
+ writeActiveOrg
9
+ } from "./chunk-EKJ2CABV.js";
10
+
11
+ // src/lib/active-org-refresh.ts
12
+ var attempted = false;
13
+ async function syncActiveOrgFromServer() {
14
+ if (process.env.RULEMETRIC_ORG_ID) return;
15
+ const cached = readActiveOrg();
16
+ if (cached && !isStale(cached)) return;
17
+ try {
18
+ const profile = await apiGet("/api/profile");
19
+ if (!profile.activeOrgId) {
20
+ clearActiveOrg();
21
+ return;
22
+ }
23
+ if (cached && profile.activeOrgId === cached.orgId) {
24
+ writeActiveOrg({
25
+ orgId: cached.orgId,
26
+ orgSlug: cached.orgSlug,
27
+ syncedAt: Date.now()
28
+ });
29
+ return;
30
+ }
31
+ const orgs = await apiGet("/api/orgs");
32
+ const match = orgs.find((o) => o.id === profile.activeOrgId);
33
+ writeActiveOrg({
34
+ orgId: profile.activeOrgId,
35
+ orgSlug: match?.slug,
36
+ syncedAt: Date.now()
37
+ });
38
+ } catch {
39
+ }
40
+ }
41
+ async function maybeRefreshActiveOrg() {
42
+ if (attempted) return;
43
+ attempted = true;
44
+ await syncActiveOrgFromServer();
45
+ }
46
+ async function bootstrapActiveOrg() {
47
+ attempted = true;
48
+ await syncActiveOrgFromServer();
49
+ }
50
+ function _resetRefreshAttempt() {
51
+ attempted = false;
52
+ }
53
+
54
+ export {
55
+ maybeRefreshActiveOrg,
56
+ bootstrapActiveOrg,
57
+ _resetRefreshAttempt
58
+ };
59
+ //# sourceMappingURL=chunk-2AM54TUK.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/active-org-refresh.ts"],
4
+ "sourcesContent": ["import { apiGet } from './api-client.js';\nimport {\n readActiveOrg,\n writeActiveOrg,\n clearActiveOrg,\n isStale,\n} from './active-org.js';\n\ninterface ProfileResponse {\n id: string;\n email: string | null;\n displayName: string | null;\n activeOrgId: string | null;\n}\n\ninterface OrgListItem {\n id: string;\n name: string;\n slug: string;\n role: string;\n}\n\n/**\n * Module-level guard so we only refresh once per CLI invocation, even if\n * `BaseCommand.init` runs multiple times across nested commands or tests.\n */\nlet attempted = false;\n\n/**\n * Opportunistically reconcile the local active-org cache with the server.\n *\n * Runs in three cases:\n * 1. Cache file is ABSENT (bootstrap) \u2014 populate from `/api/profile`. This\n * branch is load-bearing: without it, a user who never explicitly ran\n * `rulemetric org switch` would have hook captures with `org_id=NULL`\n * forever, even when the server already has `profiles.active_org_id`\n * set (e.g. switched via the web UI, or auto-set by the handle_new_user\n * trigger from migration 00067). Caught 2026-05-25 after an audit found\n * 244 hook sessions over 14 days all missing org_id.\n * 2. Cache file exists but is stale (>5min) \u2014 re-sync from the server.\n * 3. Env override is set OR cache is fresh \u2014 no-op, zero network.\n *\n * Failures are intentionally swallowed: this is a background nicety, not a\n * gating step. The next API call the user actually invoked will surface\n * any auth/network errors with clearer messaging than a refresh failure\n * could. Capture-time fallback to `profiles.active_org_id` at\n * `apps/api/src/routes/sessions.ts:48` is the final safety net.\n */\n/**\n * Internal: fetch profile + (if needed) orgs, then write/clear the cache.\n * Shared body for both `maybeRefreshActiveOrg` (guarded, used by every CLI\n * command via BaseCommand) and `bootstrapActiveOrg` (unguarded, used by\n * lifecycle commands that just wrote auth/install state and want the cache\n * to reflect it before they exit).\n */\nasync function syncActiveOrgFromServer(): Promise<void> {\n // Env override: caller has explicitly chosen the org. Don't write the\n // file \u2014 env should be ephemeral.\n if (process.env.RULEMETRIC_ORG_ID) return;\n\n const cached = readActiveOrg();\n // Only skip when we have a fresh cache. Missing cache (cached === null)\n // and stale cache both fall through to the refresh path below.\n if (cached && !isStale(cached)) return;\n\n try {\n const profile = await apiGet<ProfileResponse>('/api/profile');\n\n if (!profile.activeOrgId) {\n // Server has no active org \u2014 drop the local cache (if any).\n clearActiveOrg();\n return;\n }\n\n if (cached && profile.activeOrgId === cached.orgId) {\n // Same id \u2014 just bump syncedAt so we don't re-fetch every command.\n writeActiveOrg({\n orgId: cached.orgId,\n orgSlug: cached.orgSlug,\n syncedAt: Date.now(),\n });\n return;\n }\n\n // Either bootstrapping fresh (no cache) OR the server changed the active\n // org out from under us (e.g. via web UI). Look up the slug for the id\n // and (re)write the cache.\n const orgs = await apiGet<OrgListItem[]>('/api/orgs');\n const match = orgs.find((o) => o.id === profile.activeOrgId);\n writeActiveOrg({\n orgId: profile.activeOrgId,\n orgSlug: match?.slug,\n syncedAt: Date.now(),\n });\n } catch {\n // Swallow \u2014 leave the old cache intact. The user's actual command will\n // surface the real error if any.\n }\n}\n\nexport async function maybeRefreshActiveOrg(): Promise<void> {\n if (attempted) return;\n attempted = true;\n await syncActiveOrgFromServer();\n}\n\n/**\n * Explicit, guard-bypassing version of the refresh. Use ONLY from commands\n * where the user just took an action that changes auth/install state and we\n * want the cache to reflect it before the command exits:\n *\n * - After `auth login`: BaseCommand.init fired the guarded refresh BEFORE\n * credentials existed and got a 401; we need to retry post-login.\n * - After `hooks install` / `service install`: belt-and-suspenders so the\n * first Claude Code session after install has a populated cache, even\n * if BaseCommand's earlier refresh hit a transient error.\n *\n * Marks `attempted = true` after running so a redundant `maybeRefreshActiveOrg`\n * call later in the same process is a no-op.\n */\nexport async function bootstrapActiveOrg(): Promise<void> {\n attempted = true;\n await syncActiveOrgFromServer();\n}\n\n/**\n * Test hook \u2014 reset the once-per-process guard so each test can exercise\n * the refresh logic.\n */\nexport function _resetRefreshAttempt(): void {\n attempted = false;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AA0BA,IAAI,YAAY;AA6BhB,eAAe,0BAAyC;AAGtD,MAAI,QAAQ,IAAI,kBAAmB;AAEnC,QAAM,SAAS,cAAc;AAG7B,MAAI,UAAU,CAAC,QAAQ,MAAM,EAAG;AAEhC,MAAI;AACF,UAAM,UAAU,MAAM,OAAwB,cAAc;AAE5D,QAAI,CAAC,QAAQ,aAAa;AAExB,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,gBAAgB,OAAO,OAAO;AAElD,qBAAe;AAAA,QACb,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,UAAU,KAAK,IAAI;AAAA,MACrB,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,MAAM,OAAsB,WAAW;AACpD,UAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,WAAW;AAC3D,mBAAe;AAAA,MACb,OAAO,QAAQ;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,UAAU,KAAK,IAAI;AAAA,IACrB,CAAC;AAAA,EACH,QAAQ;AAAA,EAGR;AACF;AAEA,eAAsB,wBAAuC;AAC3D,MAAI,UAAW;AACf,cAAY;AACZ,QAAM,wBAAwB;AAChC;AAgBA,eAAsB,qBAAoC;AACxD,cAAY;AACZ,QAAM,wBAAwB;AAChC;AAMO,SAAS,uBAA6B;AAC3C,cAAY;AACd;",
6
+ "names": []
7
+ }
@@ -0,0 +1,96 @@
1
+ import {
2
+ executeEval
3
+ } from "./chunk-QN34TGD3.js";
4
+
5
+ // src/lib/eval-analyzer.ts
6
+ var ANALYZER_SYSTEM_PROMPT = `You are an expert at improving AI coding instructions, skills, and prompts. You receive eval results showing how well the current content performs, and your job is to propose specific improvements.
7
+
8
+ You will receive:
9
+ 1. The current content of the eval target
10
+ 2. Eval results: for each eval, the prompt, expectations, pass/fail results, and grader feedback
11
+ 3. The pass rate and areas of weakness
12
+
13
+ Analyze the failures and propose concrete edits to improve the content. Focus on:
14
+ - Expectations that consistently fail \u2014 what's missing from the content?
15
+ - Grader feedback suggesting new assertions \u2014 what outcomes aren't being tested?
16
+ - Patterns across failures \u2014 is there a systemic gap?
17
+
18
+ Your proposed content should be a complete replacement, not a diff. Keep what works, fix what doesn't.
19
+
20
+ You MUST respond with ONLY a valid JSON object:
21
+
22
+ {
23
+ "suggestions": [
24
+ {
25
+ "section": "which part of the content",
26
+ "current": "brief quote of current text",
27
+ "proposed": "what it should say instead",
28
+ "reasoning": "why this change helps"
29
+ }
30
+ ],
31
+ "overallAssessment": "brief summary of what's working and what's not",
32
+ "proposedContent": "the full improved content"
33
+ }`;
34
+ async function analyzeEvalResults(options) {
35
+ const { content, evalResults, model, timeout = 12e4, userFeedback } = options;
36
+ const resultsText = evalResults.map((r) => {
37
+ const grading = r.grading;
38
+ const expectations = grading?.expectations ?? [];
39
+ const passRate = grading?.summary?.pass_rate ?? "N/A";
40
+ const feedback = grading?.eval_feedback?.overall ?? "";
41
+ return `## Eval: ${r.evalName}
42
+ Prompt: ${r.prompt}
43
+ Pass rate: ${typeof passRate === "number" ? (passRate * 100).toFixed(0) + "%" : passRate}
44
+
45
+ Expectations:
46
+ ${expectations.map((e) => ` ${e.passed ? "PASS" : "FAIL"} \u2014 ${e.text}: ${e.evidence}`).join("\n")}
47
+
48
+ Feedback: ${feedback}`;
49
+ }).join("\n\n---\n\n");
50
+ const feedbackSection = userFeedback ? `
51
+
52
+ ## User Feedback
53
+
54
+ ${userFeedback}` : "\n\n## User Feedback\n\nNo specific feedback provided.";
55
+ const analyzerPrompt = `## Current Content
56
+
57
+ ${content}
58
+
59
+ ## Eval Results
60
+
61
+ ${resultsText}${feedbackSection}
62
+
63
+ Analyze the results and propose improvements. Respond with ONLY valid JSON.`;
64
+ const result = await executeEval({
65
+ prompt: analyzerPrompt,
66
+ targetContent: ANALYZER_SYSTEM_PROMPT,
67
+ timeout,
68
+ model
69
+ });
70
+ if (result.error) {
71
+ return {
72
+ suggestions: [],
73
+ overallAssessment: `Analysis failed: ${result.error}`,
74
+ proposedContent: content
75
+ };
76
+ }
77
+ try {
78
+ let jsonStr = result.output.trim();
79
+ const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
80
+ if (jsonMatch) jsonStr = jsonMatch[1].trim();
81
+ const objMatch = jsonStr.match(/\{[\s\S]*\}/);
82
+ if (objMatch) jsonStr = objMatch[0];
83
+ return JSON.parse(jsonStr);
84
+ } catch {
85
+ return {
86
+ suggestions: [],
87
+ overallAssessment: `Analysis returned unparseable output: ${result.output.slice(0, 200)}`,
88
+ proposedContent: content
89
+ };
90
+ }
91
+ }
92
+
93
+ export {
94
+ analyzeEvalResults
95
+ };
96
+ //# sourceMappingURL=chunk-3TIMQ3O6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/eval-analyzer.ts"],
4
+ "sourcesContent": ["import { executeEval } from './eval-executor.js';\n\nexport interface AnalysisResult {\n suggestions: Array<{\n section: string;\n current: string;\n proposed: string;\n reasoning: string;\n }>;\n overallAssessment: string;\n proposedContent: string;\n}\n\nconst ANALYZER_SYSTEM_PROMPT = `You are an expert at improving AI coding instructions, skills, and prompts. You receive eval results showing how well the current content performs, and your job is to propose specific improvements.\n\nYou will receive:\n1. The current content of the eval target\n2. Eval results: for each eval, the prompt, expectations, pass/fail results, and grader feedback\n3. The pass rate and areas of weakness\n\nAnalyze the failures and propose concrete edits to improve the content. Focus on:\n- Expectations that consistently fail \u2014 what's missing from the content?\n- Grader feedback suggesting new assertions \u2014 what outcomes aren't being tested?\n- Patterns across failures \u2014 is there a systemic gap?\n\nYour proposed content should be a complete replacement, not a diff. Keep what works, fix what doesn't.\n\nYou MUST respond with ONLY a valid JSON object:\n\n{\n \"suggestions\": [\n {\n \"section\": \"which part of the content\",\n \"current\": \"brief quote of current text\",\n \"proposed\": \"what it should say instead\",\n \"reasoning\": \"why this change helps\"\n }\n ],\n \"overallAssessment\": \"brief summary of what's working and what's not\",\n \"proposedContent\": \"the full improved content\"\n}`;\n\nexport async function analyzeEvalResults(options: {\n content: string;\n evalResults: Array<{\n evalName: string;\n prompt: string;\n expectations: string[];\n grading: Record<string, unknown>;\n }>;\n model?: string;\n timeout?: number;\n userFeedback?: string;\n}): Promise<AnalysisResult> {\n const { content, evalResults, model, timeout = 120_000, userFeedback } = options;\n\n const resultsText = evalResults.map((r) => {\n const grading = r.grading as any;\n const expectations = grading?.expectations ?? [];\n const passRate = grading?.summary?.pass_rate ?? 'N/A';\n const feedback = grading?.eval_feedback?.overall ?? '';\n\n return `## Eval: ${r.evalName}\nPrompt: ${r.prompt}\nPass rate: ${typeof passRate === 'number' ? (passRate * 100).toFixed(0) + '%' : passRate}\n\nExpectations:\n${expectations.map((e: any) => ` ${e.passed ? 'PASS' : 'FAIL'} \u2014 ${e.text}: ${e.evidence}`).join('\\n')}\n\nFeedback: ${feedback}`;\n }).join('\\n\\n---\\n\\n');\n\n const feedbackSection = userFeedback\n ? `\\n\\n## User Feedback\\n\\n${userFeedback}`\n : '\\n\\n## User Feedback\\n\\nNo specific feedback provided.';\n\n const analyzerPrompt = `## Current Content\n\n${content}\n\n## Eval Results\n\n${resultsText}${feedbackSection}\n\nAnalyze the results and propose improvements. Respond with ONLY valid JSON.`;\n\n const result = await executeEval({\n prompt: analyzerPrompt,\n targetContent: ANALYZER_SYSTEM_PROMPT,\n timeout,\n model,\n });\n\n if (result.error) {\n return {\n suggestions: [],\n overallAssessment: `Analysis failed: ${result.error}`,\n proposedContent: content,\n };\n }\n\n try {\n let jsonStr = result.output.trim();\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) jsonStr = jsonMatch[1].trim();\n const objMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n if (objMatch) jsonStr = objMatch[0];\n\n return JSON.parse(jsonStr) as AnalysisResult;\n } catch {\n return {\n suggestions: [],\n overallAssessment: `Analysis returned unparseable output: ${result.output.slice(0, 200)}`,\n proposedContent: content,\n };\n }\n}\n"],
5
+ "mappings": ";;;;;AAaA,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6B/B,eAAsB,mBAAmB,SAWb;AAC1B,QAAM,EAAE,SAAS,aAAa,OAAO,UAAU,MAAS,aAAa,IAAI;AAEzE,QAAM,cAAc,YAAY,IAAI,CAAC,MAAM;AACzC,UAAM,UAAU,EAAE;AAClB,UAAM,eAAe,SAAS,gBAAgB,CAAC;AAC/C,UAAM,WAAW,SAAS,SAAS,aAAa;AAChD,UAAM,WAAW,SAAS,eAAe,WAAW;AAEpD,WAAO,YAAY,EAAE,QAAQ;AAAA,UACvB,EAAE,MAAM;AAAA,aACL,OAAO,aAAa,YAAY,WAAW,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ;AAAA;AAAA;AAAA,EAGtF,aAAa,IAAI,CAAC,MAAW,KAAK,EAAE,SAAS,SAAS,MAAM,WAAM,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,YAE3F,QAAQ;AAAA,EAClB,CAAC,EAAE,KAAK,aAAa;AAErB,QAAM,kBAAkB,eACpB;AAAA;AAAA;AAAA;AAAA,EAA2B,YAAY,KACvC;AAEJ,QAAM,iBAAiB;AAAA;AAAA,EAEvB,OAAO;AAAA;AAAA;AAAA;AAAA,EAIP,WAAW,GAAG,eAAe;AAAA;AAAA;AAI7B,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,OAAO,OAAO;AAChB,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,mBAAmB,oBAAoB,OAAO,KAAK;AAAA,MACnD,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI;AACF,QAAI,UAAU,OAAO,OAAO,KAAK;AACjC,UAAM,YAAY,QAAQ,MAAM,8BAA8B;AAC9D,QAAI,UAAW,WAAU,UAAU,CAAC,EAAE,KAAK;AAC3C,UAAM,WAAW,QAAQ,MAAM,aAAa;AAC5C,QAAI,SAAU,WAAU,SAAS,CAAC;AAElC,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,mBAAmB,yCAAyC,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,MACvF,iBAAiB;AAAA,IACnB;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,48 @@
1
+ import {
2
+ __require
3
+ } from "./chunk-NSBPE2FW.js";
4
+
5
+ // src/lib/skills-loader.ts
6
+ import * as fs from "node:fs";
7
+ import * as path from "node:path";
8
+ import * as os from "node:os";
9
+ import { SkillCatalog } from "@rulemetric/skills-registry";
10
+ var CACHE_PATH = path.join(os.homedir(), ".config", "rulemetric", "skills-registry.json");
11
+ function findBundledRegistry() {
12
+ try {
13
+ const pkgDir = path.dirname(__require.resolve("@rulemetric/skills-registry/package.json"));
14
+ const bundled = path.join(pkgDir, "registry.json");
15
+ if (fs.existsSync(bundled)) return bundled;
16
+ } catch {
17
+ const monorepo = path.resolve(process.cwd(), "packages", "skills-registry", "registry.json");
18
+ if (fs.existsSync(monorepo)) return monorepo;
19
+ }
20
+ return null;
21
+ }
22
+ async function loadRegistry(ctx) {
23
+ const catalog = new SkillCatalog();
24
+ if (fs.existsSync(CACHE_PATH)) {
25
+ try {
26
+ const data = JSON.parse(fs.readFileSync(CACHE_PATH, "utf-8"));
27
+ catalog.load(data);
28
+ return catalog;
29
+ } catch {
30
+ }
31
+ }
32
+ const bundled = findBundledRegistry();
33
+ if (bundled) {
34
+ try {
35
+ const data = JSON.parse(fs.readFileSync(bundled, "utf-8"));
36
+ catalog.load(data);
37
+ return catalog;
38
+ } catch {
39
+ }
40
+ }
41
+ ctx.log("No local registry found. Run: rulemetric skills update");
42
+ return catalog;
43
+ }
44
+
45
+ export {
46
+ loadRegistry
47
+ };
48
+ //# sourceMappingURL=chunk-4BHDHHKL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/skills-loader.ts"],
4
+ "sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { SkillCatalog } from '@rulemetric/skills-registry';\nimport type { SkillRegistry } from '@rulemetric/skills-registry';\n\nconst CACHE_PATH = path.join(os.homedir(), '.config', 'rulemetric', 'skills-registry.json');\n\n// Also check for a bundled registry.json next to the skills-registry package\nfunction findBundledRegistry(): string | null {\n try {\n const pkgDir = path.dirname(require.resolve('@rulemetric/skills-registry/package.json'));\n const bundled = path.join(pkgDir, 'registry.json');\n if (fs.existsSync(bundled)) return bundled;\n } catch {\n // resolve can fail in ESM, try a known relative path\n const monorepo = path.resolve(process.cwd(), 'packages', 'skills-registry', 'registry.json');\n if (fs.existsSync(monorepo)) return monorepo;\n }\n return null;\n}\n\n/** Load the skills registry, preferring local cache > bundled > empty. */\nexport async function loadRegistry(ctx: { log: (msg: string) => void }): Promise<SkillCatalog> {\n const catalog = new SkillCatalog();\n\n // Try cached registry first (from `skills update`)\n if (fs.existsSync(CACHE_PATH)) {\n try {\n const data = JSON.parse(fs.readFileSync(CACHE_PATH, 'utf-8')) as SkillRegistry;\n catalog.load(data);\n return catalog;\n } catch {\n // Corrupted cache \u2014 fall through\n }\n }\n\n // Try bundled registry\n const bundled = findBundledRegistry();\n if (bundled) {\n try {\n const data = JSON.parse(fs.readFileSync(bundled, 'utf-8')) as SkillRegistry;\n catalog.load(data);\n return catalog;\n } catch {\n // Fall through\n }\n }\n\n ctx.log('No local registry found. Run: rulemetric skills update');\n return catalog;\n}\n"],
5
+ "mappings": ";;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,oBAAoB;AAG7B,IAAM,aAAkB,UAAQ,WAAQ,GAAG,WAAW,cAAc,sBAAsB;AAG1F,SAAS,sBAAqC;AAC5C,MAAI;AACF,UAAM,SAAc,aAAQ,UAAQ,QAAQ,0CAA0C,CAAC;AACvF,UAAM,UAAe,UAAK,QAAQ,eAAe;AACjD,QAAO,cAAW,OAAO,EAAG,QAAO;AAAA,EACrC,QAAQ;AAEN,UAAM,WAAgB,aAAQ,QAAQ,IAAI,GAAG,YAAY,mBAAmB,eAAe;AAC3F,QAAO,cAAW,QAAQ,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAGA,eAAsB,aAAa,KAA4D;AAC7F,QAAM,UAAU,IAAI,aAAa;AAGjC,MAAO,cAAW,UAAU,GAAG;AAC7B,QAAI;AACF,YAAM,OAAO,KAAK,MAAS,gBAAa,YAAY,OAAO,CAAC;AAC5D,cAAQ,KAAK,IAAI;AACjB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,UAAU,oBAAoB;AACpC,MAAI,SAAS;AACX,QAAI;AACF,YAAM,OAAO,KAAK,MAAS,gBAAa,SAAS,OAAO,CAAC;AACzD,cAAQ,KAAK,IAAI;AACjB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,IAAI,wDAAwD;AAChE,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,99 @@
1
+ import {
2
+ executeEval
3
+ } from "./chunk-QN34TGD3.js";
4
+
5
+ // src/lib/eval-trigger-tester.ts
6
+ var TRIGGER_DETECTOR_PROMPT = `You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.
7
+
8
+ You will receive:
9
+ 1. The skill name and description
10
+ 2. Key content from the skill (to know what it teaches)
11
+ 3. The user's query
12
+ 4. The AI's response
13
+
14
+ Determine if the response shows clear signs of the skill being used:
15
+ - Does the response follow patterns/approaches described in the skill?
16
+ - Does it use terminology or structures specific to the skill?
17
+ - Would the response be noticeably different without the skill?
18
+
19
+ Respond with ONLY a valid JSON object:
20
+
21
+ {
22
+ "triggered": true,
23
+ "confidence": 0.85,
24
+ "evidence": "The response follows the X pattern described in the skill..."
25
+ }`;
26
+ async function testTrigger(options) {
27
+ const { query, shouldTrigger, skillName, skillDescription, skillContent, model, timeout = 12e4 } = options;
28
+ const execResult = await executeEval({
29
+ prompt: query,
30
+ targetContent: skillContent,
31
+ timeout,
32
+ model
33
+ });
34
+ if (execResult.error) {
35
+ return {
36
+ query,
37
+ shouldTrigger,
38
+ didTrigger: false,
39
+ correct: !shouldTrigger,
40
+ confidence: 0,
41
+ evidence: `Execution failed: ${execResult.error}`
42
+ };
43
+ }
44
+ const detectorPrompt = `## Skill
45
+ Name: ${skillName}
46
+ Description: ${skillDescription}
47
+
48
+ ## Key Skill Content (first 500 chars)
49
+ ${skillContent.slice(0, 500)}
50
+
51
+ ## User Query
52
+ ${query}
53
+
54
+ ## AI Response
55
+ ${execResult.output}
56
+
57
+ Did the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`;
58
+ const detectorResult = await executeEval({
59
+ prompt: detectorPrompt,
60
+ targetContent: TRIGGER_DETECTOR_PROMPT,
61
+ timeout: 6e4,
62
+ model
63
+ });
64
+ let didTrigger = false;
65
+ let confidence = 0;
66
+ let evidence = "";
67
+ try {
68
+ let jsonStr = detectorResult.output.trim();
69
+ const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
70
+ if (jsonMatch) jsonStr = jsonMatch[1].trim();
71
+ const objMatch = jsonStr.match(/\{[\s\S]*\}/);
72
+ if (objMatch) jsonStr = objMatch[0];
73
+ const parsed = JSON.parse(jsonStr);
74
+ didTrigger = parsed.triggered === true;
75
+ confidence = parsed.confidence ?? 0;
76
+ evidence = parsed.evidence ?? "";
77
+ } catch {
78
+ evidence = `Detector returned unparseable output: ${detectorResult.output.slice(0, 200)}`;
79
+ }
80
+ return {
81
+ query,
82
+ shouldTrigger,
83
+ didTrigger,
84
+ correct: didTrigger === shouldTrigger,
85
+ confidence,
86
+ evidence
87
+ };
88
+ }
89
+ function computeTriggerScore(results) {
90
+ if (results.length === 0) return 0;
91
+ const correct = results.filter((r) => r.correct).length;
92
+ return correct / results.length;
93
+ }
94
+
95
+ export {
96
+ testTrigger,
97
+ computeTriggerScore
98
+ };
99
+ //# sourceMappingURL=chunk-4D537GXE.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/eval-trigger-tester.ts"],
4
+ "sourcesContent": ["import { executeEval } from './eval-executor.js';\n\nexport interface TriggerTestResult {\n query: string;\n shouldTrigger: boolean;\n didTrigger: boolean;\n correct: boolean;\n confidence: number;\n evidence: string;\n}\n\nconst TRIGGER_DETECTOR_PROMPT = `You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.\n\nYou will receive:\n1. The skill name and description\n2. Key content from the skill (to know what it teaches)\n3. The user's query\n4. The AI's response\n\nDetermine if the response shows clear signs of the skill being used:\n- Does the response follow patterns/approaches described in the skill?\n- Does it use terminology or structures specific to the skill?\n- Would the response be noticeably different without the skill?\n\nRespond with ONLY a valid JSON object:\n\n{\n \"triggered\": true,\n \"confidence\": 0.85,\n \"evidence\": \"The response follows the X pattern described in the skill...\"\n}`;\n\nexport async function testTrigger(options: {\n query: string;\n shouldTrigger: boolean;\n skillName: string;\n skillDescription: string;\n skillContent: string;\n model?: string;\n timeout?: number;\n}): Promise<TriggerTestResult> {\n const { query, shouldTrigger, skillName, skillDescription, skillContent, model, timeout = 120_000 } = options;\n\n // Run the query with the skill as system prompt\n const execResult = await executeEval({\n prompt: query,\n targetContent: skillContent,\n timeout,\n model,\n });\n\n if (execResult.error) {\n return {\n query,\n shouldTrigger,\n didTrigger: false,\n correct: !shouldTrigger,\n confidence: 0,\n evidence: `Execution failed: ${execResult.error}`,\n };\n }\n\n // Use LLM to detect if the skill influenced the response\n const detectorPrompt = `## Skill\nName: ${skillName}\nDescription: ${skillDescription}\n\n## Key Skill Content (first 500 chars)\n${skillContent.slice(0, 500)}\n\n## User Query\n${query}\n\n## AI Response\n${execResult.output}\n\nDid the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`;\n\n const detectorResult = await executeEval({\n prompt: detectorPrompt,\n targetContent: TRIGGER_DETECTOR_PROMPT,\n timeout: 60_000,\n model,\n });\n\n let didTrigger = false;\n let confidence = 0;\n let evidence = '';\n\n try {\n let jsonStr = detectorResult.output.trim();\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) jsonStr = jsonMatch[1].trim();\n const objMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n if (objMatch) jsonStr = objMatch[0];\n\n const parsed = JSON.parse(jsonStr);\n didTrigger = parsed.triggered === true;\n confidence = parsed.confidence ?? 0;\n evidence = parsed.evidence ?? '';\n } catch {\n evidence = `Detector returned unparseable output: ${detectorResult.output.slice(0, 200)}`;\n }\n\n return {\n query,\n shouldTrigger,\n didTrigger,\n correct: didTrigger === shouldTrigger,\n confidence,\n evidence,\n };\n}\n\nexport function computeTriggerScore(results: TriggerTestResult[]): number {\n if (results.length === 0) return 0;\n const correct = results.filter((r) => r.correct).length;\n return correct / results.length;\n}\n"],
5
+ "mappings": ";;;;;AAWA,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBhC,eAAsB,YAAY,SAQH;AAC7B,QAAM,EAAE,OAAO,eAAe,WAAW,kBAAkB,cAAc,OAAO,UAAU,KAAQ,IAAI;AAGtG,QAAM,aAAa,MAAM,YAAY;AAAA,IACnC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,qBAAqB,WAAW,KAAK;AAAA,IACjD;AAAA,EACF;AAGA,QAAM,iBAAiB;AAAA,QACjB,SAAS;AAAA,eACF,gBAAgB;AAAA;AAAA;AAAA,EAG7B,aAAa,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAAA,EAG1B,KAAK;AAAA;AAAA;AAAA,EAGL,WAAW,MAAM;AAAA;AAAA;AAIjB,QAAM,iBAAiB,MAAM,YAAY;AAAA,IACvC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,WAAW;AAEf,MAAI;AACF,QAAI,UAAU,eAAe,OAAO,KAAK;AACzC,UAAM,YAAY,QAAQ,MAAM,8BAA8B;AAC9D,QAAI,UAAW,WAAU,UAAU,CAAC,EAAE,KAAK;AAC3C,UAAM,WAAW,QAAQ,MAAM,aAAa;AAC5C,QAAI,SAAU,WAAU,SAAS,CAAC;AAElC,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,iBAAa,OAAO,cAAc;AAClC,iBAAa,OAAO,cAAc;AAClC,eAAW,OAAO,YAAY;AAAA,EAChC,QAAQ;AACN,eAAW,yCAAyC,eAAe,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,EACzF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,eAAe;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,SAAsC;AACxE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,SAAO,UAAU,QAAQ;AAC3B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,129 @@
1
+ import {
2
+ Panel,
3
+ fit
4
+ } from "./chunk-DQ3KELXD.js";
5
+ import {
6
+ BLUE,
7
+ DIM,
8
+ GREEN,
9
+ ORANGE
10
+ } from "./chunk-QJQS6TUN.js";
11
+ import {
12
+ __require
13
+ } from "./chunk-NSBPE2FW.js";
14
+
15
+ // src/dashboard/panels/insights.tsx
16
+ import { useState, useMemo } from "react";
17
+ import { Box, Text, useInput } from "ink";
18
+ import { jsx, jsxs } from "react/jsx-runtime";
19
+ function extractSuggestions(api) {
20
+ const recs = api.recommendations;
21
+ if (!recs) return [];
22
+ const items = [];
23
+ for (const f of recs.suggestions?.features_to_try ?? []) {
24
+ if (!f.example_code) continue;
25
+ items.push({
26
+ label: f.feature,
27
+ description: f.why_for_you || f.one_liner,
28
+ command: f.example_code
29
+ });
30
+ }
31
+ for (const u of recs.suggestions?.usage_patterns ?? []) {
32
+ if (!u.copyable_prompt) continue;
33
+ items.push({
34
+ label: u.title,
35
+ description: u.suggestion,
36
+ command: u.copyable_prompt
37
+ });
38
+ }
39
+ for (const o of recs.on_the_horizon?.opportunities ?? []) {
40
+ if (!o.copyable_prompt) continue;
41
+ items.push({
42
+ label: o.title,
43
+ description: o.whats_possible,
44
+ command: o.copyable_prompt
45
+ });
46
+ }
47
+ return items;
48
+ }
49
+ function toCliCommand(prompt) {
50
+ const trimmed = prompt.trim();
51
+ if (/^(claude|rulemetric|pnpm|npm|npx|git)\s/.test(trimmed)) {
52
+ return trimmed;
53
+ }
54
+ return `claude -p '${trimmed.replace(/'/g, "'\\''")}'`;
55
+ }
56
+ function copyToClipboard(text) {
57
+ try {
58
+ const { execSync } = __require("node:child_process");
59
+ if (process.platform === "darwin") {
60
+ execSync("pbcopy", { input: text, stdio: ["pipe", "ignore", "ignore"] });
61
+ } else {
62
+ execSync("xclip -selection clipboard", { input: text, stdio: ["pipe", "ignore", "ignore"] });
63
+ }
64
+ return true;
65
+ } catch {
66
+ return false;
67
+ }
68
+ }
69
+ function InsightsPanel({ api, width, focused, onSelect }) {
70
+ const [selectedIdx, setSelectedIdx] = useState(0);
71
+ const [copiedIdx, setCopiedIdx] = useState(null);
72
+ const suggestions = useMemo(() => api ? extractSuggestions(api) : [], [api]);
73
+ const atAGlance = api?.recommendations?.at_a_glance;
74
+ useInput((input, key) => {
75
+ if (!focused || suggestions.length === 0) return;
76
+ if (key.upArrow) {
77
+ setSelectedIdx((i) => Math.max(0, i - 1));
78
+ } else if (key.downArrow) {
79
+ setSelectedIdx((i) => Math.min(suggestions.length - 1, i + 1));
80
+ } else if (key.return) {
81
+ const item = suggestions[selectedIdx];
82
+ if (item) {
83
+ const cmd = toCliCommand(item.command);
84
+ const copied = copyToClipboard(cmd);
85
+ if (copied) {
86
+ setCopiedIdx(selectedIdx);
87
+ setTimeout(() => setCopiedIdx(null), 2e3);
88
+ }
89
+ onSelect?.(cmd);
90
+ }
91
+ }
92
+ });
93
+ if (!api) {
94
+ return /* @__PURE__ */ jsx(Panel, { title: "Insights", color: ORANGE, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "API offline \u2014 no insights" }) });
95
+ }
96
+ if (!atAGlance && suggestions.length === 0) {
97
+ return /* @__PURE__ */ jsx(Panel, { title: "Insights", color: ORANGE, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No recommendations yet. Run: rulemetric insights sync" }) });
98
+ }
99
+ const maxLabel = Math.min(30, Math.max(...suggestions.map((s) => s.label.length), 10));
100
+ const descWidth = Math.max(10, width - maxLabel - 12);
101
+ return /* @__PURE__ */ jsxs(Panel, { title: focused ? "\u25B8 Insights & Suggestions" : "Insights & Suggestions", color: focused ? ORANGE : DIM, width, children: [
102
+ atAGlance && Object.entries(atAGlance).length > 0 && /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginBottom: 1, children: Object.entries(atAGlance).map(([key, value]) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
103
+ /* @__PURE__ */ jsx(Text, { color: DIM, bold: true, children: key.replace(/_/g, " ").toUpperCase() }),
104
+ /* @__PURE__ */ jsx(Text, { wrap: "wrap", children: String(value).slice(0, 200) })
105
+ ] }, key)) }),
106
+ suggestions.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
107
+ /* @__PURE__ */ jsxs(Box, { marginBottom: 0, children: [
108
+ /* @__PURE__ */ jsx(Text, { color: ORANGE, bold: true, children: "Suggestions" }),
109
+ focused && /* @__PURE__ */ jsx(Text, { dimColor: true, children: " \u2191\u2193 navigate \u23CE copy command" })
110
+ ] }),
111
+ suggestions.map((s, i) => {
112
+ const isSelected = focused && i === selectedIdx;
113
+ const isCopied = i === copiedIdx;
114
+ return /* @__PURE__ */ jsxs(Box, { children: [
115
+ /* @__PURE__ */ jsx(Text, { color: isSelected ? ORANGE : DIM, children: isSelected ? "\u25B8 " : " " }),
116
+ /* @__PURE__ */ jsx(Text, { color: isSelected ? ORANGE : BLUE, bold: isSelected, children: fit(s.label, maxLabel) }),
117
+ /* @__PURE__ */ jsx(Text, { color: DIM, children: " \u2502 " }),
118
+ /* @__PURE__ */ jsx(Text, { color: isSelected ? void 0 : DIM, wrap: "truncate-end", children: fit(s.description, descWidth) }),
119
+ isCopied && /* @__PURE__ */ jsx(Text, { color: GREEN, children: " \u2713 copied" })
120
+ ] }, i);
121
+ })
122
+ ] })
123
+ ] });
124
+ }
125
+
126
+ export {
127
+ InsightsPanel
128
+ };
129
+ //# sourceMappingURL=chunk-4SCZK7AL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dashboard/panels/insights.tsx"],
4
+ "sourcesContent": ["import React, { useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { ORANGE, DIM, GREEN, BLUE } from '../types.js';\nimport type { ApiInsights, Suggestion } from '../types.js';\nimport { Panel, fit } from './shared.js';\n\n/** Extract all actionable suggestions from recommendations into a flat list. */\nfunction extractSuggestions(api: ApiInsights): Suggestion[] {\n const recs = api.recommendations;\n if (!recs) return [];\n const items: Suggestion[] = [];\n\n // Features to try\n for (const f of recs.suggestions?.features_to_try ?? []) {\n if (!f.example_code) continue;\n items.push({\n label: f.feature,\n description: f.why_for_you || f.one_liner,\n command: f.example_code,\n });\n }\n\n // Usage patterns\n for (const u of recs.suggestions?.usage_patterns ?? []) {\n if (!u.copyable_prompt) continue;\n items.push({\n label: u.title,\n description: u.suggestion,\n command: u.copyable_prompt,\n });\n }\n\n // On the horizon\n for (const o of recs.on_the_horizon?.opportunities ?? []) {\n if (!o.copyable_prompt) continue;\n items.push({\n label: o.title,\n description: o.whats_possible,\n command: o.copyable_prompt,\n });\n }\n\n return items;\n}\n\n/** Format a prompt as a CLI command if it isn't one already. */\nfunction toCliCommand(prompt: string): string {\n const trimmed = prompt.trim();\n if (/^(claude|rulemetric|pnpm|npm|npx|git)\\s/.test(trimmed)) {\n return trimmed;\n }\n return `claude -p '${trimmed.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/** Copy text to system clipboard (best-effort). */\nfunction copyToClipboard(text: string): boolean {\n try {\n const { execSync } = require('node:child_process');\n if (process.platform === 'darwin') {\n execSync('pbcopy', { input: text, stdio: ['pipe', 'ignore', 'ignore'] });\n } else {\n execSync('xclip -selection clipboard', { input: text, stdio: ['pipe', 'ignore', 'ignore'] });\n }\n return true;\n } catch {\n return false;\n }\n}\n\nexport function InsightsPanel({ api, width, focused, onSelect }: {\n api: ApiInsights | null;\n width: number;\n focused?: boolean;\n onSelect?: (command: string) => void;\n}) {\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [copiedIdx, setCopiedIdx] = useState<number | null>(null);\n\n const suggestions = useMemo(() => api ? extractSuggestions(api) : [], [api]);\n\n const atAGlance = api?.recommendations?.at_a_glance as Record<string, string> | undefined;\n\n useInput((input, key) => {\n if (!focused || suggestions.length === 0) return;\n\n if (key.upArrow) {\n setSelectedIdx(i => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelectedIdx(i => Math.min(suggestions.length - 1, i + 1));\n } else if (key.return) {\n const item = suggestions[selectedIdx];\n if (item) {\n const cmd = toCliCommand(item.command);\n const copied = copyToClipboard(cmd);\n if (copied) {\n setCopiedIdx(selectedIdx);\n setTimeout(() => setCopiedIdx(null), 2000);\n }\n onSelect?.(cmd);\n }\n }\n });\n\n if (!api) {\n return (\n <Panel title=\"Insights\" color={ORANGE} width={width}>\n <Text dimColor>API offline \u2014 no insights</Text>\n </Panel>\n );\n }\n\n if (!atAGlance && suggestions.length === 0) {\n return (\n <Panel title=\"Insights\" color={ORANGE} width={width}>\n <Text dimColor>No recommendations yet. Run: rulemetric insights sync</Text>\n </Panel>\n );\n }\n\n const maxLabel = Math.min(30, Math.max(...suggestions.map(s => s.label.length), 10));\n const descWidth = Math.max(10, width - maxLabel - 12);\n\n return (\n <Panel title={focused ? '\u25B8 Insights & Suggestions' : 'Insights & Suggestions'} color={focused ? ORANGE : DIM} width={width}>\n {/* At a glance summary */}\n {atAGlance && Object.entries(atAGlance).length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {Object.entries(atAGlance).map(([key, value]) => (\n <Box key={key} flexDirection=\"column\">\n <Text color={DIM} bold>{key.replace(/_/g, ' ').toUpperCase()}</Text>\n <Text wrap=\"wrap\">{String(value).slice(0, 200)}</Text>\n </Box>\n ))}\n </Box>\n )}\n\n {/* Selectable suggestions */}\n {suggestions.length > 0 && (\n <Box flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={ORANGE} bold>Suggestions</Text>\n {focused && <Text dimColor> \u2191\u2193 navigate \u23CE copy command</Text>}\n </Box>\n {suggestions.map((s, i) => {\n const isSelected = focused && i === selectedIdx;\n const isCopied = i === copiedIdx;\n return (\n <Box key={i}>\n <Text color={isSelected ? ORANGE : DIM}>{isSelected ? '\u25B8 ' : ' '}</Text>\n <Text color={isSelected ? ORANGE : BLUE} bold={isSelected}>\n {fit(s.label, maxLabel)}\n </Text>\n <Text color={DIM}> \u2502 </Text>\n <Text color={isSelected ? undefined : DIM} wrap=\"truncate-end\">\n {fit(s.description, descWidth)}\n </Text>\n {isCopied && <Text color={GREEN}> \u2713 copied</Text>}\n </Box>\n );\n })}\n </Box>\n )}\n </Panel>\n );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA,SAAgB,UAAU,eAAe;AACzC,SAAS,KAAK,MAAM,gBAAgB;AAyG5B,cAsBI,YAtBJ;AAnGR,SAAS,mBAAmB,KAAgC;AAC1D,QAAM,OAAO,IAAI;AACjB,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,QAAsB,CAAC;AAG7B,aAAW,KAAK,KAAK,aAAa,mBAAmB,CAAC,GAAG;AACvD,QAAI,CAAC,EAAE,aAAc;AACrB,UAAM,KAAK;AAAA,MACT,OAAO,EAAE;AAAA,MACT,aAAa,EAAE,eAAe,EAAE;AAAA,MAChC,SAAS,EAAE;AAAA,IACb,CAAC;AAAA,EACH;AAGA,aAAW,KAAK,KAAK,aAAa,kBAAkB,CAAC,GAAG;AACtD,QAAI,CAAC,EAAE,gBAAiB;AACxB,UAAM,KAAK;AAAA,MACT,OAAO,EAAE;AAAA,MACT,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,IACb,CAAC;AAAA,EACH;AAGA,aAAW,KAAK,KAAK,gBAAgB,iBAAiB,CAAC,GAAG;AACxD,QAAI,CAAC,EAAE,gBAAiB;AACxB,UAAM,KAAK;AAAA,MACT,OAAO,EAAE;AAAA,MACT,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,QAAwB;AAC5C,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,0CAA0C,KAAK,OAAO,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,SAAO,cAAc,QAAQ,QAAQ,MAAM,OAAO,CAAC;AACrD;AAGA,SAAS,gBAAgB,MAAuB;AAC9C,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,UAAQ,oBAAoB;AACjD,QAAI,QAAQ,aAAa,UAAU;AACjC,eAAS,UAAU,EAAE,OAAO,MAAM,OAAO,CAAC,QAAQ,UAAU,QAAQ,EAAE,CAAC;AAAA,IACzE,OAAO;AACL,eAAS,8BAA8B,EAAE,OAAO,MAAM,OAAO,CAAC,QAAQ,UAAU,QAAQ,EAAE,CAAC;AAAA,IAC7F;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,EAAE,KAAK,OAAO,SAAS,SAAS,GAK3D;AACD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,CAAC;AAChD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAE9D,QAAM,cAAc,QAAQ,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAE3E,QAAM,YAAY,KAAK,iBAAiB;AAExC,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,CAAC,WAAW,YAAY,WAAW,EAAG;AAE1C,QAAI,IAAI,SAAS;AACf,qBAAe,OAAK,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,IACxC,WAAW,IAAI,WAAW;AACxB,qBAAe,OAAK,KAAK,IAAI,YAAY,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,IAC7D,WAAW,IAAI,QAAQ;AACrB,YAAM,OAAO,YAAY,WAAW;AACpC,UAAI,MAAM;AACR,cAAM,MAAM,aAAa,KAAK,OAAO;AACrC,cAAM,SAAS,gBAAgB,GAAG;AAClC,YAAI,QAAQ;AACV,uBAAa,WAAW;AACxB,qBAAW,MAAM,aAAa,IAAI,GAAG,GAAI;AAAA,QAC3C;AACA,mBAAW,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,CAAC,KAAK;AACR,WACE,oBAAC,SAAM,OAAM,YAAW,OAAO,QAAQ,OACrC,8BAAC,QAAK,UAAQ,MAAC,4CAAyB,GAC1C;AAAA,EAEJ;AAEA,MAAI,CAAC,aAAa,YAAY,WAAW,GAAG;AAC1C,WACE,oBAAC,SAAM,OAAM,YAAW,OAAO,QAAQ,OACrC,8BAAC,QAAK,UAAQ,MAAC,mEAAqD,GACtE;AAAA,EAEJ;AAEA,QAAM,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,YAAY,IAAI,OAAK,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC;AACnF,QAAM,YAAY,KAAK,IAAI,IAAI,QAAQ,WAAW,EAAE;AAEpD,SACE,qBAAC,SAAM,OAAO,UAAU,kCAA6B,0BAA0B,OAAO,UAAU,SAAS,KAAK,OAE3G;AAAA,iBAAa,OAAO,QAAQ,SAAS,EAAE,SAAS,KAC/C,oBAAC,OAAI,eAAc,UAAS,cAAc,GACvC,iBAAO,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MACzC,qBAAC,OAAc,eAAc,UAC3B;AAAA,0BAAC,QAAK,OAAO,KAAK,MAAI,MAAE,cAAI,QAAQ,MAAM,GAAG,EAAE,YAAY,GAAE;AAAA,MAC7D,oBAAC,QAAK,MAAK,QAAQ,iBAAO,KAAK,EAAE,MAAM,GAAG,GAAG,GAAE;AAAA,SAFvC,GAGV,CACD,GACH;AAAA,IAID,YAAY,SAAS,KACpB,qBAAC,OAAI,eAAc,UACjB;AAAA,2BAAC,OAAI,cAAc,GACjB;AAAA,4BAAC,QAAK,OAAO,QAAQ,MAAI,MAAC,yBAAW;AAAA,QACpC,WAAW,oBAAC,QAAK,UAAQ,MAAC,0DAA6B;AAAA,SAC1D;AAAA,MACC,YAAY,IAAI,CAAC,GAAG,MAAM;AACzB,cAAM,aAAa,WAAW,MAAM;AACpC,cAAM,WAAW,MAAM;AACvB,eACE,qBAAC,OACC;AAAA,8BAAC,QAAK,OAAO,aAAa,SAAS,KAAM,uBAAa,YAAO,MAAK;AAAA,UAClE,oBAAC,QAAK,OAAO,aAAa,SAAS,MAAM,MAAM,YAC5C,cAAI,EAAE,OAAO,QAAQ,GACxB;AAAA,UACA,oBAAC,QAAK,OAAO,KAAK,sBAAG;AAAA,UACrB,oBAAC,QAAK,OAAO,aAAa,SAAY,KAAK,MAAK,gBAC7C,cAAI,EAAE,aAAa,SAAS,GAC/B;AAAA,UACC,YAAY,oBAAC,QAAK,OAAO,OAAO,4BAAS;AAAA,aATlC,CAUV;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,KAEJ;AAEJ;",
6
+ "names": []
7
+ }