@rulemetric/cli 0.7.3 → 0.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base-command.js +1 -14
- package/dist/chunk-2TC6WCUT.js +34 -0
- package/dist/chunk-2UC3ULIG.js +1 -0
- package/dist/chunk-3AV3GTMP.js +1 -0
- package/dist/chunk-4Z5ECCJE.js +1 -0
- package/dist/chunk-5RBLIVBF.js +1 -0
- package/dist/chunk-67QCYUJU.js +1 -0
- package/dist/chunk-6QKI756T.js +2 -0
- package/dist/chunk-6V4WM73L.js +1 -0
- package/dist/chunk-6XEC6474.js +1 -0
- package/dist/chunk-72XLQE3X.js +2 -0
- package/dist/chunk-7DFNBRLY.js +61 -0
- package/dist/chunk-7XQ4VPLC.js +2 -0
- package/dist/chunk-AHRHCERJ.js +1 -0
- package/dist/chunk-ARNZQBMX.js +1 -0
- package/dist/chunk-CADKBP3D.js +58 -0
- package/dist/chunk-CDI5CCHU.js +1 -0
- package/dist/chunk-CNQ5DTNC.js +1 -0
- package/dist/chunk-CRAKDQ4H.js +1 -0
- package/dist/chunk-DNF4HDI6.js +14 -0
- package/dist/chunk-DSO2U4Y6.js +56 -0
- package/dist/chunk-DT4GKEP5.js +5 -0
- package/dist/chunk-DVN7GFJG.js +1 -0
- package/dist/chunk-E4SFUPYR.js +15 -0
- package/dist/chunk-EUHNCVJQ.js +33 -0
- package/dist/chunk-F2VP4B4J.js +1 -0
- package/dist/chunk-FEHM5OKW.js +1 -0
- package/dist/chunk-FHVBTDBM.js +69 -0
- package/dist/chunk-GBMF3TP6.js +1 -0
- package/dist/chunk-GY5IJ4RS.js +1 -0
- package/dist/chunk-HOHD5HY2.js +5 -0
- package/dist/chunk-HP2BUPGS.js +24 -0
- package/dist/{chunk-OQBBVTDG.js → chunk-I2DZGJRR.js} +6 -71
- package/dist/chunk-I4YJ7NTX.js +1 -0
- package/dist/chunk-IY5NXR3N.js +1 -0
- package/dist/chunk-IZTIYR5Q.js +2 -0
- package/dist/chunk-KKDHD4XA.js +2 -0
- package/dist/chunk-LQRYQE6Q.js +4 -0
- package/dist/chunk-M6AJDVCL.js +5 -0
- package/dist/chunk-MGHFDHHM.js +1 -0
- package/dist/chunk-ML36XQW7.js +1 -0
- package/dist/chunk-MODXEGCU.js +1 -0
- package/dist/chunk-MVM6OGAF.js +4 -0
- package/dist/chunk-N7ODX6PO.js +1 -0
- package/dist/chunk-NBTC5FNV.js +1 -0
- package/dist/chunk-NJ5UED3H.js +1 -0
- package/dist/chunk-NVKX36YN.js +3 -0
- package/dist/chunk-NVOTOQBA.js +1 -0
- package/dist/chunk-O7ZMHCMG.js +31 -0
- package/dist/chunk-OMXUK4M6.js +1 -0
- package/dist/chunk-PZS2KOU7.js +1 -0
- package/dist/chunk-RSKQRVPJ.js +1 -0
- package/dist/chunk-RTEATXTP.js +1 -0
- package/dist/chunk-RTWRHIKY.js +7 -0
- package/dist/chunk-RVO4HV3M.js +1 -0
- package/dist/chunk-SBILN45P.js +1 -0
- package/dist/chunk-SZ62CP55.js +1 -0
- package/dist/chunk-T3W5N3BP.js +2 -0
- package/dist/chunk-TDD7IOV2.js +1 -0
- package/dist/chunk-TIQ7DQ3M.js +1 -0
- package/dist/chunk-TU2AR6XO.js +1 -0
- package/dist/chunk-UF6US7VU.js +1 -0
- package/dist/chunk-V5QFOF4F.js +9 -0
- package/dist/chunk-V5U3E4BZ.js +1 -0
- package/dist/chunk-VAFAH6QL.js +1 -0
- package/dist/chunk-VMWY7KHH.js +1 -0
- package/dist/chunk-VUGRXM7R.js +1 -0
- package/dist/{chunk-XZXS2W24.js → chunk-VWEXKDWG.js} +10 -56
- package/dist/chunk-W2MV25SB.js +1 -0
- package/dist/chunk-WJ3H73G6.js +1 -0
- package/dist/chunk-WJUQBMTF.js +9 -0
- package/dist/chunk-WLVQJH4E.js +1 -0
- package/dist/chunk-WPJ2BND4.js +1 -0
- package/dist/chunk-WSCK4WNK.js +1 -0
- package/dist/chunk-Y65CSJFF.js +3 -0
- package/dist/chunk-ZL4MZMUK.js +34 -0
- package/dist/chunk-ZLLER3HP.js +1 -0
- package/dist/chunk-ZXF5NE54.js +1 -0
- package/dist/commands/antigravity/backfill.js +2 -136
- package/dist/commands/auth/create-key.js +1 -52
- package/dist/commands/auth/login.js +1 -85
- package/dist/commands/auth/logout.js +1 -29
- package/dist/commands/auth/revoke-key.js +1 -33
- package/dist/commands/auth/signup.js +1 -89
- package/dist/commands/auth/status.js +1 -42
- package/dist/commands/catalog/index.js +2 -52
- package/dist/commands/catalog/recommend.js +3 -43
- package/dist/commands/convert.js +1 -75
- package/dist/commands/converters.js +1 -54
- package/dist/commands/crons/list.js +1 -41
- package/dist/commands/crons/run.js +2 -76
- package/dist/commands/dashboard.js +1 -46
- package/dist/commands/diagnostics.js +1 -117
- package/dist/commands/eval-targets/create.js +1 -53
- package/dist/commands/eval-targets/list.js +1 -54
- package/dist/commands/evals/agent.js +3 -310
- package/dist/commands/evals/benchmark.js +6 -73
- package/dist/commands/evals/compare.js +13 -96
- package/dist/commands/evals/create.js +1 -67
- package/dist/commands/evals/optimize-description.js +25 -239
- package/dist/commands/evals/optimize.js +5 -211
- package/dist/commands/evals/run.js +3 -183
- package/dist/commands/gateway/ensure.js +1 -104
- package/dist/commands/hooks/emit-instructions.js +1 -25
- package/dist/commands/hooks/install.js +1 -442
- package/dist/commands/hooks/run.js +3 -81
- package/dist/commands/hooks/uninstall.js +2 -156
- package/dist/commands/import.js +1 -66
- package/dist/commands/instructions/create.js +1 -74
- package/dist/commands/instructions/delete.js +1 -55
- package/dist/commands/instructions/fork.js +1 -34
- package/dist/commands/instructions/get.js +1 -68
- package/dist/commands/instructions/list.js +1 -65
- package/dist/commands/instructions/promote.js +1 -42
- package/dist/commands/instructions/pull.js +1 -39
- package/dist/commands/instructions/upstream.js +1 -38
- package/dist/commands/instructions/versions.js +1 -53
- package/dist/commands/launcher.js +1 -40
- package/dist/commands/org/current.js +1 -77
- package/dist/commands/org/list.js +1 -52
- package/dist/commands/org/switch.js +1 -71
- package/dist/commands/packs/add-instruction.js +1 -37
- package/dist/commands/packs/apply.js +1 -39
- package/dist/commands/packs/create.js +1 -50
- package/dist/commands/packs/fork.js +1 -34
- package/dist/commands/packs/get.js +3 -56
- package/dist/commands/packs/list.js +1 -66
- package/dist/commands/packs/remove-instruction.js +1 -35
- package/dist/commands/proxy/env.js +3 -131
- package/dist/commands/proxy/logs.js +3 -85
- package/dist/commands/proxy/restart.js +1 -35
- package/dist/commands/proxy/setup.js +15 -454
- package/dist/commands/proxy/start.js +10 -333
- package/dist/commands/proxy/status.js +1 -78
- package/dist/commands/proxy/stop.js +1 -94
- package/dist/commands/research/backfill.js +1 -59
- package/dist/commands/research/tail-transcript.js +1 -70
- package/dist/commands/service/install.js +57 -796
- package/dist/commands/service/status.js +1 -180
- package/dist/commands/service/uninstall.js +1 -119
- package/dist/commands/sessions/analyze.js +3 -48
- package/dist/commands/sessions/end.js +2 -85
- package/dist/commands/sessions/import.js +1 -46
- package/dist/commands/sessions/list.js +1 -48
- package/dist/commands/sessions/start.js +3 -90
- package/dist/commands/setup.js +3 -150
- package/dist/commands/skills/export-approved.js +1 -46
- package/dist/commands/skills/install.js +4 -107
- package/dist/commands/skills/list.js +4 -65
- package/dist/commands/skills/publish.js +2 -98
- package/dist/commands/skills/search.js +3 -72
- package/dist/commands/skills/update.js +3 -55
- package/dist/commands/suggestions/accept.js +8 -84
- package/dist/commands/suggestions/dismiss.js +1 -45
- package/dist/commands/suggestions/list.js +1 -61
- package/dist/commands/suggestions/refresh.js +1 -27
- package/dist/cursor-T7AMCMKS.js +13 -0
- package/dist/dashboard/Dashboard.js +1 -243
- package/dist/dashboard/data.js +1 -15
- package/dist/dashboard/launcher/ActiveJobsList.js +1 -10
- package/dist/dashboard/launcher/LauncherOverlay.js +1 -16
- package/dist/dashboard/launcher/NewLaunchForm.js +1 -10
- package/dist/dashboard/launcher/api.js +1 -16
- package/dist/dashboard/launcher/tool-labels.js +1 -10
- package/dist/dashboard/launcher/types.js +0 -1
- package/dist/dashboard/launcher/useLaunchJobs.js +1 -11
- package/dist/dashboard/panels/friction.js +1 -10
- package/dist/dashboard/panels/insights.js +1 -10
- package/dist/dashboard/panels/instructions.js +1 -10
- package/dist/dashboard/panels/outcomes.js +1 -10
- package/dist/dashboard/panels/overview.js +1 -10
- package/dist/dashboard/panels/shared.js +1 -19
- package/dist/dashboard/types.js +1 -24
- package/dist/dist-FAVALJ5C.js +1 -0
- package/dist/index.js +1 -8
- package/dist/lib/active-org-refresh.js +1 -15
- package/dist/lib/active-org.js +1 -16
- package/dist/lib/agent-loop.js +1 -47
- package/dist/lib/antigravity-transcript.js +1 -22
- package/dist/lib/api-client.js +1 -23
- package/dist/lib/auth.js +1 -30
- package/dist/lib/capture-hosts.js +1 -8
- package/dist/lib/detect-languages.js +1 -8
- package/dist/lib/detect-tmux.js +1 -9
- package/dist/lib/diagnostics.js +1 -12
- package/dist/lib/editor-proxy-pins.js +1 -14
- package/dist/lib/ensure-api-key.js +1 -11
- package/dist/lib/eval-analyzer.js +1 -9
- package/dist/lib/eval-benchmark.js +1 -12
- package/dist/lib/eval-conversation-handler.js +1 -13
- package/dist/lib/eval-executor.js +1 -8
- package/dist/lib/eval-grader.js +1 -9
- package/dist/lib/eval-meta-judge.js +1 -9
- package/dist/lib/eval-trigger-tester.js +1 -11
- package/dist/lib/eval-worktree.js +1 -8
- package/dist/lib/gateway-entry.js +1 -61
- package/dist/lib/gateway-identity.js +1 -16
- package/dist/lib/gateway-lifecycle.js +1 -32
- package/dist/lib/gateway.js +1 -14
- package/dist/lib/handlers/cron-refresh-pricing.js +1 -0
- package/dist/lib/handlers/cron-refresh-skills.js +1 -8
- package/dist/lib/handlers/cron-suggest-instructions.js +1 -16
- package/dist/lib/handlers/process-announcement.js +1 -11
- package/dist/lib/handlers/process-changelog.js +1 -11
- package/dist/lib/handlers/process-conversation.js +1 -14
- package/dist/lib/handlers/process-eval.js +1 -15
- package/dist/lib/handlers/process-insights.js +1 -15
- package/dist/lib/handlers/process-launch.js +1 -16
- package/dist/lib/handlers/process-run-cleanup.js +1 -13
- package/dist/lib/handlers/process-send-message.js +1 -10
- package/dist/lib/handlers/process-session-goal.js +1 -12
- package/dist/lib/hooks-config.js +1 -81
- package/dist/lib/insights-prompts.js +1 -12
- package/dist/lib/instruction-snapshot.js +1 -8
- package/dist/lib/job-helpers.js +0 -1
- package/dist/lib/llm-client.js +1 -20
- package/dist/lib/manual-tasks-meta.js +1 -8
- package/dist/lib/manual-tasks.js +1 -80
- package/dist/lib/output.js +1 -12
- package/dist/lib/permanent-job-error.js +1 -10
- package/dist/lib/pid-identity.js +1 -14
- package/dist/lib/proxy-respawn.js +1 -12
- package/dist/lib/research-client.js +1 -12
- package/dist/lib/setup-steps.js +1 -33
- package/dist/lib/skills-loader.js +1 -8
- package/dist/lib/statusline-shim.js +1 -20
- package/dist/lib/telemetry.js +1 -16
- package/dist/lib/terminal-target-heartbeat.js +1 -15
- package/dist/lib/tmux.js +1 -16
- package/dist/lib/transcript-rate-limit-watcher.js +1 -22
- package/dist/lib/types.js +1 -8
- package/dist/lib/version-check.js +1 -12
- package/dist/lib/which.js +1 -8
- package/dist/lib/worktree.js +1 -17
- package/dist/opencode-QRJ3BH23.js +1 -0
- package/oclif.manifest.json +135 -135
- package/package.json +9 -8
- package/dist/base-command.js.map +0 -7
- package/dist/chunk-2HK7RGZB.js +0 -82
- package/dist/chunk-2HK7RGZB.js.map +0 -7
- package/dist/chunk-2ORJWTNZ.js +0 -307
- package/dist/chunk-2ORJWTNZ.js.map +0 -7
- package/dist/chunk-37LN5O7M.js +0 -59
- package/dist/chunk-37LN5O7M.js.map +0 -7
- package/dist/chunk-3S7223UR.js +0 -81
- package/dist/chunk-3S7223UR.js.map +0 -7
- package/dist/chunk-3TIMQ3O6.js +0 -96
- package/dist/chunk-3TIMQ3O6.js.map +0 -7
- package/dist/chunk-42GFSAJP.js +0 -32
- package/dist/chunk-42GFSAJP.js.map +0 -7
- package/dist/chunk-4BHDHHKL.js +0 -48
- package/dist/chunk-4BHDHHKL.js.map +0 -7
- package/dist/chunk-4D537GXE.js +0 -99
- package/dist/chunk-4D537GXE.js.map +0 -7
- package/dist/chunk-4LYCDS2N.js +0 -139
- package/dist/chunk-4LYCDS2N.js.map +0 -7
- package/dist/chunk-4SCZK7AL.js +0 -129
- package/dist/chunk-4SCZK7AL.js.map +0 -7
- package/dist/chunk-4XAWK6S2.js +0 -161
- package/dist/chunk-4XAWK6S2.js.map +0 -7
- package/dist/chunk-52WIYRZH.js +0 -73
- package/dist/chunk-52WIYRZH.js.map +0 -7
- package/dist/chunk-5BAOGNUH.js +0 -79
- package/dist/chunk-5BAOGNUH.js.map +0 -7
- package/dist/chunk-5EDMGK3W.js +0 -39
- package/dist/chunk-5EDMGK3W.js.map +0 -7
- package/dist/chunk-6NBS5XFS.js +0 -99
- package/dist/chunk-6NBS5XFS.js.map +0 -7
- package/dist/chunk-7LVVKQMZ.js +0 -98
- package/dist/chunk-7LVVKQMZ.js.map +0 -7
- package/dist/chunk-7NNFYWKK.js +0 -243
- package/dist/chunk-7NNFYWKK.js.map +0 -7
- package/dist/chunk-7NYKWN7U.js +0 -12
- package/dist/chunk-7NYKWN7U.js.map +0 -7
- package/dist/chunk-BO76WKJR.js +0 -42
- package/dist/chunk-BO76WKJR.js.map +0 -7
- package/dist/chunk-BRD5RUGM.js +0 -53
- package/dist/chunk-BRD5RUGM.js.map +0 -7
- package/dist/chunk-BT6Z6545.js +0 -43
- package/dist/chunk-BT6Z6545.js.map +0 -7
- package/dist/chunk-BZDKEQKU.js +0 -39
- package/dist/chunk-BZDKEQKU.js.map +0 -7
- package/dist/chunk-DGHWRQXL.js +0 -17
- package/dist/chunk-DGHWRQXL.js.map +0 -7
- package/dist/chunk-DIQUV5FR.js +0 -257
- package/dist/chunk-DIQUV5FR.js.map +0 -7
- package/dist/chunk-DMX5YOTM.js +0 -167
- package/dist/chunk-DMX5YOTM.js.map +0 -7
- package/dist/chunk-DNKSVWMD.js +0 -108
- package/dist/chunk-DNKSVWMD.js.map +0 -7
- package/dist/chunk-DQ3KELXD.js +0 -74
- package/dist/chunk-DQ3KELXD.js.map +0 -7
- package/dist/chunk-DUJSRBLP.js +0 -122
- package/dist/chunk-DUJSRBLP.js.map +0 -7
- package/dist/chunk-E3BIT53W.js +0 -154
- package/dist/chunk-E3BIT53W.js.map +0 -7
- package/dist/chunk-EARWG4EV.js +0 -22
- package/dist/chunk-EARWG4EV.js.map +0 -7
- package/dist/chunk-EI5BHWXA.js +0 -1662
- package/dist/chunk-EI5BHWXA.js.map +0 -7
- package/dist/chunk-EJ3YAFDP.js +0 -37
- package/dist/chunk-EJ3YAFDP.js.map +0 -7
- package/dist/chunk-EKJ2CABV.js +0 -76
- package/dist/chunk-EKJ2CABV.js.map +0 -7
- package/dist/chunk-EKP32DLN.js +0 -16
- package/dist/chunk-EKP32DLN.js.map +0 -7
- package/dist/chunk-EYPAAGN5.js +0 -51
- package/dist/chunk-EYPAAGN5.js.map +0 -7
- package/dist/chunk-F5N6CLJJ.js +0 -1995
- package/dist/chunk-F5N6CLJJ.js.map +0 -7
- package/dist/chunk-GIUBARWS.js +0 -99
- package/dist/chunk-GIUBARWS.js.map +0 -7
- package/dist/chunk-GQNJO2P2.js +0 -102
- package/dist/chunk-GQNJO2P2.js.map +0 -7
- package/dist/chunk-IJGF2ETG.js +0 -68
- package/dist/chunk-IJGF2ETG.js.map +0 -7
- package/dist/chunk-ILYDELUE.js +0 -46
- package/dist/chunk-ILYDELUE.js.map +0 -7
- package/dist/chunk-J6QFW4LD.js +0 -55
- package/dist/chunk-J6QFW4LD.js.map +0 -7
- package/dist/chunk-J7N3DLH6.js +0 -117
- package/dist/chunk-J7N3DLH6.js.map +0 -7
- package/dist/chunk-JFDWKLQC.js +0 -23
- package/dist/chunk-JFDWKLQC.js.map +0 -7
- package/dist/chunk-JULOLTZS.js +0 -61
- package/dist/chunk-JULOLTZS.js.map +0 -7
- package/dist/chunk-KJKBDQ4D.js +0 -220
- package/dist/chunk-KJKBDQ4D.js.map +0 -7
- package/dist/chunk-KRBQLMOP.js +0 -41
- package/dist/chunk-KRBQLMOP.js.map +0 -7
- package/dist/chunk-LXKPNATC.js +0 -624
- package/dist/chunk-LXKPNATC.js.map +0 -7
- package/dist/chunk-NSBPE2FW.js +0 -17
- package/dist/chunk-NSBPE2FW.js.map +0 -7
- package/dist/chunk-OCKHW72U.js +0 -55
- package/dist/chunk-OCKHW72U.js.map +0 -7
- package/dist/chunk-OKWCKCPE.js +0 -414
- package/dist/chunk-OKWCKCPE.js.map +0 -7
- package/dist/chunk-OO7JDFS4.js +0 -157
- package/dist/chunk-OO7JDFS4.js.map +0 -7
- package/dist/chunk-OQBBVTDG.js.map +0 -7
- package/dist/chunk-OQSQC7VB.js +0 -77
- package/dist/chunk-OQSQC7VB.js.map +0 -7
- package/dist/chunk-PED7L5GX.js +0 -92
- package/dist/chunk-PED7L5GX.js.map +0 -7
- package/dist/chunk-QJQS6TUN.js +0 -44
- package/dist/chunk-QJQS6TUN.js.map +0 -7
- package/dist/chunk-QN34TGD3.js +0 -83
- package/dist/chunk-QN34TGD3.js.map +0 -7
- package/dist/chunk-QSN77T7C.js +0 -250
- package/dist/chunk-QSN77T7C.js.map +0 -7
- package/dist/chunk-R56PH7YE.js +0 -78
- package/dist/chunk-R56PH7YE.js.map +0 -7
- package/dist/chunk-RAXRZYOB.js +0 -299
- package/dist/chunk-RAXRZYOB.js.map +0 -7
- package/dist/chunk-RH7NHVSK.js +0 -16
- package/dist/chunk-RH7NHVSK.js.map +0 -7
- package/dist/chunk-RMTT4KDY.js +0 -191
- package/dist/chunk-RMTT4KDY.js.map +0 -7
- package/dist/chunk-RQ2TMLKG.js +0 -142
- package/dist/chunk-RQ2TMLKG.js.map +0 -7
- package/dist/chunk-SO3T35U7.js +0 -80
- package/dist/chunk-SO3T35U7.js.map +0 -7
- package/dist/chunk-UKMLICWS.js +0 -51
- package/dist/chunk-UKMLICWS.js.map +0 -7
- package/dist/chunk-VA5FFOS7.js +0 -243
- package/dist/chunk-VA5FFOS7.js.map +0 -7
- package/dist/chunk-W2YERO7E.js +0 -170
- package/dist/chunk-W2YERO7E.js.map +0 -7
- package/dist/chunk-W53GKIZQ.js +0 -50
- package/dist/chunk-W53GKIZQ.js.map +0 -7
- package/dist/chunk-WA4MWYRW.js +0 -254
- package/dist/chunk-WA4MWYRW.js.map +0 -7
- package/dist/chunk-XC6M4CSW.js +0 -44
- package/dist/chunk-XC6M4CSW.js.map +0 -7
- package/dist/chunk-XK42ZBDE.js +0 -23
- package/dist/chunk-XK42ZBDE.js.map +0 -7
- package/dist/chunk-XUV6DDBF.js +0 -124
- package/dist/chunk-XUV6DDBF.js.map +0 -7
- package/dist/chunk-XZXS2W24.js.map +0 -7
- package/dist/chunk-Y3WD5CSW.js +0 -49
- package/dist/chunk-Y3WD5CSW.js.map +0 -7
- package/dist/chunk-Y4BJXXYV.js +0 -148
- package/dist/chunk-Y4BJXXYV.js.map +0 -7
- package/dist/chunk-YNIH3KMU.js +0 -121
- package/dist/chunk-YNIH3KMU.js.map +0 -7
- package/dist/chunk-ZUJBM6HE.js +0 -125
- package/dist/chunk-ZUJBM6HE.js.map +0 -7
- package/dist/commands/antigravity/backfill.js.map +0 -7
- package/dist/commands/auth/create-key.js.map +0 -7
- package/dist/commands/auth/login.js.map +0 -7
- package/dist/commands/auth/logout.js.map +0 -7
- package/dist/commands/auth/revoke-key.js.map +0 -7
- package/dist/commands/auth/signup.js.map +0 -7
- package/dist/commands/auth/status.js.map +0 -7
- package/dist/commands/catalog/index.js.map +0 -7
- package/dist/commands/catalog/recommend.js.map +0 -7
- package/dist/commands/convert.js.map +0 -7
- package/dist/commands/converters.js.map +0 -7
- package/dist/commands/crons/list.js.map +0 -7
- package/dist/commands/crons/run.js.map +0 -7
- package/dist/commands/dashboard.js.map +0 -7
- package/dist/commands/diagnostics.js.map +0 -7
- package/dist/commands/eval-targets/create.js.map +0 -7
- package/dist/commands/eval-targets/list.js.map +0 -7
- package/dist/commands/evals/agent.js.map +0 -7
- package/dist/commands/evals/benchmark.js.map +0 -7
- package/dist/commands/evals/compare.js.map +0 -7
- package/dist/commands/evals/create.js.map +0 -7
- package/dist/commands/evals/optimize-description.js.map +0 -7
- package/dist/commands/evals/optimize.js.map +0 -7
- package/dist/commands/evals/run.js.map +0 -7
- package/dist/commands/gateway/ensure.js.map +0 -7
- package/dist/commands/hooks/emit-instructions.js.map +0 -7
- package/dist/commands/hooks/install.js.map +0 -7
- package/dist/commands/hooks/run.js.map +0 -7
- package/dist/commands/hooks/uninstall.js.map +0 -7
- package/dist/commands/import.js.map +0 -7
- package/dist/commands/instructions/create.js.map +0 -7
- package/dist/commands/instructions/delete.js.map +0 -7
- package/dist/commands/instructions/fork.js.map +0 -7
- package/dist/commands/instructions/get.js.map +0 -7
- package/dist/commands/instructions/list.js.map +0 -7
- package/dist/commands/instructions/promote.js.map +0 -7
- package/dist/commands/instructions/pull.js.map +0 -7
- package/dist/commands/instructions/upstream.js.map +0 -7
- package/dist/commands/instructions/versions.js.map +0 -7
- package/dist/commands/launcher.js.map +0 -7
- package/dist/commands/org/current.js.map +0 -7
- package/dist/commands/org/list.js.map +0 -7
- package/dist/commands/org/switch.js.map +0 -7
- package/dist/commands/packs/add-instruction.js.map +0 -7
- package/dist/commands/packs/apply.js.map +0 -7
- package/dist/commands/packs/create.js.map +0 -7
- package/dist/commands/packs/fork.js.map +0 -7
- package/dist/commands/packs/get.js.map +0 -7
- package/dist/commands/packs/list.js.map +0 -7
- package/dist/commands/packs/remove-instruction.js.map +0 -7
- package/dist/commands/proxy/env.js.map +0 -7
- package/dist/commands/proxy/logs.js.map +0 -7
- package/dist/commands/proxy/restart.js.map +0 -7
- package/dist/commands/proxy/setup.js.map +0 -7
- package/dist/commands/proxy/start.js.map +0 -7
- package/dist/commands/proxy/status.js.map +0 -7
- package/dist/commands/proxy/stop.js.map +0 -7
- package/dist/commands/research/backfill.js.map +0 -7
- package/dist/commands/research/tail-transcript.js.map +0 -7
- package/dist/commands/service/install.js.map +0 -7
- package/dist/commands/service/status.js.map +0 -7
- package/dist/commands/service/uninstall.js.map +0 -7
- package/dist/commands/sessions/analyze.js.map +0 -7
- package/dist/commands/sessions/end.js.map +0 -7
- package/dist/commands/sessions/import.js.map +0 -7
- package/dist/commands/sessions/list.js.map +0 -7
- package/dist/commands/sessions/start.js.map +0 -7
- package/dist/commands/setup.js.map +0 -7
- package/dist/commands/skills/export-approved.js.map +0 -7
- package/dist/commands/skills/install.js.map +0 -7
- package/dist/commands/skills/list.js.map +0 -7
- package/dist/commands/skills/publish.js.map +0 -7
- package/dist/commands/skills/search.js.map +0 -7
- package/dist/commands/skills/update.js.map +0 -7
- package/dist/commands/suggestions/accept.js.map +0 -7
- package/dist/commands/suggestions/dismiss.js.map +0 -7
- package/dist/commands/suggestions/list.js.map +0 -7
- package/dist/commands/suggestions/refresh.js.map +0 -7
- package/dist/cursor-BGQJ4CWI.js +0 -134
- package/dist/cursor-BGQJ4CWI.js.map +0 -7
- package/dist/dashboard/Dashboard.js.map +0 -7
- package/dist/dashboard/data.js.map +0 -7
- package/dist/dashboard/launcher/ActiveJobsList.js.map +0 -7
- package/dist/dashboard/launcher/LauncherOverlay.js.map +0 -7
- package/dist/dashboard/launcher/NewLaunchForm.js.map +0 -7
- package/dist/dashboard/launcher/api.js.map +0 -7
- package/dist/dashboard/launcher/tool-labels.js.map +0 -7
- package/dist/dashboard/launcher/types.js.map +0 -7
- package/dist/dashboard/launcher/useLaunchJobs.js.map +0 -7
- package/dist/dashboard/panels/friction.js.map +0 -7
- package/dist/dashboard/panels/insights.js.map +0 -7
- package/dist/dashboard/panels/instructions.js.map +0 -7
- package/dist/dashboard/panels/outcomes.js.map +0 -7
- package/dist/dashboard/panels/overview.js.map +0 -7
- package/dist/dashboard/panels/shared.js.map +0 -7
- package/dist/dashboard/types.js.map +0 -7
- package/dist/dist-UNYP5PJR.js +0 -56
- package/dist/dist-UNYP5PJR.js.map +0 -7
- package/dist/index.js.map +0 -7
- package/dist/lib/active-org-refresh.js.map +0 -7
- package/dist/lib/active-org.js.map +0 -7
- package/dist/lib/agent-loop.js.map +0 -7
- package/dist/lib/antigravity-transcript.js.map +0 -7
- package/dist/lib/api-client.js.map +0 -7
- package/dist/lib/auth.js.map +0 -7
- package/dist/lib/capture-hosts.js.map +0 -7
- package/dist/lib/detect-languages.js.map +0 -7
- package/dist/lib/detect-tmux.js.map +0 -7
- package/dist/lib/diagnostics.js.map +0 -7
- package/dist/lib/editor-proxy-pins.js.map +0 -7
- package/dist/lib/ensure-api-key.js.map +0 -7
- package/dist/lib/eval-analyzer.js.map +0 -7
- package/dist/lib/eval-benchmark.js.map +0 -7
- package/dist/lib/eval-conversation-handler.js.map +0 -7
- package/dist/lib/eval-executor.js.map +0 -7
- package/dist/lib/eval-grader.js.map +0 -7
- package/dist/lib/eval-meta-judge.js.map +0 -7
- package/dist/lib/eval-trigger-tester.js.map +0 -7
- package/dist/lib/eval-worktree.js.map +0 -7
- package/dist/lib/gateway-entry.js.map +0 -7
- package/dist/lib/gateway-identity.js.map +0 -7
- package/dist/lib/gateway-lifecycle.js.map +0 -7
- package/dist/lib/gateway.js.map +0 -7
- package/dist/lib/handlers/cron-refresh-skills.js.map +0 -7
- package/dist/lib/handlers/cron-suggest-instructions.js.map +0 -7
- package/dist/lib/handlers/process-announcement.js.map +0 -7
- package/dist/lib/handlers/process-changelog.js.map +0 -7
- package/dist/lib/handlers/process-conversation.js.map +0 -7
- package/dist/lib/handlers/process-eval.js.map +0 -7
- package/dist/lib/handlers/process-insights.js.map +0 -7
- package/dist/lib/handlers/process-launch.js.map +0 -7
- package/dist/lib/handlers/process-run-cleanup.js.map +0 -7
- package/dist/lib/handlers/process-send-message.js.map +0 -7
- package/dist/lib/handlers/process-session-goal.js.map +0 -7
- package/dist/lib/hooks-config.js.map +0 -7
- package/dist/lib/insights-prompts.js.map +0 -7
- package/dist/lib/instruction-snapshot.js.map +0 -7
- package/dist/lib/job-helpers.js.map +0 -7
- package/dist/lib/llm-client.js.map +0 -7
- package/dist/lib/manual-tasks-meta.js.map +0 -7
- package/dist/lib/manual-tasks.js.map +0 -7
- package/dist/lib/output.js.map +0 -7
- package/dist/lib/permanent-job-error.js.map +0 -7
- package/dist/lib/pid-identity.js.map +0 -7
- package/dist/lib/proxy-respawn.js.map +0 -7
- package/dist/lib/research-client.js.map +0 -7
- package/dist/lib/setup-steps.js.map +0 -7
- package/dist/lib/skills-loader.js.map +0 -7
- package/dist/lib/statusline-shim.js.map +0 -7
- package/dist/lib/telemetry.js.map +0 -7
- package/dist/lib/terminal-target-heartbeat.js.map +0 -7
- package/dist/lib/tmux.js.map +0 -7
- package/dist/lib/transcript-rate-limit-watcher.js.map +0 -7
- package/dist/lib/types.js.map +0 -7
- package/dist/lib/version-check.js.map +0 -7
- package/dist/lib/which.js.map +0 -7
- package/dist/lib/worktree.js.map +0 -7
- package/dist/opencode-IQ7X5YMJ.js +0 -190
- package/dist/opencode-IQ7X5YMJ.js.map +0 -7
package/dist/chunk-42GFSAJP.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// src/lib/which.ts
|
|
2
|
-
import { existsSync } from "node:fs";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { join, delimiter } from "node:path";
|
|
5
|
-
function wellKnownBinDirs(platform, home) {
|
|
6
|
-
if (platform === "darwin") {
|
|
7
|
-
return ["/opt/homebrew/bin", "/opt/homebrew/sbin", "/usr/local/bin", join(home, ".local/bin")];
|
|
8
|
-
}
|
|
9
|
-
if (platform === "linux") {
|
|
10
|
-
return ["/usr/local/bin", "/usr/bin", join(home, ".local/bin")];
|
|
11
|
-
}
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
function findBinary(name, opts = {}) {
|
|
15
|
-
const platform = opts.platform ?? process.platform;
|
|
16
|
-
const home = opts.home ?? homedir();
|
|
17
|
-
const pathDirs = (opts.pathEnv ?? process.env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
18
|
-
const dirs = [.../* @__PURE__ */ new Set([...pathDirs, ...wellKnownBinDirs(platform, home)])];
|
|
19
|
-
const exts = platform === "win32" ? ["", ...(process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean)] : [""];
|
|
20
|
-
for (const dir of dirs) {
|
|
21
|
-
for (const ext of exts) {
|
|
22
|
-
const candidate = join(dir, name + ext);
|
|
23
|
-
if (existsSync(candidate)) return candidate;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export {
|
|
30
|
-
findBinary
|
|
31
|
-
};
|
|
32
|
-
//# sourceMappingURL=chunk-42GFSAJP.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/which.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join, delimiter } from 'node:path';\n\ninterface FindBinaryOptions {\n /** Override the platform (defaults to process.platform). Used in tests. */\n platform?: NodeJS.Platform;\n /** Override $PATH (defaults to process.env.PATH). Used in tests. */\n pathEnv?: string;\n /** Override the home dir (for the well-known-dir fallback). Used in tests. */\n home?: string;\n}\n\n/**\n * Standard install locations to probe IN ADDITION to $PATH \u2014 GUI/agent-launched\n * processes (and Claude Code's minimal-PATH hook shells) often omit these, so a\n * brew/pipx/mitmdump that's plainly installed reads as \"not found\". This is the\n * same minimal-PATH class as the hook-command PATH prefixing (PR #111); here it\n * makes mitmproxy auto-install actually fire on a Mac with Homebrew. Real $PATH\n * entries are searched first, so this only ever ADDS reach, never overrides.\n */\nfunction wellKnownBinDirs(platform: NodeJS.Platform, home: string): string[] {\n if (platform === 'darwin') {\n return ['/opt/homebrew/bin', '/opt/homebrew/sbin', '/usr/local/bin', join(home, '.local/bin')];\n }\n if (platform === 'linux') {\n return ['/usr/local/bin', '/usr/bin', join(home, '.local/bin')];\n }\n return [];\n}\n\n/**\n * Cross-platform executable lookup \u2014 the portable replacement for `which`/`where`.\n *\n * Scans the directories on `$PATH` for an executable named `name`, returning the\n * first full path that exists or `null`. On Windows it also probes the\n * `PATHEXT` extensions (`.EXE`, `.CMD`, ...) so `findBinary('mitmdump')` resolves\n * `mitmdump.exe`. Pure filesystem reads \u2014 no subprocess \u2014 so it works identically\n * on macOS, Linux, and Windows (the old `execSync('which \u2026')` path threw on\n * Windows, which has no `which`, silently breaking mitmproxy detection there).\n */\nexport function findBinary(name: string, opts: FindBinaryOptions = {}): string | null {\n const platform = opts.platform ?? process.platform;\n const home = opts.home ?? homedir();\n const pathDirs = (opts.pathEnv ?? process.env.PATH ?? '').split(delimiter).filter(Boolean);\n // $PATH first (a real entry wins), then the well-known install dirs \u2014 deduped.\n const dirs = [...new Set([...pathDirs, ...wellKnownBinDirs(platform, home)])];\n\n // On Windows, try the bare name first (in case it already carries an extension),\n // then each PATHEXT suffix. Elsewhere, only the bare name is meaningful.\n const exts =\n platform === 'win32'\n ? ['', ...(process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM').split(';').filter(Boolean)]\n : [''];\n\n for (const dir of dirs) {\n for (const ext of exts) {\n const candidate = join(dir, name + ext);\n if (existsSync(candidate)) return candidate;\n }\n }\n return null;\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,MAAM,iBAAiB;AAmBhC,SAAS,iBAAiB,UAA2B,MAAwB;AAC3E,MAAI,aAAa,UAAU;AACzB,WAAO,CAAC,qBAAqB,sBAAsB,kBAAkB,KAAK,MAAM,YAAY,CAAC;AAAA,EAC/F;AACA,MAAI,aAAa,SAAS;AACxB,WAAO,CAAC,kBAAkB,YAAY,KAAK,MAAM,YAAY,CAAC;AAAA,EAChE;AACA,SAAO,CAAC;AACV;AAYO,SAAS,WAAW,MAAc,OAA0B,CAAC,GAAkB;AACpF,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,QAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,QAAM,YAAY,KAAK,WAAW,QAAQ,IAAI,QAAQ,IAAI,MAAM,SAAS,EAAE,OAAO,OAAO;AAEzF,QAAM,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,iBAAiB,UAAU,IAAI,CAAC,CAAC,CAAC;AAI5E,QAAM,OACJ,aAAa,UACT,CAAC,IAAI,IAAI,QAAQ,IAAI,WAAW,uBAAuB,MAAM,GAAG,EAAE,OAAO,OAAO,CAAC,IACjF,CAAC,EAAE;AAET,aAAW,OAAO,MAAM;AACtB,eAAW,OAAO,MAAM;AACtB,YAAM,YAAY,KAAK,KAAK,OAAO,GAAG;AACtC,UAAI,WAAW,SAAS,EAAG,QAAO;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-4BHDHHKL.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
__require
|
|
3
|
-
} from "./chunk-NSBPE2FW.js";
|
|
4
|
-
|
|
5
|
-
// src/lib/skills-loader.ts
|
|
6
|
-
import * as fs from "node:fs";
|
|
7
|
-
import * as path from "node:path";
|
|
8
|
-
import * as os from "node:os";
|
|
9
|
-
import { SkillCatalog } from "@rulemetric/skills-registry";
|
|
10
|
-
var CACHE_PATH = path.join(os.homedir(), ".config", "rulemetric", "skills-registry.json");
|
|
11
|
-
function findBundledRegistry() {
|
|
12
|
-
try {
|
|
13
|
-
const pkgDir = path.dirname(__require.resolve("@rulemetric/skills-registry/package.json"));
|
|
14
|
-
const bundled = path.join(pkgDir, "registry.json");
|
|
15
|
-
if (fs.existsSync(bundled)) return bundled;
|
|
16
|
-
} catch {
|
|
17
|
-
const monorepo = path.resolve(process.cwd(), "packages", "skills-registry", "registry.json");
|
|
18
|
-
if (fs.existsSync(monorepo)) return monorepo;
|
|
19
|
-
}
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
22
|
-
async function loadRegistry(ctx) {
|
|
23
|
-
const catalog = new SkillCatalog();
|
|
24
|
-
if (fs.existsSync(CACHE_PATH)) {
|
|
25
|
-
try {
|
|
26
|
-
const data = JSON.parse(fs.readFileSync(CACHE_PATH, "utf-8"));
|
|
27
|
-
catalog.load(data);
|
|
28
|
-
return catalog;
|
|
29
|
-
} catch {
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
const bundled = findBundledRegistry();
|
|
33
|
-
if (bundled) {
|
|
34
|
-
try {
|
|
35
|
-
const data = JSON.parse(fs.readFileSync(bundled, "utf-8"));
|
|
36
|
-
catalog.load(data);
|
|
37
|
-
return catalog;
|
|
38
|
-
} catch {
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
ctx.log("No local registry found. Run: rulemetric skills update");
|
|
42
|
-
return catalog;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export {
|
|
46
|
-
loadRegistry
|
|
47
|
-
};
|
|
48
|
-
//# sourceMappingURL=chunk-4BHDHHKL.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/skills-loader.ts"],
|
|
4
|
-
"sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { SkillCatalog } from '@rulemetric/skills-registry';\nimport type { SkillRegistry } from '@rulemetric/skills-registry';\n\nconst CACHE_PATH = path.join(os.homedir(), '.config', 'rulemetric', 'skills-registry.json');\n\n// Also check for a bundled registry.json next to the skills-registry package\nfunction findBundledRegistry(): string | null {\n try {\n const pkgDir = path.dirname(require.resolve('@rulemetric/skills-registry/package.json'));\n const bundled = path.join(pkgDir, 'registry.json');\n if (fs.existsSync(bundled)) return bundled;\n } catch {\n // resolve can fail in ESM, try a known relative path\n const monorepo = path.resolve(process.cwd(), 'packages', 'skills-registry', 'registry.json');\n if (fs.existsSync(monorepo)) return monorepo;\n }\n return null;\n}\n\n/** Load the skills registry, preferring local cache > bundled > empty. */\nexport async function loadRegistry(ctx: { log: (msg: string) => void }): Promise<SkillCatalog> {\n const catalog = new SkillCatalog();\n\n // Try cached registry first (from `skills update`)\n if (fs.existsSync(CACHE_PATH)) {\n try {\n const data = JSON.parse(fs.readFileSync(CACHE_PATH, 'utf-8')) as SkillRegistry;\n catalog.load(data);\n return catalog;\n } catch {\n // Corrupted cache \u2014 fall through\n }\n }\n\n // Try bundled registry\n const bundled = findBundledRegistry();\n if (bundled) {\n try {\n const data = JSON.parse(fs.readFileSync(bundled, 'utf-8')) as SkillRegistry;\n catalog.load(data);\n return catalog;\n } catch {\n // Fall through\n }\n }\n\n ctx.log('No local registry found. Run: rulemetric skills update');\n return catalog;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,oBAAoB;AAG7B,IAAM,aAAkB,UAAQ,WAAQ,GAAG,WAAW,cAAc,sBAAsB;AAG1F,SAAS,sBAAqC;AAC5C,MAAI;AACF,UAAM,SAAc,aAAQ,UAAQ,QAAQ,0CAA0C,CAAC;AACvF,UAAM,UAAe,UAAK,QAAQ,eAAe;AACjD,QAAO,cAAW,OAAO,EAAG,QAAO;AAAA,EACrC,QAAQ;AAEN,UAAM,WAAgB,aAAQ,QAAQ,IAAI,GAAG,YAAY,mBAAmB,eAAe;AAC3F,QAAO,cAAW,QAAQ,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;AAGA,eAAsB,aAAa,KAA4D;AAC7F,QAAM,UAAU,IAAI,aAAa;AAGjC,MAAO,cAAW,UAAU,GAAG;AAC7B,QAAI;AACF,YAAM,OAAO,KAAK,MAAS,gBAAa,YAAY,OAAO,CAAC;AAC5D,cAAQ,KAAK,IAAI;AACjB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,UAAU,oBAAoB;AACpC,MAAI,SAAS;AACX,QAAI;AACF,YAAM,OAAO,KAAK,MAAS,gBAAa,SAAS,OAAO,CAAC;AACzD,cAAQ,KAAK,IAAI;AACjB,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,IAAI,wDAAwD;AAChE,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-4D537GXE.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
executeEval
|
|
3
|
-
} from "./chunk-QN34TGD3.js";
|
|
4
|
-
|
|
5
|
-
// src/lib/eval-trigger-tester.ts
|
|
6
|
-
var TRIGGER_DETECTOR_PROMPT = `You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.
|
|
7
|
-
|
|
8
|
-
You will receive:
|
|
9
|
-
1. The skill name and description
|
|
10
|
-
2. Key content from the skill (to know what it teaches)
|
|
11
|
-
3. The user's query
|
|
12
|
-
4. The AI's response
|
|
13
|
-
|
|
14
|
-
Determine if the response shows clear signs of the skill being used:
|
|
15
|
-
- Does the response follow patterns/approaches described in the skill?
|
|
16
|
-
- Does it use terminology or structures specific to the skill?
|
|
17
|
-
- Would the response be noticeably different without the skill?
|
|
18
|
-
|
|
19
|
-
Respond with ONLY a valid JSON object:
|
|
20
|
-
|
|
21
|
-
{
|
|
22
|
-
"triggered": true,
|
|
23
|
-
"confidence": 0.85,
|
|
24
|
-
"evidence": "The response follows the X pattern described in the skill..."
|
|
25
|
-
}`;
|
|
26
|
-
async function testTrigger(options) {
|
|
27
|
-
const { query, shouldTrigger, skillName, skillDescription, skillContent, model, timeout = 12e4 } = options;
|
|
28
|
-
const execResult = await executeEval({
|
|
29
|
-
prompt: query,
|
|
30
|
-
targetContent: skillContent,
|
|
31
|
-
timeout,
|
|
32
|
-
model
|
|
33
|
-
});
|
|
34
|
-
if (execResult.error) {
|
|
35
|
-
return {
|
|
36
|
-
query,
|
|
37
|
-
shouldTrigger,
|
|
38
|
-
didTrigger: false,
|
|
39
|
-
correct: !shouldTrigger,
|
|
40
|
-
confidence: 0,
|
|
41
|
-
evidence: `Execution failed: ${execResult.error}`
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
const detectorPrompt = `## Skill
|
|
45
|
-
Name: ${skillName}
|
|
46
|
-
Description: ${skillDescription}
|
|
47
|
-
|
|
48
|
-
## Key Skill Content (first 500 chars)
|
|
49
|
-
${skillContent.slice(0, 500)}
|
|
50
|
-
|
|
51
|
-
## User Query
|
|
52
|
-
${query}
|
|
53
|
-
|
|
54
|
-
## AI Response
|
|
55
|
-
${execResult.output}
|
|
56
|
-
|
|
57
|
-
Did the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`;
|
|
58
|
-
const detectorResult = await executeEval({
|
|
59
|
-
prompt: detectorPrompt,
|
|
60
|
-
targetContent: TRIGGER_DETECTOR_PROMPT,
|
|
61
|
-
timeout: 6e4,
|
|
62
|
-
model
|
|
63
|
-
});
|
|
64
|
-
let didTrigger = false;
|
|
65
|
-
let confidence = 0;
|
|
66
|
-
let evidence = "";
|
|
67
|
-
try {
|
|
68
|
-
let jsonStr = detectorResult.output.trim();
|
|
69
|
-
const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
70
|
-
if (jsonMatch) jsonStr = jsonMatch[1].trim();
|
|
71
|
-
const objMatch = jsonStr.match(/\{[\s\S]*\}/);
|
|
72
|
-
if (objMatch) jsonStr = objMatch[0];
|
|
73
|
-
const parsed = JSON.parse(jsonStr);
|
|
74
|
-
didTrigger = parsed.triggered === true;
|
|
75
|
-
confidence = parsed.confidence ?? 0;
|
|
76
|
-
evidence = parsed.evidence ?? "";
|
|
77
|
-
} catch {
|
|
78
|
-
evidence = `Detector returned unparseable output: ${detectorResult.output.slice(0, 200)}`;
|
|
79
|
-
}
|
|
80
|
-
return {
|
|
81
|
-
query,
|
|
82
|
-
shouldTrigger,
|
|
83
|
-
didTrigger,
|
|
84
|
-
correct: didTrigger === shouldTrigger,
|
|
85
|
-
confidence,
|
|
86
|
-
evidence
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
function computeTriggerScore(results) {
|
|
90
|
-
if (results.length === 0) return 0;
|
|
91
|
-
const correct = results.filter((r) => r.correct).length;
|
|
92
|
-
return correct / results.length;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export {
|
|
96
|
-
testTrigger,
|
|
97
|
-
computeTriggerScore
|
|
98
|
-
};
|
|
99
|
-
//# sourceMappingURL=chunk-4D537GXE.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/eval-trigger-tester.ts"],
|
|
4
|
-
"sourcesContent": ["import { executeEval } from './eval-executor.js';\n\nexport interface TriggerTestResult {\n query: string;\n shouldTrigger: boolean;\n didTrigger: boolean;\n correct: boolean;\n confidence: number;\n evidence: string;\n}\n\nconst TRIGGER_DETECTOR_PROMPT = `You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.\n\nYou will receive:\n1. The skill name and description\n2. Key content from the skill (to know what it teaches)\n3. The user's query\n4. The AI's response\n\nDetermine if the response shows clear signs of the skill being used:\n- Does the response follow patterns/approaches described in the skill?\n- Does it use terminology or structures specific to the skill?\n- Would the response be noticeably different without the skill?\n\nRespond with ONLY a valid JSON object:\n\n{\n \"triggered\": true,\n \"confidence\": 0.85,\n \"evidence\": \"The response follows the X pattern described in the skill...\"\n}`;\n\nexport async function testTrigger(options: {\n query: string;\n shouldTrigger: boolean;\n skillName: string;\n skillDescription: string;\n skillContent: string;\n model?: string;\n timeout?: number;\n}): Promise<TriggerTestResult> {\n const { query, shouldTrigger, skillName, skillDescription, skillContent, model, timeout = 120_000 } = options;\n\n // Run the query with the skill as system prompt\n const execResult = await executeEval({\n prompt: query,\n targetContent: skillContent,\n timeout,\n model,\n });\n\n if (execResult.error) {\n return {\n query,\n shouldTrigger,\n didTrigger: false,\n correct: !shouldTrigger,\n confidence: 0,\n evidence: `Execution failed: ${execResult.error}`,\n };\n }\n\n // Use LLM to detect if the skill influenced the response\n const detectorPrompt = `## Skill\nName: ${skillName}\nDescription: ${skillDescription}\n\n## Key Skill Content (first 500 chars)\n${skillContent.slice(0, 500)}\n\n## User Query\n${query}\n\n## AI Response\n${execResult.output}\n\nDid the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`;\n\n const detectorResult = await executeEval({\n prompt: detectorPrompt,\n targetContent: TRIGGER_DETECTOR_PROMPT,\n timeout: 60_000,\n model,\n });\n\n let didTrigger = false;\n let confidence = 0;\n let evidence = '';\n\n try {\n let jsonStr = detectorResult.output.trim();\n const jsonMatch = jsonStr.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) jsonStr = jsonMatch[1].trim();\n const objMatch = jsonStr.match(/\\{[\\s\\S]*\\}/);\n if (objMatch) jsonStr = objMatch[0];\n\n const parsed = JSON.parse(jsonStr);\n didTrigger = parsed.triggered === true;\n confidence = parsed.confidence ?? 0;\n evidence = parsed.evidence ?? '';\n } catch {\n evidence = `Detector returned unparseable output: ${detectorResult.output.slice(0, 200)}`;\n }\n\n return {\n query,\n shouldTrigger,\n didTrigger,\n correct: didTrigger === shouldTrigger,\n confidence,\n evidence,\n };\n}\n\nexport function computeTriggerScore(results: TriggerTestResult[]): number {\n if (results.length === 0) return 0;\n const correct = results.filter((r) => r.correct).length;\n return correct / results.length;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;AAWA,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBhC,eAAsB,YAAY,SAQH;AAC7B,QAAM,EAAE,OAAO,eAAe,WAAW,kBAAkB,cAAc,OAAO,UAAU,KAAQ,IAAI;AAGtG,QAAM,aAAa,MAAM,YAAY;AAAA,IACnC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,YAAY;AAAA,MACZ,UAAU,qBAAqB,WAAW,KAAK;AAAA,IACjD;AAAA,EACF;AAGA,QAAM,iBAAiB;AAAA,QACjB,SAAS;AAAA,eACF,gBAAgB;AAAA;AAAA;AAAA,EAG7B,aAAa,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAAA,EAG1B,KAAK;AAAA;AAAA;AAAA,EAGL,WAAW,MAAM;AAAA;AAAA;AAIjB,QAAM,iBAAiB,MAAM,YAAY;AAAA,IACvC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,WAAW;AAEf,MAAI;AACF,QAAI,UAAU,eAAe,OAAO,KAAK;AACzC,UAAM,YAAY,QAAQ,MAAM,8BAA8B;AAC9D,QAAI,UAAW,WAAU,UAAU,CAAC,EAAE,KAAK;AAC3C,UAAM,WAAW,QAAQ,MAAM,aAAa;AAC5C,QAAI,SAAU,WAAU,SAAS,CAAC;AAElC,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,iBAAa,OAAO,cAAc;AAClC,iBAAa,OAAO,cAAc;AAClC,eAAW,OAAO,YAAY;AAAA,EAChC,QAAQ;AACN,eAAW,yCAAyC,eAAe,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,EACzF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,eAAe;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,SAAsC;AACxE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,SAAO,UAAU,QAAQ;AAC3B;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-4LYCDS2N.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
probeGatewayIdentity,
|
|
3
|
-
waitForGatewayIdentity
|
|
4
|
-
} from "./chunk-7LVVKQMZ.js";
|
|
5
|
-
import {
|
|
6
|
-
GATEWAY_ENTRY_COMMAND_PATTERN,
|
|
7
|
-
isPidLiveAndMatching
|
|
8
|
-
} from "./chunk-5EDMGK3W.js";
|
|
9
|
-
|
|
10
|
-
// src/lib/gateway-lifecycle.ts
|
|
11
|
-
import { spawn } from "node:child_process";
|
|
12
|
-
import { createConnection } from "node:net";
|
|
13
|
-
import { existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
14
|
-
import { homedir } from "node:os";
|
|
15
|
-
import { dirname, join, resolve } from "node:path";
|
|
16
|
-
import { fileURLToPath } from "node:url";
|
|
17
|
-
var MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
18
|
-
var CONFIG_DIR = join(homedir(), ".config", "rulemetric");
|
|
19
|
-
var GATEWAY_PID_FILE = join(CONFIG_DIR, "gateway.pid");
|
|
20
|
-
var GATEWAY_LOG_FILE = join(CONFIG_DIR, "gateway.log");
|
|
21
|
-
var GATEWAY_PORT = 8787;
|
|
22
|
-
var MITMPROXY_PORT = 8788;
|
|
23
|
-
function isGatewayListening(port = GATEWAY_PORT, timeoutMs = 1500) {
|
|
24
|
-
return new Promise((resolveProbe) => {
|
|
25
|
-
const socket = createConnection({ host: "127.0.0.1", port });
|
|
26
|
-
const finish = (result) => {
|
|
27
|
-
socket.destroy();
|
|
28
|
-
resolveProbe(result);
|
|
29
|
-
};
|
|
30
|
-
socket.setTimeout(timeoutMs);
|
|
31
|
-
socket.once("connect", () => finish(true));
|
|
32
|
-
socket.once("timeout", () => finish(false));
|
|
33
|
-
socket.once("error", () => finish(false));
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
async function waitForGatewayListening(port = GATEWAY_PORT, { timeoutMs = 3e3, intervalMs = 150 } = {}) {
|
|
37
|
-
const deadline = Date.now() + timeoutMs;
|
|
38
|
-
for (; ; ) {
|
|
39
|
-
if (await isGatewayListening(port, Math.min(1500, timeoutMs))) return true;
|
|
40
|
-
if (Date.now() >= deadline) return false;
|
|
41
|
-
await new Promise((resolve2) => setTimeout(resolve2, intervalMs));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function isRulemetricGatewayListening(port = GATEWAY_PORT, timeoutMs = 1500) {
|
|
45
|
-
return probeGatewayIdentity(port, timeoutMs);
|
|
46
|
-
}
|
|
47
|
-
function waitForRulemetricGateway(port = GATEWAY_PORT, opts = {}) {
|
|
48
|
-
return waitForGatewayIdentity(port, opts);
|
|
49
|
-
}
|
|
50
|
-
function isGatewayRunning(pidOpts = {}) {
|
|
51
|
-
const pid = getGatewayPid();
|
|
52
|
-
if (pid === null) return false;
|
|
53
|
-
return isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts);
|
|
54
|
-
}
|
|
55
|
-
function getGatewayPid() {
|
|
56
|
-
if (!existsSync(GATEWAY_PID_FILE)) return null;
|
|
57
|
-
const content = readFileSync(GATEWAY_PID_FILE, "utf-8").trim();
|
|
58
|
-
const pid = parseInt(content, 10);
|
|
59
|
-
return isNaN(pid) ? null : pid;
|
|
60
|
-
}
|
|
61
|
-
function findGatewayEntry() {
|
|
62
|
-
const candidates = [
|
|
63
|
-
resolve(MODULE_DIR, "./gateway-entry.js"),
|
|
64
|
-
// sibling (unbundled)
|
|
65
|
-
resolve(MODULE_DIR, "./lib/gateway-entry.js"),
|
|
66
|
-
// bundled chunk at dist root
|
|
67
|
-
resolve(MODULE_DIR, "../lib/gateway-entry.js"),
|
|
68
|
-
// nested command dir → dist/lib
|
|
69
|
-
resolve(MODULE_DIR, "../../lib/gateway-entry.js")
|
|
70
|
-
];
|
|
71
|
-
for (const p of candidates) {
|
|
72
|
-
if (existsSync(p)) return p;
|
|
73
|
-
}
|
|
74
|
-
throw new Error(
|
|
75
|
-
"Could not find gateway-entry.js. Is the CLI built?\nSearched:\n" + candidates.map((c) => ` ${c}`).join("\n")
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
function spawnGateway(cliVersion) {
|
|
79
|
-
if (isGatewayRunning()) {
|
|
80
|
-
const pid = getGatewayPid();
|
|
81
|
-
if (pid) return pid;
|
|
82
|
-
}
|
|
83
|
-
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
84
|
-
const entryPath = findGatewayEntry();
|
|
85
|
-
const logFd = openSync(GATEWAY_LOG_FILE, "a");
|
|
86
|
-
const child = spawn(process.execPath, [entryPath], {
|
|
87
|
-
detached: true,
|
|
88
|
-
stdio: ["ignore", logFd, logFd],
|
|
89
|
-
// The gateway inherits the spawning CLI's env. RULEMETRIC_CLI_VERSION
|
|
90
|
-
// identifies the CLI version that started this gateway — used to
|
|
91
|
-
// detect drift when a newer CLI starts mitmproxy with a different
|
|
92
|
-
// version. RULEMETRIC_CLI_ENTRY is the path to the oclif entry point
|
|
93
|
-
// (process.argv[1]) so the gateway can re-invoke the CLI for
|
|
94
|
-
// `proxy restart` without needing the binary in PATH. Falls back to
|
|
95
|
-
// "unknown" if the caller didn't pass them.
|
|
96
|
-
env: {
|
|
97
|
-
...process.env,
|
|
98
|
-
RULEMETRIC_CLI_VERSION: cliVersion ?? "unknown",
|
|
99
|
-
RULEMETRIC_CLI_ENTRY: process.argv[1] ?? ""
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
child.unref();
|
|
103
|
-
if (!child.pid) {
|
|
104
|
-
throw new Error("Failed to spawn gateway process");
|
|
105
|
-
}
|
|
106
|
-
writeFileSync(GATEWAY_PID_FILE, String(child.pid));
|
|
107
|
-
return child.pid;
|
|
108
|
-
}
|
|
109
|
-
function stopGateway(pidOpts = {}) {
|
|
110
|
-
const pid = getGatewayPid();
|
|
111
|
-
if (pid === null) return false;
|
|
112
|
-
if (isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts)) {
|
|
113
|
-
try {
|
|
114
|
-
process.kill(pid, "SIGTERM");
|
|
115
|
-
} catch {
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
try {
|
|
119
|
-
unlinkSync(GATEWAY_PID_FILE);
|
|
120
|
-
} catch {
|
|
121
|
-
}
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export {
|
|
126
|
-
GATEWAY_PID_FILE,
|
|
127
|
-
GATEWAY_LOG_FILE,
|
|
128
|
-
GATEWAY_PORT,
|
|
129
|
-
MITMPROXY_PORT,
|
|
130
|
-
isGatewayListening,
|
|
131
|
-
waitForGatewayListening,
|
|
132
|
-
isRulemetricGatewayListening,
|
|
133
|
-
waitForRulemetricGateway,
|
|
134
|
-
isGatewayRunning,
|
|
135
|
-
getGatewayPid,
|
|
136
|
-
spawnGateway,
|
|
137
|
-
stopGateway
|
|
138
|
-
};
|
|
139
|
-
//# sourceMappingURL=chunk-4LYCDS2N.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/gateway-lifecycle.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Gateway process lifecycle helpers \u2014 spawn, stop, check status.\n * Used by hooks install/uninstall, session-start hook, and proxy status.\n */\nimport { spawn } from 'node:child_process';\nimport { createConnection } from 'node:net';\nimport { existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n probeGatewayIdentity,\n waitForGatewayIdentity,\n type GatewayIdentity,\n} from './gateway-identity.js';\nimport {\n isPidLiveAndMatching,\n GATEWAY_ENTRY_COMMAND_PATTERN,\n type PidIdentityOptions,\n} from './pid-identity.js';\n\n// `import.meta.dirname` only exists on Node >= 20.11 \u2014 on Node 18.x/\u226420.10 it is\n// `undefined`, and `resolve(undefined, \u2026)` throws, surfacing as a spurious\n// \"Could not find gateway-entry.js\" on fresh npm installs (the launchd gateway\n// masks it in dev). Derive the dir portably instead. See onboarding field report\n// 2026-07-07 F1.\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nconst CONFIG_DIR = join(homedir(), '.config', 'rulemetric');\nexport const GATEWAY_PID_FILE = join(CONFIG_DIR, 'gateway.pid');\nexport const GATEWAY_LOG_FILE = join(CONFIG_DIR, 'gateway.log');\nexport const GATEWAY_PORT = 8787;\nexport const MITMPROXY_PORT = 8788;\n\n/**\n * TCP liveness probe: does something actually ACCEPT a connection on the port?\n * Distinct from isGatewayRunning() (which only checks the PID is alive) \u2014 a\n * process can be \"running\" per its pidfile while :8787 accepts nothing. This is\n * the check that must gate writing HTTPS_PROXY: never pin Claude Code's proxy\n * at a port with nothing behind it (the fresh-laptop ConnectionRefused footgun).\n */\nexport function isGatewayListening(port: number = GATEWAY_PORT, timeoutMs = 1500): Promise<boolean> {\n return new Promise((resolveProbe) => {\n const socket = createConnection({ host: '127.0.0.1', port });\n const finish = (result: boolean) => {\n socket.destroy();\n resolveProbe(result);\n };\n socket.setTimeout(timeoutMs);\n socket.once('connect', () => finish(true));\n socket.once('timeout', () => finish(false));\n socket.once('error', () => finish(false));\n });\n}\n\n/**\n * Poll isGatewayListening() until it's true or the window elapses. spawnGateway()\n * returns as soon as it writes the PID file \u2014 the detached child hasn't bound\n * :8787 yet (Node bootstrap + module load). A one-shot probe microseconds later\n * fails-closed on every fresh install, so the proxy/deep-capture layer silently\n * never turns on. This tolerates a normal cold-start bind delay.\n */\nexport async function waitForGatewayListening(\n port: number = GATEWAY_PORT,\n { timeoutMs = 3000, intervalMs = 150 }: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n if (await isGatewayListening(port, Math.min(1500, timeoutMs))) return true;\n if (Date.now() >= deadline) return false;\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * Identity-aware liveness probe on :GATEWAY_PORT \u2014 connects, requests the\n * identity marker, and distinguishes ours-live / foreign / dead. This (not\n * the raw TCP probe above) is what HTTPS_PROXY-pinning decisions must use: a\n * foreign process accepting on :8787 passes isGatewayListening() but would\n * brick every HTTPS request Claude Code makes.\n */\nexport function isRulemetricGatewayListening(\n port: number = GATEWAY_PORT,\n timeoutMs = 1500,\n): Promise<GatewayIdentity> {\n return probeGatewayIdentity(port, timeoutMs);\n}\n\n/**\n * Poll the identity probe through a cold-start bind delay. 'dead' retries\n * until the window elapses; 'ours-live' and 'foreign' return immediately\n * (waiting can't change what owns the port).\n */\nexport function waitForRulemetricGateway(\n port: number = GATEWAY_PORT,\n opts: { timeoutMs?: number; intervalMs?: number } = {},\n): Promise<GatewayIdentity> {\n return waitForGatewayIdentity(port, opts);\n}\n\n/**\n * PID-file liveness WITH identity validation. PID files survive reboots, and\n * `kill -0` on a reused PID reports \"alive\" for an unrelated process \u2014 which\n * permanently defeats the session-start self-heal. The recorded PID only\n * counts as \"running\" when its command line is actually gateway-entry.\n */\nexport function isGatewayRunning(pidOpts: PidIdentityOptions = {}): boolean {\n const pid = getGatewayPid();\n if (pid === null) return false;\n return isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts);\n}\n\nexport function getGatewayPid(): number | null {\n if (!existsSync(GATEWAY_PID_FILE)) return null;\n const content = readFileSync(GATEWAY_PID_FILE, 'utf-8').trim();\n const pid = parseInt(content, 10);\n return isNaN(pid) ? null : pid;\n}\n\nfunction findGatewayEntry(): string {\n // Resolve the compiled gateway-entry.js across BOTH layouts:\n // - unbundled (dev/tsx, or tsc output): this module sits in dist/lib, so\n // gateway-entry.js is a sibling (`./gateway-entry.js`).\n // - BUNDLED (published build): esbuild flattens this module into\n // dist/chunk-*.js at the dist ROOT, so MODULE_DIR is dist/ and the entry\n // (kept as a separate build entry) is at dist/lib/gateway-entry.js\n // (`./lib/gateway-entry.js`). Without this candidate the gateway never\n // spawns on a clean npm install \u2014 masked in dev by the launchd gateway\n // short-circuiting before this runs. See onboarding field report F1.\n const candidates = [\n resolve(MODULE_DIR, './gateway-entry.js'), // sibling (unbundled)\n resolve(MODULE_DIR, './lib/gateway-entry.js'), // bundled chunk at dist root\n resolve(MODULE_DIR, '../lib/gateway-entry.js'), // nested command dir \u2192 dist/lib\n resolve(MODULE_DIR, '../../lib/gateway-entry.js'),\n ];\n for (const p of candidates) {\n if (existsSync(p)) return p;\n }\n throw new Error(\n 'Could not find gateway-entry.js. Is the CLI built?\\n' +\n 'Searched:\\n' + candidates.map(c => ` ${c}`).join('\\n'),\n );\n}\n\nexport function spawnGateway(cliVersion?: string): number {\n if (isGatewayRunning()) {\n const pid = getGatewayPid();\n if (pid) return pid;\n }\n\n mkdirSync(CONFIG_DIR, { recursive: true });\n\n const entryPath = findGatewayEntry();\n const logFd = openSync(GATEWAY_LOG_FILE, 'a');\n\n const child = spawn(process.execPath, [entryPath], {\n detached: true,\n stdio: ['ignore', logFd, logFd],\n // The gateway inherits the spawning CLI's env. RULEMETRIC_CLI_VERSION\n // identifies the CLI version that started this gateway \u2014 used to\n // detect drift when a newer CLI starts mitmproxy with a different\n // version. RULEMETRIC_CLI_ENTRY is the path to the oclif entry point\n // (process.argv[1]) so the gateway can re-invoke the CLI for\n // `proxy restart` without needing the binary in PATH. Falls back to\n // \"unknown\" if the caller didn't pass them.\n env: {\n ...process.env,\n RULEMETRIC_CLI_VERSION: cliVersion ?? 'unknown',\n RULEMETRIC_CLI_ENTRY: process.argv[1] ?? '',\n },\n });\n\n child.unref();\n\n if (!child.pid) {\n throw new Error('Failed to spawn gateway process');\n }\n\n writeFileSync(GATEWAY_PID_FILE, String(child.pid));\n return child.pid;\n}\n\nexport function stopGateway(pidOpts: PidIdentityOptions = {}): boolean {\n const pid = getGatewayPid();\n if (pid === null) return false;\n\n // Only signal a PID whose command line is actually gateway-entry \u2014 a\n // reused PID belongs to an unrelated process we must never SIGTERM. Either\n // way the PID file is stale after this and gets removed.\n if (isPidLiveAndMatching(pid, GATEWAY_ENTRY_COMMAND_PATTERN, pidOpts)) {\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n // Process already gone\n }\n }\n\n try { unlinkSync(GATEWAY_PID_FILE); } catch { /* already gone */ }\n return true;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["resolve"]
|
|
7
|
-
}
|
package/dist/chunk-4SCZK7AL.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Panel,
|
|
3
|
-
fit
|
|
4
|
-
} from "./chunk-DQ3KELXD.js";
|
|
5
|
-
import {
|
|
6
|
-
BLUE,
|
|
7
|
-
DIM,
|
|
8
|
-
GREEN,
|
|
9
|
-
ORANGE
|
|
10
|
-
} from "./chunk-QJQS6TUN.js";
|
|
11
|
-
import {
|
|
12
|
-
__require
|
|
13
|
-
} from "./chunk-NSBPE2FW.js";
|
|
14
|
-
|
|
15
|
-
// src/dashboard/panels/insights.tsx
|
|
16
|
-
import { useState, useMemo } from "react";
|
|
17
|
-
import { Box, Text, useInput } from "ink";
|
|
18
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
19
|
-
function extractSuggestions(api) {
|
|
20
|
-
const recs = api.recommendations;
|
|
21
|
-
if (!recs) return [];
|
|
22
|
-
const items = [];
|
|
23
|
-
for (const f of recs.suggestions?.features_to_try ?? []) {
|
|
24
|
-
if (!f.example_code) continue;
|
|
25
|
-
items.push({
|
|
26
|
-
label: f.feature,
|
|
27
|
-
description: f.why_for_you || f.one_liner,
|
|
28
|
-
command: f.example_code
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
for (const u of recs.suggestions?.usage_patterns ?? []) {
|
|
32
|
-
if (!u.copyable_prompt) continue;
|
|
33
|
-
items.push({
|
|
34
|
-
label: u.title,
|
|
35
|
-
description: u.suggestion,
|
|
36
|
-
command: u.copyable_prompt
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
for (const o of recs.on_the_horizon?.opportunities ?? []) {
|
|
40
|
-
if (!o.copyable_prompt) continue;
|
|
41
|
-
items.push({
|
|
42
|
-
label: o.title,
|
|
43
|
-
description: o.whats_possible,
|
|
44
|
-
command: o.copyable_prompt
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
return items;
|
|
48
|
-
}
|
|
49
|
-
function toCliCommand(prompt) {
|
|
50
|
-
const trimmed = prompt.trim();
|
|
51
|
-
if (/^(claude|rulemetric|pnpm|npm|npx|git)\s/.test(trimmed)) {
|
|
52
|
-
return trimmed;
|
|
53
|
-
}
|
|
54
|
-
return `claude -p '${trimmed.replace(/'/g, "'\\''")}'`;
|
|
55
|
-
}
|
|
56
|
-
function copyToClipboard(text) {
|
|
57
|
-
try {
|
|
58
|
-
const { execSync } = __require("node:child_process");
|
|
59
|
-
if (process.platform === "darwin") {
|
|
60
|
-
execSync("pbcopy", { input: text, stdio: ["pipe", "ignore", "ignore"] });
|
|
61
|
-
} else {
|
|
62
|
-
execSync("xclip -selection clipboard", { input: text, stdio: ["pipe", "ignore", "ignore"] });
|
|
63
|
-
}
|
|
64
|
-
return true;
|
|
65
|
-
} catch {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function InsightsPanel({ api, width, focused, onSelect }) {
|
|
70
|
-
const [selectedIdx, setSelectedIdx] = useState(0);
|
|
71
|
-
const [copiedIdx, setCopiedIdx] = useState(null);
|
|
72
|
-
const suggestions = useMemo(() => api ? extractSuggestions(api) : [], [api]);
|
|
73
|
-
const atAGlance = api?.recommendations?.at_a_glance;
|
|
74
|
-
useInput((input, key) => {
|
|
75
|
-
if (!focused || suggestions.length === 0) return;
|
|
76
|
-
if (key.upArrow) {
|
|
77
|
-
setSelectedIdx((i) => Math.max(0, i - 1));
|
|
78
|
-
} else if (key.downArrow) {
|
|
79
|
-
setSelectedIdx((i) => Math.min(suggestions.length - 1, i + 1));
|
|
80
|
-
} else if (key.return) {
|
|
81
|
-
const item = suggestions[selectedIdx];
|
|
82
|
-
if (item) {
|
|
83
|
-
const cmd = toCliCommand(item.command);
|
|
84
|
-
const copied = copyToClipboard(cmd);
|
|
85
|
-
if (copied) {
|
|
86
|
-
setCopiedIdx(selectedIdx);
|
|
87
|
-
setTimeout(() => setCopiedIdx(null), 2e3);
|
|
88
|
-
}
|
|
89
|
-
onSelect?.(cmd);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
if (!api) {
|
|
94
|
-
return /* @__PURE__ */ jsx(Panel, { title: "Insights", color: ORANGE, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "API offline \u2014 no insights" }) });
|
|
95
|
-
}
|
|
96
|
-
if (!atAGlance && suggestions.length === 0) {
|
|
97
|
-
return /* @__PURE__ */ jsx(Panel, { title: "Insights", color: ORANGE, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No recommendations yet. Run: rulemetric insights sync" }) });
|
|
98
|
-
}
|
|
99
|
-
const maxLabel = Math.min(30, Math.max(...suggestions.map((s) => s.label.length), 10));
|
|
100
|
-
const descWidth = Math.max(10, width - maxLabel - 12);
|
|
101
|
-
return /* @__PURE__ */ jsxs(Panel, { title: focused ? "\u25B8 Insights & Suggestions" : "Insights & Suggestions", color: focused ? ORANGE : DIM, width, children: [
|
|
102
|
-
atAGlance && Object.entries(atAGlance).length > 0 && /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginBottom: 1, children: Object.entries(atAGlance).map(([key, value]) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
103
|
-
/* @__PURE__ */ jsx(Text, { color: DIM, bold: true, children: key.replace(/_/g, " ").toUpperCase() }),
|
|
104
|
-
/* @__PURE__ */ jsx(Text, { wrap: "wrap", children: String(value).slice(0, 200) })
|
|
105
|
-
] }, key)) }),
|
|
106
|
-
suggestions.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
107
|
-
/* @__PURE__ */ jsxs(Box, { marginBottom: 0, children: [
|
|
108
|
-
/* @__PURE__ */ jsx(Text, { color: ORANGE, bold: true, children: "Suggestions" }),
|
|
109
|
-
focused && /* @__PURE__ */ jsx(Text, { dimColor: true, children: " \u2191\u2193 navigate \u23CE copy command" })
|
|
110
|
-
] }),
|
|
111
|
-
suggestions.map((s, i) => {
|
|
112
|
-
const isSelected = focused && i === selectedIdx;
|
|
113
|
-
const isCopied = i === copiedIdx;
|
|
114
|
-
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
115
|
-
/* @__PURE__ */ jsx(Text, { color: isSelected ? ORANGE : DIM, children: isSelected ? "\u25B8 " : " " }),
|
|
116
|
-
/* @__PURE__ */ jsx(Text, { color: isSelected ? ORANGE : BLUE, bold: isSelected, children: fit(s.label, maxLabel) }),
|
|
117
|
-
/* @__PURE__ */ jsx(Text, { color: DIM, children: " \u2502 " }),
|
|
118
|
-
/* @__PURE__ */ jsx(Text, { color: isSelected ? void 0 : DIM, wrap: "truncate-end", children: fit(s.description, descWidth) }),
|
|
119
|
-
isCopied && /* @__PURE__ */ jsx(Text, { color: GREEN, children: " \u2713 copied" })
|
|
120
|
-
] }, i);
|
|
121
|
-
})
|
|
122
|
-
] })
|
|
123
|
-
] });
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export {
|
|
127
|
-
InsightsPanel
|
|
128
|
-
};
|
|
129
|
-
//# sourceMappingURL=chunk-4SCZK7AL.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/dashboard/panels/insights.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useState, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { ORANGE, DIM, GREEN, BLUE } from '../types.js';\nimport type { ApiInsights, Suggestion } from '../types.js';\nimport { Panel, fit } from './shared.js';\n\n/** Extract all actionable suggestions from recommendations into a flat list. */\nfunction extractSuggestions(api: ApiInsights): Suggestion[] {\n const recs = api.recommendations;\n if (!recs) return [];\n const items: Suggestion[] = [];\n\n // Features to try\n for (const f of recs.suggestions?.features_to_try ?? []) {\n if (!f.example_code) continue;\n items.push({\n label: f.feature,\n description: f.why_for_you || f.one_liner,\n command: f.example_code,\n });\n }\n\n // Usage patterns\n for (const u of recs.suggestions?.usage_patterns ?? []) {\n if (!u.copyable_prompt) continue;\n items.push({\n label: u.title,\n description: u.suggestion,\n command: u.copyable_prompt,\n });\n }\n\n // On the horizon\n for (const o of recs.on_the_horizon?.opportunities ?? []) {\n if (!o.copyable_prompt) continue;\n items.push({\n label: o.title,\n description: o.whats_possible,\n command: o.copyable_prompt,\n });\n }\n\n return items;\n}\n\n/** Format a prompt as a CLI command if it isn't one already. */\nfunction toCliCommand(prompt: string): string {\n const trimmed = prompt.trim();\n if (/^(claude|rulemetric|pnpm|npm|npx|git)\\s/.test(trimmed)) {\n return trimmed;\n }\n return `claude -p '${trimmed.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/** Copy text to system clipboard (best-effort). */\nfunction copyToClipboard(text: string): boolean {\n try {\n const { execSync } = require('node:child_process');\n if (process.platform === 'darwin') {\n execSync('pbcopy', { input: text, stdio: ['pipe', 'ignore', 'ignore'] });\n } else {\n execSync('xclip -selection clipboard', { input: text, stdio: ['pipe', 'ignore', 'ignore'] });\n }\n return true;\n } catch {\n return false;\n }\n}\n\nexport function InsightsPanel({ api, width, focused, onSelect }: {\n api: ApiInsights | null;\n width: number;\n focused?: boolean;\n onSelect?: (command: string) => void;\n}) {\n const [selectedIdx, setSelectedIdx] = useState(0);\n const [copiedIdx, setCopiedIdx] = useState<number | null>(null);\n\n const suggestions = useMemo(() => api ? extractSuggestions(api) : [], [api]);\n\n const atAGlance = api?.recommendations?.at_a_glance as Record<string, string> | undefined;\n\n useInput((input, key) => {\n if (!focused || suggestions.length === 0) return;\n\n if (key.upArrow) {\n setSelectedIdx(i => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelectedIdx(i => Math.min(suggestions.length - 1, i + 1));\n } else if (key.return) {\n const item = suggestions[selectedIdx];\n if (item) {\n const cmd = toCliCommand(item.command);\n const copied = copyToClipboard(cmd);\n if (copied) {\n setCopiedIdx(selectedIdx);\n setTimeout(() => setCopiedIdx(null), 2000);\n }\n onSelect?.(cmd);\n }\n }\n });\n\n if (!api) {\n return (\n <Panel title=\"Insights\" color={ORANGE} width={width}>\n <Text dimColor>API offline \u2014 no insights</Text>\n </Panel>\n );\n }\n\n if (!atAGlance && suggestions.length === 0) {\n return (\n <Panel title=\"Insights\" color={ORANGE} width={width}>\n <Text dimColor>No recommendations yet. Run: rulemetric insights sync</Text>\n </Panel>\n );\n }\n\n const maxLabel = Math.min(30, Math.max(...suggestions.map(s => s.label.length), 10));\n const descWidth = Math.max(10, width - maxLabel - 12);\n\n return (\n <Panel title={focused ? '\u25B8 Insights & Suggestions' : 'Insights & Suggestions'} color={focused ? ORANGE : DIM} width={width}>\n {/* At a glance summary */}\n {atAGlance && Object.entries(atAGlance).length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {Object.entries(atAGlance).map(([key, value]) => (\n <Box key={key} flexDirection=\"column\">\n <Text color={DIM} bold>{key.replace(/_/g, ' ').toUpperCase()}</Text>\n <Text wrap=\"wrap\">{String(value).slice(0, 200)}</Text>\n </Box>\n ))}\n </Box>\n )}\n\n {/* Selectable suggestions */}\n {suggestions.length > 0 && (\n <Box flexDirection=\"column\">\n <Box marginBottom={0}>\n <Text color={ORANGE} bold>Suggestions</Text>\n {focused && <Text dimColor> \u2191\u2193 navigate \u23CE copy command</Text>}\n </Box>\n {suggestions.map((s, i) => {\n const isSelected = focused && i === selectedIdx;\n const isCopied = i === copiedIdx;\n return (\n <Box key={i}>\n <Text color={isSelected ? ORANGE : DIM}>{isSelected ? '\u25B8 ' : ' '}</Text>\n <Text color={isSelected ? ORANGE : BLUE} bold={isSelected}>\n {fit(s.label, maxLabel)}\n </Text>\n <Text color={DIM}> \u2502 </Text>\n <Text color={isSelected ? undefined : DIM} wrap=\"truncate-end\">\n {fit(s.description, descWidth)}\n </Text>\n {isCopied && <Text color={GREEN}> \u2713 copied</Text>}\n </Box>\n );\n })}\n </Box>\n )}\n </Panel>\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|