@rulemetric/cli 0.7.3 → 0.7.5

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 (550) hide show
  1. package/README.md +10 -8
  2. package/dist/base-command.js +1 -14
  3. package/dist/chunk-2JRDG4LJ.js +31 -0
  4. package/dist/chunk-2TC6WCUT.js +34 -0
  5. package/dist/chunk-2WLVDSAP.js +2 -0
  6. package/dist/chunk-32EEBARV.js +1 -0
  7. package/dist/chunk-3AV3GTMP.js +1 -0
  8. package/dist/chunk-43YBXX7R.js +1 -0
  9. package/dist/chunk-4Z5ECCJE.js +1 -0
  10. package/dist/chunk-5RBLIVBF.js +1 -0
  11. package/dist/chunk-67QCYUJU.js +1 -0
  12. package/dist/chunk-6QKI756T.js +2 -0
  13. package/dist/chunk-6V4WM73L.js +1 -0
  14. package/dist/chunk-6XEC6474.js +1 -0
  15. package/dist/chunk-7DFNBRLY.js +61 -0
  16. package/dist/chunk-ARNZQBMX.js +1 -0
  17. package/dist/chunk-AYUJY37O.js +5 -0
  18. package/dist/chunk-CADKBP3D.js +58 -0
  19. package/dist/chunk-CDI5CCHU.js +1 -0
  20. package/dist/chunk-CNQ5DTNC.js +1 -0
  21. package/dist/chunk-DCLWFGEA.js +1 -0
  22. package/dist/chunk-DNF4HDI6.js +14 -0
  23. package/dist/chunk-DPFNJZUO.js +1 -0
  24. package/dist/chunk-DSO2U4Y6.js +56 -0
  25. package/dist/chunk-DVN7GFJG.js +1 -0
  26. package/dist/chunk-G63KMH6U.js +1 -0
  27. package/dist/chunk-G6XGDHGC.js +2 -0
  28. package/dist/chunk-GBMF3TP6.js +1 -0
  29. package/dist/chunk-GY5IJ4RS.js +1 -0
  30. package/dist/chunk-H2ORWIEY.js +1 -0
  31. package/dist/chunk-H4SV7FN4.js +1 -0
  32. package/dist/chunk-HS7X43XE.js +24 -0
  33. package/dist/{chunk-OQBBVTDG.js → chunk-I2DZGJRR.js} +6 -71
  34. package/dist/chunk-IZTIYR5Q.js +2 -0
  35. package/dist/chunk-JAPCCEKF.js +3 -0
  36. package/dist/chunk-JQTGQXUX.js +1 -0
  37. package/dist/chunk-KAF3CYRW.js +9 -0
  38. package/dist/chunk-KKDHD4XA.js +2 -0
  39. package/dist/chunk-KV325CXF.js +33 -0
  40. package/dist/chunk-MGHFDHHM.js +1 -0
  41. package/dist/chunk-MODXEGCU.js +1 -0
  42. package/dist/chunk-MVM6OGAF.js +4 -0
  43. package/dist/chunk-N7ODX6PO.js +1 -0
  44. package/dist/chunk-N7TGRFVZ.js +70 -0
  45. package/dist/chunk-NBTC5FNV.js +1 -0
  46. package/dist/chunk-NEACEHQD.js +1 -0
  47. package/dist/chunk-NJ5UED3H.js +1 -0
  48. package/dist/chunk-NVKX36YN.js +3 -0
  49. package/dist/chunk-O2SDD2WW.js +1 -0
  50. package/dist/chunk-O6C2UGBY.js +7 -0
  51. package/dist/chunk-OMXUK4M6.js +1 -0
  52. package/dist/chunk-PPKPCXJD.js +4 -0
  53. package/dist/{chunk-XZXS2W24.js → chunk-QFVGUZDO.js} +11 -57
  54. package/dist/chunk-RDET7CKR.js +1 -0
  55. package/dist/chunk-RQ424GI6.js +5 -0
  56. package/dist/chunk-RSKQRVPJ.js +1 -0
  57. package/dist/chunk-RTWRHIKY.js +7 -0
  58. package/dist/chunk-SZ62CP55.js +1 -0
  59. package/dist/chunk-TDD7IOV2.js +1 -0
  60. package/dist/chunk-TIOKY2IA.js +1 -0
  61. package/dist/chunk-TQMG647B.js +15 -0
  62. package/dist/chunk-TU2AR6XO.js +1 -0
  63. package/dist/chunk-U6ABMRT3.js +9 -0
  64. package/dist/chunk-U6XEU573.js +1 -0
  65. package/dist/chunk-UF6US7VU.js +1 -0
  66. package/dist/chunk-V44SRRYR.js +1 -0
  67. package/dist/chunk-V5U3E4BZ.js +1 -0
  68. package/dist/chunk-VAXRCSSH.js +2 -0
  69. package/dist/chunk-VLOX6KOM.js +1 -0
  70. package/dist/chunk-VUGRXM7R.js +1 -0
  71. package/dist/chunk-W2MOTOQE.js +1 -0
  72. package/dist/chunk-W2MV25SB.js +1 -0
  73. package/dist/chunk-WLVQJH4E.js +1 -0
  74. package/dist/chunk-WSCK4WNK.js +1 -0
  75. package/dist/chunk-XICLXXRH.js +1 -0
  76. package/dist/chunk-XXDZJ6YI.js +1 -0
  77. package/dist/chunk-ZL4MZMUK.js +34 -0
  78. package/dist/chunk-ZLLER3HP.js +1 -0
  79. package/dist/chunk-ZR3MUNLS.js +1 -0
  80. package/dist/chunk-ZXF5NE54.js +1 -0
  81. package/dist/commands/antigravity/backfill.js +2 -136
  82. package/dist/commands/auth/create-key.js +1 -52
  83. package/dist/commands/auth/login.js +1 -85
  84. package/dist/commands/auth/logout.js +1 -29
  85. package/dist/commands/auth/revoke-key.js +4 -33
  86. package/dist/commands/auth/signup.js +1 -89
  87. package/dist/commands/auth/status.js +1 -42
  88. package/dist/commands/catalog/index.js +2 -52
  89. package/dist/commands/catalog/recommend.js +3 -43
  90. package/dist/commands/convert.js +1 -75
  91. package/dist/commands/converters.js +1 -54
  92. package/dist/commands/crons/list.js +1 -41
  93. package/dist/commands/crons/run.js +2 -76
  94. package/dist/commands/dashboard.js +1 -46
  95. package/dist/commands/diagnostics.js +1 -117
  96. package/dist/commands/eval-targets/create.js +1 -53
  97. package/dist/commands/eval-targets/list.js +1 -54
  98. package/dist/commands/evals/agent.js +3 -310
  99. package/dist/commands/evals/benchmark.js +6 -73
  100. package/dist/commands/evals/compare.js +13 -96
  101. package/dist/commands/evals/create.js +1 -67
  102. package/dist/commands/evals/optimize-description.js +25 -239
  103. package/dist/commands/evals/optimize.js +5 -211
  104. package/dist/commands/evals/run.js +3 -183
  105. package/dist/commands/gateway/ensure.js +1 -104
  106. package/dist/commands/hooks/emit-instructions.js +1 -25
  107. package/dist/commands/hooks/install.js +1 -442
  108. package/dist/commands/hooks/run.js +3 -81
  109. package/dist/commands/hooks/uninstall.js +2 -156
  110. package/dist/commands/import.js +1 -66
  111. package/dist/commands/instructions/create.js +1 -74
  112. package/dist/commands/instructions/delete.js +1 -55
  113. package/dist/commands/instructions/fork.js +1 -34
  114. package/dist/commands/instructions/get.js +1 -68
  115. package/dist/commands/instructions/list.js +1 -65
  116. package/dist/commands/instructions/promote.js +1 -42
  117. package/dist/commands/instructions/pull.js +1 -39
  118. package/dist/commands/instructions/upstream.js +1 -38
  119. package/dist/commands/instructions/versions.js +1 -53
  120. package/dist/commands/launcher.js +1 -40
  121. package/dist/commands/org/current.js +1 -77
  122. package/dist/commands/org/list.js +1 -52
  123. package/dist/commands/org/switch.js +1 -71
  124. package/dist/commands/packs/add-instruction.js +1 -37
  125. package/dist/commands/packs/apply.js +1 -39
  126. package/dist/commands/packs/create.js +1 -50
  127. package/dist/commands/packs/fork.js +1 -34
  128. package/dist/commands/packs/get.js +3 -56
  129. package/dist/commands/packs/list.js +1 -66
  130. package/dist/commands/packs/remove-instruction.js +1 -35
  131. package/dist/commands/proxy/env.js +3 -131
  132. package/dist/commands/proxy/logs.js +3 -85
  133. package/dist/commands/proxy/restart.js +1 -35
  134. package/dist/commands/proxy/setup.js +17 -454
  135. package/dist/commands/proxy/start.js +10 -333
  136. package/dist/commands/proxy/status.js +1 -78
  137. package/dist/commands/proxy/stop.js +1 -94
  138. package/dist/commands/research/backfill.js +1 -59
  139. package/dist/commands/research/tail-transcript.js +1 -70
  140. package/dist/commands/service/install.js +57 -796
  141. package/dist/commands/service/status.js +1 -180
  142. package/dist/commands/service/uninstall.js +1 -119
  143. package/dist/commands/sessions/analyze.js +1 -48
  144. package/dist/commands/sessions/end.js +2 -85
  145. package/dist/commands/sessions/import.js +1 -46
  146. package/dist/commands/sessions/list.js +1 -48
  147. package/dist/commands/sessions/start.js +3 -90
  148. package/dist/commands/setup.js +3 -150
  149. package/dist/commands/skills/export-approved.js +1 -46
  150. package/dist/commands/skills/install.js +4 -107
  151. package/dist/commands/skills/list.js +4 -65
  152. package/dist/commands/skills/publish.js +2 -98
  153. package/dist/commands/skills/search.js +3 -72
  154. package/dist/commands/skills/update.js +3 -55
  155. package/dist/commands/suggestions/accept.js +8 -84
  156. package/dist/commands/suggestions/dismiss.js +1 -45
  157. package/dist/commands/suggestions/list.js +2 -61
  158. package/dist/commands/suggestions/refresh.js +1 -27
  159. package/dist/cursor-T7AMCMKS.js +13 -0
  160. package/dist/dashboard/Dashboard.js +1 -243
  161. package/dist/dashboard/data.js +1 -15
  162. package/dist/dashboard/launcher/ActiveJobsList.js +1 -10
  163. package/dist/dashboard/launcher/LauncherOverlay.js +1 -16
  164. package/dist/dashboard/launcher/NewLaunchForm.js +1 -10
  165. package/dist/dashboard/launcher/api.js +1 -16
  166. package/dist/dashboard/launcher/tool-labels.js +1 -10
  167. package/dist/dashboard/launcher/types.js +0 -1
  168. package/dist/dashboard/launcher/useLaunchJobs.js +1 -11
  169. package/dist/dashboard/panels/friction.js +1 -10
  170. package/dist/dashboard/panels/insights.js +1 -10
  171. package/dist/dashboard/panels/instructions.js +1 -10
  172. package/dist/dashboard/panels/outcomes.js +1 -10
  173. package/dist/dashboard/panels/overview.js +1 -10
  174. package/dist/dashboard/panels/shared.js +1 -19
  175. package/dist/dashboard/types.js +1 -24
  176. package/dist/dist-FAVALJ5C.js +1 -0
  177. package/dist/index.js +1 -8
  178. package/dist/lib/active-org-refresh.js +1 -15
  179. package/dist/lib/active-org.js +1 -16
  180. package/dist/lib/agent-loop.js +1 -47
  181. package/dist/lib/antigravity-transcript.js +1 -22
  182. package/dist/lib/api-client.js +1 -23
  183. package/dist/lib/auth.js +1 -30
  184. package/dist/lib/capture-hosts.js +1 -8
  185. package/dist/lib/detect-languages.js +1 -8
  186. package/dist/lib/detect-tmux.js +1 -9
  187. package/dist/lib/diagnostics.js +1 -12
  188. package/dist/lib/editor-proxy-pins.js +1 -14
  189. package/dist/lib/ensure-api-key.js +1 -11
  190. package/dist/lib/ensure-fresh-token.js +1 -0
  191. package/dist/lib/eval-analyzer.js +1 -9
  192. package/dist/lib/eval-benchmark.js +1 -12
  193. package/dist/lib/eval-conversation-handler.js +1 -13
  194. package/dist/lib/eval-executor.js +1 -8
  195. package/dist/lib/eval-grader.js +1 -9
  196. package/dist/lib/eval-meta-judge.js +1 -9
  197. package/dist/lib/eval-trigger-tester.js +1 -11
  198. package/dist/lib/eval-worktree.js +1 -8
  199. package/dist/lib/gateway-entry.js +1 -61
  200. package/dist/lib/gateway-identity.js +1 -16
  201. package/dist/lib/gateway-lifecycle.js +1 -32
  202. package/dist/lib/gateway.js +1 -14
  203. package/dist/lib/handlers/cron-refresh-pricing.js +1 -0
  204. package/dist/lib/handlers/cron-refresh-skills.js +1 -8
  205. package/dist/lib/handlers/cron-suggest-instructions.js +1 -16
  206. package/dist/lib/handlers/process-announcement.js +1 -11
  207. package/dist/lib/handlers/process-changelog.js +1 -11
  208. package/dist/lib/handlers/process-conversation.js +1 -14
  209. package/dist/lib/handlers/process-eval.js +1 -15
  210. package/dist/lib/handlers/process-insights.js +1 -15
  211. package/dist/lib/handlers/process-launch.js +1 -16
  212. package/dist/lib/handlers/process-run-cleanup.js +1 -13
  213. package/dist/lib/handlers/process-send-message.js +1 -10
  214. package/dist/lib/handlers/process-session-goal.js +1 -12
  215. package/dist/lib/hooks-config.js +1 -81
  216. package/dist/lib/insights-prompts.js +1 -12
  217. package/dist/lib/instruction-snapshot.js +1 -8
  218. package/dist/lib/job-helpers.js +0 -1
  219. package/dist/lib/llm-client.js +1 -20
  220. package/dist/lib/manual-tasks-meta.js +1 -8
  221. package/dist/lib/manual-tasks.js +1 -80
  222. package/dist/lib/output.js +1 -12
  223. package/dist/lib/permanent-job-error.js +1 -10
  224. package/dist/lib/pid-identity.js +1 -14
  225. package/dist/lib/proxy-respawn.js +1 -12
  226. package/dist/lib/research-client.js +1 -12
  227. package/dist/lib/setup-steps.js +1 -33
  228. package/dist/lib/skills-loader.js +1 -8
  229. package/dist/lib/statusline-shim.js +1 -20
  230. package/dist/lib/telemetry.js +1 -16
  231. package/dist/lib/terminal-target-heartbeat.js +1 -15
  232. package/dist/lib/tmux.js +1 -16
  233. package/dist/lib/transcript-rate-limit-watcher.js +1 -22
  234. package/dist/lib/types.js +1 -8
  235. package/dist/lib/version-check.js +1 -12
  236. package/dist/lib/which.js +1 -8
  237. package/dist/lib/worktree.js +1 -17
  238. package/dist/opencode-QRJ3BH23.js +1 -0
  239. package/oclif.manifest.json +12 -34
  240. package/package.json +9 -8
  241. package/dist/base-command.js.map +0 -7
  242. package/dist/chunk-2HK7RGZB.js +0 -82
  243. package/dist/chunk-2HK7RGZB.js.map +0 -7
  244. package/dist/chunk-2ORJWTNZ.js +0 -307
  245. package/dist/chunk-2ORJWTNZ.js.map +0 -7
  246. package/dist/chunk-37LN5O7M.js +0 -59
  247. package/dist/chunk-37LN5O7M.js.map +0 -7
  248. package/dist/chunk-3S7223UR.js +0 -81
  249. package/dist/chunk-3S7223UR.js.map +0 -7
  250. package/dist/chunk-3TIMQ3O6.js +0 -96
  251. package/dist/chunk-3TIMQ3O6.js.map +0 -7
  252. package/dist/chunk-42GFSAJP.js +0 -32
  253. package/dist/chunk-42GFSAJP.js.map +0 -7
  254. package/dist/chunk-4BHDHHKL.js +0 -48
  255. package/dist/chunk-4BHDHHKL.js.map +0 -7
  256. package/dist/chunk-4D537GXE.js +0 -99
  257. package/dist/chunk-4D537GXE.js.map +0 -7
  258. package/dist/chunk-4LYCDS2N.js +0 -139
  259. package/dist/chunk-4LYCDS2N.js.map +0 -7
  260. package/dist/chunk-4SCZK7AL.js +0 -129
  261. package/dist/chunk-4SCZK7AL.js.map +0 -7
  262. package/dist/chunk-4XAWK6S2.js +0 -161
  263. package/dist/chunk-4XAWK6S2.js.map +0 -7
  264. package/dist/chunk-52WIYRZH.js +0 -73
  265. package/dist/chunk-52WIYRZH.js.map +0 -7
  266. package/dist/chunk-5BAOGNUH.js +0 -79
  267. package/dist/chunk-5BAOGNUH.js.map +0 -7
  268. package/dist/chunk-5EDMGK3W.js +0 -39
  269. package/dist/chunk-5EDMGK3W.js.map +0 -7
  270. package/dist/chunk-6NBS5XFS.js +0 -99
  271. package/dist/chunk-6NBS5XFS.js.map +0 -7
  272. package/dist/chunk-7LVVKQMZ.js +0 -98
  273. package/dist/chunk-7LVVKQMZ.js.map +0 -7
  274. package/dist/chunk-7NNFYWKK.js +0 -243
  275. package/dist/chunk-7NNFYWKK.js.map +0 -7
  276. package/dist/chunk-7NYKWN7U.js +0 -12
  277. package/dist/chunk-7NYKWN7U.js.map +0 -7
  278. package/dist/chunk-BO76WKJR.js +0 -42
  279. package/dist/chunk-BO76WKJR.js.map +0 -7
  280. package/dist/chunk-BRD5RUGM.js +0 -53
  281. package/dist/chunk-BRD5RUGM.js.map +0 -7
  282. package/dist/chunk-BT6Z6545.js +0 -43
  283. package/dist/chunk-BT6Z6545.js.map +0 -7
  284. package/dist/chunk-BZDKEQKU.js +0 -39
  285. package/dist/chunk-BZDKEQKU.js.map +0 -7
  286. package/dist/chunk-DGHWRQXL.js +0 -17
  287. package/dist/chunk-DGHWRQXL.js.map +0 -7
  288. package/dist/chunk-DIQUV5FR.js +0 -257
  289. package/dist/chunk-DIQUV5FR.js.map +0 -7
  290. package/dist/chunk-DMX5YOTM.js +0 -167
  291. package/dist/chunk-DMX5YOTM.js.map +0 -7
  292. package/dist/chunk-DNKSVWMD.js +0 -108
  293. package/dist/chunk-DNKSVWMD.js.map +0 -7
  294. package/dist/chunk-DQ3KELXD.js +0 -74
  295. package/dist/chunk-DQ3KELXD.js.map +0 -7
  296. package/dist/chunk-DUJSRBLP.js +0 -122
  297. package/dist/chunk-DUJSRBLP.js.map +0 -7
  298. package/dist/chunk-E3BIT53W.js +0 -154
  299. package/dist/chunk-E3BIT53W.js.map +0 -7
  300. package/dist/chunk-EARWG4EV.js +0 -22
  301. package/dist/chunk-EARWG4EV.js.map +0 -7
  302. package/dist/chunk-EI5BHWXA.js +0 -1662
  303. package/dist/chunk-EI5BHWXA.js.map +0 -7
  304. package/dist/chunk-EJ3YAFDP.js +0 -37
  305. package/dist/chunk-EJ3YAFDP.js.map +0 -7
  306. package/dist/chunk-EKJ2CABV.js +0 -76
  307. package/dist/chunk-EKJ2CABV.js.map +0 -7
  308. package/dist/chunk-EKP32DLN.js +0 -16
  309. package/dist/chunk-EKP32DLN.js.map +0 -7
  310. package/dist/chunk-EYPAAGN5.js +0 -51
  311. package/dist/chunk-EYPAAGN5.js.map +0 -7
  312. package/dist/chunk-F5N6CLJJ.js +0 -1995
  313. package/dist/chunk-F5N6CLJJ.js.map +0 -7
  314. package/dist/chunk-GIUBARWS.js +0 -99
  315. package/dist/chunk-GIUBARWS.js.map +0 -7
  316. package/dist/chunk-GQNJO2P2.js +0 -102
  317. package/dist/chunk-GQNJO2P2.js.map +0 -7
  318. package/dist/chunk-IJGF2ETG.js +0 -68
  319. package/dist/chunk-IJGF2ETG.js.map +0 -7
  320. package/dist/chunk-ILYDELUE.js +0 -46
  321. package/dist/chunk-ILYDELUE.js.map +0 -7
  322. package/dist/chunk-J6QFW4LD.js +0 -55
  323. package/dist/chunk-J6QFW4LD.js.map +0 -7
  324. package/dist/chunk-J7N3DLH6.js +0 -117
  325. package/dist/chunk-J7N3DLH6.js.map +0 -7
  326. package/dist/chunk-JFDWKLQC.js +0 -23
  327. package/dist/chunk-JFDWKLQC.js.map +0 -7
  328. package/dist/chunk-JULOLTZS.js +0 -61
  329. package/dist/chunk-JULOLTZS.js.map +0 -7
  330. package/dist/chunk-KJKBDQ4D.js +0 -220
  331. package/dist/chunk-KJKBDQ4D.js.map +0 -7
  332. package/dist/chunk-KRBQLMOP.js +0 -41
  333. package/dist/chunk-KRBQLMOP.js.map +0 -7
  334. package/dist/chunk-LXKPNATC.js +0 -624
  335. package/dist/chunk-LXKPNATC.js.map +0 -7
  336. package/dist/chunk-NSBPE2FW.js +0 -17
  337. package/dist/chunk-NSBPE2FW.js.map +0 -7
  338. package/dist/chunk-OCKHW72U.js +0 -55
  339. package/dist/chunk-OCKHW72U.js.map +0 -7
  340. package/dist/chunk-OKWCKCPE.js +0 -414
  341. package/dist/chunk-OKWCKCPE.js.map +0 -7
  342. package/dist/chunk-OO7JDFS4.js +0 -157
  343. package/dist/chunk-OO7JDFS4.js.map +0 -7
  344. package/dist/chunk-OQBBVTDG.js.map +0 -7
  345. package/dist/chunk-OQSQC7VB.js +0 -77
  346. package/dist/chunk-OQSQC7VB.js.map +0 -7
  347. package/dist/chunk-PED7L5GX.js +0 -92
  348. package/dist/chunk-PED7L5GX.js.map +0 -7
  349. package/dist/chunk-QJQS6TUN.js +0 -44
  350. package/dist/chunk-QJQS6TUN.js.map +0 -7
  351. package/dist/chunk-QN34TGD3.js +0 -83
  352. package/dist/chunk-QN34TGD3.js.map +0 -7
  353. package/dist/chunk-QSN77T7C.js +0 -250
  354. package/dist/chunk-QSN77T7C.js.map +0 -7
  355. package/dist/chunk-R56PH7YE.js +0 -78
  356. package/dist/chunk-R56PH7YE.js.map +0 -7
  357. package/dist/chunk-RAXRZYOB.js +0 -299
  358. package/dist/chunk-RAXRZYOB.js.map +0 -7
  359. package/dist/chunk-RH7NHVSK.js +0 -16
  360. package/dist/chunk-RH7NHVSK.js.map +0 -7
  361. package/dist/chunk-RMTT4KDY.js +0 -191
  362. package/dist/chunk-RMTT4KDY.js.map +0 -7
  363. package/dist/chunk-RQ2TMLKG.js +0 -142
  364. package/dist/chunk-RQ2TMLKG.js.map +0 -7
  365. package/dist/chunk-SO3T35U7.js +0 -80
  366. package/dist/chunk-SO3T35U7.js.map +0 -7
  367. package/dist/chunk-UKMLICWS.js +0 -51
  368. package/dist/chunk-UKMLICWS.js.map +0 -7
  369. package/dist/chunk-VA5FFOS7.js +0 -243
  370. package/dist/chunk-VA5FFOS7.js.map +0 -7
  371. package/dist/chunk-W2YERO7E.js +0 -170
  372. package/dist/chunk-W2YERO7E.js.map +0 -7
  373. package/dist/chunk-W53GKIZQ.js +0 -50
  374. package/dist/chunk-W53GKIZQ.js.map +0 -7
  375. package/dist/chunk-WA4MWYRW.js +0 -254
  376. package/dist/chunk-WA4MWYRW.js.map +0 -7
  377. package/dist/chunk-XC6M4CSW.js +0 -44
  378. package/dist/chunk-XC6M4CSW.js.map +0 -7
  379. package/dist/chunk-XK42ZBDE.js +0 -23
  380. package/dist/chunk-XK42ZBDE.js.map +0 -7
  381. package/dist/chunk-XUV6DDBF.js +0 -124
  382. package/dist/chunk-XUV6DDBF.js.map +0 -7
  383. package/dist/chunk-XZXS2W24.js.map +0 -7
  384. package/dist/chunk-Y3WD5CSW.js +0 -49
  385. package/dist/chunk-Y3WD5CSW.js.map +0 -7
  386. package/dist/chunk-Y4BJXXYV.js +0 -148
  387. package/dist/chunk-Y4BJXXYV.js.map +0 -7
  388. package/dist/chunk-YNIH3KMU.js +0 -121
  389. package/dist/chunk-YNIH3KMU.js.map +0 -7
  390. package/dist/chunk-ZUJBM6HE.js +0 -125
  391. package/dist/chunk-ZUJBM6HE.js.map +0 -7
  392. package/dist/commands/antigravity/backfill.js.map +0 -7
  393. package/dist/commands/auth/create-key.js.map +0 -7
  394. package/dist/commands/auth/login.js.map +0 -7
  395. package/dist/commands/auth/logout.js.map +0 -7
  396. package/dist/commands/auth/revoke-key.js.map +0 -7
  397. package/dist/commands/auth/signup.js.map +0 -7
  398. package/dist/commands/auth/status.js.map +0 -7
  399. package/dist/commands/catalog/index.js.map +0 -7
  400. package/dist/commands/catalog/recommend.js.map +0 -7
  401. package/dist/commands/convert.js.map +0 -7
  402. package/dist/commands/converters.js.map +0 -7
  403. package/dist/commands/crons/list.js.map +0 -7
  404. package/dist/commands/crons/run.js.map +0 -7
  405. package/dist/commands/dashboard.js.map +0 -7
  406. package/dist/commands/diagnostics.js.map +0 -7
  407. package/dist/commands/eval-targets/create.js.map +0 -7
  408. package/dist/commands/eval-targets/list.js.map +0 -7
  409. package/dist/commands/evals/agent.js.map +0 -7
  410. package/dist/commands/evals/benchmark.js.map +0 -7
  411. package/dist/commands/evals/compare.js.map +0 -7
  412. package/dist/commands/evals/create.js.map +0 -7
  413. package/dist/commands/evals/optimize-description.js.map +0 -7
  414. package/dist/commands/evals/optimize.js.map +0 -7
  415. package/dist/commands/evals/run.js.map +0 -7
  416. package/dist/commands/gateway/ensure.js.map +0 -7
  417. package/dist/commands/hooks/emit-instructions.js.map +0 -7
  418. package/dist/commands/hooks/install.js.map +0 -7
  419. package/dist/commands/hooks/run.js.map +0 -7
  420. package/dist/commands/hooks/uninstall.js.map +0 -7
  421. package/dist/commands/import.js.map +0 -7
  422. package/dist/commands/instructions/create.js.map +0 -7
  423. package/dist/commands/instructions/delete.js.map +0 -7
  424. package/dist/commands/instructions/fork.js.map +0 -7
  425. package/dist/commands/instructions/get.js.map +0 -7
  426. package/dist/commands/instructions/list.js.map +0 -7
  427. package/dist/commands/instructions/promote.js.map +0 -7
  428. package/dist/commands/instructions/pull.js.map +0 -7
  429. package/dist/commands/instructions/upstream.js.map +0 -7
  430. package/dist/commands/instructions/versions.js.map +0 -7
  431. package/dist/commands/launcher.js.map +0 -7
  432. package/dist/commands/org/current.js.map +0 -7
  433. package/dist/commands/org/list.js.map +0 -7
  434. package/dist/commands/org/switch.js.map +0 -7
  435. package/dist/commands/packs/add-instruction.js.map +0 -7
  436. package/dist/commands/packs/apply.js.map +0 -7
  437. package/dist/commands/packs/create.js.map +0 -7
  438. package/dist/commands/packs/fork.js.map +0 -7
  439. package/dist/commands/packs/get.js.map +0 -7
  440. package/dist/commands/packs/list.js.map +0 -7
  441. package/dist/commands/packs/remove-instruction.js.map +0 -7
  442. package/dist/commands/proxy/env.js.map +0 -7
  443. package/dist/commands/proxy/logs.js.map +0 -7
  444. package/dist/commands/proxy/restart.js.map +0 -7
  445. package/dist/commands/proxy/setup.js.map +0 -7
  446. package/dist/commands/proxy/start.js.map +0 -7
  447. package/dist/commands/proxy/status.js.map +0 -7
  448. package/dist/commands/proxy/stop.js.map +0 -7
  449. package/dist/commands/research/backfill.js.map +0 -7
  450. package/dist/commands/research/tail-transcript.js.map +0 -7
  451. package/dist/commands/service/install.js.map +0 -7
  452. package/dist/commands/service/status.js.map +0 -7
  453. package/dist/commands/service/uninstall.js.map +0 -7
  454. package/dist/commands/sessions/analyze.js.map +0 -7
  455. package/dist/commands/sessions/end.js.map +0 -7
  456. package/dist/commands/sessions/import.js.map +0 -7
  457. package/dist/commands/sessions/list.js.map +0 -7
  458. package/dist/commands/sessions/start.js.map +0 -7
  459. package/dist/commands/setup.js.map +0 -7
  460. package/dist/commands/skills/export-approved.js.map +0 -7
  461. package/dist/commands/skills/install.js.map +0 -7
  462. package/dist/commands/skills/list.js.map +0 -7
  463. package/dist/commands/skills/publish.js.map +0 -7
  464. package/dist/commands/skills/search.js.map +0 -7
  465. package/dist/commands/skills/update.js.map +0 -7
  466. package/dist/commands/suggestions/accept.js.map +0 -7
  467. package/dist/commands/suggestions/dismiss.js.map +0 -7
  468. package/dist/commands/suggestions/list.js.map +0 -7
  469. package/dist/commands/suggestions/refresh.js.map +0 -7
  470. package/dist/cursor-BGQJ4CWI.js +0 -134
  471. package/dist/cursor-BGQJ4CWI.js.map +0 -7
  472. package/dist/dashboard/Dashboard.js.map +0 -7
  473. package/dist/dashboard/data.js.map +0 -7
  474. package/dist/dashboard/launcher/ActiveJobsList.js.map +0 -7
  475. package/dist/dashboard/launcher/LauncherOverlay.js.map +0 -7
  476. package/dist/dashboard/launcher/NewLaunchForm.js.map +0 -7
  477. package/dist/dashboard/launcher/api.js.map +0 -7
  478. package/dist/dashboard/launcher/tool-labels.js.map +0 -7
  479. package/dist/dashboard/launcher/types.js.map +0 -7
  480. package/dist/dashboard/launcher/useLaunchJobs.js.map +0 -7
  481. package/dist/dashboard/panels/friction.js.map +0 -7
  482. package/dist/dashboard/panels/insights.js.map +0 -7
  483. package/dist/dashboard/panels/instructions.js.map +0 -7
  484. package/dist/dashboard/panels/outcomes.js.map +0 -7
  485. package/dist/dashboard/panels/overview.js.map +0 -7
  486. package/dist/dashboard/panels/shared.js.map +0 -7
  487. package/dist/dashboard/types.js.map +0 -7
  488. package/dist/dist-UNYP5PJR.js +0 -56
  489. package/dist/dist-UNYP5PJR.js.map +0 -7
  490. package/dist/index.js.map +0 -7
  491. package/dist/lib/active-org-refresh.js.map +0 -7
  492. package/dist/lib/active-org.js.map +0 -7
  493. package/dist/lib/agent-loop.js.map +0 -7
  494. package/dist/lib/antigravity-transcript.js.map +0 -7
  495. package/dist/lib/api-client.js.map +0 -7
  496. package/dist/lib/auth.js.map +0 -7
  497. package/dist/lib/capture-hosts.js.map +0 -7
  498. package/dist/lib/detect-languages.js.map +0 -7
  499. package/dist/lib/detect-tmux.js.map +0 -7
  500. package/dist/lib/diagnostics.js.map +0 -7
  501. package/dist/lib/editor-proxy-pins.js.map +0 -7
  502. package/dist/lib/ensure-api-key.js.map +0 -7
  503. package/dist/lib/eval-analyzer.js.map +0 -7
  504. package/dist/lib/eval-benchmark.js.map +0 -7
  505. package/dist/lib/eval-conversation-handler.js.map +0 -7
  506. package/dist/lib/eval-executor.js.map +0 -7
  507. package/dist/lib/eval-grader.js.map +0 -7
  508. package/dist/lib/eval-meta-judge.js.map +0 -7
  509. package/dist/lib/eval-trigger-tester.js.map +0 -7
  510. package/dist/lib/eval-worktree.js.map +0 -7
  511. package/dist/lib/gateway-entry.js.map +0 -7
  512. package/dist/lib/gateway-identity.js.map +0 -7
  513. package/dist/lib/gateway-lifecycle.js.map +0 -7
  514. package/dist/lib/gateway.js.map +0 -7
  515. package/dist/lib/handlers/cron-refresh-skills.js.map +0 -7
  516. package/dist/lib/handlers/cron-suggest-instructions.js.map +0 -7
  517. package/dist/lib/handlers/process-announcement.js.map +0 -7
  518. package/dist/lib/handlers/process-changelog.js.map +0 -7
  519. package/dist/lib/handlers/process-conversation.js.map +0 -7
  520. package/dist/lib/handlers/process-eval.js.map +0 -7
  521. package/dist/lib/handlers/process-insights.js.map +0 -7
  522. package/dist/lib/handlers/process-launch.js.map +0 -7
  523. package/dist/lib/handlers/process-run-cleanup.js.map +0 -7
  524. package/dist/lib/handlers/process-send-message.js.map +0 -7
  525. package/dist/lib/handlers/process-session-goal.js.map +0 -7
  526. package/dist/lib/hooks-config.js.map +0 -7
  527. package/dist/lib/insights-prompts.js.map +0 -7
  528. package/dist/lib/instruction-snapshot.js.map +0 -7
  529. package/dist/lib/job-helpers.js.map +0 -7
  530. package/dist/lib/llm-client.js.map +0 -7
  531. package/dist/lib/manual-tasks-meta.js.map +0 -7
  532. package/dist/lib/manual-tasks.js.map +0 -7
  533. package/dist/lib/output.js.map +0 -7
  534. package/dist/lib/permanent-job-error.js.map +0 -7
  535. package/dist/lib/pid-identity.js.map +0 -7
  536. package/dist/lib/proxy-respawn.js.map +0 -7
  537. package/dist/lib/research-client.js.map +0 -7
  538. package/dist/lib/setup-steps.js.map +0 -7
  539. package/dist/lib/skills-loader.js.map +0 -7
  540. package/dist/lib/statusline-shim.js.map +0 -7
  541. package/dist/lib/telemetry.js.map +0 -7
  542. package/dist/lib/terminal-target-heartbeat.js.map +0 -7
  543. package/dist/lib/tmux.js.map +0 -7
  544. package/dist/lib/transcript-rate-limit-watcher.js.map +0 -7
  545. package/dist/lib/types.js.map +0 -7
  546. package/dist/lib/version-check.js.map +0 -7
  547. package/dist/lib/which.js.map +0 -7
  548. package/dist/lib/worktree.js.map +0 -7
  549. package/dist/opencode-IQ7X5YMJ.js +0 -190
  550. package/dist/opencode-IQ7X5YMJ.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/active-org-refresh.ts"],
4
- "sourcesContent": ["import { apiGet } from './api-client.js';\nimport {\n readActiveOrg,\n writeActiveOrg,\n clearActiveOrg,\n isStale,\n} from './active-org.js';\n\ninterface ProfileResponse {\n id: string;\n email: string | null;\n displayName: string | null;\n activeOrgId: string | null;\n}\n\ninterface OrgListItem {\n id: string;\n name: string;\n slug: string;\n role: string;\n}\n\n/**\n * Module-level guard so we only refresh once per CLI invocation, even if\n * `BaseCommand.init` runs multiple times across nested commands or tests.\n */\nlet attempted = false;\n\n/**\n * Opportunistically reconcile the local active-org cache with the server.\n *\n * Runs in three cases:\n * 1. Cache file is ABSENT (bootstrap) \u2014 populate from `/api/profile`. This\n * branch is load-bearing: without it, a user who never explicitly ran\n * `rulemetric org switch` would have hook captures with `org_id=NULL`\n * forever, even when the server already has `profiles.active_org_id`\n * set (e.g. switched via the web UI, or auto-set by the handle_new_user\n * trigger from migration 00067). Caught 2026-05-25 after an audit found\n * 244 hook sessions over 14 days all missing org_id.\n * 2. Cache file exists but is stale (>5min) \u2014 re-sync from the server.\n * 3. Env override is set OR cache is fresh \u2014 no-op, zero network.\n *\n * Failures are intentionally swallowed: this is a background nicety, not a\n * gating step. The next API call the user actually invoked will surface\n * any auth/network errors with clearer messaging than a refresh failure\n * could. Capture-time fallback to `profiles.active_org_id` at\n * `apps/api/src/routes/sessions.ts:48` is the final safety net.\n */\n/**\n * Internal: fetch profile + (if needed) orgs, then write/clear the cache.\n * Shared body for both `maybeRefreshActiveOrg` (guarded, used by every CLI\n * command via BaseCommand) and `bootstrapActiveOrg` (unguarded, used by\n * lifecycle commands that just wrote auth/install state and want the cache\n * to reflect it before they exit).\n */\nasync function syncActiveOrgFromServer(): Promise<void> {\n // Env override: caller has explicitly chosen the org. Don't write the\n // file \u2014 env should be ephemeral.\n if (process.env.RULEMETRIC_ORG_ID) return;\n\n const cached = readActiveOrg();\n // Only skip when we have a fresh cache. Missing cache (cached === null)\n // and stale cache both fall through to the refresh path below.\n if (cached && !isStale(cached)) return;\n\n try {\n const profile = await apiGet<ProfileResponse>('/api/profile');\n\n if (!profile.activeOrgId) {\n // Server has no active org \u2014 drop the local cache (if any).\n clearActiveOrg();\n return;\n }\n\n if (cached && profile.activeOrgId === cached.orgId) {\n // Same id \u2014 just bump syncedAt so we don't re-fetch every command.\n writeActiveOrg({\n orgId: cached.orgId,\n orgSlug: cached.orgSlug,\n syncedAt: Date.now(),\n });\n return;\n }\n\n // Either bootstrapping fresh (no cache) OR the server changed the active\n // org out from under us (e.g. via web UI). Look up the slug for the id\n // and (re)write the cache.\n const orgs = await apiGet<OrgListItem[]>('/api/orgs');\n const match = orgs.find((o) => o.id === profile.activeOrgId);\n writeActiveOrg({\n orgId: profile.activeOrgId,\n orgSlug: match?.slug,\n syncedAt: Date.now(),\n });\n } catch {\n // Swallow \u2014 leave the old cache intact. The user's actual command will\n // surface the real error if any.\n }\n}\n\nexport async function maybeRefreshActiveOrg(): Promise<void> {\n if (attempted) return;\n attempted = true;\n await syncActiveOrgFromServer();\n}\n\n/**\n * Explicit, guard-bypassing version of the refresh. Use ONLY from commands\n * where the user just took an action that changes auth/install state and we\n * want the cache to reflect it before the command exits:\n *\n * - After `auth login`: BaseCommand.init fired the guarded refresh BEFORE\n * credentials existed and got a 401; we need to retry post-login.\n * - After `hooks install` / `service install`: belt-and-suspenders so the\n * first Claude Code session after install has a populated cache, even\n * if BaseCommand's earlier refresh hit a transient error.\n *\n * Marks `attempted = true` after running so a redundant `maybeRefreshActiveOrg`\n * call later in the same process is a no-op.\n */\nexport async function bootstrapActiveOrg(): Promise<void> {\n attempted = true;\n await syncActiveOrgFromServer();\n}\n\n/**\n * Test hook \u2014 reset the once-per-process guard so each test can exercise\n * the refresh logic.\n */\nexport function _resetRefreshAttempt(): void {\n attempted = false;\n}\n"],
5
- "mappings": ";;;;;;;;;;;AA0BA,IAAI,YAAY;AA6BhB,eAAe,0BAAyC;AAGtD,MAAI,QAAQ,IAAI,kBAAmB;AAEnC,QAAM,SAAS,cAAc;AAG7B,MAAI,UAAU,CAAC,QAAQ,MAAM,EAAG;AAEhC,MAAI;AACF,UAAM,UAAU,MAAM,OAAwB,cAAc;AAE5D,QAAI,CAAC,QAAQ,aAAa;AAExB,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,gBAAgB,OAAO,OAAO;AAElD,qBAAe;AAAA,QACb,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,UAAU,KAAK,IAAI;AAAA,MACrB,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,MAAM,OAAsB,WAAW;AACpD,UAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,WAAW;AAC3D,mBAAe;AAAA,MACb,OAAO,QAAQ;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,UAAU,KAAK,IAAI;AAAA,IACrB,CAAC;AAAA,EACH,QAAQ;AAAA,EAGR;AACF;AAEA,eAAsB,wBAAuC;AAC3D,MAAI,UAAW;AACf,cAAY;AACZ,QAAM,wBAAwB;AAChC;AAgBA,eAAsB,qBAAoC;AACxD,cAAY;AACZ,QAAM,wBAAwB;AAChC;AAMO,SAAS,uBAA6B;AAC3C,cAAY;AACd;",
6
- "names": []
7
- }
@@ -1,81 +0,0 @@
1
- import {
2
- getCursorUserSettingsPath,
3
- getVSCodeUserSettingsPath
4
- } from "./chunk-LXKPNATC.js";
5
-
6
- // src/lib/editor-proxy-pins.ts
7
- import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
8
- import { homedir } from "node:os";
9
- import { join } from "node:path";
10
- function defaultEditorPinPaths() {
11
- return {
12
- vscode: getVSCodeUserSettingsPath(),
13
- cursor: getCursorUserSettingsPath(),
14
- marker: join(homedir(), ".config", "rulemetric", "editor-proxy-unpinned.json")
15
- };
16
- }
17
- function isOurProxyValue(value, gatewayPort) {
18
- return value === `http://localhost:${gatewayPort}` || value === `http://127.0.0.1:${gatewayPort}`;
19
- }
20
- function readSettings(path) {
21
- if (!existsSync(path)) return null;
22
- try {
23
- return JSON.parse(readFileSync(path, "utf-8"));
24
- } catch {
25
- return null;
26
- }
27
- }
28
- function unpinEditorProxies(gatewayPort, paths = defaultEditorPinPaths()) {
29
- const unpinned = [];
30
- for (const editor of ["vscode", "cursor"]) {
31
- const path = paths[editor];
32
- const settings = readSettings(path);
33
- if (!settings || !isOurProxyValue(settings["http.proxy"], gatewayPort)) continue;
34
- delete settings["http.proxy"];
35
- if (settings["http.proxyStrictSSL"] === false) {
36
- delete settings["http.proxyStrictSSL"];
37
- }
38
- try {
39
- writeFileSync(path, JSON.stringify(settings, null, 2) + "\n");
40
- unpinned.push(editor);
41
- } catch {
42
- }
43
- }
44
- if (unpinned.length > 0) {
45
- const prior = readSettings(paths.marker);
46
- const editors = [.../* @__PURE__ */ new Set([...prior?.editors ?? [], ...unpinned])];
47
- try {
48
- writeFileSync(
49
- paths.marker,
50
- JSON.stringify({ editors, gatewayPort, unpinnedAt: (/* @__PURE__ */ new Date()).toISOString() }, null, 2) + "\n"
51
- );
52
- } catch {
53
- }
54
- }
55
- return unpinned;
56
- }
57
- function repinEditorProxies(writePin, paths = defaultEditorPinPaths()) {
58
- const marker = readSettings(paths.marker);
59
- if (!marker || !Array.isArray(marker.editors)) return [];
60
- const repinned = [];
61
- for (const editor of marker.editors) {
62
- if (editor !== "vscode" && editor !== "cursor") continue;
63
- try {
64
- writePin(editor);
65
- repinned.push(editor);
66
- } catch {
67
- }
68
- }
69
- try {
70
- unlinkSync(paths.marker);
71
- } catch {
72
- }
73
- return repinned;
74
- }
75
-
76
- export {
77
- defaultEditorPinPaths,
78
- unpinEditorProxies,
79
- repinEditorProxies
80
- };
81
- //# sourceMappingURL=chunk-3S7223UR.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/editor-proxy-pins.ts"],
4
- "sourcesContent": ["import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { getVSCodeUserSettingsPath, getCursorUserSettingsPath } from './hooks-config.js';\n\n/**\n * Editor proxy pin lifecycle for a DEAD/unownable gateway.\n *\n * `hooks install` pins `http.proxy` (+ `http.proxyStrictSSL: false`) into\n * VS Code and Cursor USER-level settings so Copilot/Cursor traffic routes\n * through the capture gateway. Those pins outlive the gateway: after a crash\n * that can't self-heal \u2014 most importantly a FOREIGN process owning :8787 \u2014\n * the editors keep routing HTTP at a port we don't control, with strictSSL\n * off. `gateway ensure` (run on every session start) calls `unpin` in that\n * state and `repin` once the gateway is verifiably ours again.\n *\n * Ownership predicate is strict: `http.proxy` is only ever removed when it\n * points at OUR gateway port on localhost \u2014 a user-owned corporate proxy is\n * never touched (same discipline as removeRulemetricProxyEnv). What was\n * unpinned is recorded in a marker file so repin restores exactly that set,\n * and never manufactures a pin the user removed themselves.\n */\n\nexport interface EditorPinPaths {\n vscode: string;\n cursor: string;\n marker: string;\n}\n\nexport function defaultEditorPinPaths(): EditorPinPaths {\n return {\n vscode: getVSCodeUserSettingsPath(),\n cursor: getCursorUserSettingsPath(),\n marker: join(homedir(), '.config', 'rulemetric', 'editor-proxy-unpinned.json'),\n };\n}\n\nfunction isOurProxyValue(value: unknown, gatewayPort: number): boolean {\n return (\n value === `http://localhost:${gatewayPort}` ||\n value === `http://127.0.0.1:${gatewayPort}`\n );\n}\n\nfunction readSettings(path: string): Record<string, unknown> | null {\n if (!existsSync(path)) return null;\n try {\n return JSON.parse(readFileSync(path, 'utf-8')) as Record<string, unknown>;\n } catch {\n return null; // JSONC/corrupt \u2014 never risk clobbering a user's editor config\n }\n}\n\n/**\n * Remove our gateway pin from each editor's user settings. Returns the list\n * of editors actually unpinned and records them in the marker (merging with\n * a prior marker so repeated unpins don't lose state).\n */\nexport function unpinEditorProxies(\n gatewayPort: number,\n paths: EditorPinPaths = defaultEditorPinPaths(),\n): Array<'vscode' | 'cursor'> {\n const unpinned: Array<'vscode' | 'cursor'> = [];\n for (const editor of ['vscode', 'cursor'] as const) {\n const path = paths[editor];\n const settings = readSettings(path);\n if (!settings || !isOurProxyValue(settings['http.proxy'], gatewayPort)) continue;\n delete settings['http.proxy'];\n // strictSSL rides along with our pin; only strip it when the pin was ours\n // (checked above) AND it holds the value we wrote.\n if (settings['http.proxyStrictSSL'] === false) {\n delete settings['http.proxyStrictSSL'];\n }\n try {\n writeFileSync(path, JSON.stringify(settings, null, 2) + '\\n');\n unpinned.push(editor);\n } catch {\n /* editor settings not writable \u2014 leave as-is */\n }\n }\n if (unpinned.length > 0) {\n const prior = readSettings(paths.marker) as { editors?: string[] } | null;\n const editors = [...new Set([...(prior?.editors ?? []), ...unpinned])];\n try {\n writeFileSync(\n paths.marker,\n JSON.stringify({ editors, gatewayPort, unpinnedAt: new Date().toISOString() }, null, 2) + '\\n',\n );\n } catch {\n /* marker write failure only costs a future auto-repin */\n }\n }\n return unpinned;\n}\n\n/**\n * Restore pins for exactly the editors a previous unpin removed (per the\n * marker), then clear the marker. `writePin` is injected by the caller\n * (writeVSCodeUserProxyConfig / writeCursorUserProxyConfig) \u2014 those writers\n * already refuse to overwrite a user-owned non-localhost proxy.\n */\nexport function repinEditorProxies(\n writePin: (editor: 'vscode' | 'cursor') => void,\n paths: EditorPinPaths = defaultEditorPinPaths(),\n): Array<'vscode' | 'cursor'> {\n const marker = readSettings(paths.marker) as { editors?: unknown } | null;\n if (!marker || !Array.isArray(marker.editors)) return [];\n const repinned: Array<'vscode' | 'cursor'> = [];\n for (const editor of marker.editors) {\n if (editor !== 'vscode' && editor !== 'cursor') continue;\n try {\n writePin(editor);\n repinned.push(editor);\n } catch {\n /* best-effort \u2014 a failed repin keeps the marker below */\n }\n }\n try {\n unlinkSync(paths.marker);\n } catch {\n /* already gone */\n }\n return repinned;\n}\n"],
5
- "mappings": ";;;;;;AAAA,SAAS,YAAY,cAAc,YAAY,qBAAqB;AACpE,SAAS,eAAe;AACxB,SAAS,YAAY;AA2Bd,SAAS,wBAAwC;AACtD,SAAO;AAAA,IACL,QAAQ,0BAA0B;AAAA,IAClC,QAAQ,0BAA0B;AAAA,IAClC,QAAQ,KAAK,QAAQ,GAAG,WAAW,cAAc,4BAA4B;AAAA,EAC/E;AACF;AAEA,SAAS,gBAAgB,OAAgB,aAA8B;AACrE,SACE,UAAU,oBAAoB,WAAW,MACzC,UAAU,oBAAoB,WAAW;AAE7C;AAEA,SAAS,aAAa,MAA8C;AAClE,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,MAAM,OAAO,CAAC;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,mBACd,aACA,QAAwB,sBAAsB,GAClB;AAC5B,QAAM,WAAuC,CAAC;AAC9C,aAAW,UAAU,CAAC,UAAU,QAAQ,GAAY;AAClD,UAAM,OAAO,MAAM,MAAM;AACzB,UAAM,WAAW,aAAa,IAAI;AAClC,QAAI,CAAC,YAAY,CAAC,gBAAgB,SAAS,YAAY,GAAG,WAAW,EAAG;AACxE,WAAO,SAAS,YAAY;AAG5B,QAAI,SAAS,qBAAqB,MAAM,OAAO;AAC7C,aAAO,SAAS,qBAAqB;AAAA,IACvC;AACA,QAAI;AACF,oBAAc,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,IAAI;AAC5D,eAAS,KAAK,MAAM;AAAA,IACtB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,QAAQ,aAAa,MAAM,MAAM;AACvC,UAAM,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,OAAO,WAAW,CAAC,GAAI,GAAG,QAAQ,CAAC,CAAC;AACrE,QAAI;AACF;AAAA,QACE,MAAM;AAAA,QACN,KAAK,UAAU,EAAE,SAAS,aAAa,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,GAAG,MAAM,CAAC,IAAI;AAAA,MAC5F;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,mBACd,UACA,QAAwB,sBAAsB,GAClB;AAC5B,QAAM,SAAS,aAAa,MAAM,MAAM;AACxC,MAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,OAAO,OAAO,EAAG,QAAO,CAAC;AACvD,QAAM,WAAuC,CAAC;AAC9C,aAAW,UAAU,OAAO,SAAS;AACnC,QAAI,WAAW,YAAY,WAAW,SAAU;AAChD,QAAI;AACF,eAAS,MAAM;AACf,eAAS,KAAK,MAAM;AAAA,IACtB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI;AACF,eAAW,MAAM,MAAM;AAAA,EACzB,QAAQ;AAAA,EAER;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,96 +0,0 @@
1
- import {
2
- executeEval
3
- } from "./chunk-QN34TGD3.js";
4
-
5
- // src/lib/eval-analyzer.ts
6
- var ANALYZER_SYSTEM_PROMPT = `You are an expert at improving AI coding instructions, skills, and prompts. You receive eval results showing how well the current content performs, and your job is to propose specific improvements.
7
-
8
- You will receive:
9
- 1. The current content of the eval target
10
- 2. Eval results: for each eval, the prompt, expectations, pass/fail results, and grader feedback
11
- 3. The pass rate and areas of weakness
12
-
13
- Analyze the failures and propose concrete edits to improve the content. Focus on:
14
- - Expectations that consistently fail \u2014 what's missing from the content?
15
- - Grader feedback suggesting new assertions \u2014 what outcomes aren't being tested?
16
- - Patterns across failures \u2014 is there a systemic gap?
17
-
18
- Your proposed content should be a complete replacement, not a diff. Keep what works, fix what doesn't.
19
-
20
- You MUST respond with ONLY a valid JSON object:
21
-
22
- {
23
- "suggestions": [
24
- {
25
- "section": "which part of the content",
26
- "current": "brief quote of current text",
27
- "proposed": "what it should say instead",
28
- "reasoning": "why this change helps"
29
- }
30
- ],
31
- "overallAssessment": "brief summary of what's working and what's not",
32
- "proposedContent": "the full improved content"
33
- }`;
34
- async function analyzeEvalResults(options) {
35
- const { content, evalResults, model, timeout = 12e4, userFeedback } = options;
36
- const resultsText = evalResults.map((r) => {
37
- const grading = r.grading;
38
- const expectations = grading?.expectations ?? [];
39
- const passRate = grading?.summary?.pass_rate ?? "N/A";
40
- const feedback = grading?.eval_feedback?.overall ?? "";
41
- return `## Eval: ${r.evalName}
42
- Prompt: ${r.prompt}
43
- Pass rate: ${typeof passRate === "number" ? (passRate * 100).toFixed(0) + "%" : passRate}
44
-
45
- Expectations:
46
- ${expectations.map((e) => ` ${e.passed ? "PASS" : "FAIL"} \u2014 ${e.text}: ${e.evidence}`).join("\n")}
47
-
48
- Feedback: ${feedback}`;
49
- }).join("\n\n---\n\n");
50
- const feedbackSection = userFeedback ? `
51
-
52
- ## User Feedback
53
-
54
- ${userFeedback}` : "\n\n## User Feedback\n\nNo specific feedback provided.";
55
- const analyzerPrompt = `## Current Content
56
-
57
- ${content}
58
-
59
- ## Eval Results
60
-
61
- ${resultsText}${feedbackSection}
62
-
63
- Analyze the results and propose improvements. Respond with ONLY valid JSON.`;
64
- const result = await executeEval({
65
- prompt: analyzerPrompt,
66
- targetContent: ANALYZER_SYSTEM_PROMPT,
67
- timeout,
68
- model
69
- });
70
- if (result.error) {
71
- return {
72
- suggestions: [],
73
- overallAssessment: `Analysis failed: ${result.error}`,
74
- proposedContent: content
75
- };
76
- }
77
- try {
78
- let jsonStr = result.output.trim();
79
- const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
80
- if (jsonMatch) jsonStr = jsonMatch[1].trim();
81
- const objMatch = jsonStr.match(/\{[\s\S]*\}/);
82
- if (objMatch) jsonStr = objMatch[0];
83
- return JSON.parse(jsonStr);
84
- } catch {
85
- return {
86
- suggestions: [],
87
- overallAssessment: `Analysis returned unparseable output: ${result.output.slice(0, 200)}`,
88
- proposedContent: content
89
- };
90
- }
91
- }
92
-
93
- export {
94
- analyzeEvalResults
95
- };
96
- //# sourceMappingURL=chunk-3TIMQ3O6.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/eval-analyzer.ts"],
4
- "sourcesContent": ["import { executeEval } from './eval-executor.js';\n\nexport interface AnalysisResult {\n suggestions: Array<{\n section: string;\n current: string;\n proposed: string;\n reasoning: string;\n }>;\n overallAssessment: string;\n proposedContent: string;\n}\n\nconst ANALYZER_SYSTEM_PROMPT = `You are an expert at improving AI coding instructions, skills, and prompts. You receive eval results showing how well the current content performs, and your job is to propose specific improvements.\n\nYou will receive:\n1. The current content of the eval target\n2. Eval results: for each eval, the prompt, expectations, pass/fail results, and grader feedback\n3. The pass rate and areas of weakness\n\nAnalyze the failures and propose concrete edits to improve the content. Focus on:\n- Expectations that consistently fail \u2014 what's missing from the content?\n- Grader feedback suggesting new assertions \u2014 what outcomes aren't being tested?\n- Patterns across failures \u2014 is there a systemic gap?\n\nYour proposed content should be a complete replacement, not a diff. Keep what works, fix what doesn't.\n\nYou MUST respond with ONLY a valid JSON object:\n\n{\n \"suggestions\": [\n {\n \"section\": \"which part of the content\",\n \"current\": \"brief quote of current text\",\n \"proposed\": \"what it should say instead\",\n \"reasoning\": \"why this change helps\"\n }\n ],\n \"overallAssessment\": \"brief summary of what's working and what's not\",\n \"proposedContent\": \"the full improved content\"\n}`;\n\nexport async function analyzeEvalResults(options: {\n content: string;\n evalResults: Array<{\n evalName: string;\n prompt: string;\n expectations: string[];\n grading: Record<string, unknown>;\n }>;\n model?: string;\n timeout?: number;\n userFeedback?: string;\n}): Promise<AnalysisResult> {\n const { content, evalResults, model, timeout = 120_000, userFeedback } = options;\n\n const resultsText = evalResults.map((r) => {\n const grading = r.grading as any;\n const expectations = grading?.expectations ?? [];\n const passRate = grading?.summary?.pass_rate ?? 'N/A';\n const feedback = grading?.eval_feedback?.overall ?? '';\n\n return `## Eval: ${r.evalName}\nPrompt: ${r.prompt}\nPass rate: ${typeof passRate === 'number' ? (passRate * 100).toFixed(0) + '%' : passRate}\n\nExpectations:\n${expectations.map((e: any) => ` ${e.passed ? 'PASS' : 'FAIL'} \u2014 ${e.text}: ${e.evidence}`).join('\\n')}\n\nFeedback: ${feedback}`;\n }).join('\\n\\n---\\n\\n');\n\n const feedbackSection = userFeedback\n ? `\\n\\n## User Feedback\\n\\n${userFeedback}`\n : '\\n\\n## User Feedback\\n\\nNo specific feedback provided.';\n\n const analyzerPrompt = `## Current Content\n\n${content}\n\n## Eval Results\n\n${resultsText}${feedbackSection}\n\nAnalyze the results and propose improvements. Respond with ONLY valid JSON.`;\n\n const result = await executeEval({\n prompt: analyzerPrompt,\n targetContent: ANALYZER_SYSTEM_PROMPT,\n timeout,\n model,\n });\n\n if (result.error) {\n return {\n suggestions: [],\n overallAssessment: `Analysis failed: ${result.error}`,\n proposedContent: content,\n };\n }\n\n try {\n let jsonStr = result.output.trim();\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) jsonStr = jsonMatch[1].trim();\n const objMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n if (objMatch) jsonStr = objMatch[0];\n\n return JSON.parse(jsonStr) as AnalysisResult;\n } catch {\n return {\n suggestions: [],\n overallAssessment: `Analysis returned unparseable output: ${result.output.slice(0, 200)}`,\n proposedContent: content,\n };\n }\n}\n"],
5
- "mappings": ";;;;;AAaA,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6B/B,eAAsB,mBAAmB,SAWb;AAC1B,QAAM,EAAE,SAAS,aAAa,OAAO,UAAU,MAAS,aAAa,IAAI;AAEzE,QAAM,cAAc,YAAY,IAAI,CAAC,MAAM;AACzC,UAAM,UAAU,EAAE;AAClB,UAAM,eAAe,SAAS,gBAAgB,CAAC;AAC/C,UAAM,WAAW,SAAS,SAAS,aAAa;AAChD,UAAM,WAAW,SAAS,eAAe,WAAW;AAEpD,WAAO,YAAY,EAAE,QAAQ;AAAA,UACvB,EAAE,MAAM;AAAA,aACL,OAAO,aAAa,YAAY,WAAW,KAAK,QAAQ,CAAC,IAAI,MAAM,QAAQ;AAAA;AAAA;AAAA,EAGtF,aAAa,IAAI,CAAC,MAAW,KAAK,EAAE,SAAS,SAAS,MAAM,WAAM,EAAE,IAAI,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,YAE3F,QAAQ;AAAA,EAClB,CAAC,EAAE,KAAK,aAAa;AAErB,QAAM,kBAAkB,eACpB;AAAA;AAAA;AAAA;AAAA,EAA2B,YAAY,KACvC;AAEJ,QAAM,iBAAiB;AAAA;AAAA,EAEvB,OAAO;AAAA;AAAA;AAAA;AAAA,EAIP,WAAW,GAAG,eAAe;AAAA;AAAA;AAI7B,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,OAAO,OAAO;AAChB,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,mBAAmB,oBAAoB,OAAO,KAAK;AAAA,MACnD,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI;AACF,QAAI,UAAU,OAAO,OAAO,KAAK;AACjC,UAAM,YAAY,QAAQ,MAAM,8BAA8B;AAC9D,QAAI,UAAW,WAAU,UAAU,CAAC,EAAE,KAAK;AAC3C,UAAM,WAAW,QAAQ,MAAM,aAAa;AAC5C,QAAI,SAAU,WAAU,SAAS,CAAC;AAElC,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,MACL,aAAa,CAAC;AAAA,MACd,mBAAmB,yCAAyC,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,MACvF,iBAAiB;AAAA,IACnB;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,32 +0,0 @@
1
- // src/lib/which.ts
2
- import { existsSync } from "node:fs";
3
- import { homedir } from "node:os";
4
- import { join, delimiter } from "node:path";
5
- function wellKnownBinDirs(platform, home) {
6
- if (platform === "darwin") {
7
- return ["/opt/homebrew/bin", "/opt/homebrew/sbin", "/usr/local/bin", join(home, ".local/bin")];
8
- }
9
- if (platform === "linux") {
10
- return ["/usr/local/bin", "/usr/bin", join(home, ".local/bin")];
11
- }
12
- return [];
13
- }
14
- function findBinary(name, opts = {}) {
15
- const platform = opts.platform ?? process.platform;
16
- const home = opts.home ?? homedir();
17
- const pathDirs = (opts.pathEnv ?? process.env.PATH ?? "").split(delimiter).filter(Boolean);
18
- const dirs = [.../* @__PURE__ */ new Set([...pathDirs, ...wellKnownBinDirs(platform, home)])];
19
- const exts = platform === "win32" ? ["", ...(process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)] : [""];
20
- for (const dir of dirs) {
21
- for (const ext of exts) {
22
- const candidate = join(dir, name + ext);
23
- if (existsSync(candidate)) return candidate;
24
- }
25
- }
26
- return null;
27
- }
28
-
29
- export {
30
- findBinary
31
- };
32
- //# sourceMappingURL=chunk-42GFSAJP.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/which.ts"],
4
- "sourcesContent": ["import { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, delimiter } from 'node:path';\n\ninterface FindBinaryOptions {\n /** Override the platform (defaults to process.platform). Used in tests. */\n platform?: NodeJS.Platform;\n /** Override $PATH (defaults to process.env.PATH). Used in tests. */\n pathEnv?: string;\n /** Override the home dir (for the well-known-dir fallback). Used in tests. */\n home?: string;\n}\n\n/**\n * Standard install locations to probe IN ADDITION to $PATH \u2014 GUI/agent-launched\n * processes (and Claude Code's minimal-PATH hook shells) often omit these, so a\n * brew/pipx/mitmdump that's plainly installed reads as \"not found\". This is the\n * same minimal-PATH class as the hook-command PATH prefixing (PR #111); here it\n * makes mitmproxy auto-install actually fire on a Mac with Homebrew. Real $PATH\n * entries are searched first, so this only ever ADDS reach, never overrides.\n */\nfunction wellKnownBinDirs(platform: NodeJS.Platform, home: string): string[] {\n if (platform === 'darwin') {\n return ['/opt/homebrew/bin', '/opt/homebrew/sbin', '/usr/local/bin', join(home, '.local/bin')];\n }\n if (platform === 'linux') {\n return ['/usr/local/bin', '/usr/bin', join(home, '.local/bin')];\n }\n return [];\n}\n\n/**\n * Cross-platform executable lookup \u2014 the portable replacement for `which`/`where`.\n *\n * Scans the directories on `$PATH` for an executable named `name`, returning the\n * first full path that exists or `null`. On Windows it also probes the\n * `PATHEXT` extensions (`.EXE`, `.CMD`, ...) so `findBinary('mitmdump')` resolves\n * `mitmdump.exe`. Pure filesystem reads \u2014 no subprocess \u2014 so it works identically\n * on macOS, Linux, and Windows (the old `execSync('which \u2026')` path threw on\n * Windows, which has no `which`, silently breaking mitmproxy detection there).\n */\nexport function findBinary(name: string, opts: FindBinaryOptions = {}): string | null {\n const platform = opts.platform ?? process.platform;\n const home = opts.home ?? homedir();\n const pathDirs = (opts.pathEnv ?? process.env.PATH ?? '').split(delimiter).filter(Boolean);\n // $PATH first (a real entry wins), then the well-known install dirs \u2014 deduped.\n const dirs = [...new Set([...pathDirs, ...wellKnownBinDirs(platform, home)])];\n\n // On Windows, try the bare name first (in case it already carries an extension),\n // then each PATHEXT suffix. Elsewhere, only the bare name is meaningful.\n const exts =\n platform === 'win32'\n ? ['', ...(process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM').split(';').filter(Boolean)]\n : [''];\n\n for (const dir of dirs) {\n for (const ext of exts) {\n const candidate = join(dir, name + ext);\n if (existsSync(candidate)) return candidate;\n }\n }\n return null;\n}\n"],
5
- "mappings": ";AAAA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,MAAM,iBAAiB;AAmBhC,SAAS,iBAAiB,UAA2B,MAAwB;AAC3E,MAAI,aAAa,UAAU;AACzB,WAAO,CAAC,qBAAqB,sBAAsB,kBAAkB,KAAK,MAAM,YAAY,CAAC;AAAA,EAC/F;AACA,MAAI,aAAa,SAAS;AACxB,WAAO,CAAC,kBAAkB,YAAY,KAAK,MAAM,YAAY,CAAC;AAAA,EAChE;AACA,SAAO,CAAC;AACV;AAYO,SAAS,WAAW,MAAc,OAA0B,CAAC,GAAkB;AACpF,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,QAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,QAAM,YAAY,KAAK,WAAW,QAAQ,IAAI,QAAQ,IAAI,MAAM,SAAS,EAAE,OAAO,OAAO;AAEzF,QAAM,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,iBAAiB,UAAU,IAAI,CAAC,CAAC,CAAC;AAI5E,QAAM,OACJ,aAAa,UACT,CAAC,IAAI,IAAI,QAAQ,IAAI,WAAW,uBAAuB,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC,IACjF,CAAC,EAAE;AAET,aAAW,OAAO,MAAM;AACtB,eAAW,OAAO,MAAM;AACtB,YAAM,YAAY,KAAK,KAAK,OAAO,GAAG;AACtC,UAAI,WAAW,SAAS,EAAG,QAAO;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,48 +0,0 @@
1
- import {
2
- __require
3
- } from "./chunk-NSBPE2FW.js";
4
-
5
- // src/lib/skills-loader.ts
6
- import * as fs from "node:fs";
7
- import * as path from "node:path";
8
- import * as os from "node:os";
9
- import { SkillCatalog } from "@rulemetric/skills-registry";
10
- var CACHE_PATH = path.join(os.homedir(), ".config", "rulemetric", "skills-registry.json");
11
- function findBundledRegistry() {
12
- try {
13
- const pkgDir = path.dirname(__require.resolve("@rulemetric/skills-registry/package.json"));
14
- const bundled = path.join(pkgDir, "registry.json");
15
- if (fs.existsSync(bundled)) return bundled;
16
- } catch {
17
- const monorepo = path.resolve(process.cwd(), "packages", "skills-registry", "registry.json");
18
- if (fs.existsSync(monorepo)) return monorepo;
19
- }
20
- return null;
21
- }
22
- async function loadRegistry(ctx) {
23
- const catalog = new SkillCatalog();
24
- if (fs.existsSync(CACHE_PATH)) {
25
- try {
26
- const data = JSON.parse(fs.readFileSync(CACHE_PATH, "utf-8"));
27
- catalog.load(data);
28
- return catalog;
29
- } catch {
30
- }
31
- }
32
- const bundled = findBundledRegistry();
33
- if (bundled) {
34
- try {
35
- const data = JSON.parse(fs.readFileSync(bundled, "utf-8"));
36
- catalog.load(data);
37
- return catalog;
38
- } catch {
39
- }
40
- }
41
- ctx.log("No local registry found. Run: rulemetric skills update");
42
- return catalog;
43
- }
44
-
45
- export {
46
- loadRegistry
47
- };
48
- //# sourceMappingURL=chunk-4BHDHHKL.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/skills-loader.ts"],
4
- "sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { SkillCatalog } from '@rulemetric/skills-registry';\nimport type { SkillRegistry } from '@rulemetric/skills-registry';\n\nconst CACHE_PATH = path.join(os.homedir(), '.config', 'rulemetric', 'skills-registry.json');\n\n// Also check for a bundled registry.json next to the skills-registry package\nfunction findBundledRegistry(): string | null {\n try {\n const pkgDir = path.dirname(require.resolve('@rulemetric/skills-registry/package.json'));\n const bundled = path.join(pkgDir, 'registry.json');\n if (fs.existsSync(bundled)) return bundled;\n } catch {\n // resolve can fail in ESM, try a known relative path\n const monorepo = path.resolve(process.cwd(), 'packages', 'skills-registry', 'registry.json');\n if (fs.existsSync(monorepo)) return monorepo;\n }\n return null;\n}\n\n/** Load the skills registry, preferring local cache > bundled > empty. */\nexport async function loadRegistry(ctx: { log: (msg: string) => void }): Promise<SkillCatalog> {\n const catalog = new SkillCatalog();\n\n // Try cached registry first (from `skills update`)\n if (fs.existsSync(CACHE_PATH)) {\n try {\n const data = JSON.parse(fs.readFileSync(CACHE_PATH, 'utf-8')) as SkillRegistry;\n catalog.load(data);\n return catalog;\n } catch {\n // Corrupted cache \u2014 fall through\n }\n }\n\n // Try bundled registry\n const bundled = findBundledRegistry();\n if (bundled) {\n try {\n const data = JSON.parse(fs.readFileSync(bundled, 'utf-8')) as SkillRegistry;\n catalog.load(data);\n return catalog;\n } catch {\n // Fall through\n }\n }\n\n ctx.log('No local registry found. Run: rulemetric skills update');\n return catalog;\n}\n"],
5
- "mappings": ";;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,oBAAoB;AAG7B,IAAM,aAAkB,UAAQ,WAAQ,GAAG,WAAW,cAAc,sBAAsB;AAG1F,SAAS,sBAAqC;AAC5C,MAAI;AACF,UAAM,SAAc,aAAQ,UAAQ,QAAQ,0CAA0C,CAAC;AACvF,UAAM,UAAe,UAAK,QAAQ,eAAe;AACjD,QAAO,cAAW,OAAO,EAAG,QAAO;AAAA,EACrC,QAAQ;AAEN,UAAM,WAAgB,aAAQ,QAAQ,IAAI,GAAG,YAAY,mBAAmB,eAAe;AAC3F,QAAO,cAAW,QAAQ,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAGA,eAAsB,aAAa,KAA4D;AAC7F,QAAM,UAAU,IAAI,aAAa;AAGjC,MAAO,cAAW,UAAU,GAAG;AAC7B,QAAI;AACF,YAAM,OAAO,KAAK,MAAS,gBAAa,YAAY,OAAO,CAAC;AAC5D,cAAQ,KAAK,IAAI;AACjB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,UAAU,oBAAoB;AACpC,MAAI,SAAS;AACX,QAAI;AACF,YAAM,OAAO,KAAK,MAAS,gBAAa,SAAS,OAAO,CAAC;AACzD,cAAQ,KAAK,IAAI;AACjB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,IAAI,wDAAwD;AAChE,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,99 +0,0 @@
1
- import {
2
- executeEval
3
- } from "./chunk-QN34TGD3.js";
4
-
5
- // src/lib/eval-trigger-tester.ts
6
- var TRIGGER_DETECTOR_PROMPT = `You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.
7
-
8
- You will receive:
9
- 1. The skill name and description
10
- 2. Key content from the skill (to know what it teaches)
11
- 3. The user's query
12
- 4. The AI's response
13
-
14
- Determine if the response shows clear signs of the skill being used:
15
- - Does the response follow patterns/approaches described in the skill?
16
- - Does it use terminology or structures specific to the skill?
17
- - Would the response be noticeably different without the skill?
18
-
19
- Respond with ONLY a valid JSON object:
20
-
21
- {
22
- "triggered": true,
23
- "confidence": 0.85,
24
- "evidence": "The response follows the X pattern described in the skill..."
25
- }`;
26
- async function testTrigger(options) {
27
- const { query, shouldTrigger, skillName, skillDescription, skillContent, model, timeout = 12e4 } = options;
28
- const execResult = await executeEval({
29
- prompt: query,
30
- targetContent: skillContent,
31
- timeout,
32
- model
33
- });
34
- if (execResult.error) {
35
- return {
36
- query,
37
- shouldTrigger,
38
- didTrigger: false,
39
- correct: !shouldTrigger,
40
- confidence: 0,
41
- evidence: `Execution failed: ${execResult.error}`
42
- };
43
- }
44
- const detectorPrompt = `## Skill
45
- Name: ${skillName}
46
- Description: ${skillDescription}
47
-
48
- ## Key Skill Content (first 500 chars)
49
- ${skillContent.slice(0, 500)}
50
-
51
- ## User Query
52
- ${query}
53
-
54
- ## AI Response
55
- ${execResult.output}
56
-
57
- Did the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`;
58
- const detectorResult = await executeEval({
59
- prompt: detectorPrompt,
60
- targetContent: TRIGGER_DETECTOR_PROMPT,
61
- timeout: 6e4,
62
- model
63
- });
64
- let didTrigger = false;
65
- let confidence = 0;
66
- let evidence = "";
67
- try {
68
- let jsonStr = detectorResult.output.trim();
69
- const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
70
- if (jsonMatch) jsonStr = jsonMatch[1].trim();
71
- const objMatch = jsonStr.match(/\{[\s\S]*\}/);
72
- if (objMatch) jsonStr = objMatch[0];
73
- const parsed = JSON.parse(jsonStr);
74
- didTrigger = parsed.triggered === true;
75
- confidence = parsed.confidence ?? 0;
76
- evidence = parsed.evidence ?? "";
77
- } catch {
78
- evidence = `Detector returned unparseable output: ${detectorResult.output.slice(0, 200)}`;
79
- }
80
- return {
81
- query,
82
- shouldTrigger,
83
- didTrigger,
84
- correct: didTrigger === shouldTrigger,
85
- confidence,
86
- evidence
87
- };
88
- }
89
- function computeTriggerScore(results) {
90
- if (results.length === 0) return 0;
91
- const correct = results.filter((r) => r.correct).length;
92
- return correct / results.length;
93
- }
94
-
95
- export {
96
- testTrigger,
97
- computeTriggerScore
98
- };
99
- //# sourceMappingURL=chunk-4D537GXE.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/eval-trigger-tester.ts"],
4
- "sourcesContent": ["import { executeEval } from './eval-executor.js';\n\nexport interface TriggerTestResult {\n query: string;\n shouldTrigger: boolean;\n didTrigger: boolean;\n correct: boolean;\n confidence: number;\n evidence: string;\n}\n\nconst TRIGGER_DETECTOR_PROMPT = `You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.\n\nYou will receive:\n1. The skill name and description\n2. Key content from the skill (to know what it teaches)\n3. The user's query\n4. The AI's response\n\nDetermine if the response shows clear signs of the skill being used:\n- Does the response follow patterns/approaches described in the skill?\n- Does it use terminology or structures specific to the skill?\n- Would the response be noticeably different without the skill?\n\nRespond with ONLY a valid JSON object:\n\n{\n \"triggered\": true,\n \"confidence\": 0.85,\n \"evidence\": \"The response follows the X pattern described in the skill...\"\n}`;\n\nexport async function testTrigger(options: {\n query: string;\n shouldTrigger: boolean;\n skillName: string;\n skillDescription: string;\n skillContent: string;\n model?: string;\n timeout?: number;\n}): Promise<TriggerTestResult> {\n const { query, shouldTrigger, skillName, skillDescription, skillContent, model, timeout = 120_000 } = options;\n\n // Run the query with the skill as system prompt\n const execResult = await executeEval({\n prompt: query,\n targetContent: skillContent,\n timeout,\n model,\n });\n\n if (execResult.error) {\n return {\n query,\n shouldTrigger,\n didTrigger: false,\n correct: !shouldTrigger,\n confidence: 0,\n evidence: `Execution failed: ${execResult.error}`,\n };\n }\n\n // Use LLM to detect if the skill influenced the response\n const detectorPrompt = `## Skill\nName: ${skillName}\nDescription: ${skillDescription}\n\n## Key Skill Content (first 500 chars)\n${skillContent.slice(0, 500)}\n\n## User Query\n${query}\n\n## AI Response\n${execResult.output}\n\nDid the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`;\n\n const detectorResult = await executeEval({\n prompt: detectorPrompt,\n targetContent: TRIGGER_DETECTOR_PROMPT,\n timeout: 60_000,\n model,\n });\n\n let didTrigger = false;\n let confidence = 0;\n let evidence = '';\n\n try {\n let jsonStr = detectorResult.output.trim();\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) jsonStr = jsonMatch[1].trim();\n const objMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n if (objMatch) jsonStr = objMatch[0];\n\n const parsed = JSON.parse(jsonStr);\n didTrigger = parsed.triggered === true;\n confidence = parsed.confidence ?? 0;\n evidence = parsed.evidence ?? '';\n } catch {\n evidence = `Detector returned unparseable output: ${detectorResult.output.slice(0, 200)}`;\n }\n\n return {\n query,\n shouldTrigger,\n didTrigger,\n correct: didTrigger === shouldTrigger,\n confidence,\n evidence,\n };\n}\n\nexport function computeTriggerScore(results: TriggerTestResult[]): number {\n if (results.length === 0) return 0;\n const correct = results.filter((r) => r.correct).length;\n return correct / results.length;\n}\n"],
5
- "mappings": ";;;;;AAWA,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBhC,eAAsB,YAAY,SAQH;AAC7B,QAAM,EAAE,OAAO,eAAe,WAAW,kBAAkB,cAAc,OAAO,UAAU,KAAQ,IAAI;AAGtG,QAAM,aAAa,MAAM,YAAY;AAAA,IACnC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,qBAAqB,WAAW,KAAK;AAAA,IACjD;AAAA,EACF;AAGA,QAAM,iBAAiB;AAAA,QACjB,SAAS;AAAA,eACF,gBAAgB;AAAA;AAAA;AAAA,EAG7B,aAAa,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAAA,EAG1B,KAAK;AAAA;AAAA;AAAA,EAGL,WAAW,MAAM;AAAA;AAAA;AAIjB,QAAM,iBAAiB,MAAM,YAAY;AAAA,IACvC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,WAAW;AAEf,MAAI;AACF,QAAI,UAAU,eAAe,OAAO,KAAK;AACzC,UAAM,YAAY,QAAQ,MAAM,8BAA8B;AAC9D,QAAI,UAAW,WAAU,UAAU,CAAC,EAAE,KAAK;AAC3C,UAAM,WAAW,QAAQ,MAAM,aAAa;AAC5C,QAAI,SAAU,WAAU,SAAS,CAAC;AAElC,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,iBAAa,OAAO,cAAc;AAClC,iBAAa,OAAO,cAAc;AAClC,eAAW,OAAO,YAAY;AAAA,EAChC,QAAQ;AACN,eAAW,yCAAyC,eAAe,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,EACzF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,eAAe;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,SAAsC;AACxE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,SAAO,UAAU,QAAQ;AAC3B;",
6
- "names": []
7
- }
@@ -1,139 +0,0 @@
1
- import {
2
- probeGatewayIdentity,
3
- waitForGatewayIdentity
4
- } from "./chunk-7LVVKQMZ.js";
5
- import {
6
- GATEWAY_ENTRY_COMMAND_PATTERN,
7
- isPidLiveAndMatching
8
- } from "./chunk-5EDMGK3W.js";
9
-
10
- // src/lib/gateway-lifecycle.ts
11
- import { spawn } from "node:child_process";
12
- import { createConnection } from "node:net";
13
- import { existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
14
- import { homedir } from "node:os";
15
- import { dirname, join, resolve } from "node:path";
16
- import { fileURLToPath } from "node:url";
17
- var MODULE_DIR = dirname(fileURLToPath(import.meta.url));
18
- var CONFIG_DIR = join(homedir(), ".config", "rulemetric");
19
- var GATEWAY_PID_FILE = join(CONFIG_DIR, "gateway.pid");
20
- var GATEWAY_LOG_FILE = join(CONFIG_DIR, "gateway.log");
21
- var GATEWAY_PORT = 8787;
22
- var MITMPROXY_PORT = 8788;
23
- function isGatewayListening(port = GATEWAY_PORT, timeoutMs = 1500) {
24
- return new Promise((resolveProbe) => {
25
- const socket = createConnection({ host: "127.0.0.1", port });
26
- const finish = (result) => {
27
- socket.destroy();
28
- resolveProbe(result);
29
- };
30
- socket.setTimeout(timeoutMs);
31
- socket.once("connect", () => finish(true));
32
- socket.once("timeout", () => finish(false));
33
- socket.once("error", () => finish(false));
34
- });
35
- }
36
- async function waitForGatewayListening(port = GATEWAY_PORT, { timeoutMs = 3e3, intervalMs = 150 } = {}) {
37
- const deadline = Date.now() + timeoutMs;
38
- for (; ; ) {
39
- if (await isGatewayListening(port, Math.min(1500, timeoutMs))) return true;
40
- if (Date.now() >= deadline) return false;
41
- await new Promise((resolve2) => setTimeout(resolve2, intervalMs));
42
- }
43
- }
44
- function isRulemetricGatewayListening(port = GATEWAY_PORT, timeoutMs = 1500) {
45
- return probeGatewayIdentity(port, timeoutMs);
46
- }
47
- function waitForRulemetricGateway(port = GATEWAY_PORT, opts = {}) {
48
- return waitForGatewayIdentity(port, opts);
49
- }
50
- function isGatewayRunning(pidOpts = {}) {
51
- const pid = getGatewayPid();
52
- if (pid === null) return false;
53
- return isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts);
54
- }
55
- function getGatewayPid() {
56
- if (!existsSync(GATEWAY_PID_FILE)) return null;
57
- const content = readFileSync(GATEWAY_PID_FILE, "utf-8").trim();
58
- const pid = parseInt(content, 10);
59
- return isNaN(pid) ? null : pid;
60
- }
61
- function findGatewayEntry() {
62
- const candidates = [
63
- resolve(MODULE_DIR, "./gateway-entry.js"),
64
- // sibling (unbundled)
65
- resolve(MODULE_DIR, "./lib/gateway-entry.js"),
66
- // bundled chunk at dist root
67
- resolve(MODULE_DIR, "../lib/gateway-entry.js"),
68
- // nested command dir → dist/lib
69
- resolve(MODULE_DIR, "../../lib/gateway-entry.js")
70
- ];
71
- for (const p of candidates) {
72
- if (existsSync(p)) return p;
73
- }
74
- throw new Error(
75
- "Could not find gateway-entry.js. Is the CLI built?\nSearched:\n" + candidates.map((c) => ` ${c}`).join("\n")
76
- );
77
- }
78
- function spawnGateway(cliVersion) {
79
- if (isGatewayRunning()) {
80
- const pid = getGatewayPid();
81
- if (pid) return pid;
82
- }
83
- mkdirSync(CONFIG_DIR, { recursive: true });
84
- const entryPath = findGatewayEntry();
85
- const logFd = openSync(GATEWAY_LOG_FILE, "a");
86
- const child = spawn(process.execPath, [entryPath], {
87
- detached: true,
88
- stdio: ["ignore", logFd, logFd],
89
- // The gateway inherits the spawning CLI's env. RULEMETRIC_CLI_VERSION
90
- // identifies the CLI version that started this gateway — used to
91
- // detect drift when a newer CLI starts mitmproxy with a different
92
- // version. RULEMETRIC_CLI_ENTRY is the path to the oclif entry point
93
- // (process.argv[1]) so the gateway can re-invoke the CLI for
94
- // `proxy restart` without needing the binary in PATH. Falls back to
95
- // "unknown" if the caller didn't pass them.
96
- env: {
97
- ...process.env,
98
- RULEMETRIC_CLI_VERSION: cliVersion ?? "unknown",
99
- RULEMETRIC_CLI_ENTRY: process.argv[1] ?? ""
100
- }
101
- });
102
- child.unref();
103
- if (!child.pid) {
104
- throw new Error("Failed to spawn gateway process");
105
- }
106
- writeFileSync(GATEWAY_PID_FILE, String(child.pid));
107
- return child.pid;
108
- }
109
- function stopGateway(pidOpts = {}) {
110
- const pid = getGatewayPid();
111
- if (pid === null) return false;
112
- if (isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts)) {
113
- try {
114
- process.kill(pid, "SIGTERM");
115
- } catch {
116
- }
117
- }
118
- try {
119
- unlinkSync(GATEWAY_PID_FILE);
120
- } catch {
121
- }
122
- return true;
123
- }
124
-
125
- export {
126
- GATEWAY_PID_FILE,
127
- GATEWAY_LOG_FILE,
128
- GATEWAY_PORT,
129
- MITMPROXY_PORT,
130
- isGatewayListening,
131
- waitForGatewayListening,
132
- isRulemetricGatewayListening,
133
- waitForRulemetricGateway,
134
- isGatewayRunning,
135
- getGatewayPid,
136
- spawnGateway,
137
- stopGateway
138
- };
139
- //# sourceMappingURL=chunk-4LYCDS2N.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/gateway-lifecycle.ts"],
4
- "sourcesContent": ["/**\n * Gateway process lifecycle helpers \u2014 spawn, stop, check status.\n * Used by hooks install/uninstall, session-start hook, and proxy status.\n */\nimport { spawn } from 'node:child_process';\nimport { createConnection } from 'node:net';\nimport { existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n probeGatewayIdentity,\n waitForGatewayIdentity,\n type GatewayIdentity,\n} from './gateway-identity.js';\nimport {\n isPidLiveAndMatching,\n GATEWAY_ENTRY_COMMAND_PATTERN,\n type PidIdentityOptions,\n} from './pid-identity.js';\n\n// `import.meta.dirname` only exists on Node >= 20.11 \u2014 on Node 18.x/\u226420.10 it is\n// `undefined`, and `resolve(undefined, \u2026)` throws, surfacing as a spurious\n// \"Could not find gateway-entry.js\" on fresh npm installs (the launchd gateway\n// masks it in dev). Derive the dir portably instead. See onboarding field report\n// 2026-07-07 F1.\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nconst CONFIG_DIR = join(homedir(), '.config', 'rulemetric');\nexport const GATEWAY_PID_FILE = join(CONFIG_DIR, 'gateway.pid');\nexport const GATEWAY_LOG_FILE = join(CONFIG_DIR, 'gateway.log');\nexport const GATEWAY_PORT = 8787;\nexport const MITMPROXY_PORT = 8788;\n\n/**\n * TCP liveness probe: does something actually ACCEPT a connection on the port?\n * Distinct from isGatewayRunning() (which only checks the PID is alive) \u2014 a\n * process can be \"running\" per its pidfile while :8787 accepts nothing. This is\n * the check that must gate writing HTTPS_PROXY: never pin Claude Code's proxy\n * at a port with nothing behind it (the fresh-laptop ConnectionRefused footgun).\n */\nexport function isGatewayListening(port: number = GATEWAY_PORT, timeoutMs = 1500): Promise<boolean> {\n return new Promise((resolveProbe) => {\n const socket = createConnection({ host: '127.0.0.1', port });\n const finish = (result: boolean) => {\n socket.destroy();\n resolveProbe(result);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\n/**\n * Poll isGatewayListening() until it's true or the window elapses. spawnGateway()\n * returns as soon as it writes the PID file \u2014 the detached child hasn't bound\n * :8787 yet (Node bootstrap + module load). A one-shot probe microseconds later\n * fails-closed on every fresh install, so the proxy/deep-capture layer silently\n * never turns on. This tolerates a normal cold-start bind delay.\n */\nexport async function waitForGatewayListening(\n port: number = GATEWAY_PORT,\n { timeoutMs = 3000, intervalMs = 150 }: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n if (await isGatewayListening(port, Math.min(1500, timeoutMs))) return true;\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * Identity-aware liveness probe on :GATEWAY_PORT \u2014 connects, requests the\n * identity marker, and distinguishes ours-live / foreign / dead. This (not\n * the raw TCP probe above) is what HTTPS_PROXY-pinning decisions must use: a\n * foreign process accepting on :8787 passes isGatewayListening() but would\n * brick every HTTPS request Claude Code makes.\n */\nexport function isRulemetricGatewayListening(\n port: number = GATEWAY_PORT,\n timeoutMs = 1500,\n): Promise<GatewayIdentity> {\n return probeGatewayIdentity(port, timeoutMs);\n}\n\n/**\n * Poll the identity probe through a cold-start bind delay. 'dead' retries\n * until the window elapses; 'ours-live' and 'foreign' return immediately\n * (waiting can't change what owns the port).\n */\nexport function waitForRulemetricGateway(\n port: number = GATEWAY_PORT,\n opts: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<GatewayIdentity> {\n return waitForGatewayIdentity(port, opts);\n}\n\n/**\n * PID-file liveness WITH identity validation. PID files survive reboots, and\n * `kill -0` on a reused PID reports \"alive\" for an unrelated process \u2014 which\n * permanently defeats the session-start self-heal. The recorded PID only\n * counts as \"running\" when its command line is actually gateway-entry.\n */\nexport function isGatewayRunning(pidOpts: PidIdentityOptions = {}): boolean {\n const pid = getGatewayPid();\n if (pid === null) return false;\n return isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts);\n}\n\nexport function getGatewayPid(): number | null {\n if (!existsSync(GATEWAY_PID_FILE)) return null;\n const content = readFileSync(GATEWAY_PID_FILE, 'utf-8').trim();\n const pid = parseInt(content, 10);\n return isNaN(pid) ? null : pid;\n}\n\nfunction findGatewayEntry(): string {\n // Resolve the compiled gateway-entry.js across BOTH layouts:\n // - unbundled (dev/tsx, or tsc output): this module sits in dist/lib, so\n // gateway-entry.js is a sibling (`./gateway-entry.js`).\n // - BUNDLED (published build): esbuild flattens this module into\n // dist/chunk-*.js at the dist ROOT, so MODULE_DIR is dist/ and the entry\n // (kept as a separate build entry) is at dist/lib/gateway-entry.js\n // (`./lib/gateway-entry.js`). Without this candidate the gateway never\n // spawns on a clean npm install \u2014 masked in dev by the launchd gateway\n // short-circuiting before this runs. See onboarding field report F1.\n const candidates = [\n resolve(MODULE_DIR, './gateway-entry.js'), // sibling (unbundled)\n resolve(MODULE_DIR, './lib/gateway-entry.js'), // bundled chunk at dist root\n resolve(MODULE_DIR, '../lib/gateway-entry.js'), // nested command dir \u2192 dist/lib\n resolve(MODULE_DIR, '../../lib/gateway-entry.js'),\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n throw new Error(\n 'Could not find gateway-entry.js. Is the CLI built?\\n' +\n 'Searched:\\n' + candidates.map(c => ` ${c}`).join('\\n'),\n );\n}\n\nexport function spawnGateway(cliVersion?: string): number {\n if (isGatewayRunning()) {\n const pid = getGatewayPid();\n if (pid) return pid;\n }\n\n mkdirSync(CONFIG_DIR, { recursive: true });\n\n const entryPath = findGatewayEntry();\n const logFd = openSync(GATEWAY_LOG_FILE, 'a');\n\n const child = spawn(process.execPath, [entryPath], {\n detached: true,\n stdio: ['ignore', logFd, logFd],\n // The gateway inherits the spawning CLI's env. RULEMETRIC_CLI_VERSION\n // identifies the CLI version that started this gateway \u2014 used to\n // detect drift when a newer CLI starts mitmproxy with a different\n // version. RULEMETRIC_CLI_ENTRY is the path to the oclif entry point\n // (process.argv[1]) so the gateway can re-invoke the CLI for\n // `proxy restart` without needing the binary in PATH. Falls back to\n // \"unknown\" if the caller didn't pass them.\n env: {\n ...process.env,\n RULEMETRIC_CLI_VERSION: cliVersion ?? 'unknown',\n RULEMETRIC_CLI_ENTRY: process.argv[1] ?? '',\n },\n });\n\n child.unref();\n\n if (!child.pid) {\n throw new Error('Failed to spawn gateway process');\n }\n\n writeFileSync(GATEWAY_PID_FILE, String(child.pid));\n return child.pid;\n}\n\nexport function stopGateway(pidOpts: PidIdentityOptions = {}): boolean {\n const pid = getGatewayPid();\n if (pid === null) return false;\n\n // Only signal a PID whose command line is actually gateway-entry \u2014 a\n // reused PID belongs to an unrelated process we must never SIGTERM. Either\n // way the PID file is stale after this and gets removed.\n if (isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts)) {\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n // Process already gone\n }\n }\n\n try { unlinkSync(GATEWAY_PID_FILE); } catch { /* already gone */ }\n return true;\n}\n"],
5
- "mappings": ";;;;;;;;;;AAIA,SAAS,aAAa;AACtB,SAAS,wBAAwB;AACjC,SAAS,YAAY,WAAW,UAAU,cAAc,YAAY,qBAAqB;AACzF,SAAS,eAAe;AACxB,SAAS,SAAS,MAAM,eAAe;AACvC,SAAS,qBAAqB;AAiB9B,IAAM,aAAa,QAAQ,cAAc,YAAY,GAAG,CAAC;AAEzD,IAAM,aAAa,KAAK,QAAQ,GAAG,WAAW,YAAY;AACnD,IAAM,mBAAmB,KAAK,YAAY,aAAa;AACvD,IAAM,mBAAmB,KAAK,YAAY,aAAa;AACvD,IAAM,eAAe;AACrB,IAAM,iBAAiB;AASvB,SAAS,mBAAmB,OAAe,cAAc,YAAY,MAAwB;AAClG,SAAO,IAAI,QAAQ,CAAC,iBAAiB;AACnC,UAAM,SAAS,iBAAiB,EAAE,MAAM,aAAa,KAAK,CAAC;AAC3D,UAAM,SAAS,CAAC,WAAoB;AAClC,aAAO,QAAQ;AACf,mBAAa,MAAM;AAAA,IACrB;AACA,WAAO,WAAW,SAAS;AAC3B,WAAO,KAAK,WAAW,MAAM,OAAO,IAAI,CAAC;AACzC,WAAO,KAAK,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1C,WAAO,KAAK,SAAS,MAAM,OAAO,KAAK,CAAC;AAAA,EAC1C,CAAC;AACH;AASA,eAAsB,wBACpB,OAAe,cACf,EAAE,YAAY,KAAM,aAAa,IAAI,IAAiD,CAAC,GACrE;AAClB,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAS;AACP,QAAI,MAAM,mBAAmB,MAAM,KAAK,IAAI,MAAM,SAAS,CAAC,EAAG,QAAO;AACtE,QAAI,KAAK,IAAI,KAAK,SAAU,QAAO;AACnC,UAAM,IAAI,QAAQ,CAACA,aAAY,WAAWA,UAAS,UAAU,CAAC;AAAA,EAChE;AACF;AASO,SAAS,6BACd,OAAe,cACf,YAAY,MACc;AAC1B,SAAO,qBAAqB,MAAM,SAAS;AAC7C;AAOO,SAAS,yBACd,OAAe,cACf,OAAoD,CAAC,GAC3B;AAC1B,SAAO,uBAAuB,MAAM,IAAI;AAC1C;AAQO,SAAS,iBAAiB,UAA8B,CAAC,GAAY;AAC1E,QAAM,MAAM,cAAc;AAC1B,MAAI,QAAQ,KAAM,QAAO;AACzB,SAAO,qBAAqB,KAAK,+BAA+B,OAAO;AACzE;AAEO,SAAS,gBAA+B;AAC7C,MAAI,CAAC,WAAW,gBAAgB,EAAG,QAAO;AAC1C,QAAM,UAAU,aAAa,kBAAkB,OAAO,EAAE,KAAK;AAC7D,QAAM,MAAM,SAAS,SAAS,EAAE;AAChC,SAAO,MAAM,GAAG,IAAI,OAAO;AAC7B;AAEA,SAAS,mBAA2B;AAUlC,QAAM,aAAa;AAAA,IACjB,QAAQ,YAAY,oBAAoB;AAAA;AAAA,IACxC,QAAQ,YAAY,wBAAwB;AAAA;AAAA,IAC5C,QAAQ,YAAY,yBAAyB;AAAA;AAAA,IAC7C,QAAQ,YAAY,4BAA4B;AAAA,EAClD;AACA,aAAW,KAAK,YAAY;AAC1B,QAAI,WAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,QAAM,IAAI;AAAA,IACR,oEACgB,WAAW,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,EACzD;AACF;AAEO,SAAS,aAAa,YAA6B;AACxD,MAAI,iBAAiB,GAAG;AACtB,UAAM,MAAM,cAAc;AAC1B,QAAI,IAAK,QAAO;AAAA,EAClB;AAEA,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,QAAM,YAAY,iBAAiB;AACnC,QAAM,QAAQ,SAAS,kBAAkB,GAAG;AAE5C,QAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,SAAS,GAAG;AAAA,IACjD,UAAU;AAAA,IACV,OAAO,CAAC,UAAU,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ9B,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,wBAAwB,cAAc;AAAA,MACtC,sBAAsB,QAAQ,KAAK,CAAC,KAAK;AAAA,IAC3C;AAAA,EACF,CAAC;AAED,QAAM,MAAM;AAEZ,MAAI,CAAC,MAAM,KAAK;AACd,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,gBAAc,kBAAkB,OAAO,MAAM,GAAG,CAAC;AACjD,SAAO,MAAM;AACf;AAEO,SAAS,YAAY,UAA8B,CAAC,GAAY;AACrE,QAAM,MAAM,cAAc;AAC1B,MAAI,QAAQ,KAAM,QAAO;AAKzB,MAAI,qBAAqB,KAAK,+BAA+B,OAAO,GAAG;AACrE,QAAI;AACF,cAAQ,KAAK,KAAK,SAAS;AAAA,IAC7B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI;AAAE,eAAW,gBAAgB;AAAA,EAAG,QAAQ;AAAA,EAAqB;AACjE,SAAO;AACT;",
6
- "names": ["resolve"]
7
- }