@rulemetric/cli 0.5.3 → 0.5.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.
Files changed (142) hide show
  1. package/bin/dev.js +7 -0
  2. package/dist/base-command.js +4 -4
  3. package/dist/{chunk-7DRLX3DN.js → chunk-3POYC5NA.js} +3 -3
  4. package/dist/{chunk-TJ2M5QVL.js → chunk-3QH73QOQ.js} +2 -2
  5. package/dist/{chunk-CXWY5XKD.js → chunk-4LHEN2FS.js} +8 -8
  6. package/dist/{chunk-CROYS75W.js → chunk-7K4ILWS7.js} +3 -3
  7. package/dist/{chunk-TDTHAOXO.js → chunk-DR5WLIOU.js} +2 -2
  8. package/dist/{chunk-T76YQCKX.js → chunk-IATQXFJA.js} +2 -2
  9. package/dist/{chunk-AUUHXCJU.js → chunk-JEJ3J5J6.js} +2 -2
  10. package/dist/{chunk-OAQG5WBV.js → chunk-LAKZUE35.js} +2 -2
  11. package/dist/{chunk-346TGPVR.js → chunk-LTT2YMYY.js} +2 -2
  12. package/dist/{chunk-CCSR73HF.js → chunk-N5A2IQAK.js} +2 -2
  13. package/dist/{chunk-VCG4Q53B.js → chunk-OTOWLUOJ.js} +2 -2
  14. package/dist/{chunk-OKCFYPIQ.js → chunk-RCMXTLQF.js} +2 -2
  15. package/dist/{chunk-CGUV6TUA.js → chunk-RUCSRN7F.js} +2 -2
  16. package/dist/{chunk-4UJATBTG.js → chunk-SLL3OBKN.js} +4 -4
  17. package/dist/{chunk-CB43W53J.js → chunk-SZ7VDCD6.js} +3 -3
  18. package/dist/{chunk-N52AHNBH.js → chunk-W4MZXKZ2.js} +6 -2
  19. package/dist/chunk-W4MZXKZ2.js.map +7 -0
  20. package/dist/{chunk-KHJUQFIK.js → chunk-YSEQWCN4.js} +2 -2
  21. package/dist/{chunk-CWFVBGX2.js → chunk-ZRLYHBPN.js} +4 -2
  22. package/dist/chunk-ZRLYHBPN.js.map +7 -0
  23. package/dist/{chunk-ER5DPPHB.js → chunk-ZSGKRCKD.js} +6 -3
  24. package/dist/chunk-ZSGKRCKD.js.map +7 -0
  25. package/dist/commands/antigravity/backfill.js +5 -5
  26. package/dist/commands/auth/create-key.js +4 -4
  27. package/dist/commands/auth/login.js +4 -4
  28. package/dist/commands/auth/logout.js +4 -4
  29. package/dist/commands/auth/revoke-key.js +4 -4
  30. package/dist/commands/auth/status.js +4 -4
  31. package/dist/commands/catalog/index.js +4 -4
  32. package/dist/commands/catalog/recommend.js +4 -4
  33. package/dist/commands/convert.js +6 -5
  34. package/dist/commands/convert.js.map +2 -2
  35. package/dist/commands/converters.js +4 -4
  36. package/dist/commands/crons/list.js +4 -4
  37. package/dist/commands/crons/run.js +4 -4
  38. package/dist/commands/dashboard.js +4 -4
  39. package/dist/commands/eval-targets/create.js +4 -4
  40. package/dist/commands/eval-targets/list.js +4 -4
  41. package/dist/commands/evals/agent.js +12 -12
  42. package/dist/commands/evals/benchmark.js +5 -5
  43. package/dist/commands/evals/compare.js +4 -4
  44. package/dist/commands/evals/create.js +4 -4
  45. package/dist/commands/evals/optimize-description.js +4 -4
  46. package/dist/commands/evals/optimize.js +4 -4
  47. package/dist/commands/evals/run.js +4 -4
  48. package/dist/commands/gateway/ensure.js +4 -4
  49. package/dist/commands/hooks/install.js +4 -4
  50. package/dist/commands/hooks/run.js +4 -4
  51. package/dist/commands/hooks/uninstall.js +4 -4
  52. package/dist/commands/import.js +4 -4
  53. package/dist/commands/instructions/create.js +4 -4
  54. package/dist/commands/instructions/delete.js +4 -4
  55. package/dist/commands/instructions/fork.js +4 -4
  56. package/dist/commands/instructions/get.js +4 -4
  57. package/dist/commands/instructions/list.js +4 -4
  58. package/dist/commands/instructions/promote.js +4 -4
  59. package/dist/commands/instructions/pull.js +4 -4
  60. package/dist/commands/instructions/upstream.js +4 -4
  61. package/dist/commands/instructions/versions.js +4 -4
  62. package/dist/commands/launcher.js +4 -4
  63. package/dist/commands/org/current.js +9 -9
  64. package/dist/commands/org/list.js +6 -6
  65. package/dist/commands/org/switch.js +7 -7
  66. package/dist/commands/packs/add-instruction.js +4 -4
  67. package/dist/commands/packs/apply.js +4 -4
  68. package/dist/commands/packs/create.js +4 -4
  69. package/dist/commands/packs/fork.js +4 -4
  70. package/dist/commands/packs/get.js +4 -4
  71. package/dist/commands/packs/list.js +4 -4
  72. package/dist/commands/packs/remove-instruction.js +4 -4
  73. package/dist/commands/proxy/env.js +4 -4
  74. package/dist/commands/proxy/logs.js +4 -4
  75. package/dist/commands/proxy/restart.js +4 -4
  76. package/dist/commands/proxy/setup.js +4 -4
  77. package/dist/commands/proxy/start.js +4 -4
  78. package/dist/commands/proxy/status.js +4 -4
  79. package/dist/commands/proxy/stop.js +4 -4
  80. package/dist/commands/research/backfill.js +5 -5
  81. package/dist/commands/research/tail-transcript.js +5 -5
  82. package/dist/commands/service/install.js +4 -4
  83. package/dist/commands/service/status.js +4 -4
  84. package/dist/commands/service/uninstall.js +4 -4
  85. package/dist/commands/sessions/analyze.js +4 -4
  86. package/dist/commands/sessions/end.js +4 -4
  87. package/dist/commands/sessions/import.js +4 -4
  88. package/dist/commands/sessions/list.js +4 -4
  89. package/dist/commands/sessions/start.js +6 -6
  90. package/dist/commands/setup.js +5 -5
  91. package/dist/commands/skills/export-approved.js +4 -4
  92. package/dist/commands/skills/install.js +4 -4
  93. package/dist/commands/skills/list.js +4 -4
  94. package/dist/commands/skills/publish.js +4 -4
  95. package/dist/commands/skills/search.js +4 -4
  96. package/dist/commands/skills/update.js +4 -4
  97. package/dist/commands/suggestions/accept.js +4 -4
  98. package/dist/commands/suggestions/dismiss.js +4 -4
  99. package/dist/commands/suggestions/list.js +4 -4
  100. package/dist/commands/suggestions/refresh.js +4 -4
  101. package/dist/dashboard/Dashboard.js +6 -4
  102. package/dist/dashboard/Dashboard.js.map +1 -1
  103. package/dist/dashboard/data.js +3 -1
  104. package/dist/dashboard/launcher/LauncherOverlay.js +5 -3
  105. package/dist/dashboard/launcher/api.js +3 -1
  106. package/dist/dashboard/launcher/useLaunchJobs.js +4 -2
  107. package/dist/lib/active-org-refresh.js +3 -3
  108. package/dist/lib/agent-loop.js +9 -9
  109. package/dist/lib/antigravity-transcript.js +2 -2
  110. package/dist/lib/api-client.js +3 -1
  111. package/dist/lib/eval-benchmark.js +2 -2
  112. package/dist/lib/eval-conversation-handler.js +2 -2
  113. package/dist/lib/handlers/cron-suggest-instructions.js +2 -2
  114. package/dist/lib/handlers/process-conversation.js +3 -3
  115. package/dist/lib/handlers/process-eval.js +2 -2
  116. package/dist/lib/handlers/process-insights.js +2 -2
  117. package/dist/lib/handlers/process-launch.js +2 -2
  118. package/dist/lib/manual-tasks.js +2 -2
  119. package/dist/lib/research-client.js +2 -2
  120. package/dist/lib/setup-steps.js +2 -2
  121. package/dist/lib/terminal-target-heartbeat.js +2 -2
  122. package/oclif.manifest.json +1 -1
  123. package/package.json +4 -4
  124. package/dist/chunk-CWFVBGX2.js.map +0 -7
  125. package/dist/chunk-ER5DPPHB.js.map +0 -7
  126. package/dist/chunk-N52AHNBH.js.map +0 -7
  127. /package/dist/{chunk-7DRLX3DN.js.map → chunk-3POYC5NA.js.map} +0 -0
  128. /package/dist/{chunk-TJ2M5QVL.js.map → chunk-3QH73QOQ.js.map} +0 -0
  129. /package/dist/{chunk-CXWY5XKD.js.map → chunk-4LHEN2FS.js.map} +0 -0
  130. /package/dist/{chunk-CROYS75W.js.map → chunk-7K4ILWS7.js.map} +0 -0
  131. /package/dist/{chunk-TDTHAOXO.js.map → chunk-DR5WLIOU.js.map} +0 -0
  132. /package/dist/{chunk-T76YQCKX.js.map → chunk-IATQXFJA.js.map} +0 -0
  133. /package/dist/{chunk-AUUHXCJU.js.map → chunk-JEJ3J5J6.js.map} +0 -0
  134. /package/dist/{chunk-OAQG5WBV.js.map → chunk-LAKZUE35.js.map} +0 -0
  135. /package/dist/{chunk-346TGPVR.js.map → chunk-LTT2YMYY.js.map} +0 -0
  136. /package/dist/{chunk-CCSR73HF.js.map → chunk-N5A2IQAK.js.map} +0 -0
  137. /package/dist/{chunk-VCG4Q53B.js.map → chunk-OTOWLUOJ.js.map} +0 -0
  138. /package/dist/{chunk-OKCFYPIQ.js.map → chunk-RCMXTLQF.js.map} +0 -0
  139. /package/dist/{chunk-CGUV6TUA.js.map → chunk-RUCSRN7F.js.map} +0 -0
  140. /package/dist/{chunk-4UJATBTG.js.map → chunk-SLL3OBKN.js.map} +0 -0
  141. /package/dist/{chunk-CB43W53J.js.map → chunk-SZ7VDCD6.js.map} +0 -0
  142. /package/dist/{chunk-KHJUQFIK.js.map → chunk-YSEQWCN4.js.map} +0 -0
@@ -3,12 +3,12 @@ import {
3
3
  } from "../../chunk-4BHDHHKL.js";
4
4
  import {
5
5
  BaseCommand
6
- } from "../../chunk-CB43W53J.js";
6
+ } from "../../chunk-SZ7VDCD6.js";
7
7
  import "../../chunk-R56PH7YE.js";
8
- import "../../chunk-4UJATBTG.js";
9
- import "../../chunk-CWFVBGX2.js";
10
- import "../../chunk-W2YERO7E.js";
8
+ import "../../chunk-SLL3OBKN.js";
11
9
  import "../../chunk-EKJ2CABV.js";
10
+ import "../../chunk-ZRLYHBPN.js";
11
+ import "../../chunk-W2YERO7E.js";
12
12
  import "../../chunk-NSBPE2FW.js";
13
13
 
14
14
  // src/commands/skills/search.ts
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-CB43W53J.js";
3
+ } from "../../chunk-SZ7VDCD6.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-4UJATBTG.js";
6
- import "../../chunk-CWFVBGX2.js";
7
- import "../../chunk-W2YERO7E.js";
5
+ import "../../chunk-SLL3OBKN.js";
8
6
  import "../../chunk-EKJ2CABV.js";
7
+ import "../../chunk-ZRLYHBPN.js";
8
+ import "../../chunk-W2YERO7E.js";
9
9
  import "../../chunk-NSBPE2FW.js";
10
10
 
11
11
  // src/commands/skills/update.ts
@@ -6,15 +6,15 @@ import {
6
6
  } from "../../chunk-7NYKWN7U.js";
7
7
  import {
8
8
  BaseCommand
9
- } from "../../chunk-CB43W53J.js";
9
+ } from "../../chunk-SZ7VDCD6.js";
10
10
  import "../../chunk-R56PH7YE.js";
11
- import "../../chunk-4UJATBTG.js";
11
+ import "../../chunk-SLL3OBKN.js";
12
+ import "../../chunk-EKJ2CABV.js";
12
13
  import {
13
14
  apiGet,
14
15
  apiPost
15
- } from "../../chunk-CWFVBGX2.js";
16
+ } from "../../chunk-ZRLYHBPN.js";
16
17
  import "../../chunk-W2YERO7E.js";
17
- import "../../chunk-EKJ2CABV.js";
18
18
  import "../../chunk-NSBPE2FW.js";
19
19
 
20
20
  // src/commands/suggestions/accept.ts
@@ -6,14 +6,14 @@ import {
6
6
  } from "../../chunk-7NYKWN7U.js";
7
7
  import {
8
8
  BaseCommand
9
- } from "../../chunk-CB43W53J.js";
9
+ } from "../../chunk-SZ7VDCD6.js";
10
10
  import "../../chunk-R56PH7YE.js";
11
- import "../../chunk-4UJATBTG.js";
11
+ import "../../chunk-SLL3OBKN.js";
12
+ import "../../chunk-EKJ2CABV.js";
12
13
  import {
13
14
  apiPost
14
- } from "../../chunk-CWFVBGX2.js";
15
+ } from "../../chunk-ZRLYHBPN.js";
15
16
  import "../../chunk-W2YERO7E.js";
16
- import "../../chunk-EKJ2CABV.js";
17
17
  import "../../chunk-NSBPE2FW.js";
18
18
 
19
19
  // src/commands/suggestions/dismiss.ts
@@ -3,14 +3,14 @@ import {
3
3
  } from "../../chunk-EKP32DLN.js";
4
4
  import {
5
5
  BaseCommand
6
- } from "../../chunk-CB43W53J.js";
6
+ } from "../../chunk-SZ7VDCD6.js";
7
7
  import "../../chunk-R56PH7YE.js";
8
- import "../../chunk-4UJATBTG.js";
8
+ import "../../chunk-SLL3OBKN.js";
9
+ import "../../chunk-EKJ2CABV.js";
9
10
  import {
10
11
  apiGet
11
- } from "../../chunk-CWFVBGX2.js";
12
+ } from "../../chunk-ZRLYHBPN.js";
12
13
  import "../../chunk-W2YERO7E.js";
13
- import "../../chunk-EKJ2CABV.js";
14
14
  import "../../chunk-NSBPE2FW.js";
15
15
 
16
16
  // src/commands/suggestions/list.ts
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  BaseCommand
3
- } from "../../chunk-CB43W53J.js";
3
+ } from "../../chunk-SZ7VDCD6.js";
4
4
  import "../../chunk-R56PH7YE.js";
5
- import "../../chunk-4UJATBTG.js";
6
- import "../../chunk-CWFVBGX2.js";
7
- import "../../chunk-W2YERO7E.js";
5
+ import "../../chunk-SLL3OBKN.js";
8
6
  import "../../chunk-EKJ2CABV.js";
7
+ import "../../chunk-ZRLYHBPN.js";
8
+ import "../../chunk-W2YERO7E.js";
9
9
  import "../../chunk-NSBPE2FW.js";
10
10
 
11
11
  // src/commands/suggestions/refresh.ts
@@ -9,10 +9,10 @@ import {
9
9
  } from "../chunk-IJGF2ETG.js";
10
10
  import {
11
11
  LauncherOverlay
12
- } from "../chunk-CROYS75W.js";
12
+ } from "../chunk-7K4ILWS7.js";
13
13
  import "../chunk-DTFXCHHI.js";
14
- import "../chunk-KHJUQFIK.js";
15
- import "../chunk-N52AHNBH.js";
14
+ import "../chunk-YSEQWCN4.js";
15
+ import "../chunk-W4MZXKZ2.js";
16
16
  import {
17
17
  FrictionPanel
18
18
  } from "../chunk-XC6M4CSW.js";
@@ -24,7 +24,7 @@ import {
24
24
  loadApiInsights,
25
25
  loadLinkedInstructions,
26
26
  loadLocalStats
27
- } from "../chunk-ER5DPPHB.js";
27
+ } from "../chunk-ZSGKRCKD.js";
28
28
  import "../chunk-QD6X4L4L.js";
29
29
  import "../chunk-RH7NHVSK.js";
30
30
  import {
@@ -37,6 +37,8 @@ import "../chunk-F5N6CLJJ.js";
37
37
  import {
38
38
  readActiveOrg
39
39
  } from "../chunk-EKJ2CABV.js";
40
+ import "../chunk-ZRLYHBPN.js";
41
+ import "../chunk-W2YERO7E.js";
40
42
  import "../chunk-NSBPE2FW.js";
41
43
 
42
44
  // src/dashboard/Dashboard.tsx
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/dashboard/Dashboard.tsx"],
4
4
  "sourcesContent": ["import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { render, Box, Text, useInput, useApp } from 'ink';\nimport { ORANGE, DIM, PERIODS, PERIOD_LABELS } from './types.js';\nimport type { Period, LocalStats, ApiInsights } from './types.js';\nimport { loadLocalStats, loadApiInsights, loadLinkedInstructions } from './data.js';\nimport { Overview } from './panels/overview.js';\nimport { OutcomesPanel } from './panels/outcomes.js';\nimport { FrictionPanel } from './panels/friction.js';\nimport { InstructionsPanel } from './panels/instructions.js';\nimport { InsightsPanel } from './panels/insights.js';\nimport { LauncherOverlay } from './launcher/LauncherOverlay.js';\nimport { readActiveOrg } from '../lib/active-org.js';\n\nconst MIN_WIDE = 90;\n\ntype Layout = { dashWidth: number; wide: boolean; halfWidth: number; barWidth: number };\n\nfunction getLayout(): Layout {\n const termWidth = process.stdout.columns || 80;\n const dashWidth = Math.min(160, termWidth);\n const wide = dashWidth >= MIN_WIDE;\n const halfWidth = wide ? Math.floor(dashWidth / 2) : dashWidth;\n const barWidth = Math.max(6, Math.min(10, halfWidth - 34));\n return { dashWidth, wide, halfWidth, barWidth };\n}\n\nfunction PeriodTabs({ active, providerName }: { active: Period; providerName?: string }) {\n return (\n <Box justifyContent=\"space-between\" paddingX={1}>\n <Box gap={1}>\n {PERIODS.map(p => (\n <Text key={p} bold={active === p} color={active === p ? ORANGE : DIM}>\n {active === p ? `[ ${PERIOD_LABELS[p]} ]` : ` ${PERIOD_LABELS[p]} `}\n </Text>\n ))}\n </Box>\n {providerName && (\n <Text color={ORANGE} bold>{providerName}</Text>\n )}\n </Box>\n );\n}\n\nfunction StatusBar({ width, insightsFocused = false }: { width: number; insightsFocused?: boolean }) {\n return (\n <Box borderStyle=\"round\" borderColor={DIM} width={width} justifyContent=\"center\" paddingX={1}>\n <Text>\n <Text color={ORANGE} bold>{'<'}</Text><Text color={ORANGE}>{'>'}</Text><Text dimColor> switch </Text>\n <Text color={ORANGE} bold>q</Text><Text dimColor> quit </Text>\n <Text color={ORANGE} bold>s</Text><Text dimColor> {insightsFocused ? 'back' : 'suggestions'} </Text>\n <Text color={ORANGE} bold>1</Text><Text dimColor>-</Text><Text color={ORANGE} bold>5</Text><Text dimColor> period </Text>\n <Text color={ORANGE} bold>r</Text><Text dimColor> refresh </Text>\n <Text color={ORANGE} bold>n</Text><Text dimColor> new session </Text>\n <Text color={ORANGE} bold>l</Text><Text dimColor> launcher</Text>\n </Text>\n </Box>\n );\n}\n\nfunction Row({ wide, width, children }: { wide: boolean; width: number; children: React.ReactNode }) {\n if (wide) return <Box width={width}>{children}</Box>;\n return <>{children}</>;\n}\n\nfunction InteractiveDashboard({ initialLocal, initialApi, initialInstructions, initialPeriod, initialLauncherFocused = false }: {\n initialLocal: LocalStats;\n initialApi: ApiInsights | null;\n initialInstructions: Array<{ name: string; linkedSessions: number }> | null;\n initialPeriod: Period;\n initialLauncherFocused?: boolean;\n}) {\n const { exit } = useApp();\n const [period, setPeriod] = useState<Period>(initialPeriod);\n const [local, setLocal] = useState(initialLocal);\n const [api, setApi] = useState(initialApi);\n const [instructions, setInstructions] = useState(initialInstructions);\n const [loading, setLoading] = useState(false);\n const [insightsFocused, setInsightsFocused] = useState(false);\n const [launcherFocused, setLauncherFocused] = useState(initialLauncherFocused);\n const activeOrgSlug = readActiveOrg()?.orgSlug ?? null;\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const layout = getLayout();\n\n const reload = useCallback(async () => {\n setLoading(true);\n const [newLocal, newApi, newInstructions] = await Promise.all([\n loadLocalStats(),\n loadApiInsights(),\n loadLinkedInstructions(),\n ]);\n setLocal(newLocal);\n setApi(newApi);\n setInstructions(newInstructions);\n setLoading(false);\n }, []);\n\n // Auto-refresh every 30s\n useEffect(() => {\n const id = setInterval(reload, 30_000);\n return () => clearInterval(id);\n }, [reload]);\n\n const switchPeriod = useCallback((np: Period) => {\n if (np === period) return;\n setPeriod(np);\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(reload, 300);\n }, [period, reload]);\n\n useInput((input, key) => {\n if (launcherFocused) return;\n if (input === 'q') {\n if (insightsFocused) { setInsightsFocused(false); return; }\n exit();\n return;\n }\n if (input === 's') { setInsightsFocused(f => !f); return; }\n if (key.escape && insightsFocused) { setInsightsFocused(false); return; }\n if (input === 'l' && !insightsFocused) { setLauncherFocused(true); return; }\n // When insights is focused, let it handle up/down/enter\n if (insightsFocused) return;\n if (input === 'r') { reload(); return; }\n if (input === 'n') {\n import('@rulemetric/session').then(({ getLauncher }) => {\n getLauncher('claude_code').launch({ projectPath: process.cwd(), mode: 'interactive' });\n });\n return;\n }\n const idx = PERIODS.indexOf(period);\n if (key.leftArrow) switchPeriod(PERIODS[(idx - 1 + PERIODS.length) % PERIODS.length]);\n else if (key.rightArrow || key.tab) switchPeriod(PERIODS[(idx + 1) % PERIODS.length]);\n else if (input === '1') switchPeriod('today');\n else if (input === '2') switchPeriod('week');\n else if (input === '3') switchPeriod('30days');\n else if (input === '4') switchPeriod('month');\n else if (input === '5') switchPeriod('all');\n });\n\n const { dashWidth, wide, halfWidth, barWidth } = layout;\n const pw = wide ? halfWidth : dashWidth;\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" width={dashWidth}>\n <PeriodTabs active={period} />\n <Box borderStyle=\"round\" borderColor={ORANGE} paddingX={1} width={dashWidth}>\n <Text dimColor>Loading {PERIOD_LABELS[period]}...</Text>\n </Box>\n <StatusBar width={dashWidth} />\n </Box>\n );\n }\n\n if (launcherFocused) {\n return (\n <Box flexDirection=\"column\" width={dashWidth}>\n <LauncherOverlay\n onClose={() => setLauncherFocused(false)}\n activeOrg={activeOrgSlug}\n defaultProjectPath={process.cwd()}\n width={dashWidth}\n />\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" width={dashWidth}>\n <PeriodTabs active={period} />\n <Overview local={local} api={api} label={PERIOD_LABELS[period]} width={dashWidth} />\n <Row wide={wide} width={dashWidth}>\n <OutcomesPanel api={api} width={pw} barWidth={barWidth} />\n <FrictionPanel api={api} width={pw} barWidth={barWidth} />\n </Row>\n <InstructionsPanel instructions={instructions} width={dashWidth} barWidth={barWidth} />\n <InsightsPanel api={api} width={dashWidth} focused={insightsFocused} />\n <StatusBar width={dashWidth} insightsFocused={insightsFocused} />\n </Box>\n );\n}\n\nexport async function renderDashboard(\n period: Period = 'week',\n options: { openLauncher?: boolean } = {},\n): Promise<void> {\n // Load data in parallel \u2014 local files + API\n const [local, api, instructions] = await Promise.all([\n loadLocalStats(),\n loadApiInsights(),\n loadLinkedInstructions(),\n ]);\n\n const isTTY = process.stdin.isTTY && process.stdout.isTTY;\n if (isTTY) {\n const { waitUntilExit } = render(\n <InteractiveDashboard\n initialLocal={local}\n initialApi={api}\n initialInstructions={instructions}\n initialPeriod={period}\n initialLauncherFocused={options.openLauncher ?? false}\n />,\n );\n await waitUntilExit();\n } else {\n // Non-interactive: render once and exit\n const layout = getLayout();\n const { unmount } = render(\n <Box flexDirection=\"column\" width={layout.dashWidth}>\n <Overview local={local} api={api} label={PERIOD_LABELS[period]} width={layout.dashWidth} />\n <OutcomesPanel api={api} width={layout.dashWidth} barWidth={layout.barWidth} />\n <FrictionPanel api={api} width={layout.dashWidth} barWidth={layout.barWidth} />\n <InstructionsPanel instructions={instructions} width={layout.dashWidth} barWidth={layout.barWidth} />\n <InsightsPanel api={api} width={layout.dashWidth} />\n </Box>,\n { patchConsole: false },\n );\n unmount();\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,8 +2,10 @@ import {
2
2
  loadApiInsights,
3
3
  loadLinkedInstructions,
4
4
  loadLocalStats
5
- } from "../chunk-ER5DPPHB.js";
5
+ } from "../chunk-ZSGKRCKD.js";
6
6
  import "../chunk-F5N6CLJJ.js";
7
+ import "../chunk-ZRLYHBPN.js";
8
+ import "../chunk-W2YERO7E.js";
7
9
  import "../chunk-NSBPE2FW.js";
8
10
  export {
9
11
  loadApiInsights,
@@ -1,12 +1,14 @@
1
1
  import {
2
2
  LauncherOverlay
3
- } from "../../chunk-CROYS75W.js";
3
+ } from "../../chunk-7K4ILWS7.js";
4
4
  import "../../chunk-DTFXCHHI.js";
5
- import "../../chunk-KHJUQFIK.js";
6
- import "../../chunk-N52AHNBH.js";
5
+ import "../../chunk-YSEQWCN4.js";
6
+ import "../../chunk-W4MZXKZ2.js";
7
7
  import "../../chunk-QD6X4L4L.js";
8
8
  import "../../chunk-RH7NHVSK.js";
9
9
  import "../../chunk-QJQS6TUN.js";
10
+ import "../../chunk-ZRLYHBPN.js";
11
+ import "../../chunk-W2YERO7E.js";
10
12
  import "../../chunk-NSBPE2FW.js";
11
13
  export {
12
14
  LauncherOverlay
@@ -3,7 +3,9 @@ import {
3
3
  createLaunchJob,
4
4
  fetchLaunchJobs,
5
5
  listLaunchers
6
- } from "../../chunk-N52AHNBH.js";
6
+ } from "../../chunk-W4MZXKZ2.js";
7
+ import "../../chunk-ZRLYHBPN.js";
8
+ import "../../chunk-W2YERO7E.js";
7
9
  import "../../chunk-NSBPE2FW.js";
8
10
  export {
9
11
  cancelLaunchJob,
@@ -1,7 +1,9 @@
1
1
  import {
2
2
  useLaunchJobs
3
- } from "../../chunk-KHJUQFIK.js";
4
- import "../../chunk-N52AHNBH.js";
3
+ } from "../../chunk-YSEQWCN4.js";
4
+ import "../../chunk-W4MZXKZ2.js";
5
+ import "../../chunk-ZRLYHBPN.js";
6
+ import "../../chunk-W2YERO7E.js";
5
7
  import "../../chunk-NSBPE2FW.js";
6
8
  export {
7
9
  useLaunchJobs
@@ -2,10 +2,10 @@ import {
2
2
  _resetRefreshAttempt,
3
3
  bootstrapActiveOrg,
4
4
  maybeRefreshActiveOrg
5
- } from "../chunk-4UJATBTG.js";
6
- import "../chunk-CWFVBGX2.js";
7
- import "../chunk-W2YERO7E.js";
5
+ } from "../chunk-SLL3OBKN.js";
8
6
  import "../chunk-EKJ2CABV.js";
7
+ import "../chunk-ZRLYHBPN.js";
8
+ import "../chunk-W2YERO7E.js";
9
9
  import "../chunk-NSBPE2FW.js";
10
10
  export {
11
11
  _resetRefreshAttempt,
@@ -3,26 +3,26 @@ import {
3
3
  HANDLERS,
4
4
  pollForWork,
5
5
  runAgentLoop
6
- } from "../chunk-CXWY5XKD.js";
7
- import "../chunk-AUUHXCJU.js";
8
- import "../chunk-VCG4Q53B.js";
6
+ } from "../chunk-4LHEN2FS.js";
7
+ import "../chunk-JEJ3J5J6.js";
8
+ import "../chunk-OTOWLUOJ.js";
9
9
  import "../chunk-WLFX4PYR.js";
10
10
  import "../chunk-Y4BJXXYV.js";
11
11
  import "../chunk-W53GKIZQ.js";
12
12
  import "../chunk-H3C6EGR2.js";
13
13
  import "../chunk-RQ2TMLKG.js";
14
- import "../chunk-T76YQCKX.js";
14
+ import "../chunk-IATQXFJA.js";
15
15
  import "../chunk-BCIUSUEV.js";
16
16
  import "../chunk-E3BIT53W.js";
17
17
  import "../chunk-QSN77T7C.js";
18
18
  import "../chunk-QNSVCSHG.js";
19
- import "../chunk-7DRLX3DN.js";
20
- import "../chunk-OKCFYPIQ.js";
21
- import "../chunk-CCSR73HF.js";
19
+ import "../chunk-3POYC5NA.js";
20
+ import "../chunk-RCMXTLQF.js";
21
+ import "../chunk-N5A2IQAK.js";
22
22
  import "../chunk-XZXS2W24.js";
23
23
  import "../chunk-FZKLLNDS.js";
24
24
  import "../chunk-DGHWRQXL.js";
25
- import "../chunk-TDTHAOXO.js";
25
+ import "../chunk-DR5WLIOU.js";
26
26
  import "../chunk-J7N3DLH6.js";
27
27
  import "../chunk-52WIYRZH.js";
28
28
  import "../chunk-OQSQC7VB.js";
@@ -32,7 +32,7 @@ import "../chunk-KRBQLMOP.js";
32
32
  import "../chunk-3TIMQ3O6.js";
33
33
  import "../chunk-YNIH3KMU.js";
34
34
  import "../chunk-QN34TGD3.js";
35
- import "../chunk-CWFVBGX2.js";
35
+ import "../chunk-ZRLYHBPN.js";
36
36
  import "../chunk-W2YERO7E.js";
37
37
  import "../chunk-NSBPE2FW.js";
38
38
  export {
@@ -6,8 +6,8 @@ import {
6
6
  readNewRecords,
7
7
  stateApi,
8
8
  tailAntigravityTranscript
9
- } from "../chunk-CGUV6TUA.js";
10
- import "../chunk-CWFVBGX2.js";
9
+ } from "../chunk-RUCSRN7F.js";
10
+ import "../chunk-ZRLYHBPN.js";
11
11
  import "../chunk-W2YERO7E.js";
12
12
  import "../chunk-NSBPE2FW.js";
13
13
  export {
@@ -1,16 +1,18 @@
1
1
  import {
2
2
  ApiError,
3
+ DEFAULT_API_URL,
3
4
  api,
4
5
  apiDelete,
5
6
  apiGet,
6
7
  apiPatch,
7
8
  apiPost,
8
9
  apiPut
9
- } from "../chunk-CWFVBGX2.js";
10
+ } from "../chunk-ZRLYHBPN.js";
10
11
  import "../chunk-W2YERO7E.js";
11
12
  import "../chunk-NSBPE2FW.js";
12
13
  export {
13
14
  ApiError,
15
+ DEFAULT_API_URL,
14
16
  api,
15
17
  apiDelete,
16
18
  apiGet,
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  aggregateBenchmark,
3
3
  postBenchmark
4
- } from "../chunk-TJ2M5QVL.js";
5
- import "../chunk-CWFVBGX2.js";
4
+ } from "../chunk-3QH73QOQ.js";
5
+ import "../chunk-ZRLYHBPN.js";
6
6
  import "../chunk-W2YERO7E.js";
7
7
  import "../chunk-NSBPE2FW.js";
8
8
  export {
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  processConversationJob
3
- } from "../chunk-TDTHAOXO.js";
3
+ } from "../chunk-DR5WLIOU.js";
4
4
  import "../chunk-3TIMQ3O6.js";
5
5
  import "../chunk-YNIH3KMU.js";
6
6
  import "../chunk-QN34TGD3.js";
7
- import "../chunk-CWFVBGX2.js";
7
+ import "../chunk-ZRLYHBPN.js";
8
8
  import "../chunk-W2YERO7E.js";
9
9
  import "../chunk-NSBPE2FW.js";
10
10
  export {
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  cronSuggestInstructions
3
- } from "../../chunk-T76YQCKX.js";
3
+ } from "../../chunk-IATQXFJA.js";
4
4
  import "../../chunk-E3BIT53W.js";
5
5
  import "../../chunk-FZKLLNDS.js";
6
6
  import "../../chunk-OQSQC7VB.js";
7
7
  import "../../chunk-EKP32DLN.js";
8
8
  import "../../chunk-KRBQLMOP.js";
9
- import "../../chunk-CWFVBGX2.js";
9
+ import "../../chunk-ZRLYHBPN.js";
10
10
  import "../../chunk-W2YERO7E.js";
11
11
  import "../../chunk-NSBPE2FW.js";
12
12
  export {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  processConversation
3
- } from "../../chunk-7DRLX3DN.js";
4
- import "../../chunk-TDTHAOXO.js";
3
+ } from "../../chunk-3POYC5NA.js";
4
+ import "../../chunk-DR5WLIOU.js";
5
5
  import "../../chunk-3TIMQ3O6.js";
6
6
  import "../../chunk-YNIH3KMU.js";
7
7
  import "../../chunk-QN34TGD3.js";
8
- import "../../chunk-CWFVBGX2.js";
8
+ import "../../chunk-ZRLYHBPN.js";
9
9
  import "../../chunk-W2YERO7E.js";
10
10
  import "../../chunk-NSBPE2FW.js";
11
11
  export {
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  processEval
3
- } from "../../chunk-OKCFYPIQ.js";
3
+ } from "../../chunk-RCMXTLQF.js";
4
4
  import "../../chunk-DGHWRQXL.js";
5
5
  import "../../chunk-J7N3DLH6.js";
6
6
  import "../../chunk-52WIYRZH.js";
7
7
  import "../../chunk-YNIH3KMU.js";
8
8
  import "../../chunk-QN34TGD3.js";
9
- import "../../chunk-CWFVBGX2.js";
9
+ import "../../chunk-ZRLYHBPN.js";
10
10
  import "../../chunk-W2YERO7E.js";
11
11
  import "../../chunk-NSBPE2FW.js";
12
12
  export {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  processInsights
3
- } from "../../chunk-CCSR73HF.js";
3
+ } from "../../chunk-N5A2IQAK.js";
4
4
  import "../../chunk-XZXS2W24.js";
5
5
  import "../../chunk-FZKLLNDS.js";
6
6
  import "../../chunk-DGHWRQXL.js";
7
7
  import "../../chunk-KRBQLMOP.js";
8
- import "../../chunk-CWFVBGX2.js";
8
+ import "../../chunk-ZRLYHBPN.js";
9
9
  import "../../chunk-W2YERO7E.js";
10
10
  import "../../chunk-NSBPE2FW.js";
11
11
  export {
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  processLaunch,
3
3
  resolveWorktreeForLaunch
4
- } from "../../chunk-VCG4Q53B.js";
4
+ } from "../../chunk-OTOWLUOJ.js";
5
5
  import "../../chunk-Y4BJXXYV.js";
6
6
  import "../../chunk-DGHWRQXL.js";
7
7
  import "../../chunk-F5N6CLJJ.js";
8
8
  import "../../chunk-KRBQLMOP.js";
9
- import "../../chunk-CWFVBGX2.js";
9
+ import "../../chunk-ZRLYHBPN.js";
10
10
  import "../../chunk-W2YERO7E.js";
11
11
  import "../../chunk-NSBPE2FW.js";
12
12
  export {
@@ -6,7 +6,7 @@ import {
6
6
  } from "../chunk-RQ2TMLKG.js";
7
7
  import {
8
8
  cronSuggestInstructions
9
- } from "../chunk-T76YQCKX.js";
9
+ } from "../chunk-IATQXFJA.js";
10
10
  import "../chunk-E3BIT53W.js";
11
11
  import "../chunk-QSN77T7C.js";
12
12
  import "../chunk-QNSVCSHG.js";
@@ -17,7 +17,7 @@ import "../chunk-KRBQLMOP.js";
17
17
  import {
18
18
  MANUAL_TASK_META
19
19
  } from "../chunk-JFDWKLQC.js";
20
- import "../chunk-CWFVBGX2.js";
20
+ import "../chunk-ZRLYHBPN.js";
21
21
  import "../chunk-W2YERO7E.js";
22
22
  import "../chunk-NSBPE2FW.js";
23
23
 
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  postObservation,
3
3
  postObservations
4
- } from "../chunk-OAQG5WBV.js";
5
- import "../chunk-CWFVBGX2.js";
4
+ } from "../chunk-LAKZUE35.js";
5
+ import "../chunk-ZRLYHBPN.js";
6
6
  import "../chunk-W2YERO7E.js";
7
7
  import "../chunk-NSBPE2FW.js";
8
8
  export {
@@ -7,10 +7,10 @@ import {
7
7
  isStepId,
8
8
  maskToken,
9
9
  renderDiff
10
- } from "../chunk-346TGPVR.js";
10
+ } from "../chunk-LTT2YMYY.js";
11
11
  import "../chunk-ANOWI23I.js";
12
12
  import "../chunk-FTJRMUID.js";
13
- import "../chunk-CWFVBGX2.js";
13
+ import "../chunk-ZRLYHBPN.js";
14
14
  import "../chunk-W2YERO7E.js";
15
15
  import "../chunk-NSBPE2FW.js";
16
16
  export {
@@ -2,9 +2,9 @@ import {
2
2
  probeAndReport,
3
3
  runOneHeartbeatCycle,
4
4
  startTerminalTargetHeartbeat
5
- } from "../chunk-AUUHXCJU.js";
5
+ } from "../chunk-JEJ3J5J6.js";
6
6
  import "../chunk-KRBQLMOP.js";
7
- import "../chunk-CWFVBGX2.js";
7
+ import "../chunk-ZRLYHBPN.js";
8
8
  import "../chunk-W2YERO7E.js";
9
9
  import "../chunk-NSBPE2FW.js";
10
10
  export {
@@ -4015,5 +4015,5 @@
4015
4015
  ]
4016
4016
  }
4017
4017
  },
4018
- "version": "0.5.3"
4018
+ "version": "0.5.4"
4019
4019
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rulemetric/cli",
3
- "version": "0.5.3",
3
+ "version": "0.5.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -70,9 +70,9 @@
70
70
  "postgres": "^3.4.0",
71
71
  "react": "^19.0.0",
72
72
  "zod": "^3.24.0",
73
- "@rulemetric/hooks": "0.5.3",
74
- "@rulemetric/proxy": "0.5.3",
75
- "@rulemetric/skills-registry": "0.5.3"
73
+ "@rulemetric/hooks": "0.5.4",
74
+ "@rulemetric/skills-registry": "0.5.4",
75
+ "@rulemetric/proxy": "0.5.4"
76
76
  },
77
77
  "//deps": "Worker (`evals agent`) runtime deps: the @opentelemetry/* set, @sentry/node, and postgres are STATIC top-level imports loaded at worker startup (via bundled @rulemetric/{telemetry,db}) — they MUST be runtime deps or a clean `npm i -g` crashes with ModuleLoadError. `better-sqlite3` is optionalDependencies (below): it's a native module, lazy `require()`'d inside a try/catch (packages/session providers cursor/opencode) so a missing binary degrades gracefully — making it a hard dep would break `npm i -g` on platforms without prebuilt binaries. `resend` stays a devDep: lazy `await import('resend')` guarded by RESEND_API_KEY, which end-user workers never set (provider falls back to noop). Classification verified via import-graph scan of dist/commands/evals/agent.js + per-importer static/lazy check.",
78
78
  "optionalDependencies": {
@@ -1,7 +0,0 @@
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\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\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 ?? 'http://localhost:3000';\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 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 });\n } finally {\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
- }
@@ -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 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 ?? 'http://localhost:3000';\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 ?? 'http://localhost:3000';\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": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/dashboard/launcher/api.ts"],
4
- "sourcesContent": ["import type { LaunchJob, AvailableLauncher, CreateLaunchPayload } from './types.js';\n\nfunction apiUrl(): string {\n return process.env.RULEMETRIC_API_URL ?? 'http://localhost:3000';\n}\n\nfunction authToken(): string {\n const t = process.env.RULEMETRIC_API_KEY ?? process.env.RULEMETRIC_ACCESS_TOKEN;\n if (!t) throw new Error('not signed in \u2014 run `rulemetric auth login`');\n return t;\n}\n\nasync function request<T>(path: string, init?: RequestInit): Promise<T> {\n const resp = await fetch(`${apiUrl()}${path}`, {\n ...init,\n headers: {\n Authorization: `Bearer ${authToken()}`,\n 'Content-Type': 'application/json',\n ...(init?.headers ?? {}),\n },\n signal: AbortSignal.timeout(10_000),\n });\n if (!resp.ok) {\n throw new Error(`${resp.status} ${resp.statusText}`);\n }\n return (await resp.json()) as T;\n}\n\nexport function fetchLaunchJobs({ limit }: { limit: number }): Promise<LaunchJob[]> {\n return request<LaunchJob[]>(`/api/launch-jobs?limit=${limit}`);\n}\n\nexport function createLaunchJob(payload: CreateLaunchPayload): Promise<LaunchJob> {\n return request<LaunchJob>('/api/launch-jobs', {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n}\n\nexport function cancelLaunchJob(id: string): Promise<{ ok: true }> {\n return request<{ ok: true }>(`/api/launch-jobs/${id}/cancel`, { method: 'POST' });\n}\n\nexport function listLaunchers(): Promise<AvailableLauncher[]> {\n return request<AvailableLauncher[]>('/api/launchers');\n}\n"],
5
- "mappings": ";AAEA,SAAS,SAAiB;AACxB,SAAO,QAAQ,IAAI,sBAAsB;AAC3C;AAEA,SAAS,YAAoB;AAC3B,QAAM,IAAI,QAAQ,IAAI,sBAAsB,QAAQ,IAAI;AACxD,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,kDAA6C;AACrE,SAAO;AACT;AAEA,eAAe,QAAW,MAAc,MAAgC;AACtE,QAAM,OAAO,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI;AAAA,IAC7C,GAAG;AAAA,IACH,SAAS;AAAA,MACP,eAAe,UAAU,UAAU,CAAC;AAAA,MACpC,gBAAgB;AAAA,MAChB,GAAI,MAAM,WAAW,CAAC;AAAA,IACxB;AAAA,IACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,EACpC,CAAC;AACD,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,GAAG,KAAK,MAAM,IAAI,KAAK,UAAU,EAAE;AAAA,EACrD;AACA,SAAQ,MAAM,KAAK,KAAK;AAC1B;AAEO,SAAS,gBAAgB,EAAE,MAAM,GAA4C;AAClF,SAAO,QAAqB,0BAA0B,KAAK,EAAE;AAC/D;AAEO,SAAS,gBAAgB,SAAkD;AAChF,SAAO,QAAmB,oBAAoB;AAAA,IAC5C,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,CAAC;AACH;AAEO,SAAS,gBAAgB,IAAmC;AACjE,SAAO,QAAsB,oBAAoB,EAAE,WAAW,EAAE,QAAQ,OAAO,CAAC;AAClF;AAEO,SAAS,gBAA8C;AAC5D,SAAO,QAA6B,gBAAgB;AACtD;",
6
- "names": []
7
- }