@prism-d1/cli 1.0.58 → 1.0.60

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.
@@ -0,0 +1,217 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
3
+ import { resolve, basename } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { collectKiroCli } from '../parse-code-tool/kiro-cli.js';
6
+ import { collectKiroIde } from '../parse-code-tool/kiro-ide.js';
7
+ const DEFAULT_CLAUDE_MODEL = 'us.anthropic.claude-sonnet-4-5-20250929-v1:0';
8
+ function gitRoot(explicit) {
9
+ if (explicit)
10
+ return explicit;
11
+ const r = spawnSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' });
12
+ if (r.status === 0 && r.stdout)
13
+ return r.stdout.trim();
14
+ return process.cwd();
15
+ }
16
+ /** Detect the AI tool that produced this commit from the environment. */
17
+ function detectTool() {
18
+ const env = process.env;
19
+ let origin = 'human', tool = '', model = '';
20
+ // Claude Code
21
+ if (env.CLAUDE_CODE || env.CLAUDE_CODE_SESSION_ID) {
22
+ origin = 'ai-generated';
23
+ tool = 'claude-code';
24
+ model = env.ANTHROPIC_MODEL || DEFAULT_CLAUDE_MODEL;
25
+ }
26
+ // Kiro CLI (KIRO_SESSION_ID) / IDE terminal (TERM_PROGRAM) / Source Control panel (askpass paths)
27
+ if (env.KIRO_SESSION_ID ||
28
+ env.KIRO_SESSION ||
29
+ env.TERM_PROGRAM === 'kiro' ||
30
+ (env.VSCODE_GIT_ASKPASS_NODE || '').includes('kiro') ||
31
+ (env.GIT_ASKPASS || '').includes('kiro')) {
32
+ origin = 'ai-generated';
33
+ tool = 'kiro';
34
+ model = '';
35
+ }
36
+ // Amazon Q Developer
37
+ if (env.Q_DEVELOPER_SESSION) {
38
+ origin = 'ai-generated';
39
+ tool = 'q-developer';
40
+ }
41
+ return { origin, tool, model };
42
+ }
43
+ /** Find a spec reference: an explicit Spec-Ref in the message wins, else a staged spec file. */
44
+ function detectSpecRef(repoRoot, msg) {
45
+ const explicit = msg.match(/^Spec-Ref:\s*(.+)$/m);
46
+ if (explicit)
47
+ return explicit[1].trim();
48
+ const r = spawnSync('git', ['diff', '--cached', '--name-only'], { encoding: 'utf8', cwd: repoRoot });
49
+ if (r.status === 0 && r.stdout) {
50
+ for (const f of r.stdout.split('\n')) {
51
+ if (/specs\/|\.kiro\/specs\//.test(f))
52
+ return f.trim();
53
+ }
54
+ }
55
+ return '';
56
+ }
57
+ /** Run `codeburn report` and parse its JSON. Returns null if codeburn is absent or errors. */
58
+ function runCodeburn(projectFilter) {
59
+ const isWin = process.platform === 'win32';
60
+ const r = isWin
61
+ ? spawnSync(`codeburn report -p all --project "${projectFilter}" --format json`, { encoding: 'utf8', shell: true })
62
+ : spawnSync('codeburn', ['report', '-p', 'all', '--project', projectFilter, '--format', 'json'], { encoding: 'utf8' });
63
+ if (!r || r.status !== 0 || !r.stdout)
64
+ return null;
65
+ try {
66
+ return JSON.parse(r.stdout);
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ /** Collect cumulative token usage for the given tool + project. */
73
+ async function collectUsage(tool, projectBasename, projectFilter) {
74
+ if (tool === 'kiro') {
75
+ let out = null;
76
+ if (process.env.KIRO_SESSION_ID) {
77
+ out = await collectKiroCli(process.env.KIRO_SESSION_ID, projectBasename);
78
+ }
79
+ if (!out || out.overview.calls === 0) {
80
+ out = await collectKiroIde(projectBasename);
81
+ }
82
+ return out;
83
+ }
84
+ // claude-code / q-developer → codeburn (full-path slug, then basename fallback)
85
+ let out = runCodeburn(projectFilter);
86
+ if (!out || out.overview.calls === 0)
87
+ out = runCodeburn(projectBasename);
88
+ return out;
89
+ }
90
+ function sumTokens(o, key) {
91
+ return (o.models || []).reduce((s, m) => s + (m[key] || 0), 0);
92
+ }
93
+ function readBounds(repoRoot) {
94
+ let maxTokens = 1_000_000, maxCost = 100;
95
+ const cfg = resolve(repoRoot, '.prism', 'config.json');
96
+ if (existsSync(cfg)) {
97
+ try {
98
+ const j = JSON.parse(readFileSync(cfg, 'utf8'));
99
+ if (typeof j.max_tokens === 'number')
100
+ maxTokens = j.max_tokens;
101
+ if (typeof j.max_cost === 'number')
102
+ maxCost = j.max_cost;
103
+ }
104
+ catch { /* fall through to defaults */ }
105
+ }
106
+ return { maxTokens, maxCost };
107
+ }
108
+ /** Format a USD cost: up to 4 dp, trailing zeros trimmed (matches the old bc output style). */
109
+ function formatCost(c) {
110
+ return (Math.round(c * 10000) / 10000).toString();
111
+ }
112
+ export default {
113
+ description: 'Emit AI-origin git commit trailers (used by prepare-commit-msg). Portable: no jq/bc/sed required.',
114
+ options: [
115
+ { flags: '--commit-msg-file <path>', description: 'Commit message file to append trailers to (git hook $1). If omitted, prints to stdout' },
116
+ { flags: '--source <source>', description: 'Commit source (git hook $2): merge, squash, message, template, commit' },
117
+ { flags: '--repo <path>', description: 'Repository root (defaults to git rev-parse --show-toplevel)' },
118
+ ],
119
+ async action(opts) {
120
+ // Skip merge/squash commits
121
+ if (opts.source === 'merge' || opts.source === 'squash')
122
+ return;
123
+ const repoRoot = gitRoot(opts.repo);
124
+ let existingMsg = '';
125
+ if (opts.commitMsgFile && existsSync(opts.commitMsgFile)) {
126
+ try {
127
+ existingMsg = readFileSync(opts.commitMsgFile, 'utf8');
128
+ }
129
+ catch { /* ignore */ }
130
+ }
131
+ // Don't double-add trailers
132
+ if (/^AI-Origin:/m.test(existingMsg))
133
+ return;
134
+ const { origin, tool, model } = detectTool();
135
+ const specRef = detectSpecRef(repoRoot, existingMsg);
136
+ const projectBasename = basename(repoRoot);
137
+ const projectFilter = repoRoot.replace(/^\//, '').replace(/\//g, '-');
138
+ // Token tracking (snapshot delta) — only when an AI tool is detected
139
+ let inputTokens = null;
140
+ let outputTokens = null;
141
+ let cost = null;
142
+ if (tool) {
143
+ const usage = await collectUsage(tool, projectBasename, projectFilter);
144
+ if (usage) {
145
+ const curIn = sumTokens(usage, 'inputTokens');
146
+ const curOut = sumTokens(usage, 'outputTokens');
147
+ const curCost = usage.overview?.cost ?? 0;
148
+ const trackerDir = resolve(homedir(), '.prism', 'tokentracker');
149
+ const trackerFile = resolve(trackerDir, `${projectBasename}.json`);
150
+ if (existsSync(trackerFile)) {
151
+ try {
152
+ const prev = JSON.parse(readFileSync(trackerFile, 'utf8'));
153
+ inputTokens = Math.max(0, curIn - (prev.inputTokens || 0));
154
+ outputTokens = Math.max(0, curOut - (prev.outputTokens || 0));
155
+ cost = Math.max(0, curCost - (prev.cost || 0));
156
+ }
157
+ catch {
158
+ inputTokens = 0;
159
+ outputTokens = 0;
160
+ cost = 0;
161
+ }
162
+ }
163
+ else {
164
+ // First commit for this project — no delta baseline yet
165
+ inputTokens = 0;
166
+ outputTokens = 0;
167
+ cost = 0;
168
+ }
169
+ // Persist the new snapshot for the next commit's delta
170
+ try {
171
+ mkdirSync(trackerDir, { recursive: true });
172
+ const snap = { inputTokens: curIn, outputTokens: curOut, cost: curCost };
173
+ writeFileSync(trackerFile, JSON.stringify(snap) + '\n');
174
+ }
175
+ catch { /* non-fatal */ }
176
+ }
177
+ }
178
+ // Clamp to configured bounds
179
+ const { maxTokens, maxCost } = readBounds(repoRoot);
180
+ if (inputTokens !== null)
181
+ inputTokens = Math.min(inputTokens, maxTokens);
182
+ if (outputTokens !== null)
183
+ outputTokens = Math.min(outputTokens, maxTokens);
184
+ if (cost !== null && cost > maxCost)
185
+ cost = maxCost;
186
+ // Build trailer block
187
+ const lines = [`AI-Origin: ${origin}`];
188
+ if (tool)
189
+ lines.push(`AI-Tool: ${tool}`);
190
+ if (model)
191
+ lines.push(`AI-Model: ${model}`);
192
+ if (inputTokens !== null)
193
+ lines.push(`AI-Input-Tokens: ${inputTokens}`);
194
+ if (outputTokens !== null)
195
+ lines.push(`AI-Output-Tokens: ${outputTokens}`);
196
+ if (cost !== null)
197
+ lines.push(`AI-Cost: $${formatCost(cost)}`);
198
+ if (specRef)
199
+ lines.push(`Spec-Ref: ${specRef}`);
200
+ const block = lines.join('\n');
201
+ if (opts.commitMsgFile) {
202
+ // Ensure a blank line separates the message body from the trailers
203
+ let out = existingMsg;
204
+ if (out.length > 0)
205
+ out = out.replace(/\n+$/, '') + '\n\n';
206
+ out += block + '\n';
207
+ try {
208
+ writeFileSync(opts.commitMsgFile, out);
209
+ }
210
+ catch { /* fail open — never block the commit */ }
211
+ }
212
+ else {
213
+ console.log(block);
214
+ }
215
+ },
216
+ };
217
+ //# sourceMappingURL=commit-trailers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-trailers.js","sourceRoot":"","sources":["../../../../src/commands/git/commit-trailers.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,27 @@
1
+ /** codeburn-compatible token usage shape, shared across parse-code-tool commands. */
2
+ export interface CodeburnOutput {
3
+ overview: {
4
+ cost: number;
5
+ calls: number;
6
+ sessions: number;
7
+ };
8
+ models: {
9
+ name: string;
10
+ inputTokens: number;
11
+ outputTokens: number;
12
+ }[];
13
+ projects: {
14
+ name: string;
15
+ cost: number;
16
+ calls: number;
17
+ }[];
18
+ }
19
+ /**
20
+ * Parse a Kiro CLI session file into codeburn-compatible token usage.
21
+ * Returns `null` when no session id can be resolved; returns a zero-usage
22
+ * object when the session file does not exist.
23
+ */
24
+ export declare function collectKiroCli(sessionIdOpt?: string, project?: string): Promise<CodeburnOutput | null>;
1
25
  declare const _default: {
2
26
  description: string;
3
27
  options: ({
@@ -1 +1 @@
1
- {"version":3,"file":"kiro-cli.d.ts","sourceRoot":"","sources":["../../../../src/commands/parse-code-tool/kiro-cli.ts"],"names":[],"mappings":";;;;;;;;;;;iBAqCqB;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;AAP7E,wBA0EE"}
1
+ {"version":3,"file":"kiro-cli.d.ts","sourceRoot":"","sources":["../../../../src/commands/parse-code-tool/kiro-cli.ts"],"names":[],"mappings":"AA8BA,qFAAqF;AACrF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtE,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3D;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAoDhC;;;;;;;;;;;;iBASoB;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;AAP7E,wBAwBE"}
@@ -17,6 +17,74 @@ function calculateCost(model, input, output) {
17
17
  function getCliSessionsDir() {
18
18
  return join(homedir(), '.kiro', 'sessions', 'cli');
19
19
  }
20
+ /**
21
+ * Parse a Kiro CLI session file into codeburn-compatible token usage.
22
+ * Returns `null` when no session id can be resolved; returns a zero-usage
23
+ * object when the session file does not exist.
24
+ */
25
+ export async function collectKiroCli(sessionIdOpt, project) {
26
+ const sessionId = sessionIdOpt || process.env.KIRO_SESSION_ID;
27
+ if (!sessionId)
28
+ return null;
29
+ const filePath = join(getCliSessionsDir(), `${sessionId}.jsonl`);
30
+ let raw;
31
+ try {
32
+ raw = await readFile(filePath, 'utf-8');
33
+ }
34
+ catch {
35
+ // No session file — zero usage
36
+ return { overview: { cost: 0, calls: 0, sessions: 0 }, models: [], projects: [] };
37
+ }
38
+ let inputChars = 0, outputChars = 0, calls = 0;
39
+ for (const line of raw.split('\n')) {
40
+ if (!line.trim())
41
+ continue;
42
+ let entry;
43
+ try {
44
+ entry = JSON.parse(line);
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ const kind = entry.kind;
50
+ const content = entry.data?.content;
51
+ if (!content || !Array.isArray(content))
52
+ continue;
53
+ for (const item of content) {
54
+ if (item.kind === 'text' && typeof item.data === 'string') {
55
+ if (kind === 'Prompt' || kind === 'ToolResults')
56
+ inputChars += item.data.length;
57
+ else if (kind === 'AssistantMessage') {
58
+ outputChars += item.data.length;
59
+ }
60
+ }
61
+ else if (item.kind === 'toolUse' && item.data) {
62
+ // Tool calls are output (assistant decided to call a tool)
63
+ outputChars += JSON.stringify(item.data.input ?? '').length;
64
+ }
65
+ else if (item.kind === 'toolResult' && item.data) {
66
+ // Tool results are input (fed back to model)
67
+ const rc = item.data.content;
68
+ if (Array.isArray(rc)) {
69
+ for (const r of rc)
70
+ inputChars += typeof r.data === 'string' ? r.data.length : JSON.stringify(r.data ?? '').length;
71
+ }
72
+ }
73
+ }
74
+ if (kind === 'AssistantMessage')
75
+ calls++;
76
+ }
77
+ const inputTokens = Math.ceil(inputChars / CHARS_PER_TOKEN);
78
+ const outputTokens = Math.ceil(outputChars / CHARS_PER_TOKEN);
79
+ const model = 'kiro-auto';
80
+ const cost = Math.round(calculateCost(model, inputTokens, outputTokens) * 100) / 100;
81
+ const projectName = project || 'unknown';
82
+ return {
83
+ overview: { cost, calls, sessions: 1 },
84
+ models: [{ name: model, inputTokens, outputTokens }],
85
+ projects: [{ name: projectName, cost, calls }],
86
+ };
87
+ }
20
88
  export default {
21
89
  description: 'Parse Kiro CLI session files and output token usage (codeburn-compatible JSON)',
22
90
  options: [
@@ -25,76 +93,18 @@ export default {
25
93
  { flags: '--format <fmt>', description: 'Output format: json, summary', default: 'json' },
26
94
  ],
27
95
  async action(opts) {
28
- const sessionId = opts.sessionId || process.env.KIRO_SESSION_ID;
29
- if (!sessionId) {
96
+ const output = await collectKiroCli(opts.sessionId, opts.project);
97
+ if (!output) {
30
98
  console.error('No session ID: pass --session-id or set KIRO_SESSION_ID');
31
99
  process.exit(1);
32
100
  }
33
- const filePath = join(getCliSessionsDir(), `${sessionId}.jsonl`);
34
- let raw;
35
- try {
36
- raw = await readFile(filePath, 'utf-8');
37
- }
38
- catch {
39
- // No session file — output zero tokens
40
- const output = { overview: { cost: 0, calls: 0, sessions: 0 }, models: [], projects: [] };
41
- console.log(JSON.stringify(output, null, 2));
42
- return;
43
- }
44
- let inputChars = 0, outputChars = 0, calls = 0;
45
- for (const line of raw.split('\n')) {
46
- if (!line.trim())
47
- continue;
48
- let entry;
49
- try {
50
- entry = JSON.parse(line);
51
- }
52
- catch {
53
- continue;
54
- }
55
- const kind = entry.kind;
56
- const content = entry.data?.content;
57
- if (!content || !Array.isArray(content))
58
- continue;
59
- for (const item of content) {
60
- if (item.kind === 'text' && typeof item.data === 'string') {
61
- if (kind === 'Prompt' || kind === 'ToolResults')
62
- inputChars += item.data.length;
63
- else if (kind === 'AssistantMessage') {
64
- outputChars += item.data.length;
65
- }
66
- }
67
- else if (item.kind === 'toolUse' && item.data) {
68
- // Tool calls are output (assistant decided to call a tool)
69
- outputChars += JSON.stringify(item.data.input ?? '').length;
70
- }
71
- else if (item.kind === 'toolResult' && item.data) {
72
- // Tool results are input (fed back to model)
73
- const rc = item.data.content;
74
- if (Array.isArray(rc)) {
75
- for (const r of rc)
76
- inputChars += typeof r.data === 'string' ? r.data.length : JSON.stringify(r.data ?? '').length;
77
- }
78
- }
79
- }
80
- if (kind === 'AssistantMessage')
81
- calls++;
82
- }
83
- const inputTokens = Math.ceil(inputChars / CHARS_PER_TOKEN);
84
- const outputTokens = Math.ceil(outputChars / CHARS_PER_TOKEN);
85
- const model = 'kiro-auto';
86
- const cost = calculateCost(model, inputTokens, outputTokens);
87
- const projectName = opts.project || 'unknown';
88
- const output = {
89
- overview: { cost: Math.round(cost * 100) / 100, calls, sessions: 1 },
90
- models: [{ name: model, inputTokens, outputTokens }],
91
- projects: [{ name: projectName, cost: Math.round(cost * 100) / 100, calls }],
92
- };
93
101
  if (opts.format === 'summary') {
94
- console.log(`Kiro CLI Token Usage (session: ${sessionId.slice(0, 8)}...)`);
95
- console.log(` Calls: ${calls}`);
102
+ const m = output.models[0];
103
+ console.log('Kiro CLI Token Usage');
104
+ console.log(` Calls: ${output.overview.calls}`);
96
105
  console.log(` Cost: $${output.overview.cost}`);
97
- console.log(` ${model}: ${inputTokens} in / ${outputTokens} out`);
106
+ if (m)
107
+ console.log(` ${m.name}: ${m.inputTokens} in / ${m.outputTokens} out`);
98
108
  }
99
109
  else {
100
110
  console.log(JSON.stringify(output, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"kiro-cli.js","sourceRoot":"","sources":["../../../../src/commands/parse-code-tool/kiro-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kiro-cli.js","sourceRoot":"","sources":["../../../../src/commands/parse-code-tool/kiro-cli.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ import type { CodeburnOutput } from './kiro-cli.js';
2
+ /**
3
+ * Parse Kiro IDE session files into codeburn-compatible token usage.
4
+ * Returns a zero-usage object when the Kiro agent dir is not present.
5
+ */
6
+ export declare function collectKiroIde(targetProject?: string, period?: string): Promise<CodeburnOutput>;
1
7
  declare const _default: {
2
8
  description: string;
3
9
  options: ({
@@ -1 +1 @@
1
- {"version":3,"file":"kiro-ide.d.ts","sourceRoot":"","sources":["../../../../src/commands/parse-code-tool/kiro-ide.ts"],"names":[],"mappings":";;;;;;;;;;;iBAiMqB;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;AAPzE,wBA2GE"}
1
+ {"version":3,"file":"kiro-ide.d.ts","sourceRoot":"","sources":["../../../../src/commands/parse-code-tool/kiro-ide.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAgOpD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,MAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CA+G5G;;;;;;;;;;;;iBASoB;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;AAPzE,wBAoBE"}