rafcode 2.1.0 → 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 +50 -28
- 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 +17 -13
- package/dist/core/claude-runner.d.ts.map +1 -1
- package/dist/core/claude-runner.js +42 -257
- 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/core/shutdown-handler.d.ts.map +1 -1
- package/dist/core/shutdown-handler.js +0 -4
- package/dist/core/shutdown-handler.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 -4
- package/dist/parsers/stream-renderer.d.ts.map +1 -1
- package/dist/parsers/stream-renderer.js +35 -5
- 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 -5
- 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 +59 -27
- package/src/commands/plan.ts +3 -2
- package/src/core/claude-runner.ts +58 -311
- 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/core/shutdown-handler.ts +0 -5
- package/src/index.ts +2 -0
- package/src/parsers/stream-renderer.ts +55 -8
- package/src/prompts/config-docs.md +331 -0
- package/src/prompts/execution.ts +13 -1
- package/src/types/config.ts +156 -8
- 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 +216 -403
- 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 -30
- 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
- package/RAF/ahrtxf-session-sentinel/decisions.md +0 -19
- package/RAF/ahrtxf-session-sentinel/input.md +0 -1
- package/RAF/ahrtxf-session-sentinel/outcomes/01-capture-session-id.md +0 -37
- package/RAF/ahrtxf-session-sentinel/outcomes/02-resume-flag.md +0 -45
- package/RAF/ahrtxf-session-sentinel/plans/01-capture-session-id.md +0 -41
- package/RAF/ahrtxf-session-sentinel/plans/02-resume-flag.md +0 -51
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,SAAS,EAGT,UAAU,EAIV,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,aAAa,EACd,MAAM,oBAAoB,CAAC;AAK5B,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAsBD,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAUD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CA6G1D;AAkCD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAW5D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAE7I;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAMvE;AAMD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAK7C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,eAAe,CAEjE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,GAAG,WAAW,CAE/D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAE9D;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAcnF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY,CAElE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAI/F;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYnE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAOxF"}
|
package/dist/utils/config.js
CHANGED
|
@@ -1,39 +1,294 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import * as os from 'node:os';
|
|
4
|
-
import { DEFAULT_RAF_CONFIG } from '../types/config.js';
|
|
4
|
+
import { DEFAULT_CONFIG, DEFAULT_RAF_CONFIG, VALID_MODEL_ALIASES, FULL_MODEL_ID_PATTERN, VALID_EFFORTS, } from '../types/config.js';
|
|
5
|
+
const CONFIG_DIR = path.join(os.homedir(), '.raf');
|
|
5
6
|
const CONFIG_FILENAME = 'raf.config.json';
|
|
7
|
+
export function getConfigPath() {
|
|
8
|
+
return path.join(CONFIG_DIR, CONFIG_FILENAME);
|
|
9
|
+
}
|
|
6
10
|
/**
|
|
7
11
|
* Get the path to Claude CLI settings file.
|
|
8
12
|
*/
|
|
9
13
|
export function getClaudeSettingsPath() {
|
|
10
14
|
return path.join(os.homedir(), '.claude', 'settings.json');
|
|
11
15
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
// ---- Validation ----
|
|
17
|
+
const VALID_TOP_LEVEL_KEYS = new Set([
|
|
18
|
+
'models', 'effort', 'timeout', 'maxRetries', 'autoCommit',
|
|
19
|
+
'worktree', 'commitFormat', 'claudeCommand', 'pricing',
|
|
20
|
+
]);
|
|
21
|
+
const VALID_PRICING_CATEGORIES = new Set(['opus', 'sonnet', 'haiku']);
|
|
22
|
+
const VALID_PRICING_FIELDS = new Set(['inputPerMTok', 'outputPerMTok', 'cacheReadPerMTok', 'cacheCreatePerMTok']);
|
|
23
|
+
const VALID_MODEL_KEYS = new Set([
|
|
24
|
+
'plan', 'execute', 'nameGeneration', 'failureAnalysis', 'prGeneration', 'config',
|
|
25
|
+
]);
|
|
26
|
+
const VALID_EFFORT_KEYS = new Set([
|
|
27
|
+
'plan', 'execute', 'nameGeneration', 'failureAnalysis', 'prGeneration', 'config',
|
|
28
|
+
]);
|
|
29
|
+
const VALID_COMMIT_FORMAT_KEYS = new Set(['task', 'plan', 'amend', 'prefix']);
|
|
30
|
+
export class ConfigValidationError extends Error {
|
|
31
|
+
constructor(message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = 'ConfigValidationError';
|
|
16
34
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
35
|
+
}
|
|
36
|
+
function checkUnknownKeys(obj, validKeys, prefix) {
|
|
37
|
+
for (const key of Object.keys(obj)) {
|
|
38
|
+
if (!validKeys.has(key)) {
|
|
39
|
+
throw new ConfigValidationError(`Unknown config key: ${prefix ? `${prefix}.` : ''}${key}`);
|
|
40
|
+
}
|
|
21
41
|
}
|
|
22
|
-
|
|
23
|
-
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check whether a string is a valid model name — either a short alias or a full model ID.
|
|
45
|
+
*/
|
|
46
|
+
export function isValidModelName(value) {
|
|
47
|
+
return VALID_MODEL_ALIASES.includes(value) || FULL_MODEL_ID_PATTERN.test(value);
|
|
48
|
+
}
|
|
49
|
+
export function validateConfig(config) {
|
|
50
|
+
if (config === null || typeof config !== 'object' || Array.isArray(config)) {
|
|
51
|
+
throw new ConfigValidationError('Config must be a JSON object');
|
|
52
|
+
}
|
|
53
|
+
const obj = config;
|
|
54
|
+
checkUnknownKeys(obj, VALID_TOP_LEVEL_KEYS, '');
|
|
55
|
+
// models
|
|
56
|
+
if (obj.models !== undefined) {
|
|
57
|
+
if (typeof obj.models !== 'object' || obj.models === null || Array.isArray(obj.models)) {
|
|
58
|
+
throw new ConfigValidationError('models must be an object');
|
|
59
|
+
}
|
|
60
|
+
const models = obj.models;
|
|
61
|
+
checkUnknownKeys(models, VALID_MODEL_KEYS, 'models');
|
|
62
|
+
for (const [key, val] of Object.entries(models)) {
|
|
63
|
+
if (typeof val !== 'string' || !isValidModelName(val)) {
|
|
64
|
+
throw new ConfigValidationError(`models.${key} must be a short alias (${VALID_MODEL_ALIASES.join(', ')}) or a full model ID (e.g., claude-sonnet-4-5-20250929)`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// effort
|
|
69
|
+
if (obj.effort !== undefined) {
|
|
70
|
+
if (typeof obj.effort !== 'object' || obj.effort === null || Array.isArray(obj.effort)) {
|
|
71
|
+
throw new ConfigValidationError('effort must be an object');
|
|
72
|
+
}
|
|
73
|
+
const effort = obj.effort;
|
|
74
|
+
checkUnknownKeys(effort, VALID_EFFORT_KEYS, 'effort');
|
|
75
|
+
for (const [key, val] of Object.entries(effort)) {
|
|
76
|
+
if (typeof val !== 'string' || !VALID_EFFORTS.includes(val)) {
|
|
77
|
+
throw new ConfigValidationError(`effort.${key} must be one of: ${VALID_EFFORTS.join(', ')}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// timeout
|
|
82
|
+
if (obj.timeout !== undefined) {
|
|
83
|
+
if (typeof obj.timeout !== 'number' || obj.timeout <= 0 || !Number.isFinite(obj.timeout)) {
|
|
84
|
+
throw new ConfigValidationError('timeout must be a positive number');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// maxRetries
|
|
88
|
+
if (obj.maxRetries !== undefined) {
|
|
89
|
+
if (typeof obj.maxRetries !== 'number' || obj.maxRetries < 0 || !Number.isInteger(obj.maxRetries)) {
|
|
90
|
+
throw new ConfigValidationError('maxRetries must be a non-negative integer');
|
|
91
|
+
}
|
|
24
92
|
}
|
|
93
|
+
// autoCommit
|
|
94
|
+
if (obj.autoCommit !== undefined) {
|
|
95
|
+
if (typeof obj.autoCommit !== 'boolean') {
|
|
96
|
+
throw new ConfigValidationError('autoCommit must be a boolean');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// worktree
|
|
100
|
+
if (obj.worktree !== undefined) {
|
|
101
|
+
if (typeof obj.worktree !== 'boolean') {
|
|
102
|
+
throw new ConfigValidationError('worktree must be a boolean');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// commitFormat
|
|
106
|
+
if (obj.commitFormat !== undefined) {
|
|
107
|
+
if (typeof obj.commitFormat !== 'object' || obj.commitFormat === null || Array.isArray(obj.commitFormat)) {
|
|
108
|
+
throw new ConfigValidationError('commitFormat must be an object');
|
|
109
|
+
}
|
|
110
|
+
const cf = obj.commitFormat;
|
|
111
|
+
checkUnknownKeys(cf, VALID_COMMIT_FORMAT_KEYS, 'commitFormat');
|
|
112
|
+
for (const [key, val] of Object.entries(cf)) {
|
|
113
|
+
if (typeof val !== 'string') {
|
|
114
|
+
throw new ConfigValidationError(`commitFormat.${key} must be a string`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// claudeCommand
|
|
119
|
+
if (obj.claudeCommand !== undefined) {
|
|
120
|
+
if (typeof obj.claudeCommand !== 'string' || obj.claudeCommand.trim() === '') {
|
|
121
|
+
throw new ConfigValidationError('claudeCommand must be a non-empty string');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// pricing
|
|
125
|
+
if (obj.pricing !== undefined) {
|
|
126
|
+
if (typeof obj.pricing !== 'object' || obj.pricing === null || Array.isArray(obj.pricing)) {
|
|
127
|
+
throw new ConfigValidationError('pricing must be an object');
|
|
128
|
+
}
|
|
129
|
+
const pricing = obj.pricing;
|
|
130
|
+
checkUnknownKeys(pricing, VALID_PRICING_CATEGORIES, 'pricing');
|
|
131
|
+
for (const [category, catVal] of Object.entries(pricing)) {
|
|
132
|
+
if (typeof catVal !== 'object' || catVal === null || Array.isArray(catVal)) {
|
|
133
|
+
throw new ConfigValidationError(`pricing.${category} must be an object`);
|
|
134
|
+
}
|
|
135
|
+
const fields = catVal;
|
|
136
|
+
checkUnknownKeys(fields, VALID_PRICING_FIELDS, `pricing.${category}`);
|
|
137
|
+
for (const [field, val] of Object.entries(fields)) {
|
|
138
|
+
if (typeof val !== 'number' || val < 0 || !Number.isFinite(val)) {
|
|
139
|
+
throw new ConfigValidationError(`pricing.${category}.${field} must be a non-negative number`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return config;
|
|
25
145
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
146
|
+
// ---- Deep merge ----
|
|
147
|
+
function deepMerge(defaults, overrides) {
|
|
148
|
+
const result = { ...defaults };
|
|
149
|
+
if (overrides.models) {
|
|
150
|
+
result.models = { ...defaults.models, ...overrides.models };
|
|
151
|
+
}
|
|
152
|
+
if (overrides.effort) {
|
|
153
|
+
result.effort = { ...defaults.effort, ...overrides.effort };
|
|
154
|
+
}
|
|
155
|
+
if (overrides.commitFormat) {
|
|
156
|
+
result.commitFormat = { ...defaults.commitFormat, ...overrides.commitFormat };
|
|
157
|
+
}
|
|
158
|
+
if (overrides.pricing) {
|
|
159
|
+
result.pricing = {
|
|
160
|
+
opus: { ...defaults.pricing.opus, ...overrides.pricing.opus },
|
|
161
|
+
sonnet: { ...defaults.pricing.sonnet, ...overrides.pricing.sonnet },
|
|
162
|
+
haiku: { ...defaults.pricing.haiku, ...overrides.pricing.haiku },
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (overrides.timeout !== undefined)
|
|
166
|
+
result.timeout = overrides.timeout;
|
|
167
|
+
if (overrides.maxRetries !== undefined)
|
|
168
|
+
result.maxRetries = overrides.maxRetries;
|
|
169
|
+
if (overrides.autoCommit !== undefined)
|
|
170
|
+
result.autoCommit = overrides.autoCommit;
|
|
171
|
+
if (overrides.worktree !== undefined)
|
|
172
|
+
result.worktree = overrides.worktree;
|
|
173
|
+
if (overrides.claudeCommand !== undefined)
|
|
174
|
+
result.claudeCommand = overrides.claudeCommand;
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
// ---- Config loading ----
|
|
178
|
+
/**
|
|
179
|
+
* Resolve the final config by loading from ~/.raf/raf.config.json and merging with defaults.
|
|
180
|
+
* Throws ConfigValidationError if the file contains invalid values.
|
|
181
|
+
*/
|
|
182
|
+
export function resolveConfig(configPath) {
|
|
183
|
+
const filePath = configPath ?? getConfigPath();
|
|
184
|
+
if (!fs.existsSync(filePath)) {
|
|
185
|
+
return { ...DEFAULT_CONFIG, models: { ...DEFAULT_CONFIG.models }, effort: { ...DEFAULT_CONFIG.effort }, commitFormat: { ...DEFAULT_CONFIG.commitFormat } };
|
|
186
|
+
}
|
|
187
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
188
|
+
const parsed = JSON.parse(content);
|
|
189
|
+
const validated = validateConfig(parsed);
|
|
190
|
+
return deepMerge(DEFAULT_CONFIG, validated);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* @deprecated Use resolveConfig() instead. Kept for backward compatibility.
|
|
194
|
+
*/
|
|
195
|
+
export function loadConfig(_rafDir) {
|
|
196
|
+
return { ...DEFAULT_RAF_CONFIG };
|
|
197
|
+
}
|
|
198
|
+
export function saveConfig(configPath, config) {
|
|
199
|
+
const dir = path.dirname(configPath);
|
|
200
|
+
if (!fs.existsSync(dir)) {
|
|
201
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
202
|
+
}
|
|
203
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
204
|
+
}
|
|
205
|
+
// ---- Helper accessors ----
|
|
206
|
+
let _cachedConfig = null;
|
|
207
|
+
/**
|
|
208
|
+
* Get the resolved config, caching the result for the process lifetime.
|
|
209
|
+
* Call resetConfigCache() in tests to clear.
|
|
210
|
+
*/
|
|
211
|
+
export function getResolvedConfig() {
|
|
212
|
+
if (!_cachedConfig) {
|
|
213
|
+
_cachedConfig = resolveConfig();
|
|
214
|
+
}
|
|
215
|
+
return _cachedConfig;
|
|
216
|
+
}
|
|
217
|
+
export function resetConfigCache() {
|
|
218
|
+
_cachedConfig = null;
|
|
219
|
+
}
|
|
220
|
+
export function getModel(scenario) {
|
|
221
|
+
return getResolvedConfig().models[scenario];
|
|
222
|
+
}
|
|
223
|
+
export function getEffort(scenario) {
|
|
224
|
+
return getResolvedConfig().effort[scenario];
|
|
225
|
+
}
|
|
226
|
+
export function getCommitFormat(type) {
|
|
227
|
+
return getResolvedConfig().commitFormat[type];
|
|
228
|
+
}
|
|
229
|
+
export function getCommitPrefix() {
|
|
230
|
+
return getResolvedConfig().commitFormat.prefix;
|
|
231
|
+
}
|
|
232
|
+
export function getTimeout() {
|
|
233
|
+
return getResolvedConfig().timeout;
|
|
234
|
+
}
|
|
235
|
+
export function getMaxRetries() {
|
|
236
|
+
return getResolvedConfig().maxRetries;
|
|
237
|
+
}
|
|
238
|
+
export function getAutoCommit() {
|
|
239
|
+
return getResolvedConfig().autoCommit;
|
|
240
|
+
}
|
|
241
|
+
export function getWorktreeDefault() {
|
|
242
|
+
return getResolvedConfig().worktree;
|
|
243
|
+
}
|
|
244
|
+
export function getClaudeCommand() {
|
|
245
|
+
return getResolvedConfig().claudeCommand;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Map a full model ID (e.g., `claude-opus-4-6`) or short alias to a pricing category.
|
|
249
|
+
* Returns null if the model cannot be mapped.
|
|
250
|
+
*/
|
|
251
|
+
export function resolveModelPricingCategory(modelId) {
|
|
252
|
+
// Short aliases map directly
|
|
253
|
+
if (modelId === 'opus' || modelId === 'sonnet' || modelId === 'haiku') {
|
|
254
|
+
return modelId;
|
|
255
|
+
}
|
|
256
|
+
// Full model IDs: extract family from `claude-{family}-{version}`
|
|
257
|
+
const match = modelId.match(/^claude-([a-z]+)-/);
|
|
258
|
+
if (match) {
|
|
259
|
+
const family = match[1];
|
|
260
|
+
if (family === 'opus' || family === 'sonnet' || family === 'haiku') {
|
|
261
|
+
return family;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get pricing config for a specific model category.
|
|
268
|
+
*/
|
|
269
|
+
export function getPricing(category) {
|
|
270
|
+
return getResolvedConfig().pricing[category];
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get the full pricing config.
|
|
274
|
+
*/
|
|
275
|
+
export function getPricingConfig() {
|
|
276
|
+
return getResolvedConfig().pricing;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Render a commit message template by replacing {placeholder} tokens with values.
|
|
280
|
+
* Unknown placeholders are left as-is.
|
|
281
|
+
*/
|
|
282
|
+
export function renderCommitMessage(template, variables) {
|
|
283
|
+
return template.replace(/\{(\w+)\}/g, (match, key) => {
|
|
284
|
+
return variables[key] ?? match;
|
|
285
|
+
});
|
|
29
286
|
}
|
|
30
287
|
export function getEditor() {
|
|
31
288
|
return process.env['EDITOR'] ?? process.env['VISUAL'] ?? 'vi';
|
|
32
289
|
}
|
|
33
290
|
/**
|
|
34
291
|
* Get the Claude model name from Claude CLI settings.
|
|
35
|
-
* Returns the model name or null if not found.
|
|
36
|
-
* @param settingsPath Optional path to settings file (for testing)
|
|
37
292
|
*/
|
|
38
293
|
export function getClaudeModel(settingsPath) {
|
|
39
294
|
const filePath = settingsPath ?? getClaudeSettingsPath();
|
|
@@ -50,14 +305,14 @@ export function getClaudeModel(settingsPath) {
|
|
|
50
305
|
}
|
|
51
306
|
}
|
|
52
307
|
/**
|
|
53
|
-
*
|
|
54
|
-
* Returns default values which can be overridden by command line options.
|
|
308
|
+
* @deprecated Use getTimeout(), getMaxRetries(), getAutoCommit() instead.
|
|
55
309
|
*/
|
|
56
310
|
export function getConfig() {
|
|
311
|
+
const config = getResolvedConfig();
|
|
57
312
|
return {
|
|
58
|
-
timeout:
|
|
59
|
-
maxRetries:
|
|
60
|
-
autoCommit:
|
|
313
|
+
timeout: config.timeout,
|
|
314
|
+
maxRetries: config.maxRetries,
|
|
315
|
+
autoCommit: config.autoCommit,
|
|
61
316
|
};
|
|
62
317
|
}
|
|
63
318
|
//# sourceMappingURL=config.js.map
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAa,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAEtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,GAAG,kBAAkB,EAAE,CAAC;IACnC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QAC7D,OAAO,EAAE,GAAG,kBAAkB,EAAE,GAAG,UAAU,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,kBAAkB,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,MAAiB;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACtD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,YAAqB;IAClD,MAAM,QAAQ,GAAG,YAAY,IAAI,qBAAqB,EAAE,CAAC;IACzD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QAC3D,OAAO,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,OAAO,EAAE,kBAAkB,CAAC,cAAc;QAC1C,UAAU,EAAE,kBAAkB,CAAC,iBAAiB;QAChD,UAAU,EAAE,kBAAkB,CAAC,UAAU;KAC1C,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|