@swarmdo/cli 1.54.1 → 1.58.1
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/README.md +4 -3
- package/dist/src/command-usage/usage.d.ts +74 -0
- package/dist/src/command-usage/usage.d.ts.map +1 -0
- package/dist/src/command-usage/usage.js +161 -0
- package/dist/src/command-usage/usage.js.map +1 -0
- package/dist/src/commands/commands.d.ts +19 -0
- package/dist/src/commands/commands.d.ts.map +1 -0
- package/dist/src/commands/commands.js +107 -0
- package/dist/src/commands/commands.js.map +1 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +7 -3
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/usage.d.ts.map +1 -1
- package/dist/src/commands/usage.js +57 -1
- package/dist/src/commands/usage.js.map +1 -1
- package/dist/src/comms/store.d.ts +11 -1
- package/dist/src/comms/store.d.ts.map +1 -1
- package/dist/src/comms/store.js +16 -2
- package/dist/src/comms/store.js.map +1 -1
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +9 -2
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/integrations/integrations.d.ts.map +1 -1
- package/dist/src/integrations/integrations.js +19 -8
- package/dist/src/integrations/integrations.js.map +1 -1
- package/dist/src/mcp-tools/comms-tools.js +4 -4
- package/dist/src/mcp-tools/comms-tools.js.map +1 -1
- package/dist/src/usage/transcript-friction.d.ts +77 -0
- package/dist/src/usage/transcript-friction.d.ts.map +1 -0
- package/dist/src/usage/transcript-friction.js +151 -0
- package/dist/src/usage/transcript-friction.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/vendor/cli-core/dist/src/index.js +1 -1
- package/vendor/cli-core/dist/src/index.js.map +1 -1
- package/vendor/neural/dist/flash-attention.d.ts +1 -1
- package/vendor/neural/dist/flash-attention.js +1 -1
- package/vendor/shared/dist/hooks/safety/git-commit.js +1 -1
- package/vendor/shared/dist/hooks/safety/git-commit.js.map +1 -1
- package/vendor/shared/dist/mcp/transport/http.d.ts.map +1 -1
- package/vendor/shared/dist/mcp/transport/http.js +8 -1
- package/vendor/shared/dist/mcp/transport/http.js.map +1 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* transcript-friction.ts — interruption + error-category analytics over the same
|
|
3
|
+
* Claude Code transcripts the `usage` command already reads. `usage errors`
|
|
4
|
+
* answers "which tools fail"; this answers "where does Claude waste my turns" —
|
|
5
|
+
* how often you interrupt it (ESC mid-turn), which tool was running when you did,
|
|
6
|
+
* and what KIND of errors dominate (NotFound/Permission/Timeout/Network/Syntax).
|
|
7
|
+
* The interruption axis + human-meaningful error categories are the sniffly
|
|
8
|
+
* (chiphuyen, 1.2k★) headline signals `usage errors` left on the table (#102).
|
|
9
|
+
*
|
|
10
|
+
* The fold is pure and unit-tested; only collectFriction touches the filesystem.
|
|
11
|
+
* Reuses blockText / ParsedLine (transcript-errors) + the transcript plumbing.
|
|
12
|
+
*/
|
|
13
|
+
import { type ParsedLine } from './transcript-errors.js';
|
|
14
|
+
export type ErrorCategory = 'NotFound' | 'Permission' | 'Timeout' | 'Network' | 'Syntax' | 'Other';
|
|
15
|
+
export declare const ERROR_CATEGORIES: ErrorCategory[];
|
|
16
|
+
export interface ToolInterruptions {
|
|
17
|
+
/** tool name that was running when interrupted, or '(idle)' when none was */
|
|
18
|
+
tool: string;
|
|
19
|
+
interruptions: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CategoryShare {
|
|
22
|
+
category: ErrorCategory;
|
|
23
|
+
count: number;
|
|
24
|
+
/** count / totalErrors, 0..1 (0 when no errors) */
|
|
25
|
+
share: number;
|
|
26
|
+
}
|
|
27
|
+
export interface FrictionReport {
|
|
28
|
+
interruptions: number;
|
|
29
|
+
assistantTurns: number;
|
|
30
|
+
/** interruptions / assistantTurns, 0 when no turns (never divides by zero) */
|
|
31
|
+
interruptionRate: number;
|
|
32
|
+
byTool: ToolInterruptions[];
|
|
33
|
+
categories: CategoryShare[];
|
|
34
|
+
totalErrors: number;
|
|
35
|
+
filesScanned: number;
|
|
36
|
+
}
|
|
37
|
+
/** Bucket used when an interruption happened outside any running tool. */
|
|
38
|
+
export declare const IDLE_CONTEXT = "(idle)";
|
|
39
|
+
/**
|
|
40
|
+
* Does a user-role text block read as an ESC interruption sentinel? Matches the
|
|
41
|
+
* whole family at the START of the text (real transcripts show "[Request
|
|
42
|
+
* interrupted by user]", "… for tool use]", "…]", and bare "Request
|
|
43
|
+
* interrupted") — anchored so an incidental mid-sentence mention doesn't count.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isInterruptionText(text: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Map a tool-error message to a human-meaningful category. Order matters:
|
|
48
|
+
* specific buckets come before the broad Syntax catch so e.g. "no such file"
|
|
49
|
+
* lands in NotFound, not Syntax. Everything unmatched is Other. Pure.
|
|
50
|
+
*/
|
|
51
|
+
export declare function classifyError(raw: string): ErrorCategory;
|
|
52
|
+
export interface FrictionAccum {
|
|
53
|
+
interruptions: number;
|
|
54
|
+
assistantTurns: number;
|
|
55
|
+
byTool: Map<string, number>;
|
|
56
|
+
categories: Map<ErrorCategory, number>;
|
|
57
|
+
totalErrors: number;
|
|
58
|
+
/** open tool_use id → name; cleared on its result, or on an interruption */
|
|
59
|
+
openTools: Map<string, string>;
|
|
60
|
+
/** most recent tool_use name (open or already-resolved); reset per turn on an
|
|
61
|
+
* interruption. Used to attribute a "…for tool use]" sentinel even after the
|
|
62
|
+
* interrupted tool's (often synthetic) result already landed. */
|
|
63
|
+
lastToolName: string | null;
|
|
64
|
+
}
|
|
65
|
+
export declare function newFrictionAccum(): FrictionAccum;
|
|
66
|
+
/** Fold one parsed transcript line into the accumulator. Pure (no fs). */
|
|
67
|
+
export declare function foldFriction(acc: FrictionAccum, line: ParsedLine): void;
|
|
68
|
+
export declare function finalizeFriction(acc: FrictionAccum, filesScanned: number): FrictionReport;
|
|
69
|
+
export interface CollectFrictionOptions {
|
|
70
|
+
dirs?: string[];
|
|
71
|
+
since?: string;
|
|
72
|
+
until?: string;
|
|
73
|
+
}
|
|
74
|
+
/** Walk transcripts and produce the friction report. Malformed lines and
|
|
75
|
+
* unreadable files are skipped, never fatal (same discipline as collectUsage). */
|
|
76
|
+
export declare function collectFriction(opts?: CollectFrictionOptions): FrictionReport;
|
|
77
|
+
//# sourceMappingURL=transcript-friction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-friction.d.ts","sourceRoot":"","sources":["../../../src/usage/transcript-friction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AACnG,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAAwE,CAAC;AAErH,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AACD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,0EAA0E;AAC1E,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAQxD;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B;;qEAEiE;IACjE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAiCvE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,cAAc,CAgBzF;AAED,MAAM,WAAW,sBAAsB;IAAG,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CAAE;AAE5F;kFACkF;AAClF,wBAAgB,eAAe,CAAC,IAAI,GAAE,sBAA2B,GAAG,cAAc,CAoCjF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* transcript-friction.ts — interruption + error-category analytics over the same
|
|
3
|
+
* Claude Code transcripts the `usage` command already reads. `usage errors`
|
|
4
|
+
* answers "which tools fail"; this answers "where does Claude waste my turns" —
|
|
5
|
+
* how often you interrupt it (ESC mid-turn), which tool was running when you did,
|
|
6
|
+
* and what KIND of errors dominate (NotFound/Permission/Timeout/Network/Syntax).
|
|
7
|
+
* The interruption axis + human-meaningful error categories are the sniffly
|
|
8
|
+
* (chiphuyen, 1.2k★) headline signals `usage errors` left on the table (#102).
|
|
9
|
+
*
|
|
10
|
+
* The fold is pure and unit-tested; only collectFriction touches the filesystem.
|
|
11
|
+
* Reuses blockText / ParsedLine (transcript-errors) + the transcript plumbing.
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import { defaultClaudeProjectDirs, findTranscriptFiles, normalizeDateBound } from './transcript-usage.js';
|
|
15
|
+
import { blockText } from './transcript-errors.js';
|
|
16
|
+
export const ERROR_CATEGORIES = ['NotFound', 'Permission', 'Timeout', 'Network', 'Syntax', 'Other'];
|
|
17
|
+
/** Bucket used when an interruption happened outside any running tool. */
|
|
18
|
+
export const IDLE_CONTEXT = '(idle)';
|
|
19
|
+
/**
|
|
20
|
+
* Does a user-role text block read as an ESC interruption sentinel? Matches the
|
|
21
|
+
* whole family at the START of the text (real transcripts show "[Request
|
|
22
|
+
* interrupted by user]", "… for tool use]", "…]", and bare "Request
|
|
23
|
+
* interrupted") — anchored so an incidental mid-sentence mention doesn't count.
|
|
24
|
+
*/
|
|
25
|
+
export function isInterruptionText(text) {
|
|
26
|
+
return /^\s*\[?\s*request interrupted/i.test(text);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Map a tool-error message to a human-meaningful category. Order matters:
|
|
30
|
+
* specific buckets come before the broad Syntax catch so e.g. "no such file"
|
|
31
|
+
* lands in NotFound, not Syntax. Everything unmatched is Other. Pure.
|
|
32
|
+
*/
|
|
33
|
+
export function classifyError(raw) {
|
|
34
|
+
const s = raw.toLowerCase();
|
|
35
|
+
if (/\bnot found\b|no such file|enoent|does not exist|cannot find|doesn'?t exist|\b404\b/.test(s))
|
|
36
|
+
return 'NotFound';
|
|
37
|
+
if (/permission denied|\beacces\b|\beperm\b|not permitted|unauthori[sz]ed|forbidden|\b403\b/.test(s))
|
|
38
|
+
return 'Permission';
|
|
39
|
+
if (/timed ?out|\betimedout\b|timeout|deadline exceeded/.test(s))
|
|
40
|
+
return 'Timeout';
|
|
41
|
+
if (/econnrefused|econnreset|enotfound|network|socket hang|getaddrinfo|fetch failed|\bdns\b/.test(s))
|
|
42
|
+
return 'Network';
|
|
43
|
+
if (/syntax|parse error|unexpected token|invalid |compil|typeerror|referenceerror|cannot read propert/.test(s))
|
|
44
|
+
return 'Syntax';
|
|
45
|
+
return 'Other';
|
|
46
|
+
}
|
|
47
|
+
export function newFrictionAccum() {
|
|
48
|
+
return { interruptions: 0, assistantTurns: 0, byTool: new Map(), categories: new Map(), totalErrors: 0, openTools: new Map(), lastToolName: null };
|
|
49
|
+
}
|
|
50
|
+
/** Fold one parsed transcript line into the accumulator. Pure (no fs). */
|
|
51
|
+
export function foldFriction(acc, line) {
|
|
52
|
+
const role = line.message?.role;
|
|
53
|
+
if (role === 'assistant')
|
|
54
|
+
acc.assistantTurns++;
|
|
55
|
+
const content = line.message?.content;
|
|
56
|
+
if (!Array.isArray(content))
|
|
57
|
+
return;
|
|
58
|
+
for (const b of content) {
|
|
59
|
+
if (!b || typeof b !== 'object')
|
|
60
|
+
continue;
|
|
61
|
+
if (b.type === 'tool_use' && b.id && b.name) {
|
|
62
|
+
acc.openTools.set(b.id, b.name);
|
|
63
|
+
acc.lastToolName = b.name;
|
|
64
|
+
}
|
|
65
|
+
else if (b.type === 'tool_result') {
|
|
66
|
+
if (b.tool_use_id)
|
|
67
|
+
acc.openTools.delete(b.tool_use_id);
|
|
68
|
+
if (b.is_error) {
|
|
69
|
+
acc.totalErrors++;
|
|
70
|
+
const cat = classifyError(blockText(b.content));
|
|
71
|
+
acc.categories.set(cat, (acc.categories.get(cat) ?? 0) + 1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (b.type === 'text' && role === 'user' && typeof b.text === 'string' && isInterruptionText(b.text)) {
|
|
75
|
+
acc.interruptions++;
|
|
76
|
+
// Attribute to: a still-open tool (interrupted mid-execution) → else, when
|
|
77
|
+
// the sentinel says "for tool use", the last tool used even if its
|
|
78
|
+
// (synthetic) result already landed → else idle.
|
|
79
|
+
const open = [...acc.openTools.values()];
|
|
80
|
+
const tool = open.length > 0
|
|
81
|
+
? open[open.length - 1]
|
|
82
|
+
: /for tool use/i.test(b.text) && acc.lastToolName
|
|
83
|
+
? acc.lastToolName
|
|
84
|
+
: IDLE_CONTEXT;
|
|
85
|
+
acc.byTool.set(tool, (acc.byTool.get(tool) ?? 0) + 1);
|
|
86
|
+
acc.openTools.clear(); // an interrupt ends the pending turn
|
|
87
|
+
acc.lastToolName = null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function finalizeFriction(acc, filesScanned) {
|
|
92
|
+
const byTool = [...acc.byTool.entries()]
|
|
93
|
+
.map(([tool, interruptions]) => ({ tool, interruptions }))
|
|
94
|
+
.sort((a, b) => b.interruptions - a.interruptions || a.tool.localeCompare(b.tool));
|
|
95
|
+
const categories = [...acc.categories.entries()]
|
|
96
|
+
.map(([category, count]) => ({ category, count, share: acc.totalErrors > 0 ? count / acc.totalErrors : 0 }))
|
|
97
|
+
.sort((a, b) => b.count - a.count || a.category.localeCompare(b.category));
|
|
98
|
+
return {
|
|
99
|
+
interruptions: acc.interruptions,
|
|
100
|
+
assistantTurns: acc.assistantTurns,
|
|
101
|
+
interruptionRate: acc.assistantTurns > 0 ? acc.interruptions / acc.assistantTurns : 0,
|
|
102
|
+
byTool,
|
|
103
|
+
categories,
|
|
104
|
+
totalErrors: acc.totalErrors,
|
|
105
|
+
filesScanned,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Walk transcripts and produce the friction report. Malformed lines and
|
|
109
|
+
* unreadable files are skipped, never fatal (same discipline as collectUsage). */
|
|
110
|
+
export function collectFriction(opts = {}) {
|
|
111
|
+
const dirs = opts.dirs && opts.dirs.length > 0 ? opts.dirs : defaultClaudeProjectDirs();
|
|
112
|
+
const since = normalizeDateBound(opts.since);
|
|
113
|
+
const until = normalizeDateBound(opts.until);
|
|
114
|
+
const acc = newFrictionAccum();
|
|
115
|
+
let filesScanned = 0;
|
|
116
|
+
for (const dir of dirs) {
|
|
117
|
+
for (const { file } of findTranscriptFiles(dir)) {
|
|
118
|
+
filesScanned++;
|
|
119
|
+
let content;
|
|
120
|
+
try {
|
|
121
|
+
content = fs.readFileSync(file, 'utf8');
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
for (const raw of content.split('\n')) {
|
|
127
|
+
if (!raw.trim())
|
|
128
|
+
continue;
|
|
129
|
+
let line;
|
|
130
|
+
try {
|
|
131
|
+
line = JSON.parse(raw);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (since || until) {
|
|
137
|
+
const day = line.timestamp ? line.timestamp.slice(0, 10) : '';
|
|
138
|
+
if (day) {
|
|
139
|
+
if (since && day < since)
|
|
140
|
+
continue;
|
|
141
|
+
if (until && day > until)
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
foldFriction(acc, line);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return finalizeFriction(acc, filesScanned);
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=transcript-friction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-friction.js","sourceRoot":"","sources":["../../../src/usage/transcript-friction.ts"],"names":[],"mappings":"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"}
|