@rulemetric/cli 0.2.3 → 0.3.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/{chunk-GQCISMAH.js → chunk-2BCPVUSF.js} +6 -6
- package/dist/{chunk-7FAA3YNB.js → chunk-42A3HEEH.js} +50 -3
- package/dist/chunk-42A3HEEH.js.map +7 -0
- package/dist/{chunk-RJ7BHDLM.js → chunk-46LMTDRE.js} +2 -2
- package/dist/{chunk-B5KNTGMJ.js → chunk-4QGATD5Y.js} +209 -2
- package/dist/chunk-4QGATD5Y.js.map +7 -0
- package/dist/{chunk-XPUEGHXN.js → chunk-EHABPBGH.js} +4 -4
- package/dist/{chunk-EOOP6WTC.js → chunk-FUS5C4SB.js} +2 -2
- package/dist/chunk-JFDWKLQC.js +23 -0
- package/dist/chunk-JFDWKLQC.js.map +7 -0
- package/dist/{chunk-PHLMIZKM.js → chunk-JNFIYBFL.js} +30 -5
- package/dist/chunk-JNFIYBFL.js.map +7 -0
- package/dist/{chunk-WFULKPEQ.js → chunk-LCT6MT2V.js} +12 -12
- package/dist/{chunk-R5MFHGHR.js → chunk-MTLAIJED.js} +3 -3
- package/dist/{chunk-NIDLJO6F.js → chunk-QSN77T7C.js} +23 -1
- package/dist/{chunk-NIDLJO6F.js.map → chunk-QSN77T7C.js.map} +2 -2
- package/dist/{chunk-4WFE4PFP.js → chunk-XMWHTOCC.js} +3 -3
- package/dist/{chunk-AULP2OWH.js → chunk-Y2ARLMWZ.js} +6 -6
- package/dist/{chunk-IGXX624H.js → chunk-YEBBX4HQ.js} +2 -2
- package/dist/commands/crons/list.js +3 -13
- package/dist/commands/crons/list.js.map +2 -2
- package/dist/commands/crons/run.js +16 -14
- package/dist/commands/crons/run.js.map +2 -2
- package/dist/commands/evals/agent.js +19 -21
- package/dist/commands/evals/agent.js.map +2 -2
- package/dist/commands/hooks/install.js +2 -2
- package/dist/commands/service/install.js +180 -11
- package/dist/commands/service/install.js.map +2 -2
- package/dist/commands/service/uninstall.js +33 -2
- package/dist/commands/service/uninstall.js.map +2 -2
- package/dist/commands/suggestions/accept.js +3 -3
- package/dist/commands/suggestions/dismiss.js +3 -3
- package/dist/dashboard/Dashboard.js +3 -3
- package/dist/dashboard/data.js +2 -2
- package/dist/{dist-CSUYFYKI.js → dist-NEECHU47.js} +6 -2
- package/dist/lib/agent-loop.js +17 -17
- package/dist/lib/handlers/process-announcement.js +3 -3
- package/dist/lib/handlers/process-changelog.js +3 -3
- package/dist/lib/handlers/process-insights.js +2 -2
- package/dist/lib/handlers/process-launch.js +3 -3
- package/dist/lib/handlers/process-run-cleanup.js +4 -4
- package/dist/lib/handlers/process-session-goal.js +2 -2
- package/dist/lib/manual-tasks-meta.js +8 -0
- package/dist/lib/manual-tasks-meta.js.map +7 -0
- package/dist/lib/manual-tasks.js +65 -8
- package/dist/lib/manual-tasks.js.map +3 -3
- package/dist/lib/statusline-shim.js +1 -1
- package/dist/lib/worktree.js +2 -2
- package/oclif.manifest.json +11 -4
- package/package.json +18 -15
- package/dist/chunk-7FAA3YNB.js.map +0 -7
- package/dist/chunk-B5KNTGMJ.js.map +0 -7
- package/dist/chunk-DU73QUS3.js +0 -75
- package/dist/chunk-DU73QUS3.js.map +0 -7
- package/dist/chunk-PHLMIZKM.js.map +0 -7
- /package/dist/{chunk-GQCISMAH.js.map → chunk-2BCPVUSF.js.map} +0 -0
- /package/dist/{chunk-RJ7BHDLM.js.map → chunk-46LMTDRE.js.map} +0 -0
- /package/dist/{chunk-XPUEGHXN.js.map → chunk-EHABPBGH.js.map} +0 -0
- /package/dist/{chunk-EOOP6WTC.js.map → chunk-FUS5C4SB.js.map} +0 -0
- /package/dist/{chunk-WFULKPEQ.js.map → chunk-LCT6MT2V.js.map} +0 -0
- /package/dist/{chunk-R5MFHGHR.js.map → chunk-MTLAIJED.js.map} +0 -0
- /package/dist/{chunk-4WFE4PFP.js.map → chunk-XMWHTOCC.js.map} +0 -0
- /package/dist/{chunk-AULP2OWH.js.map → chunk-Y2ARLMWZ.js.map} +0 -0
- /package/dist/{chunk-IGXX624H.js.map → chunk-YEBBX4HQ.js.map} +0 -0
- /package/dist/{dist-CSUYFYKI.js.map → dist-NEECHU47.js.map} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
processRunCleanup
|
|
3
|
-
} from "../../chunk-
|
|
4
|
-
import "../../chunk-
|
|
3
|
+
} from "../../chunk-Y2ARLMWZ.js";
|
|
4
|
+
import "../../chunk-FUS5C4SB.js";
|
|
5
|
+
import "../../chunk-42A3HEEH.js";
|
|
5
6
|
import "../../chunk-DGHWRQXL.js";
|
|
6
|
-
import "../../chunk-
|
|
7
|
-
import "../../chunk-7FAA3YNB.js";
|
|
7
|
+
import "../../chunk-4QGATD5Y.js";
|
|
8
8
|
import "../../chunk-KRBQLMOP.js";
|
|
9
9
|
import "../../chunk-NSBPE2FW.js";
|
|
10
10
|
export {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
processSessionGoal
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-YEBBX4HQ.js";
|
|
4
4
|
import "../../chunk-FZKLLNDS.js";
|
|
5
|
-
import "../../chunk-
|
|
5
|
+
import "../../chunk-42A3HEEH.js";
|
|
6
6
|
import "../../chunk-KRBQLMOP.js";
|
|
7
7
|
import "../../chunk-NSBPE2FW.js";
|
|
8
8
|
export {
|
package/dist/lib/manual-tasks.js
CHANGED
|
@@ -1,20 +1,77 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import
|
|
2
|
+
processChangelog
|
|
3
|
+
} from "../chunk-MTLAIJED.js";
|
|
4
|
+
import {
|
|
5
|
+
cronRefreshSkills
|
|
6
|
+
} from "../chunk-RQ2TMLKG.js";
|
|
7
|
+
import {
|
|
8
|
+
cronSuggestInstructions
|
|
9
|
+
} from "../chunk-YBNW7ARH.js";
|
|
8
10
|
import "../chunk-FZKLLNDS.js";
|
|
9
11
|
import "../chunk-K3BFZ7KG.js";
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
12
|
+
import "../chunk-QSN77T7C.js";
|
|
13
|
+
import "../chunk-42A3HEEH.js";
|
|
12
14
|
import "../chunk-EKP32DLN.js";
|
|
13
15
|
import "../chunk-OQSQC7VB.js";
|
|
14
16
|
import "../chunk-KRBQLMOP.js";
|
|
17
|
+
import {
|
|
18
|
+
MANUAL_TASK_META
|
|
19
|
+
} from "../chunk-JFDWKLQC.js";
|
|
15
20
|
import "../chunk-EJOI2ZGU.js";
|
|
16
21
|
import "../chunk-KZRFUXGF.js";
|
|
17
22
|
import "../chunk-NSBPE2FW.js";
|
|
23
|
+
|
|
24
|
+
// src/lib/manual-tasks.ts
|
|
25
|
+
var HANDLERS = {
|
|
26
|
+
cron_check_changelog: async (_payload, helpers) => {
|
|
27
|
+
const result = await processChangelog({
|
|
28
|
+
logger: {
|
|
29
|
+
info: (m) => helpers.logger.info(m),
|
|
30
|
+
warn: (m) => helpers.logger.warn(m)
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
helpers.logger.info(
|
|
34
|
+
`[cron_check_changelog] result: created=${result.createdCount} skipped=${result.skippedCount}`
|
|
35
|
+
);
|
|
36
|
+
},
|
|
37
|
+
cron_suggest_instructions: (payload, helpers) => cronSuggestInstructions(payload, helpers),
|
|
38
|
+
cron_refresh_skills: (payload, helpers) => cronRefreshSkills(payload, helpers)
|
|
39
|
+
};
|
|
40
|
+
var MANUAL_TASKS = MANUAL_TASK_META.map((meta) => {
|
|
41
|
+
const handler = HANDLERS[meta.name];
|
|
42
|
+
if (!handler) {
|
|
43
|
+
throw new Error(`manual-tasks: no handler registered for "${meta.name}"`);
|
|
44
|
+
}
|
|
45
|
+
return { ...meta, handler };
|
|
46
|
+
});
|
|
47
|
+
async function runManualTask(name) {
|
|
48
|
+
const def = MANUAL_TASKS.find((t) => t.name === name);
|
|
49
|
+
if (!def) {
|
|
50
|
+
return { name, durationMs: 0, ok: false, error: `Unknown task: ${name}`, logs: [] };
|
|
51
|
+
}
|
|
52
|
+
const logs = [];
|
|
53
|
+
const helpers = {
|
|
54
|
+
logger: {
|
|
55
|
+
info: (message) => logs.push({ level: "info", message }),
|
|
56
|
+
warn: (message) => logs.push({ level: "warn", message }),
|
|
57
|
+
error: (message) => logs.push({ level: "error", message })
|
|
58
|
+
},
|
|
59
|
+
job: { attempts: 0 }
|
|
60
|
+
};
|
|
61
|
+
const start = Date.now();
|
|
62
|
+
try {
|
|
63
|
+
await def.handler({}, helpers);
|
|
64
|
+
return { name, durationMs: Date.now() - start, ok: true, logs };
|
|
65
|
+
} catch (err) {
|
|
66
|
+
return {
|
|
67
|
+
name,
|
|
68
|
+
durationMs: Date.now() - start,
|
|
69
|
+
ok: false,
|
|
70
|
+
error: err instanceof Error ? err.message : String(err),
|
|
71
|
+
logs
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
18
75
|
export {
|
|
19
76
|
MANUAL_TASKS,
|
|
20
77
|
runManualTask
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
3
|
+
"sources": ["../../src/lib/manual-tasks.ts"],
|
|
4
|
+
"sourcesContent": ["// Manually-runnable maintenance tasks for `rulemetric crons run` / `crons list`.\n// Replaces the graphile cron-registry/cron-runner pair (deleted in Phase 4c\n// Stage 4): scheduled crons now live in Supabase pg_cron (see migrations\n// 00064/00065/00082/00083), so the only thing the CLI still needs is an\n// on-demand entry point for tasks an operator triggers by hand.\n\nimport type { JobHelpers } from './job-helpers.js';\nimport { processChangelog } from './handlers/process-changelog.js';\nimport { cronSuggestInstructions } from './handlers/cron-suggest-instructions.js';\nimport { cronRefreshSkills } from './handlers/cron-refresh-skills.js';\nimport { MANUAL_TASK_META, type ManualTaskMeta } from './manual-tasks-meta.js';\n\nexport interface ManualTaskDefinition extends ManualTaskMeta {\n handler: (payload: unknown, helpers: JobHelpers) => Promise<unknown>;\n}\n\n// Handlers keyed by task name. Deliberately kept SEPARATE from the task metadata\n// (manual-tasks-meta.ts) so `crons list` can render the task table without ever\n// importing these handler modules, which transitively pull `@rulemetric/db` ->\n// `postgres` plus OTel/Sentry. The metadata is the single source of truth for the\n// task list; this map only attaches behaviour. See manual-tasks-meta.ts.\nconst HANDLERS: Record<string, ManualTaskDefinition['handler']> = {\n cron_check_changelog: async (_payload, helpers) => {\n const result = await processChangelog({\n logger: {\n info: (m: string) => helpers.logger.info(m),\n warn: (m: string) => helpers.logger.warn(m),\n },\n });\n helpers.logger.info(\n `[cron_check_changelog] result: created=${result.createdCount} skipped=${result.skippedCount}`,\n );\n },\n cron_suggest_instructions: (payload, helpers) => cronSuggestInstructions(payload, helpers),\n cron_refresh_skills: (payload, helpers) => cronRefreshSkills(payload, helpers),\n};\n\nexport const MANUAL_TASKS: readonly ManualTaskDefinition[] = MANUAL_TASK_META.map((meta) => {\n const handler = HANDLERS[meta.name];\n if (!handler) {\n // Guards against a metadata entry being added without a matching handler.\n throw new Error(`manual-tasks: no handler registered for \"${meta.name}\"`);\n }\n return { ...meta, handler };\n});\n\nexport interface ManualTaskResult {\n name: string;\n durationMs: number;\n ok: boolean;\n error?: string;\n logs: Array<{ level: string; message: string }>;\n}\n\n/**\n * Synchronously invoke a manual task by name. Returns a structured result\n * with captured log lines so callers (CLI, tests) can render or assert.\n */\nexport async function runManualTask(name: string): Promise<ManualTaskResult> {\n const def = MANUAL_TASKS.find((t) => t.name === name);\n if (!def) {\n return { name, durationMs: 0, ok: false, error: `Unknown task: ${name}`, logs: [] };\n }\n\n const logs: Array<{ level: string; message: string }> = [];\n const helpers: JobHelpers = {\n logger: {\n info: (message) => logs.push({ level: 'info', message }),\n warn: (message) => logs.push({ level: 'warn', message }),\n error: (message) => logs.push({ level: 'error', message }),\n },\n job: { attempts: 0 },\n };\n\n const start = Date.now();\n try {\n await def.handler({}, helpers);\n return { name, durationMs: Date.now() - start, ok: true, logs };\n } catch (err) {\n return {\n name,\n durationMs: Date.now() - start,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n logs,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAqBA,IAAM,WAA4D;AAAA,EAC9D,sBAAsB,OAAO,UAAU,YAAY;AAC/C,UAAM,SAAS,MAAM,iBAAiB;AAAA,MAClC,QAAQ;AAAA,QACJ,MAAM,CAAC,MAAc,QAAQ,OAAO,KAAK,CAAC;AAAA,QAC1C,MAAM,CAAC,MAAc,QAAQ,OAAO,KAAK,CAAC;AAAA,MAC9C;AAAA,IACJ,CAAC;AACD,YAAQ,OAAO;AAAA,MACX,0CAA0C,OAAO,YAAY,YAAY,OAAO,YAAY;AAAA,IAChG;AAAA,EACJ;AAAA,EACA,2BAA2B,CAAC,SAAS,YAAY,wBAAwB,SAAS,OAAO;AAAA,EACzF,qBAAqB,CAAC,SAAS,YAAY,kBAAkB,SAAS,OAAO;AACjF;AAEO,IAAM,eAAgD,iBAAiB,IAAI,CAAC,SAAS;AACxF,QAAM,UAAU,SAAS,KAAK,IAAI;AAClC,MAAI,CAAC,SAAS;AAEV,UAAM,IAAI,MAAM,4CAA4C,KAAK,IAAI,GAAG;AAAA,EAC5E;AACA,SAAO,EAAE,GAAG,MAAM,QAAQ;AAC9B,CAAC;AAcD,eAAsB,cAAc,MAAyC;AACzE,QAAM,MAAM,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACpD,MAAI,CAAC,KAAK;AACN,WAAO,EAAE,MAAM,YAAY,GAAG,IAAI,OAAO,OAAO,iBAAiB,IAAI,IAAI,MAAM,CAAC,EAAE;AAAA,EACtF;AAEA,QAAM,OAAkD,CAAC;AACzD,QAAM,UAAsB;AAAA,IACxB,QAAQ;AAAA,MACJ,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,OAAO,QAAQ,QAAQ,CAAC;AAAA,MACvD,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,OAAO,QAAQ,QAAQ,CAAC;AAAA,MACvD,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,OAAO,SAAS,QAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,KAAK,EAAE,UAAU,EAAE;AAAA,EACvB;AAEA,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI;AACA,UAAM,IAAI,QAAQ,CAAC,GAAG,OAAO;AAC7B,WAAO,EAAE,MAAM,YAAY,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,KAAK;AAAA,EAClE,SAAS,KAAK;AACV,WAAO;AAAA,MACH;AAAA,MACA,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,IAAI;AAAA,MACJ,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACtD;AAAA,IACJ;AAAA,EACJ;AACJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/lib/worktree.js
CHANGED
|
@@ -2,10 +2,10 @@ import {
|
|
|
2
2
|
ensureWorktree,
|
|
3
3
|
removeWorktree,
|
|
4
4
|
runGit
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-FUS5C4SB.js";
|
|
6
6
|
import {
|
|
7
7
|
sanitizeBranch
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-4QGATD5Y.js";
|
|
9
9
|
import "../chunk-KRBQLMOP.js";
|
|
10
10
|
import "../chunk-NSBPE2FW.js";
|
|
11
11
|
export {
|
package/oclif.manifest.json
CHANGED
|
@@ -3012,12 +3012,13 @@
|
|
|
3012
3012
|
"service:install": {
|
|
3013
3013
|
"aliases": [],
|
|
3014
3014
|
"args": {},
|
|
3015
|
-
"description": "Install RuleMetric API
|
|
3015
|
+
"description": "Install RuleMetric services. Default (in a repo checkout): API + worker + gateway + capture proxy as launchd agents. With --worker-only: just the job worker, targeting the globally-installed CLI — no repo, no build (works from `npm i -g @rulemetric/cli`, macOS launchd or Linux systemd).",
|
|
3016
3016
|
"examples": [
|
|
3017
3017
|
"<%= config.bin %> service install",
|
|
3018
3018
|
"<%= config.bin %> service install --port 3000",
|
|
3019
3019
|
"<%= config.bin %> service install --skip-build",
|
|
3020
|
-
"<%= config.bin %> service install --no-proxy"
|
|
3020
|
+
"<%= config.bin %> service install --no-proxy",
|
|
3021
|
+
"<%= config.bin %> service install --worker-only"
|
|
3021
3022
|
],
|
|
3022
3023
|
"flags": {
|
|
3023
3024
|
"api-url": {
|
|
@@ -3056,6 +3057,12 @@
|
|
|
3056
3057
|
"name": "no-proxy",
|
|
3057
3058
|
"allowNo": false,
|
|
3058
3059
|
"type": "boolean"
|
|
3060
|
+
},
|
|
3061
|
+
"worker-only": {
|
|
3062
|
+
"description": "Install ONLY the job worker as a persistent service, targeting the globally-installed CLI (no repo checkout, no build, no API/gateway/proxy). Sources auth from ~/.config/rulemetric/env. macOS (launchd) + Linux (systemd --user).",
|
|
3063
|
+
"name": "worker-only",
|
|
3064
|
+
"allowNo": false,
|
|
3065
|
+
"type": "boolean"
|
|
3059
3066
|
}
|
|
3060
3067
|
},
|
|
3061
3068
|
"hasDynamicHelp": false,
|
|
@@ -3108,7 +3115,7 @@
|
|
|
3108
3115
|
"service:uninstall": {
|
|
3109
3116
|
"aliases": [],
|
|
3110
3117
|
"args": {},
|
|
3111
|
-
"description": "Remove
|
|
3118
|
+
"description": "Remove RuleMetric services (macOS launchd: API/worker/gateway/proxy; Linux: the --worker-only systemd unit)",
|
|
3112
3119
|
"flags": {
|
|
3113
3120
|
"api-url": {
|
|
3114
3121
|
"description": "Override API base URL",
|
|
@@ -3956,5 +3963,5 @@
|
|
|
3956
3963
|
]
|
|
3957
3964
|
}
|
|
3958
3965
|
},
|
|
3959
|
-
"version": "0.
|
|
3966
|
+
"version": "0.3.0"
|
|
3960
3967
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rulemetric/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -53,6 +53,13 @@
|
|
|
53
53
|
"@oclif/plugin-help": "^6.2.0",
|
|
54
54
|
"@oclif/plugin-not-found": "^3.2.0",
|
|
55
55
|
"@oclif/table": "^0.3.0",
|
|
56
|
+
"@opentelemetry/api": "^1.9.0",
|
|
57
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.57.0",
|
|
58
|
+
"@opentelemetry/resources": "^1.30.0",
|
|
59
|
+
"@opentelemetry/sdk-node": "^0.57.0",
|
|
60
|
+
"@opentelemetry/sdk-trace-node": "^1.30.0",
|
|
61
|
+
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
62
|
+
"@sentry/node": "^8.42.0",
|
|
56
63
|
"@supabase/supabase-js": "^2.95.0",
|
|
57
64
|
"drizzle-orm": "^0.44.0",
|
|
58
65
|
"gray-matter": "^4.0.3",
|
|
@@ -60,40 +67,36 @@
|
|
|
60
67
|
"ink-select-input": "^6.2.0",
|
|
61
68
|
"ink-spinner": "^5.0.0",
|
|
62
69
|
"ink-text-input": "^6.0.0",
|
|
70
|
+
"postgres": "^3.4.0",
|
|
63
71
|
"react": "^19.0.0",
|
|
64
72
|
"zod": "^3.24.0",
|
|
65
|
-
"@rulemetric/hooks": "0.
|
|
66
|
-
"@rulemetric/proxy": "0.
|
|
67
|
-
"@rulemetric/skills-registry": "0.
|
|
73
|
+
"@rulemetric/hooks": "0.3.0",
|
|
74
|
+
"@rulemetric/proxy": "0.3.0",
|
|
75
|
+
"@rulemetric/skills-registry": "0.3.0"
|
|
76
|
+
},
|
|
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
|
+
"optionalDependencies": {
|
|
79
|
+
"better-sqlite3": "^11.0.0"
|
|
68
80
|
},
|
|
69
81
|
"devDependencies": {
|
|
70
82
|
"@hono/node-server": "^1.13.0",
|
|
71
83
|
"@oclif/test": "^4.1.0",
|
|
72
|
-
"@opentelemetry/api": "^1.9.0",
|
|
73
|
-
"@opentelemetry/exporter-trace-otlp-http": "^0.57.0",
|
|
74
|
-
"@opentelemetry/resources": "^1.30.0",
|
|
75
|
-
"@opentelemetry/sdk-node": "^0.57.0",
|
|
76
|
-
"@opentelemetry/sdk-trace-node": "^1.30.0",
|
|
77
|
-
"@opentelemetry/semantic-conventions": "^1.28.0",
|
|
78
|
-
"@sentry/node": "^8.42.0",
|
|
79
84
|
"@types/node": "^22.0.0",
|
|
80
85
|
"@types/react": "^19.0.0",
|
|
81
|
-
"better-sqlite3": "^11.0.0",
|
|
82
86
|
"esbuild": "^0.25.0",
|
|
83
87
|
"ink-testing-library": "^4.0.0",
|
|
84
88
|
"oclif": "^4.17.0",
|
|
85
|
-
"postgres": "^3.4.0",
|
|
86
89
|
"resend": "^4.0.0",
|
|
87
90
|
"tsx": "^4.19.0",
|
|
88
91
|
"typescript": "^5.9.0",
|
|
89
92
|
"vitest": "^3.2.0",
|
|
90
93
|
"@rulemetric/api": "0.0.1",
|
|
91
94
|
"@rulemetric/core": "0.0.1",
|
|
92
|
-
"@rulemetric/db": "0.0.1",
|
|
93
95
|
"@rulemetric/email": "0.0.1",
|
|
94
96
|
"@rulemetric/session": "0.2.1",
|
|
95
97
|
"@rulemetric/telemetry": "0.0.1",
|
|
96
|
-
"@rulemetric/typescript-config": "0.0.0"
|
|
98
|
+
"@rulemetric/typescript-config": "0.0.0",
|
|
99
|
+
"@rulemetric/db": "0.0.1"
|
|
97
100
|
},
|
|
98
101
|
"scripts": {
|
|
99
102
|
"build": "node scripts/build.mjs",
|