@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,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/evals/optimize-description.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet, apiPost, apiPut } from '../../lib/api-client.js';\nimport { executeEval } from '../../lib/eval-executor.js';\nimport { testTrigger, computeTriggerScore } from '../../lib/eval-trigger-tester.js';\nimport type { TriggerTestResult } from '../../lib/eval-trigger-tester.js';\n\ninterface EvalTarget {\n id: string;\n name: string;\n type: string;\n content: string;\n description: string;\n version: number;\n}\n\ninterface TriggerQuery {\n query: string;\n should_trigger: boolean;\n}\n\ninterface TriggerEvalSet {\n id: string;\n queries: TriggerQuery[];\n status: string;\n trainIndices: number[];\n testIndices: number[];\n}\n\nexport default class EvalOptimizeDescriptionCommand extends BaseCommand {\n static override description = 'Optimize eval target description for better triggering accuracy';\n\n static override examples = [\n '<%= config.bin %> evals optimize-description <target-id>',\n '<%= config.bin %> evals optimize-description <target-id> --queries 10',\n ];\n\n static override args = {\n targetId: Args.string({ description: 'Eval target ID', required: true }),\n };\n\n static override flags = {\n 'max-iterations': Flags.integer({ description: 'Maximum optimization iterations', default: 5 }),\n model: Flags.string({ description: 'Model for trigger testing and improvement' }),\n queries: Flags.integer({ description: 'Number of trigger queries to generate', default: 20 }),\n 'runs-per-query': Flags.integer({ description: 'Runs per query for reliability', default: 3 }),\n 'poll-interval': Flags.integer({ description: 'Ms between approval polls', default: 5000 }),\n timeout: Flags.integer({ description: 'Timeout per eval in ms', default: 120_000 }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(EvalOptimizeDescriptionCommand);\n this.requireAuth();\n\n const target = await apiGet<EvalTarget>(`/api/eval-targets/${args.targetId}`);\n\n this.log(`Optimizing description for \"${target.name}\" v${target.version}`);\n this.log(`Current description: \"${target.description}\"`);\n this.log('');\n\n // Step 1: Generate trigger queries\n this.log('Generating trigger queries...');\n const queries = await this.generateTriggerQueries(target, flags.queries, flags);\n\n // Step 2: Post to API for review\n const triggerEval = await apiPost<TriggerEvalSet>(`/api/eval-targets/${args.targetId}/trigger-evals`, {\n queries,\n });\n\n this.log(`\\nGenerated ${queries.length} trigger queries.`);\n this.log(`Review and approve them at:`);\n this.log(` http://localhost:5174/eval-targets/${args.targetId}`);\n this.log(` (Triggers tab \u2192 click to review)`);\n this.log('\\nWaiting for approval...');\n\n // Step 3: Poll for approval\n let approved = false;\n while (!approved) {\n await new Promise((resolve) => setTimeout(resolve, flags['poll-interval']));\n const sets = await apiGet<TriggerEvalSet[]>(\n `/api/eval-targets/${args.targetId}/trigger-evals?status=approved`,\n );\n const current = sets.find((s) => s.id === triggerEval.id);\n if (current) {\n approved = true;\n // Use potentially edited queries\n queries.length = 0;\n queries.push(...current.queries);\n this.log('Trigger queries approved!');\n }\n }\n\n // Step 4: Split train/test (60/40)\n const indices = queries.map((_, i) => i).sort(() => Math.random() - 0.5);\n const splitIdx = Math.ceil(indices.length * 0.6);\n const trainIndices = indices.slice(0, splitIdx);\n const testIndices = indices.slice(splitIdx);\n\n // Save split to API\n await apiPut(`/api/trigger-evals/${triggerEval.id}`, {\n trainIndices,\n testIndices,\n });\n\n const trainQueries = trainIndices.map((i) => queries[i]);\n const testQueries = testIndices.map((i) => queries[i]);\n\n this.log(`\\nSplit: ${trainQueries.length} train, ${testQueries.length} test`);\n\n // Step 5: Optimization loop\n let currentDescription = target.description;\n let bestDescription = currentDescription;\n let bestTestScore = 0;\n\n for (let iteration = 1; iteration <= flags['max-iterations']; iteration++) {\n this.log(`\\n=== Iteration ${iteration} ===`);\n this.log(`Description: \"${currentDescription}\"`);\n\n // Test on train set (multiple runs per query)\n this.log('Testing train set...');\n const trainResults = await this.testQuerySet(trainQueries, target, currentDescription, flags);\n const trainScore = computeTriggerScore(trainResults);\n this.log(`Train accuracy: ${(trainScore * 100).toFixed(1)}%`);\n\n this.printTriggerResults(trainResults);\n\n // Test on test set\n this.log('Testing test set...');\n const testResults = await this.testQuerySet(testQueries, target, currentDescription, flags);\n const testScore = computeTriggerScore(testResults);\n this.log(`Test accuracy: ${(testScore * 100).toFixed(1)}%`);\n\n // Record optimization run\n await apiPost('/api/optimization-runs', {\n evalTargetId: target.id,\n type: 'description',\n iteration,\n inputVersion: target.version,\n trainScore,\n testScore,\n analysis: {\n description: currentDescription,\n trainResults: trainResults.map((r) => ({ query: r.query, shouldTrigger: r.shouldTrigger, didTrigger: r.didTrigger, correct: r.correct })),\n testResults: testResults.map((r) => ({ query: r.query, shouldTrigger: r.shouldTrigger, didTrigger: r.didTrigger, correct: r.correct })),\n },\n status: 'completed',\n });\n\n // Track best by test score\n if (testScore > bestTestScore) {\n bestTestScore = testScore;\n bestDescription = currentDescription;\n }\n\n // Stop if perfect\n if (trainScore >= 1.0) {\n this.log('Perfect train score. Stopping.');\n break;\n }\n\n // Propose improved description\n this.log('Generating improved description...');\n const failures = trainResults.filter((r) => !r.correct);\n currentDescription = await this.improveDescription(target, currentDescription, failures, flags);\n }\n\n // Step 6: Apply best description\n this.log(`\\n=== Optimization Complete ===`);\n this.log(`Best test accuracy: ${(bestTestScore * 100).toFixed(1)}%`);\n this.log(`\\nBefore: \"${target.description}\"`);\n this.log(`After: \"${bestDescription}\"`);\n\n if (bestDescription !== target.description) {\n await apiPut(`/api/eval-targets/${target.id}`, {\n description: bestDescription,\n });\n this.log('\\nDescription updated.');\n } else {\n this.log('\\nNo improvement found. Description unchanged.');\n }\n }\n\n private async generateTriggerQueries(\n target: EvalTarget,\n count: number,\n flags: { model?: string; timeout: number },\n ): Promise<TriggerQuery[]> {\n // Try to seed with real session data\n let sessionSeed = '';\n try {\n const sessions = await apiGet<Array<{ id: string }>>('/api/sessions?limit=10');\n if (sessions.length > 0) {\n sessionSeed = '\\n\\nReal user prompts from recent sessions (use as inspiration for realistic queries):\\n' +\n sessions.slice(0, 5).map((s) => `- Session ${s.id}`).join('\\n');\n }\n } catch {\n // No sessions available, that's fine\n }\n\n const shouldTriggerCount = Math.ceil(count / 2);\n const shouldNotTriggerCount = count - shouldTriggerCount;\n\n const prompt = `Generate ${count} trigger eval queries for a skill/instruction.\n\n## Skill Name\n${target.name}\n\n## Skill Description\n${target.description}\n\n## Skill Content (first 1000 chars)\n${target.content.slice(0, 1000)}\n${sessionSeed}\n\nGenerate ${shouldTriggerCount} should-trigger queries and ${shouldNotTriggerCount} should-not-trigger queries.\n\nRules:\n- Queries must be realistic \u2014 what a real user would actually type\n- Include concrete details (file paths, project names, specific problems)\n- Vary length and formality\n- Should-not-trigger queries should be near-misses (share keywords but need something different)\n- Do NOT make should-not-trigger queries obviously irrelevant\n\nRespond with ONLY a valid JSON array:\n[\n {\"query\": \"realistic user prompt...\", \"should_trigger\": true},\n {\"query\": \"another prompt...\", \"should_trigger\": false}\n]`;\n\n const result = await executeEval({\n prompt,\n timeout: flags.timeout,\n model: flags.model,\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 arrMatch = jsonStr.match(/\\[[\\s\\S]*\\]/);\n if (arrMatch) jsonStr = arrMatch[0];\n\n return JSON.parse(jsonStr) as TriggerQuery[];\n } catch {\n // Fallback: generate minimal set\n return [\n { query: `Help me use ${target.name}`, should_trigger: true },\n { query: 'Write a hello world program', should_trigger: false },\n ];\n }\n }\n\n private async testQuerySet(\n queries: TriggerQuery[],\n target: EvalTarget,\n description: string,\n flags: { model?: string; timeout: number; 'runs-per-query': number },\n ): Promise<TriggerTestResult[]> {\n const results: TriggerTestResult[] = [];\n\n for (const q of queries) {\n // Run multiple times and take majority vote\n const runs: TriggerTestResult[] = [];\n for (let run = 0; run < flags['runs-per-query']; run++) {\n const result = await testTrigger({\n query: q.query,\n shouldTrigger: q.should_trigger,\n skillName: target.name,\n skillDescription: description,\n skillContent: target.content,\n model: flags.model,\n timeout: flags.timeout,\n });\n runs.push(result);\n }\n\n // Majority vote\n const triggerCount = runs.filter((r) => r.didTrigger).length;\n const didTrigger = triggerCount > flags['runs-per-query'] / 2;\n\n results.push({\n query: q.query,\n shouldTrigger: q.should_trigger,\n didTrigger,\n correct: didTrigger === q.should_trigger,\n confidence: runs.reduce((sum, r) => sum + r.confidence, 0) / runs.length,\n evidence: runs[0].evidence,\n });\n }\n\n return results;\n }\n\n private printTriggerResults(results: TriggerTestResult[]): void {\n for (const r of results) {\n const status = r.correct ? 'OK' : 'FAIL';\n const expected = r.shouldTrigger ? 'should trigger' : 'should NOT trigger';\n const actual = r.didTrigger ? 'triggered' : 'did NOT trigger';\n this.log(` [${status}] ${expected} / ${actual}: \"${r.query.slice(0, 60)}...\"`);\n }\n }\n\n private async improveDescription(\n target: EvalTarget,\n currentDescription: string,\n failures: TriggerTestResult[],\n flags: { model?: string; timeout: number },\n ): Promise<string> {\n const failureText = failures.map((f) => {\n const expected = f.shouldTrigger ? 'SHOULD trigger but DID NOT' : 'SHOULD NOT trigger but DID';\n return `- ${expected}: \"${f.query}\"`;\n }).join('\\n');\n\n const prompt = `You are optimizing a skill description for better triggering accuracy.\n\n## Skill Name\n${target.name}\n\n## Current Description\n${currentDescription}\n\n## Skill Content (first 500 chars)\n${target.content.slice(0, 500)}\n\n## Failures\n${failureText}\n\nPropose an improved description that:\n- Fixes the trigger failures above\n- Keeps the description concise but comprehensive\n- Uses specific keywords and contexts for when to trigger\n- Includes \"Use PROACTIVELY\" phrasing for important trigger contexts\n\nRespond with ONLY the new description text (no JSON, no explanation, just the description string).`;\n\n const result = await executeEval({\n prompt,\n timeout: flags.timeout,\n model: flags.model,\n });\n\n return result.output.trim().replace(/^[\"']|[\"']$/g, '');\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/evals/optimize.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet, apiPost, apiPut } from '../../lib/api-client.js';\nimport { executeEval } from '../../lib/eval-executor.js';\nimport { gradeEvalOutput } from '../../lib/eval-grader.js';\nimport { analyzeEvalResults } from '../../lib/eval-analyzer.js';\n\ninterface EvalTarget {\n id: string;\n name: string;\n type: string;\n content: string;\n description: string;\n version: number;\n}\n\ninterface Eval {\n id: string;\n name: string;\n prompt: string;\n expectedOutput: string;\n expectations: string[];\n}\n\nexport default class EvalOptimizeCommand extends BaseCommand {\n static override description = 'Iteratively optimize eval target content using eval results as feedback';\n\n static override examples = [\n '<%= config.bin %> evals optimize <target-id>',\n '<%= config.bin %> evals optimize <target-id> --auto --max-iterations 3',\n ];\n\n static override args = {\n targetId: Args.string({ description: 'Eval target ID', required: true }),\n };\n\n static override flags = {\n auto: Flags.boolean({ description: 'Skip interactive review, apply suggestions automatically', default: false }),\n 'max-iterations': Flags.integer({ description: 'Maximum optimization iterations', default: 5 }),\n threshold: Flags.string({ description: 'Stop if pass rate reaches this threshold (0-1)', default: '0.95' }),\n model: Flags.string({ description: 'Model for eval execution' }),\n 'analyzer-model': Flags.string({ description: 'Model for analysis/suggestions' }),\n 'runs-per-eval': Flags.integer({ description: 'Runs per eval per iteration', default: 1 }),\n parallel: Flags.integer({ description: 'Number of parallel eval executions', default: 1 }),\n timeout: Flags.integer({ description: 'Timeout per eval in ms', default: 120_000 }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(EvalOptimizeCommand);\n this.requireAuth();\n\n let target = await apiGet<EvalTarget>(`/api/eval-targets/${args.targetId}`);\n const allEvals = await apiGet<Eval[]>(`/api/eval-targets/${args.targetId}/evals`);\n\n if (allEvals.length === 0) {\n this.error('No evals found. Create some first with `rulemetric evals create`.');\n }\n\n // Split evals into train/test (60/40)\n const shuffled = [...allEvals].sort(() => Math.random() - 0.5);\n const splitIdx = Math.ceil(shuffled.length * 0.6);\n const trainEvals = shuffled.slice(0, splitIdx);\n const testEvals = shuffled.slice(splitIdx);\n\n this.log(`Optimizing \"${target.name}\" v${target.version}`);\n this.log(`Evals: ${trainEvals.length} train, ${testEvals.length} test`);\n const threshold = parseFloat(flags.threshold);\n this.log(`Config: max ${flags['max-iterations']} iterations, threshold ${(threshold * 100).toFixed(0)}%`);\n if (flags.auto) this.log('Mode: auto (no interactive review)');\n this.log('');\n\n let bestVersion = target.version;\n let bestTestScore = 0;\n let noImprovementCount = 0;\n\n for (let iteration = 1; iteration <= flags['max-iterations']; iteration++) {\n this.log(`\\n=== Iteration ${iteration} ===`);\n\n // Record optimization run as running\n const optRun = await apiPost<{ id: string }>('/api/optimization-runs', {\n evalTargetId: target.id,\n type: 'content',\n iteration,\n inputVersion: target.version,\n status: 'running',\n });\n\n // Run train evals\n this.log('Running train evals...');\n const trainResults = await this.runEvalsOnTarget(target, trainEvals, flags);\n const trainScore = this.computePassRate(trainResults);\n this.log(`Train pass rate: ${(trainScore * 100).toFixed(1)}%`);\n\n // Check if we've hit the threshold\n if (trainScore >= threshold) {\n this.log(`Train score ${(trainScore * 100).toFixed(1)}% >= threshold ${(threshold * 100).toFixed(0)}%. Stopping.`);\n // Run test evals for final score\n const testResults = await this.runEvalsOnTarget(target, testEvals, flags);\n const testScore = this.computePassRate(testResults);\n this.log(`Final test score: ${(testScore * 100).toFixed(1)}%`);\n\n await apiPost('/api/optimization-runs', {\n evalTargetId: target.id,\n type: 'content',\n iteration,\n inputVersion: target.version,\n trainScore,\n testScore,\n analysis: { reason: 'threshold_reached' },\n status: 'completed',\n });\n break;\n }\n\n // Analyze and propose improvements\n this.log('Analyzing results...');\n const evalResults = trainResults.map((r) => ({\n evalName: r.evalName,\n prompt: r.prompt,\n expectations: r.expectations,\n grading: r.grading,\n }));\n\n const analysis = await analyzeEvalResults({\n content: target.content,\n evalResults,\n model: flags['analyzer-model'] ?? flags.model,\n timeout: flags.timeout,\n });\n\n this.log(`\\nAssessment: ${analysis.overallAssessment}`);\n this.log(`Suggestions: ${analysis.suggestions.length}`);\n for (const s of analysis.suggestions) {\n this.log(` - [${s.section}] ${s.reasoning}`);\n }\n\n // In interactive mode, ask for approval\n if (!flags.auto) {\n this.log('\\nProposed changes above. Applying in auto mode would proceed automatically.');\n this.log('(Interactive approval not yet implemented \u2014 use --auto for now)');\n }\n\n if (analysis.proposedContent === target.content) {\n this.log('No changes proposed. Stopping.');\n await apiPost('/api/optimization-runs', {\n evalTargetId: target.id,\n type: 'content',\n iteration,\n inputVersion: target.version,\n trainScore,\n analysis: { reason: 'no_changes' },\n status: 'completed',\n });\n break;\n }\n\n // Create new version\n const newTarget = await apiPut<EvalTarget>(`/api/eval-targets/${target.id}`, {\n content: analysis.proposedContent,\n });\n this.log(`Created v${newTarget.version}`);\n\n // Run test evals on new version\n this.log('Running test evals...');\n const testResults = await this.runEvalsOnTarget(newTarget, testEvals, flags);\n const testScore = this.computePassRate(testResults);\n this.log(`Test pass rate: ${(testScore * 100).toFixed(1)}%`);\n\n // Update optimization run\n await apiPost('/api/optimization-runs', {\n evalTargetId: newTarget.id,\n type: 'content',\n iteration,\n inputVersion: target.version,\n outputVersion: newTarget.version,\n trainScore,\n testScore,\n analysis: {\n suggestions: analysis.suggestions,\n overallAssessment: analysis.overallAssessment,\n },\n status: 'completed',\n });\n\n // Track best\n if (testScore > bestTestScore) {\n bestTestScore = testScore;\n bestVersion = newTarget.version;\n noImprovementCount = 0;\n } else {\n noImprovementCount++;\n if (noImprovementCount >= 2) {\n this.log('No improvement for 2 consecutive iterations. Stopping.');\n break;\n }\n }\n\n target = newTarget;\n }\n\n this.log(`\\n=== Optimization Complete ===`);\n this.log(`Best version: v${bestVersion} (test score: ${(bestTestScore * 100).toFixed(1)}%)`);\n }\n\n private async runEvalsOnTarget(\n target: EvalTarget,\n evalSet: Eval[],\n flags: { model?: string; timeout: number; 'runs-per-eval': number; parallel: number },\n ): Promise<Array<{ evalName: string; prompt: string; expectations: string[]; grading: Record<string, unknown> }>> {\n const results: Array<{ evalName: string; prompt: string; expectations: string[]; grading: Record<string, unknown> }> = [];\n\n for (const eval_ of evalSet) {\n const execResult = await executeEval({\n prompt: eval_.prompt,\n targetContent: target.content,\n timeout: flags.timeout,\n model: flags.model,\n });\n\n if (execResult.error) {\n results.push({ evalName: eval_.name, prompt: eval_.prompt, expectations: eval_.expectations, grading: {} });\n continue;\n }\n\n if (eval_.expectations.length > 0) {\n const grading = await gradeEvalOutput({\n prompt: eval_.prompt,\n output: execResult.output,\n expectations: eval_.expectations,\n model: flags.model,\n timeout: flags.timeout,\n });\n results.push({ evalName: eval_.name, prompt: eval_.prompt, expectations: eval_.expectations, grading: grading as unknown as Record<string, unknown> });\n } else {\n results.push({ evalName: eval_.name, prompt: eval_.prompt, expectations: eval_.expectations, grading: {} });\n }\n }\n\n return results;\n }\n\n private computePassRate(results: Array<{ grading: Record<string, unknown> }>): number {\n const graded = results.filter((r) => Object.keys(r.grading).length > 0);\n if (graded.length === 0) return 0;\n const rates = graded.map((r) => (r.grading as any).summary?.pass_rate ?? 0);\n return rates.reduce((a: number, b: number) => a + b, 0) / rates.length;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["testResults", "testScore"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/evals/run.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet, apiPost } from '../../lib/api-client.js';\nimport { executeEval } from '../../lib/eval-executor.js';\nimport { gradeEvalOutput } from '../../lib/eval-grader.js';\n\ninterface EvalTarget {\n id: string;\n name: string;\n type: string;\n content: string;\n version: number;\n}\n\ninterface Eval {\n id: string;\n name: string;\n prompt: string;\n expectedOutput: string;\n expectations: string[];\n}\n\ninterface EvalRunResult {\n evalId: string;\n evalTargetId: string;\n evalTargetVersion: number;\n configuration: string;\n runNumber: number;\n iteration: number;\n status: string;\n outputs: Record<string, unknown>;\n timing: Record<string, unknown>;\n grading: Record<string, unknown>;\n}\n\nexport default class EvalRunCommand extends BaseCommand {\n static override description = 'Run evals against a target, optionally grade results, and post to API';\n\n static override examples = [\n '<%= config.bin %> evals run <target-id>',\n '<%= config.bin %> evals run <target-id> --parallel 3 --runs-per-eval 2',\n '<%= config.bin %> evals run <target-id> --skip-baseline --skip-grading',\n ];\n\n static override args = {\n targetId: Args.string({ description: 'Eval target ID', required: true }),\n };\n\n static override flags = {\n parallel: Flags.integer({ description: 'Number of parallel eval executions', default: 1 }),\n 'runs-per-eval': Flags.integer({ description: 'Number of runs per eval for variance analysis', default: 1 }),\n iteration: Flags.integer({ description: 'Iteration number for tracking', default: 1 }),\n 'skip-baseline': Flags.boolean({ description: 'Skip baseline (without_target) runs', default: false }),\n 'skip-grading': Flags.boolean({ description: 'Skip LLM grading step', default: false }),\n model: Flags.string({ description: 'Model for eval execution (default: user configured)' }),\n 'grader-model': Flags.string({ description: 'Model for grading (default: same as execution model)' }),\n timeout: Flags.integer({ description: 'Timeout per eval in ms', default: 120_000 }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(EvalRunCommand);\n this.requireAuth();\n\n // Fetch target and its evals\n const target = await apiGet<EvalTarget>(`/api/eval-targets/${args.targetId}`);\n const evals = await apiGet<Eval[]>(`/api/eval-targets/${args.targetId}/evals`);\n\n if (evals.length === 0) {\n this.error(`No evals found for target \"${target.name}\". Create some with \\`rulemetric evals create\\`.`);\n }\n\n this.log(`Running ${evals.length} eval(s) for \"${target.name}\" v${target.version}`);\n this.log(`Config: ${flags['runs-per-eval']} run(s) per eval, parallel=${flags.parallel}, iteration=${flags.iteration}`);\n if (flags['skip-baseline']) this.log('Skipping baseline runs');\n if (flags['skip-grading']) this.log('Skipping grading');\n this.log('');\n\n const configurations: Array<{ name: string; content?: string }> = [\n { name: 'with_target', content: target.content },\n ];\n if (!flags['skip-baseline']) {\n configurations.push({ name: 'without_target' });\n }\n\n // Build the work queue\n interface WorkItem {\n eval_: Eval;\n configuration: string;\n targetContent?: string;\n runNumber: number;\n }\n const workQueue: WorkItem[] = [];\n\n for (const eval_ of evals) {\n for (const config of configurations) {\n for (let run = 1; run <= flags['runs-per-eval']; run++) {\n workQueue.push({\n eval_: eval_,\n configuration: config.name,\n targetContent: config.content,\n runNumber: run,\n });\n }\n }\n }\n\n // Execute with concurrency control\n const results: EvalRunResult[] = [];\n const concurrency = flags.parallel;\n\n for (let i = 0; i < workQueue.length; i += concurrency) {\n const batch = workQueue.slice(i, i + concurrency);\n const batchResults = await Promise.all(\n batch.map((item) => this.executeAndGrade(item, target, flags)),\n );\n results.push(...batchResults);\n }\n\n // Post results to API\n this.log('');\n this.log('Posting results to API...');\n\n for (const result of results) {\n await apiPost('/api/eval-runs', result);\n }\n\n // Summary\n this.log('');\n this.log('=== Results Summary ===');\n\n for (const config of configurations) {\n const configResults = results.filter((r) => r.configuration === config.name);\n const completedRuns = configResults.filter((r) => r.status === 'completed');\n const gradedRuns = completedRuns.filter((r) => Object.keys(r.grading).length > 0);\n\n this.log(`\\n${config.name}:`);\n this.log(` Runs: ${completedRuns.length}/${configResults.length} completed`);\n\n if (gradedRuns.length > 0) {\n const passRates = gradedRuns\n .map((r) => (r.grading as Record<string, any>).summary?.pass_rate ?? 0);\n const avgPassRate = passRates.reduce((a: number, b: number) => a + b, 0) / passRates.length;\n this.log(` Avg pass_rate: ${(avgPassRate * 100).toFixed(1)}%`);\n }\n\n for (const r of configResults) {\n const evalName = evals.find((e) => e.id === r.evalId)?.name ?? r.evalId;\n const passRate = (r.grading as Record<string, any>).summary?.pass_rate;\n const passRateStr = passRate !== undefined ? ` pass_rate=${(passRate * 100).toFixed(0)}%` : '';\n const timeStr = (r.timing as Record<string, any>).duration_ms ? ` ${((r.timing as Record<string, any>).duration_ms / 1000).toFixed(1)}s` : '';\n this.log(` [${r.status}] ${evalName} run#${r.runNumber}${passRateStr}${timeStr}`);\n }\n }\n\n if (!flags['skip-baseline'] && results.length > 0) {\n const withTarget = results.filter((r) => r.configuration === 'with_target' && Object.keys(r.grading).length > 0);\n const withoutTarget = results.filter((r) => r.configuration === 'without_target' && Object.keys(r.grading).length > 0);\n\n if (withTarget.length > 0 && withoutTarget.length > 0) {\n const avgWith = withTarget.map((r) => (r.grading as Record<string, any>).summary?.pass_rate ?? 0).reduce((a: number, b: number) => a + b, 0) / withTarget.length;\n const avgWithout = withoutTarget.map((r) => (r.grading as Record<string, any>).summary?.pass_rate ?? 0).reduce((a: number, b: number) => a + b, 0) / withoutTarget.length;\n const delta = avgWith - avgWithout;\n this.log(`\\nDelta: ${delta > 0 ? '+' : ''}${(delta * 100).toFixed(1)}% (with_target vs without_target)`);\n }\n }\n }\n\n private async executeAndGrade(\n item: { eval_: Eval; configuration: string; targetContent?: string; runNumber: number },\n target: EvalTarget,\n flags: { 'skip-grading': boolean; model?: string; 'grader-model'?: string; timeout: number; iteration: number },\n ): Promise<EvalRunResult> {\n const { eval_, configuration, targetContent, runNumber } = item;\n\n this.log(`[${configuration}] ${eval_.name} run#${runNumber} \u2014 executing...`);\n\n // Execute the eval\n const execResult = await executeEval({\n prompt: eval_.prompt,\n targetContent,\n timeout: flags.timeout,\n model: flags.model,\n });\n\n if (execResult.error) {\n this.log(`[${configuration}] ${eval_.name} run#${runNumber} \u2014 FAILED: ${execResult.error}`);\n return {\n evalId: eval_.id,\n evalTargetId: target.id,\n evalTargetVersion: target.version,\n configuration,\n runNumber,\n iteration: flags.iteration,\n status: 'failed',\n outputs: { error: execResult.error },\n timing: { duration_ms: execResult.durationMs, total_tokens: execResult.totalTokens },\n grading: {},\n };\n }\n\n this.log(`[${configuration}] ${eval_.name} run#${runNumber} \u2014 completed in ${(execResult.durationMs / 1000).toFixed(1)}s`);\n\n // Grade if not skipped and expectations exist\n let grading: Record<string, unknown> = {};\n\n if (!flags['skip-grading'] && eval_.expectations.length > 0) {\n this.log(`[${configuration}] ${eval_.name} run#${runNumber} \u2014 grading...`);\n\n const gradingResult = await gradeEvalOutput({\n prompt: eval_.prompt,\n output: execResult.output,\n expectations: eval_.expectations,\n model: flags['grader-model'] ?? flags.model,\n timeout: flags.timeout,\n });\n\n grading = gradingResult as unknown as Record<string, unknown>;\n const passRate = gradingResult.summary.pass_rate;\n this.log(`[${configuration}] ${eval_.name} run#${runNumber} \u2014 grading done: pass_rate=${(passRate * 100).toFixed(0)}%`);\n }\n\n return {\n evalId: eval_.id,\n evalTargetId: target.id,\n evalTargetVersion: target.version,\n configuration,\n runNumber,\n iteration: flags.iteration,\n status: 'completed',\n outputs: { transcript: execResult.output },\n timing: {\n duration_ms: execResult.durationMs,\n total_tokens: execResult.totalTokens,\n total_duration_seconds: execResult.durationMs / 1000,\n },\n grading,\n };\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAmC5B,IAAqB,iBAArB,MAAqB,wBAAuB,YAAY;AAAA,EACtD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,UAAU,KAAK,OAAO,EAAE,aAAa,kBAAkB,UAAU,KAAK,CAAC;AAAA,EACzE;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,UAAU,MAAM,QAAQ,EAAE,aAAa,sCAAsC,SAAS,EAAE,CAAC;AAAA,IACzF,iBAAiB,MAAM,QAAQ,EAAE,aAAa,iDAAiD,SAAS,EAAE,CAAC;AAAA,IAC3G,WAAW,MAAM,QAAQ,EAAE,aAAa,iCAAiC,SAAS,EAAE,CAAC;AAAA,IACrF,iBAAiB,MAAM,QAAQ,EAAE,aAAa,uCAAuC,SAAS,MAAM,CAAC;AAAA,IACrG,gBAAgB,MAAM,QAAQ,EAAE,aAAa,yBAAyB,SAAS,MAAM,CAAC;AAAA,IACtF,OAAO,MAAM,OAAO,EAAE,aAAa,sDAAsD,CAAC;AAAA,IAC1F,gBAAgB,MAAM,OAAO,EAAE,aAAa,uDAAuD,CAAC;AAAA,IACpG,SAAS,MAAM,QAAQ,EAAE,aAAa,0BAA0B,SAAS,KAAQ,CAAC;AAAA,EACpF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,eAAc;AACvD,SAAK,YAAY;AAGjB,UAAM,SAAS,MAAM,OAAmB,qBAAqB,KAAK,QAAQ,EAAE;AAC5E,UAAM,QAAQ,MAAM,OAAe,qBAAqB,KAAK,QAAQ,QAAQ;AAE7E,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,MAAM,8BAA8B,OAAO,IAAI,kDAAkD;AAAA,IACxG;AAEA,SAAK,IAAI,WAAW,MAAM,MAAM,iBAAiB,OAAO,IAAI,MAAM,OAAO,OAAO,EAAE;AAClF,SAAK,IAAI,WAAW,MAAM,eAAe,CAAC,8BAA8B,MAAM,QAAQ,eAAe,MAAM,SAAS,EAAE;AACtH,QAAI,MAAM,eAAe,EAAG,MAAK,IAAI,wBAAwB;AAC7D,QAAI,MAAM,cAAc,EAAG,MAAK,IAAI,kBAAkB;AACtD,SAAK,IAAI,EAAE;AAEX,UAAM,iBAA4D;AAAA,MAChE,EAAE,MAAM,eAAe,SAAS,OAAO,QAAQ;AAAA,IACjD;AACA,QAAI,CAAC,MAAM,eAAe,GAAG;AAC3B,qBAAe,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAAA,IAChD;AASA,UAAM,YAAwB,CAAC;AAE/B,eAAW,SAAS,OAAO;AACzB,iBAAW,UAAU,gBAAgB;AACnC,iBAAS,MAAM,GAAG,OAAO,MAAM,eAAe,GAAG,OAAO;AACtD,oBAAU,KAAK;AAAA,YACb;AAAA,YACA,eAAe,OAAO;AAAA,YACtB,eAAe,OAAO;AAAA,YACtB,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAA2B,CAAC;AAClC,UAAM,cAAc,MAAM;AAE1B,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,aAAa;AACtD,YAAM,QAAQ,UAAU,MAAM,GAAG,IAAI,WAAW;AAChD,YAAM,eAAe,MAAM,QAAQ;AAAA,QACjC,MAAM,IAAI,CAAC,SAAS,KAAK,gBAAgB,MAAM,QAAQ,KAAK,CAAC;AAAA,MAC/D;AACA,cAAQ,KAAK,GAAG,YAAY;AAAA,IAC9B;AAGA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,2BAA2B;AAEpC,eAAW,UAAU,SAAS;AAC5B,YAAM,QAAQ,kBAAkB,MAAM;AAAA,IACxC;AAGA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,yBAAyB;AAElC,eAAW,UAAU,gBAAgB;AACnC,YAAM,gBAAgB,QAAQ,OAAO,CAAC,MAAM,EAAE,kBAAkB,OAAO,IAAI;AAC3E,YAAM,gBAAgB,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW;AAC1E,YAAM,aAAa,cAAc,OAAO,CAAC,MAAM,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;AAEhF,WAAK,IAAI;AAAA,EAAK,OAAO,IAAI,GAAG;AAC5B,WAAK,IAAI,WAAW,cAAc,MAAM,IAAI,cAAc,MAAM,YAAY;AAE5E,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,YAAY,WACf,IAAI,CAAC,MAAO,EAAE,QAAgC,SAAS,aAAa,CAAC;AACxE,cAAM,cAAc,UAAU,OAAO,CAAC,GAAW,MAAc,IAAI,GAAG,CAAC,IAAI,UAAU;AACrF,aAAK,IAAI,qBAAqB,cAAc,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,MAChE;AAEA,iBAAW,KAAK,eAAe;AAC7B,cAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;AACjE,cAAM,WAAY,EAAE,QAAgC,SAAS;AAC7D,cAAM,cAAc,aAAa,SAAY,eAAe,WAAW,KAAK,QAAQ,CAAC,CAAC,MAAM;AAC5F,cAAM,UAAW,EAAE,OAA+B,cAAc,KAAM,EAAE,OAA+B,cAAc,KAAM,QAAQ,CAAC,CAAC,MAAM;AAC3I,aAAK,IAAI,MAAM,EAAE,MAAM,KAAK,QAAQ,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,EAAE;AAAA,MACnF;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,eAAe,KAAK,QAAQ,SAAS,GAAG;AACjD,YAAM,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,kBAAkB,iBAAiB,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;AAC/G,YAAM,gBAAgB,QAAQ,OAAO,CAAC,MAAM,EAAE,kBAAkB,oBAAoB,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC;AAErH,UAAI,WAAW,SAAS,KAAK,cAAc,SAAS,GAAG;AACrD,cAAM,UAAU,WAAW,IAAI,CAAC,MAAO,EAAE,QAAgC,SAAS,aAAa,CAAC,EAAE,OAAO,CAAC,GAAW,MAAc,IAAI,GAAG,CAAC,IAAI,WAAW;AAC1J,cAAM,aAAa,cAAc,IAAI,CAAC,MAAO,EAAE,QAAgC,SAAS,aAAa,CAAC,EAAE,OAAO,CAAC,GAAW,MAAc,IAAI,GAAG,CAAC,IAAI,cAAc;AACnK,cAAM,QAAQ,UAAU;AACxB,aAAK,IAAI;AAAA,SAAY,QAAQ,IAAI,MAAM,EAAE,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC,mCAAmC;AAAA,MACzG;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,MACA,QACA,OACwB;AACxB,UAAM,EAAE,OAAO,eAAe,eAAe,UAAU,IAAI;AAE3D,SAAK,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,QAAQ,SAAS,sBAAiB;AAG3E,UAAM,aAAa,MAAM,YAAY;AAAA,MACnC,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,IACf,CAAC;AAED,QAAI,WAAW,OAAO;AACpB,WAAK,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,QAAQ,SAAS,mBAAc,WAAW,KAAK,EAAE;AAC1F,aAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,cAAc,OAAO;AAAA,QACrB,mBAAmB,OAAO;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,QAAQ;AAAA,QACR,SAAS,EAAE,OAAO,WAAW,MAAM;AAAA,QACnC,QAAQ,EAAE,aAAa,WAAW,YAAY,cAAc,WAAW,YAAY;AAAA,QACnF,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAEA,SAAK,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,QAAQ,SAAS,yBAAoB,WAAW,aAAa,KAAM,QAAQ,CAAC,CAAC,GAAG;AAGzH,QAAI,UAAmC,CAAC;AAExC,QAAI,CAAC,MAAM,cAAc,KAAK,MAAM,aAAa,SAAS,GAAG;AAC3D,WAAK,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,QAAQ,SAAS,oBAAe;AAEzE,YAAM,gBAAgB,MAAM,gBAAgB;AAAA,QAC1C,QAAQ,MAAM;AAAA,QACd,QAAQ,WAAW;AAAA,QACnB,cAAc,MAAM;AAAA,QACpB,OAAO,MAAM,cAAc,KAAK,MAAM;AAAA,QACtC,SAAS,MAAM;AAAA,MACjB,CAAC;AAED,gBAAU;AACV,YAAM,WAAW,cAAc,QAAQ;AACvC,WAAK,IAAI,IAAI,aAAa,KAAK,MAAM,IAAI,QAAQ,SAAS,oCAA+B,WAAW,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,IACxH;AAEA,WAAO;AAAA,MACL,QAAQ,MAAM;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,mBAAmB,OAAO;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,QAAQ;AAAA,MACR,SAAS,EAAE,YAAY,WAAW,OAAO;AAAA,MACzC,QAAQ;AAAA,QACN,aAAa,WAAW;AAAA,QACxB,cAAc,WAAW;AAAA,QACzB,wBAAwB,WAAW,aAAa;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/gateway/ensure.ts"],
4
- "sourcesContent": ["import { spawn } from 'node:child_process';\nimport { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\nimport {\n isGatewayRunning,\n isRulemetricGatewayListening,\n spawnGateway,\n GATEWAY_PORT,\n} from '../../lib/gateway-lifecycle.js';\nimport { isPidLiveAndMatching, MITMPROXY_COMMAND_PATTERN } from '../../lib/pid-identity.js';\nimport { unpinEditorProxies, repinEditorProxies } from '../../lib/editor-proxy-pins.js';\nimport { writeVSCodeUserProxyConfig, writeCursorUserProxyConfig } from '../../lib/hooks-config.js';\n\nconst CONFIG_DIR = join(homedir(), '.config', 'rulemetric');\nconst ADDON_VERSION_FILE = join(CONFIG_DIR, 'proxy-addon.version');\nconst PROXY_PID_FILE = join(CONFIG_DIR, 'proxy.pid');\nconst DRIFT_RESTART_MARKER = join(CONFIG_DIR, 'proxy-drift-restart.at');\nconst DRIFT_RESTART_COOLDOWN_MS = 10 * 60_000;\n\nexport default class GatewayEnsure extends BaseCommand {\n static override description = 'Ensure the gateway proxy is running (called by hooks, not for direct use)';\n static override hidden = true;\n\n async run(): Promise<void> {\n await this.parse(GatewayEnsure);\n\n // Addon staleness: the gateway\u2194addon version-drift restart is CIRCULAR \u2014\n // both sides compare versions frozen at their own spawn, so after\n // `npm i -g` upgrades the CLI, a healthy old proxy keeps running old addon\n // code forever (published capture fixes never reach the machine). THIS\n // process is exec'd fresh by every session-start hook, so its\n // config.version is always the on-disk truth \u2014 making it the one component\n // that can detect the drift. Debounced, detached, never blocks the hook.\n this.maybeRestartStaleProxy();\n\n // Port truth first: the identity handshake distinguishes our live gateway\n // from a foreign process squatting on :8787. Spawning against a held port\n // just produces an EADDRINUSE child; spawning is only useful on 'dead'.\n const identity = await isRulemetricGatewayListening(GATEWAY_PORT);\n\n if (identity.status === 'ours-live') {\n // Restore any editor pins a prior dead/foreign window removed \u2014 the\n // gateway is verifiably ours again. The writers refuse to overwrite a\n // user-owned proxy, so this can never clobber a corporate setting.\n const repinned = repinEditorProxies((editor) => {\n if (editor === 'vscode') writeVSCodeUserProxyConfig(GATEWAY_PORT);\n else writeCursorUserProxyConfig(GATEWAY_PORT);\n });\n if (repinned.length > 0) {\n console.error(`[RuleMetric] Gateway healthy again \u2014 restored ${repinned.join(', ')} proxy settings.`);\n }\n return; // Already running, silent success\n }\n\n if (identity.status === 'foreign') {\n // A gateway from an older CLI build answers TCP but not the handshake;\n // the PID-identity check on the pidfile confirms it's ours \u2014 leave it be.\n if (isGatewayRunning()) return;\n // Genuinely foreign: warn (don't crash the hook) \u2014 HTTPS_PROXY may be\n // pinned at a port we don't own, which breaks Claude Code's HTTPS. The\n // editor user-level pins are worse still (http.proxy + strictSSL=false\n // routing at a port someone else owns), and nothing else can heal them\n // \u2014 unpin now; the marker restores them once the port is ours again.\n const unpinned = unpinEditorProxies(GATEWAY_PORT);\n console.error(\n `[RuleMetric] A non-RuleMetric process holds :${GATEWAY_PORT} \u2014 cannot start gateway. ` +\n (unpinned.length > 0\n ? `Unpinned ${unpinned.join(', ')} proxy settings so editors are not routed through it. `\n : '') +\n 'Run `rulemetric diagnostics` if Claude Code HTTPS requests fail.',\n );\n return;\n }\n\n try {\n spawnGateway(this.config.version);\n } catch (err) {\n // Don't crash the hook \u2014 just warn\n console.error(`[RuleMetric] Could not start gateway: ${(err as Error).message}`);\n }\n }\n\n private maybeRestartStaleProxy(): void {\n try {\n if (!existsSync(ADDON_VERSION_FILE)) return;\n const runningVersion = readFileSync(ADDON_VERSION_FILE, 'utf-8').trim();\n if (!runningVersion || runningVersion === this.config.version) return;\n\n // Only restart a proxy that is actually OURS and alive \u2014 a stale version\n // file next to a dead (or docker-marked) proxy is proxy start's problem.\n const pidRaw = readFileSync(PROXY_PID_FILE, 'utf-8').trim();\n const pid = Number(pidRaw);\n if (!Number.isFinite(pid) || !isPidLiveAndMatching(pid, MITMPROXY_COMMAND_PATTERN)) {\n return;\n }\n\n // Cooldown: session starts can cluster, and `proxy restart` needs time to\n // rewrite the version file before the drift signal clears.\n try {\n const age = Date.now() - statSync(DRIFT_RESTART_MARKER).mtimeMs;\n if (age < DRIFT_RESTART_COOLDOWN_MS) return;\n } catch {\n /* no marker yet \u2014 proceed */\n }\n writeFileSync(DRIFT_RESTART_MARKER, new Date().toISOString());\n\n // process.argv[1] is this CLI's entry script (bin/run.js \u2014 dev or global\n // install alike), so the restarted proxy runs the NEW on-disk code and\n // re-stamps the version file, converging the drift.\n const child = spawn(process.execPath, [process.argv[1], 'proxy', 'restart'], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n console.error(\n `[RuleMetric] Capture proxy is running CLI ${runningVersion} but ${this.config.version} is installed \u2014 restarting it in the background.`,\n );\n } catch {\n /* never break the session-start hook */\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,YAAY,cAAc,UAAU,qBAAqB;AAClE,SAAS,eAAe;AACxB,SAAS,YAAY;AAYrB,IAAM,aAAa,KAAK,QAAQ,GAAG,WAAW,YAAY;AAC1D,IAAM,qBAAqB,KAAK,YAAY,qBAAqB;AACjE,IAAM,iBAAiB,KAAK,YAAY,WAAW;AACnD,IAAM,uBAAuB,KAAK,YAAY,wBAAwB;AACtE,IAAM,4BAA4B,KAAK;AAEvC,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cAAc;AAAA,EAC9B,OAAgB,SAAS;AAAA,EAEzB,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,cAAa;AAS9B,SAAK,uBAAuB;AAK5B,UAAM,WAAW,MAAM,6BAA6B,YAAY;AAEhE,QAAI,SAAS,WAAW,aAAa;AAInC,YAAM,WAAW,mBAAmB,CAAC,WAAW;AAC9C,YAAI,WAAW,SAAU,4BAA2B,YAAY;AAAA,YAC3D,4BAA2B,YAAY;AAAA,MAC9C,CAAC;AACD,UAAI,SAAS,SAAS,GAAG;AACvB,gBAAQ,MAAM,sDAAiD,SAAS,KAAK,IAAI,CAAC,kBAAkB;AAAA,MACtG;AACA;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,WAAW;AAGjC,UAAI,iBAAiB,EAAG;AAMxB,YAAM,WAAW,mBAAmB,YAAY;AAChD,cAAQ;AAAA,QACN,gDAAgD,YAAY,oCACzD,SAAS,SAAS,IACf,YAAY,SAAS,KAAK,IAAI,CAAC,2DAC/B,MACJ;AAAA,MACJ;AACA;AAAA,IACF;AAEA,QAAI;AACF,mBAAa,KAAK,OAAO,OAAO;AAAA,IAClC,SAAS,KAAK;AAEZ,cAAQ,MAAM,yCAA0C,IAAc,OAAO,EAAE;AAAA,IACjF;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,QAAI;AACF,UAAI,CAAC,WAAW,kBAAkB,EAAG;AACrC,YAAM,iBAAiB,aAAa,oBAAoB,OAAO,EAAE,KAAK;AACtE,UAAI,CAAC,kBAAkB,mBAAmB,KAAK,OAAO,QAAS;AAI/D,YAAM,SAAS,aAAa,gBAAgB,OAAO,EAAE,KAAK;AAC1D,YAAM,MAAM,OAAO,MAAM;AACzB,UAAI,CAAC,OAAO,SAAS,GAAG,KAAK,CAAC,qBAAqB,KAAK,yBAAyB,GAAG;AAClF;AAAA,MACF;AAIA,UAAI;AACF,cAAM,MAAM,KAAK,IAAI,IAAI,SAAS,oBAAoB,EAAE;AACxD,YAAI,MAAM,0BAA2B;AAAA,MACvC,QAAQ;AAAA,MAER;AACA,oBAAc,uBAAsB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAK5D,YAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,QAAQ,KAAK,CAAC,GAAG,SAAS,SAAS,GAAG;AAAA,QAC3E,UAAU;AAAA,QACV,OAAO;AAAA,MACT,CAAC;AACD,YAAM,MAAM;AACZ,cAAQ;AAAA,QACN,6CAA6C,cAAc,QAAQ,KAAK,OAAO,OAAO;AAAA,MACxF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/hooks/emit-instructions.ts"],
4
- "sourcesContent": ["import { Command, Flags } from '@oclif/core';\nimport { buildInstructionSnapshot } from '../../lib/instruction-snapshot.js';\n\n/**\n * Prints a synthetic instruction snapshot (built from on-disk CLAUDE.md files) as\n * JSON on stdout. Consumed by `session-end.sh`, which POSTs it to\n * `/api/sessions/:id/context-snapshots` so `link-instructions` can link\n * `claude_md` instructions on a hooks-only (zero-proxy) session.\n *\n * Extends raw oclif `Command` (not BaseCommand): it does no network or auth \u2014 it\n * only reads local files \u2014 and stdout MUST be clean JSON for the curl in\n * session-end.sh. Prints nothing when the project has no instruction files.\n */\nexport default class HooksEmitInstructions extends Command {\n static override description =\n 'Print a synthetic instruction snapshot (on-disk CLAUDE.md) as JSON for zero-proxy instruction linking';\n\n static override hidden = true;\n\n static override flags = {\n 'project-dir': Flags.string({ description: 'Project directory to scan (defaults to cwd)' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(HooksEmitInstructions);\n const snapshot = buildInstructionSnapshot(flags['project-dir'] ?? process.cwd());\n if (snapshot) {\n process.stdout.write(JSON.stringify(snapshot));\n }\n }\n}\n"],
5
- "mappings": ";;;;;;AAAA,SAAS,SAAS,aAAa;AAa/B,IAAqB,wBAArB,MAAqB,+BAA8B,QAAQ;AAAA,EACzD,OAAgB,cACd;AAAA,EAEF,OAAgB,SAAS;AAAA,EAEzB,OAAgB,QAAQ;AAAA,IACtB,eAAe,MAAM,OAAO,EAAE,aAAa,8CAA8C,CAAC;AAAA,EAC5F;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,sBAAqB;AACxD,UAAM,WAAW,yBAAyB,MAAM,aAAa,KAAK,QAAQ,IAAI,CAAC;AAC/E,QAAI,UAAU;AACZ,cAAQ,OAAO,MAAM,KAAK,UAAU,QAAQ,CAAC;AAAA,IAC/C;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/hooks/install.ts"],
4
- "sourcesContent": ["import { Flags } from '@oclif/core';\nimport { execFileSync, spawnSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, dirname } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\nimport {\n isGatewayRunning,\n isRulemetricGatewayListening,\n waitForRulemetricGateway,\n spawnGateway,\n stopGateway,\n GATEWAY_PORT,\n} from '../../lib/gateway-lifecycle.js';\nimport { describePortOwner } from '../../lib/gateway-identity.js';\nimport { findBinary } from '../../lib/which.js';\n\n// Resolve the directory holding the `rulemetric` executable, so hook commands\n// can prepend it to PATH. Claude Code runs hooks via `/bin/sh -c` with a\n// minimal PATH that omits nvm/pnpm global bin dirs \u2014 so a bare `rulemetric`\n// hits \"command not found\" and capture (plus the session-start gateway\n// auto-start) silently fails. We resolve it here, in the install process's\n// full PATH, and bake the dir into the hook command. Returns undefined on\n// failure \u2192 callers fall back to the bare `rulemetric` (dev/back-compat).\nfunction resolveHookBinDir(): string | undefined {\n try {\n const out = execFileSync('/bin/sh', ['-c', 'command -v rulemetric'], {\n encoding: 'utf-8',\n }).trim();\n if (out && existsSync(out)) return dirname(out);\n } catch {\n /* not resolvable \u2014 fall back to bare `rulemetric` */\n }\n return undefined;\n}\n\n// True iff `rulemetric service install` has wired the gateway up as a launchd\n// agent. When this returns true, hooks install must NOT spawn its own\n// detached gateway \u2014 two processes fighting for :8787 means one crash-loops\n// and Claude Code's HTTPS_PROXY breaks.\nfunction isGatewayLaunchdManaged(): boolean {\n try {\n execFileSync('launchctl', ['list', 'com.rulemetric.gateway'], {\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n return true;\n } catch {\n // Non-zero exit = label not loaded\n return false;\n }\n}\nimport {\n writeStatuslineShim,\n readCurrentStatusLine,\n isStatuslineShimInstalled,\n STATUSLINE_SETTINGS_VALUE,\n STATUSLINE_SHIM_PATH,\n} from '../../lib/statusline-shim.js';\nimport {\n mergeClaudeCodeHooks,\n removeClaudeCodeHooks,\n readClaudeSettings,\n writeClaudeSettingsWithBackup,\n claudeSettingsInstallPath,\n migrateSharedClaudeSettings,\n RULEMETRIC_NO_PROXY,\n writeCursorProxyConfig,\n writeCursorUserProxyConfig,\n writeVSCodeProxyConfig,\n installMacOSProxyEnv,\n writeVSCodeUserProxyConfig,\n writeCursorHooks,\n writeCursorUserHooks,\n writeCopilotHooks,\n writeAntigravityHooks,\n writeAntigravityUserHooks,\n} from '../../lib/hooks-config.js';\nimport { bootstrapActiveOrg } from '../../lib/active-org-refresh.js';\nimport { ensureDeviceApiKey } from '../../lib/ensure-api-key.js';\nimport { loadEnvFileAuth } from '../../lib/auth.js';\nimport { emitSetupEvent } from '../../lib/telemetry.js';\nimport { detectTmux } from '../../lib/detect-tmux.js';\n\nconst CERT_PATH = join(homedir(), '.mitmproxy', 'mitmproxy-ca-cert.pem');\n\nexport default class HooksInstall extends BaseCommand {\n static override description = 'Install session tracking hooks and context capture proxy for Claude Code';\n\n static override examples = [\n '<%= config.bin %> hooks install',\n '<%= config.bin %> hooks install --global',\n '<%= config.bin %> hooks install --no-proxy',\n ];\n\n static override flags = {\n 'no-proxy': Flags.boolean({\n default: false,\n description: 'Skip proxy/gateway configuration (hooks only)',\n }),\n 'project-dir': Flags.string({\n description: 'Project directory to install hooks in (defaults to cwd)',\n }),\n global: Flags.boolean({\n char: 'g',\n default: false,\n description: 'Install hooks globally (~/.claude/settings.json) so all projects are tracked',\n }),\n 'statusline-usage': Flags.boolean({\n default: false,\n description: 'Install the statusline shim so Claude Code pushes live rate_limits on every refresh (makes /usage rings update in real time without needing the proxy)',\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(HooksInstall);\n const isGlobal = flags.global;\n const projectPath = isGlobal ? homedir() : (flags['project-dir'] ?? process.cwd());\n const configDir = join(projectPath, '.claude');\n // Project installs write machine-local state (PATH-prefixed hook commands,\n // HTTPS_PROXY, per-user CA path) to settings.local.json \u2014 the shared\n // settings.json is typically checked into git, and a committed HTTPS_PROXY\n // breaks Claude Code on every clone without a live gateway. Global installs\n // keep ~/.claude/settings.json (not in a repo).\n const configPath = claudeSettingsInstallPath(configDir, isGlobal);\n const settingsFileName = isGlobal ? 'settings.json' : 'settings.local.json';\n const noProxy = flags['no-proxy'];\n // Whether the capture proxy actually went live this run (HTTPS_PROXY pinned\n // against a verified-live gateway). Drives the \"next steps\" copy so we never\n // tell the user to start a proxy that is already running.\n let proxyActive = false;\n // Why the proxy is NOT fully active (undefined = fully active + CA trusted).\n // Reported via telemetry so a remote install's outcome is debuggable without\n // a relayed log: 'no_proxy_flag' | 'mitmproxy_unavailable' | 'ca_not_generated'\n // | 'gateway_not_live' | 'gateway_port_foreign' (another app owns :8787)\n // | 'ca_untrusted' (proxy pinned, Claude-Code-only).\n let proxyReason: string | undefined = noProxy ? 'no_proxy_flag' : undefined;\n // Whether the mitmproxy CA is trusted in the system store (gates machine-wide\n // capture). Hoisted from \u00A72 so telemetry can report the partial state.\n let caTrusted = false;\n // Package managers detected on this machine (brew/pipx/uv) \u2014 reported in\n // telemetry so a remote `mitmproxy_unavailable` is DISAMBIGUATED: [] means\n // \"no package manager, proxy genuinely can't install here\"; a non-empty list\n // with reason:mitmproxy_install_failed means one was present but the install\n // failed (a real bug to chase, not a bare machine).\n let pkgManagers: string[] = [];\n\n if (isGlobal) {\n this.log(`Installing hooks globally \u2192 ${configPath}`);\n }\n\n // Read or create the target settings file. Never crash on a malformed\n // file \u2014 a fresh user's hand-edited settings must not block capture install.\n const { settings, recoveredBackup } = readClaudeSettings(configPath);\n if (recoveredBackup) {\n this.log(`[!!] ${configPath} was not valid JSON \u2014 backed it up to ${recoveredBackup} and continued with a fresh file.`);\n }\n\n // \u2500\u2500 0. Migrate machine-local state OUT of the shared settings.json \u2500\u2500\u2500\u2500\u2500\n // Project installs only (the global home file isn't in a repo). Older\n // installs wrote hooks + proxy env into .claude/settings.json, which is\n // typically checked into git: every clone then carries a PATH-prefixed hook\n // command for someone else's machine and an HTTPS_PROXY pin that breaks\n // Claude Code wherever no gateway listens on that port. Stripping our\n // entries here (they're re-written to settings.local.json below) also\n // prevents double execution \u2014 Claude Code merges and runs hooks from BOTH\n // files. User-owned hooks/env/statusLine are never touched.\n if (!isGlobal) {\n const migration = migrateSharedClaudeSettings(join(configDir, 'settings.json'), GATEWAY_PORT);\n if (migration.migrated) {\n this.log('[OK] Moved RuleMetric machine-local state out of the shared .claude/settings.json (it now lives in .claude/settings.local.json)');\n if (migration.backupPath) {\n this.log(` Previous shared settings backed up \u2192 ${migration.backupPath}`);\n }\n // A legacy install may have pointed statusLine at this machine's shim\n // from the shared file; re-home it to the local file so the feature\n // keeps working \u2014 but only when the shim script actually exists here (a\n // teammate's poisoned path must not become a broken local statusLine).\n if (migration.removedStatusline && existsSync(STATUSLINE_SHIM_PATH) && !isStatuslineShimInstalled(settings)) {\n settings.statusLine = STATUSLINE_SETTINGS_VALUE;\n }\n }\n }\n\n // Self-heal the ~1-hour auth fuse: if this device authenticated but the\n // auto key-mint failed (or it authenticated pre-0.6.1), the env file holds\n // only an EXPIRING access token \u2014 hooks/proxy capture silently dies when it\n // lapses. hooks install is a natural authenticated moment to retry the\n // mint; ensureDeviceApiKey no-ops when a key already exists and never\n // throws. Skipped entirely when the device has no credentials at all (an\n // unauthenticated install would just warn-noise a guaranteed 401).\n const envAuth = loadEnvFileAuth();\n if ((envAuth.accessToken || process.env.RULEMETRIC_ACCESS_TOKEN) &&\n !envAuth.apiKey && !process.env.RULEMETRIC_API_KEY) {\n await ensureDeviceApiKey(this.log.bind(this), this.warn.bind(this), this.config.version);\n }\n\n // \u2500\u2500 1. Install Claude Code session-tracking hooks (hooks-first, zero-proxy\n // capture). Strip any stale rulemetric entries first \u2014 handles old command\n // formats, preserves the user's own hooks \u2014 then merge the current canonical\n // set. Runs regardless of --no-proxy: this is the whole point of the hooks\n // path, which captures full sessions (lifecycle + SessionEnd transcript\n // reimport) without mitmproxy / CA trust / gateway. The proxy adds the\n // rendered system prompt (instruction-linking) + cross-tool capture on top.\n const refreshedHooks = removeClaudeCodeHooks(settings);\n // Resolve once; every hook writer (Claude Code, Cursor, Copilot) needs the\n // same PATH prefix so a GUI-launched tool with a minimal PATH can find the CLI.\n const hookBinDir = resolveHookBinDir();\n mergeClaudeCodeHooks(settings, hookBinDir);\n this.log(\n refreshedHooks\n ? `[OK] Refreshed RuleMetric Claude Code session hooks \u2192 .claude/${settingsFileName}`\n : `[OK] Installed RuleMetric Claude Code session hooks \u2192 .claude/${settingsFileName}`,\n );\n\n // \u2500\u2500 2. Configure gateway + proxy \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (!noProxy) {\n // Ensure mitmproxy is available\n let mitmAvailable = Boolean(findBinary('mitmdump'));\n if (!mitmAvailable) {\n this.log('');\n this.log('[!!] mitmproxy not found \u2014 installing...');\n // Record which package managers exist (telemetry disambiguation).\n pkgManagers = ['brew', 'pipx', 'uv'].filter((m) => Boolean(findBinary(m)));\n mitmAvailable = this.installMitmproxy();\n if (!mitmAvailable) {\n this.log('[!!] Could not install mitmproxy. Skipping proxy config.');\n this.log(' Install manually: pipx install mitmproxy');\n this.log(' Then re-run: rulemetric hooks install');\n }\n }\n\n // Generate CA cert if missing\n if (!existsSync(CERT_PATH)) {\n this.log('[..] Generating CA certificate...');\n const mitmdump = findBinary('mitmdump');\n if (mitmdump) {\n spawnSync(mitmdump, ['--set', 'listen_port=0', '-q'], {\n timeout: 5000,\n stdio: 'ignore',\n });\n if (existsSync(CERT_PATH)) {\n this.log(`[OK] CA certificate generated at ${CERT_PATH}`);\n } else {\n this.log('[!!] Could not generate CA cert');\n }\n }\n } else {\n this.log('[OK] CA certificate found');\n }\n\n // Trust CA cert in system store (if not already trusted). Track the\n // result: whether the CA is trusted decides if we may route MACHINE-WIDE /\n // native-app traffic through the MITM proxy (native apps validate against\n // the system keychain, so an untrusted CA breaks their TLS).\n const caGenerated = existsSync(CERT_PATH);\n if (caGenerated && !this.isCACertTrusted()) {\n this.log('[..] Installing CA certificate into system trust store (requires admin)...');\n caTrusted = this.trustCACert();\n if (caTrusted) {\n this.log('[OK] CA certificate trusted by system');\n } else {\n this.log('[!!] Could not install CA cert automatically.');\n if (process.platform === 'darwin') {\n this.log(` Run manually: sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ${CERT_PATH}`);\n } else if (process.platform === 'linux') {\n this.log(` Run manually: sudo cp ${CERT_PATH} /usr/local/share/ca-certificates/mitmproxy-ca.crt && sudo update-ca-certificates`);\n }\n }\n } else if (caGenerated) {\n this.log('[OK] CA certificate already trusted');\n caTrusted = true;\n }\n\n // Start the gateway BEFORE pinning HTTPS_PROXY. Possible port owners (in\n // order of precedence):\n // 1. launchd (`rulemetric service install` plist) \u2014 authoritative;\n // hooks must NOT spawn a competing copy that would fight for :8787\n // 2. an already-live gateway (identity handshake answers on :8787)\n // 3. a FOREIGN process on :8787 \u2014 never spawn against it, and below,\n // never pin HTTPS_PROXY at it\n // 4. nothing \u2014 spawn a fresh detached process\n const launchdManaged = isGatewayLaunchdManaged();\n const portIdentity = await isRulemetricGatewayListening(GATEWAY_PORT);\n if (launchdManaged) {\n this.log('[OK] Gateway managed by launchd (com.rulemetric.gateway)');\n } else if (portIdentity.status === 'ours-live') {\n this.log('[OK] Gateway already running');\n } else if (portIdentity.status === 'foreign' && isGatewayRunning()) {\n // A gateway from an older CLI build predates the identity endpoint and\n // probes as foreign, but the PID file confirms it's ours. Restart it so\n // this machine runs the current build (and answers the handshake).\n this.log('[..] Restarting gateway (running build predates the identity handshake)...');\n stopGateway();\n // Brief gap so the dying gateway releases :8787 before the fresh one\n // binds (same race `proxy restart` guards against).\n await new Promise((resolve) => setTimeout(resolve, 500));\n try {\n const pid = spawnGateway(this.config.version);\n this.log(`[OK] Gateway restarted (PID ${pid})`);\n } catch (err) {\n this.log(`[!!] Could not restart gateway: ${(err as Error).message}`);\n }\n } else if (portIdentity.status === 'foreign') {\n // Handled at the pin guard below \u2014 do NOT spawn a doomed copy.\n } else {\n try {\n const pid = spawnGateway(this.config.version);\n this.log(`[OK] Gateway started (PID ${pid})`);\n } catch (err) {\n this.log(`[!!] Could not start gateway: ${(err as Error).message}`);\n }\n }\n\n // Identity guard: ONLY pin HTTPS_PROXY once :8787 answers the identity\n // handshake as OUR gateway. Writing it against a dead port is the\n // fresh-laptop ConnectionRefused footgun, and writing it against a\n // FOREIGN process is worse \u2014 either way it breaks all of Claude Code's\n // HTTPS. If the port isn't verifiably ours, we leave Claude Code talking\n // to Anthropic directly; capture still works via the hooks installed in \u00A71.\n // Poll (not a one-shot probe): a just-spawned gateway needs a moment to\n // bind :8787, and a single immediate probe would fail-close every fresh\n // install and silently disable deep capture. A launchd-managed gateway on\n // an older build answers TCP but not the handshake \u2014 trust launchd's\n // ownership there (the port can't be foreign under its supervision).\n const gatewayIdentity = await waitForRulemetricGateway(GATEWAY_PORT, { timeoutMs: 4000 });\n if (!caGenerated) {\n // No CA \u2192 mitmproxy will regenerate one and intercept, but nothing\n // trusts it, so pinning HTTPS_PROXY would break even Claude Code's TLS.\n // Stay hooks-only rather than pin a proxy nothing can validate. Name the\n // precise cause: no mitmproxy AND no package manager to install it (a\n // genuine bare-machine gap) vs. a manager was present but the install\n // failed (a bug to chase, not a missing prereq).\n proxyReason = mitmAvailable\n ? 'ca_not_generated'\n : pkgManagers.length === 0\n ? 'no_package_manager'\n : 'mitmproxy_install_failed';\n this.log('[!!] No CA certificate \u2014 NOT setting HTTPS_PROXY (capture stays hooks-only).');\n this.log(' Install mitmproxy, then re-run: rulemetric hooks install');\n } else if (gatewayIdentity.status === 'foreign' && !launchdManaged) {\n // Something answers on :8787 but it is NOT our gateway. Pinning\n // HTTPS_PROXY at it would route every HTTPS request Claude Code makes\n // into an app that is not a proxy \u2014 total HTTPS breakage. Name the\n // holder so the user can free the port; proceed hooks-only.\n proxyReason = 'gateway_port_foreign';\n const owner = describePortOwner(GATEWAY_PORT);\n this.log(`[!!] Port :${GATEWAY_PORT} is held by a process that is NOT the RuleMetric gateway \u2014 NOT setting HTTPS_PROXY.`);\n this.log(\n owner\n ? ` Holding the port: ${owner}`\n : ` Could not identify the holder (try: lsof -nP -iTCP:${GATEWAY_PORT} -sTCP:LISTEN)`,\n );\n this.log(' Capture still works via hooks. Free the port, then re-run: rulemetric hooks install');\n } else if (gatewayIdentity.status === 'dead') {\n proxyReason = 'gateway_not_live';\n this.log(`[!!] Gateway is not answering on :${GATEWAY_PORT} \u2014 NOT setting HTTPS_PROXY.`);\n this.log(' Capture still works via hooks. To enable deep (proxy) capture later:');\n this.log(' rulemetric proxy start && rulemetric hooks install');\n } else {\n // ours-live, or launchd-managed answering TCP on an older build (its\n // supervision means the port holder is ours even without the marker).\n // Set permanent HTTPS_PROXY and NODE_EXTRA_CA_CERTS in the target\n // settings file (settings.local.json for project installs \u2014 these\n // values are machine-local and must never be committed). They point to\n // the gateway (verified live above), not mitmproxy directly.\n const env = (settings.env ?? {}) as Record<string, string>;\n env.HTTPS_PROXY = `http://localhost:${GATEWAY_PORT}`;\n // Bypass proxy for non-Anthropic traffic (Supabase auth, npm, etc.)\n env.NO_PROXY = RULEMETRIC_NO_PROXY;\n if (existsSync(CERT_PATH)) {\n env.NODE_EXTRA_CA_CERTS = CERT_PATH;\n }\n settings.env = env;\n proxyActive = true;\n this.log(`[OK] HTTPS_PROXY set to gateway on :${GATEWAY_PORT} (verified live)`);\n\n // Configure Cursor proxy (if .cursor/ exists)\n const cursorProxy = writeCursorProxyConfig(projectPath, GATEWAY_PORT, CERT_PATH);\n if (cursorProxy) {\n this.log('[OK] Cursor proxy configured \u2192 .cursor/settings.json');\n }\n\n // Configure VS Code proxy for Copilot capture (workspace settings)\n const vscodeProxy = writeVSCodeProxyConfig(projectPath, GATEWAY_PORT, CERT_PATH);\n if (vscodeProxy) {\n this.log('[OK] VS Code workspace proxy configured \u2192 .vscode/settings.json');\n }\n\n // Set http.proxy in VS Code user settings (workspace-level is silently ignored\n // for http.proxy due to APPLICATION scope \u2014 microsoft/vscode#236932)\n const vscodeUserProxy = writeVSCodeUserProxyConfig(GATEWAY_PORT);\n if (vscodeUserProxy) {\n this.log('[OK] VS Code user proxy configured \u2192 ~/Library/Application Support/Code/User/settings.json');\n }\n\n // Same for Cursor (VS Code fork inherits the APPLICATION-scope restriction).\n const cursorUserProxy = writeCursorUserProxyConfig(GATEWAY_PORT);\n if (cursorUserProxy) {\n this.log('[OK] Cursor user proxy configured \u2192 ~/Library/Application Support/Cursor/User/settings.json');\n }\n\n // Set HTTPS_PROXY for all GUI apps via launchctl + LaunchAgent (macOS)\n // Copilot reads process.env.HTTPS_PROXY directly \u2014 VS Code settings alone\n // are insufficient because workspace http.proxy is ignored and extensions\n // may bypass vscode-proxy-agent (microsoft/vscode#12588).\n //\n // GATED ON CA TRUST: this routes EVERY GUI/native app's HTTPS through the\n // MITM proxy machine-wide. Native apps validate against the system\n // keychain, so if the CA isn't trusted (sudo declined / non-admin) this\n // would break their TLS with an unknown-CA error attributed to nothing\n // obvious. Claude Code + Node apps are unaffected either way (they trust\n // NODE_EXTRA_CA_CERTS), so we keep that path and only skip the\n // machine-wide native layer.\n if (caTrusted) {\n const macProxy = installMacOSProxyEnv(GATEWAY_PORT, CERT_PATH);\n if (macProxy) {\n this.log('[OK] HTTPS_PROXY set for GUI apps (launchctl + LaunchAgent)');\n }\n } else {\n // Partial success: HTTPS_PROXY IS pinned (proxyActive) and Claude Code\n // capture works via NODE_EXTRA_CA_CERTS, but the CA isn't system-trusted\n // so cross-tool/machine-wide capture is skipped. Report it so a remote\n // install shows \"proxy live but Claude-Code-only\" rather than looking\n // fully green.\n proxyReason = 'ca_untrusted';\n this.log('[!!] CA not trusted \u2014 skipping machine-wide GUI proxy (would break native-app TLS).');\n this.log(' Claude Code capture is unaffected. Trust the CA + re-run to enable cross-app capture.');\n }\n }\n }\n\n // \u2500\u2500 3. Write Cursor + Copilot hook configs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // These are independent of the proxy (they capture editor lifecycle\n // events, not LLM traffic), so they run regardless of --no-proxy. Both\n // helpers no-op when the target directory (.cursor/ or .github/)\n // doesn't exist.\n if (!isGlobal) {\n const cursorHooks = writeCursorHooks(projectPath, hookBinDir);\n if (cursorHooks) {\n this.log(`[OK] Cursor hooks configured \u2192 ${cursorHooks}`);\n }\n\n const copilotHooks = writeCopilotHooks(projectPath, hookBinDir);\n if (copilotHooks) {\n this.log(`[OK] Copilot Agent hooks configured \u2192 ${copilotHooks}`);\n }\n\n const antigravityHooks = writeAntigravityHooks(projectPath);\n if (antigravityHooks) {\n this.log(`[OK] Antigravity workspace hooks configured \u2192 ${antigravityHooks}`);\n }\n }\n\n // User-level Antigravity hooks at ~/.gemini/config/hooks.json \u2014 covers any\n // workspace the user opens, not just the install-time cwd. Written ONLY when\n // ~/.gemini already exists (the tool is present); returns null otherwise so\n // we never manufacture config for a tool the user doesn't have (F2).\n const antigravityUserHooks = writeAntigravityUserHooks();\n if (antigravityUserHooks) {\n this.log(`[OK] Antigravity user hooks configured \u2192 ${antigravityUserHooks}`);\n }\n\n // User-level Cursor hooks (~/.cursor/hooks.json) are required for global\n // capture because Cursor's chat traffic bypasses HTTP proxies (HTTP/2\n // multiplexed persistent connection \u2014 see cursor.com/docs/hooks). Without\n // hooks, we get zero Cursor visibility for sessions outside this project.\n // Runs in both --global and per-project modes since the user file is\n // machine-wide either way.\n const cursorUserHooks = writeCursorUserHooks(hookBinDir);\n if (cursorUserHooks) {\n this.log(`[OK] Cursor user hooks configured \u2192 ${cursorUserHooks}`);\n }\n\n // \u2500\u2500 4. Statusline shim (rate_limits freshness) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // When --statusline-usage is set, write ~/.claude/statusline-rulemetric.sh\n // and point settings.statusLine at it. If the user already has a statusLine\n // command configured, chain it so their prompt text is preserved.\n if (flags['statusline-usage']) {\n if (isStatuslineShimInstalled(settings)) {\n this.log('[OK] Statusline shim already installed');\n } else {\n const prevCmd = readCurrentStatusLine(settings);\n writeStatuslineShim(prevCmd);\n settings.statusLine = STATUSLINE_SETTINGS_VALUE;\n if (prevCmd) {\n this.log(`[OK] Statusline shim installed \u2192 ${STATUSLINE_SETTINGS_VALUE.command} (chains to: ${prevCmd})`);\n } else {\n this.log(`[OK] Statusline shim installed \u2192 ${STATUSLINE_SETTINGS_VALUE.command}`);\n }\n this.log(' Rate-limit rings will now update on Claude Code\\'s statusline refresh cadence');\n }\n }\n\n // \u2500\u2500 5. Write Claude Code settings (backup prior file \u2192 reversible) \u2500\u2500\u2500\u2500\u2500\n const { backupPath } = writeClaudeSettingsWithBackup(configPath, settings);\n if (backupPath) {\n this.log(`[OK] Backed up previous settings \u2192 ${backupPath}`);\n }\n\n this.log('');\n this.log('Setup complete! Next steps:');\n if (isGlobal) {\n this.log(' 1. Install always-on API: rulemetric service install');\n this.log(' 2. Start Claude Code in any project \u2014 all sessions tracked automatically');\n this.log('');\n this.log('The API service starts on login and restarts on crash.');\n } else if (!noProxy) {\n this.log(' 1. Start Claude Code \u2014 sessions are captured by hooks immediately');\n if (proxyActive) {\n // The proxy IS live (pinned against a verified gateway above) \u2014 don't\n // tell the user to start something that's already running.\n this.log(' 2. Full-depth capture is ON \u2014 the proxy is live on :' + GATEWAY_PORT + '.');\n } else {\n this.log(' 2. Enable full depth (proxy not yet live): rulemetric proxy start');\n }\n this.log('');\n this.log('Hooks capture every session (lifecycle + transcript). The proxy adds the');\n this.log('rendered system prompt (instruction-effectiveness linking) + cross-tool capture.');\n this.log('');\n this.log('To capture traffic from other clients (Python, curl, etc.):');\n this.log(' eval \"$(rulemetric proxy env --all)\"');\n } else {\n // --no-proxy still installs the Claude Code session hooks above, so full\n // sessions ARE captured (lifecycle + SessionEnd transcript reimport) with\n // no mitmproxy / CA trust / gateway. Only the proxy-exclusive layer\n // (rendered system prompt \u2192 instruction-linking, cross-tool) is skipped.\n this.log(' 1. Start Claude Code \u2014 sessions are captured by the hooks just installed');\n this.log('');\n this.log('No proxy means no mitmproxy / CA cert needed. The hooks capture full');\n this.log('sessions on their own; re-run without --no-proxy to also capture system');\n this.log('prompts for instruction-effectiveness linking.');\n }\n\n // Ensure the active-org cache is populated before the user starts a\n // Claude Code session. BaseCommand fired the guarded refresh earlier\n // but may have raced with auth init or hit a transient error; this\n // explicit retry guarantees the cache reflects the user's current\n // active_org_id at the end of `hooks install`.\n await bootstrapActiveOrg();\n\n // Onboarding telemetry (disclosed + opt-outable) \u2014 records that hooks\n // landed, whether the proxy went live, whether the CA is system-trusted, and\n // (when not fully green) WHY \u2014 so a remote install's outcome is debuggable\n // without a relayed log: e.g. proxy:false reason:mitmproxy_unavailable, or\n // proxy:true reason:ca_untrusted (live but Claude-Code-only).\n void emitSetupEvent(\n 'hooks_installed',\n { proxy: proxyActive, caTrusted, reason: proxyReason, installers: pkgManagers, global: isGlobal },\n this.config.version,\n );\n\n // Soft tmux capability check \u2014 live message send needs tmux on the\n // user's machine. We do not auto-install; just surface one line.\n const tmux = await detectTmux();\n this.log('');\n if (tmux.available) {\n this.log(`[OK] tmux found${tmux.version ? ` (v${tmux.version})` : ''} \u2014 live send enabled`);\n } else {\n this.log('[!!] tmux not found \u2014 live send will fall back to opening Terminal. Install with: brew install tmux');\n }\n }\n\n private installMitmproxy(): boolean {\n for (const [cmd, args] of [\n ['pipx', ['install', 'mitmproxy']],\n ['uv', ['tool', 'install', 'mitmproxy']],\n ['brew', ['install', 'mitmproxy']],\n ] as const) {\n // Resolve the FULL path via the shared findBinary (which probes the\n // well-known install dirs, not just $PATH) and spawn THAT \u2014 a bare\n // spawnSync('brew', \u2026) would fail under the minimal PATH that a\n // GUI/agent-launched install has, even after we found brew off-PATH.\n const bin = findBinary(cmd);\n if (bin) {\n this.log(` Installing via ${cmd}...`);\n const result = spawnSync(bin, [...args], { stdio: 'inherit' });\n if (result.status === 0) return true;\n }\n }\n return false;\n }\n\n private isCACertTrusted(): boolean {\n if (process.platform === 'darwin') {\n const result = spawnSync('security', ['verify-cert', '-c', CERT_PATH], {\n stdio: 'pipe',\n });\n return result.status === 0;\n }\n\n if (process.platform === 'linux') {\n return existsSync('/usr/local/share/ca-certificates/mitmproxy-ca.crt');\n }\n\n if (process.platform === 'win32') {\n // On Windows, check if cert is in the Root store\n const result = spawnSync('certutil', ['-verify', CERT_PATH], {\n stdio: 'pipe',\n });\n return result.status === 0;\n }\n\n return false;\n }\n\n private trustCACert(): boolean {\n if (process.platform === 'darwin') {\n const result = spawnSync('sudo', [\n 'security', 'add-trusted-cert', '-d', '-r', 'trustRoot',\n '-k', '/Library/Keychains/System.keychain', CERT_PATH,\n ], { stdio: 'inherit' });\n return result.status === 0;\n }\n\n if (process.platform === 'linux') {\n const cp = spawnSync('sudo', [\n 'cp', CERT_PATH, '/usr/local/share/ca-certificates/mitmproxy-ca.crt',\n ], { stdio: 'inherit' });\n if (cp.status !== 0) return false;\n const update = spawnSync('sudo', ['update-ca-certificates'], { stdio: 'inherit' });\n return update.status === 0;\n }\n\n if (process.platform === 'win32') {\n const result = spawnSync('certutil', [\n '-addstore', '-f', 'Root', CERT_PATH,\n ], { stdio: 'inherit' });\n return result.status === 0;\n }\n\n return false;\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/hooks/run.ts"],
4
- "sourcesContent": ["import { Args } from '@oclif/core';\nimport { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join, delimiter } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\n\nconst VALID_HOOKS = ['session-start', 'session-end', 'user-prompt', 'post-tool-use', 'assistant-response'] as const;\n\nexport default class HooksRun extends BaseCommand {\n static override description = 'Execute a hook script (called by AI tool hooks, not for direct use)';\n static override hidden = true;\n\n static override args = {\n hook: Args.string({\n description: 'Hook name to run',\n required: true,\n options: [...VALID_HOOKS],\n }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(HooksRun);\n const hookName = args.hook;\n\n // Resolve bundled script path\n const { scriptsDir } = await import('@rulemetric/hooks/scripts-dir');\n const scriptPath = join(scriptsDir, `${hookName}.sh`);\n\n if (!existsSync(scriptPath)) {\n this.error(`Hook script not found: ${scriptPath}`);\n }\n\n try {\n // Read stdin and pass it to the bash script\n const stdin = await this.readStdin();\n // APPEND the bundled scripts dir to PATH so the shipped `jq` shim resolves\n // when the host has no real jq (macOS ships none). Appended, not prepended,\n // so a real jq earlier on PATH still wins. Every hook `source`s\n // _normalize.sh, which calls bare `jq` under `set -e` \u2014 without this the\n // whole hooks-capture path silently dies on a jq-less machine.\n const augmentedPath = `${process.env.PATH ?? ''}${delimiter}${scriptsDir}`;\n // session-end reimports the full transcript + enrich/link/cleanup \u2014 it\n // budgets ~17s of network internally, so a 10s cap SIGKILLs it mid-reimport\n // and silently drops the session. Give it headroom; other hooks are quick.\n const timeout = hookName === 'session-end' ? 30_000 : 10_000;\n execFileSync('bash', [scriptPath], {\n input: stdin,\n stdio: ['pipe', 'inherit', 'inherit'],\n timeout,\n env: { ...process.env, PATH: augmentedPath },\n });\n\n // Antigravity-specific: tail the conversation transcript and emit\n // user_message / assistant_response / tool_result events that the\n // bash hook can't see. Antigravity does not fire UserPromptSubmit\n // or Stop hooks, and the Gemini streaming traffic bypasses the\n // proxy. First fire for a conversation primes state to the current\n // transcript end and returns immediately \u2014 capture is forward-only.\n if (\n process.env.RULEMETRIC_HOOK_TOOL === 'antigravity' &&\n hookName === 'post-tool-use'\n ) {\n try {\n const { tailAntigravityTranscript } = await import(\n '../../lib/antigravity-transcript.js'\n );\n await tailAntigravityTranscript(stdin);\n } catch (err) {\n process.stderr.write(\n `[antigravity-tailer] ${(err as Error).message}\\n`,\n );\n }\n }\n } catch (error: unknown) {\n // Capture hooks are BEST-EFFORT telemetry \u2014 a non-zero exit here surfaces\n // in the user's session as \"Stop hook error: Failed with non-blocking\n // status code\" (harmless, but alarming litter). Previously we re-propagated\n // the script's exit code, which contradicted this method's own \"exit\n // silently\" intent. Swallow it: always exit 0 so the AI tool never shows a\n // hook error for our telemetry. The failure is still visible for debugging\n // via RULEMETRIC_HOOK_DEBUG (and the script's own _rulemetric_log).\n const code = (error as { status?: number; message?: string }).status;\n if (process.env.RULEMETRIC_HOOK_DEBUG) {\n process.stderr.write(\n `[rulemetric hooks run ${hookName}] non-fatal exit ${code ?? '?'}: ${(error as { message?: string }).message ?? ''}\\n`,\n );\n }\n // process.exitCode intentionally left 0.\n }\n }\n\n private readStdin(): Promise<string> {\n return new Promise((resolve) => {\n const chunks: Buffer[] = [];\n process.stdin.on('data', (chunk) => chunks.push(chunk));\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));\n // If stdin is already closed (no piped input), resolve immediately\n if (process.stdin.readableEnded) {\n resolve(Buffer.concat(chunks).toString('utf-8'));\n }\n });\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,MAAM,iBAAiB;AAGhC,IAAM,cAAc,CAAC,iBAAiB,eAAe,eAAe,iBAAiB,oBAAoB;AAEzG,IAAqB,WAArB,MAAqB,kBAAiB,YAAY;AAAA,EAChD,OAAgB,cAAc;AAAA,EAC9B,OAAgB,SAAS;AAAA,EAEzB,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS,CAAC,GAAG,WAAW;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,SAAQ;AAC1C,UAAM,WAAW,KAAK;AAGtB,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,+BAA+B;AACnE,UAAM,aAAa,KAAK,YAAY,GAAG,QAAQ,KAAK;AAEpD,QAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,WAAK,MAAM,0BAA0B,UAAU,EAAE;AAAA,IACnD;AAEA,QAAI;AAEF,YAAM,QAAQ,MAAM,KAAK,UAAU;AAMnC,YAAM,gBAAgB,GAAG,QAAQ,IAAI,QAAQ,EAAE,GAAG,SAAS,GAAG,UAAU;AAIxE,YAAM,UAAU,aAAa,gBAAgB,MAAS;AACtD,mBAAa,QAAQ,CAAC,UAAU,GAAG;AAAA,QACjC,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,WAAW,SAAS;AAAA,QACpC;AAAA,QACA,KAAK,EAAE,GAAG,QAAQ,KAAK,MAAM,cAAc;AAAA,MAC7C,CAAC;AAQD,UACE,QAAQ,IAAI,yBAAyB,iBACrC,aAAa,iBACb;AACA,YAAI;AACF,gBAAM,EAAE,0BAA0B,IAAI,MAAM,OAC1C,qCACF;AACA,gBAAM,0BAA0B,KAAK;AAAA,QACvC,SAAS,KAAK;AACZ,kBAAQ,OAAO;AAAA,YACb,wBAAyB,IAAc,OAAO;AAAA;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAgB;AAQvB,YAAM,OAAQ,MAAgD;AAC9D,UAAI,QAAQ,IAAI,uBAAuB;AACrC,gBAAQ,OAAO;AAAA,UACb,yBAAyB,QAAQ,oBAAoB,QAAQ,GAAG,KAAM,MAA+B,WAAW,EAAE;AAAA;AAAA,QACpH;AAAA,MACF;AAAA,IAEF;AAAA,EACF;AAAA,EAEQ,YAA6B;AACnC,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,YAAM,SAAmB,CAAC;AAC1B,cAAQ,MAAM,GAAG,QAAQ,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC;AACtD,cAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,CAAC,CAAC;AAE9E,UAAI,QAAQ,MAAM,eAAe;AAC/B,gBAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/hooks/uninstall.ts"],
4
- "sourcesContent": ["import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { spawnSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\nimport { stopGateway, GATEWAY_PORT } from '../../lib/gateway-lifecycle.js';\nimport { cleanClaudeSettingsFiles, removeCursorHooks, removeCursorUserHooks, removeCopilotHooks, removeAntigravityHooks, removeAntigravityUserHooks, removeVSCodeProxyConfig, uninstallMacOSProxyEnv, removeVSCodeUserProxyConfig, removeCursorUserProxyConfig } from '../../lib/hooks-config.js';\n\nconst CERT_PATH = join(homedir(), '.mitmproxy', 'mitmproxy-ca-cert.pem');\n\n/**\n * Best-effort reverse of install's trustCACert(): remove the mitmproxy root CA\n * from the system trust store. Without this, `hooks uninstall` leaves a MITM\n * root trusted system-wide forever \u2014 a real security residue of a supposedly\n * complete reversal. Runs sudo (symmetric with install, which sudo-trusts it).\n */\nfunction untrustCACert(): boolean {\n if (!existsSync(CERT_PATH)) return false;\n if (process.platform === 'darwin') {\n return spawnSync('sudo', ['security', 'remove-trusted-cert', '-d', CERT_PATH], { stdio: 'inherit' }).status === 0;\n }\n if (process.platform === 'linux') {\n const rm = spawnSync('sudo', ['rm', '-f', '/usr/local/share/ca-certificates/mitmproxy-ca.crt'], { stdio: 'inherit' });\n if (rm.status !== 0) return false;\n return spawnSync('sudo', ['update-ca-certificates', '--fresh'], { stdio: 'inherit' }).status === 0;\n }\n if (process.platform === 'win32') {\n return spawnSync('certutil', ['-delstore', 'Root', 'mitmproxy'], { stdio: 'inherit' }).status === 0;\n }\n return false;\n}\n\nexport default class HooksUninstall extends BaseCommand {\n static override description = 'Remove session tracking hooks from the current project';\n\n static override examples = [\n '<%= config.bin %> hooks uninstall',\n ];\n\n async run(): Promise<void> {\n const claudeDir = join(process.cwd(), '.claude');\n\n // Clean BOTH settings files: legacy installs wrote the shared\n // settings.json; current installs write machine-local state to\n // settings.local.json. Only RuleMetric-owned entries are removed \u2014 the\n // user's own hooks/env/statusLine survive (per-key predicates in\n // removeRulemetricProxyEnv), and a malformed file never crashes uninstall\n // (the one command a user runs precisely because things are broken).\n const cleanups = cleanClaudeSettingsFiles(claudeDir, GATEWAY_PORT);\n if (cleanups.length === 0) {\n this.log('No .claude/settings.json or .claude/settings.local.json found \u2014 nothing to uninstall.');\n return;\n }\n\n let changed = false;\n let removedProxyEnv = false;\n for (const cleanup of cleanups) {\n if (cleanup.recoveredBackup) {\n this.log(`[!!] ${cleanup.configPath} was not valid JSON \u2014 backed up to ${cleanup.recoveredBackup}; continuing.`);\n }\n if (cleanup.removedHooks) {\n this.log(`Removed RuleMetric hooks from .claude/${cleanup.fileName}`);\n }\n if (cleanup.removedProxyEnv) {\n this.log(`Removed HTTPS_PROXY, NO_PROXY and NODE_EXTRA_CA_CERTS from .claude/${cleanup.fileName}`);\n removedProxyEnv = true;\n }\n if (cleanup.removedStatusline) {\n this.log(`Removed RuleMetric statusline shim from .claude/${cleanup.fileName}`);\n }\n changed = changed || cleanup.changed;\n }\n if (!changed) {\n this.log('No hooks or proxy config found \u2014 nothing to uninstall.');\n }\n\n // Remove Cursor hooks\n // Remove Cursor and Copilot hooks\n if (removeCursorHooks(process.cwd())) {\n this.log('Removed RuleMetric hooks from .cursor/hooks.json');\n changed = true;\n }\n if (removeCursorUserHooks()) {\n this.log('Removed RuleMetric hooks from ~/.cursor/hooks.json');\n changed = true;\n }\n\n // Remove Cursor proxy config\n const cursorSettingsPath = join(process.cwd(), '.cursor', 'settings.json');\n if (existsSync(cursorSettingsPath)) {\n try {\n const cursorSettings = JSON.parse(readFileSync(cursorSettingsPath, 'utf-8'));\n if (cursorSettings['http.proxy']?.includes('localhost')) {\n delete cursorSettings['http.proxy'];\n delete cursorSettings['http.proxyStrictSSL'];\n writeFileSync(cursorSettingsPath, JSON.stringify(cursorSettings, null, 2) + '\\n');\n this.log('Removed proxy config from .cursor/settings.json');\n changed = true;\n }\n } catch { /* not valid JSON, skip */ }\n }\n\n // Remove Copilot hooks\n if (removeCopilotHooks(process.cwd())) {\n this.log('Removed RuleMetric hooks from .github/hooks/');\n changed = true;\n }\n\n // Remove Antigravity hooks (workspace + user)\n if (removeAntigravityHooks(process.cwd())) {\n this.log('Removed RuleMetric block from .agents/hooks.json');\n changed = true;\n }\n if (removeAntigravityUserHooks()) {\n this.log('Removed RuleMetric block from ~/.gemini/config/hooks.json');\n changed = true;\n }\n\n // Remove VS Code proxy config (workspace + user settings)\n if (removeVSCodeProxyConfig(process.cwd())) {\n this.log('Removed proxy config from .vscode/settings.json');\n changed = true;\n }\n if (removeVSCodeUserProxyConfig()) {\n this.log('Removed proxy config from VS Code user settings');\n changed = true;\n }\n if (removeCursorUserProxyConfig()) {\n this.log('Removed proxy config from Cursor user settings');\n changed = true;\n }\n\n // Remove macOS LaunchAgent + launchctl env vars\n if (uninstallMacOSProxyEnv()) {\n this.log('Removed HTTPS_PROXY LaunchAgent');\n changed = true;\n }\n\n // Untrust the mitmproxy CA (only if this was a proxy install \u2014 hooks-only\n // users never trusted one, so don't sudo-prompt them). This runs sudo,\n // symmetric with install's sudo-trust; without it a MITM root stays trusted.\n if (removedProxyEnv && existsSync(CERT_PATH)) {\n this.log('Removing the mitmproxy CA from the system trust store (requires sudo)...');\n if (untrustCACert()) {\n this.log('[OK] mitmproxy CA untrusted.');\n } else {\n this.log(`[!!] Could not untrust the CA automatically. Remove it manually:`);\n if (process.platform === 'darwin') {\n this.log(` sudo security remove-trusted-cert -d ${CERT_PATH}`);\n } else if (process.platform === 'linux') {\n this.log(` sudo rm -f /usr/local/share/ca-certificates/mitmproxy-ca.crt && sudo update-ca-certificates --fresh`);\n }\n }\n }\n\n // Stop gateway\n if (stopGateway()) {\n this.log('Gateway stopped.');\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/commands/import.ts"],
4
- "sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../base-command.js';\nimport { apiPost } from '../lib/api-client.js';\nimport type { ImportResult } from '../lib/types.js';\n\nexport default class Import extends BaseCommand {\n static override description = 'Import an existing config file as a RuleMetric instruction';\n\n static override examples = [\n '<%= config.bin %> import .cursorrules',\n '<%= config.bin %> import CLAUDE.md --format claude-md --name \"My Rules\"',\n ];\n\n static override args = {\n file: Args.string({ description: 'Path to file to import', required: true }),\n };\n\n static override flags = {\n format: Flags.string({ description: 'Source format (auto-detected if not provided)' }),\n name: Flags.string({ char: 'n', description: 'Override instruction name' }),\n scope: Flags.string({\n char: 's',\n description: 'Instruction scope',\n options: ['org', 'team', 'project', 'personal'],\n default: 'personal',\n }),\n 'scope-ref': Flags.string({ description: 'Scope reference UUID' }),\n tags: Flags.string({ char: 't', description: 'Comma-separated tags' }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Import);\n this.requireAuth();\n\n if (!fs.existsSync(args.file)) {\n this.error(`File not found: ${args.file}`);\n }\n\n const content = fs.readFileSync(args.file, 'utf-8');\n const filename = path.basename(args.file);\n\n const body: Record<string, unknown> = {\n content,\n filename,\n scope: flags.scope,\n };\n\n if (flags.format) body.sourceFormat = flags.format;\n if (flags.name) body.name = flags.name;\n if (flags['scope-ref']) body.scopeRef = flags['scope-ref'];\n if (flags.tags) body.tags = flags.tags.split(',').map((t) => t.trim());\n\n const result = await apiPost<ImportResult>('/api/instructions/import', body);\n\n this.log(`Imported ${result.sourceFormat} as instruction: ${result.instruction.name} (${result.instruction.id})`);\n\n if (result.parseWarnings.length > 0) {\n this.warn(`Warnings: ${result.parseWarnings.join(', ')}`);\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,MAAM,aAAa;AAK5B,IAAqB,SAArB,MAAqB,gBAAe,YAAY;AAAA,EAC9C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO,EAAE,aAAa,0BAA0B,UAAU,KAAK,CAAC;AAAA,EAC7E;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,OAAO,EAAE,aAAa,gDAAgD,CAAC;AAAA,IACrF,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,4BAA4B,CAAC;AAAA,IAC1E,OAAO,MAAM,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,OAAO,QAAQ,WAAW,UAAU;AAAA,MAC9C,SAAS;AAAA,IACX,CAAC;AAAA,IACD,aAAa,MAAM,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,IACjE,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,uBAAuB,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,OAAM;AAC/C,SAAK,YAAY;AAEjB,QAAI,CAAI,cAAW,KAAK,IAAI,GAAG;AAC7B,WAAK,MAAM,mBAAmB,KAAK,IAAI,EAAE;AAAA,IAC3C;AAEA,UAAM,UAAa,gBAAa,KAAK,MAAM,OAAO;AAClD,UAAM,WAAgB,cAAS,KAAK,IAAI;AAExC,UAAM,OAAgC;AAAA,MACpC;AAAA,MACA;AAAA,MACA,OAAO,MAAM;AAAA,IACf;AAEA,QAAI,MAAM,OAAQ,MAAK,eAAe,MAAM;AAC5C,QAAI,MAAM,KAAM,MAAK,OAAO,MAAM;AAClC,QAAI,MAAM,WAAW,EAAG,MAAK,WAAW,MAAM,WAAW;AACzD,QAAI,MAAM,KAAM,MAAK,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAErE,UAAM,SAAS,MAAM,QAAsB,4BAA4B,IAAI;AAE3E,SAAK,IAAI,YAAY,OAAO,YAAY,oBAAoB,OAAO,YAAY,IAAI,KAAK,OAAO,YAAY,EAAE,GAAG;AAEhH,QAAI,OAAO,cAAc,SAAS,GAAG;AACnC,WAAK,KAAK,aAAa,OAAO,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1D;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/create.ts"],
4
- "sourcesContent": ["import * as fs from 'node:fs';\nimport { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\ninterface CreatedInstruction {\n id: string;\n name: string;\n}\n\nexport default class InstructionsCreate extends BaseCommand {\n static override description = 'Create a new instruction';\n\n static override examples = [\n '<%= config.bin %> instructions create ./my-instruction.md --name \"My Rules\"',\n '<%= config.bin %> instructions create ./rules.md -n \"Rules\" -s project',\n ];\n\n static override args = {\n file: Args.string({ description: 'Path to markdown file' }),\n };\n\n static override flags = {\n name: Flags.string({ char: 'n', description: 'Instruction name', required: true }),\n description: Flags.string({ char: 'd', description: 'Instruction description', required: true }),\n scope: Flags.string({\n char: 's',\n description: 'Instruction scope',\n options: ['org', 'team', 'project', 'personal'],\n default: 'personal',\n }),\n 'scope-ref': Flags.string({ description: 'Scope reference UUID' }),\n tags: Flags.string({ char: 't', description: 'Comma-separated tags' }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(InstructionsCreate);\n this.requireAuth();\n\n let content: string;\n\n if (args.file) {\n if (!fs.existsSync(args.file)) {\n this.error(`File not found: ${args.file}`);\n }\n\n content = fs.readFileSync(args.file, 'utf-8');\n } else {\n this.log('No file provided. Paste content (Ctrl+D to finish):');\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n\n content = Buffer.concat(chunks).toString('utf-8');\n }\n\n const body: Record<string, unknown> = {\n name: flags.name,\n description: flags.description,\n scope: flags.scope,\n content,\n };\n\n if (flags['scope-ref']) {\n body.scopeRef = flags['scope-ref'];\n }\n\n if (flags.tags) {\n body.tags = flags.tags.split(',').map((t) => t.trim());\n }\n\n const result = await apiPost<CreatedInstruction>('/api/instructions', body);\n this.log(`Created instruction: ${result.name} (${result.id})`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,SAAS,MAAM,aAAa;AAS5B,IAAqB,qBAArB,MAAqB,4BAA2B,YAAY;AAAA,EAC1D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO,EAAE,aAAa,wBAAwB,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,oBAAoB,UAAU,KAAK,CAAC;AAAA,IACjF,aAAa,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,2BAA2B,UAAU,KAAK,CAAC;AAAA,IAC/F,OAAO,MAAM,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,OAAO,QAAQ,WAAW,UAAU;AAAA,MAC9C,SAAS;AAAA,IACX,CAAC;AAAA,IACD,aAAa,MAAM,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,IACjE,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,uBAAuB,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,mBAAkB;AAC3D,SAAK,YAAY;AAEjB,QAAI;AAEJ,QAAI,KAAK,MAAM;AACb,UAAI,CAAI,cAAW,KAAK,IAAI,GAAG;AAC7B,aAAK,MAAM,mBAAmB,KAAK,IAAI,EAAE;AAAA,MAC3C;AAEA,gBAAa,gBAAa,KAAK,MAAM,OAAO;AAAA,IAC9C,OAAO;AACL,WAAK,IAAI,qDAAqD;AAC9D,YAAM,SAAmB,CAAC;AAC1B,uBAAiB,SAAS,QAAQ,OAAO;AACvC,eAAO,KAAK,KAAe;AAAA,MAC7B;AAEA,gBAAU,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO;AAAA,IAClD;AAEA,UAAM,OAAgC;AAAA,MACpC,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,OAAO,MAAM;AAAA,MACb;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,WAAW,MAAM,WAAW;AAAA,IACnC;AAEA,QAAI,MAAM,MAAM;AACd,WAAK,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACvD;AAEA,UAAM,SAAS,MAAM,QAA4B,qBAAqB,IAAI;AAC1E,SAAK,IAAI,wBAAwB,OAAO,IAAI,KAAK,OAAO,EAAE,GAAG;AAAA,EAC/D;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/delete.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet, apiDelete } from '../../lib/api-client.js';\nimport { validateUuid } from '../../lib/types.js';\nimport type { Instruction } from '../../lib/types.js';\n\nexport default class InstructionsDelete extends BaseCommand {\n static override description = 'Delete (archive) an instruction';\n\n static override examples = [\n '<%= config.bin %> instructions delete <id>',\n '<%= config.bin %> instructions delete <id> --force',\n ];\n\n static override args = {\n id: Args.string({ description: 'Instruction ID', required: true }),\n };\n\n static override flags = {\n force: Flags.boolean({ char: 'f', description: 'Skip confirmation prompt', default: false }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(InstructionsDelete);\n this.requireAuth();\n validateUuid(args.id, 'instruction ID');\n\n const instruction = await apiGet<Instruction>(`/api/instructions/${encodeURIComponent(args.id)}`);\n\n if (!flags.force) {\n const { confirm } = await import('@inquirer/prompts');\n const confirmed = await confirm({\n message: `Are you sure you want to delete \"${instruction.name}\"?`,\n default: false,\n });\n\n if (!confirmed) {\n this.log('Cancelled.');\n return;\n }\n }\n\n await apiDelete(`/api/instructions/${encodeURIComponent(args.id)}`);\n this.log(`Deleted instruction: ${instruction.name}`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAM5B,IAAqB,qBAArB,MAAqB,4BAA2B,YAAY;AAAA,EAC1D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,kBAAkB,UAAU,KAAK,CAAC;AAAA,EACnE;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ,EAAE,MAAM,KAAK,aAAa,4BAA4B,SAAS,MAAM,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,mBAAkB;AAC3D,SAAK,YAAY;AACjB,iBAAa,KAAK,IAAI,gBAAgB;AAEtC,UAAM,cAAc,MAAM,OAAoB,qBAAqB,mBAAmB,KAAK,EAAE,CAAC,EAAE;AAEhG,QAAI,CAAC,MAAM,OAAO;AAChB,YAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,mBAAmB;AACpD,YAAM,YAAY,MAAM,QAAQ;AAAA,QAC9B,SAAS,oCAAoC,YAAY,IAAI;AAAA,QAC7D,SAAS;AAAA,MACX,CAAC;AAED,UAAI,CAAC,WAAW;AACd,aAAK,IAAI,YAAY;AACrB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,qBAAqB,mBAAmB,KAAK,EAAE,CAAC,EAAE;AAClE,SAAK,IAAI,wBAAwB,YAAY,IAAI,EAAE;AAAA,EACrD;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/fork.ts"],
4
- "sourcesContent": ["import { Args } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\nexport default class InstructionsFork extends BaseCommand {\n static override description = 'Fork an instruction to your personal scope';\n\n static override examples = [\n '<%= config.bin %> instructions fork <instruction-id>',\n ];\n\n static override args = {\n id: Args.string({ description: 'ID of the instruction to fork', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(InstructionsFork);\n this.requireAuth();\n\n const result = await apiPost<{ id: string; name: string }>(`/api/instructions/${args.id}/fork`, {});\n this.log(`Forked instruction: ${result.name} (${result.id})`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAIrB,IAAqB,mBAArB,MAAqB,0BAAyB,YAAY;AAAA,EACtD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACvB;AAAA,EACJ;AAAA,EAEA,OAAgB,OAAO;AAAA,IACnB,IAAI,KAAK,OAAO,EAAE,aAAa,iCAAiC,UAAU,KAAK,CAAC;AAAA,EACpF;AAAA,EAEA,MAAM,MAAqB;AACvB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,iBAAgB;AAClD,SAAK,YAAY;AAEjB,UAAM,SAAS,MAAM,QAAsC,qBAAqB,KAAK,EAAE,SAAS,CAAC,CAAC;AAClG,SAAK,IAAI,uBAAuB,OAAO,IAAI,KAAK,OAAO,EAAE,GAAG;AAAA,EAChE;AACJ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/get.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\nimport { formatDate, formatScope } from '../../lib/output.js';\nimport { validateUuid } from '../../lib/types.js';\nimport type { Instruction } from '../../lib/types.js';\n\nexport default class InstructionsGet extends BaseCommand {\n static override description = 'Get an instruction by ID';\n\n static override examples = [\n '<%= config.bin %> instructions get <id>',\n '<%= config.bin %> instructions get <id> --format raw',\n ];\n\n static override enableJsonFlag = true;\n\n static override args = {\n id: Args.string({ description: 'Instruction ID', required: true }),\n };\n\n static override flags = {\n format: Flags.string({\n char: 'f',\n description: 'Output format',\n options: ['yaml', 'json', 'raw'],\n default: 'yaml',\n }),\n };\n\n async run(): Promise<Instruction> {\n const { args, flags } = await this.parse(InstructionsGet);\n this.requireAuth();\n validateUuid(args.id, 'instruction ID');\n\n const result = await apiGet<Instruction>(`/api/instructions/${encodeURIComponent(args.id)}`);\n\n if (flags.format === 'json') {\n this.log(JSON.stringify(result, null, 2));\n } else if (flags.format === 'raw') {\n this.log(result.content);\n } else {\n this.log(`Name: ${result.name}`);\n this.log(`Description: ${result.description}`);\n this.log(`Scope: ${formatScope(result.scope)}`);\n this.log(`Version: ${result.version}`);\n this.log(`Tags: ${(result.tags ?? []).join(', ') || '(none)'}`);\n this.log(`Created: ${formatDate(result.createdAt)}`);\n this.log(`Updated: ${formatDate(result.updatedAt)}`);\n this.log('');\n this.log('--- Content ---');\n this.log(result.content);\n }\n\n return result;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAO5B,IAAqB,kBAArB,MAAqB,yBAAwB,YAAY;AAAA,EACvD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,iBAAiB;AAAA,EAEjC,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,kBAAkB,UAAU,KAAK,CAAC;AAAA,EACnE;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,QAAQ,QAAQ,KAAK;AAAA,MAC/B,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAA4B;AAChC,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,gBAAe;AACxD,SAAK,YAAY;AACjB,iBAAa,KAAK,IAAI,gBAAgB;AAEtC,UAAM,SAAS,MAAM,OAAoB,qBAAqB,mBAAmB,KAAK,EAAE,CAAC,EAAE;AAE3F,QAAI,MAAM,WAAW,QAAQ;AAC3B,WAAK,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1C,WAAW,MAAM,WAAW,OAAO;AACjC,WAAK,IAAI,OAAO,OAAO;AAAA,IACzB,OAAO;AACL,WAAK,IAAI,gBAAgB,OAAO,IAAI,EAAE;AACtC,WAAK,IAAI,gBAAgB,OAAO,WAAW,EAAE;AAC7C,WAAK,IAAI,gBAAgB,YAAY,OAAO,KAAK,CAAC,EAAE;AACpD,WAAK,IAAI,gBAAgB,OAAO,OAAO,EAAE;AACzC,WAAK,IAAI,iBAAiB,OAAO,QAAQ,CAAC,GAAG,KAAK,IAAI,KAAK,QAAQ,EAAE;AACrE,WAAK,IAAI,gBAAgB,WAAW,OAAO,SAAS,CAAC,EAAE;AACvD,WAAK,IAAI,gBAAgB,WAAW,OAAO,SAAS,CAAC,EAAE;AACvD,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,iBAAiB;AAC1B,WAAK,IAAI,OAAO,OAAO;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/list.ts"],
4
- "sourcesContent": ["import { Flags } from '@oclif/core';\nimport { printTable } from '@oclif/table';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\nimport { formatDate, truncate, formatScope } from '../../lib/output.js';\nimport type { InstructionSummary } from '../../lib/types.js';\n\nexport default class InstructionSummarysList extends BaseCommand {\n static override description = 'List your instructions';\n\n static override examples = [\n '<%= config.bin %> instructions list',\n '<%= config.bin %> instructions list --json',\n ];\n\n static override enableJsonFlag = true;\n\n static override flags = {\n format: Flags.string({\n char: 'f',\n description: 'Output format',\n options: ['table', 'json'],\n default: 'table',\n }),\n };\n\n async run(): Promise<InstructionSummary[]> {\n const { flags } = await this.parse(InstructionSummarysList);\n this.requireAuth();\n\n const results = await apiGet<InstructionSummary[]>('/api/instructions');\n\n if (results.length === 0) {\n this.log('No instructions found. Create one with `rulemetric instructions create`.');\n return results;\n }\n\n if (flags.format === 'json') {\n this.log(JSON.stringify(results, null, 2));\n } else {\n printTable({\n data: results.map((i) => ({\n Name: truncate(i.name, 40),\n Scope: formatScope(i.scope),\n Version: i.version,\n Tags: (i.tags ?? []).join(', '),\n Updated: formatDate(i.updatedAt),\n })),\n columns: ['Name', 'Scope', 'Version', 'Tags', 'Updated'],\n });\n }\n\n return results;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAM3B,IAAqB,0BAArB,MAAqB,iCAAgC,YAAY;AAAA,EAC/D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,iBAAiB;AAAA,EAEjC,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,SAAS,MAAM;AAAA,MACzB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqC;AACzC,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,wBAAuB;AAC1D,SAAK,YAAY;AAEjB,UAAM,UAAU,MAAM,OAA6B,mBAAmB;AAEtE,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,0EAA0E;AACnF,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,WAAW,QAAQ;AAC3B,WAAK,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,IAC3C,OAAO;AACL,iBAAW;AAAA,QACT,MAAM,QAAQ,IAAI,CAAC,OAAO;AAAA,UACxB,MAAM,SAAS,EAAE,MAAM,EAAE;AAAA,UACzB,OAAO,YAAY,EAAE,KAAK;AAAA,UAC1B,SAAS,EAAE;AAAA,UACX,OAAO,EAAE,QAAQ,CAAC,GAAG,KAAK,IAAI;AAAA,UAC9B,SAAS,WAAW,EAAE,SAAS;AAAA,QACjC,EAAE;AAAA,QACF,SAAS,CAAC,QAAQ,SAAS,WAAW,QAAQ,SAAS;AAAA,MACzD,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/promote.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\nexport default class InstructionsPromote extends BaseCommand {\n static override description = 'Promote an instruction to a higher scope (personal \u2192 team \u2192 org)';\n\n static override examples = [\n '<%= config.bin %> instructions promote <id> --scope team --ref <team-id>',\n '<%= config.bin %> instructions promote <id> --scope org --ref <org-id>',\n ];\n\n static override args = {\n id: Args.string({ description: 'ID of the instruction to promote', required: true }),\n };\n\n static override flags = {\n scope: Flags.string({ description: 'Target scope', required: true, options: ['team', 'org'] }),\n ref: Flags.string({ description: 'Target scope ref (team or org ID)', required: true }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(InstructionsPromote);\n this.requireAuth();\n\n const result = await apiPost<{ scope: string; name: string }>(`/api/instructions/${args.id}/promote`, {\n scope: flags.scope,\n scopeRef: flags.ref,\n });\n this.log(`Promoted \"${result.name}\" to ${result.scope} scope`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAI5B,IAAqB,sBAArB,MAAqB,6BAA4B,YAAY;AAAA,EACzD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACvB;AAAA,IACA;AAAA,EACJ;AAAA,EAEA,OAAgB,OAAO;AAAA,IACnB,IAAI,KAAK,OAAO,EAAE,aAAa,oCAAoC,UAAU,KAAK,CAAC;AAAA,EACvF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACpB,OAAO,MAAM,OAAO,EAAE,aAAa,gBAAgB,UAAU,MAAM,SAAS,CAAC,QAAQ,KAAK,EAAE,CAAC;AAAA,IAC7F,KAAK,MAAM,OAAO,EAAE,aAAa,qCAAqC,UAAU,KAAK,CAAC;AAAA,EAC1F;AAAA,EAEA,MAAM,MAAqB;AACvB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,oBAAmB;AAC5D,SAAK,YAAY;AAEjB,UAAM,SAAS,MAAM,QAAyC,qBAAqB,KAAK,EAAE,YAAY;AAAA,MAClG,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,IACpB,CAAC;AACD,SAAK,IAAI,aAAa,OAAO,IAAI,QAAQ,OAAO,KAAK,QAAQ;AAAA,EACjE;AACJ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/pull.ts"],
4
- "sourcesContent": ["import { Args } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\nexport default class InstructionsPull extends BaseCommand {\n static override description = 'Pull upstream changes into a forked instruction';\n\n static override args = {\n id: Args.string({ description: 'ID of the forked instruction', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(InstructionsPull);\n this.requireAuth();\n\n const result = await apiPost<{ hasConflicts: boolean; merged?: string; instruction?: { name: string } }>(\n `/api/instructions/${args.id}/pull-upstream`,\n {},\n );\n\n if (result.hasConflicts) {\n this.log('Merge conflicts detected. Resolve in the web UI:');\n this.log(result.merged ?? '');\n } else {\n this.log(`Successfully pulled upstream changes into \"${result.instruction?.name}\"`);\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAIrB,IAAqB,mBAArB,MAAqB,0BAAyB,YAAY;AAAA,EACtD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACnB,IAAI,KAAK,OAAO,EAAE,aAAa,gCAAgC,UAAU,KAAK,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,MAAqB;AACvB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,iBAAgB;AAClD,SAAK,YAAY;AAEjB,UAAM,SAAS,MAAM;AAAA,MACjB,qBAAqB,KAAK,EAAE;AAAA,MAC5B,CAAC;AAAA,IACL;AAEA,QAAI,OAAO,cAAc;AACrB,WAAK,IAAI,kDAAkD;AAC3D,WAAK,IAAI,OAAO,UAAU,EAAE;AAAA,IAChC,OAAO;AACH,WAAK,IAAI,8CAA8C,OAAO,aAAa,IAAI,GAAG;AAAA,IACtF;AAAA,EACJ;AACJ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/upstream.ts"],
4
- "sourcesContent": ["import { Args } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\n\nexport default class InstructionsUpstream extends BaseCommand {\n static override description = 'Check if a forked instruction has upstream updates';\n\n static override args = {\n id: Args.string({ description: 'ID of the forked instruction', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(InstructionsUpstream);\n this.requireAuth();\n\n const result = await apiGet<{ hasUpdate: boolean; currentVersion: string; upstreamVersion: string; parentName: string }>(\n `/api/instructions/${args.id}/upstream`,\n );\n\n if (result.hasUpdate) {\n this.log(`Upstream update available: ${result.parentName} is at ${result.upstreamVersion} (you have ${result.currentVersion})`);\n this.log(`Run: rulemetric instructions pull ${args.id}`);\n } else {\n this.log('Up to date with upstream.');\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAIrB,IAAqB,uBAArB,MAAqB,8BAA6B,YAAY;AAAA,EAC1D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACnB,IAAI,KAAK,OAAO,EAAE,aAAa,gCAAgC,UAAU,KAAK,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,MAAqB;AACvB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,qBAAoB;AACtD,SAAK,YAAY;AAEjB,UAAM,SAAS,MAAM;AAAA,MACjB,qBAAqB,KAAK,EAAE;AAAA,IAChC;AAEA,QAAI,OAAO,WAAW;AAClB,WAAK,IAAI,8BAA8B,OAAO,UAAU,UAAU,OAAO,eAAe,cAAc,OAAO,cAAc,GAAG;AAC9H,WAAK,IAAI,qCAAqC,KAAK,EAAE,EAAE;AAAA,IAC3D,OAAO;AACH,WAAK,IAAI,2BAA2B;AAAA,IACxC;AAAA,EACJ;AACJ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/instructions/versions.ts"],
4
- "sourcesContent": ["import { Args } from '@oclif/core';\nimport { printTable } from '@oclif/table';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\nimport { formatDate } from '../../lib/output.js';\nimport { validateUuid } from '../../lib/types.js';\nimport type { InstructionVersion } from '../../lib/types.js';\n\nexport default class InstructionsVersions extends BaseCommand {\n static override description = 'List version history for an instruction';\n\n static override examples = ['<%= config.bin %> instructions versions <id>'];\n\n static override enableJsonFlag = true;\n\n static override args = {\n id: Args.string({ description: 'Instruction ID', required: true }),\n };\n\n async run(): Promise<InstructionVersion[]> {\n const { args } = await this.parse(InstructionsVersions);\n this.requireAuth();\n validateUuid(args.id, 'instruction ID');\n\n const versions = await apiGet<InstructionVersion[]>(`/api/instructions/${encodeURIComponent(args.id)}/versions`);\n\n if (versions.length === 0) {\n this.log('No versions found.');\n return versions;\n }\n\n printTable({\n data: versions.map((v) => ({\n Version: String(v.versionNumber),\n 'Change Summary': v.changeSummary ?? '(none)',\n 'Created At': formatDate(v.createdAt),\n })),\n columns: ['Version', 'Change Summary', 'Created At'],\n });\n\n return versions;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAO3B,IAAqB,uBAArB,MAAqB,8BAA6B,YAAY;AAAA,EAC5D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW,CAAC,8CAA8C;AAAA,EAE1E,OAAgB,iBAAiB;AAAA,EAEjC,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,kBAAkB,UAAU,KAAK,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,MAAqC;AACzC,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,qBAAoB;AACtD,SAAK,YAAY;AACjB,iBAAa,KAAK,IAAI,gBAAgB;AAEtC,UAAM,WAAW,MAAM,OAA6B,qBAAqB,mBAAmB,KAAK,EAAE,CAAC,WAAW;AAE/G,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,IAAI,oBAAoB;AAC7B,aAAO;AAAA,IACT;AAEA,eAAW;AAAA,MACT,MAAM,SAAS,IAAI,CAAC,OAAO;AAAA,QACzB,SAAS,OAAO,EAAE,aAAa;AAAA,QAC/B,kBAAkB,EAAE,iBAAiB;AAAA,QACrC,cAAc,WAAW,EAAE,SAAS;AAAA,MACtC,EAAE;AAAA,MACF,SAAS,CAAC,WAAW,kBAAkB,YAAY;AAAA,IACrD,CAAC;AAED,WAAO;AAAA,EACT;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/commands/launcher.ts"],
4
- "sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../base-command.js';\n\nexport default class Launcher extends BaseCommand {\n static override description = 'Open the launcher overlay (alias for `dashboard --launcher`)';\n\n static override examples = [\n '<%= config.bin %> launcher',\n '<%= config.bin %> launcher --period today',\n ];\n\n static override flags = {\n period: Flags.string({\n char: 'p',\n default: 'week',\n options: ['today', 'week', '30days', 'month', 'all'],\n description: 'Initial time period for the dashboard panels behind the overlay',\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Launcher);\n const { renderDashboard } = await import('../dashboard/Dashboard.js');\n await renderDashboard(\n flags.period as 'today' | 'week' | '30days' | 'month' | 'all',\n { openLauncher: true },\n );\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;AAAA,SAAS,aAAa;AAGtB,IAAqB,WAArB,MAAqB,kBAAiB,YAAY;AAAA,EAChD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC,SAAS,QAAQ,UAAU,SAAS,KAAK;AAAA,MACnD,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,SAAQ;AAC3C,UAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,2BAA2B;AACpE,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,EAAE,cAAc,KAAK;AAAA,IACvB;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/org/current.ts"],
4
- "sourcesContent": ["import { BaseCommand } from '../../base-command.js';\nimport { apiGet, ApiError } from '../../lib/api-client.js';\nimport { isAuthenticated } from '../../lib/auth.js';\nimport {\n readActiveOrg,\n writeActiveOrg,\n clearActiveOrg,\n isStale,\n} from '../../lib/active-org.js';\n\ninterface ProfileResponse {\n id: string;\n email: string | null;\n displayName: string | null;\n activeOrgId: string | null;\n}\n\ninterface Org {\n id: string;\n name: string;\n slug: string;\n role: string;\n}\n\nexport default class OrgCurrent extends BaseCommand {\n static override description = 'Show the current active organization';\n\n static override examples = ['<%= config.bin %> org current'];\n\n async run(): Promise<void> {\n await this.parse(OrgCurrent);\n\n // Env override path \u2014 print and exit. Don't auth-check, don't refresh:\n // the env override is meant to be ephemeral and self-explanatory.\n const envId = process.env.RULEMETRIC_ORG_ID?.trim();\n if (envId) {\n this.log(`${envId} (env override)`);\n return;\n }\n\n // Don't use `requireAuth()` here because it kicks off a background\n // refresh that races our own explicit refresh below. Check auth\n // directly instead.\n if (!isAuthenticated()) {\n this.error('Not logged in. Run `rulemetric auth login` to authenticate.');\n }\n\n let cached = readActiveOrg();\n\n // Stale cache: refresh from /api/profile and look up the slug. If the\n // refresh fails (network, auth), fall back to the cached value rather\n // than telling the user \"no active org\" incorrectly.\n if (cached && isStale(cached)) {\n try {\n const profile = await apiGet<ProfileResponse>('/api/profile');\n if (!profile.activeOrgId) {\n clearActiveOrg();\n cached = null;\n } else if (profile.activeOrgId !== cached.orgId) {\n const orgs = await apiGet<Org[]>('/api/orgs');\n const match = orgs.find((o) => o.id === profile.activeOrgId);\n cached = {\n orgId: profile.activeOrgId,\n orgSlug: match?.slug,\n syncedAt: Date.now(),\n };\n writeActiveOrg(cached);\n } else {\n cached = {\n ...cached,\n syncedAt: Date.now(),\n };\n writeActiveOrg(cached);\n }\n } catch (err) {\n if (!(err instanceof ApiError)) throw err;\n // network/auth errors: keep the stale cache, just print it\n }\n }\n\n if (!cached) {\n this.log('No active organization. Run `rulemetric org switch <slug>`.');\n return;\n }\n\n if (cached.orgSlug) {\n this.log(`${cached.orgSlug} (${cached.orgId})`);\n } else {\n this.log(cached.orgId);\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW,CAAC,+BAA+B;AAAA,EAE3D,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,WAAU;AAI3B,UAAM,QAAQ,QAAQ,IAAI,mBAAmB,KAAK;AAClD,QAAI,OAAO;AACT,WAAK,IAAI,GAAG,KAAK,iBAAiB;AAClC;AAAA,IACF;AAKA,QAAI,CAAC,gBAAgB,GAAG;AACtB,WAAK,MAAM,6DAA6D;AAAA,IAC1E;AAEA,QAAI,SAAS,cAAc;AAK3B,QAAI,UAAU,QAAQ,MAAM,GAAG;AAC7B,UAAI;AACF,cAAM,UAAU,MAAM,OAAwB,cAAc;AAC5D,YAAI,CAAC,QAAQ,aAAa;AACxB,yBAAe;AACf,mBAAS;AAAA,QACX,WAAW,QAAQ,gBAAgB,OAAO,OAAO;AAC/C,gBAAM,OAAO,MAAM,OAAc,WAAW;AAC5C,gBAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,WAAW;AAC3D,mBAAS;AAAA,YACP,OAAO,QAAQ;AAAA,YACf,SAAS,OAAO;AAAA,YAChB,UAAU,KAAK,IAAI;AAAA,UACrB;AACA,yBAAe,MAAM;AAAA,QACvB,OAAO;AACL,mBAAS;AAAA,YACP,GAAG;AAAA,YACH,UAAU,KAAK,IAAI;AAAA,UACrB;AACA,yBAAe,MAAM;AAAA,QACvB;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,EAAE,eAAe,UAAW,OAAM;AAAA,MAExC;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ;AACX,WAAK,IAAI,6DAA6D;AACtE;AAAA,IACF;AAEA,QAAI,OAAO,SAAS;AAClB,WAAK,IAAI,GAAG,OAAO,OAAO,KAAK,OAAO,KAAK,GAAG;AAAA,IAChD,OAAO;AACL,WAAK,IAAI,OAAO,KAAK;AAAA,IACvB;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/org/list.ts"],
4
- "sourcesContent": ["import { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\nimport { readActiveOrg } from '../../lib/active-org.js';\n\ninterface Org {\n id: string;\n name: string;\n slug: string;\n role: string;\n}\n\nconst WEB_URL =\n process.env.RULEMETRIC_WEB_URL ?? 'https://rulemetric.com';\n\nexport default class OrgList extends BaseCommand {\n static override description = 'List organizations the current user is a member of';\n\n static override examples = ['<%= config.bin %> org list'];\n\n async run(): Promise<void> {\n await this.parse(OrgList);\n this.requireAuth();\n\n const orgs = await apiGet<Org[]>('/api/orgs');\n\n if (orgs.length === 0) {\n this.log('No organizations.');\n this.log(`Create one in the web UI: ${WEB_URL}`);\n return;\n }\n\n // Resolve active org from env > local file > none. Env without a slug\n // still gets a star next to the matching id.\n const active = readActiveOrg();\n const activeId = active?.orgId ?? null;\n\n // Compute column widths for stable, readable output.\n const slugWidth = Math.max(4, ...orgs.map((o) => o.slug.length));\n const nameWidth = Math.max(4, ...orgs.map((o) => o.name.length));\n const roleWidth = Math.max(4, ...orgs.map((o) => o.role.length));\n\n const header =\n ` ACTIVE ${'SLUG'.padEnd(slugWidth)} ${'NAME'.padEnd(nameWidth)} ${'ROLE'.padEnd(roleWidth)}`;\n this.log(header);\n\n for (const org of orgs) {\n const marker = org.id === activeId ? '*' : ' ';\n this.log(\n ` ${marker} ${org.slug.padEnd(slugWidth)} ${org.name.padEnd(nameWidth)} ${org.role.padEnd(roleWidth)}`,\n );\n }\n\n if (!activeId) {\n this.log('');\n this.log('No active organization. Run `rulemetric org switch <slug>` to set one.');\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;AAWA,IAAM,UACJ,QAAQ,IAAI,sBAAsB;AAEpC,IAAqB,UAArB,MAAqB,iBAAgB,YAAY;AAAA,EAC/C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW,CAAC,4BAA4B;AAAA,EAExD,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,QAAO;AACxB,SAAK,YAAY;AAEjB,UAAM,OAAO,MAAM,OAAc,WAAW;AAE5C,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK,IAAI,mBAAmB;AAC5B,WAAK,IAAI,6BAA6B,OAAO,EAAE;AAC/C;AAAA,IACF;AAIA,UAAM,SAAS,cAAc;AAC7B,UAAM,WAAW,QAAQ,SAAS;AAGlC,UAAM,YAAY,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAC/D,UAAM,YAAY,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAC/D,UAAM,YAAY,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAE/D,UAAM,SACJ,aAAa,OAAO,OAAO,SAAS,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC;AACjG,SAAK,IAAI,MAAM;AAEf,eAAW,OAAO,MAAM;AACtB,YAAM,SAAS,IAAI,OAAO,WAAW,MAAM;AAC3C,WAAK;AAAA,QACH,KAAK,MAAM,UAAU,IAAI,KAAK,OAAO,SAAS,CAAC,KAAK,IAAI,KAAK,OAAO,SAAS,CAAC,KAAK,IAAI,KAAK,OAAO,SAAS,CAAC;AAAA,MAC/G;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,wEAAwE;AAAA,IACnF;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/org/switch.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet, apiPatch } from '../../lib/api-client.js';\nimport { writeActiveOrg, clearActiveOrg } from '../../lib/active-org.js';\n\ninterface Org {\n id: string;\n name: string;\n slug: string;\n role: string;\n}\n\nexport default class OrgSwitch extends BaseCommand {\n static override description = 'Switch the active organization';\n\n static override examples = [\n '<%= config.bin %> org switch acme',\n '<%= config.bin %> org switch --clear',\n ];\n\n static override args = {\n slug: Args.string({\n description: 'Organization slug to switch to',\n required: false,\n }),\n };\n\n static override flags = {\n clear: Flags.boolean({\n description: 'Clear the active organization (personal mode)',\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(OrgSwitch);\n this.requireAuth();\n\n if (flags.clear) {\n // PATCH the server first; only update the local cache after the\n // server confirms. If the request fails we leave the cache alone so\n // we don't pretend something changed when it didn't.\n await apiPatch('/api/profile', { activeOrgId: null });\n clearActiveOrg();\n this.log('Active org cleared (personal mode).');\n return;\n }\n\n if (!args.slug) {\n this.error(\n 'Slug is required. Run `rulemetric org list` to see your orgs, or use --clear to unset.',\n );\n }\n\n const orgs = await apiGet<Org[]>('/api/orgs');\n const match = orgs.find((o) => o.slug === args.slug);\n if (!match) {\n this.error(\n `Not a member of \"${args.slug}\". Run \\`rulemetric org list\\` to see your orgs.`,\n );\n }\n\n await apiPatch('/api/profile', { activeOrgId: match.id });\n writeActiveOrg({\n orgId: match.id,\n orgSlug: match.slug,\n syncedAt: Date.now(),\n });\n this.log(`Active org: ${match.slug}`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAY5B,IAAqB,YAArB,MAAqB,mBAAkB,YAAY;AAAA,EACjD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ;AAAA,MACnB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,UAAS;AAClD,SAAK,YAAY;AAEjB,QAAI,MAAM,OAAO;AAIf,YAAM,SAAS,gBAAgB,EAAE,aAAa,KAAK,CAAC;AACpD,qBAAe;AACf,WAAK,IAAI,qCAAqC;AAC9C;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,MAAM;AACd,WAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,OAAc,WAAW;AAC5C,UAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AACnD,QAAI,CAAC,OAAO;AACV,WAAK;AAAA,QACH,oBAAoB,KAAK,IAAI;AAAA,MAC/B;AAAA,IACF;AAEA,UAAM,SAAS,gBAAgB,EAAE,aAAa,MAAM,GAAG,CAAC;AACxD,mBAAe;AAAA,MACb,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,UAAU,KAAK,IAAI;AAAA,IACrB,CAAC;AACD,SAAK,IAAI,eAAe,MAAM,IAAI,EAAE;AAAA,EACtC;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/packs/add-instruction.ts"],
4
- "sourcesContent": ["import { Args } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\nexport default class PacksAddInstruction extends BaseCommand {\n static override description = 'Add an instruction to a pack';\n\n static override examples = [\n '<%= config.bin %> packs add-instruction <pack-id> <instruction-id>',\n ];\n\n static override args = {\n packId: Args.string({ description: 'Pack ID', required: true }),\n instructionId: Args.string({ description: 'Instruction ID', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(PacksAddInstruction);\n this.requireAuth();\n\n await apiPost(`/api/packs/${args.packId}/instructions`, {\n instructionId: args.instructionId,\n });\n\n this.log('Instruction added to pack.');\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAIrB,IAAqB,sBAArB,MAAqB,6BAA4B,YAAY;AAAA,EAC3D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,QAAQ,KAAK,OAAO,EAAE,aAAa,WAAW,UAAU,KAAK,CAAC;AAAA,IAC9D,eAAe,KAAK,OAAO,EAAE,aAAa,kBAAkB,UAAU,KAAK,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,oBAAmB;AACrD,SAAK,YAAY;AAEjB,UAAM,QAAQ,cAAc,KAAK,MAAM,iBAAiB;AAAA,MACtD,eAAe,KAAK;AAAA,IACtB,CAAC;AAED,SAAK,IAAI,4BAA4B;AAAA,EACvC;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/packs/apply.ts"],
4
- "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\ninterface ApplyResult {\n success: boolean;\n linked: number;\n total: number;\n}\n\nexport default class PacksApply extends BaseCommand {\n static override description = 'Apply a pack to a project (bulk-link all instructions)';\n\n static override examples = [\n '<%= config.bin %> packs apply <pack-id> --project <project-id>',\n ];\n\n static override args = {\n id: Args.string({ description: 'Pack ID', required: true }),\n };\n\n static override flags = {\n project: Flags.string({ char: 'p', description: 'Project ID', required: true }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(PacksApply);\n this.requireAuth();\n\n const result = await apiPost<ApplyResult>(`/api/packs/${args.id}/apply`, {\n projectId: flags.project,\n });\n\n this.log(`Applied pack: ${result.linked} of ${result.total} instructions linked to project.`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAU5B,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,WAAW,UAAU,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,SAAS,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,cAAc,UAAU,KAAK,CAAC;AAAA,EAChF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AACnD,SAAK,YAAY;AAEjB,UAAM,SAAS,MAAM,QAAqB,cAAc,KAAK,EAAE,UAAU;AAAA,MACvE,WAAW,MAAM;AAAA,IACnB,CAAC;AAED,SAAK,IAAI,iBAAiB,OAAO,MAAM,OAAO,OAAO,KAAK,kCAAkC;AAAA,EAC9F;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/commands/packs/create.ts"],
4
- "sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\ninterface CreatedPack {\n id: string;\n name: string;\n}\n\nexport default class PacksCreate extends BaseCommand {\n static override description = 'Create a new instruction pack';\n\n static override examples = [\n '<%= config.bin %> packs create --name \"Security Pack\" --description \"Security-focused instructions\"',\n ];\n\n static override flags = {\n name: Flags.string({ char: 'n', description: 'Pack name', required: true }),\n description: Flags.string({ char: 'd', description: 'Pack description', required: true }),\n scope: Flags.string({\n char: 's',\n description: 'Pack scope',\n options: ['org', 'team', 'personal'],\n default: 'personal',\n }),\n tags: Flags.string({ char: 't', description: 'Comma-separated tags' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(PacksCreate);\n this.requireAuth();\n\n const body: Record<string, unknown> = {\n name: flags.name,\n description: flags.description,\n scope: flags.scope,\n };\n\n if (flags.tags) {\n body.tags = flags.tags.split(',').map((t) => t.trim());\n }\n\n const result = await apiPost<CreatedPack>('/api/packs', body);\n this.log(`Created pack: ${result.name} (${result.id})`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAStB,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,aAAa,UAAU,KAAK,CAAC;AAAA,IAC1E,aAAa,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,oBAAoB,UAAU,KAAK,CAAC;AAAA,IACxF,OAAO,MAAM,OAAO;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,OAAO,QAAQ,UAAU;AAAA,MACnC,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,uBAAuB,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,YAAW;AAC9C,SAAK,YAAY;AAEjB,UAAM,OAAgC;AAAA,MACpC,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,OAAO,MAAM;AAAA,IACf;AAEA,QAAI,MAAM,MAAM;AACd,WAAK,OAAO,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACvD;AAEA,UAAM,SAAS,MAAM,QAAqB,cAAc,IAAI;AAC5D,SAAK,IAAI,iBAAiB,OAAO,IAAI,KAAK,OAAO,EAAE,GAAG;AAAA,EACxD;AACF;",
6
- "names": []
7
- }