rafcode 2.4.0 → 2.4.1-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 +3 -1
- package/CLAUDE.md +3 -1
- package/RAF/ahwidh-quick-fix-gremlin/decisions.md +37 -0
- package/RAF/ahwidh-quick-fix-gremlin/input.md +35 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/01-fix-name-generation-prompt.md +33 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/02-fix-amend-commit-scope.md +43 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/03-fix-diverged-main-branch-sync.md +32 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/04-wire-rate-limit-to-do-command.md +61 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/05-add-config-get-set-flags.md +125 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/06-sync-worktree-branch-before-execution.md +96 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/07-update-frontmatter-format.md +107 -0
- package/RAF/ahwidh-quick-fix-gremlin/outcomes/08-remove-plan-token-report.md +76 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/01-fix-name-generation-prompt.md +52 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/02-fix-amend-commit-scope.md +48 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/03-fix-diverged-main-branch-sync.md +49 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/04-wire-rate-limit-to-do-command.md +78 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/05-add-config-get-set-flags.md +101 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/06-sync-worktree-branch-before-execution.md +92 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/07-update-frontmatter-format.md +105 -0
- package/RAF/ahwidh-quick-fix-gremlin/plans/08-remove-plan-token-report.md +50 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +209 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/do.d.ts.map +1 -1
- package/dist/commands/do.js +36 -5
- package/dist/commands/do.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +2 -55
- package/dist/commands/plan.js.map +1 -1
- package/dist/core/claude-runner.d.ts +0 -6
- package/dist/core/claude-runner.d.ts.map +1 -1
- package/dist/core/claude-runner.js +1 -5
- package/dist/core/claude-runner.js.map +1 -1
- package/dist/core/worktree.d.ts +12 -0
- package/dist/core/worktree.d.ts.map +1 -1
- package/dist/core/worktree.js +33 -1
- package/dist/core/worktree.js.map +1 -1
- package/dist/prompts/amend.d.ts.map +1 -1
- package/dist/prompts/amend.js +3 -1
- package/dist/prompts/amend.js.map +1 -1
- package/dist/prompts/planning.d.ts.map +1 -1
- package/dist/prompts/planning.js +3 -1
- package/dist/prompts/planning.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +13 -3
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +40 -10
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/name-generator.d.ts.map +1 -1
- package/dist/utils/name-generator.js +7 -16
- package/dist/utils/name-generator.js.map +1 -1
- package/dist/utils/terminal-symbols.js +2 -2
- package/dist/utils/terminal-symbols.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/config.ts +242 -0
- package/src/commands/do.ts +37 -4
- package/src/commands/plan.ts +2 -65
- package/src/core/claude-runner.ts +1 -12
- package/src/core/worktree.ts +37 -1
- package/src/prompts/amend.ts +3 -1
- package/src/prompts/planning.ts +3 -1
- package/src/utils/frontmatter.ts +41 -11
- package/src/utils/name-generator.ts +7 -16
- package/src/utils/terminal-symbols.ts +2 -2
- package/tests/unit/commit-planning-artifacts-worktree.test.ts +6 -14
- package/tests/unit/commit-planning-artifacts.test.ts +4 -12
- package/tests/unit/config-command.test.ts +170 -0
- package/tests/unit/frontmatter.test.ts +95 -1
- package/tests/unit/name-generator.test.ts +1 -1
- package/tests/unit/post-execution-picker.test.ts +1 -0
- package/tests/unit/worktree.test.ts +68 -1
- package/src/utils/session-parser.ts +0 -161
- package/tests/unit/session-parser.test.ts +0 -301
|
@@ -3,10 +3,20 @@ import { isValidModelName } from './config.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* Parse Obsidian-style frontmatter from plan file content.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
6
|
+
* Supports two formats:
|
|
7
|
+
* 1. Standard format (preferred): `---` delimiter at the top and bottom
|
|
8
|
+
* 2. Legacy format (backward compatibility): properties followed by closing `---` only
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
+
* Standard format example:
|
|
11
|
+
* ```
|
|
12
|
+
* ---
|
|
13
|
+
* effort: medium
|
|
14
|
+
* model: sonnet
|
|
15
|
+
* ---
|
|
16
|
+
* # Task: ...
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Legacy format example:
|
|
10
20
|
* ```
|
|
11
21
|
* effort: medium
|
|
12
22
|
* model: sonnet
|
|
@@ -26,14 +36,34 @@ export function parsePlanFrontmatter(content) {
|
|
|
26
36
|
hasFrontmatter: false,
|
|
27
37
|
warnings: [],
|
|
28
38
|
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (
|
|
32
|
-
//
|
|
33
|
-
|
|
39
|
+
const trimmedContent = content.trimStart();
|
|
40
|
+
let frontmatterSection;
|
|
41
|
+
if (trimmedContent.startsWith('---')) {
|
|
42
|
+
// Standard format: ---\nkey: value\n---
|
|
43
|
+
const afterOpener = trimmedContent.substring(3);
|
|
44
|
+
// Skip the rest of the opener line (handles "---\n" or "--- \n")
|
|
45
|
+
const openerEnd = afterOpener.indexOf('\n');
|
|
46
|
+
if (openerEnd === -1) {
|
|
47
|
+
// No newline after opening delimiter - no valid frontmatter
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
const rest = afterOpener.substring(openerEnd + 1);
|
|
51
|
+
const closerIndex = rest.indexOf('---');
|
|
52
|
+
if (closerIndex === -1) {
|
|
53
|
+
// No closing delimiter - no valid frontmatter
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
frontmatterSection = rest.substring(0, closerIndex);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Legacy format: key: value\n---
|
|
60
|
+
const delimiterIndex = content.indexOf('---');
|
|
61
|
+
if (delimiterIndex === -1) {
|
|
62
|
+
// No delimiter found - no frontmatter
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
frontmatterSection = content.substring(0, delimiterIndex);
|
|
34
66
|
}
|
|
35
|
-
// Extract the frontmatter section (everything before the delimiter)
|
|
36
|
-
const frontmatterSection = content.substring(0, delimiterIndex);
|
|
37
67
|
// Parse key: value lines
|
|
38
68
|
const lines = frontmatterSection.split('\n');
|
|
39
69
|
for (const line of lines) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwB/C
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAmFA;;;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"}
|
|
@@ -2,7 +2,9 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { logger } from './logger.js';
|
|
3
3
|
import { sanitizeProjectName } from './validation.js';
|
|
4
4
|
import { getModel } from './config.js';
|
|
5
|
-
const NAME_GENERATION_PROMPT = `
|
|
5
|
+
const NAME_GENERATION_PROMPT = `Output ONLY the kebab-case name. No introduction, no explanation, no quotes.
|
|
6
|
+
|
|
7
|
+
Generate a short, punchy, creative project name (1-3 words, kebab-case).
|
|
6
8
|
|
|
7
9
|
Be creative! Use metaphors, analogies, or evocative words that capture the SPIRIT of the project.
|
|
8
10
|
Don't literally describe what it does - make it memorable and fun.
|
|
@@ -14,25 +16,14 @@ Good examples:
|
|
|
14
16
|
- Refactoring → 'spring-cleaning', 'phoenix', 'makeover'
|
|
15
17
|
- New feature → 'moonshot', 'secret-sauce', 'magic-wand'
|
|
16
18
|
|
|
17
|
-
Output ONLY the kebab-case name. No quotes, no explanation.
|
|
18
|
-
|
|
19
19
|
Project description:`;
|
|
20
|
-
const MULTI_NAME_GENERATION_PROMPT = `
|
|
21
|
-
|
|
22
|
-
IMPORTANT: Each name should use a DIFFERENT naming style:
|
|
23
|
-
1. **Metaphorical** - Use a metaphor or analogy (e.g., 'phoenix', 'lighthouse', 'compass')
|
|
24
|
-
2. **Fun/Playful** - Make it fun or quirky (e.g., 'turbo-boost', 'magic-beans', 'ninja-move')
|
|
25
|
-
3. **Action-oriented** - Focus on what it does with flair (e.g., 'bug-squasher', 'speed-demon', 'data-whisperer')
|
|
26
|
-
4. **Abstract** - Use abstract/poetic concepts (e.g., 'horizon', 'cascade', 'catalyst')
|
|
27
|
-
5. **Cultural reference** - Reference pop culture, mythology, or literature (e.g., 'atlas', 'merlin', 'gandalf')
|
|
20
|
+
const MULTI_NAME_GENERATION_PROMPT = `Output EXACTLY 5 project names, one per line. Do NOT include any introduction, explanation, preamble, numbering, or quotes.
|
|
28
21
|
|
|
29
22
|
Rules:
|
|
30
|
-
- Each name
|
|
31
|
-
-
|
|
23
|
+
- Each name: 1-3 words, kebab-case, lowercase with hyphens only
|
|
24
|
+
- Use varied styles: metaphorical, playful, action-oriented, abstract, cultural reference
|
|
32
25
|
- Make them memorable and evocative
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
Output format: ONLY output 5 names, one per line, no numbers, no explanations, no quotes.
|
|
26
|
+
- For projects with many unrelated tasks, prefer abstract/metaphorical names
|
|
36
27
|
|
|
37
28
|
Project description:`;
|
|
38
29
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;qBAcV,CAAC;AAEtB,MAAM,4BAA4B,GAAG
|
|
1
|
+
{"version":3,"file":"name-generator.js","sourceRoot":"","sources":["../../src/utils/name-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -131,7 +131,7 @@ export function formatRateLimitPercentage(percentage) {
|
|
|
131
131
|
* Used internally by formatTaskTokenSummary.
|
|
132
132
|
*/
|
|
133
133
|
function formatTokenLine(usage, costValue, prefix = '', indent = ' ', options = {}) {
|
|
134
|
-
const { showCacheTokens = true, showRateLimitEstimate =
|
|
134
|
+
const { showCacheTokens = true, showRateLimitEstimate = true, rateLimitPercentage } = options;
|
|
135
135
|
const parts = [];
|
|
136
136
|
const tokenPart = `${formatNumber(usage.inputTokens)} in / ${formatNumber(usage.outputTokens)} out`;
|
|
137
137
|
parts.push(prefix ? `${prefix}: ${tokenPart}` : `Tokens: ${tokenPart}`);
|
|
@@ -195,7 +195,7 @@ export function formatTaskTokenSummary(entry, calculateAttemptCost, options = {}
|
|
|
195
195
|
* @param options - Display options for cache tokens and rate limit
|
|
196
196
|
*/
|
|
197
197
|
export function formatTokenTotalSummary(usage, cost, options = {}) {
|
|
198
|
-
const { showCacheTokens = true, showRateLimitEstimate =
|
|
198
|
+
const { showCacheTokens = true, showRateLimitEstimate = true, rateLimitPercentage } = options;
|
|
199
199
|
const lines = [];
|
|
200
200
|
const divider = '── Token Usage Summary ──────────────────';
|
|
201
201
|
lines.push(divider);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-symbols.js","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"terminal-symbols.js","sourceRoot":"","sources":["../../src/utils/terminal-symbols.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/commands/config.ts
CHANGED
|
@@ -13,11 +13,16 @@ import {
|
|
|
13
13
|
validateConfig,
|
|
14
14
|
ConfigValidationError,
|
|
15
15
|
resetConfigCache,
|
|
16
|
+
resolveConfig,
|
|
17
|
+
saveConfig,
|
|
16
18
|
} from '../utils/config.js';
|
|
17
19
|
import { DEFAULT_CONFIG } from '../types/config.js';
|
|
20
|
+
import type { UserConfig } from '../types/config.js';
|
|
18
21
|
|
|
19
22
|
interface ConfigCommandOptions {
|
|
20
23
|
reset?: boolean;
|
|
24
|
+
get?: true | string; // true when --get with no key, string when --get <key>
|
|
25
|
+
set?: string[]; // [key, value]
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
/**
|
|
@@ -114,17 +119,254 @@ async function confirm(message: string): Promise<boolean> {
|
|
|
114
119
|
});
|
|
115
120
|
}
|
|
116
121
|
|
|
122
|
+
// ---- Helper functions for nested config access ----
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Get a nested value from an object using dot notation.
|
|
126
|
+
* Returns undefined if the path doesn't exist.
|
|
127
|
+
*/
|
|
128
|
+
function getNestedValue(obj: unknown, dotPath: string): unknown {
|
|
129
|
+
const keys = dotPath.split('.');
|
|
130
|
+
let current: unknown = obj;
|
|
131
|
+
|
|
132
|
+
for (const key of keys) {
|
|
133
|
+
if (current === null || typeof current !== 'object') {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
current = (current as Record<string, unknown>)[key];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return current;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Set a nested value in an object using dot notation.
|
|
144
|
+
* Creates intermediate objects as needed.
|
|
145
|
+
*/
|
|
146
|
+
function setNestedValue(obj: Record<string, unknown>, dotPath: string, value: unknown): void {
|
|
147
|
+
const keys = dotPath.split('.');
|
|
148
|
+
let current: Record<string, unknown> = obj;
|
|
149
|
+
|
|
150
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
151
|
+
const key = keys[i]!;
|
|
152
|
+
if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {
|
|
153
|
+
current[key] = {};
|
|
154
|
+
}
|
|
155
|
+
current = current[key] as Record<string, unknown>;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const lastKey = keys[keys.length - 1]!;
|
|
159
|
+
current[lastKey] = value;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Delete a nested value from an object using dot notation.
|
|
164
|
+
* Cleans up empty parent objects after deletion.
|
|
165
|
+
*/
|
|
166
|
+
function deleteNestedValue(obj: Record<string, unknown>, dotPath: string): void {
|
|
167
|
+
const keys = dotPath.split('.');
|
|
168
|
+
|
|
169
|
+
// Navigate to parent and delete the key
|
|
170
|
+
if (keys.length === 1) {
|
|
171
|
+
delete obj[keys[0]!];
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Build path to parent
|
|
176
|
+
let current: Record<string, unknown> = obj;
|
|
177
|
+
const path: Array<{ obj: Record<string, unknown>; key: string }> = [];
|
|
178
|
+
|
|
179
|
+
for (let i = 0; i < keys.length - 1; i++) {
|
|
180
|
+
const key = keys[i]!;
|
|
181
|
+
path.push({ obj: current, key });
|
|
182
|
+
|
|
183
|
+
if (typeof current[key] !== 'object' || current[key] === null) {
|
|
184
|
+
return; // Path doesn't exist
|
|
185
|
+
}
|
|
186
|
+
current = current[key] as Record<string, unknown>;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Delete the leaf value
|
|
190
|
+
const lastKey = keys[keys.length - 1]!;
|
|
191
|
+
delete current[lastKey];
|
|
192
|
+
|
|
193
|
+
// Clean up empty parents
|
|
194
|
+
for (let i = path.length - 1; i >= 0; i--) {
|
|
195
|
+
const { obj, key } = path[i]!;
|
|
196
|
+
const child = obj[key] as Record<string, unknown>;
|
|
197
|
+
if (Object.keys(child).length === 0) {
|
|
198
|
+
delete obj[key];
|
|
199
|
+
} else {
|
|
200
|
+
break; // Stop if we find a non-empty parent
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Get the default value at a dot-notation path from DEFAULT_CONFIG.
|
|
207
|
+
*/
|
|
208
|
+
function getDefaultValue(dotPath: string): unknown {
|
|
209
|
+
return getNestedValue(DEFAULT_CONFIG, dotPath);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Parse a string value, attempting JSON.parse for numbers/booleans, falling back to string.
|
|
214
|
+
*/
|
|
215
|
+
function parseValue(value: string): unknown {
|
|
216
|
+
// Try JSON.parse for numbers, booleans, null
|
|
217
|
+
try {
|
|
218
|
+
return JSON.parse(value);
|
|
219
|
+
} catch {
|
|
220
|
+
// Fall back to string
|
|
221
|
+
return value;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Format a value for console output.
|
|
227
|
+
* Strings are printed plain, objects/arrays as JSON.
|
|
228
|
+
*/
|
|
229
|
+
function formatValue(value: unknown): string {
|
|
230
|
+
if (typeof value === 'string') {
|
|
231
|
+
return value;
|
|
232
|
+
}
|
|
233
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
234
|
+
return String(value);
|
|
235
|
+
}
|
|
236
|
+
if (value === null || value === undefined) {
|
|
237
|
+
return String(value);
|
|
238
|
+
}
|
|
239
|
+
return JSON.stringify(value, null, 2);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// ---- Config get/set handlers ----
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Handle --get flag: print config value(s).
|
|
246
|
+
*/
|
|
247
|
+
function handleGet(key: true | string): void {
|
|
248
|
+
const config = resolveConfig();
|
|
249
|
+
|
|
250
|
+
if (key === true) {
|
|
251
|
+
// No key specified: print full config
|
|
252
|
+
console.log(JSON.stringify(config, null, 2));
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Specific key requested
|
|
257
|
+
const value = getNestedValue(config, key);
|
|
258
|
+
|
|
259
|
+
if (value === undefined) {
|
|
260
|
+
logger.error(`Config key not found: ${key}`);
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
console.log(formatValue(value));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Handle --set flag: update config file with a new value.
|
|
269
|
+
*/
|
|
270
|
+
function handleSet(args: string[]): void {
|
|
271
|
+
if (args.length !== 2) {
|
|
272
|
+
logger.error('--set requires exactly 2 arguments: key and value');
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const [key, rawValue] = args as [string, string];
|
|
277
|
+
const value = parseValue(rawValue);
|
|
278
|
+
const configPath = getConfigPath();
|
|
279
|
+
|
|
280
|
+
// Read current user config (or start with empty)
|
|
281
|
+
let userConfig: UserConfig = {};
|
|
282
|
+
if (fs.existsSync(configPath)) {
|
|
283
|
+
try {
|
|
284
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
285
|
+
userConfig = JSON.parse(content) as UserConfig;
|
|
286
|
+
} catch (error) {
|
|
287
|
+
logger.error(`Failed to read config file: ${error}`);
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Check if value matches default
|
|
293
|
+
const defaultValue = getDefaultValue(key);
|
|
294
|
+
|
|
295
|
+
if (defaultValue === undefined) {
|
|
296
|
+
logger.error(`Config key not found in schema: ${key}`);
|
|
297
|
+
process.exit(1);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Deep equality check for objects
|
|
301
|
+
const valuesMatch = JSON.stringify(value) === JSON.stringify(defaultValue);
|
|
302
|
+
|
|
303
|
+
if (valuesMatch) {
|
|
304
|
+
// Remove from config file (keep config minimal)
|
|
305
|
+
deleteNestedValue(userConfig as Record<string, unknown>, key);
|
|
306
|
+
logger.info(`Value matches default, removing ${key} from config`);
|
|
307
|
+
} else {
|
|
308
|
+
// Set the value
|
|
309
|
+
setNestedValue(userConfig as Record<string, unknown>, key, value);
|
|
310
|
+
logger.info(`Set ${key} = ${formatValue(value)}`);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Validate the resulting config
|
|
314
|
+
try {
|
|
315
|
+
validateConfig(userConfig);
|
|
316
|
+
} catch (error) {
|
|
317
|
+
if (error instanceof ConfigValidationError) {
|
|
318
|
+
logger.error(`Validation error: ${error.message}`);
|
|
319
|
+
process.exit(1);
|
|
320
|
+
}
|
|
321
|
+
throw error;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Save or delete config file
|
|
325
|
+
if (Object.keys(userConfig).length === 0) {
|
|
326
|
+
// Config is empty, delete the file
|
|
327
|
+
if (fs.existsSync(configPath)) {
|
|
328
|
+
fs.unlinkSync(configPath);
|
|
329
|
+
logger.info('Config is empty, removed file');
|
|
330
|
+
}
|
|
331
|
+
} else {
|
|
332
|
+
saveConfig(configPath, userConfig);
|
|
333
|
+
logger.success('Config updated successfully');
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
117
337
|
export function createConfigCommand(): Command {
|
|
118
338
|
const command = new Command('config')
|
|
119
339
|
.description('View and edit RAF configuration with Claude')
|
|
120
340
|
.argument('[prompt...]', 'Optional initial prompt for the config session')
|
|
121
341
|
.option('--reset', 'Delete config file and restore all defaults')
|
|
342
|
+
.option('--get [key]', 'Show config value (all config if no key, or specific dot-notation key)')
|
|
343
|
+
.option('--set <items...>', 'Set a config value using dot-notation key and value')
|
|
122
344
|
.action(async (promptParts: string[], options: ConfigCommandOptions) => {
|
|
345
|
+
// --reset takes precedence
|
|
123
346
|
if (options.reset) {
|
|
124
347
|
await handleReset();
|
|
125
348
|
return;
|
|
126
349
|
}
|
|
127
350
|
|
|
351
|
+
// --get and --set are mutually exclusive
|
|
352
|
+
if (options.get !== undefined && options.set !== undefined) {
|
|
353
|
+
logger.error('Cannot use --get and --set together');
|
|
354
|
+
process.exit(1);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Handle --get
|
|
358
|
+
if (options.get !== undefined) {
|
|
359
|
+
handleGet(options.get);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Handle --set
|
|
364
|
+
if (options.set !== undefined) {
|
|
365
|
+
handleSet(options.set);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Default: run interactive session
|
|
128
370
|
const initialPrompt = promptParts.length > 0 ? promptParts.join(' ') : undefined;
|
|
129
371
|
await runConfigSession(initialPrompt);
|
|
130
372
|
});
|
package/src/commands/do.ts
CHANGED
|
@@ -13,7 +13,7 @@ import { getRafDir, extractProjectNumber, extractProjectName, extractTaskNameFro
|
|
|
13
13
|
import { pickPendingProject, getPendingProjects, getPendingWorktreeProjects } from '../ui/project-picker.js';
|
|
14
14
|
import type { PendingProjectInfo } from '../ui/project-picker.js';
|
|
15
15
|
import { logger } from '../utils/logger.js';
|
|
16
|
-
import { getConfig, getWorktreeDefault, getModel, getModelShortName, resolveFullModelId, getSyncMainBranch, resolveEffortToModel, applyModelCeiling } from '../utils/config.js';
|
|
16
|
+
import { getConfig, getWorktreeDefault, getModel, getModelShortName, resolveFullModelId, getSyncMainBranch, resolveEffortToModel, applyModelCeiling, getShowRateLimitEstimate, getShowCacheTokens } from '../utils/config.js';
|
|
17
17
|
import type { PlanFrontmatter } from '../utils/frontmatter.js';
|
|
18
18
|
import { getVersion } from '../utils/version.js';
|
|
19
19
|
import { createTaskTimer, formatElapsedTime } from '../utils/timer.js';
|
|
@@ -53,6 +53,8 @@ import {
|
|
|
53
53
|
resolveWorktreeProjectByIdentifier,
|
|
54
54
|
pushMainBranch,
|
|
55
55
|
pullMainBranch,
|
|
56
|
+
detectMainBranch,
|
|
57
|
+
rebaseOntoMain,
|
|
56
58
|
} from '../core/worktree.js';
|
|
57
59
|
import { createPullRequest, prPreflight } from '../core/pull-request.js';
|
|
58
60
|
import type { DoCommandOptions } from '../types/config.js';
|
|
@@ -224,6 +226,7 @@ async function runDoCommand(projectIdentifierArg: string | undefined, options: D
|
|
|
224
226
|
// Variables for worktree context (set when --worktree is used)
|
|
225
227
|
let worktreeRoot: string | undefined;
|
|
226
228
|
let originalBranch: string | undefined;
|
|
229
|
+
let mainBranchName: string | null = null;
|
|
227
230
|
|
|
228
231
|
if (worktreeMode) {
|
|
229
232
|
// Validate git repo
|
|
@@ -241,6 +244,7 @@ async function runDoCommand(projectIdentifierArg: string | undefined, options: D
|
|
|
241
244
|
// Sync main branch before worktree operations (if enabled)
|
|
242
245
|
if (getSyncMainBranch()) {
|
|
243
246
|
const syncResult = pullMainBranch();
|
|
247
|
+
mainBranchName = syncResult.mainBranch;
|
|
244
248
|
if (syncResult.success) {
|
|
245
249
|
if (syncResult.hadChanges) {
|
|
246
250
|
logger.info(`Synced ${syncResult.mainBranch} from remote`);
|
|
@@ -462,6 +466,20 @@ async function runDoCommand(projectIdentifierArg: string | undefined, options: D
|
|
|
462
466
|
}
|
|
463
467
|
throw error;
|
|
464
468
|
}
|
|
469
|
+
|
|
470
|
+
// Rebase worktree branch onto main before execution (if sync is enabled)
|
|
471
|
+
if (getSyncMainBranch()) {
|
|
472
|
+
const mainBranch = mainBranchName ?? detectMainBranch();
|
|
473
|
+
if (mainBranch) {
|
|
474
|
+
const rebaseResult = rebaseOntoMain(mainBranch, worktreeRoot);
|
|
475
|
+
if (rebaseResult.success) {
|
|
476
|
+
logger.info(`Rebased onto ${mainBranch}`);
|
|
477
|
+
} else {
|
|
478
|
+
logger.warn(`Could not rebase onto ${mainBranch}: ${rebaseResult.error}`);
|
|
479
|
+
logger.warn('Continuing with current branch state.');
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
465
483
|
}
|
|
466
484
|
|
|
467
485
|
// Execute project
|
|
@@ -1217,7 +1235,12 @@ Task completed. No detailed report provided.
|
|
|
1217
1235
|
// Track and display token usage for this task
|
|
1218
1236
|
if (attemptUsageData.length > 0) {
|
|
1219
1237
|
const entry = tokenTracker.addTask(task.id, attemptUsageData);
|
|
1220
|
-
|
|
1238
|
+
const taskRateLimitPct = tokenTracker.getCumulativeRateLimitPercentage();
|
|
1239
|
+
logger.dim(formatTaskTokenSummary(entry, (u) => tokenTracker.calculateCost(u), {
|
|
1240
|
+
showCacheTokens: getShowCacheTokens(),
|
|
1241
|
+
showRateLimitEstimate: getShowRateLimitEstimate(),
|
|
1242
|
+
rateLimitPercentage: taskRateLimitPct,
|
|
1243
|
+
}));
|
|
1221
1244
|
}
|
|
1222
1245
|
|
|
1223
1246
|
completedInSession.add(task.id);
|
|
@@ -1245,7 +1268,12 @@ Task completed. No detailed report provided.
|
|
|
1245
1268
|
// Track token usage even for failed tasks (partial data still useful for totals)
|
|
1246
1269
|
if (attemptUsageData.length > 0) {
|
|
1247
1270
|
const entry = tokenTracker.addTask(task.id, attemptUsageData);
|
|
1248
|
-
|
|
1271
|
+
const taskRateLimitPct = tokenTracker.getCumulativeRateLimitPercentage();
|
|
1272
|
+
logger.dim(formatTaskTokenSummary(entry, (u) => tokenTracker.calculateCost(u), {
|
|
1273
|
+
showCacheTokens: getShowCacheTokens(),
|
|
1274
|
+
showRateLimitEstimate: getShowRateLimitEstimate(),
|
|
1275
|
+
rateLimitPercentage: taskRateLimitPct,
|
|
1276
|
+
}));
|
|
1249
1277
|
}
|
|
1250
1278
|
|
|
1251
1279
|
// Analyze failure and generate structured report
|
|
@@ -1358,7 +1386,12 @@ ${stashName ? `- Stash: ${stashName}` : ''}
|
|
|
1358
1386
|
if (trackerEntries.length > 0) {
|
|
1359
1387
|
logger.newline();
|
|
1360
1388
|
const totals = tokenTracker.getTotals();
|
|
1361
|
-
|
|
1389
|
+
const totalRateLimitPct = tokenTracker.getCumulativeRateLimitPercentage();
|
|
1390
|
+
logger.dim(formatTokenTotalSummary(totals.usage, totals.cost, {
|
|
1391
|
+
showCacheTokens: getShowCacheTokens(),
|
|
1392
|
+
showRateLimitEstimate: getShowRateLimitEstimate(),
|
|
1393
|
+
rateLimitPercentage: totalRateLimitPct,
|
|
1394
|
+
}));
|
|
1362
1395
|
}
|
|
1363
1396
|
|
|
1364
1397
|
// Show retry history for tasks that had failures (even if eventually successful)
|