@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.
- package/CHANGELOG.md +28 -0
- package/package.json +21 -70
- package/scripts/format-prompts.ts +1 -3
- package/src/cli/args.ts +2 -7
- package/src/cli/config-cli.ts +1 -1
- package/src/cli/plugin-cli.ts +1 -1
- package/src/cli/setup-cli.ts +1 -1
- package/src/cli/update-cli.ts +1 -1
- package/src/cli/web-search-cli.ts +1 -1
- package/src/cli.ts +0 -1
- package/src/commands/config.ts +1 -1
- package/src/commands/grep.ts +1 -1
- package/src/commands/jupyter.ts +1 -1
- package/src/commands/plugin.ts +1 -1
- package/src/commands/setup.ts +1 -1
- package/src/commands/shell.ts +1 -1
- package/src/commands/ssh.ts +1 -1
- package/src/commands/stats.ts +1 -1
- package/src/commands/update.ts +1 -1
- package/src/config/model-registry.ts +3 -4
- package/src/config/model-resolver.ts +36 -9
- package/src/config/prompt-templates.ts +1 -9
- package/src/config/settings-schema.ts +32 -88
- package/src/config/settings.ts +3 -4
- package/src/debug/index.ts +1 -1
- package/src/debug/log-formatting.ts +1 -1
- package/src/debug/log-viewer.ts +2 -2
- package/src/discovery/helpers.ts +13 -3
- package/src/exa/index.ts +1 -35
- package/src/exa/render.ts +30 -190
- package/src/export/html/index.ts +1 -1
- package/src/extensibility/custom-tools/loader.ts +1 -1
- package/src/extensibility/custom-tools/types.ts +5 -1
- package/src/extensibility/custom-tools/wrapper.ts +1 -1
- package/src/extensibility/extensions/runner.ts +1 -1
- package/src/extensibility/extensions/types.ts +1 -1
- package/src/extensibility/extensions/wrapper.ts +7 -15
- package/src/extensibility/hooks/runner.ts +1 -1
- package/src/extensibility/hooks/types.ts +1 -1
- package/src/extensibility/plugins/doctor.ts +1 -1
- package/src/index.ts +13 -13
- package/src/lsp/index.ts +77 -24
- package/src/lsp/render.ts +34 -583
- package/src/lsp/types.ts +3 -3
- package/src/lsp/utils.ts +1 -1
- package/src/main.ts +1 -1
- package/src/mcp/tool-bridge.ts +1 -24
- package/src/modes/components/assistant-message.ts +7 -7
- package/src/modes/components/bash-execution.ts +50 -112
- package/src/modes/components/bordered-loader.ts +1 -1
- package/src/modes/components/branch-summary-message.ts +16 -10
- package/src/modes/components/compaction-summary-message.ts +20 -12
- package/src/modes/components/context-group.ts +106 -0
- package/src/modes/components/custom-message.ts +4 -5
- package/src/modes/components/diff.ts +2 -2
- package/src/modes/components/dynamic-border.ts +1 -1
- package/src/modes/components/extensions/extension-dashboard.ts +1 -1
- package/src/modes/components/extensions/extension-list.ts +1 -1
- package/src/modes/components/extensions/inspector-panel.ts +1 -1
- package/src/modes/components/footer.ts +2 -2
- package/src/modes/components/history-search.ts +1 -1
- package/src/modes/components/hook-editor.ts +1 -1
- package/src/modes/components/hook-input.ts +1 -1
- package/src/modes/components/hook-message.ts +4 -5
- package/src/modes/components/hook-selector.ts +1 -1
- package/src/modes/components/index.ts +0 -2
- package/src/modes/components/keybinding-hints.ts +1 -1
- package/src/modes/components/login-dialog.ts +1 -1
- package/src/modes/components/mcp-add-wizard.ts +1 -1
- package/src/modes/components/model-selector.ts +1 -1
- package/src/modes/components/oauth-selector.ts +1 -1
- package/src/modes/components/plugin-settings.ts +1 -1
- package/src/modes/components/python-execution.ts +51 -91
- package/src/modes/components/queue-mode-selector.ts +1 -1
- package/src/modes/components/session-selector.ts +1 -1
- package/src/modes/components/settings-defs.ts +5 -10
- package/src/modes/components/settings-selector.ts +1 -1
- package/src/modes/components/show-images-selector.ts +1 -1
- package/src/modes/components/skill-message.ts +4 -4
- package/src/modes/components/status-line/segments.ts +2 -2
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line-segment-editor.ts +1 -1
- package/src/modes/components/status-line.ts +1 -1
- package/src/modes/components/theme-selector.ts +1 -1
- package/src/modes/components/thinking-selector.ts +1 -1
- package/src/modes/components/todo-display.ts +2 -4
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +118 -440
- package/src/modes/components/tool-image-display.ts +107 -0
- package/src/modes/components/tree-selector.ts +2 -2
- package/src/modes/components/ttsr-notification.ts +4 -17
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +9 -10
- package/src/modes/components/welcome.ts +1 -1
- package/src/modes/controllers/command-controller.ts +1 -1
- package/src/modes/controllers/event-controller.ts +58 -187
- package/src/modes/controllers/extension-ui-controller.ts +1 -1
- package/src/modes/controllers/input-controller.ts +3 -1
- package/src/modes/controllers/mcp-command-controller.ts +1 -1
- package/src/modes/controllers/selector-controller.ts +3 -26
- package/src/modes/controllers/ssh-command-controller.ts +1 -1
- package/src/modes/interactive-mode.ts +3 -7
- package/src/modes/print-mode.ts +5 -5
- package/src/modes/rpc/rpc-mode.ts +1 -1
- package/src/modes/types.ts +1 -2
- package/src/modes/utils/ui-helpers.ts +34 -32
- package/src/patch/edit-tool.ts +742 -0
- package/src/patch/index.ts +32 -898
- package/src/patch/schemas.ts +208 -0
- package/src/patch/shared.ts +83 -151
- package/src/prompts/agents/explore.md +22 -37
- package/src/prompts/agents/init.md +1 -1
- package/src/prompts/agents/librarian.md +29 -20
- package/src/prompts/agents/oracle.md +9 -2
- package/src/prompts/agents/reviewer.md +14 -48
- package/src/prompts/agents/task.md +16 -8
- package/src/prompts/compaction/branch-summary.md +4 -1
- package/src/prompts/compaction/compaction-summary.md +4 -1
- package/src/prompts/system/subagent-system-prompt.md +1 -1
- package/src/prompts/system/system-prompt.md +162 -178
- package/src/prompts/system/verification-reminder.md +6 -0
- package/src/sdk.ts +0 -9
- package/src/session/agent-session.ts +244 -1459
- package/src/session/model-controller.ts +406 -0
- package/src/session/retry-utils.ts +71 -0
- package/src/session/session-manager.ts +22 -186
- package/src/session/session-types.ts +312 -0
- package/src/session/stats.ts +387 -0
- package/src/session/streaming-edit.ts +258 -0
- package/src/session/ttsr.ts +213 -0
- package/src/slash-commands/builtin-registry.ts +0 -8
- package/src/stt/recorder.ts +2 -2
- package/src/system-prompt.ts +1 -14
- package/src/task/agents.ts +7 -33
- package/src/task/executor.ts +50 -438
- package/src/task/index.ts +104 -71
- package/src/task/progress-tracker.ts +390 -0
- package/src/task/render.ts +371 -187
- package/src/task/subprocess-tool-registry.ts +1 -1
- package/src/task/types.ts +14 -47
- package/src/tools/ask.ts +31 -42
- package/src/tools/bash-interactive.ts +2 -2
- package/src/tools/bash-interceptor.ts +2 -2
- package/src/tools/bash-normalize.ts +1 -1
- package/src/tools/bash-skill-urls.ts +2 -2
- package/src/tools/bash.ts +87 -136
- package/src/tools/browser.ts +54 -84
- package/src/tools/create-tools.ts +186 -0
- package/src/tools/default-renderer.ts +104 -0
- package/src/tools/explore.ts +11 -10
- package/src/tools/fetch.ts +24 -114
- package/src/tools/find.ts +48 -132
- package/src/tools/gemini-image.ts +5 -15
- package/src/tools/github.ts +450 -0
- package/src/tools/grep.ts +43 -179
- package/src/tools/index.ts +35 -198
- package/src/tools/json-tree.ts +3 -3
- package/src/tools/librarian.ts +18 -18
- package/src/tools/list-limit.ts +2 -2
- package/src/tools/notebook.ts +35 -87
- package/src/tools/oracle.ts +25 -25
- package/src/tools/output-meta.ts +89 -4
- package/src/tools/output-utils.ts +2 -2
- package/src/tools/python.ts +86 -637
- package/src/tools/read.ts +36 -119
- package/src/tools/reviewer-tool.ts +19 -21
- package/src/tools/search-code.ts +128 -0
- package/src/tools/ssh.ts +67 -126
- package/src/tools/subagent-tool.ts +197 -123
- package/src/tools/todo-write.ts +15 -31
- package/src/tools/tool-errors.ts +0 -30
- package/src/tools/undo-edit.ts +30 -67
- package/src/tools/write.ts +78 -127
- package/src/tui/code-cell.ts +4 -4
- package/src/tui/file-list.ts +2 -2
- package/src/tui/output-block.ts +1 -1
- package/src/tui/status-line.ts +1 -1
- package/src/tui/tree-list.ts +2 -2
- package/src/tui/types.ts +1 -1
- package/src/tui/utils.ts +1 -1
- package/src/{tools → ui}/render-utils.ts +87 -126
- package/src/utils/external-editor.ts +4 -4
- package/src/utils/file-mentions.ts +1 -1
- package/src/utils/index.ts +30 -0
- package/src/utils/tools-manager.ts +9 -19
- package/src/web/github-client.ts +290 -0
- package/src/web/scrapers/github.ts +11 -62
- package/src/web/search/auth.ts +1 -3
- package/src/web/search/index.ts +82 -46
- package/src/web/search/provider.ts +11 -16
- package/src/web/search/providers/grep.ts +160 -0
- package/src/web/search/render.ts +48 -235
- package/src/web/search/types.ts +1 -1
- package/src/commands/commit.ts +0 -36
- package/src/commit/agentic/agent.ts +0 -311
- package/src/commit/agentic/fallback.ts +0 -96
- package/src/commit/agentic/index.ts +0 -359
- package/src/commit/agentic/prompts/analyze-file.md +0 -22
- package/src/commit/agentic/prompts/session-user.md +0 -25
- package/src/commit/agentic/prompts/split-confirm.md +0 -1
- package/src/commit/agentic/prompts/system.md +0 -38
- package/src/commit/agentic/state.ts +0 -69
- package/src/commit/agentic/tools/analyze-file.ts +0 -118
- package/src/commit/agentic/tools/git-file-diff.ts +0 -194
- package/src/commit/agentic/tools/git-hunk.ts +0 -50
- package/src/commit/agentic/tools/git-overview.ts +0 -84
- package/src/commit/agentic/tools/index.ts +0 -56
- package/src/commit/agentic/tools/propose-changelog.ts +0 -128
- package/src/commit/agentic/tools/propose-commit.ts +0 -154
- package/src/commit/agentic/tools/recent-commits.ts +0 -81
- package/src/commit/agentic/tools/split-commit.ts +0 -280
- package/src/commit/agentic/topo-sort.ts +0 -44
- package/src/commit/agentic/trivial.ts +0 -51
- package/src/commit/agentic/validation.ts +0 -200
- package/src/commit/analysis/conventional.ts +0 -165
- package/src/commit/analysis/index.ts +0 -4
- package/src/commit/analysis/scope.ts +0 -242
- package/src/commit/analysis/summary.ts +0 -112
- package/src/commit/analysis/validation.ts +0 -66
- package/src/commit/changelog/detect.ts +0 -37
- package/src/commit/changelog/generate.ts +0 -110
- package/src/commit/changelog/index.ts +0 -234
- package/src/commit/changelog/parse.ts +0 -44
- package/src/commit/cli.ts +0 -93
- package/src/commit/git/diff.ts +0 -148
- package/src/commit/git/errors.ts +0 -9
- package/src/commit/git/index.ts +0 -211
- package/src/commit/git/operations.ts +0 -54
- package/src/commit/index.ts +0 -5
- package/src/commit/map-reduce/index.ts +0 -64
- package/src/commit/map-reduce/map-phase.ts +0 -178
- package/src/commit/map-reduce/reduce-phase.ts +0 -145
- package/src/commit/map-reduce/utils.ts +0 -9
- package/src/commit/message.ts +0 -11
- package/src/commit/model-selection.ts +0 -69
- package/src/commit/pipeline.ts +0 -243
- package/src/commit/prompts/analysis-system.md +0 -148
- package/src/commit/prompts/analysis-user.md +0 -38
- package/src/commit/prompts/changelog-system.md +0 -50
- package/src/commit/prompts/changelog-user.md +0 -18
- package/src/commit/prompts/file-observer-system.md +0 -24
- package/src/commit/prompts/file-observer-user.md +0 -8
- package/src/commit/prompts/reduce-system.md +0 -50
- package/src/commit/prompts/reduce-user.md +0 -17
- package/src/commit/prompts/summary-retry.md +0 -3
- package/src/commit/prompts/summary-system.md +0 -38
- package/src/commit/prompts/summary-user.md +0 -13
- package/src/commit/prompts/types-description.md +0 -2
- package/src/commit/types.ts +0 -109
- package/src/commit/utils/exclusions.ts +0 -42
- package/src/mcp/render.ts +0 -123
- package/src/modes/components/agent-dashboard.ts +0 -1130
- package/src/modes/components/codemode-group.ts +0 -369
- package/src/modes/components/read-tool-group.ts +0 -119
- package/src/modes/components/visual-truncate.ts +0 -63
- package/src/prompts/system/subagent-user-prompt.md +0 -8
- package/src/prompts/tools/ask.md +0 -44
- package/src/prompts/tools/bash.md +0 -24
- package/src/prompts/tools/browser.md +0 -33
- package/src/prompts/tools/calculator.md +0 -12
- package/src/prompts/tools/explore.md +0 -29
- package/src/prompts/tools/fetch.md +0 -16
- package/src/prompts/tools/find.md +0 -18
- package/src/prompts/tools/gemini-image.md +0 -23
- package/src/prompts/tools/grep.md +0 -28
- package/src/prompts/tools/hashline.md +0 -232
- package/src/prompts/tools/librarian.md +0 -24
- package/src/prompts/tools/lsp.md +0 -28
- package/src/prompts/tools/oracle.md +0 -26
- package/src/prompts/tools/patch.md +0 -74
- package/src/prompts/tools/python.md +0 -66
- package/src/prompts/tools/read.md +0 -36
- package/src/prompts/tools/replace.md +0 -38
- package/src/prompts/tools/reviewer.md +0 -41
- package/src/prompts/tools/ssh.md +0 -51
- package/src/prompts/tools/task-summary.md +0 -28
- package/src/prompts/tools/task.md +0 -146
- package/src/prompts/tools/todo-write.md +0 -65
- package/src/prompts/tools/undo-edit.md +0 -7
- package/src/prompts/tools/web-search.md +0 -19
- package/src/prompts/tools/write.md +0 -18
- package/src/task/batch.ts +0 -102
- package/src/task/discovery.ts +0 -126
- package/src/task/parallel.ts +0 -84
- package/src/task/template.ts +0 -32
- package/src/tools/calculator.ts +0 -537
- package/src/tools/jtd-to-typescript.ts +0 -198
- package/src/tools/renderers.ts +0 -60
- package/src/tools/tool-result.ts +0 -86
- /package/src/{modes/theme → theme}/dark.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-catppuccin.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-dracula.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-gruvbox.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-solarized.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-tokyo-night.json +0 -0
- /package/src/{modes/theme → theme}/defaults/index.ts +0 -0
- /package/src/{modes/theme → theme}/defaults/light-catppuccin.json +0 -0
- /package/src/{modes/theme → theme}/defaults/light-github.json +0 -0
- /package/src/{modes/theme → theme}/defaults/light-solarized.json +0 -0
- /package/src/{modes/theme → theme}/light.json +0 -0
- /package/src/{modes/theme → theme}/mermaid-cache.ts +0 -0
- /package/src/{modes/theme → theme}/theme-schema.json +0 -0
- /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
|
package/src/prompts/tools/ssh.md
DELETED
|
@@ -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
|
-
}
|
package/src/task/discovery.ts
DELETED
|
@@ -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
|
-
}
|