@rulemetric/cli 0.6.9 → 0.7.0
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 +4 -3
- package/dist/{chunk-SZ7VDCD6.js → chunk-2HK7RGZB.js} +22 -3
- package/dist/chunk-2HK7RGZB.js.map +7 -0
- package/dist/{chunk-RUCSRN7F.js → chunk-2ORJWTNZ.js} +2 -2
- package/dist/{chunk-SLL3OBKN.js → chunk-37LN5O7M.js} +2 -2
- package/dist/{chunk-RCMXTLQF.js → chunk-3LKVS6W5.js} +5 -5
- package/dist/{chunk-XN23W5HL.js → chunk-4KRMZLQV.js} +91 -7
- package/dist/chunk-4KRMZLQV.js.map +7 -0
- package/dist/{chunk-DAJNO4OI.js → chunk-4LYCDS2N.js} +28 -16
- package/dist/chunk-4LYCDS2N.js.map +7 -0
- package/dist/{chunk-UPXIO7CG.js → chunk-4XAWK6S2.js} +8 -8
- package/dist/{chunk-N5A2IQAK.js → chunk-4YAP7RT7.js} +5 -5
- package/dist/{chunk-QD6X4L4L.js → chunk-5BAOGNUH.js} +4 -4
- package/dist/chunk-5EDMGK3W.js +39 -0
- package/dist/chunk-5EDMGK3W.js.map +7 -0
- package/dist/{chunk-5ADHO5QF.js → chunk-6NBS5XFS.js} +6 -6
- package/dist/chunk-7LVVKQMZ.js +98 -0
- package/dist/chunk-7LVVKQMZ.js.map +7 -0
- package/dist/{chunk-PXVQLD7S.js → chunk-7NNFYWKK.js} +48 -1
- package/dist/chunk-7NNFYWKK.js.map +7 -0
- package/dist/{chunk-BBLTN35F.js → chunk-7UDETV3P.js} +49 -20
- package/dist/chunk-7UDETV3P.js.map +7 -0
- package/dist/{chunk-DTFXCHHI.js → chunk-DNKSVWMD.js} +4 -4
- package/dist/{chunk-6EMZI4Y3.js → chunk-EI5BHWXA.js} +437 -401
- package/dist/chunk-EI5BHWXA.js.map +7 -0
- package/dist/{chunk-HNZLEEG2.js → chunk-EJ3YAFDP.js} +4 -4
- package/dist/{chunk-HNZLEEG2.js.map → chunk-EJ3YAFDP.js.map} +2 -2
- package/dist/{chunk-YSEQWCN4.js → chunk-EYPAAGN5.js} +2 -2
- package/dist/{chunk-JEJ3J5J6.js → chunk-GIUBARWS.js} +2 -2
- package/dist/chunk-GQNJO2P2.js +102 -0
- package/dist/chunk-GQNJO2P2.js.map +7 -0
- package/dist/{chunk-CNMWYYSV.js → chunk-HZK43UCF.js} +6 -6
- package/dist/chunk-ILYDELUE.js +46 -0
- package/dist/chunk-ILYDELUE.js.map +7 -0
- package/dist/chunk-J6QFW4LD.js +55 -0
- package/dist/chunk-J6QFW4LD.js.map +7 -0
- package/dist/{chunk-OTOWLUOJ.js → chunk-JULOLTZS.js} +2 -2
- package/dist/{chunk-DR5WLIOU.js → chunk-KJKBDQ4D.js} +2 -2
- package/dist/{chunk-AHDRN6NE.js → chunk-OO7JDFS4.js} +5 -5
- package/dist/{chunk-N2X35ITW.js → chunk-OQBBVTDG.js} +11 -1
- package/dist/{chunk-N2X35ITW.js.map → chunk-OQBBVTDG.js.map} +2 -2
- package/dist/{chunk-3QH73QOQ.js → chunk-PED7L5GX.js} +2 -2
- package/dist/{chunk-VBGUNFKY.js → chunk-PMI56ED5.js} +5 -5
- package/dist/{chunk-XNNOXGP6.js → chunk-POFTPB33.js} +38 -19
- package/dist/chunk-POFTPB33.js.map +7 -0
- package/dist/{chunk-W4MZXKZ2.js → chunk-UKMLICWS.js} +2 -2
- package/dist/{chunk-3POYC5NA.js → chunk-XK42ZBDE.js} +3 -3
- package/dist/{chunk-ZSGKRCKD.js → chunk-XUV6DDBF.js} +2 -2
- package/dist/{chunk-LAKZUE35.js → chunk-Y3WD5CSW.js} +2 -2
- package/dist/{chunk-3QVMIJUL.js → chunk-YOBA3NAM.js} +5 -5
- package/dist/{chunk-ZRLYHBPN.js → chunk-ZUJBM6HE.js} +20 -2
- package/dist/chunk-ZUJBM6HE.js.map +7 -0
- package/dist/commands/antigravity/backfill.js +5 -4
- package/dist/commands/antigravity/backfill.js.map +1 -1
- package/dist/commands/auth/create-key.js +4 -3
- package/dist/commands/auth/create-key.js.map +1 -1
- package/dist/commands/auth/login.js +13 -9
- package/dist/commands/auth/login.js.map +2 -2
- package/dist/commands/auth/logout.js +4 -3
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/revoke-key.js +4 -3
- package/dist/commands/auth/revoke-key.js.map +1 -1
- package/dist/commands/auth/signup.js +13 -9
- package/dist/commands/auth/signup.js.map +2 -2
- package/dist/commands/auth/status.js +4 -3
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/catalog/index.js +4 -3
- package/dist/commands/catalog/index.js.map +1 -1
- package/dist/commands/catalog/recommend.js +4 -3
- package/dist/commands/catalog/recommend.js.map +1 -1
- package/dist/commands/convert.js +4 -3
- package/dist/commands/convert.js.map +1 -1
- package/dist/commands/converters.js +4 -3
- package/dist/commands/converters.js.map +1 -1
- package/dist/commands/crons/list.js +4 -3
- package/dist/commands/crons/list.js.map +1 -1
- package/dist/commands/crons/run.js +4 -3
- package/dist/commands/crons/run.js.map +1 -1
- package/dist/commands/dashboard.js +4 -3
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/diagnostics.js +117 -0
- package/dist/commands/diagnostics.js.map +7 -0
- package/dist/commands/eval-targets/create.js +4 -3
- package/dist/commands/eval-targets/create.js.map +1 -1
- package/dist/commands/eval-targets/list.js +4 -3
- package/dist/commands/eval-targets/list.js.map +1 -1
- package/dist/commands/evals/agent.js +44 -23
- package/dist/commands/evals/agent.js.map +2 -2
- package/dist/commands/evals/benchmark.js +5 -4
- package/dist/commands/evals/benchmark.js.map +1 -1
- package/dist/commands/evals/compare.js +4 -3
- package/dist/commands/evals/compare.js.map +1 -1
- package/dist/commands/evals/create.js +4 -3
- package/dist/commands/evals/create.js.map +1 -1
- package/dist/commands/evals/optimize-description.js +4 -3
- package/dist/commands/evals/optimize-description.js.map +1 -1
- package/dist/commands/evals/optimize.js +4 -3
- package/dist/commands/evals/optimize.js.map +1 -1
- package/dist/commands/evals/run.js +4 -3
- package/dist/commands/evals/run.js.map +1 -1
- package/dist/commands/gateway/ensure.js +58 -5
- package/dist/commands/gateway/ensure.js.map +2 -2
- package/dist/commands/hooks/install.js +76 -23
- package/dist/commands/hooks/install.js.map +2 -2
- package/dist/commands/hooks/run.js +4 -3
- package/dist/commands/hooks/run.js.map +1 -1
- package/dist/commands/hooks/uninstall.js +31 -40
- package/dist/commands/hooks/uninstall.js.map +2 -2
- package/dist/commands/import.js +4 -3
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/instructions/create.js +4 -3
- package/dist/commands/instructions/create.js.map +1 -1
- package/dist/commands/instructions/delete.js +4 -3
- package/dist/commands/instructions/delete.js.map +1 -1
- package/dist/commands/instructions/fork.js +4 -3
- package/dist/commands/instructions/fork.js.map +1 -1
- package/dist/commands/instructions/get.js +4 -3
- package/dist/commands/instructions/get.js.map +1 -1
- package/dist/commands/instructions/list.js +4 -3
- package/dist/commands/instructions/list.js.map +1 -1
- package/dist/commands/instructions/promote.js +4 -3
- package/dist/commands/instructions/promote.js.map +1 -1
- package/dist/commands/instructions/pull.js +4 -3
- package/dist/commands/instructions/pull.js.map +1 -1
- package/dist/commands/instructions/upstream.js +4 -3
- package/dist/commands/instructions/upstream.js.map +1 -1
- package/dist/commands/instructions/versions.js +4 -3
- package/dist/commands/instructions/versions.js.map +1 -1
- package/dist/commands/launcher.js +4 -3
- package/dist/commands/launcher.js.map +1 -1
- package/dist/commands/org/current.js +4 -3
- package/dist/commands/org/current.js.map +1 -1
- package/dist/commands/org/list.js +4 -3
- package/dist/commands/org/list.js.map +1 -1
- package/dist/commands/org/switch.js +4 -3
- package/dist/commands/org/switch.js.map +1 -1
- package/dist/commands/packs/add-instruction.js +4 -3
- package/dist/commands/packs/add-instruction.js.map +1 -1
- package/dist/commands/packs/apply.js +4 -3
- package/dist/commands/packs/apply.js.map +1 -1
- package/dist/commands/packs/create.js +4 -3
- package/dist/commands/packs/create.js.map +1 -1
- package/dist/commands/packs/fork.js +4 -3
- package/dist/commands/packs/fork.js.map +1 -1
- package/dist/commands/packs/get.js +4 -3
- package/dist/commands/packs/get.js.map +1 -1
- package/dist/commands/packs/list.js +4 -3
- package/dist/commands/packs/list.js.map +1 -1
- package/dist/commands/packs/remove-instruction.js +4 -3
- package/dist/commands/packs/remove-instruction.js.map +1 -1
- package/dist/commands/proxy/env.js +7 -4
- package/dist/commands/proxy/env.js.map +1 -1
- package/dist/commands/proxy/logs.js +4 -3
- package/dist/commands/proxy/logs.js.map +1 -1
- package/dist/commands/proxy/restart.js +4 -3
- package/dist/commands/proxy/restart.js.map +1 -1
- package/dist/commands/proxy/setup.js +20 -14
- package/dist/commands/proxy/setup.js.map +2 -2
- package/dist/commands/proxy/start.js +18 -14
- package/dist/commands/proxy/start.js.map +2 -2
- package/dist/commands/proxy/status.js +16 -13
- package/dist/commands/proxy/status.js.map +2 -2
- package/dist/commands/proxy/stop.js +21 -12
- package/dist/commands/proxy/stop.js.map +2 -2
- package/dist/commands/research/backfill.js +5 -4
- package/dist/commands/research/backfill.js.map +1 -1
- package/dist/commands/research/tail-transcript.js +5 -4
- package/dist/commands/research/tail-transcript.js.map +1 -1
- package/dist/commands/service/install.js +6 -6
- package/dist/commands/service/status.js +4 -3
- package/dist/commands/service/status.js.map +1 -1
- package/dist/commands/service/uninstall.js +4 -3
- package/dist/commands/service/uninstall.js.map +1 -1
- package/dist/commands/sessions/analyze.js +4 -3
- package/dist/commands/sessions/analyze.js.map +1 -1
- package/dist/commands/sessions/end.js +4 -3
- package/dist/commands/sessions/end.js.map +1 -1
- package/dist/commands/sessions/import.js +4 -3
- package/dist/commands/sessions/import.js.map +1 -1
- package/dist/commands/sessions/list.js +4 -3
- package/dist/commands/sessions/list.js.map +1 -1
- package/dist/commands/sessions/start.js +4 -3
- package/dist/commands/sessions/start.js.map +1 -1
- package/dist/commands/setup.js +10 -6
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skills/export-approved.js +4 -3
- package/dist/commands/skills/export-approved.js.map +1 -1
- package/dist/commands/skills/install.js +4 -3
- package/dist/commands/skills/install.js.map +1 -1
- package/dist/commands/skills/list.js +4 -3
- package/dist/commands/skills/list.js.map +1 -1
- package/dist/commands/skills/publish.js +4 -3
- package/dist/commands/skills/publish.js.map +1 -1
- package/dist/commands/skills/search.js +4 -3
- package/dist/commands/skills/search.js.map +1 -1
- package/dist/commands/skills/update.js +4 -3
- package/dist/commands/skills/update.js.map +1 -1
- package/dist/commands/suggestions/accept.js +4 -3
- package/dist/commands/suggestions/accept.js.map +1 -1
- package/dist/commands/suggestions/dismiss.js +4 -3
- package/dist/commands/suggestions/dismiss.js.map +1 -1
- package/dist/commands/suggestions/list.js +4 -3
- package/dist/commands/suggestions/list.js.map +1 -1
- package/dist/commands/suggestions/refresh.js +4 -3
- package/dist/commands/suggestions/refresh.js.map +1 -1
- package/dist/dashboard/Dashboard.js +16 -16
- package/dist/dashboard/data.js +2 -2
- package/dist/dashboard/launcher/ActiveJobsList.js +2 -2
- package/dist/dashboard/launcher/LauncherOverlay.js +7 -7
- package/dist/dashboard/launcher/NewLaunchForm.js +2 -2
- package/dist/dashboard/launcher/api.js +2 -2
- package/dist/dashboard/launcher/useLaunchJobs.js +3 -3
- package/dist/lib/active-org-refresh.js +2 -2
- package/dist/lib/agent-loop.js +20 -18
- package/dist/lib/antigravity-transcript.js +2 -2
- package/dist/lib/api-client.js +1 -1
- package/dist/lib/diagnostics.js +12 -0
- package/dist/lib/diagnostics.js.map +7 -0
- package/dist/lib/ensure-api-key.js +3 -3
- package/dist/lib/eval-benchmark.js +2 -2
- package/dist/lib/eval-conversation-handler.js +2 -2
- package/dist/lib/gateway-entry.js +39 -1
- package/dist/lib/gateway-entry.js.map +2 -2
- package/dist/lib/gateway-identity.js +16 -0
- package/dist/lib/gateway-identity.js.map +7 -0
- package/dist/lib/gateway-lifecycle.js +9 -3
- package/dist/lib/gateway.js +3 -1
- package/dist/lib/handlers/cron-suggest-instructions.js +3 -3
- package/dist/lib/handlers/process-announcement.js +3 -3
- package/dist/lib/handlers/process-changelog.js +3 -3
- package/dist/lib/handlers/process-conversation.js +3 -3
- package/dist/lib/handlers/process-eval.js +3 -3
- package/dist/lib/handlers/process-insights.js +3 -3
- package/dist/lib/handlers/process-launch.js +2 -2
- package/dist/lib/handlers/process-run-cleanup.js +2 -2
- package/dist/lib/handlers/process-session-goal.js +2 -2
- package/dist/lib/hooks-config.js +14 -1
- package/dist/lib/manual-tasks.js +6 -6
- package/dist/lib/pid-identity.js +14 -0
- package/dist/lib/pid-identity.js.map +7 -0
- package/dist/lib/proxy-respawn.js +12 -0
- package/dist/lib/proxy-respawn.js.map +7 -0
- package/dist/lib/research-client.js +2 -2
- package/dist/lib/setup-steps.js +7 -4
- package/dist/lib/statusline-shim.js +3 -1
- package/dist/lib/telemetry.js +4 -2
- package/dist/lib/terminal-target-heartbeat.js +2 -2
- package/oclif.manifest.json +34 -1
- package/package.json +6 -6
- package/dist/chunk-6EMZI4Y3.js.map +0 -7
- package/dist/chunk-BBLTN35F.js.map +0 -7
- package/dist/chunk-DAJNO4OI.js.map +0 -7
- package/dist/chunk-PXVQLD7S.js.map +0 -7
- package/dist/chunk-SZ7VDCD6.js.map +0 -7
- package/dist/chunk-TX2HKJLA.js +0 -55
- package/dist/chunk-TX2HKJLA.js.map +0 -7
- package/dist/chunk-XN23W5HL.js.map +0 -7
- package/dist/chunk-XNNOXGP6.js.map +0 -7
- package/dist/chunk-ZRLYHBPN.js.map +0 -7
- /package/dist/{chunk-RUCSRN7F.js.map → chunk-2ORJWTNZ.js.map} +0 -0
- /package/dist/{chunk-SLL3OBKN.js.map → chunk-37LN5O7M.js.map} +0 -0
- /package/dist/{chunk-RCMXTLQF.js.map → chunk-3LKVS6W5.js.map} +0 -0
- /package/dist/{chunk-UPXIO7CG.js.map → chunk-4XAWK6S2.js.map} +0 -0
- /package/dist/{chunk-N5A2IQAK.js.map → chunk-4YAP7RT7.js.map} +0 -0
- /package/dist/{chunk-QD6X4L4L.js.map → chunk-5BAOGNUH.js.map} +0 -0
- /package/dist/{chunk-5ADHO5QF.js.map → chunk-6NBS5XFS.js.map} +0 -0
- /package/dist/{chunk-DTFXCHHI.js.map → chunk-DNKSVWMD.js.map} +0 -0
- /package/dist/{chunk-YSEQWCN4.js.map → chunk-EYPAAGN5.js.map} +0 -0
- /package/dist/{chunk-JEJ3J5J6.js.map → chunk-GIUBARWS.js.map} +0 -0
- /package/dist/{chunk-CNMWYYSV.js.map → chunk-HZK43UCF.js.map} +0 -0
- /package/dist/{chunk-OTOWLUOJ.js.map → chunk-JULOLTZS.js.map} +0 -0
- /package/dist/{chunk-DR5WLIOU.js.map → chunk-KJKBDQ4D.js.map} +0 -0
- /package/dist/{chunk-AHDRN6NE.js.map → chunk-OO7JDFS4.js.map} +0 -0
- /package/dist/{chunk-3QH73QOQ.js.map → chunk-PED7L5GX.js.map} +0 -0
- /package/dist/{chunk-VBGUNFKY.js.map → chunk-PMI56ED5.js.map} +0 -0
- /package/dist/{chunk-W4MZXKZ2.js.map → chunk-UKMLICWS.js.map} +0 -0
- /package/dist/{chunk-3POYC5NA.js.map → chunk-XK42ZBDE.js.map} +0 -0
- /package/dist/{chunk-ZSGKRCKD.js.map → chunk-XUV6DDBF.js.map} +0 -0
- /package/dist/{chunk-LAKZUE35.js.map → chunk-Y3WD5CSW.js.map} +0 -0
- /package/dist/{chunk-3QVMIJUL.js.map → chunk-YOBA3NAM.js.map} +0 -0
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-F5N6CLJJ.js";
|
|
5
5
|
import {
|
|
6
6
|
DEFAULT_API_URL
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZUJBM6HE.js";
|
|
8
8
|
|
|
9
9
|
// src/dashboard/data.ts
|
|
10
10
|
import * as fs from "node:fs";
|
|
@@ -121,4 +121,4 @@ export {
|
|
|
121
121
|
loadApiInsights,
|
|
122
122
|
loadLinkedInstructions
|
|
123
123
|
};
|
|
124
|
-
//# sourceMappingURL=chunk-
|
|
124
|
+
//# sourceMappingURL=chunk-XUV6DDBF.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ApiError,
|
|
3
3
|
apiPost
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZUJBM6HE.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/research-client.ts
|
|
7
7
|
function serializeDate(v) {
|
|
@@ -46,4 +46,4 @@ export {
|
|
|
46
46
|
postObservation,
|
|
47
47
|
postObservations
|
|
48
48
|
};
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
49
|
+
//# sourceMappingURL=chunk-Y3WD5CSW.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
runLlmPrompt
|
|
3
|
-
} from "./chunk-FZKLLNDS.js";
|
|
4
1
|
import {
|
|
5
2
|
getDb,
|
|
6
3
|
sessionEvents,
|
|
7
4
|
sessions
|
|
8
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-EI5BHWXA.js";
|
|
6
|
+
import {
|
|
7
|
+
runLlmPrompt
|
|
8
|
+
} from "./chunk-FZKLLNDS.js";
|
|
9
9
|
|
|
10
10
|
// src/lib/handlers/process-session-goal.ts
|
|
11
11
|
import { eq, asc, sql } from "drizzle-orm";
|
|
@@ -52,4 +52,4 @@ async function processSessionGoal(payload, deps = {}) {
|
|
|
52
52
|
export {
|
|
53
53
|
processSessionGoal
|
|
54
54
|
};
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
55
|
+
//# sourceMappingURL=chunk-YOBA3NAM.js.map
|
|
@@ -62,14 +62,32 @@ async function api(path, options = {}) {
|
|
|
62
62
|
delete process.env.HTTPS_PROXY;
|
|
63
63
|
delete process.env.HTTP_PROXY;
|
|
64
64
|
}
|
|
65
|
+
const controller = options.timeoutMs ? new AbortController() : void 0;
|
|
66
|
+
let timedOut = false;
|
|
67
|
+
const timer = controller ? setTimeout(() => {
|
|
68
|
+
timedOut = true;
|
|
69
|
+
controller.abort();
|
|
70
|
+
}, options.timeoutMs) : void 0;
|
|
65
71
|
let response;
|
|
66
72
|
try {
|
|
67
73
|
response = await fetch(url, {
|
|
68
74
|
method: options.method ?? "GET",
|
|
69
75
|
headers,
|
|
70
|
-
body: options.body ? JSON.stringify(options.body) : void 0
|
|
76
|
+
body: options.body ? JSON.stringify(options.body) : void 0,
|
|
77
|
+
signal: controller?.signal
|
|
71
78
|
});
|
|
79
|
+
} catch (err) {
|
|
80
|
+
if (timedOut) {
|
|
81
|
+
const host = new URL(url).host;
|
|
82
|
+
const secs = Math.round(options.timeoutMs / 1e3);
|
|
83
|
+
throw new ApiError(
|
|
84
|
+
408,
|
|
85
|
+
`Request to ${host} timed out after ${secs}s. This is usually transient or a local proxy/gateway issue \u2014 retry, and if it persists check HTTPS_PROXY / the RuleMetric gateway (:8787).`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
throw err;
|
|
72
89
|
} finally {
|
|
90
|
+
if (timer) clearTimeout(timer);
|
|
73
91
|
if (isLocalhost) {
|
|
74
92
|
if (savedProxy !== void 0) process.env.HTTPS_PROXY = savedProxy;
|
|
75
93
|
if (savedHttpProxy !== void 0) process.env.HTTP_PROXY = savedHttpProxy;
|
|
@@ -104,4 +122,4 @@ export {
|
|
|
104
122
|
apiPatch,
|
|
105
123
|
apiDelete
|
|
106
124
|
};
|
|
107
|
-
//# sourceMappingURL=chunk-
|
|
125
|
+
//# sourceMappingURL=chunk-ZUJBM6HE.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/lib/api-client.ts"],
|
|
4
|
+
"sourcesContent": ["import { fileURLToPath } from 'node:url';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { loadToken, loadEnvFileAuth } from './auth.js';\n\n/**\n * Read the CLI's own version. Walks up from this module's location to find\n * `@rulemetric/cli`'s package.json \u2014 robust whether running unbundled from\n * `src/lib/` (dev) or from a bundled chunk at a different `dist/` depth (prod),\n * where a fixed relative `../../package.json` would resolve to the wrong file.\n */\nfunction readCliVersion(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const pj = join(dir, 'package.json');\n if (existsSync(pj)) {\n try {\n const parsed = JSON.parse(readFileSync(pj, 'utf8')) as { name?: string; version?: string };\n if (parsed.name === '@rulemetric/cli' && parsed.version) return parsed.version;\n } catch {\n /* unreadable/parse error \u2014 keep walking up */\n }\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return '0.0.0';\n}\n\nconst version = readCliVersion();\n\n/**\n * Default API base URL for the CLI. Points at PRODUCTION so a fresh `npm i -g\n * @rulemetric/cli` (no config, no env vars) can `auth login` out of the box.\n * Dev opts into localhost by setting `RULEMETRIC_API_URL` \u2014 `bin/dev.js` sets\n * it to `http://localhost:3000` automatically, and `scripts/start.sh` exports\n * it for the launchd services.\n */\nexport const DEFAULT_API_URL = 'https://rulemetric.com';\n\nexport class ApiError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\ninterface ApiOptions {\n method?: string;\n body?: unknown;\n headers?: Record<string, string>;\n /**\n * Client-side timeout in ms. OPT-IN: when unset there is NO timeout, so the\n * worker's ~30s `/api/work/next` long-poll and slow imports (which share this\n * client) are never aborted. Interactive onboarding calls (auth login/signup)\n * pass a short budget so a held/502'd connection or a broken local proxy\n * fails fast + retryable instead of appearing frozen for minutes.\n */\n timeoutMs?: number;\n}\n\nfunction getBaseUrl(): string {\n // Additive fallback to the env file's URL so a key/token read from that same\n // file (see the auth header below) is sent to the SERVER it belongs to,\n // not the localhost default.\n const url = process.env.RULEMETRIC_API_URL ?? loadEnvFileAuth().apiUrl ?? DEFAULT_API_URL;\n\n // Enforce HTTPS for non-localhost URLs\n const parsed = new URL(url);\n if (parsed.protocol === 'http:' && parsed.hostname !== 'localhost' && parsed.hostname !== '127.0.0.1') {\n throw new Error(`API URL must use HTTPS for non-localhost hosts: ${url}`);\n }\n\n return url;\n}\n\nexport async function api<T>(path: string, options: ApiOptions = {}): Promise<T> {\n const baseUrl = getBaseUrl();\n const url = `${baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `rulemetric-cli/${version}`,\n ...options.headers,\n };\n\n // Auth header resolution, first match wins:\n // 1. process.env.RULEMETRIC_API_KEY \u2014 exported long-lived key\n // 2. env-file RULEMETRIC_API_KEY \u2014 long-lived key on disk (create-key)\n // 3. auth.json OAuth accessToken \u2014 fresh right after `auth login`\n // 4. env-file RULEMETRIC_ACCESS_TOKEN \u2014 token persisted by login\n // The long-lived API key is preferred over the OAuth token because the latter\n // EXPIRES \u2014 auth.json can hold a stale token, so trying it first would 401\n // (\"Session expired\") even when a valid key sits right there in the env file.\n const envAuth = loadEnvFileAuth();\n const bearer =\n process.env.RULEMETRIC_API_KEY ||\n envAuth.apiKey ||\n loadToken()?.accessToken ||\n envAuth.accessToken;\n if (bearer) {\n headers['Authorization'] = `Bearer ${bearer}`;\n }\n\n // Bypass proxy for localhost API calls \u2014 HTTPS_PROXY is for Claude Code \u2192 Anthropic,\n // not for CLI \u2192 local API. Node.js fetch doesn't respect NO_PROXY reliably, so we\n // temporarily unset the proxy env vars for localhost calls.\n const parsed = new URL(url);\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\n const savedProxy = process.env.HTTPS_PROXY;\n const savedHttpProxy = process.env.HTTP_PROXY;\n if (isLocalhost) {\n delete process.env.HTTPS_PROXY;\n delete process.env.HTTP_PROXY;\n }\n\n // Opt-in client-side timeout (see ApiOptions.timeoutMs). Without it, no signal\n // is attached and behavior is unchanged (long-poll / import safe).\n const controller = options.timeoutMs ? new AbortController() : undefined;\n let timedOut = false;\n const timer = controller\n ? setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, options.timeoutMs)\n : undefined;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: options.method ?? 'GET',\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller?.signal,\n });\n } catch (err) {\n // A timeout abort surfaces as an AbortError. Translate it into a clear,\n // actionable ApiError \u2014 base-command otherwise maps a raw network failure to\n // \"Could not connect to the API server. Is it running?\", which is misleading\n // when the server IS up but a held connection or a broken local proxy/gateway\n // (HTTPS_PROXY \u2192 :8787) is eating the request.\n if (timedOut) {\n const host = new URL(url).host;\n const secs = Math.round((options.timeoutMs as number) / 1000);\n throw new ApiError(\n 408,\n `Request to ${host} timed out after ${secs}s. This is usually transient or a ` +\n `local proxy/gateway issue \u2014 retry, and if it persists check HTTPS_PROXY / the ` +\n `RuleMetric gateway (:8787).`,\n );\n }\n throw err;\n } finally {\n if (timer) clearTimeout(timer);\n // Restore proxy vars so claude -p calls still route through the proxy\n if (isLocalhost) {\n if (savedProxy !== undefined) process.env.HTTPS_PROXY = savedProxy;\n if (savedHttpProxy !== undefined) process.env.HTTP_PROXY = savedHttpProxy;\n }\n }\n\n let responseBody: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n if (!response.ok) {\n // Extract only the error message, not the full response body\n const message =\n responseBody && typeof responseBody === 'object' && 'error' in responseBody\n ? String((responseBody as { error: string }).error)\n : `HTTP ${response.status}`;\n throw new ApiError(response.status, message);\n }\n\n return responseBody as T;\n}\n\nexport const apiGet = <T>(path: string): Promise<T> => api<T>(path);\nexport const apiPost = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'POST', body });\nexport const apiPut = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'PUT', body });\nexport const apiPatch = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'PATCH', body });\nexport const apiDelete = <T>(path: string): Promise<T> => api<T>(path, { method: 'DELETE' });\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -3,14 +3,15 @@ import {
|
|
|
3
3
|
findMaxStepIndex,
|
|
4
4
|
readNewRecords,
|
|
5
5
|
stateApi
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-2ORJWTNZ.js";
|
|
7
7
|
import {
|
|
8
8
|
BaseCommand
|
|
9
|
-
} from "../../chunk-
|
|
9
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
10
10
|
import "../../chunk-R56PH7YE.js";
|
|
11
|
-
import "../../chunk-
|
|
11
|
+
import "../../chunk-GQNJO2P2.js";
|
|
12
|
+
import "../../chunk-37LN5O7M.js";
|
|
12
13
|
import "../../chunk-EKJ2CABV.js";
|
|
13
|
-
import "../../chunk-
|
|
14
|
+
import "../../chunk-ZUJBM6HE.js";
|
|
14
15
|
import "../../chunk-W2YERO7E.js";
|
|
15
16
|
import "../../chunk-NSBPE2FW.js";
|
|
16
17
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/antigravity/backfill.ts"],
|
|
4
4
|
"sourcesContent": ["import { Args, Flags } from '@oclif/core';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { BaseCommand } from '../../base-command.js';\nimport {\n emitRecordsAsEvents,\n findMaxStepIndex,\n readNewRecords,\n stateApi,\n} from '../../lib/antigravity-transcript.js';\n\nconst TRANSCRIPT_BRAIN_DIR = join(homedir(), '.gemini', 'antigravity-ide', 'brain');\n\nexport default class AntigravityBackfill extends BaseCommand {\n static override description =\n 'Backfill historical events from an Antigravity conversation transcript into a RuleMetric session. Useful for seeding a conversation that existed before hooks were installed \u2014 the live hook intentionally only captures forward.';\n\n static override examples = [\n '<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --session 158db9aa-68ee-43fc-961b-f3a180578694',\n '<%= config.bin %> antigravity backfill 26fd215d-f43b-4ea5-b177-dc2c0e696f97 --dry-run',\n ];\n\n static override args = {\n conversationId: Args.string({\n description: 'Antigravity conversationId (UUID) \u2014 the directory name under ~/.gemini/antigravity-ide/brain/',\n required: true,\n }),\n };\n\n static override flags = {\n session: Flags.string({\n char: 's',\n description:\n 'RuleMetric session UUID to POST events into. If omitted, resolved from the hook tmp file ($TMPDIR/rulemetric/<conversationId>) \u2014 fails if neither is present.',\n }),\n transcript: Flags.string({\n description:\n 'Path to the transcript.jsonl file. Defaults to ~/.gemini/antigravity-ide/brain/<conversationId>/.system_generated/logs/transcript.jsonl',\n }),\n 'after-step': Flags.integer({\n description:\n 'Only emit records with step_index > this value. Default: read from existing state file, else -1 (everything).',\n }),\n limit: Flags.integer({\n description: 'Cap on the number of records to process this run.',\n }),\n 'dry-run': Flags.boolean({\n default: false,\n description: 'Classify records without POSTing. Reports counts only.',\n }),\n 'save-state': Flags.boolean({\n default: true,\n allowNo: true,\n description: 'After backfill, persist the highest step_index so the live hook resumes from there.',\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(AntigravityBackfill);\n const conversationId = args.conversationId;\n\n stateApi.loadEnvFile();\n if (!process.env.RULEMETRIC_API_URL) {\n this.error('RULEMETRIC_API_URL is not set. Configure it via env or ~/.config/rulemetric/env.');\n }\n\n const transcriptPath =\n flags.transcript ??\n join(TRANSCRIPT_BRAIN_DIR, conversationId, '.system_generated', 'logs', 'transcript.jsonl');\n if (!existsSync(transcriptPath)) {\n this.error(`Transcript not found: ${transcriptPath}`);\n }\n\n const rwSessionId = flags.session ?? stateApi.resolveRwSessionId(conversationId);\n if (!rwSessionId) {\n this.error(\n `No RuleMetric session resolved. Pass --session <uuid>, or run the Antigravity hook at least once so $TMPDIR/rulemetric/${conversationId} is populated.`,\n );\n }\n\n let after = flags['after-step'];\n if (after === undefined) {\n const existing = stateApi.load(conversationId);\n after = existing?.lastStepIdx ?? -1;\n }\n\n let records = readNewRecords(transcriptPath, after);\n if (flags.limit !== undefined && records.length > flags.limit) {\n records = records.slice(0, flags.limit);\n }\n\n const max = findMaxStepIndex(transcriptPath);\n this.log(\n `Conversation ${conversationId}: transcript max step = ${max}, after-step = ${after}, records to process = ${records.length}`,\n );\n if (records.length === 0) {\n this.log('Nothing to backfill.');\n return;\n }\n\n if (flags['dry-run']) {\n // Count classification outcomes without POSTing.\n let wouldEmit = 0;\n let wouldSkip = 0;\n const byEventType: Record<string, number> = {};\n for (const record of records) {\n // Use a stable fake sequence \u2014 classification doesn't care about its value.\n const classified = (await import('../../lib/antigravity-transcript.js')).classifyRecord(record, 0);\n if (classified) {\n wouldEmit++;\n byEventType[classified.eventType] = (byEventType[classified.eventType] ?? 0) + 1;\n } else {\n wouldSkip++;\n }\n }\n this.log(\n `Dry run: would emit ${wouldEmit}, skip ${wouldSkip}. By eventType: ${JSON.stringify(byEventType)}`,\n );\n return;\n }\n\n const start = Date.now();\n const result = await emitRecordsAsEvents(records, rwSessionId, conversationId, after, {\n onProgress: ({ attempted, total }) => {\n if (attempted % 100 === 0 || attempted === total) {\n process.stderr.write(` \u2026${attempted}/${total}\\n`);\n }\n },\n });\n const elapsedSec = ((Date.now() - start) / 1000).toFixed(1);\n\n this.log(\n `Backfill complete in ${elapsedSec}s. attempted=${result.attempted} emitted=${result.emitted} skipped=${result.skipped} failed=${result.failed} highestStepIdx=${result.highestStepIdx}`,\n );\n\n if (flags['save-state']) {\n stateApi.save(conversationId, { lastStepIdx: result.highestStepIdx });\n this.log(`State saved \u2192 live hook will resume from step_index > ${result.highestStepIdx}.`);\n } else {\n this.log('State NOT saved (--no-save-state). Live hook will re-emit any new records from after-step.');\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseCommand
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
4
4
|
import "../../chunk-R56PH7YE.js";
|
|
5
|
-
import "../../chunk-
|
|
5
|
+
import "../../chunk-GQNJO2P2.js";
|
|
6
|
+
import "../../chunk-37LN5O7M.js";
|
|
6
7
|
import "../../chunk-EKJ2CABV.js";
|
|
7
8
|
import {
|
|
8
9
|
apiPost
|
|
9
|
-
} from "../../chunk-
|
|
10
|
+
} from "../../chunk-ZUJBM6HE.js";
|
|
10
11
|
import {
|
|
11
12
|
getDefaultConfigDir,
|
|
12
13
|
saveApiKey
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/auth/create-key.ts"],
|
|
4
4
|
"sourcesContent": ["import * as path from 'node:path';\nimport { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\nimport { saveApiKey, getDefaultConfigDir } from '../../lib/auth.js';\n\ninterface CreateKeyResponse {\n id: string;\n name: string;\n key: string;\n keyPrefix: string;\n createdAt: string;\n}\n\nexport default class AuthCreateKey extends BaseCommand {\n static override description = 'Create a long-lived API key for CLI and proxy authentication';\n\n static override examples = [\n '<%= config.bin %> auth create-key --name \"laptop\"',\n '<%= config.bin %> auth create-key --name \"work proxy\" --save',\n ];\n\n static override flags = {\n name: Flags.string({ char: 'n', description: 'Name for this key', required: true }),\n save: Flags.boolean({ char: 's', description: 'Save key to ~/.config/rulemetric/env for hooks/proxy', default: true }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(AuthCreateKey);\n\n const data = await apiPost<CreateKeyResponse>('/api/auth/api-keys', { name: flags.name });\n\n this.log('');\n this.log('API key created successfully:');\n this.log('');\n this.log(` Name: ${data.name}`);\n this.log(` Key: ${data.key}`);\n this.log(` Prefix: ${data.keyPrefix}`);\n this.log('');\n this.warn('Save this key now \u2014 it will not be shown again.');\n\n if (flags.save) {\n saveApiKey(data.key, process.env.RULEMETRIC_API_URL);\n this.log('');\n this.log(`Key saved to ${path.join(getDefaultConfigDir(), 'env')} (RULEMETRIC_API_KEY)`);\n this.log('Hooks and proxy will use this key automatically.');\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA,YAAY,UAAU;AACtB,SAAS,aAAa;AAatB,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,qBAAqB,UAAU,KAAK,CAAC;AAAA,IAClF,MAAM,MAAM,QAAQ,EAAE,MAAM,KAAK,aAAa,wDAAwD,SAAS,KAAK,CAAC;AAAA,EACvH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,cAAa;AAEhD,UAAM,OAAO,MAAM,QAA2B,sBAAsB,EAAE,MAAM,MAAM,KAAK,CAAC;AAExF,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,+BAA+B;AACxC,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,aAAa,KAAK,IAAI,EAAE;AACjC,SAAK,IAAI,aAAa,KAAK,GAAG,EAAE;AAChC,SAAK,IAAI,aAAa,KAAK,SAAS,EAAE;AACtC,SAAK,IAAI,EAAE;AACX,SAAK,KAAK,sDAAiD;AAE3D,QAAI,MAAM,MAAM;AACd,iBAAW,KAAK,KAAK,QAAQ,IAAI,kBAAkB;AACnD,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,gBAAqB,UAAK,oBAAoB,GAAG,KAAK,CAAC,uBAAuB;AACvF,WAAK,IAAI,kDAAkD;AAAA,IAC7D;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureDeviceApiKey
|
|
3
|
-
} from "../../chunk-
|
|
4
|
-
import {
|
|
5
|
-
emitSetupEvent
|
|
6
|
-
} from "../../chunk-TX2HKJLA.js";
|
|
3
|
+
} from "../../chunk-EJ3YAFDP.js";
|
|
7
4
|
import {
|
|
8
5
|
BaseCommand
|
|
9
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
10
7
|
import "../../chunk-R56PH7YE.js";
|
|
8
|
+
import {
|
|
9
|
+
emitSetupEvent
|
|
10
|
+
} from "../../chunk-GQNJO2P2.js";
|
|
11
11
|
import {
|
|
12
12
|
bootstrapActiveOrg
|
|
13
|
-
} from "../../chunk-
|
|
13
|
+
} from "../../chunk-37LN5O7M.js";
|
|
14
14
|
import "../../chunk-EKJ2CABV.js";
|
|
15
15
|
import {
|
|
16
16
|
ApiError,
|
|
17
|
-
|
|
18
|
-
} from "../../chunk-
|
|
17
|
+
api
|
|
18
|
+
} from "../../chunk-ZUJBM6HE.js";
|
|
19
19
|
import {
|
|
20
20
|
saveEnvFile,
|
|
21
21
|
saveToken
|
|
@@ -54,7 +54,11 @@ var AuthLogin = class _AuthLogin extends BaseCommand {
|
|
|
54
54
|
}
|
|
55
55
|
let data;
|
|
56
56
|
try {
|
|
57
|
-
data = await
|
|
57
|
+
data = await api("/auth/login", {
|
|
58
|
+
method: "POST",
|
|
59
|
+
body: { email, password },
|
|
60
|
+
timeoutMs: 2e4
|
|
61
|
+
});
|
|
58
62
|
} catch (err) {
|
|
59
63
|
if (err instanceof ApiError && err.statusCode === 401) {
|
|
60
64
|
this.error("Invalid email or password.");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/auth/login.ts"],
|
|
4
|
-
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { saveToken, saveEnvFile } from '../../lib/auth.js';\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAetB,IAAqB,YAArB,MAAqB,mBAAkB,YAAY;AAAA,EACjD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,gBAAgB,CAAC;AAAA,IAC/D,UAAU,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,qCAAqC,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,UAAS;AAE5C,QAAI,QAAQ,MAAM;AAClB,QAAI,WAAW,MAAM;AAErB,QAAI,CAAC,SAAS,CAAC,UAAU;AAIvB,UAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,aAAK;AAAA,UACH;AAAA,QAEF;AAAA,MACF;AACA,YAAM,EAAE,OAAO,UAAU,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAE5E,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,MAC3C;AAEA,UAAI,CAAC,UAAU;AACb,mBAAW,MAAM,eAAe,EAAE,SAAS,YAAY,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;
|
|
4
|
+
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { saveToken, saveEnvFile } from '../../lib/auth.js';\nimport { api, ApiError } from '../../lib/api-client.js';\nimport { bootstrapActiveOrg } from '../../lib/active-org-refresh.js';\nimport { ensureDeviceApiKey } from '../../lib/ensure-api-key.js';\nimport { emitSetupEvent } from '../../lib/telemetry.js';\n\ninterface LoginResponse {\n accessToken: string;\n refreshToken: string;\n expiresAt: string | null;\n email: string;\n}\n\nexport default class AuthLogin extends BaseCommand {\n static override description = 'Log in to RuleMetric';\n\n static override examples = [\n '<%= config.bin %> auth login',\n '<%= config.bin %> auth login -e user@example.com',\n ];\n\n static override flags = {\n email: Flags.string({ char: 'e', description: 'Email address' }),\n password: Flags.string({ char: 'p', description: 'Password (for non-interactive use)' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(AuthLogin);\n\n let email = flags.email;\n let password = flags.password;\n\n if (!email || !password) {\n // Interactive prompts hang forever with no output in a non-TTY (CI, SSH\n // pipe, an agent driving the CLI). Fail fast with actionable guidance\n // instead of appearing to freeze.\n if (!process.stdin.isTTY) {\n this.error(\n 'Missing credentials in a non-interactive shell. Pass --email/-e and --password/-p, ' +\n 'or set RULEMETRIC_API_KEY (create a key at https://rulemetric.com/settings).',\n );\n }\n const { input, password: passwordPrompt } = await import('@inquirer/prompts');\n\n if (!email) {\n email = await input({ message: 'Email:' });\n }\n\n if (!password) {\n password = await passwordPrompt({ message: 'Password:' });\n }\n }\n\n let data: LoginResponse;\n try {\n // Bounded so the first onboarding step fails fast + retryable instead of\n // hanging for minutes on a held/502'd connection or a broken local proxy.\n data = await api<LoginResponse>('/auth/login', {\n method: 'POST',\n body: { email, password },\n timeoutMs: 20_000,\n });\n } catch (err) {\n // A 401 HERE means the email/password were rejected \u2014 not that a prior\n // session expired. base-command's generic catch maps every 401 to\n // \"Session expired. Run auth login\", which is nonsensical mid-login and\n // loops the user. Give the real reason.\n if (err instanceof ApiError && err.statusCode === 401) {\n this.error('Invalid email or password.');\n }\n throw err;\n }\n\n const expiresAt = data.expiresAt ?? new Date(Date.now() + 3600 * 1000).toISOString();\n\n saveToken({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n expiresAt,\n email: data.email,\n });\n\n saveEnvFile(data.accessToken, process.env.RULEMETRIC_API_URL);\n\n // Bootstrap the active-org cache now that auth is available. BaseCommand\n // fired the guarded refresh BEFORE login completed (no creds \u2192 401 \u2192\n // swallowed); without this explicit retry, the cache stays empty until\n // the user runs another CLI command, and any Claude Code session that\n // fires in the meantime lands with org_id = NULL.\n await bootstrapActiveOrg();\n\n // Auto-mint a hooks/proxy API key so create-key isn't a separate manual\n // step (best-effort; no-ops if a key already exists, never fails login).\n await ensureDeviceApiKey(this.log.bind(this), this.warn.bind(this), this.config.version);\n\n // Onboarding telemetry (disclosed + opt-outable) \u2014 first authenticated\n // event, so a remote install becomes visible from here on.\n void emitSetupEvent('auth_login', {}, this.config.version);\n\n this.log(`Logged in as ${data.email}`);\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAetB,IAAqB,YAArB,MAAqB,mBAAkB,YAAY;AAAA,EACjD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,gBAAgB,CAAC;AAAA,IAC/D,UAAU,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,qCAAqC,CAAC;AAAA,EACzF;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,UAAS;AAE5C,QAAI,QAAQ,MAAM;AAClB,QAAI,WAAW,MAAM;AAErB,QAAI,CAAC,SAAS,CAAC,UAAU;AAIvB,UAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,aAAK;AAAA,UACH;AAAA,QAEF;AAAA,MACF;AACA,YAAM,EAAE,OAAO,UAAU,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAE5E,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,MAC3C;AAEA,UAAI,CAAC,UAAU;AACb,mBAAW,MAAM,eAAe,EAAE,SAAS,YAAY,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AAGF,aAAO,MAAM,IAAmB,eAAe;AAAA,QAC7C,QAAQ;AAAA,QACR,MAAM,EAAE,OAAO,SAAS;AAAA,QACxB,WAAW;AAAA,MACb,CAAC;AAAA,IACH,SAAS,KAAK;AAKZ,UAAI,eAAe,YAAY,IAAI,eAAe,KAAK;AACrD,aAAK,MAAM,4BAA4B;AAAA,MACzC;AACA,YAAM;AAAA,IACR;AAEA,UAAM,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,GAAI,EAAE,YAAY;AAEnF,cAAU;AAAA,MACR,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,OAAO,KAAK;AAAA,IACd,CAAC;AAED,gBAAY,KAAK,aAAa,QAAQ,IAAI,kBAAkB;AAO5D,UAAM,mBAAmB;AAIzB,UAAM,mBAAmB,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO;AAIvF,SAAK,eAAe,cAAc,CAAC,GAAG,KAAK,OAAO,OAAO;AAEzD,SAAK,IAAI,gBAAgB,KAAK,KAAK,EAAE;AAAA,EACvC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseCommand
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
4
4
|
import "../../chunk-R56PH7YE.js";
|
|
5
|
-
import "../../chunk-
|
|
5
|
+
import "../../chunk-GQNJO2P2.js";
|
|
6
|
+
import "../../chunk-37LN5O7M.js";
|
|
6
7
|
import "../../chunk-EKJ2CABV.js";
|
|
7
|
-
import "../../chunk-
|
|
8
|
+
import "../../chunk-ZUJBM6HE.js";
|
|
8
9
|
import {
|
|
9
10
|
clearEnvFile,
|
|
10
11
|
clearToken
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/auth/logout.ts"],
|
|
4
4
|
"sourcesContent": ["import { BaseCommand } from '../../base-command.js';\nimport { clearToken, clearEnvFile } from '../../lib/auth.js';\n\nexport default class AuthLogout extends BaseCommand {\n static override description = 'Log out of RuleMetric';\n\n static override examples = ['<%= config.bin %> auth logout'];\n\n async run(): Promise<void> {\n await this.parse(AuthLogout);\n clearToken();\n clearEnvFile();\n this.log('Logged out successfully.');\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;AAGA,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW,CAAC,+BAA+B;AAAA,EAE3D,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,WAAU;AAC3B,eAAW;AACX,iBAAa;AACb,SAAK,IAAI,0BAA0B;AAAA,EACrC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseCommand
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
4
4
|
import "../../chunk-R56PH7YE.js";
|
|
5
|
-
import "../../chunk-
|
|
5
|
+
import "../../chunk-GQNJO2P2.js";
|
|
6
|
+
import "../../chunk-37LN5O7M.js";
|
|
6
7
|
import "../../chunk-EKJ2CABV.js";
|
|
7
8
|
import {
|
|
8
9
|
apiDelete
|
|
9
|
-
} from "../../chunk-
|
|
10
|
+
} from "../../chunk-ZUJBM6HE.js";
|
|
10
11
|
import "../../chunk-W2YERO7E.js";
|
|
11
12
|
import "../../chunk-NSBPE2FW.js";
|
|
12
13
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/auth/revoke-key.ts"],
|
|
4
4
|
"sourcesContent": ["import { Args } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiDelete } from '../../lib/api-client.js';\n\nexport default class AuthRevokeKey extends BaseCommand {\n static override description = 'Revoke an API key';\n\n static override examples = [\n '<%= config.bin %> auth revoke-key <key-id>',\n ];\n\n static override args = {\n id: Args.string({ description: 'API key ID to revoke', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(AuthRevokeKey);\n\n await apiDelete(`/api/auth/api-keys/${args.id}`);\n this.log(`API key ${args.id} revoked.`);\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAIrB,IAAqB,gBAArB,MAAqB,uBAAsB,YAAY;AAAA,EACrD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,wBAAwB,UAAU,KAAK,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,cAAa;AAE/C,UAAM,UAAU,sBAAsB,KAAK,EAAE,EAAE;AAC/C,SAAK,IAAI,WAAW,KAAK,EAAE,WAAW;AAAA,EACxC;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ensureDeviceApiKey
|
|
3
|
-
} from "../../chunk-
|
|
4
|
-
import {
|
|
5
|
-
emitSetupEvent
|
|
6
|
-
} from "../../chunk-TX2HKJLA.js";
|
|
3
|
+
} from "../../chunk-EJ3YAFDP.js";
|
|
7
4
|
import {
|
|
8
5
|
BaseCommand
|
|
9
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
10
7
|
import "../../chunk-R56PH7YE.js";
|
|
8
|
+
import {
|
|
9
|
+
emitSetupEvent
|
|
10
|
+
} from "../../chunk-GQNJO2P2.js";
|
|
11
11
|
import {
|
|
12
12
|
bootstrapActiveOrg
|
|
13
|
-
} from "../../chunk-
|
|
13
|
+
} from "../../chunk-37LN5O7M.js";
|
|
14
14
|
import "../../chunk-EKJ2CABV.js";
|
|
15
15
|
import {
|
|
16
16
|
ApiError,
|
|
17
|
-
|
|
18
|
-
} from "../../chunk-
|
|
17
|
+
api
|
|
18
|
+
} from "../../chunk-ZUJBM6HE.js";
|
|
19
19
|
import {
|
|
20
20
|
saveEnvFile,
|
|
21
21
|
saveToken
|
|
@@ -52,7 +52,11 @@ var AuthSignup = class _AuthSignup extends BaseCommand {
|
|
|
52
52
|
}
|
|
53
53
|
let data;
|
|
54
54
|
try {
|
|
55
|
-
data = await
|
|
55
|
+
data = await api("/auth/signup", {
|
|
56
|
+
method: "POST",
|
|
57
|
+
body: { email, password },
|
|
58
|
+
timeoutMs: 2e4
|
|
59
|
+
});
|
|
56
60
|
} catch (err) {
|
|
57
61
|
if (err instanceof ApiError && err.statusCode === 409) {
|
|
58
62
|
this.error(`An account with ${email} already exists. Run: rulemetric auth login -e ${email}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/auth/signup.ts"],
|
|
4
|
-
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { saveToken, saveEnvFile } from '../../lib/auth.js';\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAgBtB,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,gBAAgB,CAAC;AAAA,IAC/D,UAAU,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,kDAAkD,CAAC;AAAA,EACtG;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AAE7C,QAAI,QAAQ,MAAM;AAClB,QAAI,WAAW,MAAM;AAErB,QAAI,CAAC,SAAS,CAAC,UAAU;AAGvB,UAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,aAAK,MAAM,oFAAoF;AAAA,MACjG;AACA,YAAM,EAAE,OAAO,UAAU,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAE5E,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,MAC3C;AACA,UAAI,CAAC,UAAU;AACb,mBAAW,MAAM,eAAe,EAAE,SAAS,0BAA0B,CAAC;AAAA,MACxE;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;
|
|
4
|
+
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { saveToken, saveEnvFile } from '../../lib/auth.js';\nimport { api, ApiError } from '../../lib/api-client.js';\nimport { bootstrapActiveOrg } from '../../lib/active-org-refresh.js';\nimport { ensureDeviceApiKey } from '../../lib/ensure-api-key.js';\nimport { emitSetupEvent } from '../../lib/telemetry.js';\n\ninterface SignupResponse {\n confirmationRequired: boolean;\n accessToken?: string;\n refreshToken?: string;\n expiresAt?: string | null;\n email: string;\n}\n\nexport default class AuthSignup extends BaseCommand {\n static override description = 'Create a RuleMetric account from the CLI';\n\n static override examples = [\n '<%= config.bin %> auth signup',\n '<%= config.bin %> auth signup -e user@example.com',\n ];\n\n static override flags = {\n email: Flags.string({ char: 'e', description: 'Email address' }),\n password: Flags.string({ char: 'p', description: 'Password (min 8 chars; for non-interactive use)' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(AuthSignup);\n\n let email = flags.email;\n let password = flags.password;\n\n if (!email || !password) {\n // Interactive prompts hang forever with no output in a non-TTY (CI, SSH\n // pipe, an agent driving the CLI). Fail fast with actionable guidance.\n if (!process.stdin.isTTY) {\n this.error('Missing credentials in a non-interactive shell. Pass --email/-e and --password/-p.');\n }\n const { input, password: passwordPrompt } = await import('@inquirer/prompts');\n\n if (!email) {\n email = await input({ message: 'Email:' });\n }\n if (!password) {\n password = await passwordPrompt({ message: 'Password (min 8 chars):' });\n }\n }\n\n let data: SignupResponse;\n try {\n // Bounded so the first onboarding step fails fast + retryable instead of\n // hanging for minutes on a held/502'd connection or a broken local proxy.\n data = await api<SignupResponse>('/auth/signup', {\n method: 'POST',\n body: { email, password },\n timeoutMs: 20_000,\n });\n } catch (err) {\n // 409 = the email is already registered \u2014 steer to login, not a retry loop.\n if (err instanceof ApiError && err.statusCode === 409) {\n this.error(`An account with ${email} already exists. Run: rulemetric auth login -e ${email}`);\n }\n throw err;\n }\n\n // Email confirmation is ON: no session yet. Tell the user exactly what to do\n // next instead of leaving them at a dead end.\n if (data.confirmationRequired || !data.accessToken || !data.refreshToken) {\n this.log(`Account created for ${data.email}.`);\n this.log('Check your email and click the confirmation link, then run:');\n this.log(` rulemetric auth login -e ${data.email}`);\n return;\n }\n\n // Confirmation OFF: a session came back \u2014 log in immediately.\n const expiresAt = data.expiresAt ?? new Date(Date.now() + 3600 * 1000).toISOString();\n saveToken({\n accessToken: data.accessToken,\n refreshToken: data.refreshToken,\n expiresAt,\n email: data.email,\n });\n saveEnvFile(data.accessToken, process.env.RULEMETRIC_API_URL);\n\n await bootstrapActiveOrg();\n await ensureDeviceApiKey(this.log.bind(this), this.warn.bind(this), this.config.version);\n void emitSetupEvent('auth_signup', {}, this.config.version);\n\n this.log(`Signed up and logged in as ${data.email}`);\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAgBtB,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,OAAO,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,gBAAgB,CAAC;AAAA,IAC/D,UAAU,MAAM,OAAO,EAAE,MAAM,KAAK,aAAa,kDAAkD,CAAC;AAAA,EACtG;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AAE7C,QAAI,QAAQ,MAAM;AAClB,QAAI,WAAW,MAAM;AAErB,QAAI,CAAC,SAAS,CAAC,UAAU;AAGvB,UAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,aAAK,MAAM,oFAAoF;AAAA,MACjG;AACA,YAAM,EAAE,OAAO,UAAU,eAAe,IAAI,MAAM,OAAO,mBAAmB;AAE5E,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAM,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,MAC3C;AACA,UAAI,CAAC,UAAU;AACb,mBAAW,MAAM,eAAe,EAAE,SAAS,0BAA0B,CAAC;AAAA,MACxE;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AAGF,aAAO,MAAM,IAAoB,gBAAgB;AAAA,QAC/C,QAAQ;AAAA,QACR,MAAM,EAAE,OAAO,SAAS;AAAA,QACxB,WAAW;AAAA,MACb,CAAC;AAAA,IACH,SAAS,KAAK;AAEZ,UAAI,eAAe,YAAY,IAAI,eAAe,KAAK;AACrD,aAAK,MAAM,mBAAmB,KAAK,kDAAkD,KAAK,EAAE;AAAA,MAC9F;AACA,YAAM;AAAA,IACR;AAIA,QAAI,KAAK,wBAAwB,CAAC,KAAK,eAAe,CAAC,KAAK,cAAc;AACxE,WAAK,IAAI,uBAAuB,KAAK,KAAK,GAAG;AAC7C,WAAK,IAAI,6DAA6D;AACtE,WAAK,IAAI,8BAA8B,KAAK,KAAK,EAAE;AACnD;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,GAAI,EAAE,YAAY;AACnF,cAAU;AAAA,MACR,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB;AAAA,MACA,OAAO,KAAK;AAAA,IACd,CAAC;AACD,gBAAY,KAAK,aAAa,QAAQ,IAAI,kBAAkB;AAE5D,UAAM,mBAAmB;AACzB,UAAM,mBAAmB,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,OAAO;AACvF,SAAK,eAAe,eAAe,CAAC,GAAG,KAAK,OAAO,OAAO;AAE1D,SAAK,IAAI,8BAA8B,KAAK,KAAK,EAAE;AAAA,EACrD;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,11 +3,12 @@ import {
|
|
|
3
3
|
} from "../../chunk-BZDKEQKU.js";
|
|
4
4
|
import {
|
|
5
5
|
BaseCommand
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
7
7
|
import "../../chunk-R56PH7YE.js";
|
|
8
|
-
import "../../chunk-
|
|
8
|
+
import "../../chunk-GQNJO2P2.js";
|
|
9
|
+
import "../../chunk-37LN5O7M.js";
|
|
9
10
|
import "../../chunk-EKJ2CABV.js";
|
|
10
|
-
import "../../chunk-
|
|
11
|
+
import "../../chunk-ZUJBM6HE.js";
|
|
11
12
|
import {
|
|
12
13
|
getDefaultConfigDir,
|
|
13
14
|
isAuthenticated,
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/auth/status.ts"],
|
|
4
4
|
"sourcesContent": ["import { BaseCommand } from '../../base-command.js';\nimport { loadToken, isAuthenticated, getDefaultConfigDir } from '../../lib/auth.js';\nimport { formatDate } from '../../lib/output.js';\n\nexport default class AuthStatus extends BaseCommand {\n static override description = 'Show current authentication status';\n\n static override examples = ['<%= config.bin %> auth status'];\n\n async run(): Promise<void> {\n await this.parse(AuthStatus);\n const token = loadToken();\n\n if (!token) {\n this.log('Not logged in. Run `rulemetric auth login` to authenticate.');\n return;\n }\n\n if (!isAuthenticated()) {\n this.log('Session expired. Run `rulemetric auth login` to re-authenticate.');\n return;\n }\n\n this.log(`Logged in as: ${token.email}`);\n this.log(`Session expires: ${formatDate(token.expiresAt)}`);\n this.log(`Config: ${getDefaultConfigDir()}`);\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAIA,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW,CAAC,+BAA+B;AAAA,EAE3D,MAAM,MAAqB;AACzB,UAAM,KAAK,MAAM,WAAU;AAC3B,UAAM,QAAQ,UAAU;AAExB,QAAI,CAAC,OAAO;AACV,WAAK,IAAI,6DAA6D;AACtE;AAAA,IACF;AAEA,QAAI,CAAC,gBAAgB,GAAG;AACtB,WAAK,IAAI,kEAAkE;AAC3E;AAAA,IACF;AAEA,SAAK,IAAI,iBAAiB,MAAM,KAAK,EAAE;AACvC,SAAK,IAAI,oBAAoB,WAAW,MAAM,SAAS,CAAC,EAAE;AAC1D,SAAK,IAAI,WAAW,oBAAoB,CAAC,EAAE;AAAA,EAC7C;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,13 +5,14 @@ import {
|
|
|
5
5
|
} from "../../chunk-BZDKEQKU.js";
|
|
6
6
|
import {
|
|
7
7
|
BaseCommand
|
|
8
|
-
} from "../../chunk-
|
|
8
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
9
9
|
import "../../chunk-R56PH7YE.js";
|
|
10
|
-
import "../../chunk-
|
|
10
|
+
import "../../chunk-GQNJO2P2.js";
|
|
11
|
+
import "../../chunk-37LN5O7M.js";
|
|
11
12
|
import "../../chunk-EKJ2CABV.js";
|
|
12
13
|
import {
|
|
13
14
|
apiGet
|
|
14
|
-
} from "../../chunk-
|
|
15
|
+
} from "../../chunk-ZUJBM6HE.js";
|
|
15
16
|
import "../../chunk-W2YERO7E.js";
|
|
16
17
|
import "../../chunk-NSBPE2FW.js";
|
|
17
18
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/catalog/index.ts"],
|
|
4
4
|
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiGet } from '../../lib/api-client.js';\nimport { formatDate, truncate, formatScope } from '../../lib/output.js';\n\ninterface CatalogInstruction {\n id: string;\n name: string;\n scope: string;\n badge: string | null;\n tags: string[];\n version: string;\n updatedAt: string;\n}\n\nexport default class Catalog extends BaseCommand {\n static override description = 'Browse the org instruction catalog';\n\n static override flags = {\n badge: Flags.string({ description: 'Filter by badge', options: ['recommended', 'required'] }),\n scope: Flags.string({ description: 'Filter by scope', options: ['org', 'team'] }),\n search: Flags.string({ description: 'Search by name or description' }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Catalog);\n this.requireAuth();\n\n const params = new URLSearchParams();\n if (flags.badge) params.set('badge', flags.badge);\n if (flags.scope) params.set('scope', flags.scope);\n if (flags.search) params.set('search', flags.search);\n\n const results = await apiGet<CatalogInstruction[]>(`/api/catalog?${params.toString()}`);\n\n if (results.length === 0) {\n this.log('No instructions found in catalog.');\n return;\n }\n\n for (const item of results) {\n const badgeStr = item.badge ? ` [${item.badge}]` : '';\n const tags = item.tags?.length ? ` (${item.tags.join(', ')})` : '';\n this.log(` ${truncate(item.name, 40)} \u2014 ${formatScope(item.scope)}${badgeStr} v${item.version}${tags} ${formatDate(item.updatedAt)}`);\n }\n\n this.log(`\\n${results.length} instruction(s) found.`);\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAetB,IAAqB,UAArB,MAAqB,iBAAgB,YAAY;AAAA,EAC7C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,QAAQ;AAAA,IACpB,OAAO,MAAM,OAAO,EAAE,aAAa,mBAAmB,SAAS,CAAC,eAAe,UAAU,EAAE,CAAC;AAAA,IAC5F,OAAO,MAAM,OAAO,EAAE,aAAa,mBAAmB,SAAS,CAAC,OAAO,MAAM,EAAE,CAAC;AAAA,IAChF,QAAQ,MAAM,OAAO,EAAE,aAAa,gCAAgC,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,MAAqB;AACvB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,QAAO;AAC1C,SAAK,YAAY;AAEjB,UAAM,SAAS,IAAI,gBAAgB;AACnC,QAAI,MAAM,MAAO,QAAO,IAAI,SAAS,MAAM,KAAK;AAChD,QAAI,MAAM,MAAO,QAAO,IAAI,SAAS,MAAM,KAAK;AAChD,QAAI,MAAM,OAAQ,QAAO,IAAI,UAAU,MAAM,MAAM;AAEnD,UAAM,UAAU,MAAM,OAA6B,gBAAgB,OAAO,SAAS,CAAC,EAAE;AAEtF,QAAI,QAAQ,WAAW,GAAG;AACtB,WAAK,IAAI,mCAAmC;AAC5C;AAAA,IACJ;AAEA,eAAW,QAAQ,SAAS;AACxB,YAAM,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,MAAM;AACnD,YAAM,OAAO,KAAK,MAAM,SAAS,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM;AAChE,WAAK,IAAI,KAAK,SAAS,KAAK,MAAM,EAAE,CAAC,WAAM,YAAY,KAAK,KAAK,CAAC,GAAG,QAAQ,KAAK,KAAK,OAAO,GAAG,IAAI,KAAK,WAAW,KAAK,SAAS,CAAC,EAAE;AAAA,IAC1I;AAEA,SAAK,IAAI;AAAA,EAAK,QAAQ,MAAM,wBAAwB;AAAA,EACxD;AACJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseCommand
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
4
4
|
import "../../chunk-R56PH7YE.js";
|
|
5
|
-
import "../../chunk-
|
|
5
|
+
import "../../chunk-GQNJO2P2.js";
|
|
6
|
+
import "../../chunk-37LN5O7M.js";
|
|
6
7
|
import "../../chunk-EKJ2CABV.js";
|
|
7
8
|
import {
|
|
8
9
|
apiPost
|
|
9
|
-
} from "../../chunk-
|
|
10
|
+
} from "../../chunk-ZUJBM6HE.js";
|
|
10
11
|
import "../../chunk-W2YERO7E.js";
|
|
11
12
|
import "../../chunk-NSBPE2FW.js";
|
|
12
13
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/catalog/recommend.ts"],
|
|
4
4
|
"sourcesContent": ["import { Args } from '@oclif/core';\nimport { BaseCommand } from '../../base-command.js';\nimport { apiPost } from '../../lib/api-client.js';\n\ninterface RecommendationResult {\n recommendations: Array<{ instructionId: string; score: number; reason: string }>;\n error: string | null;\n}\n\nexport default class CatalogRecommend extends BaseCommand {\n static override description = 'Get AI-powered instruction recommendations for a project';\n\n static override args = {\n projectId: Args.string({ description: 'ID of the project', required: true }),\n };\n\n async run(): Promise<void> {\n const { args } = await this.parse(CatalogRecommend);\n this.requireAuth();\n\n this.log('Analyzing project and generating recommendations...\\n');\n\n const result = await apiPost<RecommendationResult>(`/api/projects/${args.projectId}/recommendations`, {});\n\n if (result.error) {\n this.warn(`Note: ${result.error}`);\n }\n\n if (result.recommendations.length === 0) {\n this.log('No recommendations found.');\n return;\n }\n\n for (const rec of result.recommendations) {\n this.log(` ${(rec.score * 100).toFixed(0)}% \u2014 ${rec.instructionId}`);\n this.log(` ${rec.reason}\\n`);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY;AASrB,IAAqB,mBAArB,MAAqB,0BAAyB,YAAY;AAAA,EACtD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,OAAO;AAAA,IACnB,WAAW,KAAK,OAAO,EAAE,aAAa,qBAAqB,UAAU,KAAK,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAM,MAAqB;AACvB,UAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAAM,iBAAgB;AAClD,SAAK,YAAY;AAEjB,SAAK,IAAI,uDAAuD;AAEhE,UAAM,SAAS,MAAM,QAA8B,iBAAiB,KAAK,SAAS,oBAAoB,CAAC,CAAC;AAExG,QAAI,OAAO,OAAO;AACd,WAAK,KAAK,SAAS,OAAO,KAAK,EAAE;AAAA,IACrC;AAEA,QAAI,OAAO,gBAAgB,WAAW,GAAG;AACrC,WAAK,IAAI,2BAA2B;AACpC;AAAA,IACJ;AAEA,eAAW,OAAO,OAAO,iBAAiB;AACtC,WAAK,IAAI,MAAM,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC,YAAO,IAAI,aAAa,EAAE;AACpE,WAAK,IAAI,UAAU,IAAI,MAAM;AAAA,CAAI;AAAA,IACrC;AAAA,EACJ;AACJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands/convert.js
CHANGED
|
@@ -3,14 +3,15 @@ import {
|
|
|
3
3
|
} from "../chunk-7NYKWN7U.js";
|
|
4
4
|
import {
|
|
5
5
|
BaseCommand
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-2HK7RGZB.js";
|
|
7
7
|
import "../chunk-R56PH7YE.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-GQNJO2P2.js";
|
|
9
|
+
import "../chunk-37LN5O7M.js";
|
|
9
10
|
import "../chunk-EKJ2CABV.js";
|
|
10
11
|
import {
|
|
11
12
|
DEFAULT_API_URL,
|
|
12
13
|
apiPost
|
|
13
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-ZUJBM6HE.js";
|
|
14
15
|
import "../chunk-W2YERO7E.js";
|
|
15
16
|
import "../chunk-NSBPE2FW.js";
|
|
16
17
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/convert.ts"],
|
|
4
4
|
"sourcesContent": ["import * as fs from 'node:fs';\nimport { Args, Flags } from '@oclif/core';\nimport { BaseCommand } from '../base-command.js';\nimport { apiPost, DEFAULT_API_URL } from '../lib/api-client.js';\nimport { validateUuid } from '../lib/types.js';\nimport type { ConvertResult } from '../lib/types.js';\n\nexport default class Convert extends BaseCommand {\n static override description = 'Convert an instruction to a target format';\n\n static override examples = [\n '<%= config.bin %> convert <id> --format claude-md',\n '<%= config.bin %> convert <id> -f cursorrules --score',\n '<%= config.bin %> convert <id> -f copilot -o .github/copilot-instructions.md',\n ];\n\n static override args = {\n id: Args.string({ description: 'Instruction ID', required: true }),\n };\n\n static override flags = {\n format: Flags.string({\n char: 'f',\n description: 'Target format (e.g., claude-md, cursorrules)',\n required: true,\n }),\n score: Flags.boolean({\n description: 'Include quality score',\n default: false,\n }),\n output: Flags.string({\n char: 'o',\n description: 'Write output to file',\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Convert);\n this.requireAuth();\n validateUuid(args.id, 'instruction ID');\n\n const url = new URL(`${process.env.RULEMETRIC_API_URL ?? DEFAULT_API_URL}/api/instructions/${encodeURIComponent(args.id)}/convert`);\n url.searchParams.set('format', flags.format);\n url.searchParams.set('score', String(flags.score));\n\n const result = await apiPost<ConvertResult>(\n `${url.pathname}${url.search}`,\n {},\n );\n\n if (flags.output) {\n fs.writeFileSync(flags.output, result.output, 'utf-8');\n this.log(`Written to ${flags.output}`);\n } else {\n this.log(result.output);\n }\n\n if (flags.score && result.score) {\n this.log('');\n this.log(`Quality Score: ${result.score.overall}/100`);\n }\n\n if (result.warnings.length > 0) {\n this.warn(`Warnings: ${result.warnings.join(', ')}`);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,SAAS,MAAM,aAAa;AAM5B,IAAqB,UAArB,MAAqB,iBAAgB,YAAY;AAAA,EAC/C,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,OAAO;AAAA,IACrB,IAAI,KAAK,OAAO,EAAE,aAAa,kBAAkB,UAAU,KAAK,CAAC;AAAA,EACnE;AAAA,EAEA,OAAgB,QAAQ;AAAA,IACtB,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,OAAO,MAAM,QAAQ;AAAA,MACnB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,QAAO;AAChD,SAAK,YAAY;AACjB,iBAAa,KAAK,IAAI,gBAAgB;AAEtC,UAAM,MAAM,IAAI,IAAI,GAAG,QAAQ,IAAI,sBAAsB,eAAe,qBAAqB,mBAAmB,KAAK,EAAE,CAAC,UAAU;AAClI,QAAI,aAAa,IAAI,UAAU,MAAM,MAAM;AAC3C,QAAI,aAAa,IAAI,SAAS,OAAO,MAAM,KAAK,CAAC;AAEjD,UAAM,SAAS,MAAM;AAAA,MACnB,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,QAAI,MAAM,QAAQ;AAChB,MAAG,iBAAc,MAAM,QAAQ,OAAO,QAAQ,OAAO;AACrD,WAAK,IAAI,cAAc,MAAM,MAAM,EAAE;AAAA,IACvC,OAAO;AACL,WAAK,IAAI,OAAO,MAAM;AAAA,IACxB;AAEA,QAAI,MAAM,SAAS,OAAO,OAAO;AAC/B,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,kBAAkB,OAAO,MAAM,OAAO,MAAM;AAAA,IACvD;AAEA,QAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,WAAK,KAAK,aAAa,OAAO,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,IACrD;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseCommand
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-2HK7RGZB.js";
|
|
4
4
|
import "../chunk-R56PH7YE.js";
|
|
5
|
-
import "../chunk-
|
|
5
|
+
import "../chunk-GQNJO2P2.js";
|
|
6
|
+
import "../chunk-37LN5O7M.js";
|
|
6
7
|
import "../chunk-EKJ2CABV.js";
|
|
7
8
|
import {
|
|
8
9
|
apiGet
|
|
9
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-ZUJBM6HE.js";
|
|
10
11
|
import "../chunk-W2YERO7E.js";
|
|
11
12
|
import "../chunk-NSBPE2FW.js";
|
|
12
13
|
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/converters.ts"],
|
|
4
4
|
"sourcesContent": ["import { Flags } from '@oclif/core';\nimport { printTable } from '@oclif/table';\nimport { BaseCommand } from '../base-command.js';\nimport { apiGet } from '../lib/api-client.js';\nimport type { ConverterEntry } from '../lib/types.js';\n\nexport default class Converters extends BaseCommand {\n static override description = 'List all supported conversion formats';\n\n static override examples = [\n '<%= config.bin %> converters',\n '<%= config.bin %> converters --tier 1',\n ];\n\n static override enableJsonFlag = true;\n\n static override flags = {\n tier: Flags.string({\n char: 't',\n description: 'Filter by tier',\n options: ['1', '2', '3'],\n }),\n };\n\n async run(): Promise<ConverterEntry[]> {\n const { flags } = await this.parse(Converters);\n this.requireAuth();\n\n let entries = await apiGet<ConverterEntry[]>('/api/converters');\n\n if (flags.tier) {\n const tierNum = Number.parseInt(flags.tier, 10);\n entries = entries.filter((e) => e.tier === tierNum);\n }\n\n printTable({\n data: entries.map((e) => ({\n ID: e.id,\n Name: e.name,\n Tier: String(e.tier),\n 'Output Path': e.outputPath,\n })),\n columns: ['ID', 'Name', 'Tier', 'Output Path'],\n });\n\n return entries;\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAK3B,IAAqB,aAArB,MAAqB,oBAAmB,YAAY;AAAA,EAClD,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAgB,iBAAiB;AAAA,EAEjC,OAAgB,QAAQ;AAAA,IACtB,MAAM,MAAM,OAAO;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,CAAC,KAAK,KAAK,GAAG;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAiC;AACrC,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,WAAU;AAC7C,SAAK,YAAY;AAEjB,QAAI,UAAU,MAAM,OAAyB,iBAAiB;AAE9D,QAAI,MAAM,MAAM;AACd,YAAM,UAAU,OAAO,SAAS,MAAM,MAAM,EAAE;AAC9C,gBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,IACpD;AAEA,eAAW;AAAA,MACT,MAAM,QAAQ,IAAI,CAAC,OAAO;AAAA,QACxB,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,MAAM,OAAO,EAAE,IAAI;AAAA,QACnB,eAAe,EAAE;AAAA,MACnB,EAAE;AAAA,MACF,SAAS,CAAC,MAAM,QAAQ,QAAQ,aAAa;AAAA,IAC/C,CAAC;AAED,WAAO;AAAA,EACT;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,11 +3,12 @@ import {
|
|
|
3
3
|
} from "../../chunk-JFDWKLQC.js";
|
|
4
4
|
import {
|
|
5
5
|
BaseCommand
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-2HK7RGZB.js";
|
|
7
7
|
import "../../chunk-R56PH7YE.js";
|
|
8
|
-
import "../../chunk-
|
|
8
|
+
import "../../chunk-GQNJO2P2.js";
|
|
9
|
+
import "../../chunk-37LN5O7M.js";
|
|
9
10
|
import "../../chunk-EKJ2CABV.js";
|
|
10
|
-
import "../../chunk-
|
|
11
|
+
import "../../chunk-ZUJBM6HE.js";
|
|
11
12
|
import "../../chunk-W2YERO7E.js";
|
|
12
13
|
import "../../chunk-NSBPE2FW.js";
|
|
13
14
|
|