@sunilp-org/jam-cli 0.2.0 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;yFACqF;IACrF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD,wBAAsB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+QjG"}
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;yFACqF;IACrF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD,wBAAsB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqVjG"}
@@ -6,7 +6,7 @@ import { streamToStdout, printJsonResult, printError, renderMarkdown } from '../
6
6
  import { JamError } from '../utils/errors.js';
7
7
  import { getWorkspaceRoot } from '../utils/workspace.js';
8
8
  import { READ_ONLY_TOOL_SCHEMAS, executeReadOnlyTool } from '../tools/context-tools.js';
9
- import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
9
+ import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, generateExecutionPlan, enrichUserPromptWithPlan, formatExecutionPlanBlock, StepVerifier, buildToolResultsSummary, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
10
10
  import { WorkingMemory } from '../utils/memory.js';
11
11
  import { ToolResultCache } from '../utils/cache.js';
12
12
  import { criticEvaluate, buildCriticCorrection } from '../utils/critic.js';
@@ -120,27 +120,79 @@ export async function runAsk(inlinePrompt, options) {
120
120
  pastContext = formatPastExchanges(pastExchanges);
121
121
  }
122
122
  catch { /* non-fatal */ }
123
- // ── Planning phase: deep reasoning about what to search for ─────────
123
+ // ── Planning phase: structured plan first, text plan fallback ────────
124
124
  stderrLog(formatSeparator('Planning', noColor));
125
125
  const projectCtxForPlan = [jamContext ?? workspaceCtx, symbolHint, pastContext].filter(Boolean).join('\n\n');
126
- const searchPlan = await generateSearchPlan(adapter, prompt, projectCtxForPlan, {
126
+ let structuredPlan = null;
127
+ let enrichedPrompt;
128
+ // Try to produce a structured JSON execution plan
129
+ structuredPlan = await generateExecutionPlan(adapter, prompt, projectCtxForPlan, {
127
130
  model: profile.model,
128
131
  temperature: profile.temperature,
129
132
  maxTokens: profile.maxTokens,
130
133
  });
131
- if (searchPlan) {
132
- stderrLog(formatPlanBlock(searchPlan, noColor) + '\n');
134
+ if (structuredPlan) {
135
+ stderrLog(formatExecutionPlanBlock(structuredPlan, noColor) + '\n');
136
+ enrichedPrompt = enrichUserPromptWithPlan(prompt, structuredPlan);
133
137
  }
134
138
  else {
135
- stderrLog(formatInternalStatus('planning skipped using generic search strategy', noColor) + '\n');
139
+ // Fall back to free-text search plan
140
+ const searchPlan = await generateSearchPlan(adapter, prompt, projectCtxForPlan, {
141
+ model: profile.model,
142
+ temperature: profile.temperature,
143
+ maxTokens: profile.maxTokens,
144
+ });
145
+ if (searchPlan) {
146
+ stderrLog(formatPlanBlock(searchPlan, noColor) + '\n');
147
+ }
148
+ else {
149
+ stderrLog(formatInternalStatus('planning skipped — using generic search strategy', noColor) + '\n');
150
+ }
151
+ enrichedPrompt = enrichUserPrompt(prompt, searchPlan);
136
152
  }
137
- // Enrich the user's prompt with the search plan
138
- const enrichedPrompt = enrichUserPrompt(prompt, searchPlan);
139
153
  let messages = [{ role: 'user', content: enrichedPrompt }];
154
+ // Step tracking for structured plan
155
+ let currentStepIdx = 0;
156
+ const stepVerifier = new StepVerifier();
140
157
  const MAX_TOOL_ROUNDS = 15;
141
158
  let synthesisInjected = false;
142
159
  stderrLog(formatSeparator('Searching codebase', noColor));
143
160
  for (let round = 0; round < MAX_TOOL_ROUNDS; round++) {
161
+ // ── Step injection: remind model of the current plan step ─────────
162
+ if (structuredPlan && round > 0 && round % 3 === 0 && currentStepIdx < structuredPlan.steps.length) {
163
+ const step = structuredPlan.steps[currentStepIdx];
164
+ messages.push({
165
+ role: 'user',
166
+ content: `[STEP REMINDER — Step ${step.id} of ${structuredPlan.steps.length}: ${step.action}. Use tool \`${step.tool}\` with args \`${JSON.stringify(step.args)}\`. Done when: ${step.successCriteria}]`,
167
+ });
168
+ }
169
+ // ── Verifier: check progress every 3 rounds after ≥2 tool calls ───
170
+ if (round > 0 && round % 3 === 0 && tracker.totalCalls >= 2) {
171
+ stderrLog(formatInternalStatus('Verifying progress…', noColor) + '\n');
172
+ const summary = buildToolResultsSummary(messages);
173
+ const vResult = await stepVerifier.verify(adapter, prompt, structuredPlan, summary, { model: profile.model });
174
+ if (vResult.status === 'ready-to-answer') {
175
+ stderrLog(formatInternalStatus(`Verifier: sufficient context — synthesizing answer`, noColor) + '\n');
176
+ if (!synthesisInjected) {
177
+ synthesisInjected = true;
178
+ messages.push({ role: 'user', content: buildSynthesisReminder(prompt) });
179
+ }
180
+ // Skip remaining tool rounds — let model produce final answer
181
+ }
182
+ else if (vResult.status === 'stuck') {
183
+ stderrLog(formatInternalStatus(`Verifier: stuck — ${vResult.reason}`, noColor) + '\n');
184
+ const nextStep = structuredPlan?.steps.find(s => s.id === vResult.nextStepId);
185
+ const stuckHint = [
186
+ `[VERIFIER: You appear stuck. ${vResult.reason}`,
187
+ nextStep
188
+ ? `Focus on Step ${nextStep.id}: use \`${nextStep.tool}\` with args \`${JSON.stringify(nextStep.args)}\`.`
189
+ : 'Try a completely different search term or use list_dir to explore the directory structure.',
190
+ ']',
191
+ ].join(' ');
192
+ messages.push({ role: 'user', content: stuckHint });
193
+ }
194
+ // For 'need-more': continue normally
195
+ }
144
196
  // ── Context window management: compact if approaching limit ───────
145
197
  if (memory.shouldCompact(messages)) {
146
198
  stderrLog(formatInternalStatus('Compacting context…', noColor) + '\n');
@@ -170,10 +222,13 @@ export async function runAsk(inlinePrompt, options) {
170
222
  updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
171
223
  return;
172
224
  }
173
- // Critic rejected — use its specific feedback
225
+ // Critic rejected — re-enter loop at the last incomplete plan step
174
226
  stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
175
227
  messages.push({ role: 'assistant', content: finalText });
176
- messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) });
228
+ const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
229
+ ? `\n\nResume the execution plan from Step ${structuredPlan.steps[currentStepIdx].id}: ${structuredPlan.steps[currentStepIdx].action}. Gather more specific evidence before answering.`
230
+ : '';
231
+ messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) + stepHint });
177
232
  continue;
178
233
  }
179
234
  // No answer yet — inject synthesis reminder
@@ -188,7 +243,10 @@ export async function runAsk(inlinePrompt, options) {
188
243
  if (!verdict.pass) {
189
244
  stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
190
245
  messages.push({ role: 'assistant', content: finalText });
191
- messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) });
246
+ const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
247
+ ? `\n\nResume the execution plan from Step ${structuredPlan.steps[currentStepIdx].id}: ${structuredPlan.steps[currentStepIdx].action}.`
248
+ : '';
249
+ messages.push({ role: 'user', content: buildCriticCorrection(verdict, prompt) + stepHint });
192
250
  continue;
193
251
  }
194
252
  }
@@ -199,6 +257,13 @@ export async function runAsk(inlinePrompt, options) {
199
257
  updateContextWithUsage(workspaceRoot, log.readFiles, log.searchQueries).catch(() => { });
200
258
  return;
201
259
  }
260
+ // ── Advance plan step if executor used the planned tool ─────────────
261
+ if (structuredPlan && currentStepIdx < structuredPlan.steps.length && response.toolCalls?.length) {
262
+ const expectedTool = structuredPlan.steps[currentStepIdx].tool;
263
+ if (response.toolCalls.some(tc => tc.name === expectedTool)) {
264
+ currentStepIdx++;
265
+ }
266
+ }
202
267
  // ── Execute tool calls ────────────────────────────────────────────────
203
268
  messages.push({ role: 'assistant', content: response.content ?? '' });
204
269
  for (const tc of response.toolCalls) {
@@ -1 +1 @@
1
- {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/commands/ask.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import type { CliOverrides } from '../config/schema.js';
2
2
  export interface RunOptions extends CliOverrides {
3
3
  noColor?: boolean;
4
4
  quiet?: boolean;
5
+ /** Auto-approve all write tool calls without prompting. */
6
+ yes?: boolean;
5
7
  }
6
8
  export declare function runRun(instruction: string | undefined, options: RunOptions): Promise<void>;
7
9
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAcD,wBAAsB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwPhG"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAcD,wBAAsB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiehG"}
@@ -1,11 +1,12 @@
1
1
  import { createInterface } from 'node:readline/promises';
2
+ import { join } from 'node:path';
2
3
  import { loadConfig, getActiveProfile } from '../config/loader.js';
3
4
  import { createProvider } from '../providers/factory.js';
4
5
  import { printError, printWarning, renderMarkdown } from '../ui/renderer.js';
5
6
  import { JamError } from '../utils/errors.js';
6
7
  import { getWorkspaceRoot } from '../utils/workspace.js';
7
8
  import { ALL_TOOL_SCHEMAS, READONLY_TOOL_NAMES, executeTool } from '../tools/all-tools.js';
8
- import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
9
+ import { ToolCallTracker, loadProjectContext, buildSystemPrompt, enrichUserPrompt, generateSearchPlan, generateExecutionPlan, enrichUserPromptWithPlan, formatExecutionPlanBlock, StepVerifier, buildToolResultsSummary, buildSynthesisReminder, formatToolCall, formatToolResult, formatSeparator, formatDuplicateSkip, formatHintInjection, formatUsage, formatPlanBlock, formatInternalStatus, } from '../utils/agent.js';
9
10
  import { WorkingMemory } from '../utils/memory.js';
10
11
  import { ToolResultCache } from '../utils/cache.js';
11
12
  import { criticEvaluate, buildCriticCorrection } from '../utils/critic.js';
@@ -29,7 +30,8 @@ export async function runRun(instruction, options) {
29
30
  const noColor = options.noColor ?? false;
30
31
  const stderrLog = options.quiet ? (_msg) => { } : (msg) => process.stderr.write(msg);
31
32
  const workspaceRoot = await getWorkspaceRoot();
32
- const config = await loadConfig(process.cwd(), options);
33
+ const rawConfig = await loadConfig(process.cwd(), options);
34
+ const config = options.yes ? { ...rawConfig, toolPolicy: 'always' } : rawConfig;
33
35
  const profile = getActiveProfile(config);
34
36
  const adapter = await createProvider(profile);
35
37
  stderrLog(`Starting task: ${instruction}\n`);
@@ -54,26 +56,45 @@ export async function runRun(instruction, options) {
54
56
  pastContext = formatPastExchanges(pastExchanges);
55
57
  }
56
58
  catch { /* non-fatal */ }
57
- // ── Planning phase ────────────────────────────────────────────────────
59
+ // ── Planning phase ─────────────────────────────────────────────────────
58
60
  stderrLog(formatSeparator('Planning', noColor));
59
61
  const projectCtxForPlan = [jamContext ?? workspaceCtx, symbolHint, pastContext].filter(Boolean).join('\n\n');
60
- const searchPlan = await generateSearchPlan(adapter, instruction, projectCtxForPlan, {
62
+ let structuredPlan = null;
63
+ let enrichedInstruction;
64
+ structuredPlan = await generateExecutionPlan(adapter, instruction, projectCtxForPlan, {
61
65
  model: profile.model,
62
66
  temperature: profile.temperature,
63
67
  maxTokens: profile.maxTokens,
68
+ mode: 'readwrite',
64
69
  });
65
- if (searchPlan) {
66
- stderrLog(formatPlanBlock(searchPlan, noColor) + '\n');
70
+ if (structuredPlan) {
71
+ stderrLog(formatExecutionPlanBlock(structuredPlan, noColor) + '\n');
72
+ enrichedInstruction = enrichUserPromptWithPlan(instruction, structuredPlan);
67
73
  }
68
74
  else {
69
- stderrLog(formatInternalStatus('planning skipped using generic strategy', noColor) + '\n');
75
+ const searchPlan = await generateSearchPlan(adapter, instruction, projectCtxForPlan, {
76
+ model: profile.model,
77
+ temperature: profile.temperature,
78
+ maxTokens: profile.maxTokens,
79
+ });
80
+ if (searchPlan) {
81
+ stderrLog(formatPlanBlock(searchPlan, noColor) + '\n');
82
+ }
83
+ else {
84
+ stderrLog(formatInternalStatus('planning skipped — using generic strategy', noColor) + '\n');
85
+ }
86
+ enrichedInstruction = enrichUserPrompt(instruction, searchPlan);
70
87
  }
71
- // Enrich the instruction with the search plan
72
- const enrichedInstruction = enrichUserPrompt(instruction, searchPlan);
73
88
  let messages = [
74
89
  { role: 'user', content: enrichedInstruction },
75
90
  ];
76
91
  const tracker = new ToolCallTracker();
92
+ let currentStepIdx = 0;
93
+ // Track which files have been read — used to enforce read-before-write
94
+ const readFiles = new Set();
95
+ // Track original line counts of files that were auto-read before write
96
+ const originalLineCounts = new Map();
97
+ const stepVerifier = new StepVerifier();
77
98
  if (!adapter.chatWithTools) {
78
99
  await printError('Provider does not support tool calling. Use a provider/model that supports tools.');
79
100
  process.exit(1);
@@ -101,7 +122,40 @@ export async function runRun(instruction, options) {
101
122
  let synthesisInjected = false;
102
123
  stderrLog(formatSeparator('Working', noColor));
103
124
  for (let iteration = 0; iteration < MAX_ITERATIONS; iteration++) {
104
- // Context window management
125
+ // ── Step injection: remind model of current plan step every 3 rounds ──
126
+ if (structuredPlan && iteration > 0 && iteration % 3 === 0 && currentStepIdx < structuredPlan.steps.length) {
127
+ const step = structuredPlan.steps[currentStepIdx];
128
+ messages.push({
129
+ role: 'user',
130
+ content: `[STEP REMINDER — Step ${step.id} of ${structuredPlan.steps.length}: ${step.action}. Use tool \`${step.tool}\` with args \`${JSON.stringify(step.args)}\`. Done when: ${step.successCriteria}]`,
131
+ });
132
+ }
133
+ // ── Verifier: check progress every 3 rounds after ≥2 tool calls ────────
134
+ if (iteration > 0 && iteration % 3 === 0 && tracker.totalCalls >= 2) {
135
+ stderrLog(formatInternalStatus('Verifying progress…', noColor) + '\n');
136
+ const summary = buildToolResultsSummary(messages);
137
+ const vResult = await stepVerifier.verify(adapter, instruction, structuredPlan, summary, { model: profile.model });
138
+ if (vResult.status === 'ready-to-answer') {
139
+ stderrLog(formatInternalStatus('Verifier: sufficient context — synthesizing result', noColor) + '\n');
140
+ if (!synthesisInjected) {
141
+ synthesisInjected = true;
142
+ messages.push({ role: 'user', content: buildSynthesisReminder(instruction) });
143
+ }
144
+ }
145
+ else if (vResult.status === 'stuck') {
146
+ stderrLog(formatInternalStatus(`Verifier: stuck — ${vResult.reason}`, noColor) + '\n');
147
+ const nextStep = structuredPlan?.steps.find(s => s.id === vResult.nextStepId);
148
+ const stuckHint = [
149
+ `[VERIFIER: You appear stuck. ${vResult.reason}`,
150
+ nextStep
151
+ ? `Focus on Step ${nextStep.id}: use \`${nextStep.tool}\` with args \`${JSON.stringify(nextStep.args)}\`.`
152
+ : 'Try list_dir to explore directories, then read concrete files.',
153
+ ']',
154
+ ].join(' ');
155
+ messages.push({ role: 'user', content: stuckHint });
156
+ }
157
+ }
158
+ // ── Context window management ──────────────────────────────────────────
105
159
  if (memory.shouldCompact(messages)) {
106
160
  stderrLog(formatInternalStatus('Compacting context…', noColor) + '\n');
107
161
  messages = await memory.compact(messages);
@@ -115,11 +169,95 @@ export async function runRun(instruction, options) {
115
169
  // No tool calls → model is done
116
170
  if (!response.toolCalls || response.toolCalls.length === 0) {
117
171
  const finalText = response.content ?? '';
118
- // Synthesis grounding with critic
172
+ // ── Write-enforcement gate ────────────────────────────────────────────────
173
+ // If there are write steps in the plan that haven't been executed yet,
174
+ // the model has hallucinated Markdown instead of calling write_file.
175
+ // Inject a hard correction to force actual tool use.
176
+ const pendingWriteStep = structuredPlan?.steps
177
+ .slice(currentStepIdx)
178
+ .find(s => s.tool === 'write_file' || s.tool === 'apply_patch');
179
+ if (pendingWriteStep && iteration < MAX_ITERATIONS - 2) {
180
+ stderrLog(formatInternalStatus(`Write-enforcement: model skipped write_file — forcing retry on Step ${pendingWriteStep.id}`, noColor) + '\n');
181
+ messages.push({ role: 'assistant', content: finalText });
182
+ messages.push({
183
+ role: 'user',
184
+ content: [
185
+ `[WRITE ENFORCEMENT] You output Markdown code blocks but did NOT call \`write_file\`. Code blocks do nothing — they do not create files.`,
186
+ ``,
187
+ `You MUST now call the \`write_file\` tool to complete Step ${pendingWriteStep.id}:`,
188
+ ` Action: ${pendingWriteStep.action}`,
189
+ ` Tool: \`write_file\``,
190
+ ` Path: \`${pendingWriteStep.args['path'] ?? 'the target file'}\``,
191
+ ``,
192
+ `IMPORTANT: Use the ACTUAL file content based on the files you already read. Do NOT hardcode version strings, use require() calls, or placeholder values.`,
193
+ `- Read the real file patterns from the files you already read in previous steps.`,
194
+ `- For version: import it from package.json using a standard ESM import or createRequire — do NOT hardcode it.`,
195
+ `- The function/export structure MUST match the pattern used in this project's existing commands.`,
196
+ ``,
197
+ `Call \`write_file\` now with the COMPLETE file content. Do NOT output any more Markdown.`,
198
+ ].join('\n'),
199
+ });
200
+ continue;
201
+ }
202
+ // ── Generic write-mode enforcement (no structured plan) ───────────────────
203
+ // If the model produced only Markdown code blocks without calling write_file,
204
+ // force it to use tools instead. Pivot the message based on what's been done.
205
+ const looksLikeHallucinatedCode = /```(?:typescript|ts|javascript|js)\n/.test(finalText);
206
+ if (looksLikeHallucinatedCode && !tracker.wasToolCalled('write_file') && iteration < MAX_ITERATIONS - 2) {
207
+ stderrLog(formatInternalStatus('Write-enforcement: Markdown-only response — forcing tool use', noColor) + '\n');
208
+ messages.push({ role: 'assistant', content: finalText });
209
+ const alreadyReadRef = tracker.wasToolCalled('read_file');
210
+ if (!alreadyReadRef) {
211
+ messages.push({
212
+ role: 'user',
213
+ content: [
214
+ `[WRITE ENFORCEMENT] You output Markdown code blocks but did NOT call any tools. Code blocks do nothing.`,
215
+ ``,
216
+ `Step 1: Call \`read_file\` on src/commands/ask.ts to learn the export pattern.`,
217
+ `Step 2: Call \`read_file\` on src/index.ts to see how commands are registered.`,
218
+ `Step 3: Call \`write_file\` to create/modify every file needed for this task.`,
219
+ ``,
220
+ `Start now: call \`read_file\` with path "src/commands/ask.ts".`,
221
+ ].join('\n'),
222
+ });
223
+ }
224
+ else {
225
+ messages.push({
226
+ role: 'user',
227
+ content: [
228
+ `[WRITE ENFORCEMENT] You have already read the reference files. Now you MUST call \`write_file\` to complete the task.`,
229
+ ``,
230
+ `Original task: "${instruction}"`,
231
+ ``,
232
+ `You must call \`write_file\` for EACH file mentioned in the task. Use the COMPLETE file content based on what you read — no placeholder stubs, no hardcoded versions.`,
233
+ ``,
234
+ `Call \`write_file\` right now. Do NOT output any Markdown.`,
235
+ ].join('\n'),
236
+ });
237
+ }
238
+ continue;
239
+ }
240
+ // ── Write-completion check (replaces critic for write tasks) ───────────────
241
+ // In write mode, "done" means all write steps were executed, not a text answer.
242
+ const hasWritePlan = structuredPlan?.steps.some(s => s.tool === 'write_file' || s.tool === 'apply_patch');
243
+ if (hasWritePlan) {
244
+ const allWritesDone = !structuredPlan?.steps
245
+ .slice(currentStepIdx)
246
+ .some(s => s.tool === 'write_file' || s.tool === 'apply_patch');
247
+ if (allWritesDone) {
248
+ await renderResult(finalText || '✓ All write steps completed.', response.usage);
249
+ break;
250
+ }
251
+ // writes remain — write-enforcement above should handle it, but if we reach here just continue
252
+ messages.push({ role: 'assistant', content: finalText });
253
+ messages.push({ role: 'user', content: `Continue executing the remaining steps of the execution plan. Next: Step ${currentStepIdx + 1}.` });
254
+ continue;
255
+ }
256
+ // Synthesis grounding with critic (read-only tasks only)
119
257
  if (tracker.totalCalls > 0 && !synthesisInjected && iteration < MAX_ITERATIONS - 2) {
120
258
  synthesisInjected = true;
121
259
  if (finalText.trim().length > 0) {
122
- stderrLog(formatInternalStatus('Evaluating answer quality…', noColor) + '\n');
260
+ stderrLog(formatInternalStatus('Evaluating result quality…', noColor) + '\n');
123
261
  const verdict = await criticEvaluate(adapter, instruction, finalText, { model: profile.model });
124
262
  if (verdict.pass) {
125
263
  await renderResult(finalText, response.usage);
@@ -127,10 +265,13 @@ export async function runRun(instruction, options) {
127
265
  }
128
266
  stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
129
267
  messages.push({ role: 'assistant', content: finalText });
130
- messages.push({ role: 'user', content: buildCriticCorrection(verdict, instruction) });
268
+ const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
269
+ ? `\n\nResume execution plan at Step ${structuredPlan.steps[currentStepIdx].id}: ${structuredPlan.steps[currentStepIdx].action}.`
270
+ : '';
271
+ messages.push({ role: 'user', content: buildCriticCorrection(verdict, instruction) + stepHint });
131
272
  continue;
132
273
  }
133
- stderrLog(formatInternalStatus('Grounding answer to your question…', noColor) + '\n');
274
+ stderrLog(formatInternalStatus('Grounding answer to instruction…', noColor) + '\n');
134
275
  messages.push({ role: 'assistant', content: finalText });
135
276
  messages.push({ role: 'user', content: buildSynthesisReminder(instruction) });
136
277
  continue;
@@ -141,13 +282,29 @@ export async function runRun(instruction, options) {
141
282
  if (!verdict.pass) {
142
283
  stderrLog(formatInternalStatus(`Critic: ${verdict.reason}`, noColor) + '\n');
143
284
  messages.push({ role: 'assistant', content: finalText });
144
- messages.push({ role: 'user', content: buildCriticCorrection(verdict, instruction) });
285
+ const stepHint = structuredPlan && currentStepIdx < structuredPlan.steps.length
286
+ ? `\n\nResume execution plan at Step ${structuredPlan.steps[currentStepIdx].id}.`
287
+ : '';
288
+ messages.push({ role: 'user', content: buildCriticCorrection(verdict, instruction) + stepHint });
145
289
  continue;
146
290
  }
147
291
  }
148
292
  await renderResult(finalText, response.usage);
149
293
  break;
150
294
  }
295
+ // Advance plan step if executor used the planned tool
296
+ if (structuredPlan && currentStepIdx < structuredPlan.steps.length && response.toolCalls?.length) {
297
+ const expectedTool = structuredPlan.steps[currentStepIdx].tool;
298
+ if (response.toolCalls.some(tc => tc.name === expectedTool)) {
299
+ currentStepIdx++;
300
+ }
301
+ }
302
+ // Track files read this iteration (for read-before-write gate)
303
+ for (const tc of response.toolCalls ?? []) {
304
+ if (tc.name === 'read_file' && typeof tc.arguments['path'] === 'string') {
305
+ readFiles.add(tc.arguments['path']);
306
+ }
307
+ }
151
308
  // Add assistant message to conversation
152
309
  messages.push({ role: 'assistant', content: response.content ?? '' });
153
310
  // Print any intermediate text
@@ -179,6 +336,36 @@ export async function runRun(instruction, options) {
179
336
  }
180
337
  }
181
338
  stderrLog(formatToolCall(tc.name, tc.arguments, noColor) + '\n');
339
+ // ── Read-before-write gate ─────────────────────────────────────────
340
+ // Block write operations if the target file hasn't been read yet.
341
+ // This prevents the model from overwriting files it hasn't inspected.
342
+ if (!isReadonly && tc.name !== 'run_command') {
343
+ const targetPath = typeof tc.arguments['path'] === 'string' ? tc.arguments['path'] : null;
344
+ if (targetPath && !readFiles.has(targetPath)) {
345
+ // Auto-read the file first
346
+ stderrLog(formatInternalStatus(`Read-before-write: reading ${targetPath} first…`, noColor) + '\n');
347
+ try {
348
+ const { executeReadOnlyTool } = await import('../tools/context-tools.js');
349
+ const existing = await executeReadOnlyTool('read_file', { path: targetPath }, workspaceRoot);
350
+ readFiles.add(targetPath);
351
+ const lineCount = existing.split('\n').length;
352
+ const capped = memory.processToolResult('read_file', { path: targetPath }, existing);
353
+ originalLineCounts.set(targetPath, lineCount);
354
+ messages.push({
355
+ role: 'user',
356
+ content: [
357
+ `[Auto-read before write] Current content of ${targetPath} (${lineCount} lines):`,
358
+ capped,
359
+ ``,
360
+ `⚠️ CRITICAL WRITE RULE: The current file is ${lineCount} lines. Your \`write_file\` call MUST include ALL of the original content PLUS your additions. Do NOT write a stub or drop any existing code. The new file should be LONGER than the original.`,
361
+ ].join('\n'),
362
+ });
363
+ }
364
+ catch {
365
+ // File doesn't exist yet (new file) — that's fine, proceed
366
+ }
367
+ }
368
+ }
182
369
  // Confirm write tools based on policy
183
370
  if (!isReadonly) {
184
371
  if (config.toolPolicy === 'never') {
@@ -188,6 +375,7 @@ export async function runRun(instruction, options) {
188
375
  tracker.record(tc.name, tc.arguments, true);
189
376
  continue;
190
377
  }
378
+ // 'always' — auto-approve all writes without prompting
191
379
  if (config.toolPolicy === 'ask_every_time') {
192
380
  const allowed = await confirmToolCall(tc.name, tc.arguments);
193
381
  if (!allowed) {
@@ -216,6 +404,40 @@ export async function runRun(instruction, options) {
216
404
  }
217
405
  // Cap tool output before injecting into messages
218
406
  const cappedOutput = memory.processToolResult(tc.name, tc.arguments, toolOutput);
407
+ // ── Post-write shrinkage guard ─────────────────────────────────
408
+ // If a write_file replaced an existing file with something suspiciously small,
409
+ // auto-restore it from git and inject an error to redirect the model.
410
+ if (!wasError &&
411
+ tc.name === 'write_file' &&
412
+ typeof tc.arguments['path'] === 'string') {
413
+ const writtenPath = tc.arguments['path'];
414
+ const origLines = originalLineCounts.get(writtenPath);
415
+ if (origLines && origLines > 10) {
416
+ try {
417
+ const { readFile: fsReadFile } = await import('node:fs/promises');
418
+ const newContent = await fsReadFile(join(workspaceRoot, writtenPath), 'utf8');
419
+ const newLines = newContent.split('\n').length;
420
+ // If new file is less than 40% of original, it's a stub — restore
421
+ if (newLines < origLines * 0.4) {
422
+ stderrLog(formatInternalStatus(`Write guard: ${writtenPath} shrank from ${origLines} to ${newLines} lines — restoring from git`, noColor) + '\n');
423
+ const { execSync } = await import('node:child_process');
424
+ execSync(`git checkout -- "${writtenPath}"`, { cwd: workspaceRoot });
425
+ messages.push({
426
+ role: 'user',
427
+ content: [
428
+ `[WRITE GUARD] Your write_file call for \`${writtenPath}\` dropped ${origLines - newLines} lines and was automatically reverted.`,
429
+ ``,
430
+ `The original file had ${origLines} lines. You wrote only ${newLines} lines — that's a stub.`,
431
+ `You MUST write the COMPLETE file: all original code PLUS your additions.`,
432
+ `Read the auto-injected content above that was prepended before your write and use it as the base. Do NOT omit any existing code.`,
433
+ ].join('\n'),
434
+ });
435
+ break; // exit inner tool loop; outer loop will re-run with correction
436
+ }
437
+ }
438
+ catch { /* non-fatal */ }
439
+ }
440
+ }
219
441
  stderrLog(formatToolResult(cappedOutput, noColor) + '\n');
220
442
  tracker.record(tc.name, tc.arguments, wasError);
221
443
  messages.push({ role: 'user', content: `[Tool result: ${tc.name}]\n${cappedOutput}` });