@prestyj/cli 4.3.164 → 4.3.201

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 (258) hide show
  1. package/dist/cli.js +106 -27
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/agent-session.d.ts +50 -1
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +175 -20
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/agents.d.ts +6 -1
  8. package/dist/core/agents.d.ts.map +1 -1
  9. package/dist/core/agents.js +112 -3
  10. package/dist/core/agents.js.map +1 -1
  11. package/dist/core/auth-storage.d.ts.map +1 -1
  12. package/dist/core/auth-storage.js +20 -1
  13. package/dist/core/auth-storage.js.map +1 -1
  14. package/dist/core/claude-code-version.d.ts +10 -0
  15. package/dist/core/claude-code-version.d.ts.map +1 -0
  16. package/dist/core/claude-code-version.js +106 -0
  17. package/dist/core/claude-code-version.js.map +1 -0
  18. package/dist/core/compaction/compactor.d.ts +13 -0
  19. package/dist/core/compaction/compactor.d.ts.map +1 -1
  20. package/dist/core/compaction/compactor.js +20 -1
  21. package/dist/core/compaction/compactor.js.map +1 -1
  22. package/dist/core/compaction/compactor.test.js +12 -1
  23. package/dist/core/compaction/compactor.test.js.map +1 -1
  24. package/dist/core/index.d.ts +1 -1
  25. package/dist/core/index.d.ts.map +1 -1
  26. package/dist/core/index.js +1 -1
  27. package/dist/core/index.js.map +1 -1
  28. package/dist/core/model-registry.d.ts +30 -2
  29. package/dist/core/model-registry.d.ts.map +1 -1
  30. package/dist/core/model-registry.js +41 -26
  31. package/dist/core/model-registry.js.map +1 -1
  32. package/dist/core/model-registry.test.d.ts +2 -0
  33. package/dist/core/model-registry.test.d.ts.map +1 -0
  34. package/dist/core/model-registry.test.js +19 -0
  35. package/dist/core/model-registry.test.js.map +1 -0
  36. package/dist/core/oauth/anthropic.d.ts.map +1 -1
  37. package/dist/core/oauth/anthropic.js +64 -42
  38. package/dist/core/oauth/anthropic.js.map +1 -1
  39. package/dist/core/oauth/openai.js +1 -1
  40. package/dist/core/oauth/openai.js.map +1 -1
  41. package/dist/core/prompt-commands.d.ts.map +1 -1
  42. package/dist/core/prompt-commands.js +480 -100
  43. package/dist/core/prompt-commands.js.map +1 -1
  44. package/dist/core/prompt-commands.test.d.ts +2 -0
  45. package/dist/core/prompt-commands.test.d.ts.map +1 -0
  46. package/dist/core/prompt-commands.test.js +33 -0
  47. package/dist/core/prompt-commands.test.js.map +1 -0
  48. package/dist/core/repomap-context.d.ts +11 -0
  49. package/dist/core/repomap-context.d.ts.map +1 -0
  50. package/dist/core/repomap-context.js +68 -0
  51. package/dist/core/repomap-context.js.map +1 -0
  52. package/dist/core/repomap-context.test.d.ts +2 -0
  53. package/dist/core/repomap-context.test.d.ts.map +1 -0
  54. package/dist/core/repomap-context.test.js +47 -0
  55. package/dist/core/repomap-context.test.js.map +1 -0
  56. package/dist/core/repomap.d.ts +74 -0
  57. package/dist/core/repomap.d.ts.map +1 -0
  58. package/dist/core/repomap.js +897 -0
  59. package/dist/core/repomap.js.map +1 -0
  60. package/dist/core/repomap.test.d.ts +2 -0
  61. package/dist/core/repomap.test.d.ts.map +1 -0
  62. package/dist/core/repomap.test.js +444 -0
  63. package/dist/core/repomap.test.js.map +1 -0
  64. package/dist/core/session-compaction.d.ts +15 -0
  65. package/dist/core/session-compaction.d.ts.map +1 -0
  66. package/dist/core/session-compaction.js +31 -0
  67. package/dist/core/session-compaction.js.map +1 -0
  68. package/dist/core/session-compaction.test.d.ts +2 -0
  69. package/dist/core/session-compaction.test.d.ts.map +1 -0
  70. package/dist/core/session-compaction.test.js +70 -0
  71. package/dist/core/session-compaction.test.js.map +1 -0
  72. package/dist/core/settings-manager.d.ts +3 -5
  73. package/dist/core/settings-manager.d.ts.map +1 -1
  74. package/dist/core/settings-manager.js +6 -5
  75. package/dist/core/settings-manager.js.map +1 -1
  76. package/dist/core/slash-commands.d.ts +2 -0
  77. package/dist/core/slash-commands.d.ts.map +1 -1
  78. package/dist/core/slash-commands.js +15 -14
  79. package/dist/core/slash-commands.js.map +1 -1
  80. package/dist/core/style-packs/index.d.ts.map +1 -1
  81. package/dist/core/style-packs/index.js +8 -9
  82. package/dist/core/style-packs/index.js.map +1 -1
  83. package/dist/index.d.ts +2 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +1 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/interactive.d.ts.map +1 -1
  88. package/dist/interactive.js +12 -6
  89. package/dist/interactive.js.map +1 -1
  90. package/dist/modes/json-mode.d.ts +7 -0
  91. package/dist/modes/json-mode.d.ts.map +1 -1
  92. package/dist/modes/json-mode.js +9 -1
  93. package/dist/modes/json-mode.js.map +1 -1
  94. package/dist/system-prompt.d.ts.map +1 -1
  95. package/dist/system-prompt.js +105 -108
  96. package/dist/system-prompt.js.map +1 -1
  97. package/dist/system-prompt.test.d.ts +2 -0
  98. package/dist/system-prompt.test.d.ts.map +1 -0
  99. package/dist/system-prompt.test.js +107 -0
  100. package/dist/system-prompt.test.js.map +1 -0
  101. package/dist/tools/bash.d.ts.map +1 -1
  102. package/dist/tools/bash.js +1 -0
  103. package/dist/tools/bash.js.map +1 -1
  104. package/dist/tools/edit-diff.d.ts +66 -1
  105. package/dist/tools/edit-diff.d.ts.map +1 -1
  106. package/dist/tools/edit-diff.js +208 -10
  107. package/dist/tools/edit-diff.js.map +1 -1
  108. package/dist/tools/edit-diff.test.js +175 -15
  109. package/dist/tools/edit-diff.test.js.map +1 -1
  110. package/dist/tools/edit.d.ts +3 -1
  111. package/dist/tools/edit.d.ts.map +1 -1
  112. package/dist/tools/edit.js +190 -44
  113. package/dist/tools/edit.js.map +1 -1
  114. package/dist/tools/edit.test.js +392 -3
  115. package/dist/tools/edit.test.js.map +1 -1
  116. package/dist/tools/enter-plan.d.ts.map +1 -1
  117. package/dist/tools/enter-plan.js +1 -0
  118. package/dist/tools/enter-plan.js.map +1 -1
  119. package/dist/tools/exit-plan.d.ts.map +1 -1
  120. package/dist/tools/exit-plan.js +1 -0
  121. package/dist/tools/exit-plan.js.map +1 -1
  122. package/dist/tools/index.d.ts +13 -0
  123. package/dist/tools/index.d.ts.map +1 -1
  124. package/dist/tools/index.js +4 -4
  125. package/dist/tools/index.js.map +1 -1
  126. package/dist/tools/prompt-hints.d.ts.map +1 -1
  127. package/dist/tools/prompt-hints.js +6 -4
  128. package/dist/tools/prompt-hints.js.map +1 -1
  129. package/dist/tools/read.d.ts +1 -1
  130. package/dist/tools/read.d.ts.map +1 -1
  131. package/dist/tools/read.js +2 -1
  132. package/dist/tools/read.js.map +1 -1
  133. package/dist/tools/subagent.d.ts +1 -1
  134. package/dist/tools/subagent.d.ts.map +1 -1
  135. package/dist/tools/subagent.js +55 -2
  136. package/dist/tools/subagent.js.map +1 -1
  137. package/dist/tools/tasks.d.ts.map +1 -1
  138. package/dist/tools/tasks.js +1 -0
  139. package/dist/tools/tasks.js.map +1 -1
  140. package/dist/tools/web-fetch.d.ts +1 -0
  141. package/dist/tools/web-fetch.d.ts.map +1 -1
  142. package/dist/tools/web-fetch.js +96 -6
  143. package/dist/tools/web-fetch.js.map +1 -1
  144. package/dist/tools/web-fetch.test.d.ts +2 -0
  145. package/dist/tools/web-fetch.test.d.ts.map +1 -0
  146. package/dist/tools/web-fetch.test.js +90 -0
  147. package/dist/tools/web-fetch.test.js.map +1 -0
  148. package/dist/tools/web-search.d.ts +1 -0
  149. package/dist/tools/web-search.d.ts.map +1 -1
  150. package/dist/tools/web-search.js +167 -27
  151. package/dist/tools/web-search.js.map +1 -1
  152. package/dist/tools/web-search.test.d.ts +2 -0
  153. package/dist/tools/web-search.test.d.ts.map +1 -0
  154. package/dist/tools/web-search.test.js +119 -0
  155. package/dist/tools/web-search.test.js.map +1 -0
  156. package/dist/tools/write.d.ts +1 -1
  157. package/dist/tools/write.d.ts.map +1 -1
  158. package/dist/tools/write.js +3 -1
  159. package/dist/tools/write.js.map +1 -1
  160. package/dist/tools/write.test.js +23 -0
  161. package/dist/tools/write.test.js.map +1 -1
  162. package/dist/ui/App.d.ts +54 -5
  163. package/dist/ui/App.d.ts.map +1 -1
  164. package/dist/ui/App.js +533 -241
  165. package/dist/ui/App.js.map +1 -1
  166. package/dist/ui/activity-phrases.d.ts +2 -1
  167. package/dist/ui/activity-phrases.d.ts.map +1 -1
  168. package/dist/ui/activity-phrases.js +11 -1
  169. package/dist/ui/activity-phrases.js.map +1 -1
  170. package/dist/ui/components/ActivityIndicator.d.ts +15 -1
  171. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  172. package/dist/ui/components/ActivityIndicator.js +143 -44
  173. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  174. package/dist/ui/components/ActivityIndicator.test.d.ts +2 -0
  175. package/dist/ui/components/ActivityIndicator.test.d.ts.map +1 -0
  176. package/dist/ui/components/ActivityIndicator.test.js +40 -0
  177. package/dist/ui/components/ActivityIndicator.test.js.map +1 -0
  178. package/dist/ui/components/AnimationContext.d.ts +8 -2
  179. package/dist/ui/components/AnimationContext.d.ts.map +1 -1
  180. package/dist/ui/components/AnimationContext.js +94 -16
  181. package/dist/ui/components/AnimationContext.js.map +1 -1
  182. package/dist/ui/components/AssistantMessage.js +1 -1
  183. package/dist/ui/components/AssistantMessage.js.map +1 -1
  184. package/dist/ui/components/CompactionNotice.d.ts +5 -1
  185. package/dist/ui/components/CompactionNotice.d.ts.map +1 -1
  186. package/dist/ui/components/CompactionNotice.js +4 -6
  187. package/dist/ui/components/CompactionNotice.js.map +1 -1
  188. package/dist/ui/components/Footer.d.ts +10 -2
  189. package/dist/ui/components/Footer.d.ts.map +1 -1
  190. package/dist/ui/components/Footer.js +45 -8
  191. package/dist/ui/components/Footer.js.map +1 -1
  192. package/dist/ui/components/InputArea.d.ts.map +1 -1
  193. package/dist/ui/components/InputArea.js +76 -28
  194. package/dist/ui/components/InputArea.js.map +1 -1
  195. package/dist/ui/components/ServerToolExecution.d.ts +1 -0
  196. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  197. package/dist/ui/components/ServerToolExecution.js +21 -2
  198. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  199. package/dist/ui/components/Spinner.d.ts +3 -1
  200. package/dist/ui/components/Spinner.d.ts.map +1 -1
  201. package/dist/ui/components/Spinner.js +10 -4
  202. package/dist/ui/components/Spinner.js.map +1 -1
  203. package/dist/ui/components/StreamingArea.js +1 -1
  204. package/dist/ui/components/StreamingArea.js.map +1 -1
  205. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  206. package/dist/ui/components/SubAgentPanel.js +3 -4
  207. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  208. package/dist/ui/components/ToolExecution.d.ts +2 -0
  209. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  210. package/dist/ui/components/ToolExecution.js +24 -5
  211. package/dist/ui/components/ToolExecution.js.map +1 -1
  212. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  213. package/dist/ui/components/ToolGroupExecution.js +23 -2
  214. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  215. package/dist/ui/components/ToolUseLoader.d.ts +4 -2
  216. package/dist/ui/components/ToolUseLoader.d.ts.map +1 -1
  217. package/dist/ui/components/ToolUseLoader.js +3 -3
  218. package/dist/ui/components/ToolUseLoader.js.map +1 -1
  219. package/dist/ui/components/index.d.ts +1 -2
  220. package/dist/ui/components/index.d.ts.map +1 -1
  221. package/dist/ui/components/index.js +1 -2
  222. package/dist/ui/components/index.js.map +1 -1
  223. package/dist/ui/hooks/useAgentLoop.d.ts +4 -1
  224. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  225. package/dist/ui/hooks/useAgentLoop.js +110 -13
  226. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  227. package/dist/ui/hooks/useBlink.d.ts.map +1 -1
  228. package/dist/ui/hooks/useBlink.js +3 -4
  229. package/dist/ui/hooks/useBlink.js.map +1 -1
  230. package/dist/ui/hooks/useTerminalSize.d.ts +12 -3
  231. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  232. package/dist/ui/hooks/useTerminalSize.js +16 -1
  233. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  234. package/dist/ui/pixel.js +1 -1
  235. package/dist/ui/render.d.ts +44 -5
  236. package/dist/ui/render.d.ts.map +1 -1
  237. package/dist/ui/render.js +56 -8
  238. package/dist/ui/render.js.map +1 -1
  239. package/dist/utils/error-handler.d.ts.map +1 -1
  240. package/dist/utils/error-handler.js +2 -0
  241. package/dist/utils/error-handler.js.map +1 -1
  242. package/package.json +8 -5
  243. package/dist/ui/buddy/Buddy.d.ts +0 -15
  244. package/dist/ui/buddy/Buddy.d.ts.map +0 -1
  245. package/dist/ui/buddy/Buddy.js +0 -118
  246. package/dist/ui/buddy/Buddy.js.map +0 -1
  247. package/dist/ui/buddy/gacha.d.ts +0 -8
  248. package/dist/ui/buddy/gacha.d.ts.map +0 -1
  249. package/dist/ui/buddy/gacha.js +0 -94
  250. package/dist/ui/buddy/gacha.js.map +0 -1
  251. package/dist/ui/buddy/species.d.ts +0 -52
  252. package/dist/ui/buddy/species.d.ts.map +0 -1
  253. package/dist/ui/buddy/species.js +0 -257
  254. package/dist/ui/buddy/species.js.map +0 -1
  255. package/dist/ui/components/ThinkingIndicator.d.ts +0 -6
  256. package/dist/ui/components/ThinkingIndicator.d.ts.map +0 -1
  257. package/dist/ui/components/ThinkingIndicator.js +0 -145
  258. package/dist/ui/components/ThinkingIndicator.js.map +0 -1
@@ -6,21 +6,14 @@ import { TOOL_PROMPT_HINTS, DEFAULT_TOOL_NAMES } from "./tools/prompt-hints.js";
6
6
  import { renderStylePacksSection } from "./core/style-packs/index.js";
7
7
  import { detectVerifyCommands, renderVerifySection } from "./core/verify-commands.js";
8
8
  const CONTEXT_FILES = ["AGENTS.md", "CLAUDE.md", ".cursorrules", "CONVENTIONS.md"];
9
- /**
10
- * Build the system prompt dynamically based on cwd and context.
11
- *
12
- * @param toolNames — if provided, the Tools section only lists these tools.
13
- * Pass `tools.map(t => t.name)` from the session so the prompt reflects
14
- * exactly what the model can call. Defaults to the full built-in set.
15
- */
16
- export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames, activeLanguages) {
17
- const sections = [];
18
- // 1. Identity
19
- sections.push(`You are EZ Coder by Nolan Grout — a coding agent that works directly in the user's codebase. ` +
9
+ const UNCACHED_MARKER = "<!-- uncached -->";
10
+ function renderIdentitySection() {
11
+ return (`You are EZ Coder by Nolan Grout — a coding agent that works directly in the user's codebase. ` +
20
12
  `You explore, understand, change, and verify code — completing tasks end-to-end ` +
21
13
  `rather than just suggesting edits.`);
22
- // 1b. How to Talk — governs intermediate text between tool calls AND final replies
23
- sections.push(`## How to Talk\n\n` +
14
+ }
15
+ function renderTalkSection() {
16
+ return (`## How to Talk\n\n` +
24
17
  `**Between tool calls**: one short sentence max — what you're doing next. ` +
25
18
  `No quoting tool output, no restating the problem, no thinking out loud. Think silently, then act.\n\n` +
26
19
  `**Final replies**: 1–3 sentences, hard cap 5. No preamble, no recap, no "let me know if…". ` +
@@ -31,81 +24,72 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
31
24
  `Good: "Found it — forms.css global rule out-specifies mine. Fixing." [edit]\n\n` +
32
25
  `**Exceptions**: ask before destructive actions, surface real tradeoffs, admit unverified claims. ` +
33
26
  `Plan mode is exempt.`);
34
- // 2. How to Work (compressed)
35
- sections.push(`## How to Work\n\n` +
27
+ }
28
+ function renderWorkSection() {
29
+ return (`## How to Work\n\n` +
36
30
  `- **Read before \`edit\`/\`write\`.** No edit/write without a prior read this session — missed reads waste the payload.\n` +
31
+ `- **Re-read after mutating tools.** Anything that rewrites files on disk (formatter, \`lint --fix\`, codemods, codegen, \`git checkout --\`) invalidates your cached view. Read the file again before the next \`edit\`/\`write\` — stale \`old_string\` matches fail, or worse, silently overwrite the mutation.\n` +
32
+ `- **Compute in bash, write with \`edit\`.** When a task needs computation (word counts, regex, padding, structural validation), use bash for the computation and the \`edit\` tool to apply the result. Shelling out to \`python -c '... f.write(...)'\` or \`sed -i\` loses read-tracking, partial-apply, indent forgiveness, and actionable error messages — and a mid-script crash leaves the file in unknown state.\n` +
37
33
  `- **Match the neighbors.** Before any user-visible change: find the closest existing equivalent, reuse components/tokens, mirror tone. No sibling? Stop and ask. Generic-looking output is a regression.\n` +
38
34
  `- **Edits stay small.** Plan multi-file work first. After: run tests/typecheck/lint, read errors, rebuild.\n` +
39
35
  `- **Just do it.** Routine follow-up (build, migrate, seed, re-run) is yours — don't ask.\n` +
40
36
  `- **Ask first for destructive actions**: deleting files, force-push, dropping data, killing processes, \`rm -rf\`, \`--hard\`, \`--force\`.\n` +
41
37
  `- **Investigate unexpected state** (unfamiliar files, branches, locks) — may be the user's in-progress work.\n` +
42
- `- **Precedence when rules conflict** (highest first): CLAUDE.md / AGENTS.md → existing patterns in the file/module being edited → Language Style Packs → defaults in this prompt. Apply pack conventions to new code; mirror existing patterns when extending old code. Library names in packs are illustrative — use what the project already imports.\n` +
38
+ `- **Precedence when rules conflict** (highest first): AGENTS.md / CLAUDE.md / .cursorrules / CONVENTIONS.md → existing patterns in the edited file/module → Language Style Packs → defaults in this prompt.\n` +
43
39
  `- **Verify after meaningful edits.** When a Verification section is present, run the relevant commands for the language(s) you touched. Fix failures before reporting completion.\n` +
44
40
  `- **Untracked files → \`.gitignore\`**: artifacts, configs, secrets, logs, scratch, \`.env\`, caches.\n` +
45
41
  `- **Never fake verification.** If you didn't run the check or it failed, say so. Don't invent results.`);
46
- // 2b. Plan mode
47
- if (planMode) {
48
- sections.push(`## Plan Mode (ACTIVE)\n\n` +
49
- `You are in PLAN MODE. Research and design an implementation plan before writing any code.\n\n` +
50
- `### Workflow\n` +
51
- `1. Explore: read, grep, find, ls to understand the codebase\n` +
52
- `2. Research: \`web_search\` + \`web_fetch\` for docs; \`mcp__kencode-search__searchCode\` for real code samples literal text or RE2 regex (NOT semantic); start with \`peek: true\` for paths+counts, then drill in narrowed by \`repo\` + \`path\` (full usage in Research & Verification below)\n` +
53
- `3. Draft: write the plan to .ezcoder/plans/<name>.md\n` +
54
- `4. Submit: call exit_plan with the plan path\n\n` +
55
- `### Rules\n` +
56
- `- bash, edit, write (except to .ezcoder/plans/), and subagent are restricted\n` +
57
- `- Be specific: exact file paths, function names, line numbers\n` +
58
- `- Note risks and verification criteria\n\n` +
59
- `### Plan Format\n` +
60
- `Plan can have any structure, but it MUST end with a section titled exactly \`## Steps\` ` +
61
- `containing a single flat numbered list. This section is parsed by the progress widget — ` +
62
- `the ONLY source of truth for step tracking. Do NOT put numbered lists elsewhere.`);
63
- }
64
- // 2c. Approved plan — injected when a plan has been approved for implementation
65
- if (approvedPlanPath && !planMode) {
66
- let planContent = "";
67
- try {
68
- planContent = await fs.readFile(approvedPlanPath, "utf-8");
69
- }
70
- catch {
71
- // Plan file not found — skip injection
72
- }
73
- if (planContent.trim()) {
74
- sections.push(`## Approved Plan\n\n` +
75
- `Follow this plan strictly. File: ${approvedPlanPath}\n\n` +
76
- `<approved_plan>\n${planContent.trim()}\n</approved_plan>\n\n` +
77
- `- Follow step order. Don't deviate without user confirmation.\n` +
78
- `- After each step from \`## Steps\`, output \`[DONE:n]\` (e.g. \`[DONE:1]\`) to update the progress widget.`);
79
- }
80
- }
81
- // 3. Research & Verification
82
- sections.push(`## Research & Verification\n\n` +
83
- `Your training data may be outdated. Do not assumeverify.\n\n` +
84
- `- **Docs first**: \`web_search\` \`web_fetch\`.\n` +
85
- `- **Real code second**: \`mcp__kencode-search__searchCode\` — literal-text or RE2-regex search across 2M+ public repos. **Not semantic.**\n` +
86
- ` - **Concept → query recipe.** If you only have a concept ("karaoke captions", "spring animation"), DO NOT search the concept. Anchor on a literal token a matching file would contain:\n` +
87
- ` 1. A library import — \`from "remotion"\`, \`import { spring }\`, \`from "@remotion/captions"\`\n` +
88
- ` 2. A known identifier/prop/hook — \`useVideoConfig\`, \`interpolate(\`, \`<Sequence\`, \`SubtitlePage\`\n` +
89
- ` 3. A unique config key — \`"defaultExport":\`, \`assetsInclude:\`\n` +
90
- ` Bad: \`karaoke word animation subtitle\` → zero hits, every time. Good: \`from "@remotion/captions"\` + \`peek: true\` → real files; then narrow with \`repo\` + \`path\` and read them.\n` +
91
- ` - **Filename + topic ≠ query.** \`Page.tsx tiktok\` won't match. Use \`path: "Page.tsx"\` + \`repo: "remotion-dev"\` + a literal token in \`query\`.\n` +
92
- ` - Filters: \`language: ["TypeScript"]\`, \`repo: "owner/name"\` (substring), \`path: "src/components/"\` (substring), \`matchCase\`, \`useRegexp\`.\n` +
93
- ` - Workflow: \`peek: true\` first → paths + match counts only (cheap triage). Then call again narrowed by \`repo\` + \`path\` for full snippets. Paginate with \`offset\`.\n` +
94
- ` - Defaults exclude tests, \`node_modules\`, vendored, build, and generated files — pass \`includeTests: true\` or \`includeVendored: true\` to widen.\n` +
95
- ` - Token budget: \`maxResults\` defaults to 10 (cap 200), \`contextLines\` defaults to 5 (range 0–20). Keep both small unless you need more.\n` +
96
- ` - RE2 regex only: no lookahead/lookbehind/backrefs; multi-line patterns need \`(?s)\` prefix.\n` +
97
- `- Applies to everything — APIs, CLI flags, configs (vite.config.ts, package.json, Dockerfile, GH Actions), shell idioms, schema shapes, error wording, conventions. Not just "unfamiliar" code.`);
98
- // 4. Code Quality
99
- sections.push(`## Code Quality\n\n` +
42
+ }
43
+ function renderPlanModeSection() {
44
+ return (`## Plan Mode (ACTIVE)\n\n` +
45
+ `You are in PLAN MODE. Research and design an implementation plan before writing any code.\n\n` +
46
+ `### Workflow\n` +
47
+ `1. Explore: read, grep, find, ls to understand the codebase\n` +
48
+ `2. Research: \`web_search\` + \`web_fetch\` for docs; for real code, use Explore to discover candidate repos/files/anchors, then SearchCode to verify exact snippets (full usage below)\n` +
49
+ `3. Draft: write the plan to .ezcoder/plans/<name>.md\n` +
50
+ `4. Submit: call exit_plan with the plan path\n\n` +
51
+ `### Rules\n` +
52
+ `- bash, edit, write (except to .ezcoder/plans/), and subagent are restricted\n` +
53
+ `- Be specific: exact file paths, function names, line numbers\n` +
54
+ `- Note risks and verification criteria\n\n` +
55
+ `### Plan Format\n` +
56
+ `Plan can have any structure, but it MUST end with a section titled exactly \`## Steps\` ` +
57
+ `containing a single flat numbered list. This section is parsed by the progress widget — ` +
58
+ `the ONLY source of truth for step tracking. Do NOT put numbered lists elsewhere.`);
59
+ }
60
+ async function renderApprovedPlanSection(approvedPlanPath, planMode) {
61
+ if (!approvedPlanPath || planMode)
62
+ return null;
63
+ const planContent = await fs.readFile(approvedPlanPath, "utf-8").catch(() => null);
64
+ if (planContent === null)
65
+ return null;
66
+ if (!planContent.trim())
67
+ return null;
68
+ return (`## Approved Plan\n\n` +
69
+ `Follow this plan strictly. File: ${approvedPlanPath}\n\n` +
70
+ `<approved_plan>\n${planContent.trim()}\n</approved_plan>\n\n` +
71
+ `- Follow step order. Don't deviate without user confirmation.\n` +
72
+ `- After each step from \`## Steps\`, output \`[DONE:n]\` (e.g. \`[DONE:1]\`) to update the progress widget, then continue with step n+1 in the same turn.`);
73
+ }
74
+ function renderResearchSection() {
75
+ return (`## Research & Verification\n\n` +
76
+ `Do not assume current APIs, CLI flags, config schema, or error wording — verify.\n\n` +
77
+ `- **Docs first**: use \`web_search\` to find authoritative pages, then \`web_fetch\` to read them.\n` +
78
+ `- **Public code samples**: use \`mcp__kencode-search__exploreCodeSamples\` once early for examples/patterns/ideas/best practices or vague concepts. Treat it as anchor discovery: read its recommended options and copy 3–5 of its follow-up \`searchCode\` calls before inventing new queries.\n` +
79
+ `- **Exact code search**: use \`mcp__kencode-search__searchCode\` to verify snippets by literal text or RE2 regex only NOT semantic search. Put code tokens in \`query\`; use \`path\` only for literal file-path substrings and \`repo\` only after a broad/peek search proves the anchor exists. Report Explore-only results as candidates, SearchCode results as verified code.\n` +
80
+ `- **Verify after edits**: run relevant checks, read failures, fix them, and never report unrun or failing checks as passing.`);
81
+ }
82
+ function renderCodeQualitySection() {
83
+ return (`## Code Quality\n\n` +
100
84
  `- Descriptive names that reveal intent. Define types before implementation.\n` +
101
85
  `- No dead code, no commented-out code. No stubs or placeholders unless asked.\n` +
102
86
  `- Handle errors at I/O, user input, and external API boundaries.\n` +
103
87
  `- Prefer existing dependencies. Don't refactor or reorganize unprompted.`);
104
- // 5. Tools — filtered by active tool set
88
+ }
89
+ function renderToolsSection(toolNames, planMode) {
105
90
  const activeTools = toolNames ?? DEFAULT_TOOL_NAMES;
106
91
  const toolLines = [];
107
92
  for (const name of activeTools) {
108
- // In plan mode, hide enter_plan (already entered); outside plan mode, hide exit_plan.
109
93
  if (planMode && name === "enter_plan")
110
94
  continue;
111
95
  if (!planMode && name === "exit_plan")
@@ -114,10 +98,9 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
114
98
  if (hint)
115
99
  toolLines.push(`- **${name}**: ${hint}`);
116
100
  }
117
- if (toolLines.length > 0) {
118
- sections.push(`## Tools\n\n${toolLines.join("\n")}`);
119
- }
120
- // 6. Project context — walk from cwd to root looking for context files
101
+ return toolLines.length > 0 ? `## Tools\n\n${toolLines.join("\n")}` : null;
102
+ }
103
+ async function collectProjectContext(cwd) {
121
104
  const contextParts = [];
122
105
  let dir = cwd;
123
106
  const visited = new Set();
@@ -131,7 +114,7 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
131
114
  contextParts.push(`### ${relPath}\n\n${content.trim()}`);
132
115
  }
133
116
  catch {
134
- // File doesn't exist, skip
117
+ // File doesn't exist, skip.
135
118
  }
136
119
  }
137
120
  const parent = path.dirname(dir);
@@ -139,29 +122,56 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
139
122
  break;
140
123
  dir = parent;
141
124
  }
142
- if (contextParts.length > 0) {
143
- sections.push(`## Project Context\n\n` +
144
- `**Highest precedence** — the files below override anything stated earlier ` +
145
- `in this prompt (How to Talk / How to Work / Code Quality / Style Packs).\n\n` +
146
- contextParts.join("\n\n"));
147
- }
148
- // 6b. Language Style Packs injected when the language detector has
149
- // identified the project's active languages. See `core/language-detector.ts`
150
- // and the swap logic in `ui/App.tsx`.
125
+ return contextParts;
126
+ }
127
+ function renderProjectContextSection(contextParts) {
128
+ if (contextParts.length === 0)
129
+ return null;
130
+ return (`## Project Context\n\n` +
131
+ `**Highest precedence** — AGENTS.md / CLAUDE.md override Language Style Packs and all default guidance. ` +
132
+ `When these files conflict with anything else in this prompt, follow the project file.\n\n` +
133
+ contextParts.join("\n\n"));
134
+ }
135
+ function renderEnvironmentSection(cwd) {
136
+ return `## Environment\n\n- Working directory: ${cwd}\n- Platform: ${process.platform}`;
137
+ }
138
+ function renderUncachedDateSuffix() {
139
+ const today = new Date();
140
+ const day = today.getDate();
141
+ const month = today.toLocaleString("en-US", { month: "long" });
142
+ const year = today.getFullYear();
143
+ return `${UNCACHED_MARKER}\nToday's date: ${day} ${month} ${year}`;
144
+ }
145
+ /**
146
+ * Build the system prompt dynamically based on cwd and context.
147
+ *
148
+ * @param toolNames — if provided, the Tools section only lists these tools.
149
+ * Pass `tools.map(t => t.name)` from the session so the prompt reflects
150
+ * exactly what the model can call. Defaults to the full built-in set.
151
+ */
152
+ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath, toolNames, activeLanguages) {
153
+ const sections = [renderIdentitySection(), renderTalkSection(), renderWorkSection()];
154
+ if (planMode)
155
+ sections.push(renderPlanModeSection());
156
+ const approvedPlanSection = await renderApprovedPlanSection(approvedPlanPath, planMode);
157
+ if (approvedPlanSection)
158
+ sections.push(approvedPlanSection);
159
+ sections.push(renderResearchSection(), renderCodeQualitySection());
160
+ const toolsSection = renderToolsSection(toolNames, planMode);
161
+ if (toolsSection)
162
+ sections.push(toolsSection);
163
+ const projectContextSection = renderProjectContextSection(await collectProjectContext(cwd));
164
+ if (projectContextSection)
165
+ sections.push(projectContextSection);
151
166
  if (activeLanguages && activeLanguages.size > 0) {
152
167
  const stylePacks = renderStylePacksSection(activeLanguages, cwd);
153
168
  if (stylePacks)
154
169
  sections.push(stylePacks);
155
- // 6c. Verification — detected commands for the active languages, so the
156
- // agent can close the feedback loop after pack-influenced edits. Without
157
- // this anchor, packs are advisory; with it, the model has concrete
158
- // commands to run and verify against.
159
170
  const verifyCmds = detectVerifyCommands(cwd, activeLanguages);
160
171
  const verifySection = renderVerifySection(verifyCmds);
161
172
  if (verifySection)
162
173
  sections.push(verifySection);
163
174
  }
164
- // 7. Eyes — open improvement signals from past probe use (gated on .ezcoder/eyes/manifest.json)
165
175
  if (isEyesActive(cwd)) {
166
176
  const open = readJournal({ status: "open", order: "desc", limit: 10 }, cwd);
167
177
  if (open.length > 0) {
@@ -171,30 +181,17 @@ export async function buildSystemPrompt(cwd, skills, planMode, approvedPlanPath,
171
181
  return `- ${date} · *${e.kind}*${probeTag}: ${e.reason}`;
172
182
  });
173
183
  sections.push(`## Eyes — Open Improvement Signals\n\n` +
174
- `These are unresolved signals from past use of this project's perception probes ` +
175
- `(\`.ezcoder/eyes/\`). Consider whether any bear on the current work. If a missing or ` +
176
- `inadequate capability would force you to **guess, skip verification, or hand-wave**, ` +
177
- `surface the tradeoff in conversation rather than working around it silently — give the ` +
178
- `user the choice to fix the probe first.\n\n` +
184
+ `These unresolved signals from this project's perception probes (\`.ezcoder/eyes/\`) may bear on the work. ` +
185
+ `If a missing capability would force guessing or skipped verification, surface the tradeoff instead.\n\n` +
179
186
  lines.join("\n"));
180
187
  }
181
188
  }
182
- // 9. Skills
183
189
  if (skills && skills.length > 0) {
184
190
  const skillsSection = formatSkillsForPrompt(skills);
185
- if (skillsSection) {
191
+ if (skillsSection)
186
192
  sections.push(skillsSection);
187
- }
188
193
  }
189
- // 10. Environment (static — cacheable)
190
- sections.push(`## Environment\n\n` + `- Working directory: ${cwd}\n` + `- Platform: ${process.platform}`);
191
- // Dynamic section (uncached) — separated by marker so the transform layer
192
- // can split the system prompt into cached + uncached blocks.
193
- const today = new Date();
194
- const day = today.getDate();
195
- const month = today.toLocaleString("en-US", { month: "long" });
196
- const year = today.getFullYear();
197
- sections.push(`<!-- uncached -->\nToday's date: ${day} ${month} ${year}`);
194
+ sections.push(renderEnvironmentSection(cwd), renderUncachedDateSuffix());
198
195
  return sections.join("\n\n");
199
196
  }
200
197
  //# sourceMappingURL=system-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=system-prompt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.test.d.ts","sourceRoot":"","sources":["../src/system-prompt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { buildSystemPrompt } from "./system-prompt.js";
6
+ const tempDirs = [];
7
+ async function makeProject(files = {}) {
8
+ const cwd = await fs.mkdtemp(path.join(os.tmpdir(), "ezcoder-system-prompt-"));
9
+ tempDirs.push(cwd);
10
+ for (const [relativePath, content] of Object.entries(files)) {
11
+ const filePath = path.join(cwd, relativePath);
12
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
13
+ await fs.writeFile(filePath, content, "utf-8");
14
+ }
15
+ return cwd;
16
+ }
17
+ function sectionIndex(prompt, heading) {
18
+ const index = prompt.indexOf(heading);
19
+ expect(index, `${heading} should exist`).toBeGreaterThanOrEqual(0);
20
+ return index;
21
+ }
22
+ function toolsSection(prompt) {
23
+ const start = sectionIndex(prompt, "## Tools");
24
+ const rest = prompt.slice(start);
25
+ const next = rest.indexOf("\n\n## ", "## Tools".length);
26
+ return next === -1 ? rest : rest.slice(0, next);
27
+ }
28
+ afterEach(async () => {
29
+ await Promise.all(tempDirs.splice(0).map((dir) => fs.rm(dir, { recursive: true, force: true })));
30
+ });
31
+ describe("buildSystemPrompt", () => {
32
+ it("renders deterministic section order and keeps only the volatile date after the marker", async () => {
33
+ const cwd = await makeProject({
34
+ "CLAUDE.md": "Project rules win.",
35
+ "package.json": JSON.stringify({ scripts: { check: "tsc --noEmit" } }),
36
+ "tsconfig.json": "{}",
37
+ });
38
+ const prompt = await buildSystemPrompt(cwd, [{ name: "find-skills", description: "Find skills.", content: "", source: "test" }], false, undefined, ["read", "edit", "web_search", "enter_plan", "exit_plan", "skill"], new Set(["typescript"]));
39
+ expect(prompt.startsWith("You are EZ Coder by Nolan Grout")).toBe(true);
40
+ expect(sectionIndex(prompt, "## How to Talk")).toBeLessThan(sectionIndex(prompt, "## How to Work"));
41
+ expect(sectionIndex(prompt, "## How to Work")).toBeLessThan(sectionIndex(prompt, "## Research & Verification"));
42
+ expect(sectionIndex(prompt, "## Research & Verification")).toBeLessThan(sectionIndex(prompt, "## Code Quality"));
43
+ expect(sectionIndex(prompt, "## Code Quality")).toBeLessThan(sectionIndex(prompt, "## Tools"));
44
+ expect(sectionIndex(prompt, "## Tools")).toBeLessThan(sectionIndex(prompt, "## Project Context"));
45
+ expect(sectionIndex(prompt, "## Project Context")).toBeLessThan(sectionIndex(prompt, "## Language Style Packs"));
46
+ expect(sectionIndex(prompt, "## Language Style Packs")).toBeLessThan(sectionIndex(prompt, "## Verification"));
47
+ expect(sectionIndex(prompt, "## Verification")).toBeLessThan(sectionIndex(prompt, "## Skills"));
48
+ expect(sectionIndex(prompt, "## Skills")).toBeLessThan(sectionIndex(prompt, "## Environment"));
49
+ const marker = "<!-- uncached -->";
50
+ expect(prompt.match(new RegExp(marker, "g"))).toHaveLength(1);
51
+ const afterMarker = prompt.slice(prompt.indexOf(marker) + marker.length).trim();
52
+ expect(afterMarker).toMatch(/^Today's date: \d{1,2} [A-Za-z]+ \d{4}$/);
53
+ });
54
+ it("lists exactly available known tools and hides unavailable plan transition tools", async () => {
55
+ const cwd = await makeProject();
56
+ const normalPrompt = await buildSystemPrompt(cwd, undefined, false, undefined, [
57
+ "read",
58
+ "web_search",
59
+ "exit_plan",
60
+ "not_a_tool",
61
+ ]);
62
+ const normalTools = toolsSection(normalPrompt);
63
+ expect(normalTools).toContain("**read**");
64
+ expect(normalTools).toContain("**web_search**");
65
+ expect(normalTools).not.toContain("**exit_plan**");
66
+ expect(normalTools).not.toContain("not_a_tool");
67
+ expect(normalTools).not.toContain("**edit**");
68
+ const planPrompt = await buildSystemPrompt(cwd, undefined, true, undefined, [
69
+ "read",
70
+ "enter_plan",
71
+ "exit_plan",
72
+ ]);
73
+ const planTools = toolsSection(planPrompt);
74
+ expect(planTools).toContain("**read**");
75
+ expect(planTools).toContain("**exit_plan**");
76
+ expect(planTools).not.toContain("**enter_plan**");
77
+ });
78
+ it("places project-context precedence next to project context before style packs", async () => {
79
+ const cwd = await makeProject({
80
+ "AGENTS.md": "Use tabs for this fixture.",
81
+ "tsconfig.json": "{}",
82
+ });
83
+ const prompt = await buildSystemPrompt(cwd, undefined, false, undefined, ["read"], new Set(["typescript"]));
84
+ const projectContextIndex = sectionIndex(prompt, "## Project Context");
85
+ const precedenceIndex = prompt.indexOf("**Highest precedence**", projectContextIndex);
86
+ expect(precedenceIndex).toBeGreaterThan(projectContextIndex);
87
+ expect(precedenceIndex).toBeLessThan(sectionIndex(prompt, "### AGENTS.md"));
88
+ expect(sectionIndex(prompt, "## Project Context")).toBeLessThan(sectionIndex(prompt, "## Language Style Packs"));
89
+ expect(prompt).toContain("AGENTS.md / CLAUDE.md override Language Style Packs");
90
+ });
91
+ it("keeps kencode guidance concise while separating exploration from exact search", async () => {
92
+ const cwd = await makeProject();
93
+ const prompt = await buildSystemPrompt(cwd, undefined, false, undefined, [
94
+ "mcp__kencode-search__exploreCodeSamples",
95
+ "mcp__kencode-search__searchCode",
96
+ ]);
97
+ const tools = toolsSection(prompt);
98
+ expect(tools).toContain("discover candidate repos/files and literal anchors");
99
+ expect(tools).toContain("follow-up searchCode calls");
100
+ expect(tools).toContain("literal text or RE2 regex");
101
+ expect(tools).toContain("NOT semantic");
102
+ expect(tools).toContain("path` is a literal file-path substring");
103
+ expect(tools).not.toContain("zero hits, every time");
104
+ expect(tools.length).toBeLessThan(750);
105
+ });
106
+ });
107
+ //# sourceMappingURL=system-prompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.test.js","sourceRoot":"","sources":["../src/system-prompt.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAIjE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAwDvE,QAAA,MAAM,UAAU;;;;iBAed,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC,SAAS,CAAC,OAAO,UAAU,CAAC,CAiH9B"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAIjE,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAwDvE,QAAA,MAAM,UAAU;;;;iBAed,CAAC;AAEH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,cAAc,EAC9B,GAAG,GAAE,cAAgC,EACrC,WAAW,CAAC,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACjC,SAAS,CAAC,OAAO,UAAU,CAAC,CAkH9B"}
@@ -80,6 +80,7 @@ export function createBashTool(cwd, processManager, ops = localOperations, planM
80
80
  "Set run_in_background=true for long-running processes (dev servers, watchers). " +
81
81
  "Use task_output/task_stop to interact with background processes.",
82
82
  parameters: BashParams,
83
+ executionMode: "sequential",
83
84
  async execute({ command, timeout: timeoutMs, run_in_background }, context) {
84
85
  if (planModeRef?.current) {
85
86
  return "Error: bash is restricted in plan mode. Use read-only tools (read, grep, find, ls) to explore the codebase.";
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAuB,MAAM,iBAAiB,CAAC;AAEvE,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,cAAc;AAC/C,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,6CAA6C;AAExF,4GAA4G;AAC5G,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;IACP,MAAM;IACN,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,gBAAgB;IAChB,UAAU;IACV,aAAa;IACb,yBAAyB;IACzB,WAAW;IACX,SAAS;IACT,mBAAmB;IACnB,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,aAAa;IACb,mBAAmB;IACnB,cAAc;IACd,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,UAAU;IACV,YAAY;CACb,CAAC,CAAC;AAEH,SAAS,UAAU;IACjB,MAAM,GAAG,GAA2B,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACvE,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC3D,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,2CAA2C,CAAC;IACxD,iBAAiB,EAAE,CAAC;SACjB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,uEAAuE;QACrE,0DAA0D,CAC7D;CACJ,CAAC,CAAC;AAEH,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,cAA8B,EAC9B,MAAsB,eAAe,EACrC,WAAkC;IAElC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,6FAA6F;YAC7F,iFAAiF;YACjF,gDAAgD;YAChD,+DAA+D;YAC/D,wCAAwC;YACxC,iFAAiF;YACjF,kEAAkE;QACpE,UAAU,EAAE,UAAU;QACtB,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,OAAO;YACvE,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;gBACzB,OAAO,6GAA6G,CAAC;YACvH,CAAC;YACD,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACxD,OAAO,CACL,+BAA+B;oBAC/B,OAAO,MAAM,CAAC,EAAE,IAAI;oBACpB,QAAQ,MAAM,CAAC,GAAG,IAAI;oBACtB,QAAQ,MAAM,CAAC,OAAO,IAAI;oBAC1B,4BAA4B,MAAM,CAAC,EAAE,mBAAmB,CACzD,CAAC;YACJ,CAAC;YAED,MAAM,gBAAgB,GAAG,SAAS,IAAI,eAAe,CAAC;YAEtD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;gBACrC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;oBAC/C,GAAG;oBACH,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;oBACjC,GAAG,EAAE,UAAU,EAAE;iBAClB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAa,EAAE,CAAC;gBAC5B,IAAI,UAAU,GAAG,CAAC,CAAC;gBACnB,IAAI,YAAY,GAAG,KAAK,CAAC;gBAEzB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;oBAC9B,IAAI,YAAY;wBAAE,OAAO;oBACzB,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC;oBAC1B,IAAI,UAAU,GAAG,gBAAgB,EAAE,CAAC;wBAClC,YAAY,GAAG,IAAI,CAAC;wBACpB,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAElB,gDAAgD;oBAChD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;wBACrB,OAAO,CAAC,QAAQ,CAAC;4BACf,IAAI,EAAE,eAAe;4BACrB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;4BAC9B,UAAU;yBACX,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC;gBACF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACjC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAEjC,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;gBAErB,mBAAmB;gBACnB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC5B,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,GAAG,IAAI,CAAC;oBACd,IAAI,KAAK,CAAC,GAAG;wBAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,EAAE,gBAAgB,CAAC,CAAC;gBAErB,wBAAwB;gBACxB,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,MAAM,GAAG,IAAI,CAAC;oBACd,IAAI,KAAK,CAAC,GAAG;wBAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC;gBACF,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAElE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAErD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC1D,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;oBAEvC,IAAI,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC;oBAC5B,IAAI,YAAY,EAAE,CAAC;wBACjB,MAAM,GAAG,qBAAqB,gBAAgB,GAAG,IAAI,GAAG,IAAI,sCAAsC,MAAM,EAAE,CAAC;oBAC7G,CAAC;oBACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACrB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;wBAC9E,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3E,MAAM,GAAG,4BAA4B,MAAM,CAAC,SAAS,OAAO,MAAM,CAAC,UAAU,UAAU,cAAc,MAAM,MAAM,EAAE,CAAC;oBACtH,CAAC;oBAED,MAAM,QAAQ,GAAG,QAAQ;wBACvB,CAAC,CAAC,YAAY,gBAAgB,KAAK;wBACnC,CAAC,CAAC,MAAM;4BACN,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;oBAExB,OAAO,CAAC,cAAc,QAAQ,KAAK,MAAM,EAAE,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;gBAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACxB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACrD,OAAO,CAAC,kCAAkC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3D,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,53 @@
1
+ /**
2
+ * Aider's `replace_part_with_missing_leading_whitespace` (~10k stars between
3
+ * aider/devon/codemcp/qwen-coder use this exact pattern). Models very often
4
+ * mess up leading whitespace — uniformly across both old_text and new_text.
5
+ * Strategy:
6
+ * 1. Outdent old/new uniformly by the smallest leading-whitespace count
7
+ * across all non-blank lines (handles "model included some but not all").
8
+ * 2. Scan the file for a window where every line matches when stripped AND
9
+ * the file's actual leading prefix is uniform across non-blank lines.
10
+ * 3. Re-apply that uniform file-prefix to every non-blank line of new_text
11
+ * before substituting.
12
+ *
13
+ * Returns the rewritten file content on success, null when no unique match.
14
+ */
15
+ export declare function applyMissingLeadingWhitespace(working: string, old: string, next: string): string | null;
16
+ /**
17
+ * Aider-style `...` elision matching: when `old_text` contains lines that are
18
+ * just `...`, treat them as "skip whatever's here" placeholders. The model
19
+ * writes:
20
+ *
21
+ * old: function foo() {
22
+ * ...
23
+ * return bar;
24
+ * }
25
+ * new: function foo() {
26
+ * ...
27
+ * return baz;
28
+ * }
29
+ *
30
+ * We split both `old` and `next` on the `...` lines, then anchor the bookend
31
+ * pieces in `working` (greedy, in order). The elided middle from `working` is
32
+ * preserved verbatim and stitched in between the new bookends. Returns the
33
+ * rewritten buffer on success, null when:
34
+ * - `old` has no `...` lines (caller should try other strategies)
35
+ * - piece counts differ between `old` and `next` (ambiguous elision)
36
+ * - any piece is empty (means dots at start/end or adjacent — too risky)
37
+ * - any old piece doesn't appear in `working` after the previous one
38
+ *
39
+ * Greedy first-match-then-forward. We DO NOT support `replace_all` with
40
+ * elision — `...` is intrinsically a single edit.
41
+ */
42
+ export declare function applyDotdotdots(working: string, old: string, next: string): string | null;
43
+ /**
44
+ * Models often add a spurious leading blank line to `old_text` (e.g. when
45
+ * copying a code block out of fenced markdown). Aider noticed this back at
46
+ * its issue #25. If the first line is blank, return the same text minus that
47
+ * line so the caller can retry the match. Returns null when no leading blank
48
+ * line exists, so callers can cheaply skip the retry.
49
+ */
50
+ export declare function stripLeadingBlankLine(text: string): string | null;
1
51
  /**
2
52
  * Find text in content, trying exact match first then fuzzy.
3
53
  */
@@ -20,7 +70,22 @@ export declare function countOccurrences(content: string, oldText: string): numb
20
70
  * expected location(s) — multiple results help disambiguate when several
21
71
  * regions look similar (e.g. repeated function bodies).
22
72
  */
23
- export declare function findClosestSnippet(content: string, oldText: string, contextLines?: number, maxResults?: number): string | null;
73
+ export interface ClosestSnippet {
74
+ snippet: string;
75
+ topLine: number;
76
+ }
77
+ export declare function findClosestSnippet(content: string, oldText: string, contextLines?: number, maxResults?: number): ClosestSnippet | null;
78
+ /**
79
+ * Locate every occurrence of `text` in `content` and return the 1-indexed line
80
+ * number plus a trimmed preview of that line. Tries exact first, then the same
81
+ * fuzzy normalization as `countOccurrences` so the line numbers match what the
82
+ * caller saw in `countOccurrences`. Capped at `max` so error messages stay
83
+ * compact when a token like `}` matches dozens of times.
84
+ */
85
+ export declare function findOccurrenceLines(content: string, text: string, max?: number): {
86
+ line: number;
87
+ preview: string;
88
+ }[];
24
89
  /**
25
90
  * Generate a unified diff string.
26
91
  */
@@ -1 +1 @@
1
- {"version":3,"file":"edit-diff.d.ts","sourceRoot":"","sources":["../../src/tools/edit-diff.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAyC5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBzE;AASD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,SAAI,EAChB,UAAU,SAAI,GACb,MAAM,GAAG,IAAI,CAsCf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa7F"}
1
+ {"version":3,"file":"edit-diff.d.ts","sourceRoot":"","sources":["../../src/tools/edit-diff.ts"],"names":[],"mappings":"AA8CA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAgDf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkCzF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAyC5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBzE;AASD;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAIhB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,YAAY,SAAI,EAChB,UAAU,SAAI,GACb,cAAc,GAAG,IAAI,CAuCvB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,GAAG,SAAI,GACN;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CA6BrC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa7F"}