@rulemetric/cli 0.2.1 → 0.2.3
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.
- package/dist/base-command.js +13 -52
- package/dist/base-command.js.map +7 -1
- package/dist/chunk-2AM54TUK.js +59 -0
- package/dist/chunk-2AM54TUK.js.map +7 -0
- package/dist/chunk-3TIMQ3O6.js +96 -0
- package/dist/chunk-3TIMQ3O6.js.map +7 -0
- package/dist/chunk-4BHDHHKL.js +48 -0
- package/dist/chunk-4BHDHHKL.js.map +7 -0
- package/dist/chunk-4D537GXE.js +99 -0
- package/dist/chunk-4D537GXE.js.map +7 -0
- package/dist/chunk-4SCZK7AL.js +129 -0
- package/dist/chunk-4SCZK7AL.js.map +7 -0
- package/dist/chunk-4WFE4PFP.js +61 -0
- package/dist/chunk-4WFE4PFP.js.map +7 -0
- package/dist/chunk-52WIYRZH.js +73 -0
- package/dist/chunk-52WIYRZH.js.map +7 -0
- package/dist/chunk-7FAA3YNB.js +1549 -0
- package/dist/chunk-7FAA3YNB.js.map +7 -0
- package/dist/chunk-7NYKWN7U.js +12 -0
- package/dist/chunk-7NYKWN7U.js.map +7 -0
- package/dist/chunk-AULP2OWH.js +99 -0
- package/dist/chunk-AULP2OWH.js.map +7 -0
- package/dist/chunk-B5KNTGMJ.js +1788 -0
- package/dist/chunk-B5KNTGMJ.js.map +7 -0
- package/dist/chunk-BD7CY42U.js +23 -0
- package/dist/chunk-BD7CY42U.js.map +7 -0
- package/dist/chunk-BO76WKJR.js +42 -0
- package/dist/chunk-BO76WKJR.js.map +7 -0
- package/dist/chunk-BRD5RUGM.js +53 -0
- package/dist/chunk-BRD5RUGM.js.map +7 -0
- package/dist/chunk-BT6Z6545.js +43 -0
- package/dist/chunk-BT6Z6545.js.map +7 -0
- package/dist/chunk-BZDKEQKU.js +39 -0
- package/dist/chunk-BZDKEQKU.js.map +7 -0
- package/dist/chunk-CROYS75W.js +161 -0
- package/dist/chunk-CROYS75W.js.map +7 -0
- package/dist/chunk-DGHWRQXL.js +17 -0
- package/dist/chunk-DGHWRQXL.js.map +7 -0
- package/dist/chunk-DQ3KELXD.js +74 -0
- package/dist/chunk-DQ3KELXD.js.map +7 -0
- package/dist/chunk-DTFXCHHI.js +108 -0
- package/dist/chunk-DTFXCHHI.js.map +7 -0
- package/dist/chunk-DU73QUS3.js +75 -0
- package/dist/chunk-DU73QUS3.js.map +7 -0
- package/dist/chunk-EHZJ6OXD.js +307 -0
- package/dist/chunk-EHZJ6OXD.js.map +7 -0
- package/dist/chunk-EJOI2ZGU.js +109 -0
- package/dist/chunk-EJOI2ZGU.js.map +7 -0
- package/dist/chunk-EKJ2CABV.js +76 -0
- package/dist/chunk-EKJ2CABV.js.map +7 -0
- package/dist/chunk-EKP32DLN.js +16 -0
- package/dist/chunk-EKP32DLN.js.map +7 -0
- package/dist/chunk-EOOP6WTC.js +148 -0
- package/dist/chunk-EOOP6WTC.js.map +7 -0
- package/dist/chunk-ERPMDAO3.js +20 -0
- package/dist/chunk-ERPMDAO3.js.map +7 -0
- package/dist/chunk-FTJRMUID.js +96 -0
- package/dist/chunk-FTJRMUID.js.map +7 -0
- package/dist/chunk-FZKLLNDS.js +228 -0
- package/dist/chunk-FZKLLNDS.js.map +7 -0
- package/dist/chunk-GQCISMAH.js +157 -0
- package/dist/chunk-GQCISMAH.js.map +7 -0
- package/dist/chunk-IGXX624H.js +55 -0
- package/dist/chunk-IGXX624H.js.map +7 -0
- package/dist/chunk-IJGF2ETG.js +68 -0
- package/dist/chunk-IJGF2ETG.js.map +7 -0
- package/dist/chunk-IWYCRLEK.js +220 -0
- package/dist/chunk-IWYCRLEK.js.map +7 -0
- package/dist/chunk-J7N3DLH6.js +117 -0
- package/dist/chunk-J7N3DLH6.js.map +7 -0
- package/dist/chunk-JX5UI6RW.js +99 -0
- package/dist/chunk-JX5UI6RW.js.map +7 -0
- package/dist/chunk-K3BFZ7KG.js +154 -0
- package/dist/chunk-K3BFZ7KG.js.map +7 -0
- package/dist/chunk-KHJUQFIK.js +51 -0
- package/dist/chunk-KHJUQFIK.js.map +7 -0
- package/dist/chunk-KRBQLMOP.js +41 -0
- package/dist/chunk-KRBQLMOP.js.map +7 -0
- package/dist/chunk-KZRFUXGF.js +145 -0
- package/dist/chunk-KZRFUXGF.js.map +7 -0
- package/dist/chunk-L674RNKQ.js +492 -0
- package/dist/chunk-L674RNKQ.js.map +7 -0
- package/dist/chunk-N52AHNBH.js +47 -0
- package/dist/chunk-N52AHNBH.js.map +7 -0
- package/dist/chunk-NIDLJO6F.js +228 -0
- package/dist/chunk-NIDLJO6F.js.map +7 -0
- package/dist/chunk-NSBPE2FW.js +17 -0
- package/dist/chunk-NSBPE2FW.js.map +7 -0
- package/dist/chunk-OGVORIFM.js +70 -0
- package/dist/chunk-OGVORIFM.js.map +7 -0
- package/dist/chunk-OQSQC7VB.js +77 -0
- package/dist/chunk-OQSQC7VB.js.map +7 -0
- package/dist/chunk-PHLMIZKM.js +153 -0
- package/dist/chunk-PHLMIZKM.js.map +7 -0
- package/dist/chunk-PQU7GZ7A.js +92 -0
- package/dist/chunk-PQU7GZ7A.js.map +7 -0
- package/dist/chunk-PXVQLD7S.js +196 -0
- package/dist/chunk-PXVQLD7S.js.map +7 -0
- package/dist/chunk-QD6X4L4L.js +79 -0
- package/dist/chunk-QD6X4L4L.js.map +7 -0
- package/dist/chunk-QJQS6TUN.js +44 -0
- package/dist/chunk-QJQS6TUN.js.map +7 -0
- package/dist/chunk-QJXAULRC.js +191 -0
- package/dist/chunk-QJXAULRC.js.map +7 -0
- package/dist/chunk-QN34TGD3.js +83 -0
- package/dist/chunk-QN34TGD3.js.map +7 -0
- package/dist/chunk-R5MFHGHR.js +122 -0
- package/dist/chunk-R5MFHGHR.js.map +7 -0
- package/dist/chunk-RH7NHVSK.js +16 -0
- package/dist/chunk-RH7NHVSK.js.map +7 -0
- package/dist/chunk-RJ7BHDLM.js +121 -0
- package/dist/chunk-RJ7BHDLM.js.map +7 -0
- package/dist/chunk-RQ2TMLKG.js +142 -0
- package/dist/chunk-RQ2TMLKG.js.map +7 -0
- package/dist/chunk-S56LOTGQ.js +63 -0
- package/dist/chunk-S56LOTGQ.js.map +7 -0
- package/dist/chunk-UF73WX2J.js +49 -0
- package/dist/chunk-UF73WX2J.js.map +7 -0
- package/dist/chunk-W53GKIZQ.js +50 -0
- package/dist/chunk-W53GKIZQ.js.map +7 -0
- package/dist/chunk-WA4MWYRW.js +254 -0
- package/dist/chunk-WA4MWYRW.js.map +7 -0
- package/dist/chunk-WFULKPEQ.js +269 -0
- package/dist/chunk-WFULKPEQ.js.map +7 -0
- package/dist/chunk-XC6M4CSW.js +44 -0
- package/dist/chunk-XC6M4CSW.js.map +7 -0
- package/dist/chunk-XPUEGHXN.js +243 -0
- package/dist/chunk-XPUEGHXN.js.map +7 -0
- package/dist/chunk-XZXS2W24.js +148 -0
- package/dist/chunk-XZXS2W24.js.map +7 -0
- package/dist/chunk-YBNW7ARH.js +167 -0
- package/dist/chunk-YBNW7ARH.js.map +7 -0
- package/dist/chunk-YNIH3KMU.js +121 -0
- package/dist/chunk-YNIH3KMU.js.map +7 -0
- package/dist/commands/antigravity/backfill.js +135 -0
- package/dist/commands/antigravity/backfill.js.map +7 -0
- package/dist/commands/auth/create-key.js +48 -33
- package/dist/commands/auth/create-key.js.map +7 -1
- package/dist/commands/auth/login.js +58 -46
- package/dist/commands/auth/login.js.map +7 -1
- package/dist/commands/auth/logout.js +28 -13
- package/dist/commands/auth/logout.js.map +7 -1
- package/dist/commands/auth/revoke-key.js +32 -18
- package/dist/commands/auth/revoke-key.js.map +7 -1
- package/dist/commands/auth/status.js +40 -22
- package/dist/commands/auth/status.js.map +7 -1
- package/dist/commands/catalog/index.js +50 -34
- package/dist/commands/catalog/index.js.map +7 -1
- package/dist/commands/catalog/recommend.js +41 -26
- package/dist/commands/catalog/recommend.js.map +7 -1
- package/dist/commands/convert.js +72 -54
- package/dist/commands/convert.js.map +7 -1
- package/dist/commands/converters.js +52 -38
- package/dist/commands/converters.js.map +7 -1
- package/dist/commands/crons/list.js +50 -24
- package/dist/commands/crons/list.js.map +7 -1
- package/dist/commands/crons/run.js +72 -47
- package/dist/commands/crons/run.js.map +7 -1
- package/dist/commands/dashboard.js +45 -24
- package/dist/commands/dashboard.js.map +7 -1
- package/dist/commands/eval-targets/create.js +51 -39
- package/dist/commands/eval-targets/create.js.map +7 -1
- package/dist/commands/eval-targets/list.js +52 -35
- package/dist/commands/eval-targets/list.js.map +7 -1
- package/dist/commands/evals/agent.js +292 -0
- package/dist/commands/evals/agent.js.map +7 -0
- package/dist/commands/evals/benchmark.js +70 -51
- package/dist/commands/evals/benchmark.js.map +7 -1
- package/dist/commands/evals/compare.js +90 -78
- package/dist/commands/evals/compare.js.map +7 -1
- package/dist/commands/evals/create.js +64 -50
- package/dist/commands/evals/create.js.map +7 -1
- package/dist/commands/evals/optimize-description.js +225 -222
- package/dist/commands/evals/optimize-description.js.map +7 -1
- package/dist/commands/evals/optimize.js +206 -196
- package/dist/commands/evals/optimize.js.map +7 -1
- package/dist/commands/evals/run.js +178 -164
- package/dist/commands/evals/run.js.map +7 -1
- package/dist/commands/gateway/ensure.js +33 -19
- package/dist/commands/gateway/ensure.js.map +7 -1
- package/dist/commands/hooks/install.js +335 -275
- package/dist/commands/hooks/install.js.map +7 -1
- package/dist/commands/hooks/run.js +72 -53
- package/dist/commands/hooks/run.js.map +7 -1
- package/dist/commands/hooks/uninstall.js +117 -94
- package/dist/commands/hooks/uninstall.js.map +7 -1
- package/dist/commands/import.js +63 -53
- package/dist/commands/import.js.map +7 -1
- package/dist/commands/instructions/create.js +71 -58
- package/dist/commands/instructions/create.js.map +7 -1
- package/dist/commands/instructions/delete.js +53 -36
- package/dist/commands/instructions/delete.js.map +7 -1
- package/dist/commands/instructions/fork.js +33 -19
- package/dist/commands/instructions/fork.js.map +7 -1
- package/dist/commands/instructions/get.js +66 -49
- package/dist/commands/instructions/get.js.map +7 -1
- package/dist/commands/instructions/list.js +63 -46
- package/dist/commands/instructions/list.js.map +7 -1
- package/dist/commands/instructions/promote.js +41 -27
- package/dist/commands/instructions/promote.js.map +7 -1
- package/dist/commands/instructions/pull.js +37 -21
- package/dist/commands/instructions/pull.js.map +7 -1
- package/dist/commands/instructions/upstream.js +36 -21
- package/dist/commands/instructions/upstream.js.map +7 -1
- package/dist/commands/instructions/versions.js +51 -33
- package/dist/commands/instructions/versions.js.map +7 -1
- package/dist/commands/launcher.js +39 -0
- package/dist/commands/launcher.js.map +7 -0
- package/dist/commands/org/current.js +74 -68
- package/dist/commands/org/current.js.map +7 -1
- package/dist/commands/org/list.js +50 -36
- package/dist/commands/org/list.js.map +7 -1
- package/dist/commands/org/switch.js +69 -51
- package/dist/commands/org/switch.js.map +7 -1
- package/dist/commands/packs/add-instruction.js +36 -22
- package/dist/commands/packs/add-instruction.js.map +7 -1
- package/dist/commands/packs/apply.js +38 -24
- package/dist/commands/packs/apply.js.map +7 -1
- package/dist/commands/packs/create.js +47 -33
- package/dist/commands/packs/create.js.map +7 -1
- package/dist/commands/packs/fork.js +33 -19
- package/dist/commands/packs/fork.js.map +7 -1
- package/dist/commands/packs/get.js +54 -35
- package/dist/commands/packs/get.js.map +7 -1
- package/dist/commands/packs/list.js +64 -47
- package/dist/commands/packs/list.js.map +7 -1
- package/dist/commands/packs/remove-instruction.js +34 -20
- package/dist/commands/packs/remove-instruction.js.map +7 -1
- package/dist/commands/proxy/env.js +126 -116
- package/dist/commands/proxy/env.js.map +7 -1
- package/dist/commands/proxy/logs.js +83 -74
- package/dist/commands/proxy/logs.js.map +7 -1
- package/dist/commands/proxy/restart.js +34 -36
- package/dist/commands/proxy/restart.js.map +7 -1
- package/dist/commands/proxy/setup.js +432 -375
- package/dist/commands/proxy/setup.js.map +7 -1
- package/dist/commands/proxy/start.js +289 -289
- package/dist/commands/proxy/start.js.map +7 -1
- package/dist/commands/proxy/status.js +74 -64
- package/dist/commands/proxy/status.js.map +7 -1
- package/dist/commands/proxy/stop.js +81 -75
- package/dist/commands/proxy/stop.js.map +7 -1
- package/dist/commands/research/backfill.js +58 -0
- package/dist/commands/research/backfill.js.map +7 -0
- package/dist/commands/research/tail-transcript.js +69 -0
- package/dist/commands/research/tail-transcript.js.map +7 -0
- package/dist/commands/service/install.js +639 -405
- package/dist/commands/service/install.js.map +7 -1
- package/dist/commands/service/status.js +178 -111
- package/dist/commands/service/status.js.map +7 -1
- package/dist/commands/service/uninstall.js +85 -110
- package/dist/commands/service/uninstall.js.map +7 -1
- package/dist/commands/sessions/analyze.js +46 -25
- package/dist/commands/sessions/analyze.js.map +7 -1
- package/dist/commands/sessions/end.js +81 -79
- package/dist/commands/sessions/end.js.map +7 -1
- package/dist/commands/sessions/import.js +44 -27
- package/dist/commands/sessions/import.js.map +7 -1
- package/dist/commands/sessions/list.js +46 -33
- package/dist/commands/sessions/list.js.map +7 -1
- package/dist/commands/sessions/start.js +88 -87
- package/dist/commands/sessions/start.js.map +7 -1
- package/dist/commands/signals/report.js +42 -34
- package/dist/commands/signals/report.js.map +7 -1
- package/dist/commands/skills/export-approved.js +44 -30
- package/dist/commands/skills/export-approved.js.map +7 -1
- package/dist/commands/skills/install.js +99 -84
- package/dist/commands/skills/install.js.map +7 -1
- package/dist/commands/skills/list.js +59 -42
- package/dist/commands/skills/list.js.map +7 -1
- package/dist/commands/skills/publish.js +95 -78
- package/dist/commands/skills/publish.js.map +7 -1
- package/dist/commands/skills/search.js +68 -53
- package/dist/commands/skills/search.js.map +7 -1
- package/dist/commands/skills/update.js +52 -39
- package/dist/commands/skills/update.js.map +7 -1
- package/dist/commands/suggestions/accept.js +82 -59
- package/dist/commands/suggestions/accept.js.map +7 -1
- package/dist/commands/suggestions/dismiss.js +44 -26
- package/dist/commands/suggestions/dismiss.js.map +7 -1
- package/dist/commands/suggestions/list.js +59 -39
- package/dist/commands/suggestions/list.js.map +7 -1
- package/dist/commands/suggestions/refresh.js +26 -11
- package/dist/commands/suggestions/refresh.js.map +7 -1
- package/dist/cursor-BGQJ4CWI.js +134 -0
- package/dist/cursor-BGQJ4CWI.js.map +7 -0
- package/dist/dashboard/Dashboard.js +229 -126
- package/dist/dashboard/Dashboard.js.map +7 -1
- package/dist/dashboard/data.js +13 -137
- package/dist/dashboard/data.js.map +7 -1
- package/dist/dashboard/launcher/ActiveJobsList.js +10 -0
- package/dist/dashboard/launcher/ActiveJobsList.js.map +7 -0
- package/dist/dashboard/launcher/LauncherOverlay.js +14 -0
- package/dist/dashboard/launcher/LauncherOverlay.js.map +7 -0
- package/dist/dashboard/launcher/NewLaunchForm.js +10 -0
- package/dist/dashboard/launcher/NewLaunchForm.js.map +7 -0
- package/dist/dashboard/launcher/api.js +14 -0
- package/dist/dashboard/launcher/api.js.map +7 -0
- package/dist/dashboard/launcher/tool-labels.js +10 -0
- package/dist/dashboard/launcher/tool-labels.js.map +7 -0
- package/dist/dashboard/launcher/types.js +1 -0
- package/dist/dashboard/launcher/types.js.map +7 -0
- package/dist/dashboard/launcher/useLaunchJobs.js +9 -0
- package/dist/dashboard/launcher/useLaunchJobs.js.map +7 -0
- package/dist/dashboard/panels/friction.js +10 -22
- package/dist/dashboard/panels/friction.js.map +7 -1
- package/dist/dashboard/panels/insights.js +10 -109
- package/dist/dashboard/panels/insights.js.map +7 -1
- package/dist/dashboard/panels/instructions.js +10 -17
- package/dist/dashboard/panels/instructions.js.map +7 -1
- package/dist/dashboard/panels/outcomes.js +9 -28
- package/dist/dashboard/panels/outcomes.js.map +7 -1
- package/dist/dashboard/panels/overview.js +10 -20
- package/dist/dashboard/panels/overview.js.map +7 -1
- package/dist/dashboard/panels/shared.js +18 -61
- package/dist/dashboard/panels/shared.js.map +7 -1
- package/dist/dashboard/types.js +23 -26
- package/dist/dashboard/types.js.map +7 -1
- package/dist/dist-CSUYFYKI.js +52 -0
- package/dist/dist-CSUYFYKI.js.map +7 -0
- package/dist/index.js +8 -2
- package/dist/index.js.map +7 -1
- package/dist/lib/active-org-refresh.js +15 -108
- package/dist/lib/active-org-refresh.js.map +7 -1
- package/dist/lib/active-org.js +15 -95
- package/dist/lib/active-org.js.map +7 -1
- package/dist/lib/agent-loop.js +44 -0
- package/dist/lib/agent-loop.js.map +7 -0
- package/dist/lib/antigravity-transcript.js +22 -0
- package/dist/lib/antigravity-transcript.js.map +7 -0
- package/dist/lib/api-client.js +21 -92
- package/dist/lib/api-client.js.map +7 -1
- package/dist/lib/auth.js +26 -137
- package/dist/lib/auth.js.map +7 -1
- package/dist/lib/detect-languages.js +8 -113
- package/dist/lib/detect-languages.js.map +7 -1
- package/dist/lib/detect-tmux.js +9 -0
- package/dist/lib/detect-tmux.js.map +7 -0
- package/dist/lib/eval-analyzer.js +9 -89
- package/dist/lib/eval-analyzer.js.map +7 -1
- package/dist/lib/eval-benchmark.js +12 -92
- package/dist/lib/eval-benchmark.js.map +7 -1
- package/dist/lib/eval-conversation-handler.js +13 -200
- package/dist/lib/eval-conversation-handler.js.map +7 -1
- package/dist/lib/eval-executor.js +8 -83
- package/dist/lib/eval-executor.js.map +7 -1
- package/dist/lib/eval-grader.js +9 -123
- package/dist/lib/eval-grader.js.map +7 -1
- package/dist/lib/eval-meta-judge.js +9 -116
- package/dist/lib/eval-meta-judge.js.map +7 -1
- package/dist/lib/eval-trigger-tester.js +11 -96
- package/dist/lib/eval-trigger-tester.js.map +7 -1
- package/dist/lib/eval-worktree.js +8 -87
- package/dist/lib/eval-worktree.js.map +7 -1
- package/dist/lib/gateway-entry.js +20 -18
- package/dist/lib/gateway-entry.js.map +7 -1
- package/dist/lib/gateway-lifecycle.js +22 -97
- package/dist/lib/gateway-lifecycle.js.map +7 -1
- package/dist/lib/gateway.js +12 -216
- package/dist/lib/gateway.js.map +7 -1
- package/dist/lib/handlers/cron-close-stale-sessions.js +18 -7
- package/dist/lib/handlers/cron-close-stale-sessions.js.map +7 -1
- package/dist/lib/handlers/cron-data-integrity-audit.js +21 -15
- package/dist/lib/handlers/cron-data-integrity-audit.js.map +7 -1
- package/dist/lib/handlers/cron-refresh-skills.js +7 -90
- package/dist/lib/handlers/cron-refresh-skills.js.map +7 -1
- package/dist/lib/handlers/cron-suggest-instructions.js +14 -158
- package/dist/lib/handlers/cron-suggest-instructions.js.map +7 -1
- package/dist/lib/handlers/process-announcement.js +11 -0
- package/dist/lib/handlers/process-announcement.js.map +7 -0
- package/dist/lib/handlers/process-changelog.js +11 -0
- package/dist/lib/handlers/process-changelog.js.map +7 -0
- package/dist/lib/handlers/process-conversation.js +14 -35
- package/dist/lib/handlers/process-conversation.js.map +7 -1
- package/dist/lib/handlers/process-eval.js +15 -207
- package/dist/lib/handlers/process-eval.js.map +7 -1
- package/dist/lib/handlers/process-insights.js +14 -300
- package/dist/lib/handlers/process-insights.js.map +7 -1
- package/dist/lib/handlers/process-launch.js +16 -41
- package/dist/lib/handlers/process-launch.js.map +7 -1
- package/dist/lib/handlers/process-run-cleanup.js +13 -0
- package/dist/lib/handlers/process-run-cleanup.js.map +7 -0
- package/dist/lib/handlers/process-send-message.js +10 -0
- package/dist/lib/handlers/process-send-message.js.map +7 -0
- package/dist/lib/handlers/process-session-goal.js +11 -74
- package/dist/lib/handlers/process-session-goal.js.map +7 -1
- package/dist/lib/hooks-config.js +52 -544
- package/dist/lib/hooks-config.js.map +7 -1
- package/dist/lib/insights-prompts.js +12 -145
- package/dist/lib/insights-prompts.js.map +7 -1
- package/dist/lib/job-helpers.js +1 -0
- package/dist/lib/job-helpers.js.map +7 -0
- package/dist/lib/llm-client.js +16 -274
- package/dist/lib/llm-client.js.map +7 -1
- package/dist/lib/manual-tasks.js +22 -0
- package/dist/lib/manual-tasks.js.map +7 -0
- package/dist/lib/output.js +12 -36
- package/dist/lib/output.js.map +7 -1
- package/dist/lib/permanent-job-error.js +10 -23
- package/dist/lib/permanent-job-error.js.map +7 -1
- package/dist/lib/provider-aggregator.js +57 -55
- package/dist/lib/provider-aggregator.js.map +7 -1
- package/dist/lib/research-client.js +12 -0
- package/dist/lib/research-client.js.map +7 -0
- package/dist/lib/skills-loader.js +8 -51
- package/dist/lib/skills-loader.js.map +7 -1
- package/dist/lib/statusline-shim.js +16 -0
- package/dist/lib/statusline-shim.js.map +7 -0
- package/dist/lib/terminal-target-heartbeat.js +15 -0
- package/dist/lib/terminal-target-heartbeat.js.map +7 -0
- package/dist/lib/tmux.js +16 -0
- package/dist/lib/tmux.js.map +7 -0
- package/dist/lib/transcript-rate-limit-watcher.js +22 -0
- package/dist/lib/transcript-rate-limit-watcher.js.map +7 -0
- package/dist/lib/types.js +8 -7
- package/dist/lib/types.js.map +7 -1
- package/dist/lib/version-check.js +10 -106
- package/dist/lib/version-check.js.map +7 -1
- package/dist/lib/which.js +8 -0
- package/dist/lib/which.js.map +7 -0
- package/dist/lib/worktree.js +17 -0
- package/dist/lib/worktree.js.map +7 -0
- package/dist/opencode-IQ7X5YMJ.js +190 -0
- package/dist/opencode-IQ7X5YMJ.js.map +7 -0
- package/oclif.manifest.json +299 -66
- package/package.json +26 -10
- package/dist/base-command.d.ts +0 -12
- package/dist/base-command.d.ts.map +0 -1
- package/dist/commands/auth/create-key.d.ts +0 -11
- package/dist/commands/auth/create-key.d.ts.map +0 -1
- package/dist/commands/auth/login.d.ts +0 -11
- package/dist/commands/auth/login.d.ts.map +0 -1
- package/dist/commands/auth/logout.d.ts +0 -7
- package/dist/commands/auth/logout.d.ts.map +0 -1
- package/dist/commands/auth/revoke-key.d.ts +0 -10
- package/dist/commands/auth/revoke-key.d.ts.map +0 -1
- package/dist/commands/auth/status.d.ts +0 -7
- package/dist/commands/auth/status.d.ts.map +0 -1
- package/dist/commands/catalog/index.d.ts +0 -11
- package/dist/commands/catalog/index.d.ts.map +0 -1
- package/dist/commands/catalog/recommend.d.ts +0 -9
- package/dist/commands/catalog/recommend.d.ts.map +0 -1
- package/dist/commands/convert.d.ts +0 -15
- package/dist/commands/convert.d.ts.map +0 -1
- package/dist/commands/converters.d.ts +0 -12
- package/dist/commands/converters.d.ts.map +0 -1
- package/dist/commands/crons/list.d.ts +0 -7
- package/dist/commands/crons/list.d.ts.map +0 -1
- package/dist/commands/crons/run.d.ts +0 -13
- package/dist/commands/crons/run.d.ts.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -10
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/eval-targets/create.d.ts +0 -14
- package/dist/commands/eval-targets/create.d.ts.map +0 -1
- package/dist/commands/eval-targets/list.d.ts +0 -10
- package/dist/commands/eval-targets/list.d.ts.map +0 -1
- package/dist/commands/evals/benchmark.d.ts +0 -13
- package/dist/commands/evals/benchmark.d.ts.map +0 -1
- package/dist/commands/evals/compare.d.ts +0 -15
- package/dist/commands/evals/compare.d.ts.map +0 -1
- package/dist/commands/evals/create.d.ts +0 -17
- package/dist/commands/evals/create.d.ts.map +0 -1
- package/dist/commands/evals/listen.d.ts +0 -37
- package/dist/commands/evals/listen.d.ts.map +0 -1
- package/dist/commands/evals/listen.js +0 -188
- package/dist/commands/evals/listen.js.map +0 -1
- package/dist/commands/evals/listen.test.d.ts +0 -2
- package/dist/commands/evals/listen.test.d.ts.map +0 -1
- package/dist/commands/evals/listen.test.js +0 -48
- package/dist/commands/evals/listen.test.js.map +0 -1
- package/dist/commands/evals/optimize-description.d.ts +0 -22
- package/dist/commands/evals/optimize-description.d.ts.map +0 -1
- package/dist/commands/evals/optimize.d.ts +0 -22
- package/dist/commands/evals/optimize.d.ts.map +0 -1
- package/dist/commands/evals/run.d.ts +0 -21
- package/dist/commands/evals/run.d.ts.map +0 -1
- package/dist/commands/gateway/ensure.d.ts +0 -7
- package/dist/commands/gateway/ensure.d.ts.map +0 -1
- package/dist/commands/hooks/install.d.ts +0 -16
- package/dist/commands/hooks/install.d.ts.map +0 -1
- package/dist/commands/hooks/run.d.ts +0 -11
- package/dist/commands/hooks/run.d.ts.map +0 -1
- package/dist/commands/hooks/uninstall.d.ts +0 -7
- package/dist/commands/hooks/uninstall.d.ts.map +0 -1
- package/dist/commands/import.d.ts +0 -17
- package/dist/commands/import.d.ts.map +0 -1
- package/dist/commands/instructions/create.d.ts +0 -17
- package/dist/commands/instructions/create.d.ts.map +0 -1
- package/dist/commands/instructions/delete.d.ts +0 -13
- package/dist/commands/instructions/delete.d.ts.map +0 -1
- package/dist/commands/instructions/fork.d.ts +0 -10
- package/dist/commands/instructions/fork.d.ts.map +0 -1
- package/dist/commands/instructions/get.d.ts +0 -15
- package/dist/commands/instructions/get.d.ts.map +0 -1
- package/dist/commands/instructions/list.d.ts +0 -12
- package/dist/commands/instructions/list.d.ts.map +0 -1
- package/dist/commands/instructions/promote.d.ts +0 -14
- package/dist/commands/instructions/promote.d.ts.map +0 -1
- package/dist/commands/instructions/pull.d.ts +0 -9
- package/dist/commands/instructions/pull.d.ts.map +0 -1
- package/dist/commands/instructions/upstream.d.ts +0 -9
- package/dist/commands/instructions/upstream.d.ts.map +0 -1
- package/dist/commands/instructions/versions.d.ts +0 -12
- package/dist/commands/instructions/versions.d.ts.map +0 -1
- package/dist/commands/org/current.d.ts +0 -7
- package/dist/commands/org/current.d.ts.map +0 -1
- package/dist/commands/org/list.d.ts +0 -7
- package/dist/commands/org/list.d.ts.map +0 -1
- package/dist/commands/org/switch.d.ts +0 -13
- package/dist/commands/org/switch.d.ts.map +0 -1
- package/dist/commands/packs/add-instruction.d.ts +0 -11
- package/dist/commands/packs/add-instruction.d.ts.map +0 -1
- package/dist/commands/packs/apply.d.ts +0 -13
- package/dist/commands/packs/apply.d.ts.map +0 -1
- package/dist/commands/packs/create.d.ts +0 -13
- package/dist/commands/packs/create.d.ts.map +0 -1
- package/dist/commands/packs/fork.d.ts +0 -10
- package/dist/commands/packs/fork.d.ts.map +0 -1
- package/dist/commands/packs/get.d.ts +0 -10
- package/dist/commands/packs/get.d.ts.map +0 -1
- package/dist/commands/packs/list.d.ts +0 -22
- package/dist/commands/packs/list.d.ts.map +0 -1
- package/dist/commands/packs/remove-instruction.d.ts +0 -11
- package/dist/commands/packs/remove-instruction.d.ts.map +0 -1
- package/dist/commands/proxy/env.d.ts +0 -14
- package/dist/commands/proxy/env.d.ts.map +0 -1
- package/dist/commands/proxy/logs.d.ts +0 -11
- package/dist/commands/proxy/logs.d.ts.map +0 -1
- package/dist/commands/proxy/restart.d.ts +0 -11
- package/dist/commands/proxy/restart.d.ts.map +0 -1
- package/dist/commands/proxy/setup.d.ts +0 -23
- package/dist/commands/proxy/setup.d.ts.map +0 -1
- package/dist/commands/proxy/start.d.ts +0 -17
- package/dist/commands/proxy/start.d.ts.map +0 -1
- package/dist/commands/proxy/status.d.ts +0 -7
- package/dist/commands/proxy/status.d.ts.map +0 -1
- package/dist/commands/proxy/stop.d.ts +0 -8
- package/dist/commands/proxy/stop.d.ts.map +0 -1
- package/dist/commands/service/install.d.ts +0 -33
- package/dist/commands/service/install.d.ts.map +0 -1
- package/dist/commands/service/install.test.d.ts +0 -2
- package/dist/commands/service/install.test.d.ts.map +0 -1
- package/dist/commands/service/install.test.js +0 -345
- package/dist/commands/service/install.test.js.map +0 -1
- package/dist/commands/service/status.d.ts +0 -6
- package/dist/commands/service/status.d.ts.map +0 -1
- package/dist/commands/service/uninstall.d.ts +0 -6
- package/dist/commands/service/uninstall.d.ts.map +0 -1
- package/dist/commands/sessions/analyze.d.ts +0 -10
- package/dist/commands/sessions/analyze.d.ts.map +0 -1
- package/dist/commands/sessions/end.d.ts +0 -9
- package/dist/commands/sessions/end.d.ts.map +0 -1
- package/dist/commands/sessions/import.d.ts +0 -13
- package/dist/commands/sessions/import.d.ts.map +0 -1
- package/dist/commands/sessions/list.d.ts +0 -11
- package/dist/commands/sessions/list.d.ts.map +0 -1
- package/dist/commands/sessions/start.d.ts +0 -11
- package/dist/commands/sessions/start.d.ts.map +0 -1
- package/dist/commands/signals/report.d.ts +0 -10
- package/dist/commands/signals/report.d.ts.map +0 -1
- package/dist/commands/signals/report.test.d.ts +0 -2
- package/dist/commands/signals/report.test.d.ts.map +0 -1
- package/dist/commands/signals/report.test.js +0 -65
- package/dist/commands/signals/report.test.js.map +0 -1
- package/dist/commands/skills/export-approved.d.ts +0 -10
- package/dist/commands/skills/export-approved.d.ts.map +0 -1
- package/dist/commands/skills/install.d.ts +0 -15
- package/dist/commands/skills/install.d.ts.map +0 -1
- package/dist/commands/skills/list.d.ts +0 -11
- package/dist/commands/skills/list.d.ts.map +0 -1
- package/dist/commands/skills/publish.d.ts +0 -17
- package/dist/commands/skills/publish.d.ts.map +0 -1
- package/dist/commands/skills/search.d.ts +0 -17
- package/dist/commands/skills/search.d.ts.map +0 -1
- package/dist/commands/skills/update.d.ts +0 -10
- package/dist/commands/skills/update.d.ts.map +0 -1
- package/dist/commands/suggestions/accept.d.ts +0 -16
- package/dist/commands/suggestions/accept.d.ts.map +0 -1
- package/dist/commands/suggestions/accept.test.d.ts +0 -2
- package/dist/commands/suggestions/accept.test.d.ts.map +0 -1
- package/dist/commands/suggestions/accept.test.js +0 -52
- package/dist/commands/suggestions/accept.test.js.map +0 -1
- package/dist/commands/suggestions/dismiss.d.ts +0 -10
- package/dist/commands/suggestions/dismiss.d.ts.map +0 -1
- package/dist/commands/suggestions/list.d.ts +0 -10
- package/dist/commands/suggestions/list.d.ts.map +0 -1
- package/dist/commands/suggestions/refresh.d.ts +0 -7
- package/dist/commands/suggestions/refresh.d.ts.map +0 -1
- package/dist/dashboard/Dashboard.d.ts +0 -3
- package/dist/dashboard/Dashboard.d.ts.map +0 -1
- package/dist/dashboard/data.d.ts +0 -11
- package/dist/dashboard/data.d.ts.map +0 -1
- package/dist/dashboard/panels/friction.d.ts +0 -7
- package/dist/dashboard/panels/friction.d.ts.map +0 -1
- package/dist/dashboard/panels/insights.d.ts +0 -8
- package/dist/dashboard/panels/insights.d.ts.map +0 -1
- package/dist/dashboard/panels/instructions.d.ts +0 -9
- package/dist/dashboard/panels/instructions.d.ts.map +0 -1
- package/dist/dashboard/panels/outcomes.d.ts +0 -7
- package/dist/dashboard/panels/outcomes.d.ts.map +0 -1
- package/dist/dashboard/panels/overview.d.ts +0 -8
- package/dist/dashboard/panels/overview.d.ts.map +0 -1
- package/dist/dashboard/panels/shared.d.ts +0 -17
- package/dist/dashboard/panels/shared.d.ts.map +0 -1
- package/dist/dashboard/types.d.ts +0 -80
- package/dist/dashboard/types.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/active-org-refresh.d.ts +0 -22
- package/dist/lib/active-org-refresh.d.ts.map +0 -1
- package/dist/lib/active-org-refresh.test.d.ts +0 -2
- package/dist/lib/active-org-refresh.test.d.ts.map +0 -1
- package/dist/lib/active-org-refresh.test.js +0 -190
- package/dist/lib/active-org-refresh.test.js.map +0 -1
- package/dist/lib/active-org.d.ts +0 -43
- package/dist/lib/active-org.d.ts.map +0 -1
- package/dist/lib/active-org.test.d.ts +0 -2
- package/dist/lib/active-org.test.d.ts.map +0 -1
- package/dist/lib/active-org.test.js +0 -147
- package/dist/lib/active-org.test.js.map +0 -1
- package/dist/lib/api-client.d.ts +0 -17
- package/dist/lib/api-client.d.ts.map +0 -1
- package/dist/lib/api-client.test.d.ts +0 -2
- package/dist/lib/api-client.test.d.ts.map +0 -1
- package/dist/lib/api-client.test.js +0 -161
- package/dist/lib/api-client.test.js.map +0 -1
- package/dist/lib/auth.d.ts +0 -27
- package/dist/lib/auth.d.ts.map +0 -1
- package/dist/lib/auth.test.d.ts +0 -2
- package/dist/lib/auth.test.d.ts.map +0 -1
- package/dist/lib/auth.test.js +0 -110
- package/dist/lib/auth.test.js.map +0 -1
- package/dist/lib/cron-registry.d.ts +0 -47
- package/dist/lib/cron-registry.d.ts.map +0 -1
- package/dist/lib/cron-registry.js +0 -102
- package/dist/lib/cron-registry.js.map +0 -1
- package/dist/lib/cron-registry.test.d.ts +0 -2
- package/dist/lib/cron-registry.test.d.ts.map +0 -1
- package/dist/lib/cron-registry.test.js +0 -136
- package/dist/lib/cron-registry.test.js.map +0 -1
- package/dist/lib/cron-runner.d.ts +0 -16
- package/dist/lib/cron-runner.d.ts.map +0 -1
- package/dist/lib/cron-runner.js +0 -68
- package/dist/lib/cron-runner.js.map +0 -1
- package/dist/lib/detect-languages.d.ts +0 -7
- package/dist/lib/detect-languages.d.ts.map +0 -1
- package/dist/lib/detect-languages.test.d.ts +0 -2
- package/dist/lib/detect-languages.test.d.ts.map +0 -1
- package/dist/lib/detect-languages.test.js +0 -29
- package/dist/lib/detect-languages.test.js.map +0 -1
- package/dist/lib/eval-analyzer.d.ts +0 -23
- package/dist/lib/eval-analyzer.d.ts.map +0 -1
- package/dist/lib/eval-benchmark.d.ts +0 -17
- package/dist/lib/eval-benchmark.d.ts.map +0 -1
- package/dist/lib/eval-conversation-handler.d.ts +0 -9
- package/dist/lib/eval-conversation-handler.d.ts.map +0 -1
- package/dist/lib/eval-executor.d.ts +0 -21
- package/dist/lib/eval-executor.d.ts.map +0 -1
- package/dist/lib/eval-executor.test.d.ts +0 -2
- package/dist/lib/eval-executor.test.d.ts.map +0 -1
- package/dist/lib/eval-executor.test.js +0 -8
- package/dist/lib/eval-executor.test.js.map +0 -1
- package/dist/lib/eval-grader.d.ts +0 -38
- package/dist/lib/eval-grader.d.ts.map +0 -1
- package/dist/lib/eval-grader.test.d.ts +0 -2
- package/dist/lib/eval-grader.test.d.ts.map +0 -1
- package/dist/lib/eval-grader.test.js +0 -8
- package/dist/lib/eval-grader.test.js.map +0 -1
- package/dist/lib/eval-meta-judge.d.ts +0 -28
- package/dist/lib/eval-meta-judge.d.ts.map +0 -1
- package/dist/lib/eval-trigger-tester.d.ts +0 -19
- package/dist/lib/eval-trigger-tester.d.ts.map +0 -1
- package/dist/lib/eval-worktree.d.ts +0 -11
- package/dist/lib/eval-worktree.d.ts.map +0 -1
- package/dist/lib/eval-worktree.test.d.ts +0 -2
- package/dist/lib/eval-worktree.test.d.ts.map +0 -1
- package/dist/lib/eval-worktree.test.js +0 -68
- package/dist/lib/eval-worktree.test.js.map +0 -1
- package/dist/lib/gateway-entry.d.ts +0 -3
- package/dist/lib/gateway-entry.d.ts.map +0 -1
- package/dist/lib/gateway-lifecycle.d.ts +0 -9
- package/dist/lib/gateway-lifecycle.d.ts.map +0 -1
- package/dist/lib/gateway.d.ts +0 -11
- package/dist/lib/gateway.d.ts.map +0 -1
- package/dist/lib/graphile-worker-runner.d.ts +0 -124
- package/dist/lib/graphile-worker-runner.d.ts.map +0 -1
- package/dist/lib/graphile-worker-runner.js +0 -530
- package/dist/lib/graphile-worker-runner.js.map +0 -1
- package/dist/lib/graphile-worker-runner.test.d.ts +0 -2
- package/dist/lib/graphile-worker-runner.test.d.ts.map +0 -1
- package/dist/lib/graphile-worker-runner.test.js +0 -153
- package/dist/lib/graphile-worker-runner.test.js.map +0 -1
- package/dist/lib/handlers/cron-close-stale-sessions.d.ts +0 -3
- package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +0 -1
- package/dist/lib/handlers/cron-data-integrity-audit.d.ts +0 -3
- package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +0 -1
- package/dist/lib/handlers/cron-refresh-skills.d.ts +0 -3
- package/dist/lib/handlers/cron-refresh-skills.d.ts.map +0 -1
- package/dist/lib/handlers/cron-refresh-skills.test.d.ts +0 -2
- package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +0 -1
- package/dist/lib/handlers/cron-refresh-skills.test.js +0 -114
- package/dist/lib/handlers/cron-refresh-skills.test.js.map +0 -1
- package/dist/lib/handlers/cron-regenerate-insights.d.ts +0 -3
- package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +0 -1
- package/dist/lib/handlers/cron-regenerate-insights.js +0 -6
- package/dist/lib/handlers/cron-regenerate-insights.js.map +0 -1
- package/dist/lib/handlers/cron-suggest-instructions.d.ts +0 -3
- package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +0 -1
- package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +0 -2
- package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +0 -1
- package/dist/lib/handlers/cron-suggest-instructions.test.js +0 -80
- package/dist/lib/handlers/cron-suggest-instructions.test.js.map +0 -1
- package/dist/lib/handlers/process-conversation.d.ts +0 -35
- package/dist/lib/handlers/process-conversation.d.ts.map +0 -1
- package/dist/lib/handlers/process-eval.d.ts +0 -32
- package/dist/lib/handlers/process-eval.d.ts.map +0 -1
- package/dist/lib/handlers/process-insights.d.ts +0 -39
- package/dist/lib/handlers/process-insights.d.ts.map +0 -1
- package/dist/lib/handlers/process-launch.d.ts +0 -29
- package/dist/lib/handlers/process-launch.d.ts.map +0 -1
- package/dist/lib/handlers/process-session-goal.d.ts +0 -29
- package/dist/lib/handlers/process-session-goal.d.ts.map +0 -1
- package/dist/lib/handlers/process-session-goal.test.d.ts +0 -2
- package/dist/lib/handlers/process-session-goal.test.d.ts.map +0 -1
- package/dist/lib/handlers/process-session-goal.test.js +0 -134
- package/dist/lib/handlers/process-session-goal.test.js.map +0 -1
- package/dist/lib/hooks-config.d.ts +0 -119
- package/dist/lib/hooks-config.d.ts.map +0 -1
- package/dist/lib/hooks-config.test.d.ts +0 -2
- package/dist/lib/hooks-config.test.d.ts.map +0 -1
- package/dist/lib/hooks-config.test.js +0 -231
- package/dist/lib/hooks-config.test.js.map +0 -1
- package/dist/lib/insights-prompts.d.ts +0 -13
- package/dist/lib/insights-prompts.d.ts.map +0 -1
- package/dist/lib/llm-client.d.ts +0 -26
- package/dist/lib/llm-client.d.ts.map +0 -1
- package/dist/lib/llm-client.test.d.ts +0 -2
- package/dist/lib/llm-client.test.d.ts.map +0 -1
- package/dist/lib/llm-client.test.js +0 -62
- package/dist/lib/llm-client.test.js.map +0 -1
- package/dist/lib/mirror-writer-db.d.ts +0 -12
- package/dist/lib/mirror-writer-db.d.ts.map +0 -1
- package/dist/lib/mirror-writer-db.js +0 -51
- package/dist/lib/mirror-writer-db.js.map +0 -1
- package/dist/lib/mirror-writer.d.ts +0 -35
- package/dist/lib/mirror-writer.d.ts.map +0 -1
- package/dist/lib/mirror-writer.js +0 -27
- package/dist/lib/mirror-writer.js.map +0 -1
- package/dist/lib/mirror-writer.test.d.ts +0 -2
- package/dist/lib/mirror-writer.test.d.ts.map +0 -1
- package/dist/lib/mirror-writer.test.js +0 -47
- package/dist/lib/mirror-writer.test.js.map +0 -1
- package/dist/lib/output.d.ts +0 -4
- package/dist/lib/output.d.ts.map +0 -1
- package/dist/lib/output.test.d.ts +0 -2
- package/dist/lib/output.test.d.ts.map +0 -1
- package/dist/lib/output.test.js +0 -71
- package/dist/lib/output.test.js.map +0 -1
- package/dist/lib/permanent-job-error.d.ts +0 -17
- package/dist/lib/permanent-job-error.d.ts.map +0 -1
- package/dist/lib/permanent-job-error.test.d.ts +0 -2
- package/dist/lib/permanent-job-error.test.d.ts.map +0 -1
- package/dist/lib/permanent-job-error.test.js +0 -29
- package/dist/lib/permanent-job-error.test.js.map +0 -1
- package/dist/lib/provider-aggregator.d.ts +0 -24
- package/dist/lib/provider-aggregator.d.ts.map +0 -1
- package/dist/lib/provider-aggregator.test.d.ts +0 -2
- package/dist/lib/provider-aggregator.test.d.ts.map +0 -1
- package/dist/lib/provider-aggregator.test.js +0 -103
- package/dist/lib/provider-aggregator.test.js.map +0 -1
- package/dist/lib/skills-loader.d.ts +0 -6
- package/dist/lib/skills-loader.d.ts.map +0 -1
- package/dist/lib/types.d.ts +0 -48
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/version-check.d.ts +0 -11
- package/dist/lib/version-check.d.ts.map +0 -1
- package/dist/test-helpers.d.ts +0 -58
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js +0 -58
- package/dist/test-helpers.js.map +0 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/handlers/cron-suggest-instructions.ts"],
|
|
4
|
+
"sourcesContent": ["import type { JobHelpers } from '../job-helpers.js';\nimport { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { apiGet, apiPost } from '../api-client.js';\nimport { runLlmPrompt, detectLlmBackend } from '../llm-client.js';\nimport { buildRecommendationPrompt } from '@rulemetric/core';\nimport { normalizeProjectPath } from '@rulemetric/core/paths';\nimport type { ProjectContext, InstructionCandidate, Recommendation } from '@rulemetric/core';\nimport { detectLanguages } from '../detect-languages.js';\n\nconst MAX_SUGGESTIONS_PER_PROJECT = 5;\nconst MAX_PROJECTS_PER_RUN = Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS ?? 10);\nconst STALE_THRESHOLD_HOURS = 48;\nconst MIN_SCORE = 0.5;\nconst CONTENT_PREVIEW_CHARS = 400;\n\ninterface CatalogRow {\n id: string;\n name: string;\n description: string | null;\n tags: string[] | null;\n content: string | null;\n scope: string;\n}\n\ninterface ProjectPathsResponse {\n projectPaths: string[];\n}\n\ninterface ProjectRow {\n id: string;\n primaryCheckoutPath: string | null;\n}\n\ninterface ProjectsResponse {\n projects: ProjectRow[];\n}\n\ninterface SkillsRegistryFile {\n generatedAt: string;\n skills: unknown[];\n}\n\ninterface BatchUpsertResponse {\n inserted: number;\n}\n\nasync function checkSkillsRegistryStale(): Promise<boolean> {\n const registryPath = path.join(os.homedir(), '.config', 'rulemetric', 'skills-registry.json');\n try {\n const raw = readFileSync(registryPath, 'utf-8');\n const registry = JSON.parse(raw) as SkillsRegistryFile;\n const ageMs = Date.now() - new Date(registry.generatedAt).getTime();\n return ageMs > STALE_THRESHOLD_HOURS * 60 * 60 * 1000;\n } catch {\n return true;\n }\n}\n\nexport const cronSuggestInstructions = async (_payload: unknown, helpers: JobHelpers): Promise<void> => {\n // Scoring uses the user's locally-installed LLM tooling \u2014 Claude Code CLI\n // when available, otherwise the Anthropic SDK with ANTHROPIC_API_KEY.\n // No third-party LLM_PROVIDER / LLM_API_KEY required. If neither backend\n // is reachable, skip cleanly.\n const backend = detectLlmBackend();\n if (backend === 'none') {\n helpers.logger.warn('No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping suggestion compute');\n return;\n }\n helpers.logger.info(`Scoring backend: ${backend}`);\n\n // 1. Fetch recent project paths\n let projectPaths: string[];\n try {\n const res = await apiGet<ProjectPathsResponse>('/api/sessions/project-paths?limit=' + MAX_PROJECTS_PER_RUN);\n projectPaths = res.projectPaths;\n } catch (err) {\n helpers.logger.warn(`Failed to fetch project paths: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n\n if (projectPaths.length === 0) {\n helpers.logger.info('No recent project paths; nothing to score');\n return;\n }\n\n // Best-effort path -> canonical project_id map so the batch-upsert can stamp\n // project_id (migration 00104). Keyed by normalized checkout path. Purely\n // additive: when a path isn't found here we send no projectId and the API\n // resolves it from project_path itself (and NULLs it when unresolved).\n const projectIdByPath = new Map<string, string>();\n try {\n const projRes = await apiGet<ProjectsResponse>('/api/projects?limit=200');\n for (const p of projRes.projects ?? []) {\n if (p.primaryCheckoutPath) {\n projectIdByPath.set(normalizeProjectPath(p.primaryCheckoutPath), p.id);\n }\n }\n } catch (err) {\n helpers.logger.warn(`Failed to fetch projects for id resolution: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // 2. Fetch candidate instructions: public+org+team from /catalog, plus\n // the user's own (personal+created) from /instructions. Dedup by id.\n const candidates = new Map<string, InstructionCandidate>();\n try {\n const catalogRows = await apiGet<CatalogRow[]>('/api/catalog?limit=200');\n for (const row of catalogRows) {\n candidates.set(row.id, {\n id: row.id,\n name: row.name,\n description: row.description ?? '',\n tags: row.tags ?? [],\n contentPreview: (row.content ?? '').slice(0, CONTENT_PREVIEW_CHARS),\n });\n }\n } catch (err) {\n helpers.logger.warn(`Failed to fetch catalog: ${err instanceof Error ? err.message : String(err)}`);\n }\n try {\n const personalRes = await apiGet<{ instructions: CatalogRow[] }>('/api/instructions?limit=100');\n for (const row of personalRes.instructions ?? []) {\n if (!candidates.has(row.id)) {\n candidates.set(row.id, {\n id: row.id,\n name: row.name,\n description: row.description ?? '',\n tags: row.tags ?? [],\n contentPreview: (row.content ?? '').slice(0, CONTENT_PREVIEW_CHARS),\n });\n }\n }\n } catch (err) {\n helpers.logger.warn(`Failed to fetch personal instructions: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const candidateList = [...candidates.values()];\n if (candidateList.length === 0) {\n helpers.logger.info('No candidate instructions; nothing to score');\n return;\n }\n helpers.logger.info(`Scoring ${candidateList.length} candidates across ${projectPaths.length} project(s)`);\n\n // 3. Score per project\n let scored = 0;\n for (const rawPath of projectPaths) {\n try {\n const projectPath = normalizeProjectPath(rawPath);\n const languages = detectLanguages(projectPath);\n if (languages.length === 0) {\n helpers.logger.info(`Skipping ${projectPath}: insufficient language signals`);\n continue;\n }\n\n const context: ProjectContext = {\n name: path.basename(projectPath),\n description: null,\n languages,\n topics: [],\n dependencies: [],\n };\n\n const prompt = buildRecommendationPrompt(context, candidateList);\n // runLlmPrompt expects (systemPrompt, data, maxTokens). The recommendation\n // prompt is fully self-contained; pass an empty data block.\n const parsed = await runLlmPrompt(prompt, '', 4096);\n if (!parsed) {\n helpers.logger.warn(`LLM returned null for ${projectPath} (backend ${backend})`);\n continue;\n }\n const raw = (parsed.recommendations ?? []) as Array<Record<string, unknown>>;\n const recommendations: Recommendation[] = raw\n .filter((r) => typeof r.instructionId === 'string' && typeof r.score === 'number' && typeof r.reason === 'string')\n .map((r) => ({\n instructionId: r.instructionId as string,\n score: r.score as number,\n reason: r.reason as string,\n }));\n\n const top = recommendations\n .filter((r) => r.score >= MIN_SCORE)\n .sort((a, b) => b.score - a.score)\n .slice(0, MAX_SUGGESTIONS_PER_PROJECT);\n\n if (top.length === 0) {\n helpers.logger.info(`No suggestions over threshold for ${projectPath}`);\n continue;\n }\n\n // Resolve canonical project_id from the normalized path when known.\n // Best-effort: omitted when unresolved, in which case the API resolves\n // from project_path (and leaves project_id NULL if still unknown).\n const projectId = projectIdByPath.get(projectPath);\n\n await apiPost<BatchUpsertResponse>('/api/instruction-suggestions/batch-upsert', {\n projectPath,\n ...(projectId ? { projectId } : {}),\n suggestions: top.map((r) => ({\n instructionId: r.instructionId,\n score: r.score,\n reason: r.reason,\n })),\n });\n scored++;\n } catch (err) {\n helpers.logger.warn(`Failed to score ${rawPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // 4. Mark stale if registry is old\n if (await checkSkillsRegistryStale()) {\n try {\n await apiPost('/api/instruction-suggestions/mark-stale', {});\n helpers.logger.warn('Skills registry is stale (>48h); marked all suggestions stale');\n } catch {\n // Non-fatal\n }\n }\n\n helpers.logger.info(`Done: scored ${scored}/${projectPaths.length} projects`);\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AACA,SAAS,oBAAoB;AAC7B,OAAO,UAAU;AACjB,OAAO,QAAQ;AAQf,IAAM,8BAA8B;AACpC,IAAM,uBAAuB,OAAO,QAAQ,IAAI,sCAAsC,EAAE;AACxF,IAAM,wBAAwB;AAC9B,IAAM,YAAY;AAClB,IAAM,wBAAwB;AAiC9B,eAAe,2BAA6C;AAC1D,QAAM,eAAe,KAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,cAAc,sBAAsB;AAC5F,MAAI;AACF,UAAM,MAAM,aAAa,cAAc,OAAO;AAC9C,UAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,UAAM,QAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,WAAW,EAAE,QAAQ;AAClE,WAAO,QAAQ,wBAAwB,KAAK,KAAK;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,0BAA0B,OAAO,UAAmB,YAAuC;AAKtG,QAAM,UAAU,iBAAiB;AACjC,MAAI,YAAY,QAAQ;AACtB,YAAQ,OAAO,KAAK,wGAAwG;AAC5H;AAAA,EACF;AACA,UAAQ,OAAO,KAAK,oBAAoB,OAAO,EAAE;AAGjD,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,OAA6B,uCAAuC,oBAAoB;AAC1G,mBAAe,IAAI;AAAA,EACrB,SAAS,KAAK;AACZ,YAAQ,OAAO,KAAK,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACxG;AAAA,EACF;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,OAAO,KAAK,2CAA2C;AAC/D;AAAA,EACF;AAMA,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,MAAI;AACF,UAAM,UAAU,MAAM,OAAyB,yBAAyB;AACxE,eAAW,KAAK,QAAQ,YAAY,CAAC,GAAG;AACtC,UAAI,EAAE,qBAAqB;AACzB,wBAAgB,IAAI,qBAAqB,EAAE,mBAAmB,GAAG,EAAE,EAAE;AAAA,MACvE;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,OAAO,KAAK,+CAA+C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,EACvH;AAIA,QAAM,aAAa,oBAAI,IAAkC;AACzD,MAAI;AACF,UAAM,cAAc,MAAM,OAAqB,wBAAwB;AACvE,eAAW,OAAO,aAAa;AAC7B,iBAAW,IAAI,IAAI,IAAI;AAAA,QACrB,IAAI,IAAI;AAAA,QACR,MAAM,IAAI;AAAA,QACV,aAAa,IAAI,eAAe;AAAA,QAChC,MAAM,IAAI,QAAQ,CAAC;AAAA,QACnB,iBAAiB,IAAI,WAAW,IAAI,MAAM,GAAG,qBAAqB;AAAA,MACpE,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,OAAO,KAAK,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,EACpG;AACA,MAAI;AACF,UAAM,cAAc,MAAM,OAAuC,6BAA6B;AAC9F,eAAW,OAAO,YAAY,gBAAgB,CAAC,GAAG;AAChD,UAAI,CAAC,WAAW,IAAI,IAAI,EAAE,GAAG;AAC3B,mBAAW,IAAI,IAAI,IAAI;AAAA,UACrB,IAAI,IAAI;AAAA,UACR,MAAM,IAAI;AAAA,UACV,aAAa,IAAI,eAAe;AAAA,UAChC,MAAM,IAAI,QAAQ,CAAC;AAAA,UACnB,iBAAiB,IAAI,WAAW,IAAI,MAAM,GAAG,qBAAqB;AAAA,QACpE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,OAAO,KAAK,0CAA0C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,EAClH;AAEA,QAAM,gBAAgB,CAAC,GAAG,WAAW,OAAO,CAAC;AAC7C,MAAI,cAAc,WAAW,GAAG;AAC9B,YAAQ,OAAO,KAAK,6CAA6C;AACjE;AAAA,EACF;AACA,UAAQ,OAAO,KAAK,WAAW,cAAc,MAAM,sBAAsB,aAAa,MAAM,aAAa;AAGzG,MAAI,SAAS;AACb,aAAW,WAAW,cAAc;AAClC,QAAI;AACF,YAAM,cAAc,qBAAqB,OAAO;AAChD,YAAM,YAAY,gBAAgB,WAAW;AAC7C,UAAI,UAAU,WAAW,GAAG;AAC1B,gBAAQ,OAAO,KAAK,YAAY,WAAW,iCAAiC;AAC5E;AAAA,MACF;AAEA,YAAM,UAA0B;AAAA,QAC9B,MAAM,KAAK,SAAS,WAAW;AAAA,QAC/B,aAAa;AAAA,QACb;AAAA,QACA,QAAQ,CAAC;AAAA,QACT,cAAc,CAAC;AAAA,MACjB;AAEA,YAAM,SAAS,0BAA0B,SAAS,aAAa;AAG/D,YAAM,SAAS,MAAM,aAAa,QAAQ,IAAI,IAAI;AAClD,UAAI,CAAC,QAAQ;AACX,gBAAQ,OAAO,KAAK,yBAAyB,WAAW,aAAa,OAAO,GAAG;AAC/E;AAAA,MACF;AACA,YAAM,MAAO,OAAO,mBAAmB,CAAC;AACxC,YAAM,kBAAoC,IACvC,OAAO,CAAC,MAAM,OAAO,EAAE,kBAAkB,YAAY,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,WAAW,QAAQ,EAChH,IAAI,CAAC,OAAO;AAAA,QACX,eAAe,EAAE;AAAA,QACjB,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACZ,EAAE;AAEJ,YAAM,MAAM,gBACT,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,2BAA2B;AAEvC,UAAI,IAAI,WAAW,GAAG;AACpB,gBAAQ,OAAO,KAAK,qCAAqC,WAAW,EAAE;AACtE;AAAA,MACF;AAKA,YAAM,YAAY,gBAAgB,IAAI,WAAW;AAEjD,YAAM,QAA6B,6CAA6C;AAAA,QAC9E;AAAA,QACA,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,QACjC,aAAa,IAAI,IAAI,CAAC,OAAO;AAAA,UAC3B,eAAe,EAAE;AAAA,UACjB,OAAO,EAAE;AAAA,UACT,QAAQ,EAAE;AAAA,QACZ,EAAE;AAAA,MACJ,CAAC;AACD;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,OAAO,KAAK,mBAAmB,OAAO,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IACvG;AAAA,EACF;AAGA,MAAI,MAAM,yBAAyB,GAAG;AACpC,QAAI;AACF,YAAM,QAAQ,2CAA2C,CAAC,CAAC;AAC3D,cAAQ,OAAO,KAAK,+DAA+D;AAAA,IACrF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,UAAQ,OAAO,KAAK,gBAAgB,MAAM,IAAI,aAAa,MAAM,WAAW;AAC9E;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import {
|
|
2
|
+
executeEval
|
|
3
|
+
} from "./chunk-QN34TGD3.js";
|
|
4
|
+
|
|
5
|
+
// src/lib/eval-grader.ts
|
|
6
|
+
var GRADER_SYSTEM_PROMPT = `You are a rigorous eval grader. Your job is to evaluate whether an AI assistant's output meets a set of expectations.
|
|
7
|
+
|
|
8
|
+
You will receive:
|
|
9
|
+
1. The original prompt that was given to the AI
|
|
10
|
+
2. The AI's output/response
|
|
11
|
+
3. A list of expectations (assertions) to evaluate
|
|
12
|
+
|
|
13
|
+
For each expectation:
|
|
14
|
+
- Search the output for evidence that the expectation is met
|
|
15
|
+
- Determine PASS or FAIL (no partial credit)
|
|
16
|
+
- Cite specific evidence (quote or description)
|
|
17
|
+
|
|
18
|
+
PASS criteria:
|
|
19
|
+
- Clear evidence the assertion is true
|
|
20
|
+
- Evidence reflects genuine completion, not surface compliance
|
|
21
|
+
|
|
22
|
+
FAIL criteria:
|
|
23
|
+
- No evidence found
|
|
24
|
+
- Evidence contradicts the expectation
|
|
25
|
+
- Cannot verify from available information
|
|
26
|
+
|
|
27
|
+
Beyond the predefined expectations, extract implicit claims from the output:
|
|
28
|
+
- Factual claims ("uses TypeScript", "has 3 parameters")
|
|
29
|
+
- Process claims ("used async/await pattern")
|
|
30
|
+
- Quality claims ("handles edge cases")
|
|
31
|
+
|
|
32
|
+
Verify each claim against the actual output.
|
|
33
|
+
|
|
34
|
+
Finally, critique the eval itself \u2014 identify assertions that are too weak (pass for wrong outputs) or important outcomes that no assertion covers.
|
|
35
|
+
|
|
36
|
+
You MUST respond with ONLY a valid JSON object matching this exact structure (no markdown, no explanation, just JSON):
|
|
37
|
+
|
|
38
|
+
{
|
|
39
|
+
"expectations": [
|
|
40
|
+
{ "text": "assertion text", "passed": true, "evidence": "specific quote or description" }
|
|
41
|
+
],
|
|
42
|
+
"summary": { "passed": 2, "failed": 1, "total": 3, "pass_rate": 0.67 },
|
|
43
|
+
"claims": [
|
|
44
|
+
{ "claim": "statement", "type": "factual", "verified": true, "evidence": "..." }
|
|
45
|
+
],
|
|
46
|
+
"eval_feedback": {
|
|
47
|
+
"suggestions": [{ "assertion": "suggested new assertion", "reason": "why it matters" }],
|
|
48
|
+
"overall": "brief summary assessment"
|
|
49
|
+
}
|
|
50
|
+
}`;
|
|
51
|
+
async function gradeEvalOutput(options) {
|
|
52
|
+
const { prompt, output, expectations, model, timeout = 12e4 } = options;
|
|
53
|
+
const graderPrompt = `## Original Prompt
|
|
54
|
+
|
|
55
|
+
${prompt}
|
|
56
|
+
|
|
57
|
+
## AI Output
|
|
58
|
+
|
|
59
|
+
${output}
|
|
60
|
+
|
|
61
|
+
## Expectations to Evaluate
|
|
62
|
+
|
|
63
|
+
${expectations.map((e, i) => `${i + 1}. ${e}`).join("\n")}
|
|
64
|
+
|
|
65
|
+
Grade the output against each expectation. Respond with ONLY valid JSON.`;
|
|
66
|
+
const result = await executeEval({
|
|
67
|
+
prompt: graderPrompt,
|
|
68
|
+
targetContent: GRADER_SYSTEM_PROMPT,
|
|
69
|
+
timeout,
|
|
70
|
+
model
|
|
71
|
+
});
|
|
72
|
+
if (result.error) {
|
|
73
|
+
return {
|
|
74
|
+
expectations: expectations.map((e) => ({
|
|
75
|
+
text: e,
|
|
76
|
+
passed: false,
|
|
77
|
+
evidence: `Grader error: ${result.error}`
|
|
78
|
+
})),
|
|
79
|
+
summary: { passed: 0, failed: expectations.length, total: expectations.length, pass_rate: 0 },
|
|
80
|
+
claims: [],
|
|
81
|
+
eval_feedback: { suggestions: [], overall: `Grading failed: ${result.error}` }
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
let jsonStr = result.output.trim();
|
|
86
|
+
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
87
|
+
if (jsonMatch) {
|
|
88
|
+
jsonStr = jsonMatch[1].trim();
|
|
89
|
+
}
|
|
90
|
+
const objMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
91
|
+
if (objMatch) {
|
|
92
|
+
jsonStr = objMatch[0];
|
|
93
|
+
}
|
|
94
|
+
const parsed = JSON.parse(jsonStr);
|
|
95
|
+
const passed = parsed.expectations.filter((e) => e.passed).length;
|
|
96
|
+
const total = parsed.expectations.length;
|
|
97
|
+
parsed.summary = {
|
|
98
|
+
passed,
|
|
99
|
+
failed: total - passed,
|
|
100
|
+
total,
|
|
101
|
+
pass_rate: total > 0 ? passed / total : 0
|
|
102
|
+
};
|
|
103
|
+
return parsed;
|
|
104
|
+
} catch {
|
|
105
|
+
return {
|
|
106
|
+
expectations: expectations.map((e) => ({
|
|
107
|
+
text: e,
|
|
108
|
+
passed: false,
|
|
109
|
+
evidence: "Grader output was not valid JSON"
|
|
110
|
+
})),
|
|
111
|
+
summary: { passed: 0, failed: expectations.length, total: expectations.length, pass_rate: 0 },
|
|
112
|
+
claims: [],
|
|
113
|
+
eval_feedback: { suggestions: [], overall: `Grader returned unparseable output: ${result.output.slice(0, 200)}` }
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export {
|
|
119
|
+
gradeEvalOutput
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=chunk-YNIH3KMU.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/eval-grader.ts"],
|
|
4
|
+
"sourcesContent": ["import { executeEval } from './eval-executor.js';\n\nexport interface GradingExpectation {\n text: string;\n passed: boolean;\n evidence: string;\n}\n\nexport interface GradingResult {\n expectations: GradingExpectation[];\n summary: {\n passed: number;\n failed: number;\n total: number;\n pass_rate: number;\n };\n claims: Array<{\n claim: string;\n type: 'factual' | 'process' | 'quality';\n verified: boolean;\n evidence: string;\n }>;\n eval_feedback: {\n suggestions: Array<{ assertion?: string; reason: string }>;\n overall: string;\n };\n}\n\nconst GRADER_SYSTEM_PROMPT = `You are a rigorous eval grader. Your job is to evaluate whether an AI assistant's output meets a set of expectations.\n\nYou will receive:\n1. The original prompt that was given to the AI\n2. The AI's output/response\n3. A list of expectations (assertions) to evaluate\n\nFor each expectation:\n- Search the output for evidence that the expectation is met\n- Determine PASS or FAIL (no partial credit)\n- Cite specific evidence (quote or description)\n\nPASS criteria:\n- Clear evidence the assertion is true\n- Evidence reflects genuine completion, not surface compliance\n\nFAIL criteria:\n- No evidence found\n- Evidence contradicts the expectation\n- Cannot verify from available information\n\nBeyond the predefined expectations, extract implicit claims from the output:\n- Factual claims (\"uses TypeScript\", \"has 3 parameters\")\n- Process claims (\"used async/await pattern\")\n- Quality claims (\"handles edge cases\")\n\nVerify each claim against the actual output.\n\nFinally, critique the eval itself \u2014 identify assertions that are too weak (pass for wrong outputs) or important outcomes that no assertion covers.\n\nYou MUST respond with ONLY a valid JSON object matching this exact structure (no markdown, no explanation, just JSON):\n\n{\n \"expectations\": [\n { \"text\": \"assertion text\", \"passed\": true, \"evidence\": \"specific quote or description\" }\n ],\n \"summary\": { \"passed\": 2, \"failed\": 1, \"total\": 3, \"pass_rate\": 0.67 },\n \"claims\": [\n { \"claim\": \"statement\", \"type\": \"factual\", \"verified\": true, \"evidence\": \"...\" }\n ],\n \"eval_feedback\": {\n \"suggestions\": [{ \"assertion\": \"suggested new assertion\", \"reason\": \"why it matters\" }],\n \"overall\": \"brief summary assessment\"\n }\n}`;\n\n/**\n * Grades an eval output against expectations using an LLM grader.\n */\nexport async function gradeEvalOutput(options: {\n prompt: string;\n output: string;\n expectations: string[];\n model?: string;\n timeout?: number;\n}): Promise<GradingResult> {\n const { prompt, output, expectations, model, timeout = 120_000 } = options;\n\n const graderPrompt = `## Original Prompt\n\n${prompt}\n\n## AI Output\n\n${output}\n\n## Expectations to Evaluate\n\n${expectations.map((e, i) => `${i + 1}. ${e}`).join('\\n')}\n\nGrade the output against each expectation. Respond with ONLY valid JSON.`;\n\n const result = await executeEval({\n prompt: graderPrompt,\n targetContent: GRADER_SYSTEM_PROMPT,\n timeout,\n model,\n });\n\n if (result.error) {\n // Return a failed grading if the grader itself errors\n return {\n expectations: expectations.map((e) => ({\n text: e,\n passed: false,\n evidence: `Grader error: ${result.error}`,\n })),\n summary: { passed: 0, failed: expectations.length, total: expectations.length, pass_rate: 0 },\n claims: [],\n eval_feedback: { suggestions: [], overall: `Grading failed: ${result.error}` },\n };\n }\n\n // Parse the grader's JSON response\n try {\n // Extract JSON from the output (handle potential markdown wrapping)\n let jsonStr = result.output.trim();\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n jsonStr = jsonMatch[1].trim();\n }\n // Also try to find JSON object directly\n const objMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n if (objMatch) {\n jsonStr = objMatch[0];\n }\n\n const parsed = JSON.parse(jsonStr) as GradingResult;\n\n // Validate and ensure summary is correct\n const passed = parsed.expectations.filter((e) => e.passed).length;\n const total = parsed.expectations.length;\n parsed.summary = {\n passed,\n failed: total - passed,\n total,\n pass_rate: total > 0 ? passed / total : 0,\n };\n\n return parsed;\n } catch {\n // If we can't parse, return a best-effort result\n return {\n expectations: expectations.map((e) => ({\n text: e,\n passed: false,\n evidence: 'Grader output was not valid JSON',\n })),\n summary: { passed: 0, failed: expectations.length, total: expectations.length, pass_rate: 0 },\n claims: [],\n eval_feedback: { suggestions: [], overall: `Grader returned unparseable output: ${result.output.slice(0, 200)}` },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AA4BA,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiD7B,eAAsB,gBAAgB,SAMX;AACzB,QAAM,EAAE,QAAQ,QAAQ,cAAc,OAAO,UAAU,KAAQ,IAAI;AAEnE,QAAM,eAAe;AAAA;AAAA,EAErB,MAAM;AAAA;AAAA;AAAA;AAAA,EAIN,MAAM;AAAA;AAAA;AAAA;AAAA,EAIN,aAAa,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAIvD,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,OAAO,OAAO;AAEhB,WAAO;AAAA,MACL,cAAc,aAAa,IAAI,CAAC,OAAO;AAAA,QACrC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU,iBAAiB,OAAO,KAAK;AAAA,MACzC,EAAE;AAAA,MACF,SAAS,EAAE,QAAQ,GAAG,QAAQ,aAAa,QAAQ,OAAO,aAAa,QAAQ,WAAW,EAAE;AAAA,MAC5F,QAAQ,CAAC;AAAA,MACT,eAAe,EAAE,aAAa,CAAC,GAAG,SAAS,mBAAmB,OAAO,KAAK,GAAG;AAAA,IAC/E;AAAA,EACF;AAGA,MAAI;AAEF,QAAI,UAAU,OAAO,OAAO,KAAK;AACjC,UAAM,YAAY,QAAQ,MAAM,8BAA8B;AAC9D,QAAI,WAAW;AACb,gBAAU,UAAU,CAAC,EAAE,KAAK;AAAA,IAC9B;AAEA,UAAM,WAAW,QAAQ,MAAM,aAAa;AAC5C,QAAI,UAAU;AACZ,gBAAU,SAAS,CAAC;AAAA,IACtB;AAEA,UAAM,SAAS,KAAK,MAAM,OAAO;AAGjC,UAAM,SAAS,OAAO,aAAa,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAC3D,UAAM,QAAQ,OAAO,aAAa;AAClC,WAAO,UAAU;AAAA,MACf;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,WAAW,QAAQ,IAAI,SAAS,QAAQ;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT,QAAQ;AAEN,WAAO;AAAA,MACL,cAAc,aAAa,IAAI,CAAC,OAAO;AAAA,QACrC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,EAAE;AAAA,MACF,SAAS,EAAE,QAAQ,GAAG,QAAQ,aAAa,QAAQ,OAAO,aAAa,QAAQ,WAAW,EAAE;AAAA,MAC5F,QAAQ,CAAC;AAAA,MACT,eAAe,EAAE,aAAa,CAAC,GAAG,SAAS,uCAAuC,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC,GAAG;AAAA,IAClH;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {
|
|
2
|
+
emitRecordsAsEvents,
|
|
3
|
+
findMaxStepIndex,
|
|
4
|
+
readNewRecords,
|
|
5
|
+
stateApi
|
|
6
|
+
} from "../../chunk-EHZJ6OXD.js";
|
|
7
|
+
import {
|
|
8
|
+
BaseCommand
|
|
9
|
+
} from "../../chunk-S56LOTGQ.js";
|
|
10
|
+
import "../../chunk-OGVORIFM.js";
|
|
11
|
+
import "../../chunk-2AM54TUK.js";
|
|
12
|
+
import "../../chunk-EJOI2ZGU.js";
|
|
13
|
+
import "../../chunk-KZRFUXGF.js";
|
|
14
|
+
import "../../chunk-EKJ2CABV.js";
|
|
15
|
+
import "../../chunk-NSBPE2FW.js";
|
|
16
|
+
|
|
17
|
+
// src/commands/antigravity/backfill.ts
|
|
18
|
+
import { Args, Flags } from "@oclif/core";
|
|
19
|
+
import { existsSync } from "node:fs";
|
|
20
|
+
import { homedir } from "node:os";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
var TRANSCRIPT_BRAIN_DIR = join(homedir(), ".gemini", "antigravity-ide", "brain");
|
|
23
|
+
var AntigravityBackfill = class _AntigravityBackfill extends BaseCommand {
|
|
24
|
+
static description = "Backfill historical events from an Antigravity conversation transcript into a RuleMetric session. Useful for seeding a conversation that existed before hooks were installed \u2014 the live hook intentionally only captures forward.";
|
|
25
|
+
static examples = [
|
|
26
|
+
"<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --session 158db9aa-68ee-43fc-961b-f3a180578694",
|
|
27
|
+
"<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --dry-run"
|
|
28
|
+
];
|
|
29
|
+
static args = {
|
|
30
|
+
conversationId: Args.string({
|
|
31
|
+
description: "Antigravity conversationId (UUID) \u2014 the directory name under ~/.gemini/antigravity-ide/brain/",
|
|
32
|
+
required: true
|
|
33
|
+
})
|
|
34
|
+
};
|
|
35
|
+
static flags = {
|
|
36
|
+
session: Flags.string({
|
|
37
|
+
char: "s",
|
|
38
|
+
description: "RuleMetric session UUID to POST events into. If omitted, resolved from the hook tmp file ($TMPDIR/rulemetric/<conversationId>) \u2014 fails if neither is present."
|
|
39
|
+
}),
|
|
40
|
+
transcript: Flags.string({
|
|
41
|
+
description: "Path to the transcript.jsonl file. Defaults to ~/.gemini/antigravity-ide/brain/<conversationId>/.system_generated/logs/transcript.jsonl"
|
|
42
|
+
}),
|
|
43
|
+
"after-step": Flags.integer({
|
|
44
|
+
description: "Only emit records with step_index > this value. Default: read from existing state file, else -1 (everything)."
|
|
45
|
+
}),
|
|
46
|
+
limit: Flags.integer({
|
|
47
|
+
description: "Cap on the number of records to process this run."
|
|
48
|
+
}),
|
|
49
|
+
"dry-run": Flags.boolean({
|
|
50
|
+
default: false,
|
|
51
|
+
description: "Classify records without POSTing. Reports counts only."
|
|
52
|
+
}),
|
|
53
|
+
"save-state": Flags.boolean({
|
|
54
|
+
default: true,
|
|
55
|
+
allowNo: true,
|
|
56
|
+
description: "After backfill, persist the highest step_index so the live hook resumes from there."
|
|
57
|
+
})
|
|
58
|
+
};
|
|
59
|
+
async run() {
|
|
60
|
+
const { args, flags } = await this.parse(_AntigravityBackfill);
|
|
61
|
+
const conversationId = args.conversationId;
|
|
62
|
+
stateApi.loadEnvFile();
|
|
63
|
+
if (!process.env.RULEMETRIC_API_URL) {
|
|
64
|
+
this.error("RULEMETRIC_API_URL is not set. Configure it via env or ~/.config/rulemetric/env.");
|
|
65
|
+
}
|
|
66
|
+
const transcriptPath = flags.transcript ?? join(TRANSCRIPT_BRAIN_DIR, conversationId, ".system_generated", "logs", "transcript.jsonl");
|
|
67
|
+
if (!existsSync(transcriptPath)) {
|
|
68
|
+
this.error(`Transcript not found: ${transcriptPath}`);
|
|
69
|
+
}
|
|
70
|
+
const rwSessionId = flags.session ?? stateApi.resolveRwSessionId(conversationId);
|
|
71
|
+
if (!rwSessionId) {
|
|
72
|
+
this.error(
|
|
73
|
+
`No RuleMetric session resolved. Pass --session <uuid>, or run the Antigravity hook at least once so $TMPDIR/rulemetric/${conversationId} is populated.`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
let after = flags["after-step"];
|
|
77
|
+
if (after === void 0) {
|
|
78
|
+
const existing = stateApi.load(conversationId);
|
|
79
|
+
after = existing?.lastStepIdx ?? -1;
|
|
80
|
+
}
|
|
81
|
+
let records = readNewRecords(transcriptPath, after);
|
|
82
|
+
if (flags.limit !== void 0 && records.length > flags.limit) {
|
|
83
|
+
records = records.slice(0, flags.limit);
|
|
84
|
+
}
|
|
85
|
+
const max = findMaxStepIndex(transcriptPath);
|
|
86
|
+
this.log(
|
|
87
|
+
`Conversation ${conversationId}: transcript max step = ${max}, after-step = ${after}, records to process = ${records.length}`
|
|
88
|
+
);
|
|
89
|
+
if (records.length === 0) {
|
|
90
|
+
this.log("Nothing to backfill.");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (flags["dry-run"]) {
|
|
94
|
+
let wouldEmit = 0;
|
|
95
|
+
let wouldSkip = 0;
|
|
96
|
+
const byEventType = {};
|
|
97
|
+
for (const record of records) {
|
|
98
|
+
const classified = (await import("../../lib/antigravity-transcript.js")).classifyRecord(record, 0);
|
|
99
|
+
if (classified) {
|
|
100
|
+
wouldEmit++;
|
|
101
|
+
byEventType[classified.eventType] = (byEventType[classified.eventType] ?? 0) + 1;
|
|
102
|
+
} else {
|
|
103
|
+
wouldSkip++;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
this.log(
|
|
107
|
+
`Dry run: would emit ${wouldEmit}, skip ${wouldSkip}. By eventType: ${JSON.stringify(byEventType)}`
|
|
108
|
+
);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const start = Date.now();
|
|
112
|
+
const result = await emitRecordsAsEvents(records, rwSessionId, conversationId, after, {
|
|
113
|
+
onProgress: ({ attempted, total }) => {
|
|
114
|
+
if (attempted % 100 === 0 || attempted === total) {
|
|
115
|
+
process.stderr.write(` \u2026${attempted}/${total}
|
|
116
|
+
`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
const elapsedSec = ((Date.now() - start) / 1e3).toFixed(1);
|
|
121
|
+
this.log(
|
|
122
|
+
`Backfill complete in ${elapsedSec}s. attempted=${result.attempted} emitted=${result.emitted} skipped=${result.skipped} failed=${result.failed} highestStepIdx=${result.highestStepIdx}`
|
|
123
|
+
);
|
|
124
|
+
if (flags["save-state"]) {
|
|
125
|
+
stateApi.save(conversationId, { lastStepIdx: result.highestStepIdx });
|
|
126
|
+
this.log(`State saved \u2192 live hook will resume from step_index > ${result.highestStepIdx}.`);
|
|
127
|
+
} else {
|
|
128
|
+
this.log("State NOT saved (--no-save-state). Live hook will re-emit any new records from after-step.");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
export {
|
|
133
|
+
AntigravityBackfill as default
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=backfill.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/commands/antigravity/backfill.ts"],
|
|
4
|
+
"sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\nimport {\n emitRecordsAsEvents,\n findMaxStepIndex,\n readNewRecords,\n stateApi,\n} from '../../lib/antigravity-transcript.js';\n\nconst TRANSCRIPT_BRAIN_DIR = join(homedir(), '.gemini', 'antigravity-ide', 'brain');\n\nexport default class AntigravityBackfill extends BaseCommand {\n static override description =\n 'Backfill historical events from an Antigravity conversation transcript into a RuleMetric session. Useful for seeding a conversation that existed before hooks were installed \u2014 the live hook intentionally only captures forward.';\n\n static override examples = [\n '<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --session 158db9aa-68ee-43fc-961b-f3a180578694',\n '<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --dry-run',\n ];\n\n static override args = {\n conversationId: Args.string({\n description: 'Antigravity conversationId (UUID) \u2014 the directory name under ~/.gemini/antigravity-ide/brain/',\n required: true,\n }),\n };\n\n static override flags = {\n session: Flags.string({\n char: 's',\n description:\n 'RuleMetric session UUID to POST events into. If omitted, resolved from the hook tmp file ($TMPDIR/rulemetric/<conversationId>) \u2014 fails if neither is present.',\n }),\n transcript: Flags.string({\n description:\n 'Path to the transcript.jsonl file. Defaults to ~/.gemini/antigravity-ide/brain/<conversationId>/.system_generated/logs/transcript.jsonl',\n }),\n 'after-step': Flags.integer({\n description:\n 'Only emit records with step_index > this value. Default: read from existing state file, else -1 (everything).',\n }),\n limit: Flags.integer({\n description: 'Cap on the number of records to process this run.',\n }),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Classify records without POSTing. Reports counts only.',\n }),\n 'save-state': Flags.boolean({\n default: true,\n allowNo: true,\n description: 'After backfill, persist the highest step_index so the live hook resumes from there.',\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(AntigravityBackfill);\n const conversationId = args.conversationId;\n\n stateApi.loadEnvFile();\n if (!process.env.RULEMETRIC_API_URL) {\n this.error('RULEMETRIC_API_URL is not set. Configure it via env or ~/.config/rulemetric/env.');\n }\n\n const transcriptPath =\n flags.transcript ??\n join(TRANSCRIPT_BRAIN_DIR, conversationId, '.system_generated', 'logs', 'transcript.jsonl');\n if (!existsSync(transcriptPath)) {\n this.error(`Transcript not found: ${transcriptPath}`);\n }\n\n const rwSessionId = flags.session ?? stateApi.resolveRwSessionId(conversationId);\n if (!rwSessionId) {\n this.error(\n `No RuleMetric session resolved. Pass --session <uuid>, or run the Antigravity hook at least once so $TMPDIR/rulemetric/${conversationId} is populated.`,\n );\n }\n\n let after = flags['after-step'];\n if (after === undefined) {\n const existing = stateApi.load(conversationId);\n after = existing?.lastStepIdx ?? -1;\n }\n\n let records = readNewRecords(transcriptPath, after);\n if (flags.limit !== undefined && records.length > flags.limit) {\n records = records.slice(0, flags.limit);\n }\n\n const max = findMaxStepIndex(transcriptPath);\n this.log(\n `Conversation ${conversationId}: transcript max step = ${max}, after-step = ${after}, records to process = ${records.length}`,\n );\n if (records.length === 0) {\n this.log('Nothing to backfill.');\n return;\n }\n\n if (flags['dry-run']) {\n // Count classification outcomes without POSTing.\n let wouldEmit = 0;\n let wouldSkip = 0;\n const byEventType: Record<string, number> = {};\n for (const record of records) {\n // Use a stable fake sequence \u2014 classification doesn't care about its value.\n const classified = (await import('../../lib/antigravity-transcript.js')).classifyRecord(record, 0);\n if (classified) {\n wouldEmit++;\n byEventType[classified.eventType] = (byEventType[classified.eventType] ?? 0) + 1;\n } else {\n wouldSkip++;\n }\n }\n this.log(\n `Dry run: would emit ${wouldEmit}, skip ${wouldSkip}. By eventType: ${JSON.stringify(byEventType)}`,\n );\n return;\n }\n\n const start = Date.now();\n const result = await emitRecordsAsEvents(records, rwSessionId, conversationId, after, {\n onProgress: ({ attempted, total }) => {\n if (attempted % 100 === 0 || attempted === total) {\n process.stderr.write(` \u2026${attempted}/${total}\\n`);\n }\n },\n });\n const elapsedSec = ((Date.now() - start) / 1000).toFixed(1);\n\n this.log(\n `Backfill complete in ${elapsedSec}s. attempted=${result.attempted} emitted=${result.emitted} skipped=${result.skipped} failed=${result.failed} highestStepIdx=${result.highestStepIdx}`,\n );\n\n if (flags['save-state']) {\n stateApi.save(conversationId, { lastStepIdx: result.highestStepIdx });\n this.log(`State saved \u2192 live hook will resume from step_index > ${result.highestStepIdx}.`);\n } else {\n this.log('State NOT saved (--no-save-state). Live hook will re-emit any new records from after-step.');\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,34 +1,49 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
import {
|
|
2
|
+
BaseCommand
|
|
3
|
+
} from "../../chunk-S56LOTGQ.js";
|
|
4
|
+
import "../../chunk-OGVORIFM.js";
|
|
5
|
+
import "../../chunk-2AM54TUK.js";
|
|
6
|
+
import {
|
|
7
|
+
apiPost
|
|
8
|
+
} from "../../chunk-EJOI2ZGU.js";
|
|
9
|
+
import {
|
|
10
|
+
saveApiKey
|
|
11
|
+
} from "../../chunk-KZRFUXGF.js";
|
|
12
|
+
import "../../chunk-EKJ2CABV.js";
|
|
13
|
+
import "../../chunk-NSBPE2FW.js";
|
|
14
|
+
|
|
15
|
+
// src/commands/auth/create-key.ts
|
|
16
|
+
import { Flags } from "@oclif/core";
|
|
17
|
+
var AuthCreateKey = class _AuthCreateKey extends BaseCommand {
|
|
18
|
+
static description = "Create a long-lived API key for CLI and proxy authentication";
|
|
19
|
+
static examples = [
|
|
20
|
+
'<%= config.bin %> auth create-key --name "laptop"',
|
|
21
|
+
'<%= config.bin %> auth create-key --name "work proxy" --save'
|
|
22
|
+
];
|
|
23
|
+
static flags = {
|
|
24
|
+
name: Flags.string({ char: "n", description: "Name for this key", required: true }),
|
|
25
|
+
save: Flags.boolean({ char: "s", description: "Save key to ~/.config/rulemetric/env for hooks/proxy", default: true })
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { flags } = await this.parse(_AuthCreateKey);
|
|
29
|
+
const data = await apiPost("/api/auth/api-keys", { name: flags.name });
|
|
30
|
+
this.log("");
|
|
31
|
+
this.log("API key created successfully:");
|
|
32
|
+
this.log("");
|
|
33
|
+
this.log(` Name: ${data.name}`);
|
|
34
|
+
this.log(` Key: ${data.key}`);
|
|
35
|
+
this.log(` Prefix: ${data.keyPrefix}`);
|
|
36
|
+
this.log("");
|
|
37
|
+
this.warn("Save this key now \u2014 it will not be shown again.");
|
|
38
|
+
if (flags.save) {
|
|
39
|
+
saveApiKey(data.key, process.env.RULEMETRIC_API_URL);
|
|
40
|
+
this.log("");
|
|
41
|
+
this.log("Key saved to ~/.config/rulemetric/env (RULEMETRIC_API_KEY)");
|
|
42
|
+
this.log("Hooks and proxy will use this key automatically.");
|
|
32
43
|
}
|
|
33
|
-
}
|
|
34
|
-
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export {
|
|
47
|
+
AuthCreateKey as default
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=create-key.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/commands/auth/create-key.ts"],
|
|
4
|
+
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\nimport { saveApiKey } from '../../lib/auth.js';\n\ninterface CreateKeyResponse {\n id: string;\n name: string;\n key: string;\n keyPrefix: string;\n createdAt: string;\n}\n\nexport default class AuthCreateKey extends BaseCommand {\n static override description = 'Create a long-lived API key for CLI and proxy authentication';\n\n static override examples = [\n '<%= config.bin %> auth create-key --name \"laptop\"',\n '<%= config.bin %> auth create-key --name \"work proxy\" --save',\n ];\n\n static override flags = {\n name: Flags.string({ char: 'n', description: 'Name for this key', required: true }),\n save: Flags.boolean({ char: 's', description: 'Save key to ~/.config/rulemetric/env for hooks/proxy', default: true }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(AuthCreateKey);\n\n const data = await apiPost<CreateKeyResponse>('/api/auth/api-keys', { name: flags.name });\n\n this.log('');\n this.log('API key created successfully:');\n this.log('');\n this.log(` Name: ${data.name}`);\n this.log(` Key: ${data.key}`);\n this.log(` Prefix: ${data.keyPrefix}`);\n this.log('');\n this.warn('Save this key now \u2014 it will not be shown again.');\n\n if (flags.save) {\n saveApiKey(data.key, process.env.RULEMETRIC_API_URL);\n this.log('');\n this.log('Key saved to ~/.config/rulemetric/env (RULEMETRIC_API_KEY)');\n this.log('Hooks and proxy will use this key automatically.');\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAatB,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,qBAAqB,UAAU,KAAK,CAAC;AAAA,IAClF,MAAM,MAAM,QAAQ,EAAE,MAAM,KAAK,aAAa,wDAAwD,SAAS,KAAK,CAAC;AAAA,EACvH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,cAAa;AAEhD,UAAM,OAAO,MAAM,QAA2B,sBAAsB,EAAE,MAAM,MAAM,KAAK,CAAC;AAExF,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,+BAA+B;AACxC,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,aAAa,KAAK,IAAI,EAAE;AACjC,SAAK,IAAI,aAAa,KAAK,GAAG,EAAE;AAChC,SAAK,IAAI,aAAa,KAAK,SAAS,EAAE;AACtC,SAAK,IAAI,EAAE;AACX,SAAK,KAAK,sDAAiD;AAE3D,QAAI,MAAM,MAAM;AACd,iBAAW,KAAK,KAAK,QAAQ,IAAI,kBAAkB;AACnD,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,4DAA4D;AACrE,WAAK,IAAI,kDAAkD;AAAA,IAC7D;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,47 +1,59 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// fires in the meantime lands with org_id = NULL.
|
|
43
|
-
await bootstrapActiveOrg();
|
|
44
|
-
this.log(`Logged in as ${data.email}`);
|
|
1
|
+
import {
|
|
2
|
+
BaseCommand
|
|
3
|
+
} from "../../chunk-S56LOTGQ.js";
|
|
4
|
+
import "../../chunk-OGVORIFM.js";
|
|
5
|
+
import {
|
|
6
|
+
bootstrapActiveOrg
|
|
7
|
+
} from "../../chunk-2AM54TUK.js";
|
|
8
|
+
import {
|
|
9
|
+
apiPost
|
|
10
|
+
} from "../../chunk-EJOI2ZGU.js";
|
|
11
|
+
import {
|
|
12
|
+
saveEnvFile,
|
|
13
|
+
saveToken
|
|
14
|
+
} from "../../chunk-KZRFUXGF.js";
|
|
15
|
+
import "../../chunk-EKJ2CABV.js";
|
|
16
|
+
import "../../chunk-NSBPE2FW.js";
|
|
17
|
+
|
|
18
|
+
// src/commands/auth/login.ts
|
|
19
|
+
import { Flags } from "@oclif/core";
|
|
20
|
+
var AuthLogin = class _AuthLogin extends BaseCommand {
|
|
21
|
+
static description = "Log in to RuleMetric";
|
|
22
|
+
static examples = [
|
|
23
|
+
"<%= config.bin %> auth login",
|
|
24
|
+
"<%= config.bin %> auth login -e user@example.com"
|
|
25
|
+
];
|
|
26
|
+
static flags = {
|
|
27
|
+
email: Flags.string({ char: "e", description: "Email address" }),
|
|
28
|
+
password: Flags.string({ char: "p", description: "Password (for non-interactive use)" })
|
|
29
|
+
};
|
|
30
|
+
async run() {
|
|
31
|
+
const { flags } = await this.parse(_AuthLogin);
|
|
32
|
+
let email = flags.email;
|
|
33
|
+
let password = flags.password;
|
|
34
|
+
if (!email || !password) {
|
|
35
|
+
const { input, password: passwordPrompt } = await import("@inquirer/prompts");
|
|
36
|
+
if (!email) {
|
|
37
|
+
email = await input({ message: "Email:" });
|
|
38
|
+
}
|
|
39
|
+
if (!password) {
|
|
40
|
+
password = await passwordPrompt({ message: "Password:" });
|
|
41
|
+
}
|
|
45
42
|
}
|
|
46
|
-
}
|
|
47
|
-
|
|
43
|
+
const data = await apiPost("/auth/login", { email, password });
|
|
44
|
+
const expiresAt = data.expiresAt ?? new Date(Date.now() + 3600 * 1e3).toISOString();
|
|
45
|
+
saveToken({
|
|
46
|
+
accessToken: data.accessToken,
|
|
47
|
+
refreshToken: data.refreshToken,
|
|
48
|
+
expiresAt,
|
|
49
|
+
email: data.email
|
|
50
|
+
});
|
|
51
|
+
saveEnvFile(data.accessToken, process.env.RULEMETRIC_API_URL);
|
|
52
|
+
await bootstrapActiveOrg();
|
|
53
|
+
this.log(`Logged in as ${data.email}`);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
export {
|
|
57
|
+
AuthLogin as default
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/commands/auth/login.ts"],
|
|
4
|
+
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { saveToken, saveEnvFile } from '../../lib/auth.js';\nimport { apiPost } from '../../lib/api-client.js';\nimport { bootstrapActiveOrg } from '../../lib/active-org-refresh.js';\n\ninterface LoginResponse {\n accessToken: string;\n refreshToken: string;\n expiresAt: string | null;\n email: string;\n}\n\nexport default class AuthLogin extends BaseCommand {\n static override description = 'Log in to RuleMetric';\n\n static override examples = [\n '<%= config.bin %> auth login',\n '<%= config.bin %> auth login -e user@example.com',\n ];\n\n static override flags = {\n email: Flags.string({ char: 'e', description: 'Email address' }),\n password: Flags.string({ char: 'p', description: 'Password (for non-interactive use)' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(AuthLogin);\n\n let email = flags.email;\n let password = flags.password;\n\n if (!email || !password) {\n const { input, password: passwordPrompt } = await import('@inquirer/prompts');\n\n if (!email) {\n email = await input({ message: 'Email:' });\n }\n\n if (!password) {\n password = await passwordPrompt({ message: 'Password:' });\n }\n }\n\n const data = await apiPost<LoginResponse>('/auth/login', { email, password });\n\n const expiresAt = data.expiresAt ?? new Date(Date.now() + 3600 * 1000).toISOString();\n\n saveToken({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n expiresAt,\n email: data.email,\n });\n\n saveEnvFile(data.accessToken, process.env.RULEMETRIC_API_URL);\n\n // Bootstrap the active-org cache now that auth is available. BaseCommand\n // fired the guarded refresh BEFORE login completed (no creds \u2192 401 \u2192\n // swallowed); without this explicit retry, the cache stays empty until\n // the user runs another CLI command, and any Claude Code session that\n // fires in the meantime lands with org_id = NULL.\n await bootstrapActiveOrg();\n\n this.log(`Logged in as ${data.email}`);\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAatB,IAAqB,YAArB,MAAqB,mBAAkB,YAAY;AAAA,EACjD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,gBAAgB,CAAC;AAAA,IAC/D,UAAU,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,qCAAqC,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,UAAS;AAE5C,QAAI,QAAQ,MAAM;AAClB,QAAI,WAAW,MAAM;AAErB,QAAI,CAAC,SAAS,CAAC,UAAU;AACvB,YAAM,EAAE,OAAO,UAAU,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAE5E,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,MAC3C;AAEA,UAAI,CAAC,UAAU;AACb,mBAAW,MAAM,eAAe,EAAE,SAAS,YAAY,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,QAAuB,eAAe,EAAE,OAAO,SAAS,CAAC;AAE5E,UAAM,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,GAAI,EAAE,YAAY;AAEnF,cAAU;AAAA,MACR,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,OAAO,KAAK;AAAA,IACd,CAAC;AAED,gBAAY,KAAK,aAAa,QAAQ,IAAI,kBAAkB;AAO5D,UAAM,mBAAmB;AAEzB,SAAK,IAAI,gBAAgB,KAAK,KAAK,EAAE;AAAA,EACvC;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,13 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import {
|
|
2
|
+
BaseCommand
|
|
3
|
+
} from "../../chunk-S56LOTGQ.js";
|
|
4
|
+
import "../../chunk-OGVORIFM.js";
|
|
5
|
+
import "../../chunk-2AM54TUK.js";
|
|
6
|
+
import "../../chunk-EJOI2ZGU.js";
|
|
7
|
+
import {
|
|
8
|
+
clearEnvFile,
|
|
9
|
+
clearToken
|
|
10
|
+
} from "../../chunk-KZRFUXGF.js";
|
|
11
|
+
import "../../chunk-EKJ2CABV.js";
|
|
12
|
+
import "../../chunk-NSBPE2FW.js";
|
|
13
|
+
|
|
14
|
+
// src/commands/auth/logout.ts
|
|
15
|
+
var AuthLogout = class _AuthLogout extends BaseCommand {
|
|
16
|
+
static description = "Log out of RuleMetric";
|
|
17
|
+
static examples = ["<%= config.bin %> auth logout"];
|
|
18
|
+
async run() {
|
|
19
|
+
await this.parse(_AuthLogout);
|
|
20
|
+
clearToken();
|
|
21
|
+
clearEnvFile();
|
|
22
|
+
this.log("Logged out successfully.");
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
export {
|
|
26
|
+
AuthLogout as default
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/commands/auth/logout.ts"],
|
|
4
|
+
"sourcesContent": ["import { BaseCommand } from '../../base-command.js';\nimport { clearToken, clearEnvFile } from '../../lib/auth.js';\n\nexport default class AuthLogout extends BaseCommand {\n static override description = 'Log out of RuleMetric';\n\n static override examples = ['<%= config.bin %> auth logout'];\n\n async run(): Promise<void> {\n await this.parse(AuthLogout);\n clearToken();\n clearEnvFile();\n this.log('Logged out successfully.');\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAGA,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW,CAAC,+BAA+B;AAAA,EAE3D,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,WAAU;AAC3B,eAAW;AACX,iBAAa;AACb,SAAK,IAAI,0BAA0B;AAAA,EACrC;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|