@rulemetric/cli 0.7.3 → 0.7.4

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 (547) hide show
  1. package/dist/base-command.js +1 -14
  2. package/dist/chunk-2TC6WCUT.js +34 -0
  3. package/dist/chunk-2UC3ULIG.js +1 -0
  4. package/dist/chunk-3AV3GTMP.js +1 -0
  5. package/dist/chunk-4Z5ECCJE.js +1 -0
  6. package/dist/chunk-5RBLIVBF.js +1 -0
  7. package/dist/chunk-67QCYUJU.js +1 -0
  8. package/dist/chunk-6QKI756T.js +2 -0
  9. package/dist/chunk-6V4WM73L.js +1 -0
  10. package/dist/chunk-6XEC6474.js +1 -0
  11. package/dist/chunk-72XLQE3X.js +2 -0
  12. package/dist/chunk-7DFNBRLY.js +61 -0
  13. package/dist/chunk-7XQ4VPLC.js +2 -0
  14. package/dist/chunk-AHRHCERJ.js +1 -0
  15. package/dist/chunk-ARNZQBMX.js +1 -0
  16. package/dist/chunk-CADKBP3D.js +58 -0
  17. package/dist/chunk-CDI5CCHU.js +1 -0
  18. package/dist/chunk-CNQ5DTNC.js +1 -0
  19. package/dist/chunk-CRAKDQ4H.js +1 -0
  20. package/dist/chunk-DNF4HDI6.js +14 -0
  21. package/dist/chunk-DSO2U4Y6.js +56 -0
  22. package/dist/chunk-DT4GKEP5.js +5 -0
  23. package/dist/chunk-DVN7GFJG.js +1 -0
  24. package/dist/chunk-E4SFUPYR.js +15 -0
  25. package/dist/chunk-EUHNCVJQ.js +33 -0
  26. package/dist/chunk-F2VP4B4J.js +1 -0
  27. package/dist/chunk-FEHM5OKW.js +1 -0
  28. package/dist/chunk-FHVBTDBM.js +69 -0
  29. package/dist/chunk-GBMF3TP6.js +1 -0
  30. package/dist/chunk-GY5IJ4RS.js +1 -0
  31. package/dist/chunk-HOHD5HY2.js +5 -0
  32. package/dist/chunk-HP2BUPGS.js +24 -0
  33. package/dist/{chunk-OQBBVTDG.js → chunk-I2DZGJRR.js} +6 -71
  34. package/dist/chunk-I4YJ7NTX.js +1 -0
  35. package/dist/chunk-IY5NXR3N.js +1 -0
  36. package/dist/chunk-IZTIYR5Q.js +2 -0
  37. package/dist/chunk-KKDHD4XA.js +2 -0
  38. package/dist/chunk-LQRYQE6Q.js +4 -0
  39. package/dist/chunk-M6AJDVCL.js +5 -0
  40. package/dist/chunk-MGHFDHHM.js +1 -0
  41. package/dist/chunk-ML36XQW7.js +1 -0
  42. package/dist/chunk-MODXEGCU.js +1 -0
  43. package/dist/chunk-MVM6OGAF.js +4 -0
  44. package/dist/chunk-N7ODX6PO.js +1 -0
  45. package/dist/chunk-NBTC5FNV.js +1 -0
  46. package/dist/chunk-NJ5UED3H.js +1 -0
  47. package/dist/chunk-NVKX36YN.js +3 -0
  48. package/dist/chunk-NVOTOQBA.js +1 -0
  49. package/dist/chunk-O7ZMHCMG.js +31 -0
  50. package/dist/chunk-OMXUK4M6.js +1 -0
  51. package/dist/chunk-PZS2KOU7.js +1 -0
  52. package/dist/chunk-RSKQRVPJ.js +1 -0
  53. package/dist/chunk-RTEATXTP.js +1 -0
  54. package/dist/chunk-RTWRHIKY.js +7 -0
  55. package/dist/chunk-RVO4HV3M.js +1 -0
  56. package/dist/chunk-SBILN45P.js +1 -0
  57. package/dist/chunk-SZ62CP55.js +1 -0
  58. package/dist/chunk-T3W5N3BP.js +2 -0
  59. package/dist/chunk-TDD7IOV2.js +1 -0
  60. package/dist/chunk-TIQ7DQ3M.js +1 -0
  61. package/dist/chunk-TU2AR6XO.js +1 -0
  62. package/dist/chunk-UF6US7VU.js +1 -0
  63. package/dist/chunk-V5QFOF4F.js +9 -0
  64. package/dist/chunk-V5U3E4BZ.js +1 -0
  65. package/dist/chunk-VAFAH6QL.js +1 -0
  66. package/dist/chunk-VMWY7KHH.js +1 -0
  67. package/dist/chunk-VUGRXM7R.js +1 -0
  68. package/dist/{chunk-XZXS2W24.js → chunk-VWEXKDWG.js} +10 -56
  69. package/dist/chunk-W2MV25SB.js +1 -0
  70. package/dist/chunk-WJ3H73G6.js +1 -0
  71. package/dist/chunk-WJUQBMTF.js +9 -0
  72. package/dist/chunk-WLVQJH4E.js +1 -0
  73. package/dist/chunk-WPJ2BND4.js +1 -0
  74. package/dist/chunk-WSCK4WNK.js +1 -0
  75. package/dist/chunk-Y65CSJFF.js +3 -0
  76. package/dist/chunk-ZL4MZMUK.js +34 -0
  77. package/dist/chunk-ZLLER3HP.js +1 -0
  78. package/dist/chunk-ZXF5NE54.js +1 -0
  79. package/dist/commands/antigravity/backfill.js +2 -136
  80. package/dist/commands/auth/create-key.js +1 -52
  81. package/dist/commands/auth/login.js +1 -85
  82. package/dist/commands/auth/logout.js +1 -29
  83. package/dist/commands/auth/revoke-key.js +1 -33
  84. package/dist/commands/auth/signup.js +1 -89
  85. package/dist/commands/auth/status.js +1 -42
  86. package/dist/commands/catalog/index.js +2 -52
  87. package/dist/commands/catalog/recommend.js +3 -43
  88. package/dist/commands/convert.js +1 -75
  89. package/dist/commands/converters.js +1 -54
  90. package/dist/commands/crons/list.js +1 -41
  91. package/dist/commands/crons/run.js +2 -76
  92. package/dist/commands/dashboard.js +1 -46
  93. package/dist/commands/diagnostics.js +1 -117
  94. package/dist/commands/eval-targets/create.js +1 -53
  95. package/dist/commands/eval-targets/list.js +1 -54
  96. package/dist/commands/evals/agent.js +3 -310
  97. package/dist/commands/evals/benchmark.js +6 -73
  98. package/dist/commands/evals/compare.js +13 -96
  99. package/dist/commands/evals/create.js +1 -67
  100. package/dist/commands/evals/optimize-description.js +25 -239
  101. package/dist/commands/evals/optimize.js +5 -211
  102. package/dist/commands/evals/run.js +3 -183
  103. package/dist/commands/gateway/ensure.js +1 -104
  104. package/dist/commands/hooks/emit-instructions.js +1 -25
  105. package/dist/commands/hooks/install.js +1 -442
  106. package/dist/commands/hooks/run.js +3 -81
  107. package/dist/commands/hooks/uninstall.js +2 -156
  108. package/dist/commands/import.js +1 -66
  109. package/dist/commands/instructions/create.js +1 -74
  110. package/dist/commands/instructions/delete.js +1 -55
  111. package/dist/commands/instructions/fork.js +1 -34
  112. package/dist/commands/instructions/get.js +1 -68
  113. package/dist/commands/instructions/list.js +1 -65
  114. package/dist/commands/instructions/promote.js +1 -42
  115. package/dist/commands/instructions/pull.js +1 -39
  116. package/dist/commands/instructions/upstream.js +1 -38
  117. package/dist/commands/instructions/versions.js +1 -53
  118. package/dist/commands/launcher.js +1 -40
  119. package/dist/commands/org/current.js +1 -77
  120. package/dist/commands/org/list.js +1 -52
  121. package/dist/commands/org/switch.js +1 -71
  122. package/dist/commands/packs/add-instruction.js +1 -37
  123. package/dist/commands/packs/apply.js +1 -39
  124. package/dist/commands/packs/create.js +1 -50
  125. package/dist/commands/packs/fork.js +1 -34
  126. package/dist/commands/packs/get.js +3 -56
  127. package/dist/commands/packs/list.js +1 -66
  128. package/dist/commands/packs/remove-instruction.js +1 -35
  129. package/dist/commands/proxy/env.js +3 -131
  130. package/dist/commands/proxy/logs.js +3 -85
  131. package/dist/commands/proxy/restart.js +1 -35
  132. package/dist/commands/proxy/setup.js +15 -454
  133. package/dist/commands/proxy/start.js +10 -333
  134. package/dist/commands/proxy/status.js +1 -78
  135. package/dist/commands/proxy/stop.js +1 -94
  136. package/dist/commands/research/backfill.js +1 -59
  137. package/dist/commands/research/tail-transcript.js +1 -70
  138. package/dist/commands/service/install.js +57 -796
  139. package/dist/commands/service/status.js +1 -180
  140. package/dist/commands/service/uninstall.js +1 -119
  141. package/dist/commands/sessions/analyze.js +3 -48
  142. package/dist/commands/sessions/end.js +2 -85
  143. package/dist/commands/sessions/import.js +1 -46
  144. package/dist/commands/sessions/list.js +1 -48
  145. package/dist/commands/sessions/start.js +3 -90
  146. package/dist/commands/setup.js +3 -150
  147. package/dist/commands/skills/export-approved.js +1 -46
  148. package/dist/commands/skills/install.js +4 -107
  149. package/dist/commands/skills/list.js +4 -65
  150. package/dist/commands/skills/publish.js +2 -98
  151. package/dist/commands/skills/search.js +3 -72
  152. package/dist/commands/skills/update.js +3 -55
  153. package/dist/commands/suggestions/accept.js +8 -84
  154. package/dist/commands/suggestions/dismiss.js +1 -45
  155. package/dist/commands/suggestions/list.js +1 -61
  156. package/dist/commands/suggestions/refresh.js +1 -27
  157. package/dist/cursor-T7AMCMKS.js +13 -0
  158. package/dist/dashboard/Dashboard.js +1 -243
  159. package/dist/dashboard/data.js +1 -15
  160. package/dist/dashboard/launcher/ActiveJobsList.js +1 -10
  161. package/dist/dashboard/launcher/LauncherOverlay.js +1 -16
  162. package/dist/dashboard/launcher/NewLaunchForm.js +1 -10
  163. package/dist/dashboard/launcher/api.js +1 -16
  164. package/dist/dashboard/launcher/tool-labels.js +1 -10
  165. package/dist/dashboard/launcher/types.js +0 -1
  166. package/dist/dashboard/launcher/useLaunchJobs.js +1 -11
  167. package/dist/dashboard/panels/friction.js +1 -10
  168. package/dist/dashboard/panels/insights.js +1 -10
  169. package/dist/dashboard/panels/instructions.js +1 -10
  170. package/dist/dashboard/panels/outcomes.js +1 -10
  171. package/dist/dashboard/panels/overview.js +1 -10
  172. package/dist/dashboard/panels/shared.js +1 -19
  173. package/dist/dashboard/types.js +1 -24
  174. package/dist/dist-FAVALJ5C.js +1 -0
  175. package/dist/index.js +1 -8
  176. package/dist/lib/active-org-refresh.js +1 -15
  177. package/dist/lib/active-org.js +1 -16
  178. package/dist/lib/agent-loop.js +1 -47
  179. package/dist/lib/antigravity-transcript.js +1 -22
  180. package/dist/lib/api-client.js +1 -23
  181. package/dist/lib/auth.js +1 -30
  182. package/dist/lib/capture-hosts.js +1 -8
  183. package/dist/lib/detect-languages.js +1 -8
  184. package/dist/lib/detect-tmux.js +1 -9
  185. package/dist/lib/diagnostics.js +1 -12
  186. package/dist/lib/editor-proxy-pins.js +1 -14
  187. package/dist/lib/ensure-api-key.js +1 -11
  188. package/dist/lib/eval-analyzer.js +1 -9
  189. package/dist/lib/eval-benchmark.js +1 -12
  190. package/dist/lib/eval-conversation-handler.js +1 -13
  191. package/dist/lib/eval-executor.js +1 -8
  192. package/dist/lib/eval-grader.js +1 -9
  193. package/dist/lib/eval-meta-judge.js +1 -9
  194. package/dist/lib/eval-trigger-tester.js +1 -11
  195. package/dist/lib/eval-worktree.js +1 -8
  196. package/dist/lib/gateway-entry.js +1 -61
  197. package/dist/lib/gateway-identity.js +1 -16
  198. package/dist/lib/gateway-lifecycle.js +1 -32
  199. package/dist/lib/gateway.js +1 -14
  200. package/dist/lib/handlers/cron-refresh-pricing.js +1 -0
  201. package/dist/lib/handlers/cron-refresh-skills.js +1 -8
  202. package/dist/lib/handlers/cron-suggest-instructions.js +1 -16
  203. package/dist/lib/handlers/process-announcement.js +1 -11
  204. package/dist/lib/handlers/process-changelog.js +1 -11
  205. package/dist/lib/handlers/process-conversation.js +1 -14
  206. package/dist/lib/handlers/process-eval.js +1 -15
  207. package/dist/lib/handlers/process-insights.js +1 -15
  208. package/dist/lib/handlers/process-launch.js +1 -16
  209. package/dist/lib/handlers/process-run-cleanup.js +1 -13
  210. package/dist/lib/handlers/process-send-message.js +1 -10
  211. package/dist/lib/handlers/process-session-goal.js +1 -12
  212. package/dist/lib/hooks-config.js +1 -81
  213. package/dist/lib/insights-prompts.js +1 -12
  214. package/dist/lib/instruction-snapshot.js +1 -8
  215. package/dist/lib/job-helpers.js +0 -1
  216. package/dist/lib/llm-client.js +1 -20
  217. package/dist/lib/manual-tasks-meta.js +1 -8
  218. package/dist/lib/manual-tasks.js +1 -80
  219. package/dist/lib/output.js +1 -12
  220. package/dist/lib/permanent-job-error.js +1 -10
  221. package/dist/lib/pid-identity.js +1 -14
  222. package/dist/lib/proxy-respawn.js +1 -12
  223. package/dist/lib/research-client.js +1 -12
  224. package/dist/lib/setup-steps.js +1 -33
  225. package/dist/lib/skills-loader.js +1 -8
  226. package/dist/lib/statusline-shim.js +1 -20
  227. package/dist/lib/telemetry.js +1 -16
  228. package/dist/lib/terminal-target-heartbeat.js +1 -15
  229. package/dist/lib/tmux.js +1 -16
  230. package/dist/lib/transcript-rate-limit-watcher.js +1 -22
  231. package/dist/lib/types.js +1 -8
  232. package/dist/lib/version-check.js +1 -12
  233. package/dist/lib/which.js +1 -8
  234. package/dist/lib/worktree.js +1 -17
  235. package/dist/opencode-QRJ3BH23.js +1 -0
  236. package/oclif.manifest.json +135 -135
  237. package/package.json +9 -8
  238. package/dist/base-command.js.map +0 -7
  239. package/dist/chunk-2HK7RGZB.js +0 -82
  240. package/dist/chunk-2HK7RGZB.js.map +0 -7
  241. package/dist/chunk-2ORJWTNZ.js +0 -307
  242. package/dist/chunk-2ORJWTNZ.js.map +0 -7
  243. package/dist/chunk-37LN5O7M.js +0 -59
  244. package/dist/chunk-37LN5O7M.js.map +0 -7
  245. package/dist/chunk-3S7223UR.js +0 -81
  246. package/dist/chunk-3S7223UR.js.map +0 -7
  247. package/dist/chunk-3TIMQ3O6.js +0 -96
  248. package/dist/chunk-3TIMQ3O6.js.map +0 -7
  249. package/dist/chunk-42GFSAJP.js +0 -32
  250. package/dist/chunk-42GFSAJP.js.map +0 -7
  251. package/dist/chunk-4BHDHHKL.js +0 -48
  252. package/dist/chunk-4BHDHHKL.js.map +0 -7
  253. package/dist/chunk-4D537GXE.js +0 -99
  254. package/dist/chunk-4D537GXE.js.map +0 -7
  255. package/dist/chunk-4LYCDS2N.js +0 -139
  256. package/dist/chunk-4LYCDS2N.js.map +0 -7
  257. package/dist/chunk-4SCZK7AL.js +0 -129
  258. package/dist/chunk-4SCZK7AL.js.map +0 -7
  259. package/dist/chunk-4XAWK6S2.js +0 -161
  260. package/dist/chunk-4XAWK6S2.js.map +0 -7
  261. package/dist/chunk-52WIYRZH.js +0 -73
  262. package/dist/chunk-52WIYRZH.js.map +0 -7
  263. package/dist/chunk-5BAOGNUH.js +0 -79
  264. package/dist/chunk-5BAOGNUH.js.map +0 -7
  265. package/dist/chunk-5EDMGK3W.js +0 -39
  266. package/dist/chunk-5EDMGK3W.js.map +0 -7
  267. package/dist/chunk-6NBS5XFS.js +0 -99
  268. package/dist/chunk-6NBS5XFS.js.map +0 -7
  269. package/dist/chunk-7LVVKQMZ.js +0 -98
  270. package/dist/chunk-7LVVKQMZ.js.map +0 -7
  271. package/dist/chunk-7NNFYWKK.js +0 -243
  272. package/dist/chunk-7NNFYWKK.js.map +0 -7
  273. package/dist/chunk-7NYKWN7U.js +0 -12
  274. package/dist/chunk-7NYKWN7U.js.map +0 -7
  275. package/dist/chunk-BO76WKJR.js +0 -42
  276. package/dist/chunk-BO76WKJR.js.map +0 -7
  277. package/dist/chunk-BRD5RUGM.js +0 -53
  278. package/dist/chunk-BRD5RUGM.js.map +0 -7
  279. package/dist/chunk-BT6Z6545.js +0 -43
  280. package/dist/chunk-BT6Z6545.js.map +0 -7
  281. package/dist/chunk-BZDKEQKU.js +0 -39
  282. package/dist/chunk-BZDKEQKU.js.map +0 -7
  283. package/dist/chunk-DGHWRQXL.js +0 -17
  284. package/dist/chunk-DGHWRQXL.js.map +0 -7
  285. package/dist/chunk-DIQUV5FR.js +0 -257
  286. package/dist/chunk-DIQUV5FR.js.map +0 -7
  287. package/dist/chunk-DMX5YOTM.js +0 -167
  288. package/dist/chunk-DMX5YOTM.js.map +0 -7
  289. package/dist/chunk-DNKSVWMD.js +0 -108
  290. package/dist/chunk-DNKSVWMD.js.map +0 -7
  291. package/dist/chunk-DQ3KELXD.js +0 -74
  292. package/dist/chunk-DQ3KELXD.js.map +0 -7
  293. package/dist/chunk-DUJSRBLP.js +0 -122
  294. package/dist/chunk-DUJSRBLP.js.map +0 -7
  295. package/dist/chunk-E3BIT53W.js +0 -154
  296. package/dist/chunk-E3BIT53W.js.map +0 -7
  297. package/dist/chunk-EARWG4EV.js +0 -22
  298. package/dist/chunk-EARWG4EV.js.map +0 -7
  299. package/dist/chunk-EI5BHWXA.js +0 -1662
  300. package/dist/chunk-EI5BHWXA.js.map +0 -7
  301. package/dist/chunk-EJ3YAFDP.js +0 -37
  302. package/dist/chunk-EJ3YAFDP.js.map +0 -7
  303. package/dist/chunk-EKJ2CABV.js +0 -76
  304. package/dist/chunk-EKJ2CABV.js.map +0 -7
  305. package/dist/chunk-EKP32DLN.js +0 -16
  306. package/dist/chunk-EKP32DLN.js.map +0 -7
  307. package/dist/chunk-EYPAAGN5.js +0 -51
  308. package/dist/chunk-EYPAAGN5.js.map +0 -7
  309. package/dist/chunk-F5N6CLJJ.js +0 -1995
  310. package/dist/chunk-F5N6CLJJ.js.map +0 -7
  311. package/dist/chunk-GIUBARWS.js +0 -99
  312. package/dist/chunk-GIUBARWS.js.map +0 -7
  313. package/dist/chunk-GQNJO2P2.js +0 -102
  314. package/dist/chunk-GQNJO2P2.js.map +0 -7
  315. package/dist/chunk-IJGF2ETG.js +0 -68
  316. package/dist/chunk-IJGF2ETG.js.map +0 -7
  317. package/dist/chunk-ILYDELUE.js +0 -46
  318. package/dist/chunk-ILYDELUE.js.map +0 -7
  319. package/dist/chunk-J6QFW4LD.js +0 -55
  320. package/dist/chunk-J6QFW4LD.js.map +0 -7
  321. package/dist/chunk-J7N3DLH6.js +0 -117
  322. package/dist/chunk-J7N3DLH6.js.map +0 -7
  323. package/dist/chunk-JFDWKLQC.js +0 -23
  324. package/dist/chunk-JFDWKLQC.js.map +0 -7
  325. package/dist/chunk-JULOLTZS.js +0 -61
  326. package/dist/chunk-JULOLTZS.js.map +0 -7
  327. package/dist/chunk-KJKBDQ4D.js +0 -220
  328. package/dist/chunk-KJKBDQ4D.js.map +0 -7
  329. package/dist/chunk-KRBQLMOP.js +0 -41
  330. package/dist/chunk-KRBQLMOP.js.map +0 -7
  331. package/dist/chunk-LXKPNATC.js +0 -624
  332. package/dist/chunk-LXKPNATC.js.map +0 -7
  333. package/dist/chunk-NSBPE2FW.js +0 -17
  334. package/dist/chunk-NSBPE2FW.js.map +0 -7
  335. package/dist/chunk-OCKHW72U.js +0 -55
  336. package/dist/chunk-OCKHW72U.js.map +0 -7
  337. package/dist/chunk-OKWCKCPE.js +0 -414
  338. package/dist/chunk-OKWCKCPE.js.map +0 -7
  339. package/dist/chunk-OO7JDFS4.js +0 -157
  340. package/dist/chunk-OO7JDFS4.js.map +0 -7
  341. package/dist/chunk-OQBBVTDG.js.map +0 -7
  342. package/dist/chunk-OQSQC7VB.js +0 -77
  343. package/dist/chunk-OQSQC7VB.js.map +0 -7
  344. package/dist/chunk-PED7L5GX.js +0 -92
  345. package/dist/chunk-PED7L5GX.js.map +0 -7
  346. package/dist/chunk-QJQS6TUN.js +0 -44
  347. package/dist/chunk-QJQS6TUN.js.map +0 -7
  348. package/dist/chunk-QN34TGD3.js +0 -83
  349. package/dist/chunk-QN34TGD3.js.map +0 -7
  350. package/dist/chunk-QSN77T7C.js +0 -250
  351. package/dist/chunk-QSN77T7C.js.map +0 -7
  352. package/dist/chunk-R56PH7YE.js +0 -78
  353. package/dist/chunk-R56PH7YE.js.map +0 -7
  354. package/dist/chunk-RAXRZYOB.js +0 -299
  355. package/dist/chunk-RAXRZYOB.js.map +0 -7
  356. package/dist/chunk-RH7NHVSK.js +0 -16
  357. package/dist/chunk-RH7NHVSK.js.map +0 -7
  358. package/dist/chunk-RMTT4KDY.js +0 -191
  359. package/dist/chunk-RMTT4KDY.js.map +0 -7
  360. package/dist/chunk-RQ2TMLKG.js +0 -142
  361. package/dist/chunk-RQ2TMLKG.js.map +0 -7
  362. package/dist/chunk-SO3T35U7.js +0 -80
  363. package/dist/chunk-SO3T35U7.js.map +0 -7
  364. package/dist/chunk-UKMLICWS.js +0 -51
  365. package/dist/chunk-UKMLICWS.js.map +0 -7
  366. package/dist/chunk-VA5FFOS7.js +0 -243
  367. package/dist/chunk-VA5FFOS7.js.map +0 -7
  368. package/dist/chunk-W2YERO7E.js +0 -170
  369. package/dist/chunk-W2YERO7E.js.map +0 -7
  370. package/dist/chunk-W53GKIZQ.js +0 -50
  371. package/dist/chunk-W53GKIZQ.js.map +0 -7
  372. package/dist/chunk-WA4MWYRW.js +0 -254
  373. package/dist/chunk-WA4MWYRW.js.map +0 -7
  374. package/dist/chunk-XC6M4CSW.js +0 -44
  375. package/dist/chunk-XC6M4CSW.js.map +0 -7
  376. package/dist/chunk-XK42ZBDE.js +0 -23
  377. package/dist/chunk-XK42ZBDE.js.map +0 -7
  378. package/dist/chunk-XUV6DDBF.js +0 -124
  379. package/dist/chunk-XUV6DDBF.js.map +0 -7
  380. package/dist/chunk-XZXS2W24.js.map +0 -7
  381. package/dist/chunk-Y3WD5CSW.js +0 -49
  382. package/dist/chunk-Y3WD5CSW.js.map +0 -7
  383. package/dist/chunk-Y4BJXXYV.js +0 -148
  384. package/dist/chunk-Y4BJXXYV.js.map +0 -7
  385. package/dist/chunk-YNIH3KMU.js +0 -121
  386. package/dist/chunk-YNIH3KMU.js.map +0 -7
  387. package/dist/chunk-ZUJBM6HE.js +0 -125
  388. package/dist/chunk-ZUJBM6HE.js.map +0 -7
  389. package/dist/commands/antigravity/backfill.js.map +0 -7
  390. package/dist/commands/auth/create-key.js.map +0 -7
  391. package/dist/commands/auth/login.js.map +0 -7
  392. package/dist/commands/auth/logout.js.map +0 -7
  393. package/dist/commands/auth/revoke-key.js.map +0 -7
  394. package/dist/commands/auth/signup.js.map +0 -7
  395. package/dist/commands/auth/status.js.map +0 -7
  396. package/dist/commands/catalog/index.js.map +0 -7
  397. package/dist/commands/catalog/recommend.js.map +0 -7
  398. package/dist/commands/convert.js.map +0 -7
  399. package/dist/commands/converters.js.map +0 -7
  400. package/dist/commands/crons/list.js.map +0 -7
  401. package/dist/commands/crons/run.js.map +0 -7
  402. package/dist/commands/dashboard.js.map +0 -7
  403. package/dist/commands/diagnostics.js.map +0 -7
  404. package/dist/commands/eval-targets/create.js.map +0 -7
  405. package/dist/commands/eval-targets/list.js.map +0 -7
  406. package/dist/commands/evals/agent.js.map +0 -7
  407. package/dist/commands/evals/benchmark.js.map +0 -7
  408. package/dist/commands/evals/compare.js.map +0 -7
  409. package/dist/commands/evals/create.js.map +0 -7
  410. package/dist/commands/evals/optimize-description.js.map +0 -7
  411. package/dist/commands/evals/optimize.js.map +0 -7
  412. package/dist/commands/evals/run.js.map +0 -7
  413. package/dist/commands/gateway/ensure.js.map +0 -7
  414. package/dist/commands/hooks/emit-instructions.js.map +0 -7
  415. package/dist/commands/hooks/install.js.map +0 -7
  416. package/dist/commands/hooks/run.js.map +0 -7
  417. package/dist/commands/hooks/uninstall.js.map +0 -7
  418. package/dist/commands/import.js.map +0 -7
  419. package/dist/commands/instructions/create.js.map +0 -7
  420. package/dist/commands/instructions/delete.js.map +0 -7
  421. package/dist/commands/instructions/fork.js.map +0 -7
  422. package/dist/commands/instructions/get.js.map +0 -7
  423. package/dist/commands/instructions/list.js.map +0 -7
  424. package/dist/commands/instructions/promote.js.map +0 -7
  425. package/dist/commands/instructions/pull.js.map +0 -7
  426. package/dist/commands/instructions/upstream.js.map +0 -7
  427. package/dist/commands/instructions/versions.js.map +0 -7
  428. package/dist/commands/launcher.js.map +0 -7
  429. package/dist/commands/org/current.js.map +0 -7
  430. package/dist/commands/org/list.js.map +0 -7
  431. package/dist/commands/org/switch.js.map +0 -7
  432. package/dist/commands/packs/add-instruction.js.map +0 -7
  433. package/dist/commands/packs/apply.js.map +0 -7
  434. package/dist/commands/packs/create.js.map +0 -7
  435. package/dist/commands/packs/fork.js.map +0 -7
  436. package/dist/commands/packs/get.js.map +0 -7
  437. package/dist/commands/packs/list.js.map +0 -7
  438. package/dist/commands/packs/remove-instruction.js.map +0 -7
  439. package/dist/commands/proxy/env.js.map +0 -7
  440. package/dist/commands/proxy/logs.js.map +0 -7
  441. package/dist/commands/proxy/restart.js.map +0 -7
  442. package/dist/commands/proxy/setup.js.map +0 -7
  443. package/dist/commands/proxy/start.js.map +0 -7
  444. package/dist/commands/proxy/status.js.map +0 -7
  445. package/dist/commands/proxy/stop.js.map +0 -7
  446. package/dist/commands/research/backfill.js.map +0 -7
  447. package/dist/commands/research/tail-transcript.js.map +0 -7
  448. package/dist/commands/service/install.js.map +0 -7
  449. package/dist/commands/service/status.js.map +0 -7
  450. package/dist/commands/service/uninstall.js.map +0 -7
  451. package/dist/commands/sessions/analyze.js.map +0 -7
  452. package/dist/commands/sessions/end.js.map +0 -7
  453. package/dist/commands/sessions/import.js.map +0 -7
  454. package/dist/commands/sessions/list.js.map +0 -7
  455. package/dist/commands/sessions/start.js.map +0 -7
  456. package/dist/commands/setup.js.map +0 -7
  457. package/dist/commands/skills/export-approved.js.map +0 -7
  458. package/dist/commands/skills/install.js.map +0 -7
  459. package/dist/commands/skills/list.js.map +0 -7
  460. package/dist/commands/skills/publish.js.map +0 -7
  461. package/dist/commands/skills/search.js.map +0 -7
  462. package/dist/commands/skills/update.js.map +0 -7
  463. package/dist/commands/suggestions/accept.js.map +0 -7
  464. package/dist/commands/suggestions/dismiss.js.map +0 -7
  465. package/dist/commands/suggestions/list.js.map +0 -7
  466. package/dist/commands/suggestions/refresh.js.map +0 -7
  467. package/dist/cursor-BGQJ4CWI.js +0 -134
  468. package/dist/cursor-BGQJ4CWI.js.map +0 -7
  469. package/dist/dashboard/Dashboard.js.map +0 -7
  470. package/dist/dashboard/data.js.map +0 -7
  471. package/dist/dashboard/launcher/ActiveJobsList.js.map +0 -7
  472. package/dist/dashboard/launcher/LauncherOverlay.js.map +0 -7
  473. package/dist/dashboard/launcher/NewLaunchForm.js.map +0 -7
  474. package/dist/dashboard/launcher/api.js.map +0 -7
  475. package/dist/dashboard/launcher/tool-labels.js.map +0 -7
  476. package/dist/dashboard/launcher/types.js.map +0 -7
  477. package/dist/dashboard/launcher/useLaunchJobs.js.map +0 -7
  478. package/dist/dashboard/panels/friction.js.map +0 -7
  479. package/dist/dashboard/panels/insights.js.map +0 -7
  480. package/dist/dashboard/panels/instructions.js.map +0 -7
  481. package/dist/dashboard/panels/outcomes.js.map +0 -7
  482. package/dist/dashboard/panels/overview.js.map +0 -7
  483. package/dist/dashboard/panels/shared.js.map +0 -7
  484. package/dist/dashboard/types.js.map +0 -7
  485. package/dist/dist-UNYP5PJR.js +0 -56
  486. package/dist/dist-UNYP5PJR.js.map +0 -7
  487. package/dist/index.js.map +0 -7
  488. package/dist/lib/active-org-refresh.js.map +0 -7
  489. package/dist/lib/active-org.js.map +0 -7
  490. package/dist/lib/agent-loop.js.map +0 -7
  491. package/dist/lib/antigravity-transcript.js.map +0 -7
  492. package/dist/lib/api-client.js.map +0 -7
  493. package/dist/lib/auth.js.map +0 -7
  494. package/dist/lib/capture-hosts.js.map +0 -7
  495. package/dist/lib/detect-languages.js.map +0 -7
  496. package/dist/lib/detect-tmux.js.map +0 -7
  497. package/dist/lib/diagnostics.js.map +0 -7
  498. package/dist/lib/editor-proxy-pins.js.map +0 -7
  499. package/dist/lib/ensure-api-key.js.map +0 -7
  500. package/dist/lib/eval-analyzer.js.map +0 -7
  501. package/dist/lib/eval-benchmark.js.map +0 -7
  502. package/dist/lib/eval-conversation-handler.js.map +0 -7
  503. package/dist/lib/eval-executor.js.map +0 -7
  504. package/dist/lib/eval-grader.js.map +0 -7
  505. package/dist/lib/eval-meta-judge.js.map +0 -7
  506. package/dist/lib/eval-trigger-tester.js.map +0 -7
  507. package/dist/lib/eval-worktree.js.map +0 -7
  508. package/dist/lib/gateway-entry.js.map +0 -7
  509. package/dist/lib/gateway-identity.js.map +0 -7
  510. package/dist/lib/gateway-lifecycle.js.map +0 -7
  511. package/dist/lib/gateway.js.map +0 -7
  512. package/dist/lib/handlers/cron-refresh-skills.js.map +0 -7
  513. package/dist/lib/handlers/cron-suggest-instructions.js.map +0 -7
  514. package/dist/lib/handlers/process-announcement.js.map +0 -7
  515. package/dist/lib/handlers/process-changelog.js.map +0 -7
  516. package/dist/lib/handlers/process-conversation.js.map +0 -7
  517. package/dist/lib/handlers/process-eval.js.map +0 -7
  518. package/dist/lib/handlers/process-insights.js.map +0 -7
  519. package/dist/lib/handlers/process-launch.js.map +0 -7
  520. package/dist/lib/handlers/process-run-cleanup.js.map +0 -7
  521. package/dist/lib/handlers/process-send-message.js.map +0 -7
  522. package/dist/lib/handlers/process-session-goal.js.map +0 -7
  523. package/dist/lib/hooks-config.js.map +0 -7
  524. package/dist/lib/insights-prompts.js.map +0 -7
  525. package/dist/lib/instruction-snapshot.js.map +0 -7
  526. package/dist/lib/job-helpers.js.map +0 -7
  527. package/dist/lib/llm-client.js.map +0 -7
  528. package/dist/lib/manual-tasks-meta.js.map +0 -7
  529. package/dist/lib/manual-tasks.js.map +0 -7
  530. package/dist/lib/output.js.map +0 -7
  531. package/dist/lib/permanent-job-error.js.map +0 -7
  532. package/dist/lib/pid-identity.js.map +0 -7
  533. package/dist/lib/proxy-respawn.js.map +0 -7
  534. package/dist/lib/research-client.js.map +0 -7
  535. package/dist/lib/setup-steps.js.map +0 -7
  536. package/dist/lib/skills-loader.js.map +0 -7
  537. package/dist/lib/statusline-shim.js.map +0 -7
  538. package/dist/lib/telemetry.js.map +0 -7
  539. package/dist/lib/terminal-target-heartbeat.js.map +0 -7
  540. package/dist/lib/tmux.js.map +0 -7
  541. package/dist/lib/transcript-rate-limit-watcher.js.map +0 -7
  542. package/dist/lib/types.js.map +0 -7
  543. package/dist/lib/version-check.js.map +0 -7
  544. package/dist/lib/which.js.map +0 -7
  545. package/dist/lib/worktree.js.map +0 -7
  546. package/dist/opencode-IQ7X5YMJ.js +0 -190
  547. package/dist/opencode-IQ7X5YMJ.js.map +0 -7
@@ -1,32 +0,0 @@
1
- // src/lib/which.ts
2
- import { existsSync } from "node:fs";
3
- import { homedir } from "node:os";
4
- import { join, delimiter } from "node:path";
5
- function wellKnownBinDirs(platform, home) {
6
- if (platform === "darwin") {
7
- return ["/opt/homebrew/bin", "/opt/homebrew/sbin", "/usr/local/bin", join(home, ".local/bin")];
8
- }
9
- if (platform === "linux") {
10
- return ["/usr/local/bin", "/usr/bin", join(home, ".local/bin")];
11
- }
12
- return [];
13
- }
14
- function findBinary(name, opts = {}) {
15
- const platform = opts.platform ?? process.platform;
16
- const home = opts.home ?? homedir();
17
- const pathDirs = (opts.pathEnv ?? process.env.PATH ?? "").split(delimiter).filter(Boolean);
18
- const dirs = [.../* @__PURE__ */ new Set([...pathDirs, ...wellKnownBinDirs(platform, home)])];
19
- const exts = platform === "win32" ? ["", ...(process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)] : [""];
20
- for (const dir of dirs) {
21
- for (const ext of exts) {
22
- const candidate = join(dir, name + ext);
23
- if (existsSync(candidate)) return candidate;
24
- }
25
- }
26
- return null;
27
- }
28
-
29
- export {
30
- findBinary
31
- };
32
- //# sourceMappingURL=chunk-42GFSAJP.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/which.ts"],
4
- "sourcesContent": ["import { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, delimiter } from 'node:path';\n\ninterface FindBinaryOptions {\n /** Override the platform (defaults to process.platform). Used in tests. */\n platform?: NodeJS.Platform;\n /** Override $PATH (defaults to process.env.PATH). Used in tests. */\n pathEnv?: string;\n /** Override the home dir (for the well-known-dir fallback). Used in tests. */\n home?: string;\n}\n\n/**\n * Standard install locations to probe IN ADDITION to $PATH \u2014 GUI/agent-launched\n * processes (and Claude Code's minimal-PATH hook shells) often omit these, so a\n * brew/pipx/mitmdump that's plainly installed reads as \"not found\". This is the\n * same minimal-PATH class as the hook-command PATH prefixing (PR #111); here it\n * makes mitmproxy auto-install actually fire on a Mac with Homebrew. Real $PATH\n * entries are searched first, so this only ever ADDS reach, never overrides.\n */\nfunction wellKnownBinDirs(platform: NodeJS.Platform, home: string): string[] {\n if (platform === 'darwin') {\n return ['/opt/homebrew/bin', '/opt/homebrew/sbin', '/usr/local/bin', join(home, '.local/bin')];\n }\n if (platform === 'linux') {\n return ['/usr/local/bin', '/usr/bin', join(home, '.local/bin')];\n }\n return [];\n}\n\n/**\n * Cross-platform executable lookup \u2014 the portable replacement for `which`/`where`.\n *\n * Scans the directories on `$PATH` for an executable named `name`, returning the\n * first full path that exists or `null`. On Windows it also probes the\n * `PATHEXT` extensions (`.EXE`, `.CMD`, ...) so `findBinary('mitmdump')` resolves\n * `mitmdump.exe`. Pure filesystem reads \u2014 no subprocess \u2014 so it works identically\n * on macOS, Linux, and Windows (the old `execSync('which \u2026')` path threw on\n * Windows, which has no `which`, silently breaking mitmproxy detection there).\n */\nexport function findBinary(name: string, opts: FindBinaryOptions = {}): string | null {\n const platform = opts.platform ?? process.platform;\n const home = opts.home ?? homedir();\n const pathDirs = (opts.pathEnv ?? process.env.PATH ?? '').split(delimiter).filter(Boolean);\n // $PATH first (a real entry wins), then the well-known install dirs \u2014 deduped.\n const dirs = [...new Set([...pathDirs, ...wellKnownBinDirs(platform, home)])];\n\n // On Windows, try the bare name first (in case it already carries an extension),\n // then each PATHEXT suffix. Elsewhere, only the bare name is meaningful.\n const exts =\n platform === 'win32'\n ? ['', ...(process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM').split(';').filter(Boolean)]\n : [''];\n\n for (const dir of dirs) {\n for (const ext of exts) {\n const candidate = join(dir, name + ext);\n if (existsSync(candidate)) return candidate;\n }\n }\n return null;\n}\n"],
5
- "mappings": ";AAAA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,MAAM,iBAAiB;AAmBhC,SAAS,iBAAiB,UAA2B,MAAwB;AAC3E,MAAI,aAAa,UAAU;AACzB,WAAO,CAAC,qBAAqB,sBAAsB,kBAAkB,KAAK,MAAM,YAAY,CAAC;AAAA,EAC/F;AACA,MAAI,aAAa,SAAS;AACxB,WAAO,CAAC,kBAAkB,YAAY,KAAK,MAAM,YAAY,CAAC;AAAA,EAChE;AACA,SAAO,CAAC;AACV;AAYO,SAAS,WAAW,MAAc,OAA0B,CAAC,GAAkB;AACpF,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,QAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,QAAM,YAAY,KAAK,WAAW,QAAQ,IAAI,QAAQ,IAAI,MAAM,SAAS,EAAE,OAAO,OAAO;AAEzF,QAAM,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,iBAAiB,UAAU,IAAI,CAAC,CAAC,CAAC;AAI5E,QAAM,OACJ,aAAa,UACT,CAAC,IAAI,IAAI,QAAQ,IAAI,WAAW,uBAAuB,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC,IACjF,CAAC,EAAE;AAET,aAAW,OAAO,MAAM;AACtB,eAAW,OAAO,MAAM;AACtB,YAAM,YAAY,KAAK,KAAK,OAAO,GAAG;AACtC,UAAI,WAAW,SAAS,EAAG,QAAO;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,48 +0,0 @@
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
@@ -1,7 +0,0 @@
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
- }
@@ -1,99 +0,0 @@
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
@@ -1,7 +0,0 @@
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
- }
@@ -1,139 +0,0 @@
1
- import {
2
- probeGatewayIdentity,
3
- waitForGatewayIdentity
4
- } from "./chunk-7LVVKQMZ.js";
5
- import {
6
- GATEWAY_ENTRY_COMMAND_PATTERN,
7
- isPidLiveAndMatching
8
- } from "./chunk-5EDMGK3W.js";
9
-
10
- // src/lib/gateway-lifecycle.ts
11
- import { spawn } from "node:child_process";
12
- import { createConnection } from "node:net";
13
- import { existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
14
- import { homedir } from "node:os";
15
- import { dirname, join, resolve } from "node:path";
16
- import { fileURLToPath } from "node:url";
17
- var MODULE_DIR = dirname(fileURLToPath(import.meta.url));
18
- var CONFIG_DIR = join(homedir(), ".config", "rulemetric");
19
- var GATEWAY_PID_FILE = join(CONFIG_DIR, "gateway.pid");
20
- var GATEWAY_LOG_FILE = join(CONFIG_DIR, "gateway.log");
21
- var GATEWAY_PORT = 8787;
22
- var MITMPROXY_PORT = 8788;
23
- function isGatewayListening(port = GATEWAY_PORT, timeoutMs = 1500) {
24
- return new Promise((resolveProbe) => {
25
- const socket = createConnection({ host: "127.0.0.1", port });
26
- const finish = (result) => {
27
- socket.destroy();
28
- resolveProbe(result);
29
- };
30
- socket.setTimeout(timeoutMs);
31
- socket.once("connect", () => finish(true));
32
- socket.once("timeout", () => finish(false));
33
- socket.once("error", () => finish(false));
34
- });
35
- }
36
- async function waitForGatewayListening(port = GATEWAY_PORT, { timeoutMs = 3e3, intervalMs = 150 } = {}) {
37
- const deadline = Date.now() + timeoutMs;
38
- for (; ; ) {
39
- if (await isGatewayListening(port, Math.min(1500, timeoutMs))) return true;
40
- if (Date.now() >= deadline) return false;
41
- await new Promise((resolve2) => setTimeout(resolve2, intervalMs));
42
- }
43
- }
44
- function isRulemetricGatewayListening(port = GATEWAY_PORT, timeoutMs = 1500) {
45
- return probeGatewayIdentity(port, timeoutMs);
46
- }
47
- function waitForRulemetricGateway(port = GATEWAY_PORT, opts = {}) {
48
- return waitForGatewayIdentity(port, opts);
49
- }
50
- function isGatewayRunning(pidOpts = {}) {
51
- const pid = getGatewayPid();
52
- if (pid === null) return false;
53
- return isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts);
54
- }
55
- function getGatewayPid() {
56
- if (!existsSync(GATEWAY_PID_FILE)) return null;
57
- const content = readFileSync(GATEWAY_PID_FILE, "utf-8").trim();
58
- const pid = parseInt(content, 10);
59
- return isNaN(pid) ? null : pid;
60
- }
61
- function findGatewayEntry() {
62
- const candidates = [
63
- resolve(MODULE_DIR, "./gateway-entry.js"),
64
- // sibling (unbundled)
65
- resolve(MODULE_DIR, "./lib/gateway-entry.js"),
66
- // bundled chunk at dist root
67
- resolve(MODULE_DIR, "../lib/gateway-entry.js"),
68
- // nested command dir → dist/lib
69
- resolve(MODULE_DIR, "../../lib/gateway-entry.js")
70
- ];
71
- for (const p of candidates) {
72
- if (existsSync(p)) return p;
73
- }
74
- throw new Error(
75
- "Could not find gateway-entry.js. Is the CLI built?\nSearched:\n" + candidates.map((c) => ` ${c}`).join("\n")
76
- );
77
- }
78
- function spawnGateway(cliVersion) {
79
- if (isGatewayRunning()) {
80
- const pid = getGatewayPid();
81
- if (pid) return pid;
82
- }
83
- mkdirSync(CONFIG_DIR, { recursive: true });
84
- const entryPath = findGatewayEntry();
85
- const logFd = openSync(GATEWAY_LOG_FILE, "a");
86
- const child = spawn(process.execPath, [entryPath], {
87
- detached: true,
88
- stdio: ["ignore", logFd, logFd],
89
- // The gateway inherits the spawning CLI's env. RULEMETRIC_CLI_VERSION
90
- // identifies the CLI version that started this gateway — used to
91
- // detect drift when a newer CLI starts mitmproxy with a different
92
- // version. RULEMETRIC_CLI_ENTRY is the path to the oclif entry point
93
- // (process.argv[1]) so the gateway can re-invoke the CLI for
94
- // `proxy restart` without needing the binary in PATH. Falls back to
95
- // "unknown" if the caller didn't pass them.
96
- env: {
97
- ...process.env,
98
- RULEMETRIC_CLI_VERSION: cliVersion ?? "unknown",
99
- RULEMETRIC_CLI_ENTRY: process.argv[1] ?? ""
100
- }
101
- });
102
- child.unref();
103
- if (!child.pid) {
104
- throw new Error("Failed to spawn gateway process");
105
- }
106
- writeFileSync(GATEWAY_PID_FILE, String(child.pid));
107
- return child.pid;
108
- }
109
- function stopGateway(pidOpts = {}) {
110
- const pid = getGatewayPid();
111
- if (pid === null) return false;
112
- if (isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts)) {
113
- try {
114
- process.kill(pid, "SIGTERM");
115
- } catch {
116
- }
117
- }
118
- try {
119
- unlinkSync(GATEWAY_PID_FILE);
120
- } catch {
121
- }
122
- return true;
123
- }
124
-
125
- export {
126
- GATEWAY_PID_FILE,
127
- GATEWAY_LOG_FILE,
128
- GATEWAY_PORT,
129
- MITMPROXY_PORT,
130
- isGatewayListening,
131
- waitForGatewayListening,
132
- isRulemetricGatewayListening,
133
- waitForRulemetricGateway,
134
- isGatewayRunning,
135
- getGatewayPid,
136
- spawnGateway,
137
- stopGateway
138
- };
139
- //# sourceMappingURL=chunk-4LYCDS2N.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/gateway-lifecycle.ts"],
4
- "sourcesContent": ["/**\n * Gateway process lifecycle helpers \u2014 spawn, stop, check status.\n * Used by hooks install/uninstall, session-start hook, and proxy status.\n */\nimport { spawn } from 'node:child_process';\nimport { createConnection } from 'node:net';\nimport { existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n probeGatewayIdentity,\n waitForGatewayIdentity,\n type GatewayIdentity,\n} from './gateway-identity.js';\nimport {\n isPidLiveAndMatching,\n GATEWAY_ENTRY_COMMAND_PATTERN,\n type PidIdentityOptions,\n} from './pid-identity.js';\n\n// `import.meta.dirname` only exists on Node >= 20.11 \u2014 on Node 18.x/\u226420.10 it is\n// `undefined`, and `resolve(undefined, \u2026)` throws, surfacing as a spurious\n// \"Could not find gateway-entry.js\" on fresh npm installs (the launchd gateway\n// masks it in dev). Derive the dir portably instead. See onboarding field report\n// 2026-07-07 F1.\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nconst CONFIG_DIR = join(homedir(), '.config', 'rulemetric');\nexport const GATEWAY_PID_FILE = join(CONFIG_DIR, 'gateway.pid');\nexport const GATEWAY_LOG_FILE = join(CONFIG_DIR, 'gateway.log');\nexport const GATEWAY_PORT = 8787;\nexport const MITMPROXY_PORT = 8788;\n\n/**\n * TCP liveness probe: does something actually ACCEPT a connection on the port?\n * Distinct from isGatewayRunning() (which only checks the PID is alive) \u2014 a\n * process can be \"running\" per its pidfile while :8787 accepts nothing. This is\n * the check that must gate writing HTTPS_PROXY: never pin Claude Code's proxy\n * at a port with nothing behind it (the fresh-laptop ConnectionRefused footgun).\n */\nexport function isGatewayListening(port: number = GATEWAY_PORT, timeoutMs = 1500): Promise<boolean> {\n return new Promise((resolveProbe) => {\n const socket = createConnection({ host: '127.0.0.1', port });\n const finish = (result: boolean) => {\n socket.destroy();\n resolveProbe(result);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\n/**\n * Poll isGatewayListening() until it's true or the window elapses. spawnGateway()\n * returns as soon as it writes the PID file \u2014 the detached child hasn't bound\n * :8787 yet (Node bootstrap + module load). A one-shot probe microseconds later\n * fails-closed on every fresh install, so the proxy/deep-capture layer silently\n * never turns on. This tolerates a normal cold-start bind delay.\n */\nexport async function waitForGatewayListening(\n port: number = GATEWAY_PORT,\n { timeoutMs = 3000, intervalMs = 150 }: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n if (await isGatewayListening(port, Math.min(1500, timeoutMs))) return true;\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * Identity-aware liveness probe on :GATEWAY_PORT \u2014 connects, requests the\n * identity marker, and distinguishes ours-live / foreign / dead. This (not\n * the raw TCP probe above) is what HTTPS_PROXY-pinning decisions must use: a\n * foreign process accepting on :8787 passes isGatewayListening() but would\n * brick every HTTPS request Claude Code makes.\n */\nexport function isRulemetricGatewayListening(\n port: number = GATEWAY_PORT,\n timeoutMs = 1500,\n): Promise<GatewayIdentity> {\n return probeGatewayIdentity(port, timeoutMs);\n}\n\n/**\n * Poll the identity probe through a cold-start bind delay. 'dead' retries\n * until the window elapses; 'ours-live' and 'foreign' return immediately\n * (waiting can't change what owns the port).\n */\nexport function waitForRulemetricGateway(\n port: number = GATEWAY_PORT,\n opts: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<GatewayIdentity> {\n return waitForGatewayIdentity(port, opts);\n}\n\n/**\n * PID-file liveness WITH identity validation. PID files survive reboots, and\n * `kill -0` on a reused PID reports \"alive\" for an unrelated process \u2014 which\n * permanently defeats the session-start self-heal. The recorded PID only\n * counts as \"running\" when its command line is actually gateway-entry.\n */\nexport function isGatewayRunning(pidOpts: PidIdentityOptions = {}): boolean {\n const pid = getGatewayPid();\n if (pid === null) return false;\n return isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts);\n}\n\nexport function getGatewayPid(): number | null {\n if (!existsSync(GATEWAY_PID_FILE)) return null;\n const content = readFileSync(GATEWAY_PID_FILE, 'utf-8').trim();\n const pid = parseInt(content, 10);\n return isNaN(pid) ? null : pid;\n}\n\nfunction findGatewayEntry(): string {\n // Resolve the compiled gateway-entry.js across BOTH layouts:\n // - unbundled (dev/tsx, or tsc output): this module sits in dist/lib, so\n // gateway-entry.js is a sibling (`./gateway-entry.js`).\n // - BUNDLED (published build): esbuild flattens this module into\n // dist/chunk-*.js at the dist ROOT, so MODULE_DIR is dist/ and the entry\n // (kept as a separate build entry) is at dist/lib/gateway-entry.js\n // (`./lib/gateway-entry.js`). Without this candidate the gateway never\n // spawns on a clean npm install \u2014 masked in dev by the launchd gateway\n // short-circuiting before this runs. See onboarding field report F1.\n const candidates = [\n resolve(MODULE_DIR, './gateway-entry.js'), // sibling (unbundled)\n resolve(MODULE_DIR, './lib/gateway-entry.js'), // bundled chunk at dist root\n resolve(MODULE_DIR, '../lib/gateway-entry.js'), // nested command dir \u2192 dist/lib\n resolve(MODULE_DIR, '../../lib/gateway-entry.js'),\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n throw new Error(\n 'Could not find gateway-entry.js. Is the CLI built?\\n' +\n 'Searched:\\n' + candidates.map(c => ` ${c}`).join('\\n'),\n );\n}\n\nexport function spawnGateway(cliVersion?: string): number {\n if (isGatewayRunning()) {\n const pid = getGatewayPid();\n if (pid) return pid;\n }\n\n mkdirSync(CONFIG_DIR, { recursive: true });\n\n const entryPath = findGatewayEntry();\n const logFd = openSync(GATEWAY_LOG_FILE, 'a');\n\n const child = spawn(process.execPath, [entryPath], {\n detached: true,\n stdio: ['ignore', logFd, logFd],\n // The gateway inherits the spawning CLI's env. RULEMETRIC_CLI_VERSION\n // identifies the CLI version that started this gateway \u2014 used to\n // detect drift when a newer CLI starts mitmproxy with a different\n // version. RULEMETRIC_CLI_ENTRY is the path to the oclif entry point\n // (process.argv[1]) so the gateway can re-invoke the CLI for\n // `proxy restart` without needing the binary in PATH. Falls back to\n // \"unknown\" if the caller didn't pass them.\n env: {\n ...process.env,\n RULEMETRIC_CLI_VERSION: cliVersion ?? 'unknown',\n RULEMETRIC_CLI_ENTRY: process.argv[1] ?? '',\n },\n });\n\n child.unref();\n\n if (!child.pid) {\n throw new Error('Failed to spawn gateway process');\n }\n\n writeFileSync(GATEWAY_PID_FILE, String(child.pid));\n return child.pid;\n}\n\nexport function stopGateway(pidOpts: PidIdentityOptions = {}): boolean {\n const pid = getGatewayPid();\n if (pid === null) return false;\n\n // Only signal a PID whose command line is actually gateway-entry \u2014 a\n // reused PID belongs to an unrelated process we must never SIGTERM. Either\n // way the PID file is stale after this and gets removed.\n if (isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts)) {\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n // Process already gone\n }\n }\n\n try { unlinkSync(GATEWAY_PID_FILE); } catch { /* already gone */ }\n return true;\n}\n"],
5
- "mappings": ";;;;;;;;;;AAIA,SAAS,aAAa;AACtB,SAAS,wBAAwB;AACjC,SAAS,YAAY,WAAW,UAAU,cAAc,YAAY,qBAAqB;AACzF,SAAS,eAAe;AACxB,SAAS,SAAS,MAAM,eAAe;AACvC,SAAS,qBAAqB;AAiB9B,IAAM,aAAa,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEzD,IAAM,aAAa,KAAK,QAAQ,GAAG,WAAW,YAAY;AACnD,IAAM,mBAAmB,KAAK,YAAY,aAAa;AACvD,IAAM,mBAAmB,KAAK,YAAY,aAAa;AACvD,IAAM,eAAe;AACrB,IAAM,iBAAiB;AASvB,SAAS,mBAAmB,OAAe,cAAc,YAAY,MAAwB;AAClG,SAAO,IAAI,QAAQ,CAAC,iBAAiB;AACnC,UAAM,SAAS,iBAAiB,EAAE,MAAM,aAAa,KAAK,CAAC;AAC3D,UAAM,SAAS,CAAC,WAAoB;AAClC,aAAO,QAAQ;AACf,mBAAa,MAAM;AAAA,IACrB;AACA,WAAO,WAAW,SAAS;AAC3B,WAAO,KAAK,WAAW,MAAM,OAAO,IAAI,CAAC;AACzC,WAAO,KAAK,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1C,WAAO,KAAK,SAAS,MAAM,OAAO,KAAK,CAAC;AAAA,EAC1C,CAAC;AACH;AASA,eAAsB,wBACpB,OAAe,cACf,EAAE,YAAY,KAAM,aAAa,IAAI,IAAiD,CAAC,GACrE;AAClB,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAS;AACP,QAAI,MAAM,mBAAmB,MAAM,KAAK,IAAI,MAAM,SAAS,CAAC,EAAG,QAAO;AACtE,QAAI,KAAK,IAAI,KAAK,SAAU,QAAO;AACnC,UAAM,IAAI,QAAQ,CAACA,aAAY,WAAWA,UAAS,UAAU,CAAC;AAAA,EAChE;AACF;AASO,SAAS,6BACd,OAAe,cACf,YAAY,MACc;AAC1B,SAAO,qBAAqB,MAAM,SAAS;AAC7C;AAOO,SAAS,yBACd,OAAe,cACf,OAAoD,CAAC,GAC3B;AAC1B,SAAO,uBAAuB,MAAM,IAAI;AAC1C;AAQO,SAAS,iBAAiB,UAA8B,CAAC,GAAY;AAC1E,QAAM,MAAM,cAAc;AAC1B,MAAI,QAAQ,KAAM,QAAO;AACzB,SAAO,qBAAqB,KAAK,+BAA+B,OAAO;AACzE;AAEO,SAAS,gBAA+B;AAC7C,MAAI,CAAC,WAAW,gBAAgB,EAAG,QAAO;AAC1C,QAAM,UAAU,aAAa,kBAAkB,OAAO,EAAE,KAAK;AAC7D,QAAM,MAAM,SAAS,SAAS,EAAE;AAChC,SAAO,MAAM,GAAG,IAAI,OAAO;AAC7B;AAEA,SAAS,mBAA2B;AAUlC,QAAM,aAAa;AAAA,IACjB,QAAQ,YAAY,oBAAoB;AAAA;AAAA,IACxC,QAAQ,YAAY,wBAAwB;AAAA;AAAA,IAC5C,QAAQ,YAAY,yBAAyB;AAAA;AAAA,IAC7C,QAAQ,YAAY,4BAA4B;AAAA,EAClD;AACA,aAAW,KAAK,YAAY;AAC1B,QAAI,WAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,QAAM,IAAI;AAAA,IACR,oEACgB,WAAW,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,EACzD;AACF;AAEO,SAAS,aAAa,YAA6B;AACxD,MAAI,iBAAiB,GAAG;AACtB,UAAM,MAAM,cAAc;AAC1B,QAAI,IAAK,QAAO;AAAA,EAClB;AAEA,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,QAAM,YAAY,iBAAiB;AACnC,QAAM,QAAQ,SAAS,kBAAkB,GAAG;AAE5C,QAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,SAAS,GAAG;AAAA,IACjD,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ9B,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,wBAAwB,cAAc;AAAA,MACtC,sBAAsB,QAAQ,KAAK,CAAC,KAAK;AAAA,IAC3C;AAAA,EACF,CAAC;AAED,QAAM,MAAM;AAEZ,MAAI,CAAC,MAAM,KAAK;AACd,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,gBAAc,kBAAkB,OAAO,MAAM,GAAG,CAAC;AACjD,SAAO,MAAM;AACf;AAEO,SAAS,YAAY,UAA8B,CAAC,GAAY;AACrE,QAAM,MAAM,cAAc;AAC1B,MAAI,QAAQ,KAAM,QAAO;AAKzB,MAAI,qBAAqB,KAAK,+BAA+B,OAAO,GAAG;AACrE,QAAI;AACF,cAAQ,KAAK,KAAK,SAAS;AAAA,IAC7B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI;AAAE,eAAW,gBAAgB;AAAA,EAAG,QAAQ;AAAA,EAAqB;AACjE,SAAO;AACT;",
6
- "names": ["resolve"]
7
- }
@@ -1,129 +0,0 @@
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
@@ -1,7 +0,0 @@
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": "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",
6
- "names": []
7
- }