@rulemetric/cli 0.6.9 → 0.7.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 (288) hide show
  1. package/dist/base-command.js +4 -3
  2. package/dist/{chunk-SZ7VDCD6.js → chunk-2HK7RGZB.js} +22 -3
  3. package/dist/chunk-2HK7RGZB.js.map +7 -0
  4. package/dist/{chunk-RUCSRN7F.js → chunk-2ORJWTNZ.js} +2 -2
  5. package/dist/{chunk-SLL3OBKN.js → chunk-37LN5O7M.js} +2 -2
  6. package/dist/chunk-3S7223UR.js +81 -0
  7. package/dist/chunk-3S7223UR.js.map +7 -0
  8. package/dist/{chunk-DAJNO4OI.js → chunk-4LYCDS2N.js} +28 -16
  9. package/dist/chunk-4LYCDS2N.js.map +7 -0
  10. package/dist/{chunk-UPXIO7CG.js → chunk-4XAWK6S2.js} +8 -8
  11. package/dist/{chunk-QD6X4L4L.js → chunk-5BAOGNUH.js} +4 -4
  12. package/dist/chunk-5EDMGK3W.js +39 -0
  13. package/dist/chunk-5EDMGK3W.js.map +7 -0
  14. package/dist/{chunk-5ADHO5QF.js → chunk-6NBS5XFS.js} +6 -6
  15. package/dist/{chunk-BBLTN35F.js → chunk-7DULPSFU.js} +49 -20
  16. package/dist/chunk-7DULPSFU.js.map +7 -0
  17. package/dist/chunk-7LVVKQMZ.js +98 -0
  18. package/dist/chunk-7LVVKQMZ.js.map +7 -0
  19. package/dist/{chunk-PXVQLD7S.js → chunk-7NNFYWKK.js} +48 -1
  20. package/dist/chunk-7NNFYWKK.js.map +7 -0
  21. package/dist/{chunk-DTFXCHHI.js → chunk-DNKSVWMD.js} +4 -4
  22. package/dist/{chunk-CNMWYYSV.js → chunk-DUJSRBLP.js} +2 -2
  23. package/dist/chunk-EARWG4EV.js +22 -0
  24. package/dist/chunk-EARWG4EV.js.map +7 -0
  25. package/dist/{chunk-6EMZI4Y3.js → chunk-EI5BHWXA.js} +437 -401
  26. package/dist/chunk-EI5BHWXA.js.map +7 -0
  27. package/dist/{chunk-HNZLEEG2.js → chunk-EJ3YAFDP.js} +4 -4
  28. package/dist/{chunk-HNZLEEG2.js.map → chunk-EJ3YAFDP.js.map} +2 -2
  29. package/dist/{chunk-YSEQWCN4.js → chunk-EYPAAGN5.js} +2 -2
  30. package/dist/{chunk-JEJ3J5J6.js → chunk-GIUBARWS.js} +2 -2
  31. package/dist/chunk-GQNJO2P2.js +102 -0
  32. package/dist/chunk-GQNJO2P2.js.map +7 -0
  33. package/dist/chunk-ILYDELUE.js +46 -0
  34. package/dist/chunk-ILYDELUE.js.map +7 -0
  35. package/dist/chunk-J6QFW4LD.js +55 -0
  36. package/dist/chunk-J6QFW4LD.js.map +7 -0
  37. package/dist/{chunk-OTOWLUOJ.js → chunk-JULOLTZS.js} +2 -2
  38. package/dist/{chunk-DR5WLIOU.js → chunk-KJKBDQ4D.js} +2 -2
  39. package/dist/{chunk-XN23W5HL.js → chunk-LXKPNATC.js} +93 -7
  40. package/dist/chunk-LXKPNATC.js.map +7 -0
  41. package/dist/{chunk-N5A2IQAK.js → chunk-OK3I555A.js} +2 -2
  42. package/dist/{chunk-XNNOXGP6.js → chunk-OKWCKCPE.js} +38 -19
  43. package/dist/chunk-OKWCKCPE.js.map +7 -0
  44. package/dist/{chunk-AHDRN6NE.js → chunk-OO7JDFS4.js} +5 -5
  45. package/dist/{chunk-N2X35ITW.js → chunk-OQBBVTDG.js} +11 -1
  46. package/dist/{chunk-N2X35ITW.js.map → chunk-OQBBVTDG.js.map} +2 -2
  47. package/dist/{chunk-3QH73QOQ.js → chunk-PED7L5GX.js} +2 -2
  48. package/dist/{chunk-VBGUNFKY.js → chunk-PMI56ED5.js} +5 -5
  49. package/dist/{chunk-RCMXTLQF.js → chunk-RMTT4KDY.js} +2 -2
  50. package/dist/{chunk-W4MZXKZ2.js → chunk-UKMLICWS.js} +2 -2
  51. package/dist/{chunk-3POYC5NA.js → chunk-XK42ZBDE.js} +3 -3
  52. package/dist/{chunk-ZSGKRCKD.js → chunk-XUV6DDBF.js} +2 -2
  53. package/dist/{chunk-LAKZUE35.js → chunk-Y3WD5CSW.js} +2 -2
  54. package/dist/{chunk-3QVMIJUL.js → chunk-YOBA3NAM.js} +5 -5
  55. package/dist/{chunk-ZRLYHBPN.js → chunk-ZUJBM6HE.js} +20 -2
  56. package/dist/chunk-ZUJBM6HE.js.map +7 -0
  57. package/dist/commands/antigravity/backfill.js +5 -4
  58. package/dist/commands/antigravity/backfill.js.map +1 -1
  59. package/dist/commands/auth/create-key.js +4 -3
  60. package/dist/commands/auth/create-key.js.map +1 -1
  61. package/dist/commands/auth/login.js +13 -9
  62. package/dist/commands/auth/login.js.map +2 -2
  63. package/dist/commands/auth/logout.js +4 -3
  64. package/dist/commands/auth/logout.js.map +1 -1
  65. package/dist/commands/auth/revoke-key.js +4 -3
  66. package/dist/commands/auth/revoke-key.js.map +1 -1
  67. package/dist/commands/auth/signup.js +13 -9
  68. package/dist/commands/auth/signup.js.map +2 -2
  69. package/dist/commands/auth/status.js +4 -3
  70. package/dist/commands/auth/status.js.map +1 -1
  71. package/dist/commands/catalog/index.js +4 -3
  72. package/dist/commands/catalog/index.js.map +1 -1
  73. package/dist/commands/catalog/recommend.js +4 -3
  74. package/dist/commands/catalog/recommend.js.map +1 -1
  75. package/dist/commands/convert.js +4 -3
  76. package/dist/commands/convert.js.map +1 -1
  77. package/dist/commands/converters.js +4 -3
  78. package/dist/commands/converters.js.map +1 -1
  79. package/dist/commands/crons/list.js +4 -3
  80. package/dist/commands/crons/list.js.map +1 -1
  81. package/dist/commands/crons/run.js +4 -3
  82. package/dist/commands/crons/run.js.map +1 -1
  83. package/dist/commands/dashboard.js +4 -3
  84. package/dist/commands/dashboard.js.map +1 -1
  85. package/dist/commands/diagnostics.js +117 -0
  86. package/dist/commands/diagnostics.js.map +7 -0
  87. package/dist/commands/eval-targets/create.js +4 -3
  88. package/dist/commands/eval-targets/create.js.map +1 -1
  89. package/dist/commands/eval-targets/list.js +4 -3
  90. package/dist/commands/eval-targets/list.js.map +1 -1
  91. package/dist/commands/evals/agent.js +41 -20
  92. package/dist/commands/evals/agent.js.map +2 -2
  93. package/dist/commands/evals/benchmark.js +5 -4
  94. package/dist/commands/evals/benchmark.js.map +1 -1
  95. package/dist/commands/evals/compare.js +4 -3
  96. package/dist/commands/evals/compare.js.map +1 -1
  97. package/dist/commands/evals/create.js +4 -3
  98. package/dist/commands/evals/create.js.map +1 -1
  99. package/dist/commands/evals/optimize-description.js +4 -3
  100. package/dist/commands/evals/optimize-description.js.map +1 -1
  101. package/dist/commands/evals/optimize.js +4 -3
  102. package/dist/commands/evals/optimize.js.map +1 -1
  103. package/dist/commands/evals/run.js +4 -3
  104. package/dist/commands/evals/run.js.map +1 -1
  105. package/dist/commands/gateway/ensure.js +75 -5
  106. package/dist/commands/gateway/ensure.js.map +2 -2
  107. package/dist/commands/hooks/install.js +76 -23
  108. package/dist/commands/hooks/install.js.map +2 -2
  109. package/dist/commands/hooks/run.js +4 -3
  110. package/dist/commands/hooks/run.js.map +1 -1
  111. package/dist/commands/hooks/uninstall.js +31 -40
  112. package/dist/commands/hooks/uninstall.js.map +2 -2
  113. package/dist/commands/import.js +4 -3
  114. package/dist/commands/import.js.map +1 -1
  115. package/dist/commands/instructions/create.js +4 -3
  116. package/dist/commands/instructions/create.js.map +1 -1
  117. package/dist/commands/instructions/delete.js +4 -3
  118. package/dist/commands/instructions/delete.js.map +1 -1
  119. package/dist/commands/instructions/fork.js +4 -3
  120. package/dist/commands/instructions/fork.js.map +1 -1
  121. package/dist/commands/instructions/get.js +4 -3
  122. package/dist/commands/instructions/get.js.map +1 -1
  123. package/dist/commands/instructions/list.js +4 -3
  124. package/dist/commands/instructions/list.js.map +1 -1
  125. package/dist/commands/instructions/promote.js +4 -3
  126. package/dist/commands/instructions/promote.js.map +1 -1
  127. package/dist/commands/instructions/pull.js +4 -3
  128. package/dist/commands/instructions/pull.js.map +1 -1
  129. package/dist/commands/instructions/upstream.js +4 -3
  130. package/dist/commands/instructions/upstream.js.map +1 -1
  131. package/dist/commands/instructions/versions.js +4 -3
  132. package/dist/commands/instructions/versions.js.map +1 -1
  133. package/dist/commands/launcher.js +4 -3
  134. package/dist/commands/launcher.js.map +1 -1
  135. package/dist/commands/org/current.js +4 -3
  136. package/dist/commands/org/current.js.map +1 -1
  137. package/dist/commands/org/list.js +4 -3
  138. package/dist/commands/org/list.js.map +1 -1
  139. package/dist/commands/org/switch.js +4 -3
  140. package/dist/commands/org/switch.js.map +1 -1
  141. package/dist/commands/packs/add-instruction.js +4 -3
  142. package/dist/commands/packs/add-instruction.js.map +1 -1
  143. package/dist/commands/packs/apply.js +4 -3
  144. package/dist/commands/packs/apply.js.map +1 -1
  145. package/dist/commands/packs/create.js +4 -3
  146. package/dist/commands/packs/create.js.map +1 -1
  147. package/dist/commands/packs/fork.js +4 -3
  148. package/dist/commands/packs/fork.js.map +1 -1
  149. package/dist/commands/packs/get.js +4 -3
  150. package/dist/commands/packs/get.js.map +1 -1
  151. package/dist/commands/packs/list.js +4 -3
  152. package/dist/commands/packs/list.js.map +1 -1
  153. package/dist/commands/packs/remove-instruction.js +4 -3
  154. package/dist/commands/packs/remove-instruction.js.map +1 -1
  155. package/dist/commands/proxy/env.js +7 -4
  156. package/dist/commands/proxy/env.js.map +1 -1
  157. package/dist/commands/proxy/logs.js +4 -3
  158. package/dist/commands/proxy/logs.js.map +1 -1
  159. package/dist/commands/proxy/restart.js +4 -3
  160. package/dist/commands/proxy/restart.js.map +1 -1
  161. package/dist/commands/proxy/setup.js +20 -14
  162. package/dist/commands/proxy/setup.js.map +2 -2
  163. package/dist/commands/proxy/start.js +29 -15
  164. package/dist/commands/proxy/start.js.map +2 -2
  165. package/dist/commands/proxy/status.js +16 -13
  166. package/dist/commands/proxy/status.js.map +2 -2
  167. package/dist/commands/proxy/stop.js +21 -12
  168. package/dist/commands/proxy/stop.js.map +2 -2
  169. package/dist/commands/research/backfill.js +5 -4
  170. package/dist/commands/research/backfill.js.map +1 -1
  171. package/dist/commands/research/tail-transcript.js +5 -4
  172. package/dist/commands/research/tail-transcript.js.map +1 -1
  173. package/dist/commands/service/install.js +6 -6
  174. package/dist/commands/service/status.js +4 -3
  175. package/dist/commands/service/status.js.map +1 -1
  176. package/dist/commands/service/uninstall.js +4 -3
  177. package/dist/commands/service/uninstall.js.map +1 -1
  178. package/dist/commands/sessions/analyze.js +4 -3
  179. package/dist/commands/sessions/analyze.js.map +1 -1
  180. package/dist/commands/sessions/end.js +4 -3
  181. package/dist/commands/sessions/end.js.map +1 -1
  182. package/dist/commands/sessions/import.js +4 -3
  183. package/dist/commands/sessions/import.js.map +1 -1
  184. package/dist/commands/sessions/list.js +4 -3
  185. package/dist/commands/sessions/list.js.map +1 -1
  186. package/dist/commands/sessions/start.js +4 -3
  187. package/dist/commands/sessions/start.js.map +1 -1
  188. package/dist/commands/setup.js +10 -6
  189. package/dist/commands/setup.js.map +1 -1
  190. package/dist/commands/skills/export-approved.js +4 -3
  191. package/dist/commands/skills/export-approved.js.map +1 -1
  192. package/dist/commands/skills/install.js +4 -3
  193. package/dist/commands/skills/install.js.map +1 -1
  194. package/dist/commands/skills/list.js +4 -3
  195. package/dist/commands/skills/list.js.map +1 -1
  196. package/dist/commands/skills/publish.js +4 -3
  197. package/dist/commands/skills/publish.js.map +1 -1
  198. package/dist/commands/skills/search.js +4 -3
  199. package/dist/commands/skills/search.js.map +1 -1
  200. package/dist/commands/skills/update.js +4 -3
  201. package/dist/commands/skills/update.js.map +1 -1
  202. package/dist/commands/suggestions/accept.js +4 -3
  203. package/dist/commands/suggestions/accept.js.map +1 -1
  204. package/dist/commands/suggestions/dismiss.js +4 -3
  205. package/dist/commands/suggestions/dismiss.js.map +1 -1
  206. package/dist/commands/suggestions/list.js +4 -3
  207. package/dist/commands/suggestions/list.js.map +1 -1
  208. package/dist/commands/suggestions/refresh.js +4 -3
  209. package/dist/commands/suggestions/refresh.js.map +1 -1
  210. package/dist/dashboard/Dashboard.js +16 -16
  211. package/dist/dashboard/data.js +2 -2
  212. package/dist/dashboard/launcher/ActiveJobsList.js +2 -2
  213. package/dist/dashboard/launcher/LauncherOverlay.js +7 -7
  214. package/dist/dashboard/launcher/NewLaunchForm.js +2 -2
  215. package/dist/dashboard/launcher/api.js +2 -2
  216. package/dist/dashboard/launcher/useLaunchJobs.js +3 -3
  217. package/dist/lib/active-org-refresh.js +2 -2
  218. package/dist/lib/agent-loop.js +19 -17
  219. package/dist/lib/antigravity-transcript.js +2 -2
  220. package/dist/lib/api-client.js +1 -1
  221. package/dist/lib/capture-hosts.js +8 -0
  222. package/dist/lib/capture-hosts.js.map +7 -0
  223. package/dist/lib/diagnostics.js +12 -0
  224. package/dist/lib/diagnostics.js.map +7 -0
  225. package/dist/lib/editor-proxy-pins.js +14 -0
  226. package/dist/lib/editor-proxy-pins.js.map +7 -0
  227. package/dist/lib/ensure-api-key.js +3 -3
  228. package/dist/lib/eval-benchmark.js +2 -2
  229. package/dist/lib/eval-conversation-handler.js +2 -2
  230. package/dist/lib/gateway-entry.js +39 -1
  231. package/dist/lib/gateway-entry.js.map +2 -2
  232. package/dist/lib/gateway-identity.js +16 -0
  233. package/dist/lib/gateway-identity.js.map +7 -0
  234. package/dist/lib/gateway-lifecycle.js +9 -3
  235. package/dist/lib/gateway.js +3 -1
  236. package/dist/lib/handlers/cron-suggest-instructions.js +3 -3
  237. package/dist/lib/handlers/process-announcement.js +3 -3
  238. package/dist/lib/handlers/process-changelog.js +2 -2
  239. package/dist/lib/handlers/process-conversation.js +3 -3
  240. package/dist/lib/handlers/process-eval.js +2 -2
  241. package/dist/lib/handlers/process-insights.js +2 -2
  242. package/dist/lib/handlers/process-launch.js +2 -2
  243. package/dist/lib/handlers/process-run-cleanup.js +2 -2
  244. package/dist/lib/handlers/process-session-goal.js +2 -2
  245. package/dist/lib/hooks-config.js +18 -1
  246. package/dist/lib/manual-tasks.js +5 -5
  247. package/dist/lib/pid-identity.js +14 -0
  248. package/dist/lib/pid-identity.js.map +7 -0
  249. package/dist/lib/proxy-respawn.js +12 -0
  250. package/dist/lib/proxy-respawn.js.map +7 -0
  251. package/dist/lib/research-client.js +2 -2
  252. package/dist/lib/setup-steps.js +7 -4
  253. package/dist/lib/statusline-shim.js +3 -1
  254. package/dist/lib/telemetry.js +4 -2
  255. package/dist/lib/terminal-target-heartbeat.js +2 -2
  256. package/oclif.manifest.json +34 -1
  257. package/package.json +4 -4
  258. package/dist/chunk-6EMZI4Y3.js.map +0 -7
  259. package/dist/chunk-BBLTN35F.js.map +0 -7
  260. package/dist/chunk-DAJNO4OI.js.map +0 -7
  261. package/dist/chunk-PXVQLD7S.js.map +0 -7
  262. package/dist/chunk-SZ7VDCD6.js.map +0 -7
  263. package/dist/chunk-TX2HKJLA.js +0 -55
  264. package/dist/chunk-TX2HKJLA.js.map +0 -7
  265. package/dist/chunk-XN23W5HL.js.map +0 -7
  266. package/dist/chunk-XNNOXGP6.js.map +0 -7
  267. package/dist/chunk-ZRLYHBPN.js.map +0 -7
  268. /package/dist/{chunk-RUCSRN7F.js.map → chunk-2ORJWTNZ.js.map} +0 -0
  269. /package/dist/{chunk-SLL3OBKN.js.map → chunk-37LN5O7M.js.map} +0 -0
  270. /package/dist/{chunk-UPXIO7CG.js.map → chunk-4XAWK6S2.js.map} +0 -0
  271. /package/dist/{chunk-QD6X4L4L.js.map → chunk-5BAOGNUH.js.map} +0 -0
  272. /package/dist/{chunk-5ADHO5QF.js.map → chunk-6NBS5XFS.js.map} +0 -0
  273. /package/dist/{chunk-DTFXCHHI.js.map → chunk-DNKSVWMD.js.map} +0 -0
  274. /package/dist/{chunk-CNMWYYSV.js.map → chunk-DUJSRBLP.js.map} +0 -0
  275. /package/dist/{chunk-YSEQWCN4.js.map → chunk-EYPAAGN5.js.map} +0 -0
  276. /package/dist/{chunk-JEJ3J5J6.js.map → chunk-GIUBARWS.js.map} +0 -0
  277. /package/dist/{chunk-OTOWLUOJ.js.map → chunk-JULOLTZS.js.map} +0 -0
  278. /package/dist/{chunk-DR5WLIOU.js.map → chunk-KJKBDQ4D.js.map} +0 -0
  279. /package/dist/{chunk-N5A2IQAK.js.map → chunk-OK3I555A.js.map} +0 -0
  280. /package/dist/{chunk-AHDRN6NE.js.map → chunk-OO7JDFS4.js.map} +0 -0
  281. /package/dist/{chunk-3QH73QOQ.js.map → chunk-PED7L5GX.js.map} +0 -0
  282. /package/dist/{chunk-VBGUNFKY.js.map → chunk-PMI56ED5.js.map} +0 -0
  283. /package/dist/{chunk-RCMXTLQF.js.map → chunk-RMTT4KDY.js.map} +0 -0
  284. /package/dist/{chunk-W4MZXKZ2.js.map → chunk-UKMLICWS.js.map} +0 -0
  285. /package/dist/{chunk-3POYC5NA.js.map → chunk-XK42ZBDE.js.map} +0 -0
  286. /package/dist/{chunk-ZSGKRCKD.js.map → chunk-XUV6DDBF.js.map} +0 -0
  287. /package/dist/{chunk-LAKZUE35.js.map → chunk-Y3WD5CSW.js.map} +0 -0
  288. /package/dist/{chunk-3QVMIJUL.js.map → chunk-YOBA3NAM.js.map} +0 -0
@@ -2,18 +2,18 @@ import {
2
2
  detectTmux
3
3
  } from "../../chunk-BO76WKJR.js";
4
4
  import "../../chunk-KRBQLMOP.js";
5
- import {
6
- emitSetupEvent
7
- } from "../../chunk-TX2HKJLA.js";
8
5
  import {
9
6
  BaseCommand
10
- } from "../../chunk-SZ7VDCD6.js";
7
+ } from "../../chunk-2HK7RGZB.js";
11
8
  import "../../chunk-R56PH7YE.js";
9
+ import {
10
+ emitSetupEvent
11
+ } from "../../chunk-GQNJO2P2.js";
12
12
  import {
13
13
  bootstrapActiveOrg
14
- } from "../../chunk-SLL3OBKN.js";
14
+ } from "../../chunk-37LN5O7M.js";
15
15
  import "../../chunk-EKJ2CABV.js";
16
- import "../../chunk-ZRLYHBPN.js";
16
+ import "../../chunk-ZUJBM6HE.js";
17
17
  import "../../chunk-W2YERO7E.js";
18
18
  import "../../chunk-NSBPE2FW.js";
19
19
 
@@ -4,11 +4,12 @@ import {
4
4
  import "../../chunk-KRBQLMOP.js";
5
5
  import {
6
6
  BaseCommand
7
- } from "../../chunk-SZ7VDCD6.js";
7
+ } from "../../chunk-2HK7RGZB.js";
8
8
  import "../../chunk-R56PH7YE.js";
9
- import "../../chunk-SLL3OBKN.js";
9
+ import "../../chunk-GQNJO2P2.js";
10
+ import "../../chunk-37LN5O7M.js";
10
11
  import "../../chunk-EKJ2CABV.js";
11
- import "../../chunk-ZRLYHBPN.js";
12
+ import "../../chunk-ZUJBM6HE.js";
12
13
  import "../../chunk-W2YERO7E.js";
13
14
  import "../../chunk-NSBPE2FW.js";
14
15
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/service/status.ts"],
4
4
  "sourcesContent": ["import { existsSync, readFileSync } from 'node:fs';\nimport { execFileSync, execSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\nimport { detectTmux } from '../../lib/detect-tmux.js';\n\nconst PLIST_LABEL = 'com.rulemetric.api';\nconst PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${PLIST_LABEL}.plist`);\nconst WORKER_PLIST_LABEL = 'com.rulemetric.worker';\nconst WORKER_PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${WORKER_PLIST_LABEL}.plist`);\nconst GATEWAY_PLIST_LABEL = 'com.rulemetric.gateway';\nconst GATEWAY_PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${GATEWAY_PLIST_LABEL}.plist`);\nconst PROXY_PLIST_LABEL = 'com.rulemetric.proxy';\nconst PROXY_PLIST_PATH = join(homedir(), 'Library', 'LaunchAgents', `${PROXY_PLIST_LABEL}.plist`);\nconst LOG_DIR = join(homedir(), '.config', 'rulemetric', 'logs');\nconst GATEWAY_PORT = 8787;\nconst PROXY_PORT = 8788;\n\ninterface ServiceState {\n installed: boolean;\n launchdStatus: string;\n pid: string | null;\n}\n\nexport default class ServiceStatus extends BaseCommand {\n static override description = 'Check the status of all RuleMetric launchd services';\n\n async run(): Promise<void> {\n if (process.platform !== 'darwin') {\n this.error('Service status is currently macOS-only.');\n }\n\n // Nothing installed at all \u2014 short-circuit with install hint.\n if (!existsSync(PLIST_PATH)) {\n this.log('Service: not installed');\n this.log('Run: rulemetric service install');\n return;\n }\n\n // \u2500\u2500 API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const apiState = this.readServiceState(PLIST_LABEL, PLIST_PATH);\n const apiPort = this.readApiPort(PLIST_PATH);\n const apiHealth = await this.probeApiHealth(apiPort);\n const dashboardServed = await this.probeDashboard(apiPort);\n\n // \u2500\u2500 Worker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const workerState = this.readServiceState(WORKER_PLIST_LABEL, WORKER_PLIST_PATH);\n const workerMode = this.readWorkerMode();\n\n // \u2500\u2500 Gateway \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const gatewayState = this.readServiceState(GATEWAY_PLIST_LABEL, GATEWAY_PLIST_PATH);\n const gatewayListening = this.isPortListening(GATEWAY_PORT);\n\n // \u2500\u2500 Proxy \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const proxyState = this.readServiceState(PROXY_PLIST_LABEL, PROXY_PLIST_PATH);\n const proxyListening = this.isPortListening(PROXY_PORT);\n\n // \u2500\u2500 Render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const apiDetail = `${apiHealth} (port ${apiPort})${dashboardServed ? ' \u2014 dashboard served' : ''}`;\n this.log(`API: ${this.fmtState(apiState)} \u2014 ${apiDetail}`);\n // Post-Phase 4c there's only one mode (agent). Loudly flag any stale\n // plist still pointing at the (now-deleted) `evals listen` command \u2014\n // it would crash-loop. Operator needs to re-run `service install`.\n const modeSuffix = workerMode === 'listen'\n ? ' [mode: listen \u2014 DEPRECATED, run `rulemetric service install --force` to upgrade]'\n : '';\n this.log(`Worker: ${this.fmtState(workerState)}${modeSuffix}`);\n this.log(`Gateway: ${this.fmtState(gatewayState)} \u2014 ${gatewayListening ? `listening :${GATEWAY_PORT}` : `NOT listening :${GATEWAY_PORT}`}`);\n this.log(`Proxy: ${this.fmtState(proxyState)} \u2014 ${proxyListening ? `listening :${PROXY_PORT}` : `NOT listening :${PROXY_PORT}`}`);\n\n const tmux = await detectTmux();\n this.log(`Tmux: ${tmux.available ? (tmux.version ? `v${tmux.version}` : 'available') : 'not found'}`);\n this.log('');\n this.log(`Plists: ${PLIST_PATH}`);\n this.log(` ${WORKER_PLIST_PATH}`);\n if (gatewayState.installed) this.log(` ${GATEWAY_PLIST_PATH}`);\n if (proxyState.installed) this.log(` ${PROXY_PLIST_PATH}`);\n this.log(`Logs: ${LOG_DIR}/{api,worker,gateway,proxy}-{stdout,stderr}.log`);\n\n const allHealthy =\n apiState.launchdStatus === 'running' &&\n apiHealth === 'healthy' &&\n workerState.launchdStatus === 'running' &&\n (!gatewayState.installed || (gatewayState.launchdStatus === 'running' && gatewayListening)) &&\n (!proxyState.installed || (proxyState.launchdStatus === 'running' && proxyListening));\n\n this.log('');\n if (allHealthy) {\n this.log('All good \u2014 sessions tracked, jobs processed, capture pipeline live.');\n } else {\n if (apiState.launchdStatus !== 'running') {\n this.log('API is not running. Try:');\n this.log(` launchctl kickstart gui/$(id -u)/${PLIST_LABEL}`);\n }\n if (workerState.installed && workerState.launchdStatus !== 'running') {\n this.log('Worker is not running. Try:');\n this.log(` launchctl kickstart gui/$(id -u)/${WORKER_PLIST_LABEL}`);\n }\n if (gatewayState.installed && (gatewayState.launchdStatus !== 'running' || !gatewayListening)) {\n this.log('Gateway is not running. Try:');\n this.log(` launchctl kickstart gui/$(id -u)/${GATEWAY_PLIST_LABEL}`);\n }\n if (proxyState.installed && (proxyState.launchdStatus !== 'running' || !proxyListening)) {\n this.log('Proxy is not running. Try:');\n this.log(` launchctl kickstart gui/$(id -u)/${PROXY_PLIST_LABEL}`);\n }\n if (!gatewayState.installed || !proxyState.installed) {\n this.log('Gateway/proxy not installed. Run: rulemetric service install --force');\n }\n }\n }\n\n private readServiceState(label: string, plistPath: string): ServiceState {\n const installed = existsSync(plistPath);\n if (!installed) {\n return { installed: false, launchdStatus: 'not installed', pid: null };\n }\n try {\n const output = execSync(`launchctl list ${label} 2>/dev/null`, { encoding: 'utf-8' });\n const pidMatch = output.match(/\"PID\"\\s*=\\s*(\\d+)/);\n const statusMatch = output.match(/\"LastExitStatus\"\\s*=\\s*(\\d+)/);\n if (pidMatch) {\n return { installed: true, launchdStatus: 'running', pid: pidMatch[1] };\n }\n if (statusMatch) {\n const code = statusMatch[1];\n return {\n installed: true,\n launchdStatus: code === '0' ? 'stopped (clean exit)' : `stopped (exit ${code})`,\n pid: null,\n };\n }\n return { installed: true, launchdStatus: 'loaded', pid: null };\n } catch {\n return { installed: true, launchdStatus: 'not loaded', pid: null };\n }\n }\n\n private fmtState(state: ServiceState): string {\n if (!state.installed) return 'not installed';\n return `${state.launchdStatus}${state.pid ? ` (PID ${state.pid})` : ''}`;\n }\n\n private readApiPort(plistPath: string): number {\n try {\n const plistContent = readFileSync(plistPath, 'utf-8');\n const portMatch = plistContent.match(/<key>PORT<\\/key>\\s*<string>(\\d+)<\\/string>/);\n if (portMatch) return Number.parseInt(portMatch[1]);\n } catch {\n // fall through to default\n }\n return 3000;\n }\n\n // Returns 'agent' | 'listen' | null. Used to flag the stale Phase 4c\n // mode where the plist still says `evals listen` and would crash-loop.\n private readWorkerMode(): 'agent' | 'listen' | null {\n if (!existsSync(WORKER_PLIST_PATH)) return null;\n try {\n const plistContent = readFileSync(WORKER_PLIST_PATH, 'utf-8');\n const match = plistContent.match(/<string>evals<\\/string>\\s*<string>(listen|agent)<\\/string>/);\n if (match) return match[1] as 'agent' | 'listen';\n } catch {\n // Best-effort\n }\n return null;\n }\n\n private async probeApiHealth(port: number): Promise<string> {\n try {\n const res = await fetch(`http://localhost:${port}/health`);\n if (res.ok) return 'healthy';\n return `unhealthy (${res.status})`;\n } catch {\n return 'unreachable';\n }\n }\n\n // Probe `/` on the API. Returns true if it serves HTML (= web bundle\n // is mounted). Differentiates \"API runs but dashboard 404s because\n // apps/web/dist is missing\" from \"API serves dashboard properly\".\n private async probeDashboard(port: number): Promise<boolean> {\n try {\n const res = await fetch(`http://localhost:${port}/`);\n if (!res.ok) return false;\n const contentType = res.headers.get('content-type') ?? '';\n return contentType.includes('text/html');\n } catch {\n return false;\n }\n }\n\n private isPortListening(port: number): boolean {\n try {\n const out = execFileSync('lsof', ['-ti', `:${port}`, '-sTCP:LISTEN'], {\n encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'],\n });\n return out.trim().length > 0;\n } catch {\n return false;\n }\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import "../../chunk-EKJ2CABV.js";
7
- import "../../chunk-ZRLYHBPN.js";
8
+ import "../../chunk-ZUJBM6HE.js";
8
9
  import "../../chunk-W2YERO7E.js";
9
10
  import "../../chunk-NSBPE2FW.js";
10
11
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/service/uninstall.ts"],
4
4
  "sourcesContent": ["import { existsSync, unlinkSync } from 'node:fs';\nimport { execSync, execFileSync } from 'node:child_process';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\n\n// Every plist label that `service install` may have written. Keeping these in\n// one ordered list lets uninstall march through them with the same teardown\n// logic; if install ever adds a fifth service, this is the only file that\n// needs to learn about it.\nconst SERVICES: Array<{ label: string; description: string }> = [\n { label: 'com.rulemetric.api', description: 'API' },\n { label: 'com.rulemetric.worker', description: 'Worker' },\n { label: 'com.rulemetric.gateway', description: 'Gateway' },\n { label: 'com.rulemetric.proxy', description: 'Proxy' },\n // Legacy daily worker-restart agent \u2014 install removes any stale copy,\n // but uninstall still cleans it up so a user running uninstall on an\n // older box gets a fully clean state.\n { label: 'com.rulemetric.worker.restart', description: 'Worker restart agent' },\n];\n\nfunction plistPathFor(label: string): string {\n return join(homedir(), 'Library', 'LaunchAgents', `${label}.plist`);\n}\n\n// Linux systemd --user unit written by `service install --worker-only`. Kept in\n// sync with the constants in install.ts.\nconst WORKER_SYSTEMD_UNIT = 'rulemetric-worker.service';\nconst WORKER_SYSTEMD_PATH = join(homedir(), '.config', 'systemd', 'user', WORKER_SYSTEMD_UNIT);\n\nexport default class ServiceUninstall extends BaseCommand {\n static override description = 'Remove RuleMetric services (macOS launchd: API/worker/gateway/proxy; Linux: the --worker-only systemd unit)';\n\n async run(): Promise<void> {\n // Linux: only the worker-only systemd unit can exist here.\n if (process.platform === 'linux') {\n this.uninstallLinuxWorker();\n return;\n }\n if (process.platform !== 'darwin') {\n this.error('Service uninstall supports macOS (launchd) and Linux (systemd) only.');\n }\n\n const installed = SERVICES.filter((s) => existsSync(plistPathFor(s.label)));\n if (installed.length === 0) {\n this.log('No RuleMetric services are installed.');\n return;\n }\n\n const uid = execSync('id -u', { encoding: 'utf-8' }).trim();\n\n for (const svc of installed) {\n const path = plistPathFor(svc.label);\n this.stopService(uid, path, svc.label, svc.description);\n this.removePlist(path, svc.description);\n }\n\n this.log('');\n this.log('All RuleMetric services removed. They will no longer start automatically.');\n this.log('Use scripts/start.sh (dev) or `rulemetric service install` (always-on) to bring them back.');\n }\n\n private stopService(uid: string, plistPath: string, label: string, description: string): void {\n try {\n execFileSync('launchctl', ['bootout', `gui/${uid}`, plistPath], { encoding: 'utf-8' });\n this.log(`[OK] ${description} stopped`);\n return;\n } catch {\n // Fall through to legacy unload\n }\n try {\n execFileSync('launchctl', ['unload', plistPath], { encoding: 'utf-8' });\n this.log(`[OK] ${description} stopped (legacy)`);\n return;\n } catch {\n // Verify whether it's actually running. launchctl list returns the\n // current state; if there's no PID, the service wasn't running and\n // both bootout/unload no-op'd legitimately.\n try {\n const output = execSync(`launchctl list ${label} 2>&1`, { encoding: 'utf-8' });\n if (output.includes('PID')) {\n this.warn(`${description} appears to still be running. Try manually:`);\n this.warn(` launchctl bootout gui/${uid} \"${plistPath}\"`);\n } else {\n this.log(`[OK] ${description} was not running`);\n }\n } catch {\n this.log(`[OK] ${description} was not running`);\n }\n }\n }\n\n private removePlist(plistPath: string, description: string): void {\n try {\n unlinkSync(plistPath);\n this.log(`[OK] Removed ${plistPath}`);\n } catch (err) {\n this.warn(`Could not remove ${description} plist: ${(err as Error).message}. Try: rm \"${plistPath}\"`);\n }\n }\n\n private uninstallLinuxWorker(): void {\n if (!existsSync(WORKER_SYSTEMD_PATH)) {\n this.log('No RuleMetric worker is installed (no systemd unit found).');\n return;\n }\n try {\n execFileSync('systemctl', ['--user', 'disable', '--now', WORKER_SYSTEMD_UNIT], { encoding: 'utf-8' });\n this.log('[OK] Worker stopped + disabled (systemctl --user)');\n } catch (err) {\n this.warn(`Could not disable the worker unit: ${(err as Error).message}`);\n this.warn(` systemctl --user disable --now ${WORKER_SYSTEMD_UNIT}`);\n }\n try {\n unlinkSync(WORKER_SYSTEMD_PATH);\n this.log(`[OK] Removed ${WORKER_SYSTEMD_PATH}`);\n } catch (err) {\n this.warn(`Could not remove ${WORKER_SYSTEMD_PATH}: ${(err as Error).message}. Try: rm \"${WORKER_SYSTEMD_PATH}\"`);\n }\n try {\n execFileSync('systemctl', ['--user', 'daemon-reload'], { encoding: 'utf-8' });\n } catch {\n // best-effort\n }\n this.log('');\n this.log('RuleMetric worker removed. It will no longer start automatically.');\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,13 +3,14 @@ import {
3
3
  } from "../../chunk-7NYKWN7U.js";
4
4
  import {
5
5
  BaseCommand
6
- } from "../../chunk-SZ7VDCD6.js";
6
+ } from "../../chunk-2HK7RGZB.js";
7
7
  import "../../chunk-R56PH7YE.js";
8
- import "../../chunk-SLL3OBKN.js";
8
+ import "../../chunk-GQNJO2P2.js";
9
+ import "../../chunk-37LN5O7M.js";
9
10
  import "../../chunk-EKJ2CABV.js";
10
11
  import {
11
12
  apiPost
12
- } from "../../chunk-ZRLYHBPN.js";
13
+ } from "../../chunk-ZUJBM6HE.js";
13
14
  import "../../chunk-W2YERO7E.js";
14
15
  import "../../chunk-NSBPE2FW.js";
15
16
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/sessions/analyze.ts"],
4
4
  "sourcesContent": ["import { Args } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\nimport { validateUuid } from '../../lib/types.js';\n\nexport default class SessionsAnalyze extends BaseCommand {\n static override description = 'Trigger AI analysis on a session';\n\n static override examples = [\n '<%= config.bin %> sessions analyze <session-id>',\n ];\n\n static override args = {\n id: Args.string({ description: 'Session ID', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(SessionsAnalyze);\n this.requireAuth();\n validateUuid(args.id, 'session ID');\n\n this.log('Analyzing session...');\n const result = await apiPost<{ adherenceScore: number; summary: string; suggestions: unknown[] }>(\n `/api/sessions/${args.id}/analyze`,\n {},\n );\n\n this.log(`\\nAdherence Score: ${result.adherenceScore}/100`);\n this.log(`Summary: ${result.summary}`);\n if (result.suggestions.length > 0) {\n this.log(`\\n${result.suggestions.length} suggestion(s) for instruction improvement.`);\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAKrB,IAAqB,kBAArB,MAAqB,yBAAwB,YAAY;AAAA,EACvD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,cAAc,UAAU,KAAK,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,gBAAe;AACjD,SAAK,YAAY;AACjB,iBAAa,KAAK,IAAI,YAAY;AAElC,SAAK,IAAI,sBAAsB;AAC/B,UAAM,SAAS,MAAM;AAAA,MACnB,iBAAiB,KAAK,EAAE;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,SAAK,IAAI;AAAA,mBAAsB,OAAO,cAAc,MAAM;AAC1D,SAAK,IAAI,YAAY,OAAO,OAAO,EAAE;AACrC,QAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAK,IAAI;AAAA,EAAK,OAAO,YAAY,MAAM,6CAA6C;AAAA,IACtF;AAAA,EACF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAKrB,IAAqB,kBAArB,MAAqB,yBAAwB,YAAY;AAAA,EACvD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,cAAc,UAAU,KAAK,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,gBAAe;AACjD,SAAK,YAAY;AACjB,iBAAa,KAAK,IAAI,YAAY;AAElC,SAAK,IAAI,sBAAsB;AAC/B,UAAM,SAAS,MAAM;AAAA,MACnB,iBAAiB,KAAK,EAAE;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,SAAK,IAAI;AAAA,mBAAsB,OAAO,cAAc,MAAM;AAC1D,SAAK,IAAI,YAAY,OAAO,OAAO,EAAE;AACrC,QAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAK,IAAI;AAAA,EAAK,OAAO,YAAY,MAAM,6CAA6C;AAAA,IACtF;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import "../../chunk-EKJ2CABV.js";
7
8
  import {
8
9
  apiPatch
9
- } from "../../chunk-ZRLYHBPN.js";
10
+ } from "../../chunk-ZUJBM6HE.js";
10
11
  import "../../chunk-W2YERO7E.js";
11
12
  import "../../chunk-NSBPE2FW.js";
12
13
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/sessions/end.ts"],
4
4
  "sourcesContent": ["import { BaseCommand } from '../../base-command.js';\nimport { apiPatch } from '../../lib/api-client.js';\nimport { readdirSync, readFileSync, unlinkSync, statSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\n\nconst SKIP_SUFFIXES = ['.log', '.seq', '.ctxhash', '.pid', '.lock'];\n\ninterface SessionFile {\n externalId: string;\n rwSessionId: string;\n path: string;\n mtime: number;\n}\n\nexport default class SessionsEnd extends BaseCommand {\n static override description = 'End the active capture session';\n\n static override examples = [\n '<%= config.bin %> sessions end',\n ];\n\n async run(): Promise<void> {\n await this.parse(SessionsEnd);\n this.requireAuth();\n\n const sessionDir = join(tmpdir(), 'rulemetric');\n const active = this.findActiveSession(sessionDir);\n\n if (!active) {\n this.error('No active session found. Start one with: rulemetric sessions start --tool <name>');\n }\n\n // End session via API\n try {\n await apiPatch<unknown>(`/api/sessions/${active.rwSessionId}`, {\n endedAt: new Date().toISOString(),\n });\n } catch (err) {\n this.warn(`Could not end session via API: ${(err as Error).message}`);\n }\n\n // Clean up temp files\n this.cleanupSessionFiles(sessionDir, active.externalId);\n\n this.log(`Session ended: ${active.rwSessionId}`);\n }\n\n private findActiveSession(sessionDir: string): SessionFile | null {\n let files: string[];\n try {\n files = readdirSync(sessionDir);\n } catch {\n return null;\n }\n\n const sessions: SessionFile[] = [];\n for (const name of files) {\n if (SKIP_SUFFIXES.some((s) => name.endsWith(s))) continue;\n const path = join(sessionDir, name);\n try {\n const stat = statSync(path);\n if (!stat.isFile()) continue;\n const content = readFileSync(path, 'utf-8').trim();\n if (!content) continue;\n sessions.push({\n externalId: name,\n rwSessionId: content.split('\\n')[0].trim(),\n path,\n mtime: stat.mtimeMs,\n });\n } catch {\n continue;\n }\n }\n\n if (sessions.length === 0) return null;\n\n // Return most recently modified\n sessions.sort((a, b) => b.mtime - a.mtime);\n return sessions[0];\n }\n\n private cleanupSessionFiles(sessionDir: string, externalId: string): void {\n const base = join(sessionDir, externalId);\n for (const suffix of ['', '.seq', '.ctxhash', '.log']) {\n try {\n unlinkSync(base + suffix);\n } catch {\n // File may not exist\n }\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAEA,SAAS,aAAa,cAAc,YAAY,gBAAgB;AAChE,SAAS,cAAc;AACvB,SAAS,YAAY;AAErB,IAAM,gBAAgB,CAAC,QAAQ,QAAQ,YAAY,QAAQ,OAAO;AASlE,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,YAAW;AAC5B,SAAK,YAAY;AAEjB,UAAM,aAAa,KAAK,OAAO,GAAG,YAAY;AAC9C,UAAM,SAAS,KAAK,kBAAkB,UAAU;AAEhD,QAAI,CAAC,QAAQ;AACX,WAAK,MAAM,kFAAkF;AAAA,IAC/F;AAGA,QAAI;AACF,YAAM,SAAkB,iBAAiB,OAAO,WAAW,IAAI;AAAA,QAC7D,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,WAAK,KAAK,kCAAmC,IAAc,OAAO,EAAE;AAAA,IACtE;AAGA,SAAK,oBAAoB,YAAY,OAAO,UAAU;AAEtD,SAAK,IAAI,kBAAkB,OAAO,WAAW,EAAE;AAAA,EACjD;AAAA,EAEQ,kBAAkB,YAAwC;AAChE,QAAI;AACJ,QAAI;AACF,cAAQ,YAAY,UAAU;AAAA,IAChC,QAAQ;AACN,aAAO;AAAA,IACT;AAEA,UAAM,WAA0B,CAAC;AACjC,eAAW,QAAQ,OAAO;AACxB,UAAI,cAAc,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,EAAG;AACjD,YAAM,OAAO,KAAK,YAAY,IAAI;AAClC,UAAI;AACF,cAAM,OAAO,SAAS,IAAI;AAC1B,YAAI,CAAC,KAAK,OAAO,EAAG;AACpB,cAAM,UAAU,aAAa,MAAM,OAAO,EAAE,KAAK;AACjD,YAAI,CAAC,QAAS;AACd,iBAAS,KAAK;AAAA,UACZ,YAAY;AAAA,UACZ,aAAa,QAAQ,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK;AAAA,UACzC;AAAA,UACA,OAAO,KAAK;AAAA,QACd,CAAC;AAAA,MACH,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,EAAG,QAAO;AAGlC,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACzC,WAAO,SAAS,CAAC;AAAA,EACnB;AAAA,EAEQ,oBAAoB,YAAoB,YAA0B;AACxE,UAAM,OAAO,KAAK,YAAY,UAAU;AACxC,eAAW,UAAU,CAAC,IAAI,QAAQ,YAAY,MAAM,GAAG;AACrD,UAAI;AACF,mBAAW,OAAO,MAAM;AAAA,MAC1B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;AAEA,SAAS,aAAa,cAAc,YAAY,gBAAgB;AAChE,SAAS,cAAc;AACvB,SAAS,YAAY;AAErB,IAAM,gBAAgB,CAAC,QAAQ,QAAQ,YAAY,QAAQ,OAAO;AASlE,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EACnD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,YAAW;AAC5B,SAAK,YAAY;AAEjB,UAAM,aAAa,KAAK,OAAO,GAAG,YAAY;AAC9C,UAAM,SAAS,KAAK,kBAAkB,UAAU;AAEhD,QAAI,CAAC,QAAQ;AACX,WAAK,MAAM,kFAAkF;AAAA,IAC/F;AAGA,QAAI;AACF,YAAM,SAAkB,iBAAiB,OAAO,WAAW,IAAI;AAAA,QAC7D,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,WAAK,KAAK,kCAAmC,IAAc,OAAO,EAAE;AAAA,IACtE;AAGA,SAAK,oBAAoB,YAAY,OAAO,UAAU;AAEtD,SAAK,IAAI,kBAAkB,OAAO,WAAW,EAAE;AAAA,EACjD;AAAA,EAEQ,kBAAkB,YAAwC;AAChE,QAAI;AACJ,QAAI;AACF,cAAQ,YAAY,UAAU;AAAA,IAChC,QAAQ;AACN,aAAO;AAAA,IACT;AAEA,UAAM,WAA0B,CAAC;AACjC,eAAW,QAAQ,OAAO;AACxB,UAAI,cAAc,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,EAAG;AACjD,YAAM,OAAO,KAAK,YAAY,IAAI;AAClC,UAAI;AACF,cAAM,OAAO,SAAS,IAAI;AAC1B,YAAI,CAAC,KAAK,OAAO,EAAG;AACpB,cAAM,UAAU,aAAa,MAAM,OAAO,EAAE,KAAK;AACjD,YAAI,CAAC,QAAS;AACd,iBAAS,KAAK;AAAA,UACZ,YAAY;AAAA,UACZ,aAAa,QAAQ,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK;AAAA,UACzC;AAAA,UACA,OAAO,KAAK;AAAA,QACd,CAAC;AAAA,MACH,QAAQ;AACN;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,EAAG,QAAO;AAGlC,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACzC,WAAO,SAAS,CAAC;AAAA,EACnB;AAAA,EAEQ,oBAAoB,YAAoB,YAA0B;AACxE,UAAM,OAAO,KAAK,YAAY,UAAU;AACxC,eAAW,UAAU,CAAC,IAAI,QAAQ,YAAY,MAAM,GAAG;AACrD,UAAI;AACF,mBAAW,OAAO,MAAM;AAAA,MAC1B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import "../../chunk-EKJ2CABV.js";
7
8
  import {
8
9
  apiPost
9
- } from "../../chunk-ZRLYHBPN.js";
10
+ } from "../../chunk-ZUJBM6HE.js";
10
11
  import "../../chunk-W2YERO7E.js";
11
12
  import "../../chunk-NSBPE2FW.js";
12
13
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/sessions/import.ts"],
4
4
  "sourcesContent": ["import * as fs from 'node:fs';\nimport { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\nexport default class SessionsImport extends BaseCommand {\n static override description = 'Import a session file (JSONL, JSON)';\n\n static override examples = [\n '<%= config.bin %> sessions import ~/.claude/projects/my-project/session-abc.jsonl',\n '<%= config.bin %> sessions import ./copilot-export.json --tool vscode_copilot',\n ];\n\n static override args = {\n path: Args.string({ description: 'Path to session file', required: true }),\n };\n\n static override flags = {\n tool: Flags.string({ description: 'Override tool detection (claude_code, cursor, vscode_copilot)' }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(SessionsImport);\n this.requireAuth();\n\n if (!fs.existsSync(args.path)) {\n this.error(`File not found: ${args.path}`);\n }\n\n const content = fs.readFileSync(args.path, 'utf-8');\n const result = await apiPost<{ id: string; tool: string; eventCount: number }>(\n '/api/sessions/import',\n { content, tool: flags.tool },\n );\n\n this.log(`Imported session ${result.id} (${result.tool}, ${result.eventCount} events)`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,SAAS,MAAM,aAAa;AAI5B,IAAqB,iBAArB,MAAqB,wBAAuB,YAAY;AAAA,EACtD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO,EAAE,aAAa,wBAAwB,UAAU,KAAK,CAAC;AAAA,EAC3E;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,gEAAgE,CAAC;AAAA,EACrG;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,eAAc;AACvD,SAAK,YAAY;AAEjB,QAAI,CAAI,cAAW,KAAK,IAAI,GAAG;AAC7B,WAAK,MAAM,mBAAmB,KAAK,IAAI,EAAE;AAAA,IAC3C;AAEA,UAAM,UAAa,gBAAa,KAAK,MAAM,OAAO;AAClD,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,IAC9B;AAEA,SAAK,IAAI,oBAAoB,OAAO,EAAE,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU,UAAU;AAAA,EACxF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,SAAS,MAAM,aAAa;AAI5B,IAAqB,iBAArB,MAAqB,wBAAuB,YAAY;AAAA,EACtD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO,EAAE,aAAa,wBAAwB,UAAU,KAAK,CAAC;AAAA,EAC3E;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,gEAAgE,CAAC;AAAA,EACrG;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,eAAc;AACvD,SAAK,YAAY;AAEjB,QAAI,CAAI,cAAW,KAAK,IAAI,GAAG;AAC7B,WAAK,MAAM,mBAAmB,KAAK,IAAI,EAAE;AAAA,IAC3C;AAEA,UAAM,UAAa,gBAAa,KAAK,MAAM,OAAO;AAClD,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,EAAE,SAAS,MAAM,MAAM,KAAK;AAAA,IAC9B;AAEA,SAAK,IAAI,oBAAoB,OAAO,EAAE,KAAK,OAAO,IAAI,KAAK,OAAO,UAAU,UAAU;AAAA,EACxF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import "../../chunk-EKJ2CABV.js";
7
8
  import {
8
9
  apiGet
9
- } from "../../chunk-ZRLYHBPN.js";
10
+ } from "../../chunk-ZUJBM6HE.js";
10
11
  import "../../chunk-W2YERO7E.js";
11
12
  import "../../chunk-NSBPE2FW.js";
12
13
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/sessions/list.ts"],
4
4
  "sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\n\ninterface SessionSummary {\n id: string;\n tool: string;\n projectPath: string | null;\n eventCount: number;\n startedAt: string;\n analysis: { adherenceScore: number } | null;\n}\n\nexport default class SessionsList extends BaseCommand {\n static override description = 'List captured sessions';\n\n static override examples = [\n '<%= config.bin %> sessions list',\n '<%= config.bin %> sessions list --tool claude_code',\n ];\n\n static override flags = {\n tool: Flags.string({ description: 'Filter by tool (claude_code, cursor, vscode_copilot)' }),\n limit: Flags.integer({ description: 'Max results', default: 20 }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(SessionsList);\n this.requireAuth();\n\n const params = new URLSearchParams();\n if (flags.tool) params.set('tool', flags.tool);\n params.set('limit', String(flags.limit));\n\n const sessions = await apiGet<SessionSummary[]>(`/api/sessions?${params}`);\n\n if (sessions.length === 0) {\n this.log('No sessions found.');\n return;\n }\n\n for (const s of sessions) {\n const project = s.projectPath?.split('/').pop() ?? '\u2014';\n const adherence = s.analysis?.adherenceScore != null ? `${s.analysis.adherenceScore}%` : '\u2014';\n const date = new Date(s.startedAt).toLocaleDateString();\n this.log(`${s.id.slice(0, 8)} ${s.tool.padEnd(15)} ${project.padEnd(20)} ${String(s.eventCount).padStart(5)} events ${adherence.padStart(4)} adherence ${date}`);\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAAA,SAAS,aAAa;AAatB,IAAqB,eAArB,MAAqB,sBAAqB,YAAY;AAAA,EACpD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,uDAAuD,CAAC;AAAA,IAC1F,OAAO,MAAM,QAAQ,EAAE,aAAa,eAAe,SAAS,GAAG,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,aAAY;AAC/C,SAAK,YAAY;AAEjB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,MAAM,IAAI;AAC7C,WAAO,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC;AAEvC,UAAM,WAAW,MAAM,OAAyB,iBAAiB,MAAM,EAAE;AAEzE,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,IAAI,oBAAoB;AAC7B;AAAA,IACF;AAEA,eAAW,KAAK,UAAU;AACxB,YAAM,UAAU,EAAE,aAAa,MAAM,GAAG,EAAE,IAAI,KAAK;AACnD,YAAM,YAAY,EAAE,UAAU,kBAAkB,OAAO,GAAG,EAAE,SAAS,cAAc,MAAM;AACzF,YAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,mBAAmB;AACtD,WAAK,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC,IAAI,QAAQ,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,YAAY,UAAU,SAAS,CAAC,CAAC,eAAe,IAAI,EAAE;AAAA,IACpK;AAAA,EACF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAatB,IAAqB,eAArB,MAAqB,sBAAqB,YAAY;AAAA,EACpD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,uDAAuD,CAAC;AAAA,IAC1F,OAAO,MAAM,QAAQ,EAAE,aAAa,eAAe,SAAS,GAAG,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,aAAY;AAC/C,SAAK,YAAY;AAEjB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,KAAM,QAAO,IAAI,QAAQ,MAAM,IAAI;AAC7C,WAAO,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC;AAEvC,UAAM,WAAW,MAAM,OAAyB,iBAAiB,MAAM,EAAE;AAEzE,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,IAAI,oBAAoB;AAC7B;AAAA,IACF;AAEA,eAAW,KAAK,UAAU;AACxB,YAAM,UAAU,EAAE,aAAa,MAAM,GAAG,EAAE,IAAI,KAAK;AACnD,YAAM,YAAY,EAAE,UAAU,kBAAkB,OAAO,GAAG,EAAE,SAAS,cAAc,MAAM;AACzF,YAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,mBAAmB;AACtD,WAAK,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,OAAO,EAAE,CAAC,IAAI,QAAQ,OAAO,EAAE,CAAC,IAAI,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,YAAY,UAAU,SAAS,CAAC,CAAC,eAAe,IAAI,EAAE;AAAA,IACpK;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import {
7
8
  readActiveOrg
8
9
  } from "../../chunk-EKJ2CABV.js";
9
10
  import {
10
11
  apiPost
11
- } from "../../chunk-ZRLYHBPN.js";
12
+ } from "../../chunk-ZUJBM6HE.js";
12
13
  import "../../chunk-W2YERO7E.js";
13
14
  import "../../chunk-NSBPE2FW.js";
14
15
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/sessions/start.ts"],
4
4
  "sourcesContent": ["import { Flags } from '@oclif/core';\nimport { randomUUID } from 'node:crypto';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\nimport { readActiveOrg } from '../../lib/active-org.js';\n\ninterface SessionResponse {\n id: string;\n tool: string;\n projectPath: string | null;\n}\n\nexport default class SessionsStart extends BaseCommand {\n static override description =\n 'Start a capture session for any LLM provider (Cortex, Groq, etc.)';\n\n static override examples = [\n '<%= config.bin %> sessions start --tool cortex',\n '<%= config.bin %> sessions start --tool groq --project-dir /path/to/project',\n 'eval \"$(rulemetric proxy env --python)\" && rulemetric sessions start --tool cortex',\n ];\n\n static override flags = {\n tool: Flags.string({\n char: 't',\n required: true,\n description: 'LLM provider or tool name (e.g., cortex, groq, deepseek, custom_app)',\n }),\n 'project-dir': Flags.string({\n char: 'd',\n description: 'Project directory (defaults to cwd)',\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(SessionsStart);\n this.requireAuth();\n\n const projectPath = flags['project-dir'] ?? process.cwd();\n const externalSessionId = randomUUID();\n\n // Detect git branch\n let gitBranch = '';\n try {\n gitBranch = execSync('git branch --show-current 2>/dev/null', {\n cwd: projectPath,\n encoding: 'utf-8',\n }).trim();\n } catch {\n // Not a git repo \u2014 that's fine\n }\n\n // Detect git remote\n let gitRemote = '';\n try {\n gitRemote = execSync('git remote get-url origin 2>/dev/null', {\n cwd: projectPath,\n encoding: 'utf-8',\n }).trim();\n } catch {\n // No remote\n }\n\n const metadata: Record<string, string> = {};\n if (gitRemote) metadata.gitRemote = gitRemote;\n\n // Active org attribution (Phase 8.1). API validates membership and\n // silently nulls the field if the user isn't a member.\n const activeOrg = readActiveOrg();\n\n // Create session via API\n const session = await apiPost<SessionResponse>('/api/sessions', {\n tool: flags.tool,\n externalSessionId,\n projectPath,\n gitBranch,\n metadata,\n orgId: activeOrg?.orgId ?? null,\n });\n\n // Write session file so the proxy can find it\n // Format: RuleMetric session ID (what session_linker.py reads)\n const sessionDir = join(tmpdir(), 'rulemetric');\n mkdirSync(sessionDir, { recursive: true });\n\n const sessionFile = join(sessionDir, externalSessionId);\n writeFileSync(sessionFile, session.id + '\\n');\n\n // Initialize sequence counter\n writeFileSync(sessionFile + '.seq', '0\\n');\n\n this.log(`Session started: ${session.id}`);\n this.log(` Tool: ${flags.tool}`);\n this.log(` Project: ${projectPath}`);\n if (gitBranch) this.log(` Branch: ${gitBranch}`);\n this.log('');\n this.log('The proxy will now capture LLM traffic for this session.');\n this.log('When done, run: rulemetric sessions end');\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAqB,WAAW,qBAAqB;AACrD,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,gBAAgB;AAWzB,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cACd;AAAA,EAEF,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AAAA,IACD,eAAe,MAAM,OAAO;AAAA,MAC1B,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,cAAa;AAChD,SAAK,YAAY;AAEjB,UAAM,cAAc,MAAM,aAAa,KAAK,QAAQ,IAAI;AACxD,UAAM,oBAAoB,WAAW;AAGrC,QAAI,YAAY;AAChB,QAAI;AACF,kBAAY,SAAS,yCAAyC;AAAA,QAC5D,KAAK;AAAA,QACL,UAAU;AAAA,MACZ,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AAAA,IAER;AAGA,QAAI,YAAY;AAChB,QAAI;AACF,kBAAY,SAAS,yCAAyC;AAAA,QAC5D,KAAK;AAAA,QACL,UAAU;AAAA,MACZ,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AAAA,IAER;AAEA,UAAM,WAAmC,CAAC;AAC1C,QAAI,UAAW,UAAS,YAAY;AAIpC,UAAM,YAAY,cAAc;AAGhC,UAAM,UAAU,MAAM,QAAyB,iBAAiB;AAAA,MAC9D,MAAM,MAAM;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,WAAW,SAAS;AAAA,IAC7B,CAAC;AAID,UAAM,aAAa,KAAK,OAAO,GAAG,YAAY;AAC9C,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,UAAM,cAAc,KAAK,YAAY,iBAAiB;AACtD,kBAAc,aAAa,QAAQ,KAAK,IAAI;AAG5C,kBAAc,cAAc,QAAQ,KAAK;AAEzC,SAAK,IAAI,oBAAoB,QAAQ,EAAE,EAAE;AACzC,SAAK,IAAI,cAAc,MAAM,IAAI,EAAE;AACnC,SAAK,IAAI,cAAc,WAAW,EAAE;AACpC,QAAI,UAAW,MAAK,IAAI,cAAc,SAAS,EAAE;AACjD,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,0DAA0D;AACnE,SAAK,IAAI,yCAAyC;AAAA,EACpD;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAqB,WAAW,qBAAqB;AACrD,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,gBAAgB;AAWzB,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cACd;AAAA,EAEF,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AAAA,IACD,eAAe,MAAM,OAAO;AAAA,MAC1B,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,cAAa;AAChD,SAAK,YAAY;AAEjB,UAAM,cAAc,MAAM,aAAa,KAAK,QAAQ,IAAI;AACxD,UAAM,oBAAoB,WAAW;AAGrC,QAAI,YAAY;AAChB,QAAI;AACF,kBAAY,SAAS,yCAAyC;AAAA,QAC5D,KAAK;AAAA,QACL,UAAU;AAAA,MACZ,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AAAA,IAER;AAGA,QAAI,YAAY;AAChB,QAAI;AACF,kBAAY,SAAS,yCAAyC;AAAA,QAC5D,KAAK;AAAA,QACL,UAAU;AAAA,MACZ,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AAAA,IAER;AAEA,UAAM,WAAmC,CAAC;AAC1C,QAAI,UAAW,UAAS,YAAY;AAIpC,UAAM,YAAY,cAAc;AAGhC,UAAM,UAAU,MAAM,QAAyB,iBAAiB;AAAA,MAC9D,MAAM,MAAM;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,WAAW,SAAS;AAAA,IAC7B,CAAC;AAID,UAAM,aAAa,KAAK,OAAO,GAAG,YAAY;AAC9C,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAEzC,UAAM,cAAc,KAAK,YAAY,iBAAiB;AACtD,kBAAc,aAAa,QAAQ,KAAK,IAAI;AAG5C,kBAAc,cAAc,QAAQ,KAAK;AAEzC,SAAK,IAAI,oBAAoB,QAAQ,EAAE,EAAE;AACzC,SAAK,IAAI,cAAc,MAAM,IAAI,EAAE;AACnC,SAAK,IAAI,cAAc,WAAW,EAAE;AACpC,QAAI,UAAW,MAAK,IAAI,cAAc,SAAS,EAAE;AACjD,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,0DAA0D;AACnE,SAAK,IAAI,yCAAyC;AAAA,EACpD;AACF;",
6
6
  "names": []
7
7
  }
@@ -6,16 +6,20 @@ import {
6
6
  getStep,
7
7
  isStepId,
8
8
  renderDiff
9
- } from "../chunk-XNNOXGP6.js";
10
- import "../chunk-XN23W5HL.js";
11
- import "../chunk-DAJNO4OI.js";
9
+ } from "../chunk-OKWCKCPE.js";
10
+ import "../chunk-LXKPNATC.js";
11
+ import "../chunk-OQBBVTDG.js";
12
+ import "../chunk-4LYCDS2N.js";
13
+ import "../chunk-7LVVKQMZ.js";
14
+ import "../chunk-5EDMGK3W.js";
12
15
  import {
13
16
  BaseCommand
14
- } from "../chunk-SZ7VDCD6.js";
17
+ } from "../chunk-2HK7RGZB.js";
15
18
  import "../chunk-R56PH7YE.js";
16
- import "../chunk-SLL3OBKN.js";
19
+ import "../chunk-GQNJO2P2.js";
20
+ import "../chunk-37LN5O7M.js";
17
21
  import "../chunk-EKJ2CABV.js";
18
- import "../chunk-ZRLYHBPN.js";
22
+ import "../chunk-ZUJBM6HE.js";
19
23
  import "../chunk-W2YERO7E.js";
20
24
  import "../chunk-NSBPE2FW.js";
21
25
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/setup.ts"],
4
4
  "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport * as readline from 'node:readline/promises';\nimport { BaseCommand } from '../base-command.js';\nimport {\n STEPS,\n ALL_STEP_IDS,\n getStep,\n isStepId,\n computeStatus,\n renderDiff,\n defaultContext,\n type SetupContext,\n type StepPlan,\n} from '../lib/setup-steps.js';\n\nexport default class Setup extends BaseCommand {\n static override description =\n 'Agentic, transparent setup: plan / show diffs / apply the four core onboarding steps';\n\n static override examples = [\n '<%= config.bin %> setup # interactive walk (TTY)',\n '<%= config.bin %> setup plan # read-only: every remaining artifact + diff',\n '<%= config.bin %> setup hooks --show # print one step\\'s diff',\n '<%= config.bin %> setup hooks --apply # apply one step',\n '<%= config.bin %> setup --json # machine-readable status (exit 0 iff complete)',\n ];\n\n static override args = {\n target: Args.string({\n description: `\"plan\" or a step id (${ALL_STEP_IDS.join(', ')})`,\n required: false,\n }),\n };\n\n static override flags = {\n json: Flags.boolean({ description: 'Machine-readable output', default: false }),\n show: Flags.boolean({ description: 'Print the step diff (read-only)', default: false }),\n apply: Flags.boolean({ description: 'Apply the step', default: false }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Setup);\n const ctx = defaultContext();\n\n if (args.target === 'plan') {\n await this.runPlan(ctx, flags.json);\n return;\n }\n\n if (args.target && isStepId(args.target)) {\n if (flags.apply) {\n await getStep(args.target).apply(ctx);\n return;\n }\n // Default for a named step is --show (read-only diff).\n const plan = await getStep(args.target).plan(ctx);\n this.printPlan(plan);\n return;\n }\n\n if (args.target) {\n this.error(`Unknown target \"${args.target}\". Use \"plan\" or one of: ${ALL_STEP_IDS.join(', ')}.`);\n }\n\n // No target.\n if (flags.json) {\n const status = await computeStatus(ctx);\n this.log(JSON.stringify(status, null, 2));\n if (!status.coreComplete) this.exit(1);\n return;\n }\n\n await this.runInteractive(ctx);\n }\n\n private async runPlan(ctx: SetupContext, asJson: boolean): Promise<void> {\n const status = await computeStatus(ctx);\n const remaining = STEPS.filter(\n (s) => !status.steps.find((st) => st.id === s.id)?.done,\n );\n const plans: StepPlan[] = [];\n for (const step of remaining) {\n // eslint-disable-next-line no-await-in-loop\n plans.push(await step.plan(ctx));\n }\n\n if (asJson) {\n this.log(JSON.stringify({ ...status, plans }, null, 2));\n return;\n }\n\n if (plans.length === 0) {\n this.log('[OK] All core steps complete \u2014 nothing to install.');\n return;\n }\n this.log('The following steps would be applied:\\n');\n for (const plan of plans) {\n this.printPlan(plan);\n this.log('');\n }\n }\n\n private printPlan(plan: StepPlan): void {\n this.log(`[..] ${plan.title} (${plan.id})`);\n if (plan.command) this.log(` command: ${plan.command}`);\n for (const artifact of plan.artifacts) {\n this.log(` ${artifact.kind}: ${artifact.path}${artifact.masked ? ' (secret masked)' : ''}`);\n const diff = renderDiff(artifact.before, artifact.after);\n for (const line of diff.split('\\n')) {\n this.log(` ${line}`);\n }\n }\n }\n\n private async runInteractive(ctx: SetupContext): Promise<void> {\n if (!process.stdin.isTTY) {\n this.log('Not a TTY \u2014 interactive walk needs a terminal.');\n this.log('Use one of:');\n this.log(' rulemetric setup plan \u2014 see every remaining artifact + diff');\n this.log(' rulemetric setup <step> --show \u2014 print one step diff');\n this.log(' rulemetric setup <step> --apply \u2014 apply one step');\n this.log(' rulemetric setup --json \u2014 machine-readable status');\n return;\n }\n\n const status = await computeStatus(ctx);\n const remaining = STEPS.filter(\n (s) => !status.steps.find((st) => st.id === s.id)?.done,\n );\n if (remaining.length === 0) {\n this.log('[OK] All core steps complete.');\n return;\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n for (const step of remaining) {\n const plan = await step.plan(ctx);\n this.printPlan(plan);\n const answer = (await rl.question(`Apply \"${plan.title}\"? [y/N] `)).trim().toLowerCase();\n if (answer === 'y' || answer === 'yes') {\n await step.apply(ctx);\n this.log(`[OK] Applied ${plan.title}.`);\n } else {\n this.log(`[..] Skipped ${plan.title}.`);\n }\n this.log('');\n }\n } finally {\n rl.close();\n }\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import "../../chunk-EKJ2CABV.js";
7
8
  import {
8
9
  apiGet
9
- } from "../../chunk-ZRLYHBPN.js";
10
+ } from "../../chunk-ZUJBM6HE.js";
10
11
  import "../../chunk-W2YERO7E.js";
11
12
  import "../../chunk-NSBPE2FW.js";
12
13
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/skills/export-approved.ts"],
4
4
  "sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\n\nexport default class SkillsExportApproved extends BaseCommand {\n static override description = 'Export approved community submissions as community-skills.json for registry merge';\n\n static override examples = [\n '<%= config.bin %> skills export-approved',\n '<%= config.bin %> skills export-approved --output ./community-skills.json',\n ];\n\n static override flags = {\n output: Flags.string({\n description: 'Output file path',\n default: 'packages/skills-registry/community-skills.json',\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(SkillsExportApproved);\n this.requireAuth();\n\n const entries = await apiGet<Array<Record<string, unknown>>>('/api/skills/submissions/approved');\n\n if (entries.length === 0) {\n this.log('No approved submissions to export.');\n return;\n }\n\n const outputPath = path.resolve(flags.output);\n fs.writeFileSync(outputPath, JSON.stringify(entries, null, 2));\n this.log(`Exported ${entries.length} approved skills to ${outputPath}`);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,aAAa;AAItB,IAAqB,uBAArB,MAAqB,8BAA6B,YAAY;AAAA,EAC5D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,OAAO;AAAA,MACnB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,qBAAoB;AACvD,SAAK,YAAY;AAEjB,UAAM,UAAU,MAAM,OAAuC,kCAAkC;AAE/F,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,oCAAoC;AAC7C;AAAA,IACF;AAEA,UAAM,aAAkB,aAAQ,MAAM,MAAM;AAC5C,IAAG,iBAAc,YAAY,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC7D,SAAK,IAAI,YAAY,QAAQ,MAAM,uBAAuB,UAAU,EAAE;AAAA,EACxE;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,aAAa;AAItB,IAAqB,uBAArB,MAAqB,8BAA6B,YAAY;AAAA,EAC5D,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,OAAO;AAAA,MACnB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,qBAAoB;AACvD,SAAK,YAAY;AAEjB,UAAM,UAAU,MAAM,OAAuC,kCAAkC;AAE/F,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,oCAAoC;AAC7C;AAAA,IACF;AAEA,UAAM,aAAkB,aAAQ,MAAM,MAAM;AAC5C,IAAG,iBAAc,YAAY,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAC7D,SAAK,IAAI,YAAY,QAAQ,MAAM,uBAAuB,UAAU,EAAE;AAAA,EACxE;AACF;",
6
6
  "names": []
7
7
  }
@@ -3,11 +3,12 @@ import {
3
3
  } from "../../chunk-4BHDHHKL.js";
4
4
  import {
5
5
  BaseCommand
6
- } from "../../chunk-SZ7VDCD6.js";
6
+ } from "../../chunk-2HK7RGZB.js";
7
7
  import "../../chunk-R56PH7YE.js";
8
- import "../../chunk-SLL3OBKN.js";
8
+ import "../../chunk-GQNJO2P2.js";
9
+ import "../../chunk-37LN5O7M.js";
9
10
  import "../../chunk-EKJ2CABV.js";
10
- import "../../chunk-ZRLYHBPN.js";
11
+ import "../../chunk-ZUJBM6HE.js";
11
12
  import "../../chunk-W2YERO7E.js";
12
13
  import "../../chunk-NSBPE2FW.js";
13
14
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/skills/install.ts"],
4
4
  "sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { loadRegistry } from '../../lib/skills-loader.js';\n\nexport default class SkillsInstall extends BaseCommand {\n static override description = 'Install a skill from the registry into your project';\n\n static override examples = [\n '<%= config.bin %> skills install tdd-workflow',\n '<%= config.bin %> skills install tdd-workflow --tool cursor',\n '<%= config.bin %> skills install tdd-workflow --preview',\n ];\n\n static override args = {\n id: Args.string({ description: 'Skill ID to install', required: true }),\n };\n\n static override flags = {\n tool: Flags.string({\n description: 'Target tool format',\n options: ['claude_code', 'cursor', 'copilot'],\n }),\n preview: Flags.boolean({ description: 'Preview content without writing', default: false }),\n dir: Flags.string({ description: 'Project directory', default: '.' }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(SkillsInstall);\n\n const catalog = await loadRegistry(this);\n const skill = catalog.get(args.id);\n\n if (!skill) {\n this.error(`Skill \"${args.id}\" not found. Try: rulemetric skills search`);\n }\n\n if (flags.preview) {\n this.log(`\\n${skill.name}`);\n this.log(`${'\u2500'.repeat(skill.name.length)}`);\n this.log(`Category: ${skill.category}`);\n this.log(`Tools: ${skill.tools.join(', ')}`);\n this.log(`Source: ${skill.source.url}\\n`);\n this.log(skill.content.slice(0, 2000));\n if (skill.content.length > 2000) {\n this.log(`\\n... (${skill.content.length - 2000} more characters)`);\n }\n return;\n }\n\n const projectDir = path.resolve(flags.dir);\n const tool = flags.tool ?? detectProjectTool(projectDir) ?? skill.tools[0];\n\n const targetPath = getTargetPath(projectDir, tool, skill.id);\n if (!targetPath) {\n this.error(`Cannot determine install path for tool \"${tool}\"`);\n }\n\n // Ensure directory exists\n const targetDir = path.dirname(targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n\n if (fs.existsSync(targetPath)) {\n this.warn(`File already exists: ${targetPath}`);\n this.log(' Use --preview to view the skill content first.');\n return;\n }\n\n fs.writeFileSync(targetPath, skill.content);\n this.log(`Installed \"${skill.name}\" to ${path.relative(projectDir, targetPath)}`);\n this.log(` Source: ${skill.source.url}`);\n }\n}\n\n/** Detect which AI tool the project is configured for. */\nfunction detectProjectTool(dir: string): string | null {\n if (fs.existsSync(path.join(dir, 'CLAUDE.md')) || fs.existsSync(path.join(dir, '.claude'))) {\n return 'claude_code';\n }\n if (fs.existsSync(path.join(dir, '.cursorrules')) || fs.existsSync(path.join(dir, '.cursor'))) {\n return 'cursor';\n }\n if (fs.existsSync(path.join(dir, '.github', 'copilot-instructions.md'))) {\n return 'copilot';\n }\n return null;\n}\n\n/** Determine the file path to write a skill based on the target tool. */\nfunction getTargetPath(dir: string, tool: string, skillId: string): string | null {\n const safeName = skillId.replace(/[^a-z0-9-]/g, '-');\n switch (tool) {\n case 'claude_code':\n return path.join(dir, '.claude', 'skills', `${safeName}.md`);\n case 'cursor':\n return path.join(dir, '.cursor', 'rules', `${safeName}.mdc`);\n case 'copilot':\n return path.join(dir, '.github', 'agents', `${safeName}.md`);\n default:\n return path.join(dir, '.claude', 'skills', `${safeName}.md`);\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,11 +3,12 @@ import {
3
3
  } from "../../chunk-4BHDHHKL.js";
4
4
  import {
5
5
  BaseCommand
6
- } from "../../chunk-SZ7VDCD6.js";
6
+ } from "../../chunk-2HK7RGZB.js";
7
7
  import "../../chunk-R56PH7YE.js";
8
- import "../../chunk-SLL3OBKN.js";
8
+ import "../../chunk-GQNJO2P2.js";
9
+ import "../../chunk-37LN5O7M.js";
9
10
  import "../../chunk-EKJ2CABV.js";
10
- import "../../chunk-ZRLYHBPN.js";
11
+ import "../../chunk-ZUJBM6HE.js";
11
12
  import "../../chunk-W2YERO7E.js";
12
13
  import "../../chunk-NSBPE2FW.js";
13
14
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/skills/list.ts"],
4
4
  "sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { loadRegistry } from '../../lib/skills-loader.js';\n\nexport default class SkillsList extends BaseCommand {\n static override description = 'List skills in the registry';\n\n static override examples = [\n '<%= config.bin %> skills list',\n '<%= config.bin %> skills list --stats',\n ];\n\n static override flags = {\n stats: Flags.boolean({ description: 'Show registry statistics', default: false }),\n limit: Flags.integer({ description: 'Max skills to show', default: 30 }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(SkillsList);\n\n const catalog = await loadRegistry(this);\n\n if (flags.stats) {\n this.log(`Skills Registry Statistics\\n`);\n this.log(` Total skills: ${catalog.size}`);\n this.log(` Categories: ${catalog.categories().join(', ')}`);\n this.log(` Tools: ${catalog.tools().join(', ')}`);\n this.log(` Top tags: ${catalog.tags().slice(0, 15).join(', ')}`);\n return;\n }\n\n const skills = catalog.search({ limit: flags.limit });\n\n if (skills.length === 0) {\n this.log('Registry is empty. Run: rulemetric skills update');\n return;\n }\n\n this.log(`Showing ${skills.length} of ${catalog.size} skills (sorted by popularity):\\n`);\n\n for (const skill of skills) {\n const stars = skill.popularity?.stars ? `${formatStars(skill.popularity.stars)} stars` : '';\n this.log(` ${pad(skill.id, 40)} ${pad(skill.category, 14)} ${stars}`);\n }\n\n this.log(`\\nSearch: rulemetric skills search <query>`);\n this.log(`Install: rulemetric skills install <id>`);\n }\n}\n\nfunction formatStars(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n}\n\nfunction pad(s: string, n: number): string {\n return s.length > n ? s.slice(0, n - 1) + '\u2026' : s.padEnd(n);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAItB,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ,EAAE,aAAa,4BAA4B,SAAS,MAAM,CAAC;AAAA,IAChF,OAAO,MAAM,QAAQ,EAAE,aAAa,sBAAsB,SAAS,GAAG,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AAE7C,UAAM,UAAU,MAAM,aAAa,IAAI;AAEvC,QAAI,MAAM,OAAO;AACf,WAAK,IAAI;AAAA,CAA8B;AACvC,WAAK,IAAI,mBAAmB,QAAQ,IAAI,EAAE;AAC1C,WAAK,IAAI,iBAAiB,QAAQ,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE;AAC3D,WAAK,IAAI,YAAY,QAAQ,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AACjD,WAAK,IAAI,eAAe,QAAQ,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAChE;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,OAAO,EAAE,OAAO,MAAM,MAAM,CAAC;AAEpD,QAAI,OAAO,WAAW,GAAG;AACvB,WAAK,IAAI,kDAAkD;AAC3D;AAAA,IACF;AAEA,SAAK,IAAI,WAAW,OAAO,MAAM,OAAO,QAAQ,IAAI;AAAA,CAAmC;AAEvF,eAAW,SAAS,QAAQ;AAC1B,YAAM,QAAQ,MAAM,YAAY,QAAQ,GAAG,YAAY,MAAM,WAAW,KAAK,CAAC,WAAW;AACzF,WAAK,IAAI,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,UAAU,EAAE,CAAC,IAAI,KAAK,EAAE;AAAA,IACvE;AAEA,SAAK,IAAI;AAAA,yCAA4C;AACrD,SAAK,IAAI,yCAAyC;AAAA,EACpD;AACF;AAEA,SAAS,YAAY,GAAmB;AACtC,MAAI,KAAK,IAAM,QAAO,IAAI,IAAI,KAAM,QAAQ,CAAC,CAAC;AAC9C,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,IAAI,GAAW,GAAmB;AACzC,SAAO,EAAE,SAAS,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,WAAM,EAAE,OAAO,CAAC;AAC5D;",
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAItB,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,QAAQ,EAAE,aAAa,4BAA4B,SAAS,MAAM,CAAC;AAAA,IAChF,OAAO,MAAM,QAAQ,EAAE,aAAa,sBAAsB,SAAS,GAAG,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AAE7C,UAAM,UAAU,MAAM,aAAa,IAAI;AAEvC,QAAI,MAAM,OAAO;AACf,WAAK,IAAI;AAAA,CAA8B;AACvC,WAAK,IAAI,mBAAmB,QAAQ,IAAI,EAAE;AAC1C,WAAK,IAAI,iBAAiB,QAAQ,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE;AAC3D,WAAK,IAAI,YAAY,QAAQ,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AACjD,WAAK,IAAI,eAAe,QAAQ,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAChE;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,OAAO,EAAE,OAAO,MAAM,MAAM,CAAC;AAEpD,QAAI,OAAO,WAAW,GAAG;AACvB,WAAK,IAAI,kDAAkD;AAC3D;AAAA,IACF;AAEA,SAAK,IAAI,WAAW,OAAO,MAAM,OAAO,QAAQ,IAAI;AAAA,CAAmC;AAEvF,eAAW,SAAS,QAAQ;AAC1B,YAAM,QAAQ,MAAM,YAAY,QAAQ,GAAG,YAAY,MAAM,WAAW,KAAK,CAAC,WAAW;AACzF,WAAK,IAAI,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,UAAU,EAAE,CAAC,IAAI,KAAK,EAAE;AAAA,IACvE;AAEA,SAAK,IAAI;AAAA,yCAA4C;AACrD,SAAK,IAAI,yCAAyC;AAAA,EACpD;AACF;AAEA,SAAS,YAAY,GAAmB;AACtC,MAAI,KAAK,IAAM,QAAO,IAAI,IAAI,KAAM,QAAQ,CAAC,CAAC;AAC9C,SAAO,OAAO,CAAC;AACjB;AAEA,SAAS,IAAI,GAAW,GAAmB;AACzC,SAAO,EAAE,SAAS,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,WAAM,EAAE,OAAO,CAAC;AAC5D;",
6
6
  "names": []
7
7
  }
@@ -1,12 +1,13 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import "../../chunk-EKJ2CABV.js";
7
8
  import {
8
9
  apiPost
9
- } from "../../chunk-ZRLYHBPN.js";
10
+ } from "../../chunk-ZUJBM6HE.js";
10
11
  import "../../chunk-W2YERO7E.js";
11
12
  import "../../chunk-NSBPE2FW.js";
12
13
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/skills/publish.ts"],
4
4
  "sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\nexport default class SkillsPublish extends BaseCommand {\n static override description = 'Submit a skill file to the RuleMetric skills registry';\n\n static override examples = [\n '<%= config.bin %> skills publish ./my-skill.md',\n '<%= config.bin %> skills publish ./my-skill.md --category workflow --tool claude_code',\n ];\n\n static override args = {\n file: Args.string({ description: 'Path to skill file (.md)', required: true }),\n };\n\n static override flags = {\n name: Flags.string({ description: 'Skill name (defaults to filename)' }),\n description: Flags.string({ description: 'One-line description' }),\n category: Flags.string({\n description: 'Skill category',\n options: [\n 'workflow', 'language', 'framework', 'tool', 'security',\n 'testing', 'architecture', 'devops', 'documentation',\n 'performance', 'other',\n ],\n default: 'other',\n }),\n tool: Flags.string({\n description: 'Primary tool this skill targets',\n options: ['claude_code', 'cursor', 'copilot', 'windsurf', 'universal'],\n default: 'universal',\n }),\n tags: Flags.string({ description: 'Comma-separated tags', default: '' }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(SkillsPublish);\n this.requireAuth();\n\n const filePath = path.resolve(args.file);\n if (!fs.existsSync(filePath)) {\n this.error(`File not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf-8');\n if (content.trim().length < 20) {\n this.error('Skill content is too short (minimum 20 characters)');\n }\n\n const basename = path.basename(filePath, path.extname(filePath));\n const name = flags.name ?? basename\n .replace(/[-_]+/g, ' ')\n .replace(/\\b\\w/g, c => c.toUpperCase());\n\n const id = basename.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n\n const tags = flags.tags\n ? flags.tags.split(',').map(t => t.trim()).filter(Boolean)\n : [];\n\n this.log(`Publishing skill: ${name} (${id})`);\n this.log(` Category: ${flags.category}`);\n this.log(` Tool: ${flags.tool}`);\n if (tags.length > 0) this.log(` Tags: ${tags.join(', ')}`);\n this.log(` Content: ${content.length} characters\\n`);\n\n const payload = {\n id,\n name,\n description: flags.description ?? `Community skill: ${name}`,\n category: flags.category,\n tools: [flags.tool],\n tags,\n content,\n };\n\n try {\n const result = await apiPost<{ id: string; message: string }>('/api/skills/publish', payload);\n this.log(`Published! ${result.message ?? `Skill \"${name}\" submitted to the registry.`}`);\n } catch (err) {\n if (err instanceof Error) {\n this.error(`Failed to publish: ${err.message}`);\n }\n throw err;\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,MAAM,aAAa;AAI5B,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO,EAAE,aAAa,4BAA4B,UAAU,KAAK,CAAC;AAAA,EAC/E;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,oCAAoC,CAAC;AAAA,IACvE,aAAa,MAAM,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,IACjE,UAAU,MAAM,OAAO;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,QACP;AAAA,QAAY;AAAA,QAAY;AAAA,QAAa;AAAA,QAAQ;AAAA,QAC7C;AAAA,QAAW;AAAA,QAAgB;AAAA,QAAU;AAAA,QACrC;AAAA,QAAe;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAM,MAAM,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,SAAS,CAAC,eAAe,UAAU,WAAW,YAAY,WAAW;AAAA,MACrE,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAM,MAAM,OAAO,EAAE,aAAa,wBAAwB,SAAS,GAAG,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,cAAa;AACtD,SAAK,YAAY;AAEjB,UAAM,WAAgB,aAAQ,KAAK,IAAI;AACvC,QAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,WAAK,MAAM,mBAAmB,QAAQ,EAAE;AAAA,IAC1C;AAEA,UAAM,UAAa,gBAAa,UAAU,OAAO;AACjD,QAAI,QAAQ,KAAK,EAAE,SAAS,IAAI;AAC9B,WAAK,MAAM,oDAAoD;AAAA,IACjE;AAEA,UAAMA,YAAgB,cAAS,UAAe,aAAQ,QAAQ,CAAC;AAC/D,UAAM,OAAO,MAAM,QAAQA,UACxB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,OAAK,EAAE,YAAY,CAAC;AAExC,UAAM,KAAKA,UAAS,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,UAAU,EAAE;AAElF,UAAM,OAAO,MAAM,OACf,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IACvD,CAAC;AAEL,SAAK,IAAI,qBAAqB,IAAI,KAAK,EAAE,GAAG;AAC5C,SAAK,IAAI,eAAe,MAAM,QAAQ,EAAE;AACxC,SAAK,IAAI,WAAW,MAAM,IAAI,EAAE;AAChC,QAAI,KAAK,SAAS,EAAG,MAAK,IAAI,WAAW,KAAK,KAAK,IAAI,CAAC,EAAE;AAC1D,SAAK,IAAI,cAAc,QAAQ,MAAM;AAAA,CAAe;AAEpD,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAa,MAAM,eAAe,oBAAoB,IAAI;AAAA,MAC1D,UAAU,MAAM;AAAA,MAChB,OAAO,CAAC,MAAM,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,QAAyC,uBAAuB,OAAO;AAC5F,WAAK,IAAI,cAAc,OAAO,WAAW,UAAU,IAAI,8BAA8B,EAAE;AAAA,IACzF,SAAS,KAAK;AACZ,UAAI,eAAe,OAAO;AACxB,aAAK,MAAM,sBAAsB,IAAI,OAAO,EAAE;AAAA,MAChD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,MAAM,aAAa;AAI5B,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,MAAM,KAAK,OAAO,EAAE,aAAa,4BAA4B,UAAU,KAAK,CAAC;AAAA,EAC/E;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,oCAAoC,CAAC;AAAA,IACvE,aAAa,MAAM,OAAO,EAAE,aAAa,uBAAuB,CAAC;AAAA,IACjE,UAAU,MAAM,OAAO;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,QACP;AAAA,QAAY;AAAA,QAAY;AAAA,QAAa;AAAA,QAAQ;AAAA,QAC7C;AAAA,QAAW;AAAA,QAAgB;AAAA,QAAU;AAAA,QACrC;AAAA,QAAe;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAM,MAAM,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,SAAS,CAAC,eAAe,UAAU,WAAW,YAAY,WAAW;AAAA,MACrE,SAAS;AAAA,IACX,CAAC;AAAA,IACD,MAAM,MAAM,OAAO,EAAE,aAAa,wBAAwB,SAAS,GAAG,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,cAAa;AACtD,SAAK,YAAY;AAEjB,UAAM,WAAgB,aAAQ,KAAK,IAAI;AACvC,QAAI,CAAI,cAAW,QAAQ,GAAG;AAC5B,WAAK,MAAM,mBAAmB,QAAQ,EAAE;AAAA,IAC1C;AAEA,UAAM,UAAa,gBAAa,UAAU,OAAO;AACjD,QAAI,QAAQ,KAAK,EAAE,SAAS,IAAI;AAC9B,WAAK,MAAM,oDAAoD;AAAA,IACjE;AAEA,UAAMA,YAAgB,cAAS,UAAe,aAAQ,QAAQ,CAAC;AAC/D,UAAM,OAAO,MAAM,QAAQA,UACxB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,OAAK,EAAE,YAAY,CAAC;AAExC,UAAM,KAAKA,UAAS,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,UAAU,EAAE;AAElF,UAAM,OAAO,MAAM,OACf,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IACvD,CAAC;AAEL,SAAK,IAAI,qBAAqB,IAAI,KAAK,EAAE,GAAG;AAC5C,SAAK,IAAI,eAAe,MAAM,QAAQ,EAAE;AACxC,SAAK,IAAI,WAAW,MAAM,IAAI,EAAE;AAChC,QAAI,KAAK,SAAS,EAAG,MAAK,IAAI,WAAW,KAAK,KAAK,IAAI,CAAC,EAAE;AAC1D,SAAK,IAAI,cAAc,QAAQ,MAAM;AAAA,CAAe;AAEpD,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAa,MAAM,eAAe,oBAAoB,IAAI;AAAA,MAC1D,UAAU,MAAM;AAAA,MAChB,OAAO,CAAC,MAAM,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,QAAyC,uBAAuB,OAAO;AAC5F,WAAK,IAAI,cAAc,OAAO,WAAW,UAAU,IAAI,8BAA8B,EAAE;AAAA,IACzF,SAAS,KAAK;AACZ,UAAI,eAAe,OAAO;AACxB,aAAK,MAAM,sBAAsB,IAAI,OAAO,EAAE;AAAA,MAChD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACF;",
6
6
  "names": ["basename"]
7
7
  }
@@ -3,11 +3,12 @@ import {
3
3
  } from "../../chunk-4BHDHHKL.js";
4
4
  import {
5
5
  BaseCommand
6
- } from "../../chunk-SZ7VDCD6.js";
6
+ } from "../../chunk-2HK7RGZB.js";
7
7
  import "../../chunk-R56PH7YE.js";
8
- import "../../chunk-SLL3OBKN.js";
8
+ import "../../chunk-GQNJO2P2.js";
9
+ import "../../chunk-37LN5O7M.js";
9
10
  import "../../chunk-EKJ2CABV.js";
10
- import "../../chunk-ZRLYHBPN.js";
11
+ import "../../chunk-ZUJBM6HE.js";
11
12
  import "../../chunk-W2YERO7E.js";
12
13
  import "../../chunk-NSBPE2FW.js";
13
14
 
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/commands/skills/search.ts"],
4
4
  "sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { loadRegistry } from '../../lib/skills-loader.js';\nimport type { SkillCategory, ToolId } from '@rulemetric/skills-registry';\n\nexport default class SkillsSearch extends BaseCommand {\n static override description = 'Search the community skills registry';\n\n static override examples = [\n '<%= config.bin %> skills search \"tdd\"',\n '<%= config.bin %> skills search --tool cursor --category testing',\n '<%= config.bin %> skills search --language python',\n ];\n\n static override args = {\n query: Args.string({ description: 'Search term', required: false }),\n };\n\n static override flags = {\n tool: Flags.string({ description: 'Filter by tool', options: ['claude_code', 'cursor', 'copilot', 'windsurf', 'cline', 'universal'] }),\n category: Flags.string({ description: 'Filter by category', options: ['workflow', 'language', 'framework', 'tool', 'security', 'testing', 'architecture', 'devops', 'documentation', 'performance'] }),\n language: Flags.string({ description: 'Filter by programming language' }),\n framework: Flags.string({ description: 'Filter by framework' }),\n limit: Flags.integer({ description: 'Max results', default: 20 }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(SkillsSearch);\n\n const catalog = await loadRegistry(this);\n\n const results = catalog.search({\n query: args.query,\n tool: flags.tool as ToolId | undefined,\n category: flags.category as SkillCategory | undefined,\n language: flags.language,\n limit: flags.limit,\n });\n\n if (results.length === 0) {\n this.log('No skills found matching your criteria.');\n this.log('\\nTry a broader search or run: rulemetric skills list');\n return;\n }\n\n this.log(`Found ${results.length} skill${results.length === 1 ? '' : 's'}:\\n`);\n\n for (const skill of results) {\n const stars = skill.popularity?.stars ? ` (${formatStars(skill.popularity.stars)} stars)` : '';\n const tools = skill.tools.join(', ');\n this.log(` ${skill.id}`);\n this.log(` ${skill.name} \u2014 ${skill.description}`);\n this.log(` tools: ${tools} category: ${skill.category}${stars}`);\n if (skill.tags.length > 0) {\n this.log(` tags: ${skill.tags.join(', ')}`);\n }\n this.log('');\n }\n\n this.log(`Run: rulemetric skills install <id> to install a skill`);\n }\n}\n\nfunction formatStars(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAK5B,IAAqB,eAArB,MAAqB,sBAAqB,YAAY;AAAA,EACpD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,OAAO,KAAK,OAAO,EAAE,aAAa,eAAe,UAAU,MAAM,CAAC;AAAA,EACpE;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,kBAAkB,SAAS,CAAC,eAAe,UAAU,WAAW,YAAY,SAAS,WAAW,EAAE,CAAC;AAAA,IACrI,UAAU,MAAM,OAAO,EAAE,aAAa,sBAAsB,SAAS,CAAC,YAAY,YAAY,aAAa,QAAQ,YAAY,WAAW,gBAAgB,UAAU,iBAAiB,aAAa,EAAE,CAAC;AAAA,IACrM,UAAU,MAAM,OAAO,EAAE,aAAa,iCAAiC,CAAC;AAAA,IACxE,WAAW,MAAM,OAAO,EAAE,aAAa,sBAAsB,CAAC;AAAA,IAC9D,OAAO,MAAM,QAAQ,EAAE,aAAa,eAAe,SAAS,GAAG,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,aAAY;AAErD,UAAM,UAAU,MAAM,aAAa,IAAI;AAEvC,UAAM,UAAU,QAAQ,OAAO;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,IACf,CAAC;AAED,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,yCAAyC;AAClD,WAAK,IAAI,uDAAuD;AAChE;AAAA,IACF;AAEA,SAAK,IAAI,SAAS,QAAQ,MAAM,SAAS,QAAQ,WAAW,IAAI,KAAK,GAAG;AAAA,CAAK;AAE7E,eAAW,SAAS,SAAS;AAC3B,YAAM,QAAQ,MAAM,YAAY,QAAQ,KAAK,YAAY,MAAM,WAAW,KAAK,CAAC,YAAY;AAC5F,YAAM,QAAQ,MAAM,MAAM,KAAK,IAAI;AACnC,WAAK,IAAI,KAAK,MAAM,EAAE,EAAE;AACxB,WAAK,IAAI,OAAO,MAAM,IAAI,WAAM,MAAM,WAAW,EAAE;AACnD,WAAK,IAAI,cAAc,KAAK,eAAe,MAAM,QAAQ,GAAG,KAAK,EAAE;AACnE,UAAI,MAAM,KAAK,SAAS,GAAG;AACzB,aAAK,IAAI,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MAC/C;AACA,WAAK,IAAI,EAAE;AAAA,IACb;AAEA,SAAK,IAAI,wDAAwD;AAAA,EACnE;AACF;AAEA,SAAS,YAAY,GAAmB;AACtC,MAAI,KAAK,IAAM,QAAO,IAAI,IAAI,KAAM,QAAQ,CAAC,CAAC;AAC9C,SAAO,OAAO,CAAC;AACjB;",
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA,SAAS,MAAM,aAAa;AAK5B,IAAqB,eAArB,MAAqB,sBAAqB,YAAY;AAAA,EACpD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,OAAO,KAAK,OAAO,EAAE,aAAa,eAAe,UAAU,MAAM,CAAC;AAAA,EACpE;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,aAAa,kBAAkB,SAAS,CAAC,eAAe,UAAU,WAAW,YAAY,SAAS,WAAW,EAAE,CAAC;AAAA,IACrI,UAAU,MAAM,OAAO,EAAE,aAAa,sBAAsB,SAAS,CAAC,YAAY,YAAY,aAAa,QAAQ,YAAY,WAAW,gBAAgB,UAAU,iBAAiB,aAAa,EAAE,CAAC;AAAA,IACrM,UAAU,MAAM,OAAO,EAAE,aAAa,iCAAiC,CAAC;AAAA,IACxE,WAAW,MAAM,OAAO,EAAE,aAAa,sBAAsB,CAAC;AAAA,IAC9D,OAAO,MAAM,QAAQ,EAAE,aAAa,eAAe,SAAS,GAAG,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,aAAY;AAErD,UAAM,UAAU,MAAM,aAAa,IAAI;AAEvC,UAAM,UAAU,QAAQ,OAAO;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,IACf,CAAC;AAED,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,IAAI,yCAAyC;AAClD,WAAK,IAAI,uDAAuD;AAChE;AAAA,IACF;AAEA,SAAK,IAAI,SAAS,QAAQ,MAAM,SAAS,QAAQ,WAAW,IAAI,KAAK,GAAG;AAAA,CAAK;AAE7E,eAAW,SAAS,SAAS;AAC3B,YAAM,QAAQ,MAAM,YAAY,QAAQ,KAAK,YAAY,MAAM,WAAW,KAAK,CAAC,YAAY;AAC5F,YAAM,QAAQ,MAAM,MAAM,KAAK,IAAI;AACnC,WAAK,IAAI,KAAK,MAAM,EAAE,EAAE;AACxB,WAAK,IAAI,OAAO,MAAM,IAAI,WAAM,MAAM,WAAW,EAAE;AACnD,WAAK,IAAI,cAAc,KAAK,eAAe,MAAM,QAAQ,GAAG,KAAK,EAAE;AACnE,UAAI,MAAM,KAAK,SAAS,GAAG;AACzB,aAAK,IAAI,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MAC/C;AACA,WAAK,IAAI,EAAE;AAAA,IACb;AAEA,SAAK,IAAI,wDAAwD;AAAA,EACnE;AACF;AAEA,SAAS,YAAY,GAAmB;AACtC,MAAI,KAAK,IAAM,QAAO,IAAI,IAAI,KAAM,QAAQ,CAAC,CAAC;AAC9C,SAAO,OAAO,CAAC;AACjB;",
6
6
  "names": []
7
7
  }
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-SZ7VDCD6.js";
3
+ } from "../../chunk-2HK7RGZB.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-SLL3OBKN.js";
5
+ import "../../chunk-GQNJO2P2.js";
6
+ import "../../chunk-37LN5O7M.js";
6
7
  import "../../chunk-EKJ2CABV.js";
7
- import "../../chunk-ZRLYHBPN.js";
8
+ import "../../chunk-ZUJBM6HE.js";
8
9
  import "../../chunk-W2YERO7E.js";
9
10
  import "../../chunk-NSBPE2FW.js";
10
11