@isaacriehm/cairn 0.2.0 → 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/.tsbuildinfo +1 -1
- package/dist/cli/doctor.d.ts +0 -2
- package/dist/cli/doctor.js +0 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/hook.d.ts +6 -6
- package/dist/cli/hook.js +16 -12
- package/dist/cli/hook.js.map +1 -1
- package/dist/cli/index.js +42 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/scope.d.ts +0 -2
- package/dist/cli/scope.js +3 -5
- package/dist/cli/scope.js.map +1 -1
- package/dist/cli/sensor-run.d.ts +4 -7
- package/dist/cli/sensor-run.js +7 -10
- package/dist/cli/sensor-run.js.map +1 -1
- package/dist/cli/trace.d.ts +9 -0
- package/dist/cli/trace.js +261 -0
- package/dist/cli/trace.js.map +1 -0
- package/package.json +4 -8
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cairn trace` — pretty-print the unified trace log.
|
|
3
|
+
*
|
|
4
|
+
* Reads `~/.local/cairn/trace/trace-<YYYY-MM-DD>.jsonl` for the most
|
|
5
|
+
* recent two days, time-sorts the rows, and prints a one-line-per-event
|
|
6
|
+
* summary. Optional flags filter by session, repo, source, kind, or
|
|
7
|
+
* follow live.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
10
|
+
import { join, resolve } from "node:path";
|
|
11
|
+
import { traceDir } from "@isaacriehm/cairn-core";
|
|
12
|
+
function parseArgs(argv) {
|
|
13
|
+
const positional = [];
|
|
14
|
+
const flags = {};
|
|
15
|
+
for (let i = 0; i < argv.length; i++) {
|
|
16
|
+
const a = argv[i];
|
|
17
|
+
if (a === undefined)
|
|
18
|
+
continue;
|
|
19
|
+
if (a.startsWith("--")) {
|
|
20
|
+
const key = a.slice(2);
|
|
21
|
+
const next = argv[i + 1];
|
|
22
|
+
if (next !== undefined && !next.startsWith("--")) {
|
|
23
|
+
flags[key] = next;
|
|
24
|
+
i++;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
flags[key] = true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
positional.push(a);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { positional, flags };
|
|
35
|
+
}
|
|
36
|
+
function colorFor(source, ok) {
|
|
37
|
+
if (ok === false)
|
|
38
|
+
return "\x1b[31m"; // red — failure
|
|
39
|
+
switch (source) {
|
|
40
|
+
case "hook":
|
|
41
|
+
return "\x1b[36m"; // cyan
|
|
42
|
+
case "mcp":
|
|
43
|
+
return "\x1b[35m"; // magenta
|
|
44
|
+
case "claude":
|
|
45
|
+
return "\x1b[33m"; // yellow
|
|
46
|
+
case "init-phase":
|
|
47
|
+
return "\x1b[34m"; // blue
|
|
48
|
+
case "subagent":
|
|
49
|
+
return "\x1b[32m"; // green
|
|
50
|
+
default:
|
|
51
|
+
return "";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const RESET = "\x1b[0m";
|
|
55
|
+
const DIM = "\x1b[2m";
|
|
56
|
+
function formatRow(ev, opts) {
|
|
57
|
+
const time = ev.ts.slice(11, 23); // HH:MM:SS.mmm
|
|
58
|
+
const src = ev.source.padEnd(11);
|
|
59
|
+
const kind = ev.kind.padEnd(28);
|
|
60
|
+
const ok = ev.ok === false ? " ✗" : ev.ok === true ? " ✓" : " ";
|
|
61
|
+
const dur = ev.duration_ms !== undefined ? ` ${Math.round(ev.duration_ms)}ms` : "";
|
|
62
|
+
const repo = ev.repo_root !== null ? ` ${DIM}${ev.repo_root.split("/").slice(-2).join("/")}${RESET}` : "";
|
|
63
|
+
const sess = ev.session_id !== null ? ` ${DIM}sid=${ev.session_id.slice(0, 8)}${RESET}` : "";
|
|
64
|
+
const color = colorFor(ev.source, ev.ok);
|
|
65
|
+
const head = `${DIM}${time}${RESET} ${color}${src}${RESET}${kind}${ok}${dur}${repo}${sess}`;
|
|
66
|
+
if (!opts.wide)
|
|
67
|
+
return head;
|
|
68
|
+
const payloadLines = [];
|
|
69
|
+
for (const [k, v] of Object.entries(ev.payload)) {
|
|
70
|
+
let rendered;
|
|
71
|
+
if (typeof v === "string") {
|
|
72
|
+
rendered = v.length > 200 ? `${v.slice(0, 200)}…(+${v.length - 200} chars)` : v;
|
|
73
|
+
rendered = rendered.replace(/\n/g, "\\n");
|
|
74
|
+
}
|
|
75
|
+
else if (v === null) {
|
|
76
|
+
rendered = "null";
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
rendered = JSON.stringify(v);
|
|
80
|
+
if (rendered.length > 240)
|
|
81
|
+
rendered = `${rendered.slice(0, 240)}…`;
|
|
82
|
+
}
|
|
83
|
+
payloadLines.push(` ${DIM}${k}=${RESET}${rendered}`);
|
|
84
|
+
}
|
|
85
|
+
return [head, ...payloadLines].join("\n");
|
|
86
|
+
}
|
|
87
|
+
function loadTraceFiles(daysBack) {
|
|
88
|
+
const dir = traceDir();
|
|
89
|
+
if (!existsSync(dir))
|
|
90
|
+
return [];
|
|
91
|
+
const out = [];
|
|
92
|
+
for (const f of readdirSync(dir)) {
|
|
93
|
+
if (!f.startsWith("trace-") || !f.endsWith(".jsonl"))
|
|
94
|
+
continue;
|
|
95
|
+
out.push(join(dir, f));
|
|
96
|
+
}
|
|
97
|
+
out.sort();
|
|
98
|
+
return out.slice(-daysBack);
|
|
99
|
+
}
|
|
100
|
+
function readEvents(paths) {
|
|
101
|
+
const events = [];
|
|
102
|
+
for (const p of paths) {
|
|
103
|
+
let raw;
|
|
104
|
+
try {
|
|
105
|
+
raw = readFileSync(p, "utf8");
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
for (const line of raw.split("\n")) {
|
|
111
|
+
if (line.trim().length === 0)
|
|
112
|
+
continue;
|
|
113
|
+
try {
|
|
114
|
+
const ev = JSON.parse(line);
|
|
115
|
+
events.push(ev);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// skip malformed
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
events.sort((a, b) => a.ts.localeCompare(b.ts));
|
|
123
|
+
return events;
|
|
124
|
+
}
|
|
125
|
+
function applyFilters(events, flags) {
|
|
126
|
+
return events.filter((ev) => {
|
|
127
|
+
if (typeof flags["session"] === "string" && ev.session_id !== flags["session"])
|
|
128
|
+
return false;
|
|
129
|
+
if (typeof flags["repo"] === "string") {
|
|
130
|
+
const want = resolve(flags["repo"]);
|
|
131
|
+
if (ev.repo_root !== want)
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (typeof flags["source"] === "string" && ev.source !== flags["source"])
|
|
135
|
+
return false;
|
|
136
|
+
if (typeof flags["kind"] === "string" && !ev.kind.includes(flags["kind"]))
|
|
137
|
+
return false;
|
|
138
|
+
if (typeof flags["since"] === "string" && ev.ts < flags["since"])
|
|
139
|
+
return false;
|
|
140
|
+
if (flags["errors-only"] === true && ev.ok !== false)
|
|
141
|
+
return false;
|
|
142
|
+
return true;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async function followTail(filterFlags, wide) {
|
|
146
|
+
// Simple polling tail: every 500ms, re-read today's file, emit rows we
|
|
147
|
+
// haven't shown yet. Cheap; trace files are append-only.
|
|
148
|
+
let lastSize = 0;
|
|
149
|
+
let firstPass = true;
|
|
150
|
+
// Print last 20 rows on entry so the operator has context.
|
|
151
|
+
const initial = applyFilters(readEvents(loadTraceFiles(2)), filterFlags).slice(-20);
|
|
152
|
+
for (const ev of initial)
|
|
153
|
+
console.log(formatRow(ev, { wide }));
|
|
154
|
+
const path = loadTraceFiles(1)[0];
|
|
155
|
+
if (path !== undefined) {
|
|
156
|
+
try {
|
|
157
|
+
lastSize = statSync(path).size;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
lastSize = 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// eslint-disable-next-line no-constant-condition
|
|
164
|
+
while (true) {
|
|
165
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
166
|
+
const todayPath = loadTraceFiles(1)[0];
|
|
167
|
+
if (todayPath === undefined)
|
|
168
|
+
continue;
|
|
169
|
+
let st;
|
|
170
|
+
try {
|
|
171
|
+
st = statSync(todayPath);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (st.size <= lastSize && !firstPass)
|
|
177
|
+
continue;
|
|
178
|
+
firstPass = false;
|
|
179
|
+
let raw;
|
|
180
|
+
try {
|
|
181
|
+
raw = readFileSync(todayPath, "utf8");
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const lines = raw.split("\n").filter((l) => l.trim().length > 0);
|
|
187
|
+
// Re-emit anything new since lastSize. Easier than tracking line count: parse all, slice by ts > last seen.
|
|
188
|
+
const events = lines
|
|
189
|
+
.map((l) => {
|
|
190
|
+
try {
|
|
191
|
+
return JSON.parse(l);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
})
|
|
197
|
+
.filter((e) => e !== null);
|
|
198
|
+
const filtered = applyFilters(events, filterFlags);
|
|
199
|
+
// Print any rows whose ts is strictly greater than the last emitted ts.
|
|
200
|
+
const lastTs = initial.length > 0 ? initial[initial.length - 1]?.ts : "";
|
|
201
|
+
let newCount = 0;
|
|
202
|
+
for (const ev of filtered) {
|
|
203
|
+
if (lastTs !== undefined && ev.ts <= lastTs)
|
|
204
|
+
continue;
|
|
205
|
+
console.log(formatRow(ev, { wide }));
|
|
206
|
+
newCount++;
|
|
207
|
+
}
|
|
208
|
+
lastSize = st.size;
|
|
209
|
+
if (newCount === 0)
|
|
210
|
+
continue;
|
|
211
|
+
// Update marker.
|
|
212
|
+
initial.push(...filtered.filter((e) => lastTs !== undefined && e.ts > lastTs));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
export async function traceCli(argv) {
|
|
216
|
+
const { flags } = parseArgs(argv);
|
|
217
|
+
if (flags["help"] === true || flags["h"] === true) {
|
|
218
|
+
console.log([
|
|
219
|
+
"Usage: cairn trace [flags]",
|
|
220
|
+
"",
|
|
221
|
+
"Show the unified Cairn trace (hooks, MCP tools, claude calls, init phases).",
|
|
222
|
+
"",
|
|
223
|
+
"Filters:",
|
|
224
|
+
" --session <id> filter by Claude Code session id",
|
|
225
|
+
" --repo <path> filter by repo root (absolute)",
|
|
226
|
+
" --source <name> hook | mcp | claude | init-phase | subagent",
|
|
227
|
+
" --kind <substr> substring match on kind",
|
|
228
|
+
" --since <ISO> only rows at or after timestamp",
|
|
229
|
+
" --errors-only only failing events",
|
|
230
|
+
"",
|
|
231
|
+
"Output:",
|
|
232
|
+
" --tail follow live (poll every 500ms)",
|
|
233
|
+
" --wide expand payload fields under each row",
|
|
234
|
+
" --tail-n <N> print last N rows on entry to --tail (default 20)",
|
|
235
|
+
" --days <N> how many days back to read (default 2)",
|
|
236
|
+
" --json one trace row per line, no formatting",
|
|
237
|
+
"",
|
|
238
|
+
"Trace files: ~/.local/cairn/trace/trace-<YYYY-MM-DD>.jsonl",
|
|
239
|
+
].join("\n"));
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const days = typeof flags["days"] === "string" ? parseInt(flags["days"], 10) : 2;
|
|
243
|
+
const wide = flags["wide"] === true;
|
|
244
|
+
if (flags["tail"] === true) {
|
|
245
|
+
await followTail(flags, wide);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const events = applyFilters(readEvents(loadTraceFiles(Number.isFinite(days) ? days : 2)), flags);
|
|
249
|
+
if (flags["json"] === true) {
|
|
250
|
+
for (const ev of events)
|
|
251
|
+
console.log(JSON.stringify(ev));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (events.length === 0) {
|
|
255
|
+
console.log(`(no trace events under ${traceDir()})`);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
for (const ev of events)
|
|
259
|
+
console.log(formatRow(ev, { wide }));
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/cli/trace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@isaacriehm/cairn",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Cairn — state + context-loading layer for AI coding agents.",
|
|
5
5
|
"author": "Isaac Riehm",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,14 +37,12 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"simple-git": "^3.36.0",
|
|
39
39
|
"yaml": "^2.8.4",
|
|
40
|
-
"@isaacriehm/cairn-core": "0.
|
|
40
|
+
"@isaacriehm/cairn-core": "0.3.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
44
43
|
"@types/node": "^25.6.0",
|
|
45
44
|
"tsx": "^4.21.0",
|
|
46
|
-
"typescript": "^6.0.3"
|
|
47
|
-
"@isaacriehm/cairn-frontend-stub": "0.2.0"
|
|
45
|
+
"typescript": "^6.0.3"
|
|
48
46
|
},
|
|
49
47
|
"scripts": {
|
|
50
48
|
"build": "tsc -b",
|
|
@@ -52,7 +50,6 @@
|
|
|
52
50
|
"clean": "rm -rf dist *.tsbuildinfo",
|
|
53
51
|
"dev": "tsx src/cli/index.ts",
|
|
54
52
|
"check:layout": "tsx scripts/check-layout.ts",
|
|
55
|
-
"smoke:tier0": "tsx scripts/smoke-tier0.ts",
|
|
56
53
|
"smoke:gc": "tsx scripts/smoke-gc.ts",
|
|
57
54
|
"smoke:init": "tsx scripts/smoke-init.ts",
|
|
58
55
|
"smoke:session-start": "tsx scripts/smoke-session-start.ts",
|
|
@@ -78,7 +75,6 @@
|
|
|
78
75
|
"smoke:init-phases-state": "tsx scripts/smoke-init-phases-state.ts",
|
|
79
76
|
"smoke:init-phases-all": "tsx scripts/smoke-init-phases-all.ts",
|
|
80
77
|
"smoke:init-mcp-tools": "tsx scripts/smoke-init-mcp-tools.ts",
|
|
81
|
-
"smoke:stop-debounce": "tsx scripts/smoke-stop-debounce.ts"
|
|
82
|
-
"smoke:bootstrap-skill": "tsx scripts/smoke-bootstrap-skill.ts"
|
|
78
|
+
"smoke:stop-debounce": "tsx scripts/smoke-stop-debounce.ts"
|
|
83
79
|
}
|
|
84
80
|
}
|