rafcode 2.3.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.
Files changed (129) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/CLAUDE.md +21 -4
  3. package/RAF/ahvrih-rate-forge/decisions.md +70 -0
  4. package/RAF/ahvrih-rate-forge/input.md +44 -0
  5. package/RAF/ahvrih-rate-forge/outcomes/01-remove-claude-command-config.md +58 -0
  6. package/RAF/ahvrih-rate-forge/outcomes/02-fix-mixed-attempt-cost.md +46 -0
  7. package/RAF/ahvrih-rate-forge/outcomes/03-rate-limit-estimation.md +82 -0
  8. package/RAF/ahvrih-rate-forge/outcomes/04-show-version-in-do-logs.md +45 -0
  9. package/RAF/ahvrih-rate-forge/outcomes/05-sync-main-before-worktree.md +96 -0
  10. package/RAF/ahvrih-rate-forge/outcomes/06-sync-readme-with-codebase.md +45 -0
  11. package/RAF/ahvrih-rate-forge/outcomes/07-no-session-persistence.md +26 -0
  12. package/RAF/ahvrih-rate-forge/outcomes/08-plan-execution-metadata.md +130 -0
  13. package/RAF/ahvrih-rate-forge/plans/01-remove-claude-command-config.md +36 -0
  14. package/RAF/ahvrih-rate-forge/plans/02-fix-mixed-attempt-cost.md +33 -0
  15. package/RAF/ahvrih-rate-forge/plans/03-rate-limit-estimation.md +82 -0
  16. package/RAF/ahvrih-rate-forge/plans/04-show-version-in-do-logs.md +32 -0
  17. package/RAF/ahvrih-rate-forge/plans/05-sync-main-before-worktree.md +40 -0
  18. package/RAF/ahvrih-rate-forge/plans/06-sync-readme-with-codebase.md +61 -0
  19. package/RAF/ahvrih-rate-forge/plans/07-no-session-persistence.md +28 -0
  20. package/RAF/ahvrih-rate-forge/plans/08-plan-execution-metadata.md +123 -0
  21. package/RAF/ahwidh-quick-fix-gremlin/decisions.md +37 -0
  22. package/RAF/ahwidh-quick-fix-gremlin/input.md +35 -0
  23. package/RAF/ahwidh-quick-fix-gremlin/outcomes/01-fix-name-generation-prompt.md +33 -0
  24. package/RAF/ahwidh-quick-fix-gremlin/outcomes/02-fix-amend-commit-scope.md +43 -0
  25. package/RAF/ahwidh-quick-fix-gremlin/outcomes/03-fix-diverged-main-branch-sync.md +32 -0
  26. package/RAF/ahwidh-quick-fix-gremlin/outcomes/04-wire-rate-limit-to-do-command.md +61 -0
  27. package/RAF/ahwidh-quick-fix-gremlin/outcomes/05-add-config-get-set-flags.md +125 -0
  28. package/RAF/ahwidh-quick-fix-gremlin/outcomes/06-sync-worktree-branch-before-execution.md +96 -0
  29. package/RAF/ahwidh-quick-fix-gremlin/outcomes/07-update-frontmatter-format.md +107 -0
  30. package/RAF/ahwidh-quick-fix-gremlin/outcomes/08-remove-plan-token-report.md +76 -0
  31. package/RAF/ahwidh-quick-fix-gremlin/plans/01-fix-name-generation-prompt.md +52 -0
  32. package/RAF/ahwidh-quick-fix-gremlin/plans/02-fix-amend-commit-scope.md +48 -0
  33. package/RAF/ahwidh-quick-fix-gremlin/plans/03-fix-diverged-main-branch-sync.md +49 -0
  34. package/RAF/ahwidh-quick-fix-gremlin/plans/04-wire-rate-limit-to-do-command.md +78 -0
  35. package/RAF/ahwidh-quick-fix-gremlin/plans/05-add-config-get-set-flags.md +101 -0
  36. package/RAF/ahwidh-quick-fix-gremlin/plans/06-sync-worktree-branch-before-execution.md +92 -0
  37. package/RAF/ahwidh-quick-fix-gremlin/plans/07-update-frontmatter-format.md +105 -0
  38. package/RAF/ahwidh-quick-fix-gremlin/plans/08-remove-plan-token-report.md +50 -0
  39. package/README.md +27 -7
  40. package/dist/commands/config.d.ts.map +1 -1
  41. package/dist/commands/config.js +209 -6
  42. package/dist/commands/config.js.map +1 -1
  43. package/dist/commands/do.d.ts.map +1 -1
  44. package/dist/commands/do.js +140 -21
  45. package/dist/commands/do.js.map +1 -1
  46. package/dist/commands/plan.d.ts.map +1 -1
  47. package/dist/commands/plan.js +27 -5
  48. package/dist/commands/plan.js.map +1 -1
  49. package/dist/core/claude-runner.d.ts +0 -6
  50. package/dist/core/claude-runner.d.ts.map +1 -1
  51. package/dist/core/claude-runner.js +4 -9
  52. package/dist/core/claude-runner.js.map +1 -1
  53. package/dist/core/failure-analyzer.d.ts.map +1 -1
  54. package/dist/core/failure-analyzer.js +3 -3
  55. package/dist/core/failure-analyzer.js.map +1 -1
  56. package/dist/core/pull-request.js +3 -3
  57. package/dist/core/pull-request.js.map +1 -1
  58. package/dist/core/state-derivation.d.ts +5 -0
  59. package/dist/core/state-derivation.d.ts.map +1 -1
  60. package/dist/core/state-derivation.js +14 -4
  61. package/dist/core/state-derivation.js.map +1 -1
  62. package/dist/core/worktree.d.ts +44 -0
  63. package/dist/core/worktree.d.ts.map +1 -1
  64. package/dist/core/worktree.js +247 -0
  65. package/dist/core/worktree.js.map +1 -1
  66. package/dist/prompts/amend.d.ts.map +1 -1
  67. package/dist/prompts/amend.js +28 -11
  68. package/dist/prompts/amend.js.map +1 -1
  69. package/dist/prompts/planning.d.ts.map +1 -1
  70. package/dist/prompts/planning.js +28 -11
  71. package/dist/prompts/planning.js.map +1 -1
  72. package/dist/types/config.d.ts +30 -13
  73. package/dist/types/config.d.ts.map +1 -1
  74. package/dist/types/config.js +14 -10
  75. package/dist/types/config.js.map +1 -1
  76. package/dist/utils/config.d.ts +47 -4
  77. package/dist/utils/config.d.ts.map +1 -1
  78. package/dist/utils/config.js +176 -30
  79. package/dist/utils/config.js.map +1 -1
  80. package/dist/utils/frontmatter.d.ts +53 -0
  81. package/dist/utils/frontmatter.d.ts.map +1 -0
  82. package/dist/utils/frontmatter.js +115 -0
  83. package/dist/utils/frontmatter.js.map +1 -0
  84. package/dist/utils/name-generator.d.ts.map +1 -1
  85. package/dist/utils/name-generator.js +9 -19
  86. package/dist/utils/name-generator.js.map +1 -1
  87. package/dist/utils/session-parser.d.ts +44 -0
  88. package/dist/utils/session-parser.d.ts.map +1 -0
  89. package/dist/utils/session-parser.js +122 -0
  90. package/dist/utils/session-parser.js.map +1 -0
  91. package/dist/utils/terminal-symbols.d.ts +22 -3
  92. package/dist/utils/terminal-symbols.d.ts.map +1 -1
  93. package/dist/utils/terminal-symbols.js +52 -18
  94. package/dist/utils/terminal-symbols.js.map +1 -1
  95. package/dist/utils/token-tracker.d.ts +20 -0
  96. package/dist/utils/token-tracker.d.ts.map +1 -1
  97. package/dist/utils/token-tracker.js +57 -2
  98. package/dist/utils/token-tracker.js.map +1 -1
  99. package/package.json +1 -1
  100. package/src/commands/config.ts +242 -7
  101. package/src/commands/do.ts +177 -23
  102. package/src/commands/plan.ts +27 -4
  103. package/src/core/claude-runner.ts +4 -16
  104. package/src/core/failure-analyzer.ts +3 -3
  105. package/src/core/pull-request.ts +3 -3
  106. package/src/core/state-derivation.ts +20 -4
  107. package/src/core/worktree.ts +266 -0
  108. package/src/prompts/amend.ts +28 -11
  109. package/src/prompts/config-docs.md +91 -29
  110. package/src/prompts/planning.ts +28 -11
  111. package/src/types/config.ts +46 -21
  112. package/src/utils/config.ts +200 -33
  113. package/src/utils/frontmatter.ts +140 -0
  114. package/src/utils/name-generator.ts +9 -19
  115. package/src/utils/terminal-symbols.ts +68 -16
  116. package/src/utils/token-tracker.ts +65 -2
  117. package/tests/unit/claude-runner-interactive.test.ts +8 -6
  118. package/tests/unit/claude-runner.test.ts +5 -66
  119. package/tests/unit/commit-planning-artifacts-worktree.test.ts +6 -14
  120. package/tests/unit/commit-planning-artifacts.test.ts +4 -12
  121. package/tests/unit/config-command.test.ts +176 -6
  122. package/tests/unit/config.test.ts +268 -45
  123. package/tests/unit/frontmatter.test.ts +276 -0
  124. package/tests/unit/name-generator.test.ts +1 -1
  125. package/tests/unit/post-execution-picker.test.ts +6 -0
  126. package/tests/unit/terminal-symbols.test.ts +142 -0
  127. package/tests/unit/token-tracker.test.ts +304 -1
  128. package/tests/unit/validation.test.ts +6 -4
  129. package/tests/unit/worktree.test.ts +309 -0
@@ -6,7 +6,7 @@ import { Command } from 'commander';
6
6
  import { ClaudeRunner } from '../core/claude-runner.js';
7
7
  import { shutdownHandler } from '../core/shutdown-handler.js';
8
8
  import { logger } from '../utils/logger.js';
9
- import { getConfigPath, getModel, getEffort, getModelShortName, validateConfig, ConfigValidationError, resetConfigCache, } from '../utils/config.js';
9
+ import { getConfigPath, getModel, getModelShortName, validateConfig, ConfigValidationError, resetConfigCache, resolveConfig, saveConfig, } from '../utils/config.js';
10
10
  import { DEFAULT_CONFIG } from '../types/config.js';
11
11
  /**
12
12
  * Load the config documentation markdown from src/prompts/config-docs.md.
@@ -98,16 +98,224 @@ async function confirm(message) {
98
98
  });
99
99
  });
100
100
  }
101
+ // ---- Helper functions for nested config access ----
102
+ /**
103
+ * Get a nested value from an object using dot notation.
104
+ * Returns undefined if the path doesn't exist.
105
+ */
106
+ function getNestedValue(obj, dotPath) {
107
+ const keys = dotPath.split('.');
108
+ let current = obj;
109
+ for (const key of keys) {
110
+ if (current === null || typeof current !== 'object') {
111
+ return undefined;
112
+ }
113
+ current = current[key];
114
+ }
115
+ return current;
116
+ }
117
+ /**
118
+ * Set a nested value in an object using dot notation.
119
+ * Creates intermediate objects as needed.
120
+ */
121
+ function setNestedValue(obj, dotPath, value) {
122
+ const keys = dotPath.split('.');
123
+ let current = obj;
124
+ for (let i = 0; i < keys.length - 1; i++) {
125
+ const key = keys[i];
126
+ if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {
127
+ current[key] = {};
128
+ }
129
+ current = current[key];
130
+ }
131
+ const lastKey = keys[keys.length - 1];
132
+ current[lastKey] = value;
133
+ }
134
+ /**
135
+ * Delete a nested value from an object using dot notation.
136
+ * Cleans up empty parent objects after deletion.
137
+ */
138
+ function deleteNestedValue(obj, dotPath) {
139
+ const keys = dotPath.split('.');
140
+ // Navigate to parent and delete the key
141
+ if (keys.length === 1) {
142
+ delete obj[keys[0]];
143
+ return;
144
+ }
145
+ // Build path to parent
146
+ let current = obj;
147
+ const path = [];
148
+ for (let i = 0; i < keys.length - 1; i++) {
149
+ const key = keys[i];
150
+ path.push({ obj: current, key });
151
+ if (typeof current[key] !== 'object' || current[key] === null) {
152
+ return; // Path doesn't exist
153
+ }
154
+ current = current[key];
155
+ }
156
+ // Delete the leaf value
157
+ const lastKey = keys[keys.length - 1];
158
+ delete current[lastKey];
159
+ // Clean up empty parents
160
+ for (let i = path.length - 1; i >= 0; i--) {
161
+ const { obj, key } = path[i];
162
+ const child = obj[key];
163
+ if (Object.keys(child).length === 0) {
164
+ delete obj[key];
165
+ }
166
+ else {
167
+ break; // Stop if we find a non-empty parent
168
+ }
169
+ }
170
+ }
171
+ /**
172
+ * Get the default value at a dot-notation path from DEFAULT_CONFIG.
173
+ */
174
+ function getDefaultValue(dotPath) {
175
+ return getNestedValue(DEFAULT_CONFIG, dotPath);
176
+ }
177
+ /**
178
+ * Parse a string value, attempting JSON.parse for numbers/booleans, falling back to string.
179
+ */
180
+ function parseValue(value) {
181
+ // Try JSON.parse for numbers, booleans, null
182
+ try {
183
+ return JSON.parse(value);
184
+ }
185
+ catch {
186
+ // Fall back to string
187
+ return value;
188
+ }
189
+ }
190
+ /**
191
+ * Format a value for console output.
192
+ * Strings are printed plain, objects/arrays as JSON.
193
+ */
194
+ function formatValue(value) {
195
+ if (typeof value === 'string') {
196
+ return value;
197
+ }
198
+ if (typeof value === 'number' || typeof value === 'boolean') {
199
+ return String(value);
200
+ }
201
+ if (value === null || value === undefined) {
202
+ return String(value);
203
+ }
204
+ return JSON.stringify(value, null, 2);
205
+ }
206
+ // ---- Config get/set handlers ----
207
+ /**
208
+ * Handle --get flag: print config value(s).
209
+ */
210
+ function handleGet(key) {
211
+ const config = resolveConfig();
212
+ if (key === true) {
213
+ // No key specified: print full config
214
+ console.log(JSON.stringify(config, null, 2));
215
+ return;
216
+ }
217
+ // Specific key requested
218
+ const value = getNestedValue(config, key);
219
+ if (value === undefined) {
220
+ logger.error(`Config key not found: ${key}`);
221
+ process.exit(1);
222
+ }
223
+ console.log(formatValue(value));
224
+ }
225
+ /**
226
+ * Handle --set flag: update config file with a new value.
227
+ */
228
+ function handleSet(args) {
229
+ if (args.length !== 2) {
230
+ logger.error('--set requires exactly 2 arguments: key and value');
231
+ process.exit(1);
232
+ }
233
+ const [key, rawValue] = args;
234
+ const value = parseValue(rawValue);
235
+ const configPath = getConfigPath();
236
+ // Read current user config (or start with empty)
237
+ let userConfig = {};
238
+ if (fs.existsSync(configPath)) {
239
+ try {
240
+ const content = fs.readFileSync(configPath, 'utf-8');
241
+ userConfig = JSON.parse(content);
242
+ }
243
+ catch (error) {
244
+ logger.error(`Failed to read config file: ${error}`);
245
+ process.exit(1);
246
+ }
247
+ }
248
+ // Check if value matches default
249
+ const defaultValue = getDefaultValue(key);
250
+ if (defaultValue === undefined) {
251
+ logger.error(`Config key not found in schema: ${key}`);
252
+ process.exit(1);
253
+ }
254
+ // Deep equality check for objects
255
+ const valuesMatch = JSON.stringify(value) === JSON.stringify(defaultValue);
256
+ if (valuesMatch) {
257
+ // Remove from config file (keep config minimal)
258
+ deleteNestedValue(userConfig, key);
259
+ logger.info(`Value matches default, removing ${key} from config`);
260
+ }
261
+ else {
262
+ // Set the value
263
+ setNestedValue(userConfig, key, value);
264
+ logger.info(`Set ${key} = ${formatValue(value)}`);
265
+ }
266
+ // Validate the resulting config
267
+ try {
268
+ validateConfig(userConfig);
269
+ }
270
+ catch (error) {
271
+ if (error instanceof ConfigValidationError) {
272
+ logger.error(`Validation error: ${error.message}`);
273
+ process.exit(1);
274
+ }
275
+ throw error;
276
+ }
277
+ // Save or delete config file
278
+ if (Object.keys(userConfig).length === 0) {
279
+ // Config is empty, delete the file
280
+ if (fs.existsSync(configPath)) {
281
+ fs.unlinkSync(configPath);
282
+ logger.info('Config is empty, removed file');
283
+ }
284
+ }
285
+ else {
286
+ saveConfig(configPath, userConfig);
287
+ logger.success('Config updated successfully');
288
+ }
289
+ }
101
290
  export function createConfigCommand() {
102
291
  const command = new Command('config')
103
292
  .description('View and edit RAF configuration with Claude')
104
293
  .argument('[prompt...]', 'Optional initial prompt for the config session')
105
294
  .option('--reset', 'Delete config file and restore all defaults')
295
+ .option('--get [key]', 'Show config value (all config if no key, or specific dot-notation key)')
296
+ .option('--set <items...>', 'Set a config value using dot-notation key and value')
106
297
  .action(async (promptParts, options) => {
298
+ // --reset takes precedence
107
299
  if (options.reset) {
108
300
  await handleReset();
109
301
  return;
110
302
  }
303
+ // --get and --set are mutually exclusive
304
+ if (options.get !== undefined && options.set !== undefined) {
305
+ logger.error('Cannot use --get and --set together');
306
+ process.exit(1);
307
+ }
308
+ // Handle --get
309
+ if (options.get !== undefined) {
310
+ handleGet(options.get);
311
+ return;
312
+ }
313
+ // Handle --set
314
+ if (options.set !== undefined) {
315
+ handleSet(options.set);
316
+ return;
317
+ }
318
+ // Default: run interactive session
111
319
  const initialPrompt = promptParts.length > 0 ? promptParts.join(' ') : undefined;
112
320
  await runConfigSession(initialPrompt);
113
321
  });
@@ -132,17 +340,14 @@ async function runConfigSession(initialPrompt) {
132
340
  // Try to load config, but fall back to defaults if it's broken
133
341
  // This allows raf config to be used to fix a broken config file
134
342
  let model;
135
- let effort;
136
343
  let configError = null;
137
344
  try {
138
345
  model = getModel('config');
139
- effort = getEffort('config');
140
346
  }
141
347
  catch (error) {
142
348
  // Config file has errors - fall back to defaults so the session can launch
143
349
  configError = error instanceof Error ? error : new Error(String(error));
144
350
  model = DEFAULT_CONFIG.models.config;
145
- effort = DEFAULT_CONFIG.effort.config;
146
351
  // Clear the cached config so subsequent calls don't use the broken cache
147
352
  resetConfigCache();
148
353
  }
@@ -152,8 +357,6 @@ async function runConfigSession(initialPrompt) {
152
357
  logger.warn('Fix the config in this session or run `raf config --reset` to start fresh.');
153
358
  logger.newline();
154
359
  }
155
- // Set effort level env var for the Claude session
156
- process.env['CLAUDE_CODE_EFFORT_LEVEL'] = effort;
157
360
  // Load config docs
158
361
  let configDocs;
159
362
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"do.d.ts","sourceRoot":"","sources":["../../src/commands/do.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC;AAE3D;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1D,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,GACf,MAAM,CAkBR;AA0BD,wBAAgB,eAAe,IAAI,OAAO,CAiBzC;AAoSD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuBhG"}
1
+ {"version":3,"file":"do.d.ts","sourceRoot":"","sources":["../../src/commands/do.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2DpC;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC;AAsE3D;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1D,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,GACf,MAAM,CAkBR;AA0BD,wBAAgB,eAAe,IAAI,OAAO,CAiBzC;AA+TD;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuBhG"}
@@ -12,7 +12,8 @@ import { validatePlansExist, resolveModelOption } from '../utils/validation.js';
12
12
  import { getRafDir, extractProjectNumber, extractProjectName, extractTaskNameFromPlanFile, resolveProjectIdentifierWithDetails, getOutcomeFilePath, parseProjectPrefix } from '../utils/paths.js';
13
13
  import { pickPendingProject, getPendingProjects, getPendingWorktreeProjects } from '../ui/project-picker.js';
14
14
  import { logger } from '../utils/logger.js';
15
- import { getConfig, getEffort, getWorktreeDefault, getModel, getModelShortName } from '../utils/config.js';
15
+ import { getConfig, getWorktreeDefault, getModel, getModelShortName, resolveFullModelId, getSyncMainBranch, resolveEffortToModel, applyModelCeiling, getShowRateLimitEstimate, getShowCacheTokens } from '../utils/config.js';
16
+ import { getVersion } from '../utils/version.js';
16
17
  import { createTaskTimer, formatElapsedTime } from '../utils/timer.js';
17
18
  import { createStatusLine } from '../utils/status-line.js';
18
19
  import { formatProjectHeader, formatSummary, formatTaskProgress, formatTaskTokenSummary, formatTokenTotalSummary, } from '../utils/terminal-symbols.js';
@@ -20,8 +21,53 @@ import { TokenTracker } from '../utils/token-tracker.js';
20
21
  import { VerboseToggle } from '../utils/verbose-toggle.js';
21
22
  import { deriveProjectState, discoverProjects, getNextExecutableTask, getDerivedStats, getDerivedStatsForTasks, isProjectComplete, hasProjectFailed, parseOutcomeStatus, } from '../core/state-derivation.js';
22
23
  import { analyzeFailure } from '../core/failure-analyzer.js';
23
- import { getRepoRoot, getRepoBasename, getCurrentBranch, computeWorktreePath, computeWorktreeBaseDir, validateWorktree, listWorktreeProjects, mergeWorktreeBranch, removeWorktree, resolveWorktreeProjectByIdentifier, } from '../core/worktree.js';
24
+ import { getRepoRoot, getRepoBasename, getCurrentBranch, computeWorktreePath, computeWorktreeBaseDir, validateWorktree, listWorktreeProjects, mergeWorktreeBranch, removeWorktree, resolveWorktreeProjectByIdentifier, pushMainBranch, pullMainBranch, detectMainBranch, rebaseOntoMain, } from '../core/worktree.js';
24
25
  import { createPullRequest, prPreflight } from '../core/pull-request.js';
26
+ /**
27
+ * Resolve the execution model for a task from its frontmatter metadata.
28
+ *
29
+ * Resolution order:
30
+ * 1. Explicit `model` in frontmatter (subject to ceiling)
31
+ * 2. `effort` in frontmatter resolved via effortMapping (subject to ceiling)
32
+ * 3. Fallback to models.execute (the ceiling, with a warning)
33
+ *
34
+ * @param frontmatter - Parsed frontmatter from the plan file
35
+ * @param frontmatterWarnings - Warnings from frontmatter parsing
36
+ * @param ceilingModel - The ceiling model (usually models.execute from config)
37
+ * @param isRetry - Whether this is a retry attempt (escalates to ceiling)
38
+ */
39
+ function resolveTaskModel(frontmatter, frontmatterWarnings, ceilingModel, isRetry) {
40
+ const warnings = frontmatterWarnings ? [...frontmatterWarnings] : [];
41
+ // Retry escalation: always use the ceiling model on retry
42
+ if (isRetry) {
43
+ return { model: ceilingModel, missingFrontmatter: false, warnings };
44
+ }
45
+ // No frontmatter - fallback to ceiling with warning
46
+ if (!frontmatter) {
47
+ return {
48
+ model: ceilingModel,
49
+ missingFrontmatter: true,
50
+ warnings,
51
+ };
52
+ }
53
+ // Explicit model in frontmatter - apply ceiling
54
+ if (frontmatter.model) {
55
+ const model = applyModelCeiling(frontmatter.model, ceilingModel);
56
+ return { model, missingFrontmatter: false, warnings };
57
+ }
58
+ // Effort-based resolution - apply ceiling
59
+ if (frontmatter.effort) {
60
+ const mappedModel = resolveEffortToModel(frontmatter.effort);
61
+ const model = applyModelCeiling(mappedModel, ceilingModel);
62
+ return { model, missingFrontmatter: false, warnings };
63
+ }
64
+ // Frontmatter present but no effort or model - fallback to ceiling with warning
65
+ return {
66
+ model: ceilingModel,
67
+ missingFrontmatter: true,
68
+ warnings,
69
+ };
70
+ }
25
71
  /**
26
72
  * Format failure history for console output.
27
73
  * Shows attempts that failed before eventual success or final failure.
@@ -75,6 +121,7 @@ async function runDoCommand(projectIdentifierArg, options) {
75
121
  // Variables for worktree context (set when --worktree is used)
76
122
  let worktreeRoot;
77
123
  let originalBranch;
124
+ let mainBranchName = null;
78
125
  if (worktreeMode) {
79
126
  // Validate git repo
80
127
  const repoRoot = getRepoRoot();
@@ -86,6 +133,19 @@ async function runDoCommand(projectIdentifierArg, options) {
86
133
  const rafRelativePath = path.relative(repoRoot, rafDir);
87
134
  // Record original branch before any worktree operations
88
135
  originalBranch = getCurrentBranch() ?? undefined;
136
+ // Sync main branch before worktree operations (if enabled)
137
+ if (getSyncMainBranch()) {
138
+ const syncResult = pullMainBranch();
139
+ mainBranchName = syncResult.mainBranch;
140
+ if (syncResult.success) {
141
+ if (syncResult.hadChanges) {
142
+ logger.info(`Synced ${syncResult.mainBranch} from remote`);
143
+ }
144
+ }
145
+ else {
146
+ logger.warn(`Could not sync main branch: ${syncResult.error}`);
147
+ }
148
+ }
89
149
  if (!projectIdentifier) {
90
150
  // Auto-discovery flow
91
151
  const selected = await discoverAndPickWorktreeProject(repoBasename, rafDir, rafRelativePath);
@@ -277,6 +337,20 @@ async function runDoCommand(projectIdentifierArg, options) {
277
337
  }
278
338
  throw error;
279
339
  }
340
+ // Rebase worktree branch onto main before execution (if sync is enabled)
341
+ if (getSyncMainBranch()) {
342
+ const mainBranch = mainBranchName ?? detectMainBranch();
343
+ if (mainBranch) {
344
+ const rebaseResult = rebaseOntoMain(mainBranch, worktreeRoot);
345
+ if (rebaseResult.success) {
346
+ logger.info(`Rebased onto ${mainBranch}`);
347
+ }
348
+ else {
349
+ logger.warn(`Could not rebase onto ${mainBranch}: ${rebaseResult.error}`);
350
+ logger.warn('Continuing with current branch state.');
351
+ }
352
+ }
353
+ }
280
354
  }
281
355
  // Execute project
282
356
  let result;
@@ -288,7 +362,6 @@ async function runDoCommand(projectIdentifierArg, options) {
288
362
  force,
289
363
  maxRetries,
290
364
  autoCommit,
291
- showModel: true,
292
365
  model,
293
366
  worktreeCwd: worktreeRoot,
294
367
  });
@@ -378,6 +451,18 @@ async function executePostAction(action, worktreeRoot, worktreeBranch, originalB
378
451
  }
379
452
  case 'pr': {
380
453
  logger.newline();
454
+ // Push main branch to remote before PR creation (if enabled)
455
+ if (getSyncMainBranch()) {
456
+ const syncResult = pushMainBranch();
457
+ if (syncResult.success) {
458
+ if (syncResult.hadChanges) {
459
+ logger.info(`Pushed ${syncResult.mainBranch} to remote`);
460
+ }
461
+ }
462
+ else {
463
+ logger.warn(`Could not push main branch: ${syncResult.error}`);
464
+ }
465
+ }
381
466
  logger.info(`Creating PR for branch "${worktreeBranch}"...`);
382
467
  const prResult = await createPullRequest(worktreeBranch, projectPath, { cwd: worktreeRoot });
383
468
  if (prResult.success) {
@@ -506,7 +591,7 @@ async function discoverAndPickWorktreeProject(repoBasename, rafDir, rafRelativeP
506
591
  }
507
592
  }
508
593
  async function executeSingleProject(projectPath, projectName, options) {
509
- const { timeout, verbose, debug, force, maxRetries, autoCommit, showModel, model, worktreeCwd } = options;
594
+ const { timeout, verbose, debug, force, maxRetries, autoCommit, model, worktreeCwd } = options;
510
595
  if (!validatePlansExist(projectPath)) {
511
596
  return {
512
597
  projectName,
@@ -540,11 +625,11 @@ async function executeSingleProject(projectPath, projectName, options) {
540
625
  const sessionTaskIds = new Set(force
541
626
  ? state.tasks.map((t) => t.id)
542
627
  : state.tasks.filter((t) => t.status !== 'completed').map((t) => t.id));
543
- // Set up shutdown handler
544
- const claudeRunner = new ClaudeRunner({ model });
628
+ // Set up shutdown handler - we'll register runners dynamically per-task
545
629
  const projectManager = new ProjectManager();
546
630
  shutdownHandler.init();
547
- shutdownHandler.registerClaudeRunner(claudeRunner);
631
+ // The ceiling model for all tasks (can be overridden per-task, subject to this ceiling)
632
+ const ceilingModel = model;
548
633
  // Initialize token tracker for usage reporting
549
634
  const tokenTracker = new TokenTracker();
550
635
  // Set up runtime verbose toggle (Tab key to toggle during execution)
@@ -552,13 +637,12 @@ async function executeSingleProject(projectPath, projectName, options) {
552
637
  shutdownHandler.onShutdown(() => verboseToggle.stop());
553
638
  // Start project timer
554
639
  const projectStartTime = Date.now();
640
+ // Resolve and display version + ceiling model info (before any tasks run)
641
+ const fullCeilingModelId = resolveFullModelId(ceilingModel);
642
+ logger.dim(`RAF v${getVersion()} | Ceiling: ${fullCeilingModelId}`);
555
643
  if (verbose) {
556
644
  logger.info(`Executing project: ${projectName}`);
557
645
  logger.info(`Tasks: ${state.tasks.length}, Task timeout: ${timeout} minutes`);
558
- // Log Claude model name
559
- if (showModel && model) {
560
- logger.info(`Using model: ${model}`);
561
- }
562
646
  logger.newline();
563
647
  }
564
648
  else {
@@ -726,14 +810,36 @@ async function executeSingleProject(projectPath, projectName, options) {
726
810
  statusLine.update(formatTaskProgress(taskNumber, totalTasks, 'running', displayName, elapsed, taskId));
727
811
  });
728
812
  timer.start();
813
+ // Log frontmatter warnings once before the retry loop
814
+ if (task.frontmatterWarnings && task.frontmatterWarnings.length > 0) {
815
+ for (const warning of task.frontmatterWarnings) {
816
+ logger.warn(` Frontmatter warning: ${warning}`);
817
+ }
818
+ }
729
819
  while (!success && attempts < maxRetries) {
730
820
  attempts++;
731
- if (verbose && attempts > 1) {
732
- logger.info(` Retry ${attempts}/${maxRetries} for task ${taskLabel}...`);
821
+ const isRetry = attempts > 1;
822
+ // Resolve the model for this attempt (escalates to ceiling on retry)
823
+ const modelResolution = resolveTaskModel(task.frontmatter, undefined, // warnings already logged above
824
+ ceilingModel, isRetry);
825
+ // Log missing frontmatter warning on first attempt only
826
+ if (!isRetry && modelResolution.missingFrontmatter) {
827
+ logger.warn(` No effort frontmatter found — using ceiling model`);
828
+ }
829
+ // Create a runner for this attempt's model
830
+ const taskRunner = new ClaudeRunner({ model: modelResolution.model });
831
+ shutdownHandler.registerClaudeRunner(taskRunner);
832
+ if (verbose && isRetry) {
833
+ const retryModel = resolveFullModelId(modelResolution.model);
834
+ logger.info(` Retry ${attempts}/${maxRetries} for task ${taskLabel} (model: ${retryModel})...`);
835
+ }
836
+ else if (verbose && !isRetry) {
837
+ const taskModel = resolveFullModelId(modelResolution.model);
838
+ logger.info(` Model: ${taskModel}`);
733
839
  }
734
840
  // Build execution prompt (inside loop to include retry context on retries)
735
841
  // Check if previous outcome file exists for retry context
736
- const previousOutcomeFileForRetry = attempts > 1 && fs.existsSync(outcomeFilePath)
842
+ const previousOutcomeFileForRetry = isRetry && fs.existsSync(outcomeFilePath)
737
843
  ? outcomeFilePath
738
844
  : undefined;
739
845
  const prompt = getExecutionPrompt({
@@ -759,18 +865,16 @@ async function executeSingleProject(projectPath, projectName, options) {
759
865
  outcomeFilePath,
760
866
  } : undefined;
761
867
  // Run Claude (use worktree root as cwd if in worktree mode)
762
- const executeEffort = getEffort('execute');
763
868
  const runnerOptions = {
764
869
  timeout,
765
870
  outcomeFilePath,
766
871
  commitContext,
767
872
  cwd: worktreeCwd,
768
- effortLevel: executeEffort,
769
873
  verboseCheck: () => verboseToggle.isVerbose,
770
874
  };
771
875
  const result = verbose
772
- ? await claudeRunner.runVerbose(prompt, runnerOptions)
773
- : await claudeRunner.run(prompt, runnerOptions);
876
+ ? await taskRunner.runVerbose(prompt, runnerOptions)
877
+ : await taskRunner.run(prompt, runnerOptions);
774
878
  lastOutput = result.output;
775
879
  if (result.usageData) {
776
880
  attemptUsageData.push(result.usageData);
@@ -888,7 +992,12 @@ Task completed. No detailed report provided.
888
992
  // Track and display token usage for this task
889
993
  if (attemptUsageData.length > 0) {
890
994
  const entry = tokenTracker.addTask(task.id, attemptUsageData);
891
- logger.dim(formatTaskTokenSummary(entry, (u) => tokenTracker.calculateCost(u)));
995
+ const taskRateLimitPct = tokenTracker.getCumulativeRateLimitPercentage();
996
+ logger.dim(formatTaskTokenSummary(entry, (u) => tokenTracker.calculateCost(u), {
997
+ showCacheTokens: getShowCacheTokens(),
998
+ showRateLimitEstimate: getShowRateLimitEstimate(),
999
+ rateLimitPercentage: taskRateLimitPct,
1000
+ }));
892
1001
  }
893
1002
  completedInSession.add(task.id);
894
1003
  }
@@ -915,7 +1024,12 @@ Task completed. No detailed report provided.
915
1024
  // Track token usage even for failed tasks (partial data still useful for totals)
916
1025
  if (attemptUsageData.length > 0) {
917
1026
  const entry = tokenTracker.addTask(task.id, attemptUsageData);
918
- logger.dim(formatTaskTokenSummary(entry, (u) => tokenTracker.calculateCost(u)));
1027
+ const taskRateLimitPct = tokenTracker.getCumulativeRateLimitPercentage();
1028
+ logger.dim(formatTaskTokenSummary(entry, (u) => tokenTracker.calculateCost(u), {
1029
+ showCacheTokens: getShowCacheTokens(),
1030
+ showRateLimitEstimate: getShowRateLimitEstimate(),
1031
+ rateLimitPercentage: taskRateLimitPct,
1032
+ }));
919
1033
  }
920
1034
  // Analyze failure and generate structured report
921
1035
  const analysisReport = await analyzeFailure(lastOutput, failureReason, task.id);
@@ -1003,7 +1117,12 @@ ${stashName ? `- Stash: ${stashName}` : ''}
1003
1117
  if (trackerEntries.length > 0) {
1004
1118
  logger.newline();
1005
1119
  const totals = tokenTracker.getTotals();
1006
- logger.dim(formatTokenTotalSummary(totals.usage, totals.cost));
1120
+ const totalRateLimitPct = tokenTracker.getCumulativeRateLimitPercentage();
1121
+ logger.dim(formatTokenTotalSummary(totals.usage, totals.cost, {
1122
+ showCacheTokens: getShowCacheTokens(),
1123
+ showRateLimitEstimate: getShowRateLimitEstimate(),
1124
+ rateLimitPercentage: totalRateLimitPct,
1125
+ }));
1007
1126
  }
1008
1127
  // Show retry history for tasks that had failures (even if eventually successful)
1009
1128
  if (projectRetryHistory.length > 0) {