@rulemetric/cli 0.1.1

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 (416) hide show
  1. package/bin/dev.js +3 -0
  2. package/bin/run.js +3 -0
  3. package/dist/base-command.d.ts +12 -0
  4. package/dist/base-command.d.ts.map +1 -0
  5. package/dist/base-command.js +37 -0
  6. package/dist/base-command.js.map +1 -0
  7. package/dist/commands/auth/create-key.d.ts +11 -0
  8. package/dist/commands/auth/create-key.d.ts.map +1 -0
  9. package/dist/commands/auth/create-key.js +34 -0
  10. package/dist/commands/auth/create-key.js.map +1 -0
  11. package/dist/commands/auth/login.d.ts +11 -0
  12. package/dist/commands/auth/login.d.ts.map +1 -0
  13. package/dist/commands/auth/login.js +40 -0
  14. package/dist/commands/auth/login.js.map +1 -0
  15. package/dist/commands/auth/logout.d.ts +7 -0
  16. package/dist/commands/auth/logout.d.ts.map +1 -0
  17. package/dist/commands/auth/logout.js +13 -0
  18. package/dist/commands/auth/logout.js.map +1 -0
  19. package/dist/commands/auth/revoke-key.d.ts +10 -0
  20. package/dist/commands/auth/revoke-key.d.ts.map +1 -0
  21. package/dist/commands/auth/revoke-key.js +18 -0
  22. package/dist/commands/auth/revoke-key.js.map +1 -0
  23. package/dist/commands/auth/status.d.ts +7 -0
  24. package/dist/commands/auth/status.d.ts.map +1 -0
  25. package/dist/commands/auth/status.js +23 -0
  26. package/dist/commands/auth/status.js.map +1 -0
  27. package/dist/commands/catalog/index.d.ts +11 -0
  28. package/dist/commands/catalog/index.d.ts.map +1 -0
  29. package/dist/commands/catalog/index.js +35 -0
  30. package/dist/commands/catalog/index.js.map +1 -0
  31. package/dist/commands/catalog/recommend.d.ts +9 -0
  32. package/dist/commands/catalog/recommend.d.ts.map +1 -0
  33. package/dist/commands/catalog/recommend.js +27 -0
  34. package/dist/commands/catalog/recommend.js.map +1 -0
  35. package/dist/commands/convert.d.ts +15 -0
  36. package/dist/commands/convert.d.ts.map +1 -0
  37. package/dist/commands/convert.js +55 -0
  38. package/dist/commands/convert.js.map +1 -0
  39. package/dist/commands/converters.d.ts +12 -0
  40. package/dist/commands/converters.d.ts.map +1 -0
  41. package/dist/commands/converters.js +39 -0
  42. package/dist/commands/converters.js.map +1 -0
  43. package/dist/commands/dashboard.d.ts +10 -0
  44. package/dist/commands/dashboard.d.ts.map +1 -0
  45. package/dist/commands/dashboard.js +24 -0
  46. package/dist/commands/dashboard.js.map +1 -0
  47. package/dist/commands/eval-targets/create.d.ts +14 -0
  48. package/dist/commands/eval-targets/create.d.ts.map +1 -0
  49. package/dist/commands/eval-targets/create.js +40 -0
  50. package/dist/commands/eval-targets/create.js.map +1 -0
  51. package/dist/commands/eval-targets/list.d.ts +10 -0
  52. package/dist/commands/eval-targets/list.d.ts.map +1 -0
  53. package/dist/commands/eval-targets/list.js +36 -0
  54. package/dist/commands/eval-targets/list.js.map +1 -0
  55. package/dist/commands/evals/benchmark.d.ts +13 -0
  56. package/dist/commands/evals/benchmark.d.ts.map +1 -0
  57. package/dist/commands/evals/benchmark.js +53 -0
  58. package/dist/commands/evals/benchmark.js.map +1 -0
  59. package/dist/commands/evals/compare.d.ts +15 -0
  60. package/dist/commands/evals/compare.d.ts.map +1 -0
  61. package/dist/commands/evals/compare.js +101 -0
  62. package/dist/commands/evals/compare.js.map +1 -0
  63. package/dist/commands/evals/create.d.ts +17 -0
  64. package/dist/commands/evals/create.d.ts.map +1 -0
  65. package/dist/commands/evals/create.js +52 -0
  66. package/dist/commands/evals/create.js.map +1 -0
  67. package/dist/commands/evals/listen.d.ts +11 -0
  68. package/dist/commands/evals/listen.d.ts.map +1 -0
  69. package/dist/commands/evals/listen.js +54 -0
  70. package/dist/commands/evals/listen.js.map +1 -0
  71. package/dist/commands/evals/optimize-description.d.ts +22 -0
  72. package/dist/commands/evals/optimize-description.d.ts.map +1 -0
  73. package/dist/commands/evals/optimize-description.js +269 -0
  74. package/dist/commands/evals/optimize-description.js.map +1 -0
  75. package/dist/commands/evals/optimize.d.ts +22 -0
  76. package/dist/commands/evals/optimize.d.ts.map +1 -0
  77. package/dist/commands/evals/optimize.js +200 -0
  78. package/dist/commands/evals/optimize.js.map +1 -0
  79. package/dist/commands/evals/run.d.ts +21 -0
  80. package/dist/commands/evals/run.d.ts.map +1 -0
  81. package/dist/commands/evals/run.js +168 -0
  82. package/dist/commands/evals/run.js.map +1 -0
  83. package/dist/commands/gateway/ensure.d.ts +7 -0
  84. package/dist/commands/gateway/ensure.d.ts.map +1 -0
  85. package/dist/commands/gateway/ensure.js +20 -0
  86. package/dist/commands/gateway/ensure.js.map +1 -0
  87. package/dist/commands/hooks/install.d.ts +16 -0
  88. package/dist/commands/hooks/install.d.ts.map +1 -0
  89. package/dist/commands/hooks/install.js +248 -0
  90. package/dist/commands/hooks/install.js.map +1 -0
  91. package/dist/commands/hooks/run.d.ts +11 -0
  92. package/dist/commands/hooks/run.d.ts.map +1 -0
  93. package/dist/commands/hooks/run.js +56 -0
  94. package/dist/commands/hooks/run.js.map +1 -0
  95. package/dist/commands/hooks/uninstall.d.ts +7 -0
  96. package/dist/commands/hooks/uninstall.d.ts.map +1 -0
  97. package/dist/commands/hooks/uninstall.js +88 -0
  98. package/dist/commands/hooks/uninstall.js.map +1 -0
  99. package/dist/commands/import.d.ts +17 -0
  100. package/dist/commands/import.d.ts.map +1 -0
  101. package/dist/commands/import.js +55 -0
  102. package/dist/commands/import.js.map +1 -0
  103. package/dist/commands/insights/sync.d.ts +17 -0
  104. package/dist/commands/insights/sync.d.ts.map +1 -0
  105. package/dist/commands/insights/sync.js +477 -0
  106. package/dist/commands/insights/sync.js.map +1 -0
  107. package/dist/commands/instructions/create.d.ts +17 -0
  108. package/dist/commands/instructions/create.d.ts.map +1 -0
  109. package/dist/commands/instructions/create.js +60 -0
  110. package/dist/commands/instructions/create.js.map +1 -0
  111. package/dist/commands/instructions/delete.d.ts +13 -0
  112. package/dist/commands/instructions/delete.d.ts.map +1 -0
  113. package/dist/commands/instructions/delete.js +37 -0
  114. package/dist/commands/instructions/delete.js.map +1 -0
  115. package/dist/commands/instructions/fork.d.ts +10 -0
  116. package/dist/commands/instructions/fork.d.ts.map +1 -0
  117. package/dist/commands/instructions/fork.js +19 -0
  118. package/dist/commands/instructions/fork.js.map +1 -0
  119. package/dist/commands/instructions/get.d.ts +15 -0
  120. package/dist/commands/instructions/get.d.ts.map +1 -0
  121. package/dist/commands/instructions/get.js +50 -0
  122. package/dist/commands/instructions/get.js.map +1 -0
  123. package/dist/commands/instructions/list.d.ts +12 -0
  124. package/dist/commands/instructions/list.d.ts.map +1 -0
  125. package/dist/commands/instructions/list.js +47 -0
  126. package/dist/commands/instructions/list.js.map +1 -0
  127. package/dist/commands/instructions/promote.d.ts +14 -0
  128. package/dist/commands/instructions/promote.d.ts.map +1 -0
  129. package/dist/commands/instructions/promote.js +27 -0
  130. package/dist/commands/instructions/promote.js.map +1 -0
  131. package/dist/commands/instructions/pull.d.ts +9 -0
  132. package/dist/commands/instructions/pull.d.ts.map +1 -0
  133. package/dist/commands/instructions/pull.js +22 -0
  134. package/dist/commands/instructions/pull.js.map +1 -0
  135. package/dist/commands/instructions/upstream.d.ts +9 -0
  136. package/dist/commands/instructions/upstream.d.ts.map +1 -0
  137. package/dist/commands/instructions/upstream.js +22 -0
  138. package/dist/commands/instructions/upstream.js.map +1 -0
  139. package/dist/commands/instructions/versions.d.ts +12 -0
  140. package/dist/commands/instructions/versions.d.ts.map +1 -0
  141. package/dist/commands/instructions/versions.js +34 -0
  142. package/dist/commands/instructions/versions.js.map +1 -0
  143. package/dist/commands/packs/add-instruction.d.ts +11 -0
  144. package/dist/commands/packs/add-instruction.d.ts.map +1 -0
  145. package/dist/commands/packs/add-instruction.js +22 -0
  146. package/dist/commands/packs/add-instruction.js.map +1 -0
  147. package/dist/commands/packs/apply.d.ts +13 -0
  148. package/dist/commands/packs/apply.d.ts.map +1 -0
  149. package/dist/commands/packs/apply.js +24 -0
  150. package/dist/commands/packs/apply.js.map +1 -0
  151. package/dist/commands/packs/create.d.ts +13 -0
  152. package/dist/commands/packs/create.d.ts.map +1 -0
  153. package/dist/commands/packs/create.js +35 -0
  154. package/dist/commands/packs/create.js.map +1 -0
  155. package/dist/commands/packs/fork.d.ts +10 -0
  156. package/dist/commands/packs/fork.d.ts.map +1 -0
  157. package/dist/commands/packs/fork.js +19 -0
  158. package/dist/commands/packs/fork.js.map +1 -0
  159. package/dist/commands/packs/get.d.ts +10 -0
  160. package/dist/commands/packs/get.d.ts.map +1 -0
  161. package/dist/commands/packs/get.js +36 -0
  162. package/dist/commands/packs/get.js.map +1 -0
  163. package/dist/commands/packs/list.d.ts +22 -0
  164. package/dist/commands/packs/list.d.ts.map +1 -0
  165. package/dist/commands/packs/list.js +48 -0
  166. package/dist/commands/packs/list.js.map +1 -0
  167. package/dist/commands/packs/remove-instruction.d.ts +11 -0
  168. package/dist/commands/packs/remove-instruction.d.ts.map +1 -0
  169. package/dist/commands/packs/remove-instruction.js +20 -0
  170. package/dist/commands/packs/remove-instruction.js.map +1 -0
  171. package/dist/commands/proxy/env.d.ts +14 -0
  172. package/dist/commands/proxy/env.d.ts.map +1 -0
  173. package/dist/commands/proxy/env.js +118 -0
  174. package/dist/commands/proxy/env.js.map +1 -0
  175. package/dist/commands/proxy/logs.d.ts +11 -0
  176. package/dist/commands/proxy/logs.d.ts.map +1 -0
  177. package/dist/commands/proxy/logs.js +75 -0
  178. package/dist/commands/proxy/logs.js.map +1 -0
  179. package/dist/commands/proxy/setup.d.ts +23 -0
  180. package/dist/commands/proxy/setup.d.ts.map +1 -0
  181. package/dist/commands/proxy/setup.js +391 -0
  182. package/dist/commands/proxy/setup.js.map +1 -0
  183. package/dist/commands/proxy/start.d.ts +17 -0
  184. package/dist/commands/proxy/start.d.ts.map +1 -0
  185. package/dist/commands/proxy/start.js +306 -0
  186. package/dist/commands/proxy/start.js.map +1 -0
  187. package/dist/commands/proxy/status.d.ts +7 -0
  188. package/dist/commands/proxy/status.d.ts.map +1 -0
  189. package/dist/commands/proxy/status.js +65 -0
  190. package/dist/commands/proxy/status.js.map +1 -0
  191. package/dist/commands/proxy/stop.d.ts +8 -0
  192. package/dist/commands/proxy/stop.d.ts.map +1 -0
  193. package/dist/commands/proxy/stop.js +77 -0
  194. package/dist/commands/proxy/stop.js.map +1 -0
  195. package/dist/commands/service/install.d.ts +17 -0
  196. package/dist/commands/service/install.d.ts.map +1 -0
  197. package/dist/commands/service/install.js +383 -0
  198. package/dist/commands/service/install.js.map +1 -0
  199. package/dist/commands/service/install.test.d.ts +2 -0
  200. package/dist/commands/service/install.test.d.ts.map +1 -0
  201. package/dist/commands/service/install.test.js +345 -0
  202. package/dist/commands/service/install.test.js.map +1 -0
  203. package/dist/commands/service/status.d.ts +6 -0
  204. package/dist/commands/service/status.d.ts.map +1 -0
  205. package/dist/commands/service/status.js +112 -0
  206. package/dist/commands/service/status.js.map +1 -0
  207. package/dist/commands/service/uninstall.d.ts +6 -0
  208. package/dist/commands/service/uninstall.d.ts.map +1 -0
  209. package/dist/commands/service/uninstall.js +84 -0
  210. package/dist/commands/service/uninstall.js.map +1 -0
  211. package/dist/commands/sessions/analyze.d.ts +10 -0
  212. package/dist/commands/sessions/analyze.d.ts.map +1 -0
  213. package/dist/commands/sessions/analyze.js +26 -0
  214. package/dist/commands/sessions/analyze.js.map +1 -0
  215. package/dist/commands/sessions/end.d.ts +9 -0
  216. package/dist/commands/sessions/end.d.ts.map +1 -0
  217. package/dist/commands/sessions/end.js +82 -0
  218. package/dist/commands/sessions/end.js.map +1 -0
  219. package/dist/commands/sessions/import.d.ts +13 -0
  220. package/dist/commands/sessions/import.d.ts.map +1 -0
  221. package/dist/commands/sessions/import.js +28 -0
  222. package/dist/commands/sessions/import.js.map +1 -0
  223. package/dist/commands/sessions/list.d.ts +11 -0
  224. package/dist/commands/sessions/list.d.ts.map +1 -0
  225. package/dist/commands/sessions/list.js +34 -0
  226. package/dist/commands/sessions/list.js.map +1 -0
  227. package/dist/commands/sessions/start.d.ts +11 -0
  228. package/dist/commands/sessions/start.d.ts.map +1 -0
  229. package/dist/commands/sessions/start.js +83 -0
  230. package/dist/commands/sessions/start.js.map +1 -0
  231. package/dist/commands/skills/install.d.ts +15 -0
  232. package/dist/commands/skills/install.d.ts.map +1 -0
  233. package/dist/commands/skills/install.js +91 -0
  234. package/dist/commands/skills/install.js.map +1 -0
  235. package/dist/commands/skills/list.d.ts +11 -0
  236. package/dist/commands/skills/list.d.ts.map +1 -0
  237. package/dist/commands/skills/list.js +47 -0
  238. package/dist/commands/skills/list.js.map +1 -0
  239. package/dist/commands/skills/search.d.ts +17 -0
  240. package/dist/commands/skills/search.d.ts.map +1 -0
  241. package/dist/commands/skills/search.js +56 -0
  242. package/dist/commands/skills/search.js.map +1 -0
  243. package/dist/commands/skills/update.d.ts +7 -0
  244. package/dist/commands/skills/update.d.ts.map +1 -0
  245. package/dist/commands/skills/update.js +30 -0
  246. package/dist/commands/skills/update.js.map +1 -0
  247. package/dist/dashboard/Dashboard.d.ts +3 -0
  248. package/dist/dashboard/Dashboard.d.ts.map +1 -0
  249. package/dist/dashboard/Dashboard.js +132 -0
  250. package/dist/dashboard/Dashboard.js.map +1 -0
  251. package/dist/dashboard/data.d.ts +11 -0
  252. package/dist/dashboard/data.d.ts.map +1 -0
  253. package/dist/dashboard/data.js +137 -0
  254. package/dist/dashboard/data.js.map +1 -0
  255. package/dist/dashboard/panels/friction.d.ts +7 -0
  256. package/dist/dashboard/panels/friction.d.ts.map +1 -0
  257. package/dist/dashboard/panels/friction.js +22 -0
  258. package/dist/dashboard/panels/friction.js.map +1 -0
  259. package/dist/dashboard/panels/insights.d.ts +8 -0
  260. package/dist/dashboard/panels/insights.d.ts.map +1 -0
  261. package/dist/dashboard/panels/insights.js +109 -0
  262. package/dist/dashboard/panels/insights.js.map +1 -0
  263. package/dist/dashboard/panels/instructions.d.ts +9 -0
  264. package/dist/dashboard/panels/instructions.d.ts.map +1 -0
  265. package/dist/dashboard/panels/instructions.js +17 -0
  266. package/dist/dashboard/panels/instructions.js.map +1 -0
  267. package/dist/dashboard/panels/outcomes.d.ts +7 -0
  268. package/dist/dashboard/panels/outcomes.d.ts.map +1 -0
  269. package/dist/dashboard/panels/outcomes.js +29 -0
  270. package/dist/dashboard/panels/outcomes.js.map +1 -0
  271. package/dist/dashboard/panels/overview.d.ts +8 -0
  272. package/dist/dashboard/panels/overview.d.ts.map +1 -0
  273. package/dist/dashboard/panels/overview.js +20 -0
  274. package/dist/dashboard/panels/overview.js.map +1 -0
  275. package/dist/dashboard/panels/shared.d.ts +17 -0
  276. package/dist/dashboard/panels/shared.d.ts.map +1 -0
  277. package/dist/dashboard/panels/shared.js +62 -0
  278. package/dist/dashboard/panels/shared.js.map +1 -0
  279. package/dist/dashboard/types.d.ts +80 -0
  280. package/dist/dashboard/types.d.ts.map +1 -0
  281. package/dist/dashboard/types.js +27 -0
  282. package/dist/dashboard/types.js.map +1 -0
  283. package/dist/index.d.ts +2 -0
  284. package/dist/index.d.ts.map +1 -0
  285. package/dist/index.js +2 -0
  286. package/dist/index.js.map +1 -0
  287. package/dist/lib/api-client.d.ts +17 -0
  288. package/dist/lib/api-client.d.ts.map +1 -0
  289. package/dist/lib/api-client.js +92 -0
  290. package/dist/lib/api-client.js.map +1 -0
  291. package/dist/lib/api-client.test.d.ts +2 -0
  292. package/dist/lib/api-client.test.d.ts.map +1 -0
  293. package/dist/lib/api-client.test.js +161 -0
  294. package/dist/lib/api-client.test.js.map +1 -0
  295. package/dist/lib/auth.d.ts +27 -0
  296. package/dist/lib/auth.d.ts.map +1 -0
  297. package/dist/lib/auth.js +137 -0
  298. package/dist/lib/auth.js.map +1 -0
  299. package/dist/lib/auth.test.d.ts +2 -0
  300. package/dist/lib/auth.test.d.ts.map +1 -0
  301. package/dist/lib/auth.test.js +110 -0
  302. package/dist/lib/auth.test.js.map +1 -0
  303. package/dist/lib/eval-analyzer.d.ts +23 -0
  304. package/dist/lib/eval-analyzer.d.ts.map +1 -0
  305. package/dist/lib/eval-analyzer.js +89 -0
  306. package/dist/lib/eval-analyzer.js.map +1 -0
  307. package/dist/lib/eval-benchmark.d.ts +17 -0
  308. package/dist/lib/eval-benchmark.d.ts.map +1 -0
  309. package/dist/lib/eval-benchmark.js +92 -0
  310. package/dist/lib/eval-benchmark.js.map +1 -0
  311. package/dist/lib/eval-conversation-handler.d.ts +9 -0
  312. package/dist/lib/eval-conversation-handler.d.ts.map +1 -0
  313. package/dist/lib/eval-conversation-handler.js +200 -0
  314. package/dist/lib/eval-conversation-handler.js.map +1 -0
  315. package/dist/lib/eval-executor.d.ts +21 -0
  316. package/dist/lib/eval-executor.d.ts.map +1 -0
  317. package/dist/lib/eval-executor.js +80 -0
  318. package/dist/lib/eval-executor.js.map +1 -0
  319. package/dist/lib/eval-executor.test.d.ts +2 -0
  320. package/dist/lib/eval-executor.test.d.ts.map +1 -0
  321. package/dist/lib/eval-executor.test.js +8 -0
  322. package/dist/lib/eval-executor.test.js.map +1 -0
  323. package/dist/lib/eval-grader.d.ts +38 -0
  324. package/dist/lib/eval-grader.d.ts.map +1 -0
  325. package/dist/lib/eval-grader.js +123 -0
  326. package/dist/lib/eval-grader.js.map +1 -0
  327. package/dist/lib/eval-grader.test.d.ts +2 -0
  328. package/dist/lib/eval-grader.test.d.ts.map +1 -0
  329. package/dist/lib/eval-grader.test.js +8 -0
  330. package/dist/lib/eval-grader.test.js.map +1 -0
  331. package/dist/lib/eval-meta-judge.d.ts +28 -0
  332. package/dist/lib/eval-meta-judge.d.ts.map +1 -0
  333. package/dist/lib/eval-meta-judge.js +116 -0
  334. package/dist/lib/eval-meta-judge.js.map +1 -0
  335. package/dist/lib/eval-trigger-tester.d.ts +19 -0
  336. package/dist/lib/eval-trigger-tester.d.ts.map +1 -0
  337. package/dist/lib/eval-trigger-tester.js +96 -0
  338. package/dist/lib/eval-trigger-tester.js.map +1 -0
  339. package/dist/lib/eval-worker.d.ts +12 -0
  340. package/dist/lib/eval-worker.d.ts.map +1 -0
  341. package/dist/lib/eval-worker.js +395 -0
  342. package/dist/lib/eval-worker.js.map +1 -0
  343. package/dist/lib/eval-worktree.d.ts +11 -0
  344. package/dist/lib/eval-worktree.d.ts.map +1 -0
  345. package/dist/lib/eval-worktree.js +87 -0
  346. package/dist/lib/eval-worktree.js.map +1 -0
  347. package/dist/lib/eval-worktree.test.d.ts +2 -0
  348. package/dist/lib/eval-worktree.test.d.ts.map +1 -0
  349. package/dist/lib/eval-worktree.test.js +68 -0
  350. package/dist/lib/eval-worktree.test.js.map +1 -0
  351. package/dist/lib/gateway-entry.d.ts +3 -0
  352. package/dist/lib/gateway-entry.d.ts.map +1 -0
  353. package/dist/lib/gateway-entry.js +19 -0
  354. package/dist/lib/gateway-entry.js.map +1 -0
  355. package/dist/lib/gateway-lifecycle.d.ts +9 -0
  356. package/dist/lib/gateway-lifecycle.d.ts.map +1 -0
  357. package/dist/lib/gateway-lifecycle.js +86 -0
  358. package/dist/lib/gateway-lifecycle.js.map +1 -0
  359. package/dist/lib/gateway.d.ts +12 -0
  360. package/dist/lib/gateway.d.ts.map +1 -0
  361. package/dist/lib/gateway.js +150 -0
  362. package/dist/lib/gateway.js.map +1 -0
  363. package/dist/lib/hooks-config.d.ts +95 -0
  364. package/dist/lib/hooks-config.d.ts.map +1 -0
  365. package/dist/lib/hooks-config.js +416 -0
  366. package/dist/lib/hooks-config.js.map +1 -0
  367. package/dist/lib/hooks-config.test.d.ts +2 -0
  368. package/dist/lib/hooks-config.test.d.ts.map +1 -0
  369. package/dist/lib/hooks-config.test.js +231 -0
  370. package/dist/lib/hooks-config.test.js.map +1 -0
  371. package/dist/lib/insights-prompts.d.ts +13 -0
  372. package/dist/lib/insights-prompts.d.ts.map +1 -0
  373. package/dist/lib/insights-prompts.js +145 -0
  374. package/dist/lib/insights-prompts.js.map +1 -0
  375. package/dist/lib/insights-worker.d.ts +10 -0
  376. package/dist/lib/insights-worker.d.ts.map +1 -0
  377. package/dist/lib/insights-worker.js +329 -0
  378. package/dist/lib/insights-worker.js.map +1 -0
  379. package/dist/lib/llm-client.d.ts +26 -0
  380. package/dist/lib/llm-client.d.ts.map +1 -0
  381. package/dist/lib/llm-client.js +142 -0
  382. package/dist/lib/llm-client.js.map +1 -0
  383. package/dist/lib/llm-client.test.d.ts +2 -0
  384. package/dist/lib/llm-client.test.d.ts.map +1 -0
  385. package/dist/lib/llm-client.test.js +62 -0
  386. package/dist/lib/llm-client.test.js.map +1 -0
  387. package/dist/lib/output.d.ts +4 -0
  388. package/dist/lib/output.d.ts.map +1 -0
  389. package/dist/lib/output.js +36 -0
  390. package/dist/lib/output.js.map +1 -0
  391. package/dist/lib/output.test.d.ts +2 -0
  392. package/dist/lib/output.test.d.ts.map +1 -0
  393. package/dist/lib/output.test.js +71 -0
  394. package/dist/lib/output.test.js.map +1 -0
  395. package/dist/lib/provider-aggregator.d.ts +24 -0
  396. package/dist/lib/provider-aggregator.d.ts.map +1 -0
  397. package/dist/lib/provider-aggregator.js +57 -0
  398. package/dist/lib/provider-aggregator.js.map +1 -0
  399. package/dist/lib/provider-aggregator.test.d.ts +2 -0
  400. package/dist/lib/provider-aggregator.test.d.ts.map +1 -0
  401. package/dist/lib/provider-aggregator.test.js +103 -0
  402. package/dist/lib/provider-aggregator.test.js.map +1 -0
  403. package/dist/lib/skills-loader.d.ts +6 -0
  404. package/dist/lib/skills-loader.d.ts.map +1 -0
  405. package/dist/lib/skills-loader.js +51 -0
  406. package/dist/lib/skills-loader.js.map +1 -0
  407. package/dist/lib/types.d.ts +48 -0
  408. package/dist/lib/types.d.ts.map +1 -0
  409. package/dist/lib/types.js +7 -0
  410. package/dist/lib/types.js.map +1 -0
  411. package/dist/test-helpers.d.ts +58 -0
  412. package/dist/test-helpers.d.ts.map +1 -0
  413. package/dist/test-helpers.js +58 -0
  414. package/dist/test-helpers.js.map +1 -0
  415. package/oclif.manifest.json +3197 -0
  416. package/package.json +76 -0
@@ -0,0 +1,345 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import * as os from 'node:os';
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers — inline re-implementations of module-private logic so we can test
7
+ // them directly without reaching into private class methods. Each helper
8
+ // mirrors the source exactly, making the tests "dual-writing" protection
9
+ // against accidental drift.
10
+ // ---------------------------------------------------------------------------
11
+ // Re-implement escapeXml exactly as it appears in install.ts
12
+ function escapeXml(s) {
13
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
14
+ }
15
+ // The whitelist as declared in install.ts
16
+ const ALLOWED_ENV_VARS = new Set([
17
+ 'SUPABASE_URL',
18
+ 'SUPABASE_ANON_KEY',
19
+ 'SUPABASE_SERVICE_ROLE_KEY',
20
+ 'DATABASE_URL',
21
+ 'RULEMETRIC_API_URL',
22
+ 'RULEMETRIC_API_KEY',
23
+ 'RULEMETRIC_ACCESS_TOKEN',
24
+ ]);
25
+ // Filtering logic extracted from loadEnvVars (the final Object.fromEntries step)
26
+ function filterEnvVars(vars) {
27
+ return Object.fromEntries(Object.entries(vars).filter(([k]) => ALLOWED_ENV_VARS.has(k)));
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // For buildPlist and findProjectRoot we instantiate the real command class and
31
+ // call private methods via "as any" — TypeScript private is compile-time only.
32
+ // ---------------------------------------------------------------------------
33
+ import ServiceInstall from './install.js';
34
+ // Minimal oclif config stub that satisfies the constructor signature
35
+ function makeCommand() {
36
+ // oclif commands can be instantiated with (argv, config) but for pure-logic
37
+ // tests we only need the instance; we'll bypass run() entirely.
38
+ return new ServiceInstall([], {});
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // 1. Env var filtering
42
+ // ---------------------------------------------------------------------------
43
+ describe('ALLOWED_ENV_VARS whitelist', () => {
44
+ it('includes all Supabase-related vars', () => {
45
+ expect(ALLOWED_ENV_VARS.has('SUPABASE_URL')).toBe(true);
46
+ expect(ALLOWED_ENV_VARS.has('SUPABASE_ANON_KEY')).toBe(true);
47
+ expect(ALLOWED_ENV_VARS.has('SUPABASE_SERVICE_ROLE_KEY')).toBe(true);
48
+ expect(ALLOWED_ENV_VARS.has('DATABASE_URL')).toBe(true);
49
+ });
50
+ it('includes RULEMETRIC_API_KEY', () => {
51
+ expect(ALLOWED_ENV_VARS.has('RULEMETRIC_API_KEY')).toBe(true);
52
+ });
53
+ it('includes RULEMETRIC_ACCESS_TOKEN and RULEMETRIC_API_URL', () => {
54
+ expect(ALLOWED_ENV_VARS.has('RULEMETRIC_ACCESS_TOKEN')).toBe(true);
55
+ expect(ALLOWED_ENV_VARS.has('RULEMETRIC_API_URL')).toBe(true);
56
+ });
57
+ it('excludes unrelated secrets', () => {
58
+ const unrelated = [
59
+ 'OPENAI_API_KEY',
60
+ 'AWS_SECRET_ACCESS_KEY',
61
+ 'AWS_ACCESS_KEY_ID',
62
+ 'STRIPE_SECRET_KEY',
63
+ 'GITHUB_TOKEN',
64
+ 'NPM_TOKEN',
65
+ 'HOME',
66
+ 'PATH',
67
+ ];
68
+ for (const key of unrelated) {
69
+ expect(ALLOWED_ENV_VARS.has(key), `${key} should NOT be in whitelist`).toBe(false);
70
+ }
71
+ });
72
+ });
73
+ describe('filterEnvVars', () => {
74
+ it('passes through only whitelisted keys', () => {
75
+ const input = {
76
+ SUPABASE_URL: 'https://example.supabase.co',
77
+ SUPABASE_ANON_KEY: 'anon-key',
78
+ OPENAI_API_KEY: 'sk-secret',
79
+ AWS_SECRET_ACCESS_KEY: 'aws-secret',
80
+ };
81
+ const result = filterEnvVars(input);
82
+ expect(result).toEqual({
83
+ SUPABASE_URL: 'https://example.supabase.co',
84
+ SUPABASE_ANON_KEY: 'anon-key',
85
+ });
86
+ });
87
+ it('returns empty object when all keys are excluded', () => {
88
+ const input = {
89
+ OPENAI_API_KEY: 'sk-secret',
90
+ HOME: '/home/user',
91
+ };
92
+ expect(filterEnvVars(input)).toEqual({});
93
+ });
94
+ it('returns empty object for empty input', () => {
95
+ expect(filterEnvVars({})).toEqual({});
96
+ });
97
+ it('passes through all allowed vars when all are present', () => {
98
+ const input = {
99
+ SUPABASE_URL: 'a',
100
+ SUPABASE_ANON_KEY: 'b',
101
+ SUPABASE_SERVICE_ROLE_KEY: 'c',
102
+ DATABASE_URL: 'd',
103
+ RULEMETRIC_API_URL: 'e',
104
+ RULEMETRIC_API_KEY: 'f',
105
+ RULEMETRIC_ACCESS_TOKEN: 'g',
106
+ };
107
+ const result = filterEnvVars(input);
108
+ expect(Object.keys(result).sort()).toEqual([...ALLOWED_ENV_VARS].sort());
109
+ });
110
+ });
111
+ // ---------------------------------------------------------------------------
112
+ // 2. XML escaping
113
+ // ---------------------------------------------------------------------------
114
+ describe('escapeXml', () => {
115
+ it('escapes ampersand', () => {
116
+ expect(escapeXml('a&b')).toBe('a&amp;b');
117
+ });
118
+ it('escapes less-than', () => {
119
+ expect(escapeXml('a<b')).toBe('a&lt;b');
120
+ });
121
+ it('escapes greater-than', () => {
122
+ expect(escapeXml('a>b')).toBe('a&gt;b');
123
+ });
124
+ it('escapes double-quote', () => {
125
+ expect(escapeXml('say "hello"')).toBe('say &quot;hello&quot;');
126
+ });
127
+ it('passes through normal strings unchanged', () => {
128
+ expect(escapeXml('hello world')).toBe('hello world');
129
+ expect(escapeXml('/usr/local/bin/node')).toBe('/usr/local/bin/node');
130
+ expect(escapeXml('com.rulemetric.api')).toBe('com.rulemetric.api');
131
+ });
132
+ it('escapes multiple special characters in one string', () => {
133
+ expect(escapeXml('<a href="x&y">z</a>')).toBe('&lt;a href=&quot;x&amp;y&quot;&gt;z&lt;/a&gt;');
134
+ });
135
+ it('handles empty string', () => {
136
+ expect(escapeXml('')).toBe('');
137
+ });
138
+ });
139
+ // ---------------------------------------------------------------------------
140
+ // 3. Project root detection (via private method on ServiceInstall instance)
141
+ // ---------------------------------------------------------------------------
142
+ describe('findProjectRoot', () => {
143
+ let tmpDir;
144
+ const originalCwd = process.cwd;
145
+ const originalEnv = process.env.RULEMETRIC_PROJECT_ROOT;
146
+ beforeEach(() => {
147
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'rulemetric-install-test-'));
148
+ delete process.env.RULEMETRIC_PROJECT_ROOT;
149
+ });
150
+ afterEach(() => {
151
+ fs.rmSync(tmpDir, { recursive: true, force: true });
152
+ process.cwd = originalCwd;
153
+ if (originalEnv !== undefined) {
154
+ process.env.RULEMETRIC_PROJECT_ROOT = originalEnv;
155
+ }
156
+ else {
157
+ delete process.env.RULEMETRIC_PROJECT_ROOT;
158
+ }
159
+ });
160
+ it('returns path when marker file apps/api/package.json exists at cwd', () => {
161
+ // Create the marker
162
+ fs.mkdirSync(path.join(tmpDir, 'apps', 'api'), { recursive: true });
163
+ fs.writeFileSync(path.join(tmpDir, 'apps', 'api', 'package.json'), '{}');
164
+ // Override process.cwd to return our tmpDir
165
+ process.cwd = () => tmpDir;
166
+ const cmd = makeCommand();
167
+ const result = cmd.findProjectRoot();
168
+ expect(result).toBe(tmpDir);
169
+ });
170
+ it('returns path when marker file exists in a parent directory', () => {
171
+ // Create marker at tmpDir root
172
+ fs.mkdirSync(path.join(tmpDir, 'apps', 'api'), { recursive: true });
173
+ fs.writeFileSync(path.join(tmpDir, 'apps', 'api', 'package.json'), '{}');
174
+ // Set cwd to a subdirectory two levels deep
175
+ const subDir = path.join(tmpDir, 'apps', 'api', 'src');
176
+ fs.mkdirSync(subDir, { recursive: true });
177
+ process.cwd = () => subDir;
178
+ const cmd = makeCommand();
179
+ const result = cmd.findProjectRoot();
180
+ expect(result).toBe(tmpDir);
181
+ });
182
+ it('returns null when no marker file is found anywhere', () => {
183
+ // tmpDir has no apps/api/package.json
184
+ process.cwd = () => tmpDir;
185
+ const cmd = makeCommand();
186
+ const result = cmd.findProjectRoot();
187
+ expect(result).toBeNull();
188
+ });
189
+ it('returns RULEMETRIC_PROJECT_ROOT env var override without filesystem check', () => {
190
+ const overrideRoot = '/some/custom/path';
191
+ process.env.RULEMETRIC_PROJECT_ROOT = overrideRoot;
192
+ const cmd = makeCommand();
193
+ const result = cmd.findProjectRoot();
194
+ expect(result).toBe(overrideRoot);
195
+ });
196
+ it('prefers RULEMETRIC_PROJECT_ROOT over actual filesystem discovery', () => {
197
+ // Even if the marker exists at tmpDir, env var wins
198
+ fs.mkdirSync(path.join(tmpDir, 'apps', 'api'), { recursive: true });
199
+ fs.writeFileSync(path.join(tmpDir, 'apps', 'api', 'package.json'), '{}');
200
+ process.cwd = () => tmpDir;
201
+ process.env.RULEMETRIC_PROJECT_ROOT = '/env-var-wins';
202
+ const cmd = makeCommand();
203
+ expect(cmd.findProjectRoot()).toBe('/env-var-wins');
204
+ });
205
+ });
206
+ // ---------------------------------------------------------------------------
207
+ // 4. Plist generation
208
+ // ---------------------------------------------------------------------------
209
+ describe('buildPlist', () => {
210
+ const baseOpts = {
211
+ port: 3000,
212
+ projectRoot: '/Users/dev/momento-mori',
213
+ nodePath: '/Users/dev/.nvm/versions/node/v20.0.0/bin/node',
214
+ pnpmPath: '/Users/dev/.nvm/versions/node/v20.0.0/bin/pnpm',
215
+ envVars: {
216
+ SUPABASE_URL: 'https://example.supabase.co',
217
+ DATABASE_URL: 'postgres://localhost/dev',
218
+ },
219
+ };
220
+ function buildPlist(opts) {
221
+ const cmd = makeCommand();
222
+ return cmd.buildPlist(opts);
223
+ }
224
+ it('contains the label com.rulemetric.api', () => {
225
+ const plist = buildPlist(baseOpts);
226
+ expect(plist).toContain('<string>com.rulemetric.api</string>');
227
+ });
228
+ it('contains RunAtLoad true', () => {
229
+ const plist = buildPlist(baseOpts);
230
+ // The RunAtLoad key must be followed by <true/>
231
+ expect(plist).toMatch(/<key>RunAtLoad<\/key>\s*<true\/>/);
232
+ });
233
+ it('contains KeepAlive with SuccessfulExit false', () => {
234
+ const plist = buildPlist(baseOpts);
235
+ expect(plist).toMatch(/<key>KeepAlive<\/key>\s*<dict>/);
236
+ expect(plist).toMatch(/<key>SuccessfulExit<\/key>\s*<false\/>/);
237
+ });
238
+ it('contains the correct WorkingDirectory', () => {
239
+ const plist = buildPlist(baseOpts);
240
+ expect(plist).toContain('<key>WorkingDirectory</key>');
241
+ expect(plist).toContain(`<string>${baseOpts.projectRoot}</string>`);
242
+ });
243
+ it('includes PORT derived from the port argument', () => {
244
+ const plist = buildPlist({ ...baseOpts, port: 4242 });
245
+ expect(plist).toContain('<key>PORT</key>');
246
+ expect(plist).toContain('<string>4242</string>');
247
+ });
248
+ it('does NOT contain vars outside the whitelist', () => {
249
+ // Even if someone passes unexpected keys through envVars, they should not
250
+ // appear in the plist — this documents the contract (loadEnvVars filters
251
+ // before calling buildPlist, but buildPlist itself just interpolates what
252
+ // it receives; the absence test here validates the upstream filtering).
253
+ const plistWithOnlyAllowed = buildPlist({
254
+ ...baseOpts,
255
+ envVars: {
256
+ SUPABASE_URL: 'https://example.supabase.co',
257
+ // Simulate a mis-pass of a non-allowed var
258
+ },
259
+ });
260
+ // These strings must never appear as XML keys in the plist output
261
+ const forbidden = ['OPENAI_API_KEY', 'AWS_SECRET_ACCESS_KEY', 'STRIPE_SECRET_KEY'];
262
+ for (const key of forbidden) {
263
+ expect(plistWithOnlyAllowed).not.toContain(`<key>${key}</key>`);
264
+ }
265
+ });
266
+ it('derives PATH from provided node and pnpm directory paths', () => {
267
+ const plist = buildPlist(baseOpts);
268
+ const nodeDir = path.dirname(baseOpts.nodePath);
269
+ const pnpmDir = path.dirname(baseOpts.pnpmPath);
270
+ expect(plist).toContain('<key>PATH</key>');
271
+ // Both binary directories must appear in the PATH value
272
+ const pathMatch = plist.match(/<key>PATH<\/key>\s*<string>([^<]+)<\/string>/);
273
+ expect(pathMatch).not.toBeNull();
274
+ const pathValue = pathMatch[1];
275
+ expect(pathValue).toContain(nodeDir);
276
+ expect(pathValue).toContain(pnpmDir);
277
+ });
278
+ it('PATH does not contain a hardcoded path that conflicts with resolved binary dirs', () => {
279
+ // Verify that when node/pnpm are in non-standard dirs, PATH uses those dirs,
280
+ // not a hardcoded /usr/local/bin as the only entry.
281
+ const customNodePath = '/opt/my-node/bin/node';
282
+ const customPnpmPath = '/opt/my-pnpm/bin/pnpm';
283
+ const plist = buildPlist({
284
+ ...baseOpts,
285
+ nodePath: customNodePath,
286
+ pnpmPath: customPnpmPath,
287
+ });
288
+ const pathMatch = plist.match(/<key>PATH<\/key>\s*<string>([^<]+)<\/string>/);
289
+ expect(pathMatch).not.toBeNull();
290
+ const pathValue = pathMatch[1];
291
+ expect(pathValue).toContain('/opt/my-node/bin');
292
+ expect(pathValue).toContain('/opt/my-pnpm/bin');
293
+ });
294
+ it('includes allowed env vars in EnvironmentVariables dict', () => {
295
+ const plist = buildPlist({
296
+ ...baseOpts,
297
+ envVars: {
298
+ SUPABASE_URL: 'https://test.supabase.co',
299
+ DATABASE_URL: 'postgres://localhost/testdb',
300
+ RULEMETRIC_API_KEY: 'my-api-key',
301
+ },
302
+ });
303
+ expect(plist).toContain('<key>SUPABASE_URL</key>');
304
+ expect(plist).toContain('<string>https://test.supabase.co</string>');
305
+ expect(plist).toContain('<key>DATABASE_URL</key>');
306
+ expect(plist).toContain('<key>RULEMETRIC_API_KEY</key>');
307
+ });
308
+ it('XML-escapes values that contain special characters', () => {
309
+ const plist = buildPlist({
310
+ ...baseOpts,
311
+ envVars: {
312
+ DATABASE_URL: 'postgres://user:p&ssw<ord>@host/db',
313
+ },
314
+ });
315
+ // The raw unescaped string must NOT appear
316
+ expect(plist).not.toContain('p&ssw<ord>');
317
+ // The escaped version must appear
318
+ expect(plist).toContain('p&amp;ssw&lt;ord&gt;');
319
+ });
320
+ it('XML-escapes the project root path in WorkingDirectory', () => {
321
+ const plist = buildPlist({
322
+ ...baseOpts,
323
+ projectRoot: '/Users/dev/my<project>&test',
324
+ });
325
+ expect(plist).not.toContain('my<project>&test');
326
+ expect(plist).toContain('my&lt;project&gt;&amp;test');
327
+ });
328
+ it('produces valid well-formed plist document structure', () => {
329
+ const plist = buildPlist(baseOpts);
330
+ expect(plist).toContain('<?xml version="1.0" encoding="UTF-8"?>');
331
+ expect(plist).toContain('<!DOCTYPE plist');
332
+ expect(plist).toContain('<plist version="1.0">');
333
+ expect(plist).toContain('</plist>');
334
+ // Outer dict must open and close
335
+ const dictOpenCount = (plist.match(/<dict>/g) ?? []).length;
336
+ const dictCloseCount = (plist.match(/<\/dict>/g) ?? []).length;
337
+ expect(dictOpenCount).toBe(dictCloseCount);
338
+ });
339
+ it('uses pnpmPath as the first ProgramArgument', () => {
340
+ const plist = buildPlist(baseOpts);
341
+ // The array of program arguments starts with pnpmPath
342
+ expect(plist).toMatch(/<key>ProgramArguments<\/key>\s*<array>\s*<string>[^<]*pnpm<\/string>/);
343
+ });
344
+ });
345
+ //# sourceMappingURL=install.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../../src/commands/service/install.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class ServiceStatus extends BaseCommand {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/service/status.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,OAAgB,WAAW,SAAoD;IAEzE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8F3B"}
@@ -0,0 +1,112 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { execSync } from 'node:child_process';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { BaseCommand } from '../../base-command.js';
6
+ const PLIST_LABEL = 'com.rulemetric.api';
7
+ const PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${PLIST_LABEL}.plist`);
8
+ const WORKER_PLIST_LABEL = 'com.rulemetric.worker';
9
+ const WORKER_PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${WORKER_PLIST_LABEL}.plist`);
10
+ const LOG_DIR = join(homedir(), '.config', 'rulemetric', 'logs');
11
+ export default class ServiceStatus extends BaseCommand {
12
+ static description = 'Check the status of the RuleMetric API service';
13
+ async run() {
14
+ if (process.platform !== 'darwin') {
15
+ this.error('Service status is currently macOS-only.');
16
+ }
17
+ // Check if plist exists
18
+ if (!existsSync(PLIST_PATH)) {
19
+ this.log('Service: not installed');
20
+ this.log('Run: rulemetric service install');
21
+ return;
22
+ }
23
+ // Check launchd status
24
+ let launchdStatus = 'unknown';
25
+ let pid = null;
26
+ try {
27
+ const output = execSync(`launchctl list ${PLIST_LABEL} 2>/dev/null`, { encoding: 'utf-8' });
28
+ const pidMatch = output.match(/"PID"\s*=\s*(\d+)/);
29
+ const statusMatch = output.match(/"LastExitStatus"\s*=\s*(\d+)/);
30
+ if (pidMatch) {
31
+ pid = pidMatch[1];
32
+ launchdStatus = 'running';
33
+ }
34
+ else if (statusMatch) {
35
+ launchdStatus = statusMatch[1] === '0' ? 'stopped (clean exit)' : `stopped (exit code ${statusMatch[1]})`;
36
+ }
37
+ else {
38
+ launchdStatus = 'loaded';
39
+ }
40
+ }
41
+ catch {
42
+ launchdStatus = 'not loaded';
43
+ }
44
+ // Check API health
45
+ let apiHealth = 'unreachable';
46
+ let port = 3000;
47
+ try {
48
+ const plistContent = readFileSync(PLIST_PATH, 'utf-8');
49
+ const portMatch = plistContent.match(/<key>PORT<\/key>\s*<string>(\d+)<\/string>/);
50
+ if (portMatch)
51
+ port = Number.parseInt(portMatch[1]);
52
+ }
53
+ catch {
54
+ // default port
55
+ }
56
+ try {
57
+ const res = await fetch(`http://localhost:${port}/health`);
58
+ if (res.ok)
59
+ apiHealth = 'healthy';
60
+ }
61
+ catch {
62
+ // unreachable
63
+ }
64
+ // Check worker status
65
+ let workerStatus = 'not installed';
66
+ let workerPid = null;
67
+ if (existsSync(WORKER_PLIST_PATH)) {
68
+ try {
69
+ const output = execSync(`launchctl list ${WORKER_PLIST_LABEL} 2>/dev/null`, { encoding: 'utf-8' });
70
+ const pidMatch = output.match(/"PID"\s*=\s*(\d+)/);
71
+ const statusMatch = output.match(/"LastExitStatus"\s*=\s*(\d+)/);
72
+ if (pidMatch) {
73
+ workerPid = pidMatch[1];
74
+ workerStatus = 'running';
75
+ }
76
+ else if (statusMatch) {
77
+ workerStatus = statusMatch[1] === '0' ? 'stopped (clean exit)' : `stopped (exit code ${statusMatch[1]})`;
78
+ }
79
+ else {
80
+ workerStatus = 'loaded';
81
+ }
82
+ }
83
+ catch {
84
+ workerStatus = 'not loaded';
85
+ }
86
+ }
87
+ this.log(`API: ${launchdStatus}${pid ? ` (PID ${pid})` : ''} — ${apiHealth} (port ${port})`);
88
+ this.log(`Worker: ${workerStatus}${workerPid ? ` (PID ${workerPid})` : ''}`);
89
+ this.log(`Plist: ${PLIST_PATH}`);
90
+ this.log(` ${WORKER_PLIST_PATH}`);
91
+ this.log(`Logs: ${LOG_DIR}/{api,worker}-{stdout,stderr}.log`);
92
+ if (launchdStatus === 'running' && apiHealth === 'healthy' && workerStatus === 'running') {
93
+ this.log('');
94
+ this.log('All good — sessions tracked, jobs processed automatically.');
95
+ }
96
+ else {
97
+ this.log('');
98
+ if (launchdStatus !== 'running') {
99
+ this.log('API is not running. Try:');
100
+ this.log(' launchctl kickstart gui/$(id -u)/com.rulemetric.api');
101
+ }
102
+ if (workerStatus !== 'running' && workerStatus !== 'not installed') {
103
+ this.log('Worker is not running. Try:');
104
+ this.log(' launchctl kickstart gui/$(id -u)/com.rulemetric.worker');
105
+ }
106
+ if (workerStatus === 'not installed') {
107
+ this.log('Worker not installed. Run: rulemetric service install');
108
+ }
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/service/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class ServiceUninstall extends BaseCommand {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/service/uninstall.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,OAAgB,WAAW,SAAoD;IAEzE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoE3B"}
@@ -0,0 +1,84 @@
1
+ import { existsSync, unlinkSync } from 'node:fs';
2
+ import { execSync, execFileSync } from 'node:child_process';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { BaseCommand } from '../../base-command.js';
6
+ const PLIST_LABEL = 'com.rulemetric.api';
7
+ const PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${PLIST_LABEL}.plist`);
8
+ const WORKER_PLIST_LABEL = 'com.rulemetric.worker';
9
+ const WORKER_PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${WORKER_PLIST_LABEL}.plist`);
10
+ export default class ServiceUninstall extends BaseCommand {
11
+ static description = 'Remove the RuleMetric API service from launchd';
12
+ async run() {
13
+ if (process.platform !== 'darwin') {
14
+ this.error('Service uninstall is currently macOS-only.');
15
+ }
16
+ if (!existsSync(PLIST_PATH)) {
17
+ this.log('Service is not installed.');
18
+ return;
19
+ }
20
+ // Stop the service
21
+ const uid = execSync('id -u', { encoding: 'utf-8' }).trim();
22
+ try {
23
+ execFileSync('launchctl', ['bootout', `gui/${uid}`, PLIST_PATH], { encoding: 'utf-8' });
24
+ this.log('[OK] Service stopped');
25
+ }
26
+ catch (bootoutErr) {
27
+ try {
28
+ execFileSync('launchctl', ['unload', PLIST_PATH], { encoding: 'utf-8' });
29
+ this.log('[OK] Service stopped (legacy)');
30
+ }
31
+ catch {
32
+ // Verify it's actually stopped
33
+ try {
34
+ const output = execSync(`launchctl list ${PLIST_LABEL} 2>&1`, { encoding: 'utf-8' });
35
+ if (output.includes('PID')) {
36
+ this.warn('Service appears to still be running. Try manually:');
37
+ this.warn(` launchctl bootout gui/${uid} "${PLIST_PATH}"`);
38
+ }
39
+ else {
40
+ this.log('[OK] Service was not running');
41
+ }
42
+ }
43
+ catch {
44
+ this.log('[OK] Service was not running');
45
+ }
46
+ }
47
+ }
48
+ // Remove API plist
49
+ try {
50
+ unlinkSync(PLIST_PATH);
51
+ this.log(`[OK] Removed ${PLIST_PATH}`);
52
+ }
53
+ catch (err) {
54
+ this.error(`Could not remove plist: ${err.message}. Try: rm "${PLIST_PATH}"`);
55
+ }
56
+ // Stop and remove worker service
57
+ if (existsSync(WORKER_PLIST_PATH)) {
58
+ try {
59
+ execFileSync('launchctl', ['bootout', `gui/${uid}`, WORKER_PLIST_PATH], { encoding: 'utf-8' });
60
+ this.log('[OK] Worker service stopped');
61
+ }
62
+ catch {
63
+ try {
64
+ execFileSync('launchctl', ['unload', WORKER_PLIST_PATH], { encoding: 'utf-8' });
65
+ this.log('[OK] Worker service stopped (legacy)');
66
+ }
67
+ catch {
68
+ this.log('[OK] Worker service was not running');
69
+ }
70
+ }
71
+ try {
72
+ unlinkSync(WORKER_PLIST_PATH);
73
+ this.log(`[OK] Removed ${WORKER_PLIST_PATH}`);
74
+ }
75
+ catch {
76
+ this.warn(`Could not remove worker plist. Try: rm "${WORKER_PLIST_PATH}"`);
77
+ }
78
+ }
79
+ this.log('');
80
+ this.log('The API and worker will no longer start automatically.');
81
+ this.log('Use scripts/start.sh to run them manually when needed.');
82
+ }
83
+ }
84
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/service/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class SessionsAnalyze extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/commands/sessions/analyze.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,WAAW;IACtD,OAAgB,WAAW,SAAsC;IAEjE,OAAgB,QAAQ,WAEtB;IAEF,OAAgB,IAAI;;MAElB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB3B"}
@@ -0,0 +1,26 @@
1
+ import { Args } from '@oclif/core';
2
+ import { BaseCommand } from '../../base-command.js';
3
+ import { apiPost } from '../../lib/api-client.js';
4
+ import { validateUuid } from '../../lib/types.js';
5
+ export default class SessionsAnalyze extends BaseCommand {
6
+ static description = 'Trigger AI analysis on a session';
7
+ static examples = [
8
+ '<%= config.bin %> sessions analyze <session-id>',
9
+ ];
10
+ static args = {
11
+ id: Args.string({ description: 'Session ID', required: true }),
12
+ };
13
+ async run() {
14
+ const { args } = await this.parse(SessionsAnalyze);
15
+ this.requireAuth();
16
+ validateUuid(args.id, 'session ID');
17
+ this.log('Analyzing session...');
18
+ const result = await apiPost(`/api/sessions/${args.id}/analyze`, {});
19
+ this.log(`\nAdherence Score: ${result.adherenceScore}/100`);
20
+ this.log(`Summary: ${result.summary}`);
21
+ if (result.suggestions.length > 0) {
22
+ this.log(`\n${result.suggestions.length} suggestion(s) for instruction improvement.`);
23
+ }
24
+ }
25
+ }
26
+ //# sourceMappingURL=analyze.js.map