@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-XUV6DDBF.js
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ClaudeCodeAdapter,
|
|
3
|
-
discoverAllSessions
|
|
4
|
-
} from "./chunk-F5N6CLJJ.js";
|
|
5
|
-
import {
|
|
6
|
-
DEFAULT_API_URL
|
|
7
|
-
} from "./chunk-ZUJBM6HE.js";
|
|
8
|
-
|
|
9
|
-
// src/dashboard/data.ts
|
|
10
|
-
import * as fs from "node:fs";
|
|
11
|
-
import * as path from "node:path";
|
|
12
|
-
import * as os from "node:os";
|
|
13
|
-
function ensureEnv() {
|
|
14
|
-
if (process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN) return;
|
|
15
|
-
const globalEnv = path.join(os.homedir(), ".config", "rulemetric", "env");
|
|
16
|
-
if (loadEnvFile(globalEnv)) return;
|
|
17
|
-
loadEnvFile(path.join(process.cwd(), ".env.local"));
|
|
18
|
-
}
|
|
19
|
-
function loadEnvFile(filePath) {
|
|
20
|
-
try {
|
|
21
|
-
const content = fs.readFileSync(filePath, "utf-8");
|
|
22
|
-
for (const line of content.split("\n")) {
|
|
23
|
-
const trimmed = line.trim();
|
|
24
|
-
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
25
|
-
const eqIdx = trimmed.indexOf("=");
|
|
26
|
-
if (eqIdx < 0) continue;
|
|
27
|
-
const key = trimmed.slice(0, eqIdx).trim();
|
|
28
|
-
const value = trimmed.slice(eqIdx + 1).trim();
|
|
29
|
-
if (!process.env[key]) {
|
|
30
|
-
process.env[key] = value;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return !!(process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN);
|
|
34
|
-
} catch {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
ensureEnv();
|
|
39
|
-
async function loadLocalStats(providerFilter) {
|
|
40
|
-
const stats = {
|
|
41
|
-
totalSessions: 0,
|
|
42
|
-
totalCalls: 0,
|
|
43
|
-
totalInputTokens: 0,
|
|
44
|
-
totalOutputTokens: 0,
|
|
45
|
-
totalCacheReadTokens: 0,
|
|
46
|
-
totalCacheWriteTokens: 0,
|
|
47
|
-
totalCostUSD: 0,
|
|
48
|
-
providers: {}
|
|
49
|
-
};
|
|
50
|
-
const sources = await discoverAllSessions(providerFilter);
|
|
51
|
-
stats.providers = {};
|
|
52
|
-
for (const s of sources) {
|
|
53
|
-
stats.providers[s.provider] = (stats.providers[s.provider] || 0) + 1;
|
|
54
|
-
}
|
|
55
|
-
const adapter = new ClaudeCodeAdapter();
|
|
56
|
-
const claudeSources = sources.filter((s) => s.provider === "claude");
|
|
57
|
-
for (const source of claudeSources) {
|
|
58
|
-
try {
|
|
59
|
-
const files = fs.readdirSync(source.path).filter((f) => f.endsWith(".jsonl"));
|
|
60
|
-
stats.totalSessions += files.length;
|
|
61
|
-
for (const file of files) {
|
|
62
|
-
const content = fs.readFileSync(path.join(source.path, file), "utf-8");
|
|
63
|
-
const parsed = adapter.parse(content);
|
|
64
|
-
for (const event of parsed.events) {
|
|
65
|
-
if (event.tokenUsage) {
|
|
66
|
-
stats.totalCalls++;
|
|
67
|
-
stats.totalInputTokens += event.tokenUsage.input;
|
|
68
|
-
stats.totalOutputTokens += event.tokenUsage.output;
|
|
69
|
-
stats.totalCacheReadTokens += event.tokenUsage.cacheRead ?? 0;
|
|
70
|
-
stats.totalCacheWriteTokens += event.tokenUsage.cacheWrite ?? 0;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
} catch {
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const inputCostPerM = 15;
|
|
78
|
-
const outputCostPerM = 75;
|
|
79
|
-
stats.totalCostUSD = Math.round((stats.totalInputTokens / 1e6 * inputCostPerM + stats.totalOutputTokens / 1e6 * outputCostPerM + stats.totalCacheReadTokens / 1e6 * (inputCostPerM * 0.1) + stats.totalCacheWriteTokens / 1e6 * (inputCostPerM * 1.25)) * 100) / 100;
|
|
80
|
-
return stats;
|
|
81
|
-
}
|
|
82
|
-
async function loadApiInsights(projectPath) {
|
|
83
|
-
const apiUrl = process.env.RULEMETRIC_API_URL ?? DEFAULT_API_URL;
|
|
84
|
-
const apiKey = process.env.RULEMETRIC_API_KEY;
|
|
85
|
-
const accessToken = process.env.RULEMETRIC_ACCESS_TOKEN;
|
|
86
|
-
const token = apiKey ?? accessToken;
|
|
87
|
-
if (!token) return null;
|
|
88
|
-
const params = new URLSearchParams();
|
|
89
|
-
if (projectPath) params.set("projectPath", projectPath);
|
|
90
|
-
try {
|
|
91
|
-
const resp = await fetch(`${apiUrl}/api/insights/compute?${params}`, {
|
|
92
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
93
|
-
signal: AbortSignal.timeout(5e3)
|
|
94
|
-
});
|
|
95
|
-
if (!resp.ok) return null;
|
|
96
|
-
return await resp.json();
|
|
97
|
-
} catch {
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
async function loadLinkedInstructions(projectPath) {
|
|
102
|
-
const apiUrl = process.env.RULEMETRIC_API_URL ?? DEFAULT_API_URL;
|
|
103
|
-
const token = process.env.RULEMETRIC_API_KEY ?? process.env.RULEMETRIC_ACCESS_TOKEN;
|
|
104
|
-
if (!token) return null;
|
|
105
|
-
const params = new URLSearchParams();
|
|
106
|
-
if (projectPath) params.set("projectPath", projectPath);
|
|
107
|
-
try {
|
|
108
|
-
const resp = await fetch(`${apiUrl}/api/insights/linked-instructions?${params}`, {
|
|
109
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
110
|
-
signal: AbortSignal.timeout(5e3)
|
|
111
|
-
});
|
|
112
|
-
if (!resp.ok) return null;
|
|
113
|
-
return await resp.json();
|
|
114
|
-
} catch {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export {
|
|
120
|
-
loadLocalStats,
|
|
121
|
-
loadApiInsights,
|
|
122
|
-
loadLinkedInstructions
|
|
123
|
-
};
|
|
124
|
-
//# sourceMappingURL=chunk-XUV6DDBF.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/dashboard/data.ts"],
|
|
4
|
-
"sourcesContent": ["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { discoverAllSessions, ClaudeCodeAdapter } from '@rulemetric/session';\nimport { DEFAULT_API_URL } from '../lib/api-client.js';\nimport type { LocalStats, ApiInsights } from './types.js';\n\n/** Load auth config from env vars \u2192 ~/.config/rulemetric/env \u2192 .env.local */\nfunction ensureEnv(): void {\n if (process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN) return;\n\n // Try ~/.config/rulemetric/env\n const globalEnv = path.join(os.homedir(), '.config', 'rulemetric', 'env');\n if (loadEnvFile(globalEnv)) return;\n\n // Try .env.local in cwd\n loadEnvFile(path.join(process.cwd(), '.env.local'));\n}\n\nfunction loadEnvFile(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx < 0) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim();\n if (!process.env[key]) {\n process.env[key] = value;\n }\n }\n return !!(process.env.RULEMETRIC_API_KEY || process.env.RULEMETRIC_ACCESS_TOKEN);\n } catch {\n return false;\n }\n}\n\n// Load on import\nensureEnv();\n\n/** Read local JSONL files and compute basic stats. */\nexport async function loadLocalStats(providerFilter?: string): Promise<LocalStats> {\n const stats: LocalStats = {\n totalSessions: 0,\n totalCalls: 0,\n totalInputTokens: 0,\n totalOutputTokens: 0,\n totalCacheReadTokens: 0,\n totalCacheWriteTokens: 0,\n totalCostUSD: 0,\n providers: {},\n };\n\n const sources = await discoverAllSessions(providerFilter);\n stats.providers = {};\n for (const s of sources) {\n stats.providers[s.provider] = (stats.providers[s.provider] || 0) + 1;\n }\n\n // Parse Claude Code sessions from local JSONL files\n const adapter = new ClaudeCodeAdapter();\n const claudeSources = sources.filter(s => s.provider === 'claude');\n\n for (const source of claudeSources) {\n try {\n const files = fs.readdirSync(source.path).filter(f => f.endsWith('.jsonl'));\n stats.totalSessions += files.length;\n\n for (const file of files) {\n const content = fs.readFileSync(path.join(source.path, file), 'utf-8');\n const parsed = adapter.parse(content);\n\n for (const event of parsed.events) {\n if (event.tokenUsage) {\n stats.totalCalls++;\n stats.totalInputTokens += event.tokenUsage.input;\n stats.totalOutputTokens += event.tokenUsage.output;\n stats.totalCacheReadTokens += event.tokenUsage.cacheRead ?? 0;\n stats.totalCacheWriteTokens += event.tokenUsage.cacheWrite ?? 0;\n }\n }\n }\n } catch {\n // Skip unreadable directories\n }\n }\n\n // Estimate cost (Opus pricing as default)\n const inputCostPerM = 15;\n const outputCostPerM = 75;\n stats.totalCostUSD = Math.round((\n (stats.totalInputTokens / 1_000_000) * inputCostPerM +\n (stats.totalOutputTokens / 1_000_000) * outputCostPerM +\n (stats.totalCacheReadTokens / 1_000_000) * (inputCostPerM * 0.1) +\n (stats.totalCacheWriteTokens / 1_000_000) * (inputCostPerM * 1.25)\n ) * 100) / 100;\n\n return stats;\n}\n\n/** Fetch enriched insights from the API. Returns null if API is unreachable. */\nexport async function loadApiInsights(projectPath?: string): Promise<ApiInsights | null> {\n const apiUrl = process.env.RULEMETRIC_API_URL ?? DEFAULT_API_URL;\n const apiKey = process.env.RULEMETRIC_API_KEY;\n const accessToken = process.env.RULEMETRIC_ACCESS_TOKEN;\n const token = apiKey ?? accessToken;\n if (!token) return null;\n\n const params = new URLSearchParams();\n if (projectPath) params.set('projectPath', projectPath);\n\n try {\n const resp = await fetch(`${apiUrl}/api/insights/compute?${params}`, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!resp.ok) return null;\n return await resp.json() as ApiInsights;\n } catch {\n return null;\n }\n}\n\n/** Fetch linked instructions from the API. */\nexport async function loadLinkedInstructions(projectPath?: string): Promise<Array<{ name: string; linkedSessions: number }> | null> {\n const apiUrl = process.env.RULEMETRIC_API_URL ?? DEFAULT_API_URL;\n const token = process.env.RULEMETRIC_API_KEY ?? process.env.RULEMETRIC_ACCESS_TOKEN;\n if (!token) return null;\n\n const params = new URLSearchParams();\n if (projectPath) params.set('projectPath', projectPath);\n\n try {\n const resp = await fetch(`${apiUrl}/api/insights/linked-instructions?${params}`, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(5000),\n });\n if (!resp.ok) return null;\n return await resp.json() as Array<{ name: string; linkedSessions: number }>;\n } catch {\n return null;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAMpB,SAAS,YAAkB;AACzB,MAAI,QAAQ,IAAI,sBAAsB,QAAQ,IAAI,wBAAyB;AAG3E,QAAM,YAAiB,UAAQ,WAAQ,GAAG,WAAW,cAAc,KAAK;AACxE,MAAI,YAAY,SAAS,EAAG;AAG5B,cAAiB,UAAK,QAAQ,IAAI,GAAG,YAAY,CAAC;AACpD;AAEA,SAAS,YAAY,UAA2B;AAC9C,MAAI;AACF,UAAM,UAAa,gBAAa,UAAU,OAAO;AACjD,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,UAAI,QAAQ,EAAG;AACf,YAAM,MAAM,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK;AACzC,YAAM,QAAQ,QAAQ,MAAM,QAAQ,CAAC,EAAE,KAAK;AAC5C,UAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACrB,gBAAQ,IAAI,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AACA,WAAO,CAAC,EAAE,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,UAAU;AAGV,eAAsB,eAAe,gBAA8C;AACjF,QAAM,QAAoB;AAAA,IACxB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,uBAAuB;AAAA,IACvB,cAAc;AAAA,IACd,WAAW,CAAC;AAAA,EACd;AAEA,QAAM,UAAU,MAAM,oBAAoB,cAAc;AACxD,QAAM,YAAY,CAAC;AACnB,aAAW,KAAK,SAAS;AACvB,UAAM,UAAU,EAAE,QAAQ,KAAK,MAAM,UAAU,EAAE,QAAQ,KAAK,KAAK;AAAA,EACrE;AAGA,QAAM,UAAU,IAAI,kBAAkB;AACtC,QAAM,gBAAgB,QAAQ,OAAO,OAAK,EAAE,aAAa,QAAQ;AAEjE,aAAW,UAAU,eAAe;AAClC,QAAI;AACF,YAAM,QAAW,eAAY,OAAO,IAAI,EAAE,OAAO,OAAK,EAAE,SAAS,QAAQ,CAAC;AAC1E,YAAM,iBAAiB,MAAM;AAE7B,iBAAW,QAAQ,OAAO;AACxB,cAAM,UAAa,gBAAkB,UAAK,OAAO,MAAM,IAAI,GAAG,OAAO;AACrE,cAAM,SAAS,QAAQ,MAAM,OAAO;AAEpC,mBAAW,SAAS,OAAO,QAAQ;AACjC,cAAI,MAAM,YAAY;AACpB,kBAAM;AACN,kBAAM,oBAAoB,MAAM,WAAW;AAC3C,kBAAM,qBAAqB,MAAM,WAAW;AAC5C,kBAAM,wBAAwB,MAAM,WAAW,aAAa;AAC5D,kBAAM,yBAAyB,MAAM,WAAW,cAAc;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,QAAM,eAAe,KAAK,OACvB,MAAM,mBAAmB,MAAa,gBACtC,MAAM,oBAAoB,MAAa,iBACvC,MAAM,uBAAuB,OAAc,gBAAgB,OAC3D,MAAM,wBAAwB,OAAc,gBAAgB,SAC3D,GAAG,IAAI;AAEX,SAAO;AACT;AAGA,eAAsB,gBAAgB,aAAmD;AACvF,QAAM,SAAS,QAAQ,IAAI,sBAAsB;AACjD,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,QAAQ,UAAU;AACxB,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,YAAa,QAAO,IAAI,eAAe,WAAW;AAEtD,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,GAAG,MAAM,yBAAyB,MAAM,IAAI;AAAA,MACnE,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,MAC5C,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,QAAI,CAAC,KAAK,GAAI,QAAO;AACrB,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,uBAAuB,aAAuF;AAClI,QAAM,SAAS,QAAQ,IAAI,sBAAsB;AACjD,QAAM,QAAQ,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AAC5D,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAS,IAAI,gBAAgB;AACnC,MAAI,YAAa,QAAO,IAAI,eAAe,WAAW;AAEtD,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,GAAG,MAAM,qCAAqC,MAAM,IAAI;AAAA,MAC/E,SAAS,EAAE,eAAe,UAAU,KAAK,GAAG;AAAA,MAC5C,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,QAAI,CAAC,KAAK,GAAI,QAAO;AACrB,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/insights-prompts.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Recommendation prompts matching Claude Code's /insights structure.\n * Each prompt is sent to `claude -p` with the aggregated stats data.\n */\n\nexport interface PromptSpec {\n name: string;\n prompt: string;\n maxTokens: number;\n}\n\nexport const RECOMMENDATION_PROMPTS: PromptSpec[] = [\n {\n name: 'project_areas',\n prompt: `Analyze this Claude Code usage data and identify project areas.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"areas\": [\n {\"name\": \"Area name\", \"session_count\": N, \"description\": \"2-3 sentences about what was worked on and how Claude Code was used.\"}\n ]\n}\nInclude 4-5 areas. Skip internal CC operations.`,\n maxTokens: 8192,\n },\n {\n name: 'interaction_style',\n prompt: `Analyze this Claude Code usage data and describe the user's interaction style.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"narrative\": \"2-3 paragraphs analyzing HOW the user interacts with Claude Code. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let Claude run? Include specific examples. Use **bold** for key insights.\",\n \"key_pattern\": \"One sentence summary of most distinctive interaction style\"\n}`,\n maxTokens: 8192,\n },\n {\n name: 'what_works',\n prompt: `Analyze this Claude Code usage data and identify what's working well for this user. Use second person (\"you\").\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"intro\": \"1 sentence of context\",\n \"impressive_workflows\": [\n {\"title\": \"Short title (3-6 words)\", \"description\": \"2-3 sentences describing the impressive workflow or approach. Use 'you' not 'the user'.\"}\n ]\n}\nInclude 3 impressive workflows.`,\n maxTokens: 8192,\n },\n {\n name: 'friction_analysis',\n prompt: `Analyze this Claude Code usage data and identify friction points for this user. Use second person (\"you\").\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"intro\": \"1 sentence summarizing friction patterns\",\n \"categories\": [\n {\"category\": \"Concrete category name\", \"description\": \"1-2 sentences explaining this category and what could be done differently. Use 'you' not 'the user'.\", \"examples\": [\"Specific example with consequence\", \"Another example\"]}\n ]\n}\nInclude 3 friction categories with 2 examples each.`,\n maxTokens: 8192,\n },\n {\n name: 'suggestions',\n prompt: `Analyze this Claude Code usage data and suggest improvements.\n## CC FEATURES REFERENCE (pick from these for features_to_try):\n1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.\n - How to use: Run \\`claude mcp add <server-name> -- <command>\\`\n2. **Custom Skills**: Reusable prompts you define as markdown files that run with a single /command.\n - How to use: Create \\`.claude/skills/commit/SKILL.md\\` with instructions. Then type \\`/commit\\` to run it.\n3. **Hooks**: Shell commands that auto-run at specific lifecycle events.\n - How to use: Add to \\`.claude/settings.json\\` under \"hooks\" key.\n4. **Headless Mode**: Run Claude non-interactively from scripts and CI/CD.\n - How to use: \\`claude -p \"fix lint errors\" --allowedTools \"Edit,Read,Bash\"\\`\n5. **Task Agents**: Claude spawns focused sub-agents for complex exploration or parallel work.\n - How to use: Claude auto-invokes when helpful, or ask \"use an agent to explore X\"\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"claude_md_additions\": [\n {\"addition\": \"A specific line or block to add to CLAUDE.md\", \"why\": \"1 sentence explaining why\", \"prompt_scaffold\": \"Instructions for where to add this\"}\n ],\n \"features_to_try\": [\n {\"feature\": \"Feature name from above\", \"one_liner\": \"What it does\", \"why_for_you\": \"Why this would help YOU\", \"example_code\": \"Actual command or config to copy\"}\n ],\n \"usage_patterns\": [\n {\"title\": \"Short title\", \"suggestion\": \"1-2 sentence summary\", \"detail\": \"3-4 sentences explaining how this applies\", \"copyable_prompt\": \"A specific prompt to copy and try\"}\n ]\n}\nInclude 2-3 items for each category.`,\n maxTokens: 8192,\n },\n {\n name: 'on_the_horizon',\n prompt: `Analyze this Claude Code usage data and identify future opportunities.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"intro\": \"1 sentence about evolving AI-assisted development\",\n \"opportunities\": [\n {\"title\": \"Short title (4-8 words)\", \"whats_possible\": \"2-3 ambitious sentences about autonomous workflows\", \"how_to_try\": \"1-2 sentences mentioning relevant tooling\", \"copyable_prompt\": \"Detailed prompt to try\"}\n ]\n}\nInclude 3 opportunities. Think BIG - autonomous workflows, parallel agents, iterating against tests.`,\n maxTokens: 8192,\n },\n {\n name: 'fun_ending',\n prompt: `Analyze this Claude Code usage data and find a memorable moment.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"headline\": \"A memorable QUALITATIVE moment from the transcripts - not a statistic. Something human, funny, or surprising.\",\n \"detail\": \"Brief context about when/where this happened\"\n}\nFind something genuinely interesting or amusing from the session summaries.`,\n maxTokens: 8192,\n },\n];\n\nexport const AT_A_GLANCE_PROMPT = `You're writing an \"At a Glance\" summary for a Claude Code usage insights report.\nUse this 4-part structure:\n1. **What's working** - What is the user's unique style and what impactful things have they done? Don't be fluffy.\n2. **What's hindering you** - Split into (a) Claude's fault and (b) user-side friction. Be honest but constructive.\n3. **Quick wins to try** - Specific Claude Code features they could try, or a compelling workflow technique.\n4. **Ambitious workflows for better models** - As models improve, what workflows should they prepare for?\nKeep each section to 2-3 sentences. Use a coaching tone.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"whats_working\": \"(refer to instructions above)\",\n \"whats_hindering\": \"(refer to instructions above)\",\n \"quick_wins\": \"(refer to instructions above)\",\n \"ambitious_workflows\": \"(refer to instructions above)\"\n}`;\n\nexport const FACET_GENERATION_PROMPT = `Analyze this coding session and produce a structured analysis.\nThe session is from a non-Claude-Code tool, so analyze the conversation and tool usage patterns.\n\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"underlying_goal\": \"1-2 sentence description of what the user was trying to accomplish\",\n \"goal_categories\": {\"category\": count},\n \"outcome\": \"achieved|mostly_achieved|partially_achieved|not_achieved|abandoned\",\n \"session_type\": \"quick_task|iterative_refinement|exploration|debugging|greenfield\",\n \"friction_counts\": {\"wrong_approach\": 0, \"tool_failure\": 0, \"excessive_changes\": 0, \"misunderstanding\": 0},\n \"friction_detail\": \"Brief description of any friction encountered, or empty string\",\n \"primary_success\": \"Brief description of main achievement, or empty string\",\n \"brief_summary\": \"2-3 sentence summary of the session\"\n}\n\nGoal categories to use: debugging, feature_development, refactoring, testing, documentation, investigation, exploration, code_review, deployment, configuration, end_to_end_testing, logging_documentation, ui_testing.\n\nOutcome guide:\n- achieved: Task completed successfully\n- mostly_achieved: Main goal done but minor items remain\n- partially_achieved: Some progress but significant work left\n- not_achieved: Attempted but failed\n- abandoned: User gave up or switched tasks`;\n"],
|
|
5
|
-
"mappings": ";AAWO,IAAM,yBAAuC;AAAA,EAClD;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;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,IAyBR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOR,WAAW;AAAA,EACb;AACF;AAEO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe3B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-Y3WD5CSW.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ApiError,
|
|
3
|
-
apiPost
|
|
4
|
-
} from "./chunk-ZUJBM6HE.js";
|
|
5
|
-
|
|
6
|
-
// src/lib/research-client.ts
|
|
7
|
-
function serializeDate(v) {
|
|
8
|
-
if (v == null) return v ?? null;
|
|
9
|
-
return v instanceof Date ? v.toISOString() : v;
|
|
10
|
-
}
|
|
11
|
-
async function postObservation(obs) {
|
|
12
|
-
const body = {
|
|
13
|
-
provider: obs.provider,
|
|
14
|
-
plan: obs.plan,
|
|
15
|
-
limitType: obs.limitType,
|
|
16
|
-
value: obs.value,
|
|
17
|
-
unit: obs.unit,
|
|
18
|
-
comparator: obs.comparator,
|
|
19
|
-
resetsAt: serializeDate(obs.resetsAt),
|
|
20
|
-
sourceType: obs.sourceType,
|
|
21
|
-
sourceUrl: obs.sourceUrl,
|
|
22
|
-
sourceEvidence: obs.sourceEvidence,
|
|
23
|
-
confidence: obs.confidence,
|
|
24
|
-
observedAt: serializeDate(obs.observedAt)
|
|
25
|
-
};
|
|
26
|
-
return apiPost("/api/internal/research/observe", body);
|
|
27
|
-
}
|
|
28
|
-
async function postObservations(observations) {
|
|
29
|
-
let posted = 0;
|
|
30
|
-
let failed = 0;
|
|
31
|
-
const errors = [];
|
|
32
|
-
for (const obs of observations) {
|
|
33
|
-
try {
|
|
34
|
-
await postObservation(obs);
|
|
35
|
-
posted++;
|
|
36
|
-
} catch (err) {
|
|
37
|
-
failed++;
|
|
38
|
-
const msg = err instanceof ApiError ? `HTTP ${err.statusCode}: ${err.message}` : String(err);
|
|
39
|
-
if (errors.length < 5) errors.push(msg);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return { posted, failed, errors };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export {
|
|
46
|
-
postObservation,
|
|
47
|
-
postObservations
|
|
48
|
-
};
|
|
49
|
-
//# sourceMappingURL=chunk-Y3WD5CSW.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/research-client.ts"],
|
|
4
|
-
"sourcesContent": ["// Thin wrapper around apiPost for the research observation endpoint. Keeps\n// the body schema (camelCase, Date|string for resetsAt) co-located with the\n// transcript watcher so changes don't drift apart.\n\nimport { apiPost, ApiError } from './api-client.js';\nimport type { ParsedObservation } from './transcript-rate-limit-watcher.js';\n\ninterface ObserveResponse {\n id: string;\n observedAt: string;\n}\n\nfunction serializeDate(v: Date | string | null | undefined): string | null | undefined {\n if (v == null) return v ?? null;\n return v instanceof Date ? v.toISOString() : v;\n}\n\nexport async function postObservation(obs: ParsedObservation): Promise<ObserveResponse> {\n const body: Record<string, unknown> = {\n provider: obs.provider,\n plan: obs.plan,\n limitType: obs.limitType,\n value: obs.value,\n unit: obs.unit,\n comparator: obs.comparator,\n resetsAt: serializeDate(obs.resetsAt),\n sourceType: obs.sourceType,\n sourceUrl: obs.sourceUrl,\n sourceEvidence: obs.sourceEvidence,\n confidence: obs.confidence,\n observedAt: serializeDate(obs.observedAt),\n };\n return apiPost<ObserveResponse>('/api/internal/research/observe', body);\n}\n\n/**\n * POST a batch best-effort. Returns counts. Individual failures are swallowed\n * so a 429 on one observation doesn't lose the rest.\n */\nexport async function postObservations(\n observations: ParsedObservation[],\n): Promise<{ posted: number; failed: number; errors: string[] }> {\n let posted = 0;\n let failed = 0;\n const errors: string[] = [];\n for (const obs of observations) {\n try {\n await postObservation(obs);\n posted++;\n } catch (err) {\n failed++;\n const msg = err instanceof ApiError ? `HTTP ${err.statusCode}: ${err.message}` : String(err);\n if (errors.length < 5) errors.push(msg);\n }\n }\n return { posted, failed, errors };\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;AAYA,SAAS,cAAc,GAAgE;AACrF,MAAI,KAAK,KAAM,QAAO,KAAK;AAC3B,SAAO,aAAa,OAAO,EAAE,YAAY,IAAI;AAC/C;AAEA,eAAsB,gBAAgB,KAAkD;AACtF,QAAM,OAAgC;AAAA,IACpC,UAAU,IAAI;AAAA,IACd,MAAM,IAAI;AAAA,IACV,WAAW,IAAI;AAAA,IACf,OAAO,IAAI;AAAA,IACX,MAAM,IAAI;AAAA,IACV,YAAY,IAAI;AAAA,IAChB,UAAU,cAAc,IAAI,QAAQ;AAAA,IACpC,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,gBAAgB,IAAI;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,YAAY,cAAc,IAAI,UAAU;AAAA,EAC1C;AACA,SAAO,QAAyB,kCAAkC,IAAI;AACxE;AAMA,eAAsB,iBACpB,cAC+D;AAC/D,MAAI,SAAS;AACb,MAAI,SAAS;AACb,QAAM,SAAmB,CAAC;AAC1B,aAAW,OAAO,cAAc;AAC9B,QAAI;AACF,YAAM,gBAAgB,GAAG;AACzB;AAAA,IACF,SAAS,KAAK;AACZ;AACA,YAAM,MAAM,eAAe,WAAW,QAAQ,IAAI,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,GAAG;AAC3F,UAAI,OAAO,SAAS,EAAG,QAAO,KAAK,GAAG;AAAA,IACxC;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,QAAQ,OAAO;AAClC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-Y4BJXXYV.js
DELETED
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
worktreePathFor
|
|
3
|
-
} from "./chunk-F5N6CLJJ.js";
|
|
4
|
-
import {
|
|
5
|
-
tmuxSpawnEnv
|
|
6
|
-
} from "./chunk-KRBQLMOP.js";
|
|
7
|
-
|
|
8
|
-
// src/lib/worktree.ts
|
|
9
|
-
import { spawn } from "node:child_process";
|
|
10
|
-
import fs from "node:fs";
|
|
11
|
-
import path from "node:path";
|
|
12
|
-
function runGit(args, cwd) {
|
|
13
|
-
return new Promise((resolve, reject) => {
|
|
14
|
-
const proc = spawn("git", args, {
|
|
15
|
-
cwd,
|
|
16
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
17
|
-
env: tmuxSpawnEnv()
|
|
18
|
-
});
|
|
19
|
-
let stdout = "";
|
|
20
|
-
let stderr = "";
|
|
21
|
-
proc.stdout.on("data", (d) => {
|
|
22
|
-
stdout += d.toString();
|
|
23
|
-
});
|
|
24
|
-
proc.stderr.on("data", (d) => {
|
|
25
|
-
stderr += d.toString();
|
|
26
|
-
});
|
|
27
|
-
proc.on(
|
|
28
|
-
"error",
|
|
29
|
-
(err) => reject(new Error(`git ${args.join(" ")} failed to spawn: ${err.message}`))
|
|
30
|
-
);
|
|
31
|
-
proc.on("close", (code) => {
|
|
32
|
-
if (code === 0) {
|
|
33
|
-
resolve({ code, stdout, stderr });
|
|
34
|
-
} else {
|
|
35
|
-
reject(
|
|
36
|
-
new Error(`git ${args.join(" ")} exited ${code}: ${stderr.trim() || stdout.trim()}`)
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
async function assertValidBranch(repoRoot, branch) {
|
|
43
|
-
if (!branch || !branch.trim()) {
|
|
44
|
-
throw new Error('invalid branch name "": branch must be a non-empty git refname');
|
|
45
|
-
}
|
|
46
|
-
if (branch.startsWith("-")) {
|
|
47
|
-
throw new Error(
|
|
48
|
-
`invalid branch name "${branch}": must not start with "-" (git would parse it as an option)`
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
if (/\s/.test(branch)) {
|
|
52
|
-
throw new Error(`invalid branch name "${branch}": must not contain whitespace`);
|
|
53
|
-
}
|
|
54
|
-
try {
|
|
55
|
-
await runGit(["check-ref-format", "--branch", branch], repoRoot);
|
|
56
|
-
} catch {
|
|
57
|
-
throw new Error(`invalid branch name "${branch}": not a valid git refname`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function canonical(p) {
|
|
61
|
-
const resolved = path.resolve(p);
|
|
62
|
-
try {
|
|
63
|
-
return fs.realpathSync(resolved);
|
|
64
|
-
} catch {
|
|
65
|
-
return resolved;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
function parseWorktreeList(porcelain) {
|
|
69
|
-
const entries = [];
|
|
70
|
-
let current = null;
|
|
71
|
-
for (const line of porcelain.split("\n")) {
|
|
72
|
-
if (line.startsWith("worktree ")) {
|
|
73
|
-
if (current) entries.push(current);
|
|
74
|
-
current = { path: line.slice("worktree ".length).trim() };
|
|
75
|
-
} else if (line.startsWith("branch ") && current) {
|
|
76
|
-
current.branch = line.slice("branch ".length).trim().replace(/^refs\/heads\//, "");
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (current) entries.push(current);
|
|
80
|
-
return entries;
|
|
81
|
-
}
|
|
82
|
-
async function branchExists(repoRoot, branch) {
|
|
83
|
-
try {
|
|
84
|
-
await runGit(["show-ref", "--verify", "--quiet", `refs/heads/${branch}`], repoRoot);
|
|
85
|
-
return true;
|
|
86
|
-
} catch {
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
async function ensureWorktree(options) {
|
|
91
|
-
const { repoRoot, branch, baseRef, allowExistingBranch = false } = options;
|
|
92
|
-
await assertValidBranch(repoRoot, branch);
|
|
93
|
-
const targetPath = worktreePathFor({ repoRoot, branch, basePath: options.basePath });
|
|
94
|
-
const listed = await runGit(["worktree", "list", "--porcelain"], repoRoot);
|
|
95
|
-
const existing = parseWorktreeList(listed.stdout);
|
|
96
|
-
const byBranch = existing.find((e) => e.branch === branch);
|
|
97
|
-
if (byBranch) {
|
|
98
|
-
return { path: canonical(byBranch.path), branch, created: false };
|
|
99
|
-
}
|
|
100
|
-
const byPath = existing.find((e) => canonical(e.path) === targetPath);
|
|
101
|
-
if (byPath) {
|
|
102
|
-
return { path: canonical(byPath.path), branch: byPath.branch ?? branch, created: false };
|
|
103
|
-
}
|
|
104
|
-
if (await branchExists(repoRoot, branch)) {
|
|
105
|
-
if (!allowExistingBranch) {
|
|
106
|
-
throw new Error(
|
|
107
|
-
`branch "${branch}" already exists with no worktree; refusing to clobber (pass allowExistingBranch:true to attach a worktree onto it)`
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
await runGit(["worktree", "add", targetPath, branch], repoRoot);
|
|
111
|
-
return { path: canonical(targetPath), branch, created: true };
|
|
112
|
-
}
|
|
113
|
-
await runGit(["worktree", "add", targetPath, "-b", branch, baseRef], repoRoot);
|
|
114
|
-
return { path: canonical(targetPath), branch, created: true };
|
|
115
|
-
}
|
|
116
|
-
async function removeWorktree(options) {
|
|
117
|
-
const { repoRoot, worktreePath } = options;
|
|
118
|
-
if (!fs.existsSync(worktreePath)) {
|
|
119
|
-
return { removed: false, reason: "absent" };
|
|
120
|
-
}
|
|
121
|
-
let dirty = false;
|
|
122
|
-
try {
|
|
123
|
-
const status = await runGit(["status", "--porcelain"], worktreePath);
|
|
124
|
-
dirty = status.stdout.trim().length > 0;
|
|
125
|
-
} catch {
|
|
126
|
-
dirty = false;
|
|
127
|
-
}
|
|
128
|
-
if (dirty) {
|
|
129
|
-
return { removed: false, reason: "dirty" };
|
|
130
|
-
}
|
|
131
|
-
try {
|
|
132
|
-
await runGit(["worktree", "remove", worktreePath], repoRoot);
|
|
133
|
-
return { removed: true };
|
|
134
|
-
} catch (err) {
|
|
135
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
136
|
-
if (/not a working tree|No such file or directory|not a valid path|is not a working tree/i.test(message)) {
|
|
137
|
-
return { removed: false, reason: "absent" };
|
|
138
|
-
}
|
|
139
|
-
throw err;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export {
|
|
144
|
-
runGit,
|
|
145
|
-
ensureWorktree,
|
|
146
|
-
removeWorktree
|
|
147
|
-
};
|
|
148
|
-
//# sourceMappingURL=chunk-Y4BJXXYV.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/worktree.ts"],
|
|
4
|
-
"sourcesContent": ["import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { worktreePathFor } from '@rulemetric/session';\n\nimport { tmuxSpawnEnv } from './tmux.js';\n\n// Re-export so existing importers (and the API reconcile path) share ONE\n// sanitizer. The implementation lives in @rulemetric/session/worktree-path so\n// the API process \u2014 which can't import @rulemetric/cli \u2014 can derive the same\n// path without duplicating the logic.\nexport { sanitizeBranch } from '@rulemetric/session';\n\nexport interface EnsureWorktreeOptions {\n /** Absolute path to the root of the source git repository. */\n repoRoot: string;\n /** Branch name to give the worktree (e.g. `rm/run-abc/s0`). */\n branch: string;\n /** Commit-ish the new branch is created from (e.g. `HEAD`, `main`, a SHA). */\n baseRef: string;\n /**\n * Where to put the worktree. Defaults to a SIBLING of `repoRoot`:\n * `<repoRoot>/../.rulemetric-worktrees/<sanitized-branch>`. Never placed\n * inside `repoRoot` \u2014 a nested worktree would be tracked by the parent repo.\n */\n basePath?: string;\n /**\n * If the branch already exists (but has no worktree), `false` (default)\n * throws \u2014 this is the caller's \"make sure it doesn't exist first\" guard.\n * `true` attaches a worktree onto the existing branch (no `-b`).\n */\n allowExistingBranch?: boolean;\n}\n\nexport interface EnsureWorktreeResult {\n /** Absolute filesystem path of the worktree. */\n path: string;\n /** The branch the worktree is checked out on. */\n branch: string;\n /** `true` if this call created the worktree; `false` if it already existed. */\n created: boolean;\n}\n\ninterface GitRunResult {\n code: number | null;\n stdout: string;\n stderr: string;\n}\n\n/**\n * Spawn `git` with a PATH-augmented env. The launchd worker's minimal PATH\n * omits Homebrew dirs, so a bare `spawn('git')` ENOENTs under launchd (same\n * failure mode as tmux \u2014 see the `launchd-worker-path-homebrew` incident).\n * We reuse `tmuxSpawnEnv()` (apps/cli/src/lib/tmux.ts), which appends\n * `/opt/homebrew/bin` + `/usr/local/bin` to PATH when missing. Rejects on a\n * nonzero exit (or spawn error) with stderr included for diagnosis.\n */\nexport function runGit(args: string[], cwd?: string): Promise<GitRunResult> {\n return new Promise((resolve, reject) => {\n const proc = spawn('git', args, {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: tmuxSpawnEnv(),\n });\n let stdout = '';\n let stderr = '';\n proc.stdout.on('data', (d: Buffer) => {\n stdout += d.toString();\n });\n proc.stderr.on('data', (d: Buffer) => {\n stderr += d.toString();\n });\n proc.on('error', (err) =>\n reject(new Error(`git ${args.join(' ')} failed to spawn: ${err.message}`)),\n );\n proc.on('close', (code) => {\n if (code === 0) {\n resolve({ code, stdout, stderr });\n } else {\n reject(\n new Error(`git ${args.join(' ')} exited ${code}: ${stderr.trim() || stdout.trim()}`),\n );\n }\n });\n });\n}\n\n/**\n * Reject branch names that git would misparse or refuse, BEFORE any git call.\n *\n * `branch` is interpolated into argv for `git worktree add ... -b <branch>`.\n * Argv-array spawn already blocks shell injection, but a name that starts with\n * `-` (e.g. `--help`) is parsed by git as an OPTION, not a ref \u2014 a defense-in-\n * depth gap for this exported helper. We catch the obvious cases up-front with\n * clear errors (empty / whitespace / leading `-`), then defer to git's own\n * `check-ref-format --branch`, which exits nonzero for any otherwise-invalid\n * refname (`..`, trailing `.lock`, control chars, etc.). `runGit` rejects on a\n * nonzero exit, so we catch and rethrow as a uniform message.\n */\nasync function assertValidBranch(repoRoot: string, branch: string): Promise<void> {\n if (!branch || !branch.trim()) {\n throw new Error('invalid branch name \"\": branch must be a non-empty git refname');\n }\n if (branch.startsWith('-')) {\n throw new Error(\n `invalid branch name \"${branch}\": must not start with \"-\" (git would parse it as an option)`,\n );\n }\n if (/\\s/.test(branch)) {\n throw new Error(`invalid branch name \"${branch}\": must not contain whitespace`);\n }\n try {\n await runGit(['check-ref-format', '--branch', branch], repoRoot);\n } catch {\n throw new Error(`invalid branch name \"${branch}\": not a valid git refname`);\n }\n}\n\n/**\n * Canonicalize a path so values are comparable across calls. `git worktree\n * list --porcelain` reports realpath-resolved paths (e.g. macOS `/var` \u2192\n * `/private/var`), so we resolve symlinks when the path exists. Falls back to\n * `path.resolve` for not-yet-created paths.\n */\nfunction canonical(p: string): string {\n const resolved = path.resolve(p);\n try {\n return fs.realpathSync(resolved);\n } catch {\n return resolved;\n }\n}\n\ninterface WorktreeEntry {\n path: string;\n branch?: string;\n}\n\n/** Parse `git worktree list --porcelain` output into structured entries. */\nfunction parseWorktreeList(porcelain: string): WorktreeEntry[] {\n const entries: WorktreeEntry[] = [];\n let current: WorktreeEntry | null = null;\n for (const line of porcelain.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (current) entries.push(current);\n current = { path: line.slice('worktree '.length).trim() };\n } else if (line.startsWith('branch ') && current) {\n // e.g. \"branch refs/heads/rm/run-abc/s0\" \u2192 \"rm/run-abc/s0\"\n current.branch = line.slice('branch '.length).trim().replace(/^refs\\/heads\\//, '');\n }\n }\n if (current) entries.push(current);\n return entries;\n}\n\n/** Does a local branch with this exact name exist? */\nasync function branchExists(repoRoot: string, branch: string): Promise<boolean> {\n try {\n await runGit(['show-ref', '--verify', '--quiet', `refs/heads/${branch}`], repoRoot);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure an isolated git worktree + branch exists for a launched session.\n *\n * Pure/idempotent: takes `repoRoot` as input, holds no global state, and is\n * safe to call repeatedly \u2014 a pre-existence guard returns the existing\n * worktree with `created: false` instead of erroring.\n */\nexport async function ensureWorktree(\n options: EnsureWorktreeOptions,\n): Promise<EnsureWorktreeResult> {\n const { repoRoot, branch, baseRef, allowExistingBranch = false } = options;\n\n // 0. Reject git-flag / invalid branch names BEFORE any git call. Guards the\n // raw `-b <branch>` interpolation (e.g. `--help` would be read as a git\n // option, not a ref). sanitizeBranch below only protects the FS path.\n await assertValidBranch(repoRoot, branch);\n\n // Shared with the API reconcile fallback via @rulemetric/session \u2014 see\n // worktree-path.ts. `sanitizeBranch` is referenced through it.\n const targetPath = worktreePathFor({ repoRoot, branch, basePath: options.basePath });\n\n // 1. Pre-existence guard \u2014 reuse an existing worktree for this branch/path.\n const listed = await runGit(['worktree', 'list', '--porcelain'], repoRoot);\n const existing = parseWorktreeList(listed.stdout);\n const byBranch = existing.find((e) => e.branch === branch);\n if (byBranch) {\n return { path: canonical(byBranch.path), branch, created: false };\n }\n // Assumes the naming convention makes targetPath \u21D2 branch 1:1 (one branch\n // per worktree path), so a path hit implies the same logical branch and\n // returning created:false here is safe.\n const byPath = existing.find((e) => canonical(e.path) === targetPath);\n if (byPath) {\n return { path: canonical(byPath.path), branch: byPath.branch ?? branch, created: false };\n }\n\n // 2. Branch exists but has no worktree \u2192 honor allowExistingBranch.\n if (await branchExists(repoRoot, branch)) {\n if (!allowExistingBranch) {\n throw new Error(\n `branch \"${branch}\" already exists with no worktree; refusing to clobber ` +\n `(pass allowExistingBranch:true to attach a worktree onto it)`,\n );\n }\n // Attach a worktree onto the existing branch (no -b, no baseRef).\n await runGit(['worktree', 'add', targetPath, branch], repoRoot);\n return { path: canonical(targetPath), branch, created: true };\n }\n\n // 3. Fresh worktree on a brand-new branch off baseRef.\n await runGit(['worktree', 'add', targetPath, '-b', branch, baseRef], repoRoot);\n return { path: canonical(targetPath), branch, created: true };\n}\n\nexport interface RemoveWorktreeOptions {\n /** Absolute path to the root of the source git repository. */\n repoRoot: string;\n /** Absolute path of the worktree to remove (e.g. the value returned by `ensureWorktree`). */\n worktreePath: string;\n}\n\nexport interface RemoveWorktreeResult {\n /** `true` if this call removed the worktree; `false` if it refused or was a no-op. */\n removed: boolean;\n /**\n * Why the worktree was NOT removed (only set when `removed: false`):\n * - `'dirty'` \u2014 the worktree has uncommitted changes; refusing to clobber.\n * - `'absent'` \u2014 there was no worktree at that path (already removed / never existed).\n */\n reason?: 'dirty' | 'absent';\n}\n\n/**\n * Remove a session's git worktree, GUARDING against destroying uncommitted work.\n *\n * Load-bearing safety contract (research \"merge-review bottleneck\" / Prime\n * Directive: never silently discard work):\n * 1. Run `git -C <worktreePath> status --porcelain`. If the output is\n * non-empty the worktree has uncommitted changes (modified/untracked/\n * staged) \u2014 DO NOT remove it. Return `{ removed: false, reason: 'dirty' }`\n * and leave the directory on disk untouched. The caller surfaces this so\n * the user can review/commit before cleanup.\n * 2. If clean, run `git -C <repoRoot> worktree remove <worktreePath>`.\n * Idempotent: a missing worktree (already removed, or its dir was deleted\n * out from under git) is treated as a no-op \u2192 `{ removed: false,\n * reason: 'absent' }` rather than an error.\n *\n * Uses the PATH-augmented `runGit` (the launchd worker's minimal PATH omits\n * Homebrew, so a bare `git` spawn ENOENTs \u2014 same incident as `ensureWorktree`).\n */\nexport async function removeWorktree(\n options: RemoveWorktreeOptions,\n): Promise<RemoveWorktreeResult> {\n const { repoRoot, worktreePath } = options;\n\n // 0. If nothing is on disk at the path, it's already gone \u2014 idempotent no-op.\n // (git status below would error with a confusing message on a missing cwd.)\n if (!fs.existsSync(worktreePath)) {\n return { removed: false, reason: 'absent' };\n }\n\n // 1. Dirty-guard. A non-empty `status --porcelain` means uncommitted work\n // (staged, unstaged, OR untracked files). Refuse \u2014 never clobber.\n let dirty = false;\n try {\n const status = await runGit(['status', '--porcelain'], worktreePath);\n dirty = status.stdout.trim().length > 0;\n } catch {\n // The path exists but isn't (or is no longer) a valid worktree checkout \u2014\n // e.g. its `.git` link is broken. Fall through to the remove step, which\n // handles \"not a working tree\" idempotently as `absent`.\n dirty = false;\n }\n if (dirty) {\n return { removed: false, reason: 'dirty' };\n }\n\n // 2. Clean \u2192 remove. Treat \"not a working tree / already removed\" as a no-op.\n try {\n await runGit(['worktree', 'remove', worktreePath], repoRoot);\n return { removed: true };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n // git's messages for an already-absent worktree vary by version:\n // \"is not a working tree\", \"No such file or directory\", \"not a valid\n // path\". Match the common phrases \u2192 idempotent absent. Anything else is\n // a real error and rethrows.\n if (/not a working tree|No such file or directory|not a valid path|is not a working tree/i.test(message)) {\n return { removed: false, reason: 'absent' };\n }\n throw err;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/chunk-YNIH3KMU.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
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
|
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|