@nghyane/arcane 0.1.13 → 0.1.15

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 (303) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/package.json +21 -70
  3. package/scripts/format-prompts.ts +1 -3
  4. package/src/cli/args.ts +2 -7
  5. package/src/cli/config-cli.ts +1 -1
  6. package/src/cli/plugin-cli.ts +1 -1
  7. package/src/cli/setup-cli.ts +1 -1
  8. package/src/cli/update-cli.ts +1 -1
  9. package/src/cli/web-search-cli.ts +1 -1
  10. package/src/cli.ts +0 -1
  11. package/src/commands/config.ts +1 -1
  12. package/src/commands/grep.ts +1 -1
  13. package/src/commands/jupyter.ts +1 -1
  14. package/src/commands/plugin.ts +1 -1
  15. package/src/commands/setup.ts +1 -1
  16. package/src/commands/shell.ts +1 -1
  17. package/src/commands/ssh.ts +1 -1
  18. package/src/commands/stats.ts +1 -1
  19. package/src/commands/update.ts +1 -1
  20. package/src/config/model-registry.ts +3 -4
  21. package/src/config/model-resolver.ts +36 -9
  22. package/src/config/prompt-templates.ts +1 -9
  23. package/src/config/settings-schema.ts +32 -88
  24. package/src/config/settings.ts +3 -4
  25. package/src/debug/index.ts +1 -1
  26. package/src/debug/log-formatting.ts +1 -1
  27. package/src/debug/log-viewer.ts +2 -2
  28. package/src/discovery/helpers.ts +13 -3
  29. package/src/exa/index.ts +1 -35
  30. package/src/exa/render.ts +30 -190
  31. package/src/export/html/index.ts +1 -1
  32. package/src/extensibility/custom-tools/loader.ts +1 -1
  33. package/src/extensibility/custom-tools/types.ts +5 -1
  34. package/src/extensibility/custom-tools/wrapper.ts +1 -1
  35. package/src/extensibility/extensions/runner.ts +1 -1
  36. package/src/extensibility/extensions/types.ts +1 -1
  37. package/src/extensibility/extensions/wrapper.ts +7 -15
  38. package/src/extensibility/hooks/runner.ts +1 -1
  39. package/src/extensibility/hooks/types.ts +1 -1
  40. package/src/extensibility/plugins/doctor.ts +1 -1
  41. package/src/index.ts +13 -13
  42. package/src/lsp/index.ts +77 -24
  43. package/src/lsp/render.ts +34 -583
  44. package/src/lsp/types.ts +3 -3
  45. package/src/lsp/utils.ts +1 -1
  46. package/src/main.ts +1 -1
  47. package/src/mcp/tool-bridge.ts +1 -24
  48. package/src/modes/components/assistant-message.ts +7 -7
  49. package/src/modes/components/bash-execution.ts +50 -112
  50. package/src/modes/components/bordered-loader.ts +1 -1
  51. package/src/modes/components/branch-summary-message.ts +16 -10
  52. package/src/modes/components/compaction-summary-message.ts +20 -12
  53. package/src/modes/components/context-group.ts +106 -0
  54. package/src/modes/components/custom-message.ts +4 -5
  55. package/src/modes/components/diff.ts +2 -2
  56. package/src/modes/components/dynamic-border.ts +1 -1
  57. package/src/modes/components/extensions/extension-dashboard.ts +1 -1
  58. package/src/modes/components/extensions/extension-list.ts +1 -1
  59. package/src/modes/components/extensions/inspector-panel.ts +1 -1
  60. package/src/modes/components/footer.ts +2 -2
  61. package/src/modes/components/history-search.ts +1 -1
  62. package/src/modes/components/hook-editor.ts +1 -1
  63. package/src/modes/components/hook-input.ts +1 -1
  64. package/src/modes/components/hook-message.ts +4 -5
  65. package/src/modes/components/hook-selector.ts +1 -1
  66. package/src/modes/components/index.ts +0 -2
  67. package/src/modes/components/keybinding-hints.ts +1 -1
  68. package/src/modes/components/login-dialog.ts +1 -1
  69. package/src/modes/components/mcp-add-wizard.ts +1 -1
  70. package/src/modes/components/model-selector.ts +1 -1
  71. package/src/modes/components/oauth-selector.ts +1 -1
  72. package/src/modes/components/plugin-settings.ts +1 -1
  73. package/src/modes/components/python-execution.ts +51 -91
  74. package/src/modes/components/queue-mode-selector.ts +1 -1
  75. package/src/modes/components/session-selector.ts +1 -1
  76. package/src/modes/components/settings-defs.ts +5 -10
  77. package/src/modes/components/settings-selector.ts +1 -1
  78. package/src/modes/components/show-images-selector.ts +1 -1
  79. package/src/modes/components/skill-message.ts +4 -4
  80. package/src/modes/components/status-line/segments.ts +2 -2
  81. package/src/modes/components/status-line/separators.ts +1 -1
  82. package/src/modes/components/status-line-segment-editor.ts +1 -1
  83. package/src/modes/components/status-line.ts +1 -1
  84. package/src/modes/components/theme-selector.ts +1 -1
  85. package/src/modes/components/thinking-selector.ts +1 -1
  86. package/src/modes/components/todo-display.ts +2 -4
  87. package/src/modes/components/todo-reminder.ts +4 -4
  88. package/src/modes/components/tool-execution.ts +118 -440
  89. package/src/modes/components/tool-image-display.ts +107 -0
  90. package/src/modes/components/tree-selector.ts +2 -2
  91. package/src/modes/components/ttsr-notification.ts +4 -17
  92. package/src/modes/components/user-message-selector.ts +1 -1
  93. package/src/modes/components/user-message.ts +9 -10
  94. package/src/modes/components/welcome.ts +1 -1
  95. package/src/modes/controllers/command-controller.ts +1 -1
  96. package/src/modes/controllers/event-controller.ts +58 -187
  97. package/src/modes/controllers/extension-ui-controller.ts +1 -1
  98. package/src/modes/controllers/input-controller.ts +3 -1
  99. package/src/modes/controllers/mcp-command-controller.ts +1 -1
  100. package/src/modes/controllers/selector-controller.ts +3 -26
  101. package/src/modes/controllers/ssh-command-controller.ts +1 -1
  102. package/src/modes/interactive-mode.ts +3 -7
  103. package/src/modes/print-mode.ts +5 -5
  104. package/src/modes/rpc/rpc-mode.ts +1 -1
  105. package/src/modes/types.ts +1 -2
  106. package/src/modes/utils/ui-helpers.ts +34 -32
  107. package/src/patch/edit-tool.ts +742 -0
  108. package/src/patch/index.ts +32 -898
  109. package/src/patch/schemas.ts +208 -0
  110. package/src/patch/shared.ts +83 -151
  111. package/src/prompts/agents/explore.md +22 -37
  112. package/src/prompts/agents/init.md +1 -1
  113. package/src/prompts/agents/librarian.md +29 -20
  114. package/src/prompts/agents/oracle.md +9 -2
  115. package/src/prompts/agents/reviewer.md +14 -48
  116. package/src/prompts/agents/task.md +16 -8
  117. package/src/prompts/compaction/branch-summary.md +4 -1
  118. package/src/prompts/compaction/compaction-summary.md +4 -1
  119. package/src/prompts/system/subagent-system-prompt.md +1 -1
  120. package/src/prompts/system/system-prompt.md +162 -178
  121. package/src/prompts/system/verification-reminder.md +6 -0
  122. package/src/sdk.ts +0 -9
  123. package/src/session/agent-session.ts +244 -1459
  124. package/src/session/model-controller.ts +406 -0
  125. package/src/session/retry-utils.ts +71 -0
  126. package/src/session/session-manager.ts +22 -186
  127. package/src/session/session-types.ts +312 -0
  128. package/src/session/stats.ts +387 -0
  129. package/src/session/streaming-edit.ts +258 -0
  130. package/src/session/ttsr.ts +213 -0
  131. package/src/slash-commands/builtin-registry.ts +0 -8
  132. package/src/stt/recorder.ts +2 -2
  133. package/src/system-prompt.ts +1 -14
  134. package/src/task/agents.ts +7 -33
  135. package/src/task/executor.ts +50 -438
  136. package/src/task/index.ts +104 -71
  137. package/src/task/progress-tracker.ts +390 -0
  138. package/src/task/render.ts +371 -187
  139. package/src/task/subprocess-tool-registry.ts +1 -1
  140. package/src/task/types.ts +14 -47
  141. package/src/tools/ask.ts +31 -42
  142. package/src/tools/bash-interactive.ts +2 -2
  143. package/src/tools/bash-interceptor.ts +2 -2
  144. package/src/tools/bash-normalize.ts +1 -1
  145. package/src/tools/bash-skill-urls.ts +2 -2
  146. package/src/tools/bash.ts +87 -136
  147. package/src/tools/browser.ts +54 -84
  148. package/src/tools/create-tools.ts +186 -0
  149. package/src/tools/default-renderer.ts +104 -0
  150. package/src/tools/explore.ts +11 -10
  151. package/src/tools/fetch.ts +24 -114
  152. package/src/tools/find.ts +48 -132
  153. package/src/tools/gemini-image.ts +5 -15
  154. package/src/tools/github.ts +450 -0
  155. package/src/tools/grep.ts +43 -179
  156. package/src/tools/index.ts +35 -198
  157. package/src/tools/json-tree.ts +3 -3
  158. package/src/tools/librarian.ts +18 -18
  159. package/src/tools/list-limit.ts +2 -2
  160. package/src/tools/notebook.ts +35 -87
  161. package/src/tools/oracle.ts +25 -25
  162. package/src/tools/output-meta.ts +89 -4
  163. package/src/tools/output-utils.ts +2 -2
  164. package/src/tools/python.ts +86 -637
  165. package/src/tools/read.ts +36 -119
  166. package/src/tools/reviewer-tool.ts +19 -21
  167. package/src/tools/search-code.ts +128 -0
  168. package/src/tools/ssh.ts +67 -126
  169. package/src/tools/subagent-tool.ts +197 -123
  170. package/src/tools/todo-write.ts +15 -31
  171. package/src/tools/tool-errors.ts +0 -30
  172. package/src/tools/undo-edit.ts +30 -67
  173. package/src/tools/write.ts +78 -127
  174. package/src/tui/code-cell.ts +4 -4
  175. package/src/tui/file-list.ts +2 -2
  176. package/src/tui/output-block.ts +1 -1
  177. package/src/tui/status-line.ts +1 -1
  178. package/src/tui/tree-list.ts +2 -2
  179. package/src/tui/types.ts +1 -1
  180. package/src/tui/utils.ts +1 -1
  181. package/src/{tools → ui}/render-utils.ts +87 -126
  182. package/src/utils/external-editor.ts +4 -4
  183. package/src/utils/file-mentions.ts +1 -1
  184. package/src/utils/index.ts +30 -0
  185. package/src/utils/tools-manager.ts +9 -19
  186. package/src/web/github-client.ts +290 -0
  187. package/src/web/scrapers/github.ts +11 -62
  188. package/src/web/search/auth.ts +1 -3
  189. package/src/web/search/index.ts +82 -46
  190. package/src/web/search/provider.ts +11 -16
  191. package/src/web/search/providers/grep.ts +160 -0
  192. package/src/web/search/render.ts +48 -235
  193. package/src/web/search/types.ts +1 -1
  194. package/src/commands/commit.ts +0 -36
  195. package/src/commit/agentic/agent.ts +0 -311
  196. package/src/commit/agentic/fallback.ts +0 -96
  197. package/src/commit/agentic/index.ts +0 -359
  198. package/src/commit/agentic/prompts/analyze-file.md +0 -22
  199. package/src/commit/agentic/prompts/session-user.md +0 -25
  200. package/src/commit/agentic/prompts/split-confirm.md +0 -1
  201. package/src/commit/agentic/prompts/system.md +0 -38
  202. package/src/commit/agentic/state.ts +0 -69
  203. package/src/commit/agentic/tools/analyze-file.ts +0 -118
  204. package/src/commit/agentic/tools/git-file-diff.ts +0 -194
  205. package/src/commit/agentic/tools/git-hunk.ts +0 -50
  206. package/src/commit/agentic/tools/git-overview.ts +0 -84
  207. package/src/commit/agentic/tools/index.ts +0 -56
  208. package/src/commit/agentic/tools/propose-changelog.ts +0 -128
  209. package/src/commit/agentic/tools/propose-commit.ts +0 -154
  210. package/src/commit/agentic/tools/recent-commits.ts +0 -81
  211. package/src/commit/agentic/tools/split-commit.ts +0 -280
  212. package/src/commit/agentic/topo-sort.ts +0 -44
  213. package/src/commit/agentic/trivial.ts +0 -51
  214. package/src/commit/agentic/validation.ts +0 -200
  215. package/src/commit/analysis/conventional.ts +0 -165
  216. package/src/commit/analysis/index.ts +0 -4
  217. package/src/commit/analysis/scope.ts +0 -242
  218. package/src/commit/analysis/summary.ts +0 -112
  219. package/src/commit/analysis/validation.ts +0 -66
  220. package/src/commit/changelog/detect.ts +0 -37
  221. package/src/commit/changelog/generate.ts +0 -110
  222. package/src/commit/changelog/index.ts +0 -234
  223. package/src/commit/changelog/parse.ts +0 -44
  224. package/src/commit/cli.ts +0 -93
  225. package/src/commit/git/diff.ts +0 -148
  226. package/src/commit/git/errors.ts +0 -9
  227. package/src/commit/git/index.ts +0 -211
  228. package/src/commit/git/operations.ts +0 -54
  229. package/src/commit/index.ts +0 -5
  230. package/src/commit/map-reduce/index.ts +0 -64
  231. package/src/commit/map-reduce/map-phase.ts +0 -178
  232. package/src/commit/map-reduce/reduce-phase.ts +0 -145
  233. package/src/commit/map-reduce/utils.ts +0 -9
  234. package/src/commit/message.ts +0 -11
  235. package/src/commit/model-selection.ts +0 -69
  236. package/src/commit/pipeline.ts +0 -243
  237. package/src/commit/prompts/analysis-system.md +0 -148
  238. package/src/commit/prompts/analysis-user.md +0 -38
  239. package/src/commit/prompts/changelog-system.md +0 -50
  240. package/src/commit/prompts/changelog-user.md +0 -18
  241. package/src/commit/prompts/file-observer-system.md +0 -24
  242. package/src/commit/prompts/file-observer-user.md +0 -8
  243. package/src/commit/prompts/reduce-system.md +0 -50
  244. package/src/commit/prompts/reduce-user.md +0 -17
  245. package/src/commit/prompts/summary-retry.md +0 -3
  246. package/src/commit/prompts/summary-system.md +0 -38
  247. package/src/commit/prompts/summary-user.md +0 -13
  248. package/src/commit/prompts/types-description.md +0 -2
  249. package/src/commit/types.ts +0 -109
  250. package/src/commit/utils/exclusions.ts +0 -42
  251. package/src/mcp/render.ts +0 -123
  252. package/src/modes/components/agent-dashboard.ts +0 -1130
  253. package/src/modes/components/codemode-group.ts +0 -369
  254. package/src/modes/components/read-tool-group.ts +0 -119
  255. package/src/modes/components/visual-truncate.ts +0 -63
  256. package/src/prompts/system/subagent-user-prompt.md +0 -8
  257. package/src/prompts/tools/ask.md +0 -44
  258. package/src/prompts/tools/bash.md +0 -24
  259. package/src/prompts/tools/browser.md +0 -33
  260. package/src/prompts/tools/calculator.md +0 -12
  261. package/src/prompts/tools/explore.md +0 -29
  262. package/src/prompts/tools/fetch.md +0 -16
  263. package/src/prompts/tools/find.md +0 -18
  264. package/src/prompts/tools/gemini-image.md +0 -23
  265. package/src/prompts/tools/grep.md +0 -28
  266. package/src/prompts/tools/hashline.md +0 -232
  267. package/src/prompts/tools/librarian.md +0 -24
  268. package/src/prompts/tools/lsp.md +0 -28
  269. package/src/prompts/tools/oracle.md +0 -26
  270. package/src/prompts/tools/patch.md +0 -74
  271. package/src/prompts/tools/python.md +0 -66
  272. package/src/prompts/tools/read.md +0 -36
  273. package/src/prompts/tools/replace.md +0 -38
  274. package/src/prompts/tools/reviewer.md +0 -41
  275. package/src/prompts/tools/ssh.md +0 -51
  276. package/src/prompts/tools/task-summary.md +0 -28
  277. package/src/prompts/tools/task.md +0 -146
  278. package/src/prompts/tools/todo-write.md +0 -65
  279. package/src/prompts/tools/undo-edit.md +0 -7
  280. package/src/prompts/tools/web-search.md +0 -19
  281. package/src/prompts/tools/write.md +0 -18
  282. package/src/task/batch.ts +0 -102
  283. package/src/task/discovery.ts +0 -126
  284. package/src/task/parallel.ts +0 -84
  285. package/src/task/template.ts +0 -32
  286. package/src/tools/calculator.ts +0 -537
  287. package/src/tools/jtd-to-typescript.ts +0 -198
  288. package/src/tools/renderers.ts +0 -60
  289. package/src/tools/tool-result.ts +0 -86
  290. /package/src/{modes/theme → theme}/dark.json +0 -0
  291. /package/src/{modes/theme → theme}/defaults/dark-catppuccin.json +0 -0
  292. /package/src/{modes/theme → theme}/defaults/dark-dracula.json +0 -0
  293. /package/src/{modes/theme → theme}/defaults/dark-gruvbox.json +0 -0
  294. /package/src/{modes/theme → theme}/defaults/dark-solarized.json +0 -0
  295. /package/src/{modes/theme → theme}/defaults/dark-tokyo-night.json +0 -0
  296. /package/src/{modes/theme → theme}/defaults/index.ts +0 -0
  297. /package/src/{modes/theme → theme}/defaults/light-catppuccin.json +0 -0
  298. /package/src/{modes/theme → theme}/defaults/light-github.json +0 -0
  299. /package/src/{modes/theme → theme}/defaults/light-solarized.json +0 -0
  300. /package/src/{modes/theme → theme}/light.json +0 -0
  301. /package/src/{modes/theme → theme}/mermaid-cache.ts +0 -0
  302. /package/src/{modes/theme → theme}/theme-schema.json +0 -0
  303. /package/src/{modes/theme → theme}/theme.ts +0 -0
@@ -1,41 +0,0 @@
1
- # Review
2
-
3
- Review code changes using a specialized code review subagent. The reviewer identifies bugs the author would want fixed before merge — not style issues, not pre-existing bugs.
4
-
5
- ## When to use
6
- - Review uncommitted changes, a specific commit, or a PR diff
7
- - Check code quality and correctness of recent modifications
8
- - Analyze a diff for bugs, security issues, or logic errors
9
-
10
- ## When NOT to use
11
- - Simple file reading or code understanding (use Read/Grep/Explore)
12
- - Making code changes (use Edit/Write/Task)
13
-
14
- ## Parameters
15
-
16
- ### `diff_description` (required)
17
-
18
- A description or command that identifies the diff to review. Examples:
19
- - `"uncommitted changes"` — reviews `git diff`
20
- - `"last commit"` — reviews `git show HEAD`
21
- - `"PR #42"` — reviews `gh pr diff 42`
22
- - `"changes against main branch"` — reviews `git diff main...HEAD`
23
-
24
- ### `files` (optional)
25
-
26
- Array of specific file paths to focus the review on. If omitted, all changed files are reviewed.
27
-
28
- ### `instructions` (optional)
29
-
30
- Additional guidance for the reviewer. Examples:
31
- - `"Focus on error handling"`
32
- - `"Check for race conditions in the async code"`
33
- - `"Verify backward compatibility"`
34
-
35
- ## Output
36
-
37
- Returns structured review with:
38
- - `overall_correctness`: "correct" or "incorrect"
39
- - `explanation`: 1-3 sentence verdict summary
40
- - `confidence`: 0.0-1.0
41
- - `findings`: list of issues found, each with title, body, priority (P0-P3), file path, and line range
@@ -1,51 +0,0 @@
1
- # SSH
2
-
3
- Run commands on remote hosts.
4
-
5
- <instruction>
6
- Build commands from reference below
7
- </instruction>
8
-
9
- <commands>
10
- **linux/bash, linux/zsh, macos/bash, macos/zsh** — Unix-like:
11
- - Files: `ls`, `cat`, `head`, `tail`, `grep`, `find`
12
- - System: `ps`, `top`, `df`, `uname` (all), `free` (Linux only)
13
- - Navigation: `cd`, `pwd`
14
- **windows/bash, windows/sh** — Windows Unix layer (WSL, Cygwin, Git Bash):
15
- - Files/System/Navigation: same as Unix-like above, minus `free`
16
- **windows/powershell** — PowerShell:
17
- - Files: `Get-ChildItem`, `Get-Content`, `Select-String`
18
- - System: `Get-Process`, `Get-ComputerInfo`
19
- - Navigation: `Set-Location`, `Get-Location`
20
- **windows/cmd** — Command Prompt:
21
- - Files: `dir`, `type`, `findstr`, `where`
22
- - System: `tasklist`, `systeminfo`
23
- - Navigation: `cd`, `echo %CD%`
24
- </commands>
25
-
26
- <output>
27
- stdout/stderr combined, truncated at 50KB; exit code captured.
28
- If truncated, full output stored under $ARTIFACTS as `artifact://<id>`.
29
- </output>
30
-
31
- <critical>
32
- Verify shell type from "Available hosts", use matching commands.
33
- </critical>
34
-
35
- <example name="linux">
36
- Task: List /home/user files on "server1"
37
- Host: server1 (10.0.0.1) | linux/bash
38
- Command: `ls -la /home/user`
39
- </example>
40
-
41
- <example name="windows-cmd">
42
- Task: Show running processes on "winbox"
43
- Host: winbox (192.168.1.5) | windows/cmd
44
- Command: `tasklist /v`
45
- </example>
46
-
47
- <example name="macos">
48
- Task: Get system info on "macbook"
49
- Host: macbook (10.0.0.20) | macos/zsh
50
- Command: `uname -a && sw_vers`
51
- </example>
@@ -1,28 +0,0 @@
1
- <task-summary>
2
- <header>{{successCount}}/{{totalCount}} succeeded{{#if hasCancelledNote}} ({{cancelledCount}} cancelled){{/if}} [{{duration}}]</header>
3
-
4
- {{#each summaries}}
5
- <agent id="{{id}}" agent="{{agent}}">
6
- <status>{{status}}</status>
7
- {{#if meta}}<meta lines="{{meta.lineCount}}" size="{{meta.charSize}}" />{{/if}}
8
- {{#if truncated}}
9
- <preview full-path="agent://{{id}}">
10
- {{preview}}
11
- </preview>
12
- {{else}}
13
- <result>
14
- {{preview}}
15
- </result>
16
- {{/if}}
17
- </agent>
18
- {{#unless @last}}
19
- ---
20
- {{/unless}}
21
- {{/each}}
22
-
23
- {{#if patchApplySummary}}
24
- <patch-summary>
25
- {{patchApplySummary}}
26
- </patch-summary>
27
- {{/if}}
28
- </task-summary>
@@ -1,146 +0,0 @@
1
- # Task
2
-
3
- Launch a fire-and-forget subagent to execute well-scoped work. Think of it as a productive junior engineer who cannot ask follow-ups once started.
4
- - **Use for**: Multi-file implementations, cross-layer refactors, mass migrations, boilerplate generation
5
- - **Don't use for**: Exploratory work, architectural decisions, single-file edits, reading a file
6
-
7
- ## Subagent capabilities
8
-
9
- Subagents receive the **full system prompt**, including AGENTS.md, context files, and skills. They have no access to your conversation history — they don't know decisions you made, approaches you chose, or requirements stated only in conversation. Subagents CAN grep the parent conversation file for supplementary details.
10
- ---
11
-
12
- ## Parameters
13
-
14
- ### `context` (optional — strongly recommended)
15
-
16
- Shared background prepended verbatim to every task `assignment`. Use only for session-specific information subagents lack.
17
-
18
- <critical>
19
- Do NOT include project rules, coding conventions, or style guidelines — subagents already have AGENTS.md. Restating any rule from AGENTS.md in `context` is a bug.
20
- </critical>
21
- **Before writing each line of context, ask:** "Would this sentence be true for ANY task in this repo, or only for THIS specific batch?" If it applies to any task → the subagent already has it → delete the line.
22
-
23
- Use template; omit non-applicable sections:
24
-
25
- ````
26
- ## Goal
27
- One sentence: what the batch accomplishes together.
28
-
29
- ## Non-goals
30
- Explicitly exclude tempting scope — what tasks must not touch.
31
-
32
- ## Constraints
33
- - Task-specific MUST / MUST NOT rules not already in AGENTS.md
34
- - Decisions made during this session that affect implementation
35
-
36
- ## Reference Files
37
- - `path/to/file.ext` — pattern demo
38
-
39
- ## API Contract (if tasks produce/consume shared interface)
40
- ```language
41
- // Exact type definitions, function signatures
42
- ```
43
-
44
- ## Acceptance (global)
45
- - Definition of "done" for batch
46
- - For parallel tasks, build/test/lint verification happens AFTER all tasks complete — not inside tasks. Single tasks may self-verify.
47
- ````
48
- **Belongs in `context`**: session decisions, reference paths, shared type definitions, API contracts, global acceptance — anything 2+ tasks need that isn't in AGENTS.md.
49
- **Does NOT belong**: project rules from AGENTS.md, per-task file lists, one-off requirements (go in `assignment`).
50
-
51
- ### `tasks` (required)
52
-
53
- Array of tasks that execute in parallel.
54
-
55
- |Field|Required|Purpose|
56
- |---|---|---|
57
- |`id`|yes|CamelCase identifier, max 32 chars|
58
- |`description`|yes|Short one-liner for UI display only — not seen by subagent|
59
- |`assignment`|yes|Complete per-task instructions (see below)|
60
- |`skills`||Skill names to preload. Use only when it changes correctness.|
61
- ---
62
-
63
- ## Writing an assignment
64
-
65
- <critical>
66
- `assignment` must contain enough info for the subagent to act **without asking a clarifying question**. One-liners guarantee failure.
67
-
68
- Use this structure:
69
-
70
- ```
71
- ## Target
72
- - Files: exact path(s)
73
- - Symbols/entrypoints: specific functions, types, exports
74
- - Non-goals: what task must NOT touch
75
-
76
- ## Change
77
- - Step-by-step: add/remove/rename/restructure
78
- - Patterns/APIs to use; reference files if applicable
79
-
80
- ## Edge Cases / Don't Break
81
- - Tricky case 1: ...
82
- - Existing behavior that must survive: ...
83
-
84
- ## Acceptance (task-local)
85
- - Expected behavior or observable result
86
- - For parallel tasks: DO NOT include project-wide build/test/lint commands
87
- ```
88
-
89
- `context` carries shared background. `assignment` carries only delta: file-specific instructions, local edge cases, per-task acceptance.
90
-
91
- ### Delegate intent, not keystrokes
92
-
93
- Your role is tech lead: set direction, define boundaries, call out pitfalls — then get out of the way. Don't dictate line-by-line edits.
94
- **Be specific about:** constraints, naming, API contracts, "don't break" items, acceptance criteria.
95
- **Delegate:** code reading, approach selection, exact edit locations, implementation details.
96
- </critical>
97
-
98
- ### Anti-patterns
99
- **Vague assignments** — subagent guesses wrong or stalls:
100
- - "Refactor this to be cleaner."
101
- - "Fix the bug in streaming."
102
- - "Update all constructors in `src/**/*.ts`."
103
- **Test/lint in parallel tasks** — edit wars:
104
- Parallel agents share working tree. If two agents run `bun check` concurrently, they see each other's half-finished edits, "fix" phantom errors, loop. **Never tell parallel tasks to run project-wide build/test/lint.** Each task edits, stops. Caller verifies after all complete. Single-task launches may include verification.
105
- **If you can't specify scope yet**, create a **Discovery task** first: enumerate files, find callsites, list candidates. Then fan out with explicit paths.
106
- ---
107
-
108
- ## Task scope
109
-
110
- Each task: small, well-defined — **at most 3-5 files**.
111
- **Signs task is too broad:** file paths use globs, assignment says "update all" / "migrate everything", scope covers entire package.
112
- **Fix:** enumerate files first (grep/glob), then fan out one task per file or small cluster.
113
- ---
114
-
115
- ## Parallelization
116
- **Test:** Can task B produce correct output without seeing task A's result?
117
- - **Yes** → parallelize
118
- - **No** → sequential (A completes, then launch B with A's output in context)
119
-
120
- ### Must be sequential
121
-
122
- |First|Then|Reason|
123
- |---|---|---|
124
- |Define types/interfaces|Implement consumers|Consumers need contract|
125
- |Create API exports|Write bindings/callers|Callers need signatures|
126
- |Core module|Dependent modules|Dependents import from core|
127
-
128
- ### Safe to parallelize
129
- - Independent modules, no cross-imports
130
- - Tests for already-implemented code
131
- - Isolated file-scoped refactors
132
-
133
- ### Multi-phase pattern
134
- **Phase 1 — Sequential**: define shared contracts (types, interfaces, schemas).
135
- **Phase 2 — Parallel**: fan out tasks consuming same known interface.
136
- **Phase 3 — Integration** (do yourself): wire modules, fix mismatches, verify builds.
137
- ---
138
-
139
- ## Pre-flight checklist
140
-
141
- Before calling tool, verify:
142
- - [ ] `context` includes only session-specific info not already in AGENTS.md
143
- - [ ] Each assignment has Target, Change, Edge Cases, Acceptance sections
144
- - [ ] Assignments reference exact file paths (no globs)
145
- - [ ] Scope small, file paths explicit
146
- - [ ] Parallel tasks don't run project-wide build/test/lint — you do after all tasks complete (single tasks may self-verify)
@@ -1,65 +0,0 @@
1
- # Todo Write
2
-
3
- Create/manage structured task list for coding session.
4
-
5
- <conditions>
6
- Use proactively:
7
- 1. Complex multi-step tasks requiring 3+ steps/actions
8
- 2. User requests todo list
9
- 3. User provides multiple tasks (numbered/comma-separated)
10
- 4. After new instructions—capture requirements as todos
11
- 5. Starting task—mark in_progress BEFORE beginning
12
- 6. After completing—mark completed, add follow-up tasks found
13
- </conditions>
14
-
15
- <protocol>
16
- 1. **Task States**:
17
- - pending: not started
18
- - in_progress: working
19
- - completed: finished
20
- 2. **Task Management**:
21
- - Update status each turn
22
- - Mark completed after each code execution finishes — do not defer to a later turn
23
- - Multiple tasks may be in_progress simultaneously when working in parallel
24
- - Remove tasks no longer relevant
25
- - Mark tasks completed as they finish, regardless of list order
26
- 3. **Task Completion Requirements**:
27
- - ONLY mark completed when FULLY accomplished
28
- - On errors/blockers/inability to finish, keep in_progress
29
- - When blocked, create task describing what needs resolving
30
- 4. **Task Breakdown**:
31
- - Create specific, actionable items
32
- - Keep each todo scoped to one logical unit of work; split unrelated work into separate items
33
- - Break complex tasks into smaller steps
34
- - Use clear, descriptive names
35
- </protocol>
36
-
37
- <output>
38
- Returns confirmation todo list updated.
39
- </output>
40
-
41
- <caution>
42
- When in doubt, use this.
43
- </caution>
44
-
45
- <example name="use-dark-mode">
46
- User: Add dark mode toggle to settings. Run tests when done.
47
- → Creates todos: toggle component, state management, theme styles, update components, run tests
48
- </example>
49
-
50
- <example name="use-features">
51
- User: Implement user registration, product catalog, shopping cart, checkout.
52
- → Creates todos per feature with subtasks
53
- </example>
54
-
55
- <example name="skip">
56
- User: Run npm install / Add a comment to this function / What does git status do?
57
- → Do directly. Single-step/informational tasks need no tracking.
58
- </example>
59
-
60
- <avoid>
61
- Skip when:
62
- 1. Single straightforward task
63
- 2. Task completable in <3 trivial steps
64
- 3. Task purely conversational/informational
65
- </avoid>
@@ -1,7 +0,0 @@
1
- Undo the last edit made to a file, restoring it to the state before that edit.
2
-
3
- Only the most recent change per file can be undone. A second undo on the same file without an intervening edit will fail.
4
-
5
- Use when:
6
- - An edit introduced errors and re-editing would be more complex than starting over
7
- - A write overwrote content that needs to be restored
@@ -1,19 +0,0 @@
1
- # Web Search
2
-
3
- Search the web for up-to-date information beyond Claude's knowledge cutoff.
4
-
5
- <instruction>
6
- - Prefer primary sources (papers, official docs) and corroborate key claims with multiple sources
7
- - Include links for cited sources in the final response
8
- </instruction>
9
-
10
- <output>
11
- Returns search results formatted as blocks with:
12
- - Result summaries and relevant excerpts
13
- - Links as markdown hyperlinks for citation
14
- - Provider-dependent structure based on selected backend
15
- </output>
16
-
17
- <caution>
18
- Searches are performed automatically within a single API call—no pagination or follow-up requests needed.
19
- </caution>
@@ -1,18 +0,0 @@
1
- # Write
2
-
3
- Creates or overwrites file at specified path.
4
-
5
- <conditions>
6
- - Creating new files explicitly required by task
7
- - Replacing entire file contents when editing would be more complex
8
- </conditions>
9
-
10
- <output>
11
- Confirmation of file creation/write with path. When LSP available, content may be auto-formatted before writing and diagnostics returned. Returns error if write fails (permissions, invalid path, disk full).
12
- </output>
13
-
14
- <critical>
15
- - Prefer Edit tool for modifying existing files (more precise, preserves formatting)
16
- - Create documentation files (*.md, README) only when explicitly requested
17
- - No emojis unless requested
18
- </critical>
package/src/task/batch.ts DELETED
@@ -1,102 +0,0 @@
1
- /**
2
- * Lightweight batch runner for subagent tasks.
3
- *
4
- * Encapsulates: agent resolution, artifacts dir lifecycle, concurrency execution, temp cleanup.
5
- * Used by TaskTool and analyze-file (commit agent).
6
- */
7
- import * as fs from "node:fs/promises";
8
- import * as os from "node:os";
9
- import * as path from "node:path";
10
- import { Snowflake } from "@nghyane/arcane-utils";
11
- import type { ModelRegistry } from "../config/model-registry";
12
- import { isDefaultModelAlias } from "../config/model-resolver";
13
- import type { Settings } from "../config/settings";
14
- import type { AuthStorage } from "../session/auth-storage";
15
- import { getBundledAgent } from "./agents";
16
- import { type ExecutorOptions, runAgent } from "./executor";
17
- import { mapWithConcurrencyLimit, type ParallelResult } from "./parallel";
18
- import type { AgentDefinition, SingleResult } from "./types";
19
-
20
- export interface BatchTask {
21
- id: string;
22
- description: string;
23
- task: string;
24
- }
25
-
26
- export interface BatchOptions {
27
- cwd: string;
28
- agentName: string;
29
- tasks: BatchTask[];
30
- sessionFile: string | null;
31
- signal?: AbortSignal;
32
- authStorage?: AuthStorage;
33
- modelRegistry?: ModelRegistry;
34
- settings: Settings;
35
- executorOverrides?: Partial<ExecutorOptions>;
36
- }
37
-
38
- export interface BatchResult {
39
- results: ParallelResult<SingleResult>["results"];
40
- aborted: boolean;
41
- agent: AgentDefinition;
42
- artifactsDir: string;
43
- persistArtifacts: boolean;
44
- }
45
-
46
- export async function runTaskBatch(options: BatchOptions): Promise<BatchResult> {
47
- const agent = getBundledAgent(options.agentName);
48
- if (!agent) {
49
- throw new Error(`Agent "${options.agentName}" not found.`);
50
- }
51
-
52
- const modelOverride = isDefaultModelAlias(agent.model) ? undefined : agent.model;
53
-
54
- const sessionFile = options.sessionFile;
55
- const artifactsDir = sessionFile ? sessionFile.slice(0, -path.extname(sessionFile).length) : null;
56
- const tempArtifactsDir = artifactsDir ? null : path.join(os.tmpdir(), `arc-batch-${Snowflake.next()}`);
57
- const effectiveArtifactsDir = artifactsDir || tempArtifactsDir!;
58
- const persistArtifacts = !!artifactsDir;
59
-
60
- await fs.mkdir(effectiveArtifactsDir, { recursive: true });
61
-
62
- const maxConcurrency = options.settings.get("task.maxConcurrency");
63
-
64
- try {
65
- const result = await mapWithConcurrencyLimit(
66
- options.tasks,
67
- maxConcurrency,
68
- async (task, index) =>
69
- runAgent({
70
- cwd: options.cwd,
71
- agent,
72
- task: task.task,
73
- description: task.description,
74
- index,
75
- id: task.id,
76
- modelOverride,
77
- sessionFile,
78
- persistArtifacts,
79
- artifactsDir: effectiveArtifactsDir,
80
- enableLsp: false,
81
- signal: options.signal,
82
- authStorage: options.authStorage,
83
- modelRegistry: options.modelRegistry,
84
- settings: options.settings,
85
- ...options.executorOverrides,
86
- }),
87
- options.signal,
88
- );
89
-
90
- return {
91
- results: result.results,
92
- aborted: result.aborted,
93
- agent,
94
- artifactsDir: effectiveArtifactsDir,
95
- persistArtifacts,
96
- };
97
- } finally {
98
- if (tempArtifactsDir) {
99
- await fs.rm(tempArtifactsDir, { recursive: true, force: true });
100
- }
101
- }
102
- }
@@ -1,126 +0,0 @@
1
- /**
2
- * Agent discovery from filesystem.
3
- *
4
- * Discovers agent definitions from:
5
- * - ~/.arcane/agent/agents/*.md (user-level, primary)
6
- * - ~/legacy)
7
- * - ~/.claude/agents/*.md (user-level, legacy)
8
- * - .arcane/agents/*.md (project-level, primary)
9
- * - legacy)
10
- * - .claude/agents/*.md (project-level, legacy)
11
- *
12
- * Agent files use markdown with YAML frontmatter.
13
- */
14
- import * as fs from "node:fs/promises";
15
- import * as os from "node:os";
16
- import * as path from "node:path";
17
- import { logger } from "@nghyane/arcane-utils";
18
- import { findAllNearestProjectConfigDirs, getConfigDirs } from "../config";
19
- import { listClaudePluginRoots } from "../discovery/helpers";
20
- import { loadBundledAgents, parseAgent } from "./agents";
21
- import type { AgentDefinition, AgentSource } from "./types";
22
-
23
- /** Result of agent discovery */
24
- export interface DiscoveryResult {
25
- agents: AgentDefinition[];
26
- projectAgentsDir: string | null;
27
- }
28
-
29
- /**
30
- * Load agents from a directory.
31
- */
32
- async function loadAgentsFromDir(dir: string, source: AgentSource): Promise<AgentDefinition[]> {
33
- const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
34
- const files = entries
35
- .filter(entry => (entry.isFile() || entry.isSymbolicLink()) && entry.name.endsWith(".md"))
36
- .sort((a, b) => a.name.localeCompare(b.name))
37
- .map(file => {
38
- const filePath = path.join(dir, file.name);
39
- return fs
40
- .readFile(filePath, "utf-8")
41
- .then(content => parseAgent(filePath, content, source, "warn"))
42
- .catch(error => {
43
- logger.warn("Failed to read agent file", { filePath, error });
44
- return null;
45
- });
46
- });
47
-
48
- return (await Promise.all(files)).filter(Boolean) as AgentDefinition[];
49
- }
50
-
51
- /**
52
- * Discover agents from filesystem and merge with bundled agents.
53
- *
54
- * Precedence (highest wins): .arcane > .pi > .claude (project before user), then bundled
55
- *
56
- * @param cwd - Current working directory for project agent discovery
57
- */
58
- export async function discoverAgents(cwd: string, home: string = os.homedir()): Promise<DiscoveryResult> {
59
- const resolvedCwd = path.resolve(cwd);
60
- const agentSources = Array.from(new Set(getConfigDirs("", { project: false }).map(entry => entry.source)));
61
-
62
- // Get user directories (priority order: .arcane, .pi, .claude, ...)
63
- const userDirs = getConfigDirs("agents", { project: false })
64
- .filter(entry => agentSources.includes(entry.source))
65
- .map(entry => ({
66
- ...entry,
67
- path: path.resolve(entry.path),
68
- }));
69
-
70
- // Get project directories by walking up from cwd (priority order)
71
- const projectDirs = findAllNearestProjectConfigDirs("agents", resolvedCwd)
72
- .filter(entry => agentSources.includes(entry.source))
73
- .map(entry => ({
74
- ...entry,
75
- path: path.resolve(entry.path),
76
- }));
77
-
78
- const orderedSources = agentSources.filter(
79
- source => userDirs.some(entry => entry.source === source) || projectDirs.some(entry => entry.source === source),
80
- );
81
-
82
- const orderedDirs: Array<{ dir: string; source: AgentSource }> = [];
83
- for (const source of orderedSources) {
84
- const project = projectDirs.find(entry => entry.source === source);
85
- if (project) orderedDirs.push({ dir: project.path, source: "project" });
86
- const user = userDirs.find(entry => entry.source === source);
87
- if (user) orderedDirs.push({ dir: user.path, source: "user" });
88
- }
89
-
90
- // Load agents from Claude Code marketplace plugins
91
- const { roots: pluginRoots } = await listClaudePluginRoots(home);
92
- const sortedPluginRoots = [...pluginRoots].sort((a, b) => {
93
- if (a.scope === b.scope) return 0;
94
- return a.scope === "project" ? -1 : 1;
95
- });
96
- for (const plugin of sortedPluginRoots) {
97
- const agentsDir = path.join(plugin.path, "agents");
98
- orderedDirs.push({ dir: agentsDir, source: plugin.scope === "project" ? "project" : "user" });
99
- }
100
-
101
- const seen = new Set<string>();
102
- const loadedAgents = (await Promise.all(orderedDirs.map(({ dir, source }) => loadAgentsFromDir(dir, source))))
103
- .flat()
104
- .filter(agent => {
105
- if (seen.has(agent.name)) return false;
106
- seen.add(agent.name);
107
- return true;
108
- });
109
-
110
- const bundledAgents = loadBundledAgents().filter(agent => {
111
- if (seen.has(agent.name)) return false;
112
- seen.add(agent.name);
113
- return true;
114
- });
115
-
116
- const projectAgentsDir = projectDirs.length > 0 ? projectDirs[0].path : null;
117
-
118
- return { agents: [...loadedAgents, ...bundledAgents], projectAgentsDir };
119
- }
120
-
121
- /**
122
- * Get an agent by name from discovered agents.
123
- */
124
- export function getAgent(agents: AgentDefinition[], name: string): AgentDefinition | undefined {
125
- return agents.find(a => a.name === name);
126
- }