rafcode 2.1.1 → 2.2.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/.claude/settings.local.json +4 -1
- package/CLAUDE.md +59 -11
- package/RAF/ahslfe-config-wizard/decisions.md +34 -0
- package/RAF/ahslfe-config-wizard/input.md +1 -0
- package/RAF/ahslfe-config-wizard/outcomes/01-define-config-schema.md +38 -0
- package/RAF/ahslfe-config-wizard/outcomes/02-refactor-codebase-to-use-config.md +67 -0
- package/RAF/ahslfe-config-wizard/outcomes/03-create-config-documentation.md +37 -0
- package/RAF/ahslfe-config-wizard/outcomes/04-implement-raf-config-command.md +47 -0
- package/RAF/ahslfe-config-wizard/outcomes/05-update-claude-md.md +26 -0
- package/RAF/ahslfe-config-wizard/plans/01-define-config-schema.md +73 -0
- package/RAF/ahslfe-config-wizard/plans/02-refactor-codebase-to-use-config.md +74 -0
- package/RAF/ahslfe-config-wizard/plans/03-create-config-documentation.md +57 -0
- package/RAF/ahslfe-config-wizard/plans/04-implement-raf-config-command.md +66 -0
- package/RAF/ahslfe-config-wizard/plans/05-update-claude-md.md +60 -0
- package/RAF/ahstvo-token-tracker/decisions.md +44 -0
- package/RAF/ahstvo-token-tracker/input.md +3 -0
- package/RAF/ahstvo-token-tracker/outcomes/01-full-model-id-support.md +43 -0
- package/RAF/ahstvo-token-tracker/outcomes/02-name-generation-no-session.md +33 -0
- package/RAF/ahstvo-token-tracker/outcomes/03-unify-stream-json-execution.md +48 -0
- package/RAF/ahstvo-token-tracker/outcomes/04-token-tracking-cost-calculation.md +53 -0
- package/RAF/ahstvo-token-tracker/outcomes/05-token-cost-console-reporting.md +57 -0
- package/RAF/ahstvo-token-tracker/outcomes/06-runtime-verbose-toggle.md +53 -0
- package/RAF/ahstvo-token-tracker/outcomes/07-readme-config-docs.md +36 -0
- package/RAF/ahstvo-token-tracker/plans/01-full-model-id-support.md +35 -0
- package/RAF/ahstvo-token-tracker/plans/02-name-generation-no-session.md +36 -0
- package/RAF/ahstvo-token-tracker/plans/03-unify-stream-json-execution.md +44 -0
- package/RAF/ahstvo-token-tracker/plans/04-token-tracking-cost-calculation.md +56 -0
- package/RAF/ahstvo-token-tracker/plans/05-token-cost-console-reporting.md +55 -0
- package/RAF/ahstvo-token-tracker/plans/06-runtime-verbose-toggle.md +48 -0
- package/RAF/ahstvo-token-tracker/plans/07-readme-config-docs.md +44 -0
- package/README.md +34 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +173 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/do.d.ts.map +1 -1
- package/dist/commands/do.js +47 -6
- package/dist/commands/do.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +3 -2
- package/dist/commands/plan.js.map +1 -1
- package/dist/core/claude-runner.d.ts +19 -2
- package/dist/core/claude-runner.d.ts.map +1 -1
- package/dist/core/claude-runner.js +43 -96
- package/dist/core/claude-runner.js.map +1 -1
- package/dist/core/failure-analyzer.d.ts.map +1 -1
- package/dist/core/failure-analyzer.js +6 -3
- package/dist/core/failure-analyzer.js.map +1 -1
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +10 -3
- package/dist/core/git.js.map +1 -1
- package/dist/core/pull-request.d.ts +1 -1
- package/dist/core/pull-request.d.ts.map +1 -1
- package/dist/core/pull-request.js +7 -4
- package/dist/core/pull-request.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/parsers/stream-renderer.d.ts +16 -1
- package/dist/parsers/stream-renderer.d.ts.map +1 -1
- package/dist/parsers/stream-renderer.js +34 -4
- package/dist/parsers/stream-renderer.js.map +1 -1
- package/dist/prompts/execution.d.ts.map +1 -1
- package/dist/prompts/execution.js +11 -1
- package/dist/prompts/execution.js.map +1 -1
- package/dist/types/config.d.ts +95 -4
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +63 -3
- package/dist/types/config.js.map +1 -1
- package/dist/utils/config.d.ts +59 -7
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +276 -21
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/name-generator.d.ts +3 -7
- package/dist/utils/name-generator.d.ts.map +1 -1
- package/dist/utils/name-generator.js +75 -61
- package/dist/utils/name-generator.js.map +1 -1
- package/dist/utils/terminal-symbols.d.ts +21 -0
- package/dist/utils/terminal-symbols.d.ts.map +1 -1
- package/dist/utils/terminal-symbols.js +62 -0
- package/dist/utils/terminal-symbols.js.map +1 -1
- package/dist/utils/token-tracker.d.ts +45 -0
- package/dist/utils/token-tracker.d.ts.map +1 -0
- package/dist/utils/token-tracker.js +107 -0
- package/dist/utils/token-tracker.js.map +1 -0
- package/dist/utils/validation.d.ts +5 -5
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +10 -6
- package/dist/utils/validation.js.map +1 -1
- package/dist/utils/verbose-toggle.d.ts +33 -0
- package/dist/utils/verbose-toggle.d.ts.map +1 -0
- package/dist/utils/verbose-toggle.js +94 -0
- package/dist/utils/verbose-toggle.js.map +1 -0
- package/package.json +1 -1
- package/src/commands/config.ts +204 -0
- package/src/commands/do.ts +56 -5
- package/src/commands/plan.ts +3 -2
- package/src/core/claude-runner.ts +59 -115
- package/src/core/failure-analyzer.ts +6 -3
- package/src/core/git.ts +10 -3
- package/src/core/pull-request.ts +7 -4
- package/src/index.ts +2 -0
- package/src/parsers/stream-renderer.ts +54 -4
- package/src/prompts/config-docs.md +331 -0
- package/src/prompts/execution.ts +13 -1
- package/src/types/config.ts +156 -7
- package/src/utils/config.ts +335 -21
- package/src/utils/name-generator.ts +84 -71
- package/src/utils/terminal-symbols.ts +68 -0
- package/src/utils/token-tracker.ts +135 -0
- package/src/utils/validation.ts +15 -10
- package/src/utils/verbose-toggle.ts +103 -0
- package/tests/unit/claude-runner.test.ts +171 -7
- package/tests/unit/config-command.test.ts +163 -0
- package/tests/unit/config.test.ts +608 -30
- package/tests/unit/name-generator.test.ts +99 -75
- package/tests/unit/pull-request.test.ts +2 -0
- package/tests/unit/stream-renderer.test.ts +83 -0
- package/tests/unit/terminal-symbols.test.ts +157 -0
- package/tests/unit/token-tracker.test.ts +352 -0
- package/tests/unit/verbose-toggle.test.ts +204 -0
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generate a single project name using Claude
|
|
2
|
+
* Generate a single project name using Claude.
|
|
3
3
|
* Falls back to extracting words from the description if the API call fails.
|
|
4
4
|
*/
|
|
5
5
|
export declare function generateProjectName(description: string): Promise<string>;
|
|
6
6
|
/**
|
|
7
|
-
* Generate multiple project name suggestions using Claude
|
|
7
|
+
* Generate multiple project name suggestions using Claude.
|
|
8
8
|
* Returns 3-5 unique names with varied styles.
|
|
9
9
|
*/
|
|
10
10
|
export declare function generateProjectNames(description: string): Promise<string[]>;
|
|
11
|
-
/**
|
|
12
|
-
* Escape a string for use as a shell argument.
|
|
13
|
-
*/
|
|
14
|
-
declare function escapeShellArg(arg: string): string;
|
|
15
11
|
/**
|
|
16
12
|
* Sanitize the generated name to ensure it's a valid kebab-case folder name.
|
|
17
13
|
*/
|
|
18
14
|
declare function sanitizeGeneratedName(name: string): string | null;
|
|
19
|
-
export { sanitizeGeneratedName
|
|
15
|
+
export { sanitizeGeneratedName };
|
|
20
16
|
//# sourceMappingURL=name-generator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-generator.d.ts","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"name-generator.d.ts","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"AA6FA;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB9E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAejF;AAwCD;;GAEG;AACH,iBAAS,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyB1D;AAqBD,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
2
|
import { logger } from './logger.js';
|
|
3
3
|
import { sanitizeProjectName } from './validation.js';
|
|
4
|
-
|
|
4
|
+
import { getModel, getClaudeCommand } from './config.js';
|
|
5
5
|
const NAME_GENERATION_PROMPT = `Generate a short, punchy, creative project name (1-3 words, kebab-case).
|
|
6
6
|
|
|
7
7
|
Be creative! Use metaphors, analogies, or evocative words that capture the SPIRIT of the project.
|
|
@@ -36,7 +36,53 @@ Output format: ONLY output 5 names, one per line, no numbers, no explanations, n
|
|
|
36
36
|
|
|
37
37
|
Project description:`;
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
39
|
+
* Run Claude CLI with the given prompt and return stdout.
|
|
40
|
+
* Uses spawn with --no-session-persistence to avoid cluttering session history.
|
|
41
|
+
*/
|
|
42
|
+
function runClaudePrint(prompt) {
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
const model = getModel('nameGeneration');
|
|
45
|
+
const cmd = getClaudeCommand();
|
|
46
|
+
const proc = spawn(cmd, [
|
|
47
|
+
'--model', model,
|
|
48
|
+
'--no-session-persistence',
|
|
49
|
+
'-p',
|
|
50
|
+
prompt,
|
|
51
|
+
], {
|
|
52
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
53
|
+
});
|
|
54
|
+
let stdout = '';
|
|
55
|
+
let stderr = '';
|
|
56
|
+
const timeoutHandle = setTimeout(() => {
|
|
57
|
+
proc.kill('SIGTERM');
|
|
58
|
+
}, 30000);
|
|
59
|
+
proc.stdout.on('data', (data) => {
|
|
60
|
+
stdout += data.toString();
|
|
61
|
+
});
|
|
62
|
+
proc.stderr.on('data', (data) => {
|
|
63
|
+
stderr += data.toString();
|
|
64
|
+
});
|
|
65
|
+
proc.on('close', (exitCode) => {
|
|
66
|
+
clearTimeout(timeoutHandle);
|
|
67
|
+
if (exitCode !== 0) {
|
|
68
|
+
if (stderr) {
|
|
69
|
+
logger.debug(`Claude CLI stderr: ${stderr}`);
|
|
70
|
+
}
|
|
71
|
+
resolve(null);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
resolve(stdout.trim());
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
proc.on('error', (error) => {
|
|
78
|
+
clearTimeout(timeoutHandle);
|
|
79
|
+
logger.debug(`Claude CLI spawn error: ${error}`);
|
|
80
|
+
resolve(null);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Generate a single project name using Claude.
|
|
40
86
|
* Falls back to extracting words from the description if the API call fails.
|
|
41
87
|
*/
|
|
42
88
|
export async function generateProjectName(description) {
|
|
@@ -51,13 +97,13 @@ export async function generateProjectName(description) {
|
|
|
51
97
|
}
|
|
52
98
|
}
|
|
53
99
|
catch (error) {
|
|
54
|
-
logger.debug(`Failed to generate name with
|
|
100
|
+
logger.debug(`Failed to generate name with Claude: ${error}`);
|
|
55
101
|
}
|
|
56
102
|
// Fallback to extracting words from description
|
|
57
103
|
return generateFallbackName(description);
|
|
58
104
|
}
|
|
59
105
|
/**
|
|
60
|
-
* Generate multiple project name suggestions using Claude
|
|
106
|
+
* Generate multiple project name suggestions using Claude.
|
|
61
107
|
* Returns 3-5 unique names with varied styles.
|
|
62
108
|
*/
|
|
63
109
|
export async function generateProjectNames(description) {
|
|
@@ -69,7 +115,7 @@ export async function generateProjectNames(description) {
|
|
|
69
115
|
}
|
|
70
116
|
}
|
|
71
117
|
catch (error) {
|
|
72
|
-
logger.debug(`Failed to generate names with
|
|
118
|
+
logger.debug(`Failed to generate names with Claude: ${error}`);
|
|
73
119
|
}
|
|
74
120
|
// Fallback: generate a single fallback name
|
|
75
121
|
const fallbackName = generateFallbackName(description);
|
|
@@ -77,68 +123,36 @@ export async function generateProjectNames(description) {
|
|
|
77
123
|
return [fallbackName];
|
|
78
124
|
}
|
|
79
125
|
/**
|
|
80
|
-
* Call Claude
|
|
126
|
+
* Call Claude to generate a single project name.
|
|
81
127
|
*/
|
|
82
128
|
async function callSonnetForName(description) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
// Use claude CLI with --model sonnet and --print for non-interactive output
|
|
86
|
-
const result = execSync(`claude --model ${SONNET_MODEL} --print "${escapeShellArg(fullPrompt)}"`, {
|
|
87
|
-
encoding: 'utf-8',
|
|
88
|
-
timeout: 30000, // 30 second timeout
|
|
89
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
90
|
-
});
|
|
91
|
-
return result.trim();
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
logger.debug(`Sonnet API call failed: ${error}`);
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
129
|
+
const fullPrompt = `${NAME_GENERATION_PROMPT}\n${description}`;
|
|
130
|
+
return runClaudePrint(fullPrompt);
|
|
97
131
|
}
|
|
98
132
|
/**
|
|
99
|
-
* Call Claude
|
|
133
|
+
* Call Claude to generate multiple project names.
|
|
100
134
|
*/
|
|
101
135
|
async function callSonnetForMultipleNames(description) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
encoding: 'utf-8',
|
|
106
|
-
timeout: 30000,
|
|
107
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
108
|
-
});
|
|
109
|
-
// Parse the multiline response
|
|
110
|
-
const lines = result
|
|
111
|
-
.trim()
|
|
112
|
-
.split('\n')
|
|
113
|
-
.map((line) => line.trim())
|
|
114
|
-
.filter((line) => line.length > 0);
|
|
115
|
-
// Sanitize and validate each name
|
|
116
|
-
const validNames = [];
|
|
117
|
-
for (const line of lines) {
|
|
118
|
-
const sanitized = sanitizeGeneratedName(line);
|
|
119
|
-
if (sanitized && !validNames.includes(sanitized)) {
|
|
120
|
-
validNames.push(sanitized);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
// Return 3-5 names
|
|
124
|
-
return validNames.slice(0, 5);
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
logger.debug(`Sonnet API call for multiple names failed: ${error}`);
|
|
136
|
+
const fullPrompt = `${MULTI_NAME_GENERATION_PROMPT}\n${description}`;
|
|
137
|
+
const result = await runClaudePrint(fullPrompt);
|
|
138
|
+
if (!result) {
|
|
128
139
|
return [];
|
|
129
140
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
.
|
|
140
|
-
|
|
141
|
-
|
|
141
|
+
// Parse the multiline response
|
|
142
|
+
const lines = result
|
|
143
|
+
.split('\n')
|
|
144
|
+
.map((line) => line.trim())
|
|
145
|
+
.filter((line) => line.length > 0);
|
|
146
|
+
// Sanitize and validate each name
|
|
147
|
+
const validNames = [];
|
|
148
|
+
for (const line of lines) {
|
|
149
|
+
const sanitized = sanitizeGeneratedName(line);
|
|
150
|
+
if (sanitized && !validNames.includes(sanitized)) {
|
|
151
|
+
validNames.push(sanitized);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Return 3-5 names
|
|
155
|
+
return validNames.slice(0, 5);
|
|
142
156
|
}
|
|
143
157
|
/**
|
|
144
158
|
* Sanitize the generated name to ensure it's a valid kebab-case folder name.
|
|
@@ -179,5 +193,5 @@ function generateFallbackName(description) {
|
|
|
179
193
|
return name;
|
|
180
194
|
}
|
|
181
195
|
// Export for testing
|
|
182
|
-
export { sanitizeGeneratedName
|
|
196
|
+
export { sanitizeGeneratedName };
|
|
183
197
|
//# sourceMappingURL=name-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Terminal symbols and formatting helpers for beautiful terminal output.
|
|
3
3
|
* All functions are pure and testable - no side effects.
|
|
4
4
|
*/
|
|
5
|
+
import type { UsageData } from '../types/config.js';
|
|
6
|
+
import type { CostBreakdown } from './token-tracker.js';
|
|
5
7
|
/**
|
|
6
8
|
* Visual symbols for terminal output using dots/symbols style.
|
|
7
9
|
*/
|
|
@@ -48,4 +50,23 @@ export declare function formatSummary(completed: number, failed: number, pending
|
|
|
48
50
|
* @returns Formatted string like "✓✓●○○"
|
|
49
51
|
*/
|
|
50
52
|
export declare function formatProgressBar(tasks: TaskStatus[]): string;
|
|
53
|
+
/**
|
|
54
|
+
* Formats a number with thousands separators (e.g., 12345 -> "12,345").
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatNumber(n: number): string;
|
|
57
|
+
/**
|
|
58
|
+
* Formats a cost in USD with 2-4 decimal places.
|
|
59
|
+
* Uses 2 decimals for values >= $0.01, 4 decimals for smaller values.
|
|
60
|
+
*/
|
|
61
|
+
export declare function formatCost(cost: number): string;
|
|
62
|
+
/**
|
|
63
|
+
* Formats a per-task token usage summary line.
|
|
64
|
+
* Example: " Tokens: 5,234 in / 1,023 out | Cache: 18,500 read | Est. cost: $0.42"
|
|
65
|
+
*/
|
|
66
|
+
export declare function formatTaskTokenSummary(usage: UsageData, cost: CostBreakdown): string;
|
|
67
|
+
/**
|
|
68
|
+
* Formats the grand total token usage summary block.
|
|
69
|
+
* Displayed after all tasks complete.
|
|
70
|
+
*/
|
|
71
|
+
export declare function formatTokenTotalSummary(usage: UsageData, cost: CostBreakdown): string;
|
|
51
72
|
//# sourceMappingURL=terminal-symbols.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-symbols.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"terminal-symbols.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;;;CAOV,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAYpF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAYR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,MAAU,GAClB,MAAM,CAwBR;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAM7D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAiBpF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAoBrF"}
|
|
@@ -96,4 +96,66 @@ export function formatProgressBar(tasks) {
|
|
|
96
96
|
}
|
|
97
97
|
return tasks.map((status) => SYMBOLS[status]).join('');
|
|
98
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Formats a number with thousands separators (e.g., 12345 -> "12,345").
|
|
101
|
+
*/
|
|
102
|
+
export function formatNumber(n) {
|
|
103
|
+
return n.toLocaleString('en-US');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Formats a cost in USD with 2-4 decimal places.
|
|
107
|
+
* Uses 2 decimals for values >= $0.01, 4 decimals for smaller values.
|
|
108
|
+
*/
|
|
109
|
+
export function formatCost(cost) {
|
|
110
|
+
if (cost === 0)
|
|
111
|
+
return '$0.00';
|
|
112
|
+
if (cost < 0.01)
|
|
113
|
+
return `$${cost.toFixed(4)}`;
|
|
114
|
+
return `$${cost.toFixed(2)}`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Formats a per-task token usage summary line.
|
|
118
|
+
* Example: " Tokens: 5,234 in / 1,023 out | Cache: 18,500 read | Est. cost: $0.42"
|
|
119
|
+
*/
|
|
120
|
+
export function formatTaskTokenSummary(usage, cost) {
|
|
121
|
+
const parts = [];
|
|
122
|
+
parts.push(`Tokens: ${formatNumber(usage.inputTokens)} in / ${formatNumber(usage.outputTokens)} out`);
|
|
123
|
+
const cacheTotal = usage.cacheReadInputTokens + usage.cacheCreationInputTokens;
|
|
124
|
+
if (cacheTotal > 0) {
|
|
125
|
+
if (usage.cacheReadInputTokens > 0 && usage.cacheCreationInputTokens > 0) {
|
|
126
|
+
parts.push(`Cache: ${formatNumber(usage.cacheReadInputTokens)} read / ${formatNumber(usage.cacheCreationInputTokens)} created`);
|
|
127
|
+
}
|
|
128
|
+
else if (usage.cacheReadInputTokens > 0) {
|
|
129
|
+
parts.push(`Cache: ${formatNumber(usage.cacheReadInputTokens)} read`);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
parts.push(`Cache: ${formatNumber(usage.cacheCreationInputTokens)} created`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
parts.push(`Est. cost: ${formatCost(cost.totalCost)}`);
|
|
136
|
+
return ` ${parts.join(' | ')}`;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Formats the grand total token usage summary block.
|
|
140
|
+
* Displayed after all tasks complete.
|
|
141
|
+
*/
|
|
142
|
+
export function formatTokenTotalSummary(usage, cost) {
|
|
143
|
+
const lines = [];
|
|
144
|
+
const divider = '── Token Usage Summary ──────────────────';
|
|
145
|
+
lines.push(divider);
|
|
146
|
+
lines.push(`Total tokens: ${formatNumber(usage.inputTokens)} in / ${formatNumber(usage.outputTokens)} out`);
|
|
147
|
+
if (usage.cacheReadInputTokens > 0 || usage.cacheCreationInputTokens > 0) {
|
|
148
|
+
const cacheParts = [];
|
|
149
|
+
if (usage.cacheReadInputTokens > 0) {
|
|
150
|
+
cacheParts.push(`${formatNumber(usage.cacheReadInputTokens)} read`);
|
|
151
|
+
}
|
|
152
|
+
if (usage.cacheCreationInputTokens > 0) {
|
|
153
|
+
cacheParts.push(`${formatNumber(usage.cacheCreationInputTokens)} created`);
|
|
154
|
+
}
|
|
155
|
+
lines.push(`Cache: ${cacheParts.join(' / ')}`);
|
|
156
|
+
}
|
|
157
|
+
lines.push(`Estimated cost: ${formatCost(cost.totalCost)}`);
|
|
158
|
+
lines.push('─────────────────────────────────────────');
|
|
159
|
+
return lines.join('\n');
|
|
160
|
+
}
|
|
99
161
|
//# sourceMappingURL=terminal-symbols.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-symbols.js","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-symbols.js","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { UsageData, PricingConfig } from '../types/config.js';
|
|
2
|
+
/** Cost breakdown for a single task or accumulated total. */
|
|
3
|
+
export interface CostBreakdown {
|
|
4
|
+
inputCost: number;
|
|
5
|
+
outputCost: number;
|
|
6
|
+
cacheReadCost: number;
|
|
7
|
+
cacheCreateCost: number;
|
|
8
|
+
totalCost: number;
|
|
9
|
+
}
|
|
10
|
+
/** Per-task usage snapshot stored by the tracker. */
|
|
11
|
+
export interface TaskUsageEntry {
|
|
12
|
+
taskId: string;
|
|
13
|
+
usage: UsageData;
|
|
14
|
+
cost: CostBreakdown;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Accumulates token usage across multiple task executions and calculates costs
|
|
18
|
+
* using configurable per-model pricing.
|
|
19
|
+
*/
|
|
20
|
+
export declare class TokenTracker {
|
|
21
|
+
private entries;
|
|
22
|
+
private pricingConfig;
|
|
23
|
+
constructor(pricingConfig?: PricingConfig);
|
|
24
|
+
/**
|
|
25
|
+
* Record usage data from a completed task.
|
|
26
|
+
*/
|
|
27
|
+
addTask(taskId: string, usage: UsageData): TaskUsageEntry;
|
|
28
|
+
/**
|
|
29
|
+
* Get all recorded task entries.
|
|
30
|
+
*/
|
|
31
|
+
getEntries(): readonly TaskUsageEntry[];
|
|
32
|
+
/**
|
|
33
|
+
* Get accumulated totals across all tasks.
|
|
34
|
+
*/
|
|
35
|
+
getTotals(): {
|
|
36
|
+
usage: UsageData;
|
|
37
|
+
cost: CostBreakdown;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Calculate cost for a given UsageData using per-model pricing.
|
|
41
|
+
* Uses per-model breakdown when available, falls back to aggregate with sonnet pricing.
|
|
42
|
+
*/
|
|
43
|
+
calculateCost(usage: UsageData): CostBreakdown;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=token-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-tracker.d.ts","sourceRoot":"","sources":["../../src/utils/token-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG9D,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,CAAC,EAAE,aAAa;IAIzC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,cAAc;IAOzD;;OAEG;IACH,UAAU,IAAI,SAAS,cAAc,EAAE;IAIvC;;OAEG;IACH,SAAS,IAAI;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,aAAa,CAAA;KAAE;IA6CtD;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa;CAkC/C"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { resolveModelPricingCategory, getPricingConfig } from './config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Accumulates token usage across multiple task executions and calculates costs
|
|
4
|
+
* using configurable per-model pricing.
|
|
5
|
+
*/
|
|
6
|
+
export class TokenTracker {
|
|
7
|
+
entries = [];
|
|
8
|
+
pricingConfig;
|
|
9
|
+
constructor(pricingConfig) {
|
|
10
|
+
this.pricingConfig = pricingConfig ?? getPricingConfig();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Record usage data from a completed task.
|
|
14
|
+
*/
|
|
15
|
+
addTask(taskId, usage) {
|
|
16
|
+
const cost = this.calculateCost(usage);
|
|
17
|
+
const entry = { taskId, usage, cost };
|
|
18
|
+
this.entries.push(entry);
|
|
19
|
+
return entry;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get all recorded task entries.
|
|
23
|
+
*/
|
|
24
|
+
getEntries() {
|
|
25
|
+
return this.entries;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get accumulated totals across all tasks.
|
|
29
|
+
*/
|
|
30
|
+
getTotals() {
|
|
31
|
+
const totalUsage = {
|
|
32
|
+
inputTokens: 0,
|
|
33
|
+
outputTokens: 0,
|
|
34
|
+
cacheReadInputTokens: 0,
|
|
35
|
+
cacheCreationInputTokens: 0,
|
|
36
|
+
modelUsage: {},
|
|
37
|
+
};
|
|
38
|
+
const totalCost = {
|
|
39
|
+
inputCost: 0,
|
|
40
|
+
outputCost: 0,
|
|
41
|
+
cacheReadCost: 0,
|
|
42
|
+
cacheCreateCost: 0,
|
|
43
|
+
totalCost: 0,
|
|
44
|
+
};
|
|
45
|
+
for (const entry of this.entries) {
|
|
46
|
+
totalUsage.inputTokens += entry.usage.inputTokens;
|
|
47
|
+
totalUsage.outputTokens += entry.usage.outputTokens;
|
|
48
|
+
totalUsage.cacheReadInputTokens += entry.usage.cacheReadInputTokens;
|
|
49
|
+
totalUsage.cacheCreationInputTokens += entry.usage.cacheCreationInputTokens;
|
|
50
|
+
// Merge per-model usage
|
|
51
|
+
for (const [modelId, modelUsage] of Object.entries(entry.usage.modelUsage)) {
|
|
52
|
+
const existing = totalUsage.modelUsage[modelId];
|
|
53
|
+
if (existing) {
|
|
54
|
+
existing.inputTokens += modelUsage.inputTokens;
|
|
55
|
+
existing.outputTokens += modelUsage.outputTokens;
|
|
56
|
+
existing.cacheReadInputTokens += modelUsage.cacheReadInputTokens;
|
|
57
|
+
existing.cacheCreationInputTokens += modelUsage.cacheCreationInputTokens;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
totalUsage.modelUsage[modelId] = { ...modelUsage };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
totalCost.inputCost += entry.cost.inputCost;
|
|
64
|
+
totalCost.outputCost += entry.cost.outputCost;
|
|
65
|
+
totalCost.cacheReadCost += entry.cost.cacheReadCost;
|
|
66
|
+
totalCost.cacheCreateCost += entry.cost.cacheCreateCost;
|
|
67
|
+
totalCost.totalCost += entry.cost.totalCost;
|
|
68
|
+
}
|
|
69
|
+
return { usage: totalUsage, cost: totalCost };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Calculate cost for a given UsageData using per-model pricing.
|
|
73
|
+
* Uses per-model breakdown when available, falls back to aggregate with sonnet pricing.
|
|
74
|
+
*/
|
|
75
|
+
calculateCost(usage) {
|
|
76
|
+
const result = {
|
|
77
|
+
inputCost: 0,
|
|
78
|
+
outputCost: 0,
|
|
79
|
+
cacheReadCost: 0,
|
|
80
|
+
cacheCreateCost: 0,
|
|
81
|
+
totalCost: 0,
|
|
82
|
+
};
|
|
83
|
+
const modelEntries = Object.entries(usage.modelUsage);
|
|
84
|
+
if (modelEntries.length > 0) {
|
|
85
|
+
// Use per-model breakdown for accurate pricing
|
|
86
|
+
for (const [modelId, modelUsage] of modelEntries) {
|
|
87
|
+
const category = resolveModelPricingCategory(modelId);
|
|
88
|
+
const pricing = this.pricingConfig[category ?? 'sonnet'];
|
|
89
|
+
result.inputCost += (modelUsage.inputTokens / 1_000_000) * pricing.inputPerMTok;
|
|
90
|
+
result.outputCost += (modelUsage.outputTokens / 1_000_000) * pricing.outputPerMTok;
|
|
91
|
+
result.cacheReadCost += (modelUsage.cacheReadInputTokens / 1_000_000) * pricing.cacheReadPerMTok;
|
|
92
|
+
result.cacheCreateCost += (modelUsage.cacheCreationInputTokens / 1_000_000) * pricing.cacheCreatePerMTok;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Fallback: use aggregate totals with sonnet pricing
|
|
97
|
+
const pricing = this.pricingConfig.sonnet;
|
|
98
|
+
result.inputCost = (usage.inputTokens / 1_000_000) * pricing.inputPerMTok;
|
|
99
|
+
result.outputCost = (usage.outputTokens / 1_000_000) * pricing.outputPerMTok;
|
|
100
|
+
result.cacheReadCost = (usage.cacheReadInputTokens / 1_000_000) * pricing.cacheReadPerMTok;
|
|
101
|
+
result.cacheCreateCost = (usage.cacheCreationInputTokens / 1_000_000) * pricing.cacheCreatePerMTok;
|
|
102
|
+
}
|
|
103
|
+
result.totalCost = result.inputCost + result.outputCost + result.cacheReadCost + result.cacheCreateCost;
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=token-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/utils/token-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ClaudeModelName, ModelScenario } from '../types/config.js';
|
|
1
2
|
export interface ValidationResult {
|
|
2
3
|
valid: boolean;
|
|
3
4
|
warnings: string[];
|
|
@@ -9,9 +10,8 @@ export declare function sanitizeProjectName(name: string): string;
|
|
|
9
10
|
export declare function validateProjectExists(rafDir: string, projectName: string): string | null;
|
|
10
11
|
export declare function validatePlansExist(projectPath: string): boolean;
|
|
11
12
|
export declare function reportValidation(result: ValidationResult): void;
|
|
12
|
-
|
|
13
|
-
export type ValidModelName =
|
|
14
|
-
export declare function validateModelName(model: string):
|
|
15
|
-
export declare function resolveModelOption(model?: string, sonnet?: boolean):
|
|
16
|
-
export {};
|
|
13
|
+
/** @deprecated Use ClaudeModelName from types/config.js instead */
|
|
14
|
+
export type ValidModelName = ClaudeModelName;
|
|
15
|
+
export declare function validateModelName(model: string): ClaudeModelName | null;
|
|
16
|
+
export declare function resolveModelOption(model?: string, sonnet?: boolean, scenario?: ModelScenario): ClaudeModelName;
|
|
17
17
|
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIzE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CA4BtD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIzD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAaxF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAQ/D;AAED,mEAAmE;AACnE,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC;AAE7C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CASvE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAE,aAAyB,GAAG,eAAe,CAsBzH"}
|
package/dist/utils/validation.js
CHANGED
|
@@ -2,6 +2,8 @@ import * as fs from 'node:fs';
|
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import { execSync } from 'node:child_process';
|
|
4
4
|
import { logger } from './logger.js';
|
|
5
|
+
import { VALID_MODEL_ALIASES, FULL_MODEL_ID_PATTERN } from '../types/config.js';
|
|
6
|
+
import { getModel } from './config.js';
|
|
5
7
|
export function validateEnvironment() {
|
|
6
8
|
const result = {
|
|
7
9
|
valid: true,
|
|
@@ -69,15 +71,17 @@ export function reportValidation(result) {
|
|
|
69
71
|
logger.error(error);
|
|
70
72
|
}
|
|
71
73
|
}
|
|
72
|
-
const VALID_MODELS = ['sonnet', 'haiku', 'opus'];
|
|
73
74
|
export function validateModelName(model) {
|
|
74
75
|
const normalized = model.toLowerCase();
|
|
75
|
-
if (
|
|
76
|
+
if (VALID_MODEL_ALIASES.includes(normalized)) {
|
|
77
|
+
return normalized;
|
|
78
|
+
}
|
|
79
|
+
if (FULL_MODEL_ID_PATTERN.test(normalized)) {
|
|
76
80
|
return normalized;
|
|
77
81
|
}
|
|
78
82
|
return null;
|
|
79
83
|
}
|
|
80
|
-
export function resolveModelOption(model, sonnet) {
|
|
84
|
+
export function resolveModelOption(model, sonnet, scenario = 'execute') {
|
|
81
85
|
// Check for conflicting flags
|
|
82
86
|
if (model && sonnet) {
|
|
83
87
|
throw new Error('Cannot specify both --model and --sonnet flags');
|
|
@@ -90,11 +94,11 @@ export function resolveModelOption(model, sonnet) {
|
|
|
90
94
|
if (model) {
|
|
91
95
|
const validated = validateModelName(model);
|
|
92
96
|
if (!validated) {
|
|
93
|
-
throw new Error(`Invalid model name: "${model}". Valid options: ${
|
|
97
|
+
throw new Error(`Invalid model name: "${model}". Valid options: ${VALID_MODEL_ALIASES.join(', ')} or a full model ID (e.g., claude-sonnet-4-5-20250929)`);
|
|
94
98
|
}
|
|
95
99
|
return validated;
|
|
96
100
|
}
|
|
97
|
-
// Default
|
|
98
|
-
return
|
|
101
|
+
// Default from config
|
|
102
|
+
return getModel(scenario);
|
|
99
103
|
}
|
|
100
104
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|