claude_swarm 1.0.1 → 1.0.4
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.
- checksums.yaml +4 -4
- data/.claude/commands/release.md +1 -1
- data/.claude/hooks/lint-code-files.rb +65 -0
- data/.rubocop.yml +22 -2
- data/CHANGELOG.md +14 -1
- data/CLAUDE.md +1 -1
- data/CONTRIBUTING.md +69 -0
- data/README.md +27 -2
- data/Rakefile +71 -3
- data/analyze_coverage.rb +94 -0
- data/docs/v2/CHANGELOG.swarm_cli.md +43 -0
- data/docs/v2/CHANGELOG.swarm_memory.md +379 -0
- data/docs/v2/CHANGELOG.swarm_sdk.md +362 -0
- data/docs/v2/README.md +308 -0
- data/docs/v2/guides/claude-code-agents.md +262 -0
- data/docs/v2/guides/complete-tutorial.md +3088 -0
- data/docs/v2/guides/getting-started.md +1456 -0
- data/docs/v2/guides/memory-adapters.md +998 -0
- data/docs/v2/guides/plugins.md +816 -0
- data/docs/v2/guides/quick-start-cli.md +1745 -0
- data/docs/v2/guides/rails-integration.md +1902 -0
- data/docs/v2/guides/swarm-memory.md +599 -0
- data/docs/v2/reference/cli.md +729 -0
- data/docs/v2/reference/ruby-dsl.md +2154 -0
- data/docs/v2/reference/yaml.md +1835 -0
- data/docs-team-swarm.yml +2222 -0
- data/examples/learning-assistant/assistant.md +7 -0
- data/examples/learning-assistant/example-memories/concept-example.md +90 -0
- data/examples/learning-assistant/example-memories/experience-example.md +66 -0
- data/examples/learning-assistant/example-memories/fact-example.md +76 -0
- data/examples/learning-assistant/example-memories/memory-index.md +78 -0
- data/examples/learning-assistant/example-memories/skill-example.md +168 -0
- data/examples/learning-assistant/learning_assistant.rb +34 -0
- data/examples/learning-assistant/learning_assistant.yml +20 -0
- data/examples/v2/dsl/01_basic.rb +44 -0
- data/examples/v2/dsl/02_core_parameters.rb +59 -0
- data/examples/v2/dsl/03_capabilities.rb +71 -0
- data/examples/v2/dsl/04_llm_parameters.rb +56 -0
- data/examples/v2/dsl/05_advanced_flags.rb +73 -0
- data/examples/v2/dsl/06_permissions.rb +80 -0
- data/examples/v2/dsl/07_mcp_server.rb +62 -0
- data/examples/v2/dsl/08_swarm_hooks.rb +53 -0
- data/examples/v2/dsl/09_agent_hooks.rb +67 -0
- data/examples/v2/dsl/10_all_agents_hooks.rb +67 -0
- data/examples/v2/dsl/11_delegation.rb +60 -0
- data/examples/v2/dsl/12_complete_integration.rb +137 -0
- data/examples/v2/file_tools_swarm.yml +102 -0
- data/examples/v2/hooks/01_basic_hooks.rb +133 -0
- data/examples/v2/hooks/02_usage_tracking.rb +201 -0
- data/examples/v2/hooks/03_production_monitoring.rb +429 -0
- data/examples/v2/hooks/agent_stop_exit_0.yml +21 -0
- data/examples/v2/hooks/agent_stop_exit_1.yml +21 -0
- data/examples/v2/hooks/agent_stop_exit_2.yml +26 -0
- data/examples/v2/hooks/multiple_hooks_all_pass.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_first_fails.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_second_fails.yml +37 -0
- data/examples/v2/hooks/multiple_hooks_warnings.yml +37 -0
- data/examples/v2/hooks/post_tool_use_exit_0.yml +24 -0
- data/examples/v2/hooks/post_tool_use_exit_1.yml +24 -0
- data/examples/v2/hooks/post_tool_use_exit_2.yml +24 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_0.yml +26 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_1.yml +26 -0
- data/examples/v2/hooks/post_tool_use_multi_matcher_exit_2.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_exit_0.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_exit_1.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_exit_2.yml +24 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_0.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_1.yml +26 -0
- data/examples/v2/hooks/pre_tool_use_multi_matcher_exit_2.yml +27 -0
- data/examples/v2/hooks/swarm_summary.sh +44 -0
- data/examples/v2/hooks/user_prompt_exit_0.yml +21 -0
- data/examples/v2/hooks/user_prompt_exit_1.yml +21 -0
- data/examples/v2/hooks/user_prompt_exit_2.yml +21 -0
- data/examples/v2/hooks/validate_bash.rb +59 -0
- data/examples/v2/multi_directory_permissions.yml +221 -0
- data/examples/v2/node_context_demo.rb +127 -0
- data/examples/v2/node_workflow.rb +173 -0
- data/examples/v2/path_resolution_demo.rb +216 -0
- data/examples/v2/simple-swarm-v2.rb +90 -0
- data/examples/v2/simple-swarm-v2.yml +62 -0
- data/examples/v2/swarm.yml +71 -0
- data/examples/v2/swarm_with_hooks.yml +61 -0
- data/examples/v2/swarm_with_hooks_simple.yml +25 -0
- data/examples/v2/think_tool_demo.rb +62 -0
- data/exe/swarm +6 -0
- data/lib/claude_swarm/claude_mcp_server.rb +0 -6
- data/lib/claude_swarm/cli.rb +10 -3
- data/lib/claude_swarm/commands/ps.rb +19 -20
- data/lib/claude_swarm/commands/show.rb +1 -1
- data/lib/claude_swarm/configuration.rb +10 -12
- data/lib/claude_swarm/mcp_generator.rb +10 -1
- data/lib/claude_swarm/orchestrator.rb +73 -49
- data/lib/claude_swarm/system_utils.rb +37 -11
- data/lib/claude_swarm/version.rb +1 -1
- data/lib/claude_swarm/worktree_manager.rb +1 -0
- data/lib/claude_swarm/yaml_loader.rb +22 -0
- data/lib/claude_swarm.rb +7 -2
- data/lib/swarm_cli/cli.rb +201 -0
- data/lib/swarm_cli/command_registry.rb +61 -0
- data/lib/swarm_cli/commands/mcp_serve.rb +130 -0
- data/lib/swarm_cli/commands/mcp_tools.rb +148 -0
- data/lib/swarm_cli/commands/migrate.rb +55 -0
- data/lib/swarm_cli/commands/run.rb +173 -0
- data/lib/swarm_cli/config_loader.rb +97 -0
- data/lib/swarm_cli/formatters/human_formatter.rb +711 -0
- data/lib/swarm_cli/formatters/json_formatter.rb +51 -0
- data/lib/swarm_cli/interactive_repl.rb +918 -0
- data/lib/swarm_cli/mcp_serve_options.rb +44 -0
- data/lib/swarm_cli/mcp_tools_options.rb +59 -0
- data/lib/swarm_cli/migrate_options.rb +54 -0
- data/lib/swarm_cli/migrator.rb +132 -0
- data/lib/swarm_cli/options.rb +151 -0
- data/lib/swarm_cli/ui/components/agent_badge.rb +33 -0
- data/lib/swarm_cli/ui/components/content_block.rb +120 -0
- data/lib/swarm_cli/ui/components/divider.rb +57 -0
- data/lib/swarm_cli/ui/components/panel.rb +62 -0
- data/lib/swarm_cli/ui/components/usage_stats.rb +70 -0
- data/lib/swarm_cli/ui/formatters/cost.rb +49 -0
- data/lib/swarm_cli/ui/formatters/number.rb +58 -0
- data/lib/swarm_cli/ui/formatters/text.rb +77 -0
- data/lib/swarm_cli/ui/formatters/time.rb +73 -0
- data/lib/swarm_cli/ui/icons.rb +59 -0
- data/lib/swarm_cli/ui/renderers/event_renderer.rb +188 -0
- data/lib/swarm_cli/ui/state/agent_color_cache.rb +45 -0
- data/lib/swarm_cli/ui/state/depth_tracker.rb +40 -0
- data/lib/swarm_cli/ui/state/spinner_manager.rb +170 -0
- data/lib/swarm_cli/ui/state/usage_tracker.rb +62 -0
- data/lib/swarm_cli/version.rb +5 -0
- data/lib/swarm_cli.rb +44 -0
- data/lib/swarm_memory/adapters/base.rb +141 -0
- data/lib/swarm_memory/adapters/filesystem_adapter.rb +845 -0
- data/lib/swarm_memory/chat_extension.rb +34 -0
- data/lib/swarm_memory/cli/commands.rb +306 -0
- data/lib/swarm_memory/core/entry.rb +37 -0
- data/lib/swarm_memory/core/frontmatter_parser.rb +108 -0
- data/lib/swarm_memory/core/metadata_extractor.rb +68 -0
- data/lib/swarm_memory/core/path_normalizer.rb +75 -0
- data/lib/swarm_memory/core/semantic_index.rb +244 -0
- data/lib/swarm_memory/core/storage.rb +288 -0
- data/lib/swarm_memory/core/storage_read_tracker.rb +63 -0
- data/lib/swarm_memory/dsl/builder_extension.rb +40 -0
- data/lib/swarm_memory/dsl/memory_config.rb +113 -0
- data/lib/swarm_memory/embeddings/embedder.rb +36 -0
- data/lib/swarm_memory/embeddings/informers_embedder.rb +152 -0
- data/lib/swarm_memory/errors.rb +21 -0
- data/lib/swarm_memory/integration/cli_registration.rb +30 -0
- data/lib/swarm_memory/integration/configuration.rb +43 -0
- data/lib/swarm_memory/integration/registration.rb +31 -0
- data/lib/swarm_memory/integration/sdk_plugin.rb +531 -0
- data/lib/swarm_memory/optimization/analyzer.rb +244 -0
- data/lib/swarm_memory/optimization/defragmenter.rb +863 -0
- data/lib/swarm_memory/prompts/memory.md.erb +109 -0
- data/lib/swarm_memory/prompts/memory_assistant.md.erb +181 -0
- data/lib/swarm_memory/prompts/memory_researcher.md.erb +281 -0
- data/lib/swarm_memory/prompts/memory_retrieval.md.erb +78 -0
- data/lib/swarm_memory/search/semantic_search.rb +112 -0
- data/lib/swarm_memory/search/text_search.rb +42 -0
- data/lib/swarm_memory/search/text_similarity.rb +80 -0
- data/lib/swarm_memory/skills/meta/deep-learning.md +101 -0
- data/lib/swarm_memory/skills/meta/deep-learning.yml +14 -0
- data/lib/swarm_memory/tools/load_skill.rb +313 -0
- data/lib/swarm_memory/tools/memory_defrag.rb +382 -0
- data/lib/swarm_memory/tools/memory_delete.rb +99 -0
- data/lib/swarm_memory/tools/memory_edit.rb +185 -0
- data/lib/swarm_memory/tools/memory_glob.rb +160 -0
- data/lib/swarm_memory/tools/memory_grep.rb +247 -0
- data/lib/swarm_memory/tools/memory_multi_edit.rb +281 -0
- data/lib/swarm_memory/tools/memory_read.rb +123 -0
- data/lib/swarm_memory/tools/memory_write.rb +231 -0
- data/lib/swarm_memory/utils.rb +50 -0
- data/lib/swarm_memory/version.rb +5 -0
- data/lib/swarm_memory.rb +166 -0
- data/lib/swarm_sdk/agent/RETRY_LOGIC.md +127 -0
- data/lib/swarm_sdk/agent/builder.rb +461 -0
- data/lib/swarm_sdk/agent/chat/context_tracker.rb +314 -0
- data/lib/swarm_sdk/agent/chat/hook_integration.rb +372 -0
- data/lib/swarm_sdk/agent/chat/logging_helpers.rb +116 -0
- data/lib/swarm_sdk/agent/chat/system_reminder_injector.rb +152 -0
- data/lib/swarm_sdk/agent/chat.rb +1159 -0
- data/lib/swarm_sdk/agent/context.rb +112 -0
- data/lib/swarm_sdk/agent/context_manager.rb +309 -0
- data/lib/swarm_sdk/agent/definition.rb +556 -0
- data/lib/swarm_sdk/claude_code_agent_adapter.rb +205 -0
- data/lib/swarm_sdk/configuration.rb +296 -0
- data/lib/swarm_sdk/context_compactor/metrics.rb +147 -0
- data/lib/swarm_sdk/context_compactor/token_counter.rb +106 -0
- data/lib/swarm_sdk/context_compactor.rb +340 -0
- data/lib/swarm_sdk/hooks/adapter.rb +359 -0
- data/lib/swarm_sdk/hooks/context.rb +197 -0
- data/lib/swarm_sdk/hooks/definition.rb +80 -0
- data/lib/swarm_sdk/hooks/error.rb +29 -0
- data/lib/swarm_sdk/hooks/executor.rb +146 -0
- data/lib/swarm_sdk/hooks/registry.rb +147 -0
- data/lib/swarm_sdk/hooks/result.rb +150 -0
- data/lib/swarm_sdk/hooks/shell_executor.rb +254 -0
- data/lib/swarm_sdk/hooks/tool_call.rb +35 -0
- data/lib/swarm_sdk/hooks/tool_result.rb +62 -0
- data/lib/swarm_sdk/log_collector.rb +51 -0
- data/lib/swarm_sdk/log_stream.rb +69 -0
- data/lib/swarm_sdk/markdown_parser.rb +75 -0
- data/lib/swarm_sdk/model_aliases.json +5 -0
- data/lib/swarm_sdk/models.json +1 -0
- data/lib/swarm_sdk/models.rb +120 -0
- data/lib/swarm_sdk/node/agent_config.rb +49 -0
- data/lib/swarm_sdk/node/builder.rb +439 -0
- data/lib/swarm_sdk/node/transformer_executor.rb +248 -0
- data/lib/swarm_sdk/node_context.rb +170 -0
- data/lib/swarm_sdk/node_orchestrator.rb +384 -0
- data/lib/swarm_sdk/permissions/config.rb +239 -0
- data/lib/swarm_sdk/permissions/error_formatter.rb +121 -0
- data/lib/swarm_sdk/permissions/path_matcher.rb +35 -0
- data/lib/swarm_sdk/permissions/validator.rb +173 -0
- data/lib/swarm_sdk/permissions_builder.rb +122 -0
- data/lib/swarm_sdk/plugin.rb +147 -0
- data/lib/swarm_sdk/plugin_registry.rb +101 -0
- data/lib/swarm_sdk/prompts/base_system_prompt.md.erb +243 -0
- data/lib/swarm_sdk/providers/openai_with_responses.rb +582 -0
- data/lib/swarm_sdk/result.rb +97 -0
- data/lib/swarm_sdk/swarm/agent_initializer.rb +334 -0
- data/lib/swarm_sdk/swarm/all_agents_builder.rb +140 -0
- data/lib/swarm_sdk/swarm/builder.rb +586 -0
- data/lib/swarm_sdk/swarm/mcp_configurator.rb +151 -0
- data/lib/swarm_sdk/swarm/tool_configurator.rb +419 -0
- data/lib/swarm_sdk/swarm.rb +982 -0
- data/lib/swarm_sdk/tools/bash.rb +274 -0
- data/lib/swarm_sdk/tools/clock.rb +44 -0
- data/lib/swarm_sdk/tools/delegate.rb +164 -0
- data/lib/swarm_sdk/tools/document_converters/base_converter.rb +83 -0
- data/lib/swarm_sdk/tools/document_converters/docx_converter.rb +99 -0
- data/lib/swarm_sdk/tools/document_converters/html_converter.rb +101 -0
- data/lib/swarm_sdk/tools/document_converters/pdf_converter.rb +78 -0
- data/lib/swarm_sdk/tools/document_converters/xlsx_converter.rb +194 -0
- data/lib/swarm_sdk/tools/edit.rb +150 -0
- data/lib/swarm_sdk/tools/glob.rb +158 -0
- data/lib/swarm_sdk/tools/grep.rb +228 -0
- data/lib/swarm_sdk/tools/image_extractors/docx_image_extractor.rb +43 -0
- data/lib/swarm_sdk/tools/image_extractors/pdf_image_extractor.rb +163 -0
- data/lib/swarm_sdk/tools/image_formats/tiff_builder.rb +65 -0
- data/lib/swarm_sdk/tools/multi_edit.rb +232 -0
- data/lib/swarm_sdk/tools/path_resolver.rb +43 -0
- data/lib/swarm_sdk/tools/read.rb +251 -0
- data/lib/swarm_sdk/tools/registry.rb +93 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_list.rb +96 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_read.rb +76 -0
- data/lib/swarm_sdk/tools/scratchpad/scratchpad_write.rb +91 -0
- data/lib/swarm_sdk/tools/stores/read_tracker.rb +61 -0
- data/lib/swarm_sdk/tools/stores/scratchpad_storage.rb +224 -0
- data/lib/swarm_sdk/tools/stores/storage.rb +148 -0
- data/lib/swarm_sdk/tools/stores/todo_manager.rb +65 -0
- data/lib/swarm_sdk/tools/think.rb +95 -0
- data/lib/swarm_sdk/tools/todo_write.rb +216 -0
- data/lib/swarm_sdk/tools/web_fetch.rb +261 -0
- data/lib/swarm_sdk/tools/write.rb +117 -0
- data/lib/swarm_sdk/utils.rb +50 -0
- data/lib/swarm_sdk/version.rb +5 -0
- data/lib/swarm_sdk.rb +157 -0
- data/llm.v2.txt +13407 -0
- data/rubocop/cop/security/no_reflection_methods.rb +47 -0
- data/rubocop/cop/security/no_ruby_llm_logger.rb +32 -0
- data/swarm_cli.gemspec +57 -0
- data/swarm_memory.gemspec +28 -0
- data/swarm_sdk.gemspec +41 -0
- data/team.yml +1 -1
- data/team_full.yml +1875 -0
- data/{team_v2.yml → team_sdk.yml} +121 -52
- metadata +249 -6
- data/EXAMPLES.md +0 -164
|
@@ -0,0 +1,1835 @@
|
|
|
1
|
+
# YAML Configuration Reference
|
|
2
|
+
|
|
3
|
+
Complete YAML configuration reference for SwarmSDK v2.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Document Structure
|
|
8
|
+
|
|
9
|
+
SwarmSDK v2 configurations follow this structure:
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
version: 2
|
|
13
|
+
swarm:
|
|
14
|
+
name: "Swarm Name"
|
|
15
|
+
lead: agent_name
|
|
16
|
+
agents:
|
|
17
|
+
agent_name:
|
|
18
|
+
# Agent configuration
|
|
19
|
+
all_agents:
|
|
20
|
+
# Shared agent configuration
|
|
21
|
+
hooks:
|
|
22
|
+
# Swarm-level hooks
|
|
23
|
+
nodes:
|
|
24
|
+
# Node configurations (optional)
|
|
25
|
+
start_node: node_name # Required if nodes defined
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Top-Level Fields
|
|
31
|
+
|
|
32
|
+
### version
|
|
33
|
+
|
|
34
|
+
**Type:** Integer (required)
|
|
35
|
+
**Value:** `2`
|
|
36
|
+
**Description:** Configuration version number. Must be `2` for SwarmSDK v2.
|
|
37
|
+
|
|
38
|
+
```yaml
|
|
39
|
+
version: 2
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
### swarm
|
|
45
|
+
|
|
46
|
+
**Type:** Object (required)
|
|
47
|
+
**Description:** Root configuration object containing all swarm settings.
|
|
48
|
+
|
|
49
|
+
```yaml
|
|
50
|
+
swarm:
|
|
51
|
+
name: "Development Team"
|
|
52
|
+
lead: backend
|
|
53
|
+
agents:
|
|
54
|
+
# ...
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Swarm Configuration
|
|
60
|
+
|
|
61
|
+
Fields under the `swarm` key.
|
|
62
|
+
|
|
63
|
+
### name
|
|
64
|
+
|
|
65
|
+
**Type:** String (required)
|
|
66
|
+
**Description:** Human-readable swarm name.
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
swarm:
|
|
70
|
+
name: "Development Team"
|
|
71
|
+
name: "Code Review Swarm"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### lead
|
|
77
|
+
|
|
78
|
+
**Type:** String (required)
|
|
79
|
+
**Description:** Name of the lead agent (entry point for execution).
|
|
80
|
+
|
|
81
|
+
```yaml
|
|
82
|
+
swarm:
|
|
83
|
+
lead: backend
|
|
84
|
+
lead: coordinator
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### use_scratchpad
|
|
90
|
+
|
|
91
|
+
**Type:** Boolean (optional)
|
|
92
|
+
**Default:** `true`
|
|
93
|
+
**Description:** Enable or disable shared scratchpad tools for all agents in the swarm.
|
|
94
|
+
|
|
95
|
+
When enabled, all agents get scratchpad tools (ScratchpadWrite, ScratchpadRead, ScratchpadList). Scratchpad is volatile (in-memory only) and shared across all agents.
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
swarm:
|
|
99
|
+
use_scratchpad: true # default
|
|
100
|
+
use_scratchpad: false # disable scratchpad
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
### agents
|
|
106
|
+
|
|
107
|
+
**Type:** Object (required)
|
|
108
|
+
**Description:** Map of agent names to agent configurations.
|
|
109
|
+
**Format:** `{ agent_name: agent_config }`
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
swarm:
|
|
113
|
+
agents:
|
|
114
|
+
backend:
|
|
115
|
+
description: "Backend developer"
|
|
116
|
+
model: gpt-5
|
|
117
|
+
tools: [Read, Write, Bash]
|
|
118
|
+
|
|
119
|
+
frontend:
|
|
120
|
+
description: "Frontend developer"
|
|
121
|
+
model: claude-sonnet-4
|
|
122
|
+
tools: [Read, Write]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### all_agents
|
|
128
|
+
|
|
129
|
+
**Type:** Object (optional)
|
|
130
|
+
**Description:** Configuration applied to all agents. Agent-specific values override these defaults.
|
|
131
|
+
**Default:** `{}`
|
|
132
|
+
|
|
133
|
+
```yaml
|
|
134
|
+
swarm:
|
|
135
|
+
all_agents:
|
|
136
|
+
provider: openai
|
|
137
|
+
timeout: 180
|
|
138
|
+
tools: [Read, Write]
|
|
139
|
+
coding_agent: false
|
|
140
|
+
|
|
141
|
+
permissions:
|
|
142
|
+
Write:
|
|
143
|
+
denied_paths: ["secrets/**"]
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### hooks
|
|
149
|
+
|
|
150
|
+
**Type:** Object (optional)
|
|
151
|
+
**Description:** Swarm-level hooks (swarm_start and swarm_stop only).
|
|
152
|
+
**Default:** `{}`
|
|
153
|
+
|
|
154
|
+
```yaml
|
|
155
|
+
swarm:
|
|
156
|
+
hooks:
|
|
157
|
+
swarm_start:
|
|
158
|
+
- type: command
|
|
159
|
+
command: "echo 'Starting swarm' >> log.txt"
|
|
160
|
+
|
|
161
|
+
swarm_stop:
|
|
162
|
+
- type: command
|
|
163
|
+
command: "scripts/cleanup.sh"
|
|
164
|
+
timeout: 30
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
### nodes
|
|
170
|
+
|
|
171
|
+
> **⚠️ IMPORTANT: Node workflows are ONLY supported in Ruby DSL, NOT in YAML configuration.**
|
|
172
|
+
>
|
|
173
|
+
> The documentation below describes the node structure for reference, but you cannot use nodes in YAML files.
|
|
174
|
+
> To use node-based workflows, you must use the Ruby DSL. See [Ruby DSL Reference](./ruby-dsl.md#node-builder-dsl) for details.
|
|
175
|
+
|
|
176
|
+
**Type:** Object (optional, **Ruby DSL only**)
|
|
177
|
+
**Description:** Map of node names to node configurations. Enables multi-stage workflows.
|
|
178
|
+
**Format:** `{ node_name: node_config }`
|
|
179
|
+
|
|
180
|
+
**Note:** This section is for reference only. YAML configuration does not support nodes.
|
|
181
|
+
|
|
182
|
+
```ruby
|
|
183
|
+
# Ruby DSL only - NOT valid in YAML
|
|
184
|
+
SwarmSDK.build do
|
|
185
|
+
nodes:
|
|
186
|
+
planning:
|
|
187
|
+
agents:
|
|
188
|
+
- agent: architect
|
|
189
|
+
|
|
190
|
+
implementation:
|
|
191
|
+
agents:
|
|
192
|
+
- agent: backend
|
|
193
|
+
delegates_to: [tester]
|
|
194
|
+
- agent: tester
|
|
195
|
+
dependencies: [planning]
|
|
196
|
+
end
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
### start_node
|
|
202
|
+
|
|
203
|
+
> **⚠️ Note: Node workflows are Ruby DSL only, not supported in YAML.**
|
|
204
|
+
|
|
205
|
+
**Type:** String (required if nodes defined, **Ruby DSL only**)
|
|
206
|
+
**Description:** Name of the starting node for workflow execution.
|
|
207
|
+
|
|
208
|
+
**Note:** This field only applies to Ruby DSL. Not supported in YAML configuration.
|
|
209
|
+
|
|
210
|
+
```ruby
|
|
211
|
+
# Ruby DSL only - NOT valid in YAML
|
|
212
|
+
SwarmSDK.build do
|
|
213
|
+
start_node :planning
|
|
214
|
+
nodes:
|
|
215
|
+
planning:
|
|
216
|
+
# ...
|
|
217
|
+
end
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Agent Configuration
|
|
223
|
+
|
|
224
|
+
Fields under each agent in `swarm.agents`.
|
|
225
|
+
|
|
226
|
+
### description
|
|
227
|
+
|
|
228
|
+
**Type:** String (required)
|
|
229
|
+
**Description:** Human-readable description of the agent's role.
|
|
230
|
+
|
|
231
|
+
```yaml
|
|
232
|
+
agents:
|
|
233
|
+
backend:
|
|
234
|
+
description: "Backend API developer specializing in Ruby on Rails"
|
|
235
|
+
frontend:
|
|
236
|
+
description: "Frontend developer with React and TypeScript expertise"
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
### model
|
|
242
|
+
|
|
243
|
+
**Type:** String (optional)
|
|
244
|
+
**Default:** `"gpt-5"`
|
|
245
|
+
**Description:** LLM model identifier.
|
|
246
|
+
|
|
247
|
+
**Common models:**
|
|
248
|
+
- OpenAI: `gpt-5`, `gpt-4o`, `o4`, `o4-mini`
|
|
249
|
+
- Anthropic: `claude-sonnet-4`, `claude-opus-4`
|
|
250
|
+
- Google: `gemini-2.5-flash`, `gemini-2.0-pro`
|
|
251
|
+
- DeepSeek: `deepseek-chat`, `deepseek-reasoner`
|
|
252
|
+
|
|
253
|
+
```yaml
|
|
254
|
+
agents:
|
|
255
|
+
backend:
|
|
256
|
+
model: gpt-5
|
|
257
|
+
frontend:
|
|
258
|
+
model: claude-sonnet-4
|
|
259
|
+
analyzer:
|
|
260
|
+
model: deepseek-reasoner
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
### provider
|
|
266
|
+
|
|
267
|
+
**Type:** String (optional)
|
|
268
|
+
**Default:** `"openai"`
|
|
269
|
+
**Description:** LLM provider name.
|
|
270
|
+
|
|
271
|
+
**Supported providers:**
|
|
272
|
+
- `openai`: OpenAI
|
|
273
|
+
- `anthropic`: Anthropic Claude
|
|
274
|
+
- `google`: Google AI
|
|
275
|
+
- `deepseek`: DeepSeek
|
|
276
|
+
- `openrouter`: OpenRouter
|
|
277
|
+
- `mistral`: Mistral AI
|
|
278
|
+
- `perplexity`: Perplexity
|
|
279
|
+
|
|
280
|
+
```yaml
|
|
281
|
+
agents:
|
|
282
|
+
backend:
|
|
283
|
+
provider: openai
|
|
284
|
+
frontend:
|
|
285
|
+
provider: anthropic
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
### base_url
|
|
291
|
+
|
|
292
|
+
**Type:** String (optional)
|
|
293
|
+
**Default:** Provider's default endpoint
|
|
294
|
+
**Description:** Custom API endpoint URL (for proxies or compatible APIs).
|
|
295
|
+
**Auto-sets:** `assume_model_exists: true`
|
|
296
|
+
|
|
297
|
+
```yaml
|
|
298
|
+
agents:
|
|
299
|
+
backend:
|
|
300
|
+
base_url: "http://localhost:8080/v1"
|
|
301
|
+
frontend:
|
|
302
|
+
base_url: "https://proxy.example.com/v1"
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### api_version
|
|
308
|
+
|
|
309
|
+
**Type:** String (optional)
|
|
310
|
+
**Default:** `"v1/chat/completions"`
|
|
311
|
+
**Description:** API version for OpenAI-compatible providers.
|
|
312
|
+
|
|
313
|
+
**Valid values:**
|
|
314
|
+
- `v1/chat/completions`: Standard chat completions (default)
|
|
315
|
+
- `v1/responses`: Extended responses format
|
|
316
|
+
|
|
317
|
+
**Compatible providers:** `openai`, `deepseek`, `perplexity`, `mistral`, `openrouter`
|
|
318
|
+
|
|
319
|
+
```yaml
|
|
320
|
+
agents:
|
|
321
|
+
backend:
|
|
322
|
+
provider: openai
|
|
323
|
+
api_version: "v1/chat/completions"
|
|
324
|
+
|
|
325
|
+
reasoner:
|
|
326
|
+
provider: deepseek
|
|
327
|
+
api_version: "v1/responses"
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
### directory
|
|
333
|
+
|
|
334
|
+
**Type:** String (optional)
|
|
335
|
+
**Default:** `"."`
|
|
336
|
+
**Description:** Agent's working directory. All file operations are relative to this path.
|
|
337
|
+
|
|
338
|
+
```yaml
|
|
339
|
+
agents:
|
|
340
|
+
backend:
|
|
341
|
+
directory: "."
|
|
342
|
+
frontend:
|
|
343
|
+
directory: "frontend"
|
|
344
|
+
docs:
|
|
345
|
+
directory: "/absolute/path/to/docs"
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
### system_prompt
|
|
351
|
+
|
|
352
|
+
**Type:** String (optional)
|
|
353
|
+
**Default:** `nil`
|
|
354
|
+
**Description:** Custom system prompt text.
|
|
355
|
+
|
|
356
|
+
**Combination with `coding_agent`:**
|
|
357
|
+
- `coding_agent: false` (default): Uses only custom prompt + TODO/Scratchpad info
|
|
358
|
+
- `coding_agent: true`: Prepends base coding prompt, then custom prompt
|
|
359
|
+
|
|
360
|
+
```yaml
|
|
361
|
+
agents:
|
|
362
|
+
backend:
|
|
363
|
+
system_prompt: "You are a backend API developer. Focus on clean, testable code."
|
|
364
|
+
|
|
365
|
+
reviewer:
|
|
366
|
+
system_prompt: |
|
|
367
|
+
You are a code reviewer. For each file:
|
|
368
|
+
1. Check for bugs and edge cases
|
|
369
|
+
2. Suggest improvements
|
|
370
|
+
3. Verify test coverage
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
### coding_agent
|
|
376
|
+
|
|
377
|
+
**Type:** Boolean (optional)
|
|
378
|
+
**Default:** `false`
|
|
379
|
+
**Description:** Whether to include the base coding system prompt.
|
|
380
|
+
|
|
381
|
+
**Behavior:**
|
|
382
|
+
- `false`: Uses only custom `system_prompt` + TODO/Scratchpad sections
|
|
383
|
+
- `true`: Prepends comprehensive base coding prompt, then custom prompt
|
|
384
|
+
|
|
385
|
+
```yaml
|
|
386
|
+
agents:
|
|
387
|
+
developer:
|
|
388
|
+
coding_agent: true # Include base coding prompt
|
|
389
|
+
analyst:
|
|
390
|
+
coding_agent: false # Custom prompt only (default)
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
395
|
+
### tools
|
|
396
|
+
|
|
397
|
+
**Type:** Array (optional)
|
|
398
|
+
**Default:** Default tools if `default tools enabled`
|
|
399
|
+
**Description:** List of tools available to the agent.
|
|
400
|
+
|
|
401
|
+
**Default tools (when `default tools enabled`):**
|
|
402
|
+
- `Read`, `Glob`, `Grep`, `TodoWrite`, `Think`, `WebFetch`
|
|
403
|
+
|
|
404
|
+
**Scratchpad tools** (added if `use_scratchpad: true` at swarm level, default):
|
|
405
|
+
- `ScratchpadWrite`, `ScratchpadRead`, `ScratchpadList`
|
|
406
|
+
|
|
407
|
+
**Memory tools** (added if agent has `memory` configured):
|
|
408
|
+
- `MemoryWrite`, `MemoryRead`, `MemoryEdit`, `MemoryMultiEdit`, `MemoryGlob`, `MemoryGrep`, `MemoryDelete`
|
|
409
|
+
|
|
410
|
+
**Additional tools:**
|
|
411
|
+
- `Write`, `Edit`, `MultiEdit`, `Bash`
|
|
412
|
+
|
|
413
|
+
**Format:** Simple array or array of objects with permissions
|
|
414
|
+
|
|
415
|
+
```yaml
|
|
416
|
+
# Simple format
|
|
417
|
+
agents:
|
|
418
|
+
backend:
|
|
419
|
+
tools: [Read, Write, Edit, Bash]
|
|
420
|
+
|
|
421
|
+
# With inline permissions
|
|
422
|
+
agents:
|
|
423
|
+
backend:
|
|
424
|
+
tools:
|
|
425
|
+
- Read
|
|
426
|
+
- Write:
|
|
427
|
+
allowed_paths: ["backend/**/*"]
|
|
428
|
+
denied_paths: ["backend/secrets/**"]
|
|
429
|
+
- Bash:
|
|
430
|
+
allowed_commands: ["^git (status|diff|log)$"]
|
|
431
|
+
denied_commands: ["^rm -rf"]
|
|
432
|
+
|
|
433
|
+
# Without default tools
|
|
434
|
+
agents:
|
|
435
|
+
minimal:
|
|
436
|
+
tools: [Read, Write]
|
|
437
|
+
disable_default_tools: true
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
### delegates_to
|
|
443
|
+
|
|
444
|
+
**Type:** Array (optional)
|
|
445
|
+
**Default:** `[]`
|
|
446
|
+
**Description:** List of agent names this agent can delegate to.
|
|
447
|
+
|
|
448
|
+
**Behavior:** Creates a `delegate_to_{agent}` tool for each target
|
|
449
|
+
|
|
450
|
+
```yaml
|
|
451
|
+
agents:
|
|
452
|
+
backend:
|
|
453
|
+
delegates_to: [database, tester]
|
|
454
|
+
coordinator:
|
|
455
|
+
delegates_to: [frontend, backend, reviewer]
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
### memory
|
|
461
|
+
|
|
462
|
+
**Type:** Object (optional)
|
|
463
|
+
**Default:** `null` (memory disabled)
|
|
464
|
+
**Description:** Configure persistent memory storage for this agent.
|
|
465
|
+
|
|
466
|
+
When configured, the agent automatically gets all 7 memory tools (MemoryWrite, MemoryRead, MemoryEdit, MemoryMultiEdit, MemoryGlob, MemoryGrep, MemoryDelete) and a memory system prompt is appended.
|
|
467
|
+
|
|
468
|
+
Memory is per-agent (isolated) and persistent (survives across sessions).
|
|
469
|
+
|
|
470
|
+
**Fields:**
|
|
471
|
+
- `adapter` (String, optional): Storage adapter (default: `"filesystem"`)
|
|
472
|
+
- `directory` (String, required): Directory where `memory.json` will be stored
|
|
473
|
+
|
|
474
|
+
```yaml
|
|
475
|
+
agents:
|
|
476
|
+
learning_assistant:
|
|
477
|
+
description: "Assistant that learns"
|
|
478
|
+
model: gpt-4
|
|
479
|
+
memory:
|
|
480
|
+
adapter: filesystem # optional
|
|
481
|
+
directory: .swarm/assistant-memory # required
|
|
482
|
+
|
|
483
|
+
# Minimal (adapter defaults to filesystem)
|
|
484
|
+
another_agent:
|
|
485
|
+
memory:
|
|
486
|
+
directory: .swarm/another-agent
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
**Future adapters:** `sqlite`, `faiss` (not yet implemented)
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
### mcp_servers
|
|
494
|
+
|
|
495
|
+
**Type:** Array (optional)
|
|
496
|
+
**Default:** `[]`
|
|
497
|
+
**Description:** MCP server configurations for this agent.
|
|
498
|
+
|
|
499
|
+
**Transport types:** `stdio`, `sse`, `http`
|
|
500
|
+
|
|
501
|
+
```yaml
|
|
502
|
+
agents:
|
|
503
|
+
backend:
|
|
504
|
+
mcp_servers:
|
|
505
|
+
# stdio transport
|
|
506
|
+
- name: filesystem
|
|
507
|
+
type: stdio
|
|
508
|
+
command: npx
|
|
509
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"]
|
|
510
|
+
env:
|
|
511
|
+
VAR: value
|
|
512
|
+
|
|
513
|
+
# SSE transport
|
|
514
|
+
- name: web
|
|
515
|
+
type: sse
|
|
516
|
+
url: "https://example.com/mcp"
|
|
517
|
+
headers:
|
|
518
|
+
authorization: "Bearer token"
|
|
519
|
+
timeout: 60
|
|
520
|
+
|
|
521
|
+
# HTTP transport
|
|
522
|
+
- name: api
|
|
523
|
+
type: http
|
|
524
|
+
url: "https://api.example.com/mcp"
|
|
525
|
+
headers:
|
|
526
|
+
api-key: "key"
|
|
527
|
+
timeout: 120
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
### permissions
|
|
533
|
+
|
|
534
|
+
**Type:** Object (optional)
|
|
535
|
+
**Default:** `{}`
|
|
536
|
+
**Description:** Tool permission configuration. Uses glob patterns for paths, regex for commands.
|
|
537
|
+
|
|
538
|
+
**Format:** `{ ToolName: { allowed_paths, denied_paths, allowed_commands, denied_commands } }`
|
|
539
|
+
|
|
540
|
+
```yaml
|
|
541
|
+
agents:
|
|
542
|
+
backend:
|
|
543
|
+
permissions:
|
|
544
|
+
Write:
|
|
545
|
+
allowed_paths:
|
|
546
|
+
- "backend/**/*"
|
|
547
|
+
- "shared/**/*"
|
|
548
|
+
denied_paths:
|
|
549
|
+
- "backend/secrets/**"
|
|
550
|
+
- "shared/config/credentials.yml"
|
|
551
|
+
|
|
552
|
+
Read:
|
|
553
|
+
denied_paths:
|
|
554
|
+
- "*.key"
|
|
555
|
+
- ".env"
|
|
556
|
+
|
|
557
|
+
Bash:
|
|
558
|
+
allowed_commands:
|
|
559
|
+
- "^git (status|diff|log)$"
|
|
560
|
+
- "^bundle exec rspec$"
|
|
561
|
+
denied_commands:
|
|
562
|
+
- "^rm -rf"
|
|
563
|
+
- "^sudo"
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
### hooks
|
|
569
|
+
|
|
570
|
+
**Type:** Object (optional)
|
|
571
|
+
**Default:** `{}`
|
|
572
|
+
**Description:** Agent-specific hooks configuration.
|
|
573
|
+
|
|
574
|
+
**Event types:**
|
|
575
|
+
- `pre_tool_use`: Before tool execution
|
|
576
|
+
- `post_tool_use`: After tool execution
|
|
577
|
+
- `user_prompt`: Before sending user message
|
|
578
|
+
- `agent_stop`: When agent finishes
|
|
579
|
+
- `first_message`: First user message (once per swarm)
|
|
580
|
+
- `pre_delegation`: Before delegating to another agent
|
|
581
|
+
- `post_delegation`: After delegation completes
|
|
582
|
+
- `context_warning`: When context window threshold exceeded
|
|
583
|
+
|
|
584
|
+
```yaml
|
|
585
|
+
agents:
|
|
586
|
+
backend:
|
|
587
|
+
hooks:
|
|
588
|
+
pre_tool_use:
|
|
589
|
+
- matcher: "Write|Edit"
|
|
590
|
+
type: command
|
|
591
|
+
command: "scripts/validate.sh"
|
|
592
|
+
timeout: 10
|
|
593
|
+
|
|
594
|
+
post_tool_use:
|
|
595
|
+
- matcher: "Bash"
|
|
596
|
+
type: command
|
|
597
|
+
command: "logger 'Command executed'"
|
|
598
|
+
|
|
599
|
+
user_prompt:
|
|
600
|
+
- type: command
|
|
601
|
+
command: "scripts/log-request.sh"
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
### parameters
|
|
607
|
+
|
|
608
|
+
**Type:** Object (optional)
|
|
609
|
+
**Default:** `{}`
|
|
610
|
+
**Description:** LLM parameters (temperature, top_p, etc.).
|
|
611
|
+
|
|
612
|
+
**Common parameters:**
|
|
613
|
+
- `temperature` (Float): Randomness (0.0-2.0)
|
|
614
|
+
- `top_p` (Float): Nucleus sampling (0.0-1.0)
|
|
615
|
+
- `max_tokens` (Integer): Maximum output tokens
|
|
616
|
+
- `presence_penalty` (Float): Presence penalty (-2.0-2.0)
|
|
617
|
+
- `frequency_penalty` (Float): Frequency penalty (-2.0-2.0)
|
|
618
|
+
|
|
619
|
+
```yaml
|
|
620
|
+
agents:
|
|
621
|
+
creative:
|
|
622
|
+
parameters:
|
|
623
|
+
temperature: 0.9
|
|
624
|
+
top_p: 0.95
|
|
625
|
+
|
|
626
|
+
precise:
|
|
627
|
+
parameters:
|
|
628
|
+
temperature: 0.3
|
|
629
|
+
max_tokens: 2000
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
---
|
|
633
|
+
|
|
634
|
+
### headers
|
|
635
|
+
|
|
636
|
+
**Type:** Object (optional)
|
|
637
|
+
**Default:** `{}`
|
|
638
|
+
**Description:** Custom HTTP headers for API requests.
|
|
639
|
+
|
|
640
|
+
```yaml
|
|
641
|
+
agents:
|
|
642
|
+
backend:
|
|
643
|
+
headers:
|
|
644
|
+
X-API-Key: "key123"
|
|
645
|
+
X-Organization: "org123"
|
|
646
|
+
Authorization: "Bearer token"
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
---
|
|
650
|
+
|
|
651
|
+
### timeout
|
|
652
|
+
|
|
653
|
+
**Type:** Integer (optional)
|
|
654
|
+
**Default:** `300` (5 minutes)
|
|
655
|
+
**Description:** Request timeout in seconds.
|
|
656
|
+
|
|
657
|
+
```yaml
|
|
658
|
+
agents:
|
|
659
|
+
fast:
|
|
660
|
+
timeout: 60
|
|
661
|
+
|
|
662
|
+
reasoning:
|
|
663
|
+
timeout: 600 # 10 minutes for reasoning models
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
### context_window
|
|
669
|
+
|
|
670
|
+
**Type:** Integer (optional)
|
|
671
|
+
**Default:** Auto-detected from model registry
|
|
672
|
+
**Description:** Explicit context window size in tokens.
|
|
673
|
+
|
|
674
|
+
**Use case:** Override when using custom models or proxies
|
|
675
|
+
|
|
676
|
+
```yaml
|
|
677
|
+
agents:
|
|
678
|
+
custom:
|
|
679
|
+
model: custom-model
|
|
680
|
+
context_window: 128000 # Override auto-detection
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
---
|
|
684
|
+
|
|
685
|
+
### bypass_permissions
|
|
686
|
+
|
|
687
|
+
**Type:** Boolean (optional)
|
|
688
|
+
**Default:** `false`
|
|
689
|
+
**Description:** Disable permission checks for this agent.
|
|
690
|
+
|
|
691
|
+
**Warning:** Use with caution - allows unrestricted file/command access
|
|
692
|
+
|
|
693
|
+
```yaml
|
|
694
|
+
agents:
|
|
695
|
+
admin:
|
|
696
|
+
bypass_permissions: true # Disable all permission checks
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
---
|
|
700
|
+
|
|
701
|
+
### max_concurrent_tools
|
|
702
|
+
|
|
703
|
+
**Type:** Integer (optional)
|
|
704
|
+
**Default:** Swarm's `default_local_concurrency` (10)
|
|
705
|
+
**Description:** Maximum concurrent tool calls for this agent.
|
|
706
|
+
|
|
707
|
+
```yaml
|
|
708
|
+
agents:
|
|
709
|
+
parallel:
|
|
710
|
+
max_concurrent_tools: 20 # Allow more parallelism
|
|
711
|
+
|
|
712
|
+
sequential:
|
|
713
|
+
max_concurrent_tools: 1 # Force sequential execution
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
---
|
|
717
|
+
|
|
718
|
+
### disable_default_tools
|
|
719
|
+
|
|
720
|
+
**Type:** Boolean (optional)
|
|
721
|
+
**Default:** `true`
|
|
722
|
+
**Description:** Include default tools (Read, Grep, Glob, TodoWrite, Think, and scratchpad tools).
|
|
723
|
+
|
|
724
|
+
```yaml
|
|
725
|
+
agents:
|
|
726
|
+
minimal:
|
|
727
|
+
tools: [Bash]
|
|
728
|
+
disable_default_tools: true # No default tools
|
|
729
|
+
```
|
|
730
|
+
|
|
731
|
+
---
|
|
732
|
+
|
|
733
|
+
### assume_model_exists
|
|
734
|
+
|
|
735
|
+
**Type:** Boolean (optional)
|
|
736
|
+
**Default:** `false` (validate), `true` when `base_url` is set
|
|
737
|
+
**Description:** Skip model validation for custom models.
|
|
738
|
+
|
|
739
|
+
```yaml
|
|
740
|
+
agents:
|
|
741
|
+
custom:
|
|
742
|
+
model: my-custom-model
|
|
743
|
+
base_url: "https://my-proxy.com/v1"
|
|
744
|
+
assume_model_exists: true # Skip validation
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
---
|
|
748
|
+
|
|
749
|
+
### agent_file
|
|
750
|
+
|
|
751
|
+
**Type:** String (optional)
|
|
752
|
+
**Default:** `nil`
|
|
753
|
+
**Description:** Path to markdown file containing agent configuration (system prompt and tools).
|
|
754
|
+
|
|
755
|
+
**Format:** Path relative to YAML file or absolute
|
|
756
|
+
|
|
757
|
+
```yaml
|
|
758
|
+
agents:
|
|
759
|
+
backend:
|
|
760
|
+
description: "Backend developer"
|
|
761
|
+
agent_file: "agents/backend.md"
|
|
762
|
+
|
|
763
|
+
frontend:
|
|
764
|
+
description: "Frontend developer"
|
|
765
|
+
agent_file: "/absolute/path/to/frontend.md"
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
**Markdown file format** (requires YAML frontmatter):
|
|
769
|
+
```markdown
|
|
770
|
+
---
|
|
771
|
+
description: "Backend developer"
|
|
772
|
+
model: "gpt-4"
|
|
773
|
+
tools:
|
|
774
|
+
- Read
|
|
775
|
+
- Write
|
|
776
|
+
- Edit
|
|
777
|
+
- Bash
|
|
778
|
+
---
|
|
779
|
+
|
|
780
|
+
You are a backend API developer specializing in Ruby on Rails.
|
|
781
|
+
|
|
782
|
+
Focus on clean, testable code with proper error handling.
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
## All-Agents Configuration
|
|
788
|
+
|
|
789
|
+
Fields under `swarm.all_agents`. All fields are optional and provide defaults for agents.
|
|
790
|
+
|
|
791
|
+
### model
|
|
792
|
+
|
|
793
|
+
**Type:** String
|
|
794
|
+
**Description:** Default model for all agents.
|
|
795
|
+
|
|
796
|
+
```yaml
|
|
797
|
+
swarm:
|
|
798
|
+
all_agents:
|
|
799
|
+
model: gpt-5
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
---
|
|
803
|
+
|
|
804
|
+
### provider
|
|
805
|
+
|
|
806
|
+
**Type:** String
|
|
807
|
+
**Description:** Default provider for all agents.
|
|
808
|
+
|
|
809
|
+
```yaml
|
|
810
|
+
swarm:
|
|
811
|
+
all_agents:
|
|
812
|
+
provider: anthropic
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
---
|
|
816
|
+
|
|
817
|
+
### base_url
|
|
818
|
+
|
|
819
|
+
**Type:** String
|
|
820
|
+
**Description:** Default base URL for all agents.
|
|
821
|
+
|
|
822
|
+
```yaml
|
|
823
|
+
swarm:
|
|
824
|
+
all_agents:
|
|
825
|
+
base_url: "https://proxy.example.com/v1"
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
---
|
|
829
|
+
|
|
830
|
+
### api_version
|
|
831
|
+
|
|
832
|
+
**Type:** String
|
|
833
|
+
**Description:** Default API version for all agents.
|
|
834
|
+
|
|
835
|
+
```yaml
|
|
836
|
+
swarm:
|
|
837
|
+
all_agents:
|
|
838
|
+
api_version: "v1/responses"
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
---
|
|
842
|
+
|
|
843
|
+
### timeout
|
|
844
|
+
|
|
845
|
+
**Type:** Integer
|
|
846
|
+
**Description:** Default timeout for all agents.
|
|
847
|
+
|
|
848
|
+
```yaml
|
|
849
|
+
swarm:
|
|
850
|
+
all_agents:
|
|
851
|
+
timeout: 180
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
---
|
|
855
|
+
|
|
856
|
+
### parameters
|
|
857
|
+
|
|
858
|
+
**Type:** Object
|
|
859
|
+
**Description:** Default LLM parameters for all agents.
|
|
860
|
+
|
|
861
|
+
```yaml
|
|
862
|
+
swarm:
|
|
863
|
+
all_agents:
|
|
864
|
+
parameters:
|
|
865
|
+
temperature: 0.7
|
|
866
|
+
max_tokens: 2000
|
|
867
|
+
```
|
|
868
|
+
|
|
869
|
+
---
|
|
870
|
+
|
|
871
|
+
### headers
|
|
872
|
+
|
|
873
|
+
**Type:** Object
|
|
874
|
+
**Description:** Default HTTP headers for all agents.
|
|
875
|
+
|
|
876
|
+
```yaml
|
|
877
|
+
swarm:
|
|
878
|
+
all_agents:
|
|
879
|
+
headers:
|
|
880
|
+
X-Organization: "org123"
|
|
881
|
+
```
|
|
882
|
+
|
|
883
|
+
---
|
|
884
|
+
|
|
885
|
+
### coding_agent
|
|
886
|
+
|
|
887
|
+
**Type:** Boolean
|
|
888
|
+
**Description:** Default coding_agent flag for all agents.
|
|
889
|
+
|
|
890
|
+
```yaml
|
|
891
|
+
swarm:
|
|
892
|
+
all_agents:
|
|
893
|
+
coding_agent: false
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
---
|
|
897
|
+
|
|
898
|
+
### tools
|
|
899
|
+
|
|
900
|
+
**Type:** Array
|
|
901
|
+
**Description:** Tools that all agents will have (in addition to agent-specific tools).
|
|
902
|
+
|
|
903
|
+
```yaml
|
|
904
|
+
swarm:
|
|
905
|
+
all_agents:
|
|
906
|
+
tools: [Read, Write]
|
|
907
|
+
```
|
|
908
|
+
|
|
909
|
+
---
|
|
910
|
+
|
|
911
|
+
### permissions
|
|
912
|
+
|
|
913
|
+
**Type:** Object
|
|
914
|
+
**Description:** Default permissions for all agents.
|
|
915
|
+
|
|
916
|
+
```yaml
|
|
917
|
+
swarm:
|
|
918
|
+
all_agents:
|
|
919
|
+
permissions:
|
|
920
|
+
Write:
|
|
921
|
+
denied_paths: ["secrets/**"]
|
|
922
|
+
Bash:
|
|
923
|
+
denied_commands: ["^rm -rf", "^sudo"]
|
|
924
|
+
```
|
|
925
|
+
|
|
926
|
+
---
|
|
927
|
+
|
|
928
|
+
### hooks
|
|
929
|
+
|
|
930
|
+
**Type:** Object
|
|
931
|
+
**Description:** Hooks applied to all agents.
|
|
932
|
+
|
|
933
|
+
**Valid events:** All agent-level events (not swarm-level events)
|
|
934
|
+
|
|
935
|
+
```yaml
|
|
936
|
+
swarm:
|
|
937
|
+
all_agents:
|
|
938
|
+
hooks:
|
|
939
|
+
pre_tool_use:
|
|
940
|
+
- matcher: "Write"
|
|
941
|
+
type: command
|
|
942
|
+
command: "scripts/validate-write.sh"
|
|
943
|
+
```
|
|
944
|
+
|
|
945
|
+
---
|
|
946
|
+
|
|
947
|
+
## Hooks Configuration
|
|
948
|
+
|
|
949
|
+
### Hook Structure
|
|
950
|
+
|
|
951
|
+
Each hook is an object with the following fields:
|
|
952
|
+
|
|
953
|
+
#### type
|
|
954
|
+
|
|
955
|
+
**Type:** String (required)
|
|
956
|
+
**Value:** `"command"`
|
|
957
|
+
**Description:** Hook type. Only `command` supported in YAML (Ruby DSL supports blocks).
|
|
958
|
+
|
|
959
|
+
```yaml
|
|
960
|
+
hooks:
|
|
961
|
+
pre_tool_use:
|
|
962
|
+
- type: command
|
|
963
|
+
command: "validate.sh"
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
---
|
|
967
|
+
|
|
968
|
+
#### command
|
|
969
|
+
|
|
970
|
+
**Type:** String (required for type: command)
|
|
971
|
+
**Description:** Shell command to execute.
|
|
972
|
+
|
|
973
|
+
**Environment variables available:**
|
|
974
|
+
- `SWARM_NAME`: Swarm name
|
|
975
|
+
- `AGENT_NAME`: Current agent name
|
|
976
|
+
- `HOOK_EVENT`: Event type (pre_tool_use, post_tool_use, etc.)
|
|
977
|
+
- `TOOL_NAME`: Tool name (for tool events)
|
|
978
|
+
|
|
979
|
+
```yaml
|
|
980
|
+
hooks:
|
|
981
|
+
pre_tool_use:
|
|
982
|
+
- type: command
|
|
983
|
+
command: "scripts/validate.sh"
|
|
984
|
+
command: "npx eslint $FILE_PATH"
|
|
985
|
+
```
|
|
986
|
+
|
|
987
|
+
---
|
|
988
|
+
|
|
989
|
+
#### matcher
|
|
990
|
+
|
|
991
|
+
**Type:** String (optional)
|
|
992
|
+
**Description:** Tool name pattern (regex) for filtering (tool events only).
|
|
993
|
+
|
|
994
|
+
```yaml
|
|
995
|
+
hooks:
|
|
996
|
+
pre_tool_use:
|
|
997
|
+
# Match Write or Edit
|
|
998
|
+
- matcher: "Write|Edit"
|
|
999
|
+
type: command
|
|
1000
|
+
command: "validate.sh"
|
|
1001
|
+
|
|
1002
|
+
# Match all Bash commands
|
|
1003
|
+
- matcher: "Bash"
|
|
1004
|
+
type: command
|
|
1005
|
+
command: "log-command.sh"
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
---
|
|
1009
|
+
|
|
1010
|
+
#### timeout
|
|
1011
|
+
|
|
1012
|
+
**Type:** Integer (optional)
|
|
1013
|
+
**Default:** `60`
|
|
1014
|
+
**Description:** Command timeout in seconds.
|
|
1015
|
+
|
|
1016
|
+
```yaml
|
|
1017
|
+
hooks:
|
|
1018
|
+
pre_tool_use:
|
|
1019
|
+
- type: command
|
|
1020
|
+
command: "slow-validation.sh"
|
|
1021
|
+
timeout: 120
|
|
1022
|
+
```
|
|
1023
|
+
|
|
1024
|
+
---
|
|
1025
|
+
|
|
1026
|
+
### Hook Events
|
|
1027
|
+
|
|
1028
|
+
#### swarm_start
|
|
1029
|
+
|
|
1030
|
+
Fires when swarm execution begins (before first message).
|
|
1031
|
+
|
|
1032
|
+
**Available in:** `swarm.hooks` only (not agent hooks)
|
|
1033
|
+
|
|
1034
|
+
**Input (stdin JSON):**
|
|
1035
|
+
```json
|
|
1036
|
+
{
|
|
1037
|
+
"event": "swarm_start",
|
|
1038
|
+
"prompt": "User's task prompt",
|
|
1039
|
+
"swarm_name": "Development Team",
|
|
1040
|
+
"lead_agent": "backend",
|
|
1041
|
+
"timestamp": "2024-01-01T12:00:00Z"
|
|
1042
|
+
}
|
|
1043
|
+
```
|
|
1044
|
+
|
|
1045
|
+
**Exit codes:**
|
|
1046
|
+
- `0`: Success, continue execution (stdout appended to prompt if non-empty)
|
|
1047
|
+
- `2`: Halt execution with error message from stderr
|
|
1048
|
+
- Other: Non-blocking warning (stderr logged, execution continues)
|
|
1049
|
+
|
|
1050
|
+
```yaml
|
|
1051
|
+
swarm:
|
|
1052
|
+
hooks:
|
|
1053
|
+
swarm_start:
|
|
1054
|
+
- type: command
|
|
1055
|
+
command: "scripts/pre-flight-check.sh"
|
|
1056
|
+
```
|
|
1057
|
+
|
|
1058
|
+
---
|
|
1059
|
+
|
|
1060
|
+
#### swarm_stop
|
|
1061
|
+
|
|
1062
|
+
Fires when swarm execution completes.
|
|
1063
|
+
|
|
1064
|
+
**Available in:** `swarm.hooks` only (not agent hooks)
|
|
1065
|
+
|
|
1066
|
+
**Input (stdin JSON):**
|
|
1067
|
+
```json
|
|
1068
|
+
{
|
|
1069
|
+
"event": "swarm_stop",
|
|
1070
|
+
"swarm_name": "Development Team",
|
|
1071
|
+
"lead_agent": "backend",
|
|
1072
|
+
"last_agent": "backend",
|
|
1073
|
+
"content": "Final response",
|
|
1074
|
+
"success": true,
|
|
1075
|
+
"duration": 5.2,
|
|
1076
|
+
"total_cost": 0.0045,
|
|
1077
|
+
"total_tokens": 1234,
|
|
1078
|
+
"agents_involved": ["backend", "frontend"],
|
|
1079
|
+
"timestamp": "2024-01-01T12:00:05Z"
|
|
1080
|
+
}
|
|
1081
|
+
```
|
|
1082
|
+
|
|
1083
|
+
**Exit codes:**
|
|
1084
|
+
- `0`: Success, stdout can trigger reprompt
|
|
1085
|
+
- `1`: Log error but continue
|
|
1086
|
+
- `2`: Halt with error
|
|
1087
|
+
|
|
1088
|
+
**Reprompt:** If stdout is non-empty, reprompt the lead agent with stdout content
|
|
1089
|
+
|
|
1090
|
+
```yaml
|
|
1091
|
+
swarm:
|
|
1092
|
+
hooks:
|
|
1093
|
+
swarm_stop:
|
|
1094
|
+
- type: command
|
|
1095
|
+
command: "scripts/post-execution.sh"
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
---
|
|
1099
|
+
|
|
1100
|
+
#### pre_tool_use
|
|
1101
|
+
|
|
1102
|
+
Fires before tool execution.
|
|
1103
|
+
|
|
1104
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1105
|
+
|
|
1106
|
+
**Input (stdin JSON):**
|
|
1107
|
+
```json
|
|
1108
|
+
{
|
|
1109
|
+
"event": "pre_tool_use",
|
|
1110
|
+
"agent": "backend",
|
|
1111
|
+
"tool": "Write",
|
|
1112
|
+
"parameters": {
|
|
1113
|
+
"file_path": "src/app.rb",
|
|
1114
|
+
"content": "..."
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
```
|
|
1118
|
+
|
|
1119
|
+
**Exit codes:**
|
|
1120
|
+
- `0`: Continue execution
|
|
1121
|
+
- `2`: Halt tool execution with error message from stderr
|
|
1122
|
+
- Other: Non-blocking warning (stderr logged, execution continues)
|
|
1123
|
+
|
|
1124
|
+
```yaml
|
|
1125
|
+
agents:
|
|
1126
|
+
backend:
|
|
1127
|
+
hooks:
|
|
1128
|
+
pre_tool_use:
|
|
1129
|
+
- matcher: "Write|Edit"
|
|
1130
|
+
type: command
|
|
1131
|
+
command: "scripts/validate-write.sh"
|
|
1132
|
+
```
|
|
1133
|
+
|
|
1134
|
+
---
|
|
1135
|
+
|
|
1136
|
+
#### post_tool_use
|
|
1137
|
+
|
|
1138
|
+
Fires after tool execution.
|
|
1139
|
+
|
|
1140
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1141
|
+
|
|
1142
|
+
**Input (stdin JSON):**
|
|
1143
|
+
```json
|
|
1144
|
+
{
|
|
1145
|
+
"event": "post_tool_use",
|
|
1146
|
+
"agent": "backend",
|
|
1147
|
+
"tool": "Write",
|
|
1148
|
+
"result": "File written successfully",
|
|
1149
|
+
"success": true
|
|
1150
|
+
}
|
|
1151
|
+
```
|
|
1152
|
+
|
|
1153
|
+
**Exit codes:**
|
|
1154
|
+
- `0`: Continue execution
|
|
1155
|
+
- `2`: Halt execution with error message from stderr
|
|
1156
|
+
- Other: Non-blocking warning (stderr logged, execution continues)
|
|
1157
|
+
|
|
1158
|
+
```yaml
|
|
1159
|
+
agents:
|
|
1160
|
+
backend:
|
|
1161
|
+
hooks:
|
|
1162
|
+
post_tool_use:
|
|
1163
|
+
- matcher: "Bash"
|
|
1164
|
+
type: command
|
|
1165
|
+
command: "logger 'Command executed'"
|
|
1166
|
+
```
|
|
1167
|
+
|
|
1168
|
+
---
|
|
1169
|
+
|
|
1170
|
+
#### user_prompt
|
|
1171
|
+
|
|
1172
|
+
Fires before sending user message to LLM.
|
|
1173
|
+
|
|
1174
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1175
|
+
|
|
1176
|
+
**Input (stdin JSON):**
|
|
1177
|
+
```json
|
|
1178
|
+
{
|
|
1179
|
+
"event": "user_prompt",
|
|
1180
|
+
"agent": "backend",
|
|
1181
|
+
"prompt": "Build a REST API",
|
|
1182
|
+
"model": "gpt-5",
|
|
1183
|
+
"provider": "openai",
|
|
1184
|
+
"message_count": 1
|
|
1185
|
+
}
|
|
1186
|
+
```
|
|
1187
|
+
|
|
1188
|
+
```yaml
|
|
1189
|
+
agents:
|
|
1190
|
+
backend:
|
|
1191
|
+
hooks:
|
|
1192
|
+
user_prompt:
|
|
1193
|
+
- type: command
|
|
1194
|
+
command: "scripts/log-request.sh"
|
|
1195
|
+
```
|
|
1196
|
+
|
|
1197
|
+
---
|
|
1198
|
+
|
|
1199
|
+
#### agent_stop
|
|
1200
|
+
|
|
1201
|
+
Fires when agent finishes execution.
|
|
1202
|
+
|
|
1203
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1204
|
+
|
|
1205
|
+
**Input (stdin JSON):**
|
|
1206
|
+
```json
|
|
1207
|
+
{
|
|
1208
|
+
"event": "agent_stop",
|
|
1209
|
+
"agent": "backend",
|
|
1210
|
+
"model": "gpt-5",
|
|
1211
|
+
"content": "Here is the implementation...",
|
|
1212
|
+
"finish_reason": "stop",
|
|
1213
|
+
"usage": {
|
|
1214
|
+
"input_tokens": 234,
|
|
1215
|
+
"output_tokens": 567,
|
|
1216
|
+
"total_tokens": 801,
|
|
1217
|
+
"total_cost": 0.0023
|
|
1218
|
+
}
|
|
1219
|
+
}
|
|
1220
|
+
```
|
|
1221
|
+
|
|
1222
|
+
```yaml
|
|
1223
|
+
agents:
|
|
1224
|
+
backend:
|
|
1225
|
+
hooks:
|
|
1226
|
+
agent_stop:
|
|
1227
|
+
- type: command
|
|
1228
|
+
command: "scripts/log-response.sh"
|
|
1229
|
+
```
|
|
1230
|
+
|
|
1231
|
+
---
|
|
1232
|
+
|
|
1233
|
+
#### first_message
|
|
1234
|
+
|
|
1235
|
+
Fires on first user message (once per swarm execution).
|
|
1236
|
+
|
|
1237
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1238
|
+
|
|
1239
|
+
**Input (stdin JSON):**
|
|
1240
|
+
```json
|
|
1241
|
+
{
|
|
1242
|
+
"event": "first_message",
|
|
1243
|
+
"agent": "backend",
|
|
1244
|
+
"prompt": "Build a REST API",
|
|
1245
|
+
"swarm_name": "Development Team",
|
|
1246
|
+
"timestamp": "2024-01-01T12:00:00Z"
|
|
1247
|
+
}
|
|
1248
|
+
```
|
|
1249
|
+
|
|
1250
|
+
```yaml
|
|
1251
|
+
all_agents:
|
|
1252
|
+
hooks:
|
|
1253
|
+
first_message:
|
|
1254
|
+
- type: command
|
|
1255
|
+
command: "scripts/initialize.sh"
|
|
1256
|
+
```
|
|
1257
|
+
|
|
1258
|
+
---
|
|
1259
|
+
|
|
1260
|
+
#### pre_delegation
|
|
1261
|
+
|
|
1262
|
+
Fires before delegating to another agent.
|
|
1263
|
+
|
|
1264
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1265
|
+
|
|
1266
|
+
**Input (stdin JSON):**
|
|
1267
|
+
```json
|
|
1268
|
+
{
|
|
1269
|
+
"event": "pre_delegation",
|
|
1270
|
+
"agent": "backend",
|
|
1271
|
+
"delegation_target": "database",
|
|
1272
|
+
"prompt": "Create the users table"
|
|
1273
|
+
}
|
|
1274
|
+
```
|
|
1275
|
+
|
|
1276
|
+
```yaml
|
|
1277
|
+
agents:
|
|
1278
|
+
backend:
|
|
1279
|
+
hooks:
|
|
1280
|
+
pre_delegation:
|
|
1281
|
+
- type: command
|
|
1282
|
+
command: "echo 'Delegating to $DELEGATION_TARGET'"
|
|
1283
|
+
```
|
|
1284
|
+
|
|
1285
|
+
---
|
|
1286
|
+
|
|
1287
|
+
#### post_delegation
|
|
1288
|
+
|
|
1289
|
+
Fires after delegation completes.
|
|
1290
|
+
|
|
1291
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1292
|
+
|
|
1293
|
+
**Input (stdin JSON):**
|
|
1294
|
+
```json
|
|
1295
|
+
{
|
|
1296
|
+
"event": "post_delegation",
|
|
1297
|
+
"agent": "backend",
|
|
1298
|
+
"delegation_target": "database",
|
|
1299
|
+
"result": "Table created successfully"
|
|
1300
|
+
}
|
|
1301
|
+
```
|
|
1302
|
+
|
|
1303
|
+
```yaml
|
|
1304
|
+
agents:
|
|
1305
|
+
backend:
|
|
1306
|
+
hooks:
|
|
1307
|
+
post_delegation:
|
|
1308
|
+
- type: command
|
|
1309
|
+
command: "logger 'Delegation complete'"
|
|
1310
|
+
```
|
|
1311
|
+
|
|
1312
|
+
---
|
|
1313
|
+
|
|
1314
|
+
#### context_warning
|
|
1315
|
+
|
|
1316
|
+
Fires when context window threshold exceeded.
|
|
1317
|
+
|
|
1318
|
+
**Available in:** `swarm.agents.{agent}.hooks`, `swarm.all_agents.hooks`
|
|
1319
|
+
|
|
1320
|
+
**Input (stdin JSON):**
|
|
1321
|
+
```json
|
|
1322
|
+
{
|
|
1323
|
+
"event": "context_warning",
|
|
1324
|
+
"agent": "backend",
|
|
1325
|
+
"model": "gpt-5",
|
|
1326
|
+
"threshold": "80%",
|
|
1327
|
+
"percentage": "85%",
|
|
1328
|
+
"tokens_used": 102400,
|
|
1329
|
+
"tokens_remaining": 25600,
|
|
1330
|
+
"context_limit": 128000
|
|
1331
|
+
}
|
|
1332
|
+
```
|
|
1333
|
+
|
|
1334
|
+
```yaml
|
|
1335
|
+
agents:
|
|
1336
|
+
backend:
|
|
1337
|
+
hooks:
|
|
1338
|
+
context_warning:
|
|
1339
|
+
- type: command
|
|
1340
|
+
command: "notify-admin.sh"
|
|
1341
|
+
```
|
|
1342
|
+
|
|
1343
|
+
---
|
|
1344
|
+
|
|
1345
|
+
## Node Configuration (**Ruby DSL Only**)
|
|
1346
|
+
|
|
1347
|
+
> **⚠️ CRITICAL: Nodes are NOT supported in YAML configuration.**
|
|
1348
|
+
>
|
|
1349
|
+
> The following documentation is for reference only. To use node-based workflows, you MUST use the Ruby DSL.
|
|
1350
|
+
> See [Ruby DSL Reference](./ruby-dsl.md#node-builder-dsl) for working examples.
|
|
1351
|
+
|
|
1352
|
+
Fields under each node in `swarm.nodes` (**Ruby DSL only**).
|
|
1353
|
+
|
|
1354
|
+
### agents
|
|
1355
|
+
|
|
1356
|
+
**Type:** Array (optional)
|
|
1357
|
+
**Default:** `[]`
|
|
1358
|
+
**Description:** List of agents participating in this node.
|
|
1359
|
+
|
|
1360
|
+
**Format:** Array of objects with `agent` and optional `delegates_to`
|
|
1361
|
+
|
|
1362
|
+
```yaml
|
|
1363
|
+
nodes:
|
|
1364
|
+
implementation:
|
|
1365
|
+
agents:
|
|
1366
|
+
- agent: backend
|
|
1367
|
+
delegates_to: [tester, database]
|
|
1368
|
+
- agent: tester
|
|
1369
|
+
delegates_to: [database]
|
|
1370
|
+
- agent: database
|
|
1371
|
+
```
|
|
1372
|
+
|
|
1373
|
+
---
|
|
1374
|
+
|
|
1375
|
+
### lead
|
|
1376
|
+
|
|
1377
|
+
**Type:** String (optional)
|
|
1378
|
+
**Default:** First agent in `agents` list
|
|
1379
|
+
**Description:** Lead agent for this node (overrides first agent).
|
|
1380
|
+
|
|
1381
|
+
```yaml
|
|
1382
|
+
nodes:
|
|
1383
|
+
review:
|
|
1384
|
+
agents:
|
|
1385
|
+
- agent: backend
|
|
1386
|
+
- agent: reviewer
|
|
1387
|
+
lead: reviewer # Make reviewer the lead instead of backend
|
|
1388
|
+
```
|
|
1389
|
+
|
|
1390
|
+
---
|
|
1391
|
+
|
|
1392
|
+
### dependencies
|
|
1393
|
+
|
|
1394
|
+
**Type:** Array (optional)
|
|
1395
|
+
**Default:** `[]`
|
|
1396
|
+
**Description:** List of prerequisite node names that must execute before this node.
|
|
1397
|
+
|
|
1398
|
+
**Note:** In Ruby DSL, use the `depends_on` method. In YAML (if nodes were supported), the field name is `dependencies`.
|
|
1399
|
+
|
|
1400
|
+
```yaml
|
|
1401
|
+
nodes:
|
|
1402
|
+
planning:
|
|
1403
|
+
agents:
|
|
1404
|
+
- agent: architect
|
|
1405
|
+
|
|
1406
|
+
implementation:
|
|
1407
|
+
agents:
|
|
1408
|
+
- agent: backend
|
|
1409
|
+
dependencies: [planning]
|
|
1410
|
+
|
|
1411
|
+
testing:
|
|
1412
|
+
agents:
|
|
1413
|
+
- agent: tester
|
|
1414
|
+
dependencies: [implementation]
|
|
1415
|
+
```
|
|
1416
|
+
|
|
1417
|
+
---
|
|
1418
|
+
|
|
1419
|
+
### input
|
|
1420
|
+
|
|
1421
|
+
**Type:** String (optional, Ruby DSL only)
|
|
1422
|
+
**Description:** Ruby block for input transformation. Not supported in YAML - use `input_command` instead.
|
|
1423
|
+
|
|
1424
|
+
---
|
|
1425
|
+
|
|
1426
|
+
### input_command
|
|
1427
|
+
|
|
1428
|
+
**Type:** String (optional)
|
|
1429
|
+
**Default:** `nil`
|
|
1430
|
+
**Description:** Bash command to transform input before node execution.
|
|
1431
|
+
|
|
1432
|
+
**Input (stdin):** NodeContext as JSON
|
|
1433
|
+
**Output (stdout):** Transformed input content
|
|
1434
|
+
|
|
1435
|
+
**Exit codes:**
|
|
1436
|
+
- `0`: Success, use stdout as transformed content
|
|
1437
|
+
- `1`: Skip node execution, use current_input unchanged
|
|
1438
|
+
- `2`: Halt workflow with error from stderr
|
|
1439
|
+
|
|
1440
|
+
**NodeContext JSON:**
|
|
1441
|
+
```json
|
|
1442
|
+
{
|
|
1443
|
+
"original_prompt": "User's original prompt",
|
|
1444
|
+
"node_name": "implementation",
|
|
1445
|
+
"dependencies": ["planning"],
|
|
1446
|
+
"content": "Previous node's content",
|
|
1447
|
+
"all_results": {
|
|
1448
|
+
"planning": {
|
|
1449
|
+
"content": "...",
|
|
1450
|
+
"agent": "architect",
|
|
1451
|
+
"duration": 3.2,
|
|
1452
|
+
"success": true
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
```
|
|
1457
|
+
|
|
1458
|
+
```yaml
|
|
1459
|
+
nodes:
|
|
1460
|
+
implementation:
|
|
1461
|
+
input_command: "scripts/transform-input.sh"
|
|
1462
|
+
input_command: "jq '.content'"
|
|
1463
|
+
input_command: "scripts/validate.sh" # Exit 1 to skip, 2 to halt
|
|
1464
|
+
```
|
|
1465
|
+
|
|
1466
|
+
---
|
|
1467
|
+
|
|
1468
|
+
### input_timeout
|
|
1469
|
+
|
|
1470
|
+
**Type:** Integer (optional)
|
|
1471
|
+
**Default:** `60`
|
|
1472
|
+
**Description:** Timeout for input_command in seconds.
|
|
1473
|
+
|
|
1474
|
+
```yaml
|
|
1475
|
+
nodes:
|
|
1476
|
+
implementation:
|
|
1477
|
+
input_command: "scripts/slow-transform.sh"
|
|
1478
|
+
input_timeout: 120
|
|
1479
|
+
```
|
|
1480
|
+
|
|
1481
|
+
---
|
|
1482
|
+
|
|
1483
|
+
### output
|
|
1484
|
+
|
|
1485
|
+
**Type:** String (optional, Ruby DSL only)
|
|
1486
|
+
**Description:** Ruby block for output transformation. Not supported in YAML - use `output_command` instead.
|
|
1487
|
+
|
|
1488
|
+
---
|
|
1489
|
+
|
|
1490
|
+
### output_command
|
|
1491
|
+
|
|
1492
|
+
**Type:** String (optional)
|
|
1493
|
+
**Default:** `nil`
|
|
1494
|
+
**Description:** Bash command to transform output after node execution.
|
|
1495
|
+
|
|
1496
|
+
**Input (stdin):** NodeContext as JSON (with result)
|
|
1497
|
+
**Output (stdout):** Transformed output content
|
|
1498
|
+
|
|
1499
|
+
**Exit codes:**
|
|
1500
|
+
- `0`: Success, use stdout as transformed content
|
|
1501
|
+
- `1`: Pass through unchanged, use result.content
|
|
1502
|
+
- `2`: Halt workflow with error from stderr
|
|
1503
|
+
|
|
1504
|
+
**NodeContext JSON:**
|
|
1505
|
+
```json
|
|
1506
|
+
{
|
|
1507
|
+
"original_prompt": "User's original prompt",
|
|
1508
|
+
"node_name": "implementation",
|
|
1509
|
+
"content": "Current node's result content",
|
|
1510
|
+
"agent": "backend",
|
|
1511
|
+
"duration": 5.2,
|
|
1512
|
+
"success": true,
|
|
1513
|
+
"all_results": {
|
|
1514
|
+
"planning": { ... },
|
|
1515
|
+
"implementation": { ... }
|
|
1516
|
+
}
|
|
1517
|
+
}
|
|
1518
|
+
```
|
|
1519
|
+
|
|
1520
|
+
```yaml
|
|
1521
|
+
nodes:
|
|
1522
|
+
implementation:
|
|
1523
|
+
output_command: "scripts/transform-output.sh"
|
|
1524
|
+
output_command: "tee results.txt"
|
|
1525
|
+
output_command: "scripts/save-and-format.sh"
|
|
1526
|
+
```
|
|
1527
|
+
|
|
1528
|
+
---
|
|
1529
|
+
|
|
1530
|
+
### output_timeout
|
|
1531
|
+
|
|
1532
|
+
**Type:** Integer (optional)
|
|
1533
|
+
**Default:** `60`
|
|
1534
|
+
**Description:** Timeout for output_command in seconds.
|
|
1535
|
+
|
|
1536
|
+
```yaml
|
|
1537
|
+
nodes:
|
|
1538
|
+
implementation:
|
|
1539
|
+
output_command: "scripts/slow-format.sh"
|
|
1540
|
+
output_timeout: 120
|
|
1541
|
+
```
|
|
1542
|
+
|
|
1543
|
+
---
|
|
1544
|
+
|
|
1545
|
+
## Environment Variable Interpolation
|
|
1546
|
+
|
|
1547
|
+
SwarmSDK supports environment variable interpolation with default values.
|
|
1548
|
+
|
|
1549
|
+
### Syntax
|
|
1550
|
+
|
|
1551
|
+
**Simple:**
|
|
1552
|
+
```yaml
|
|
1553
|
+
${ENV_VAR}
|
|
1554
|
+
```
|
|
1555
|
+
|
|
1556
|
+
**With default:**
|
|
1557
|
+
```yaml
|
|
1558
|
+
${ENV_VAR:=default_value}
|
|
1559
|
+
```
|
|
1560
|
+
|
|
1561
|
+
### Examples
|
|
1562
|
+
|
|
1563
|
+
```yaml
|
|
1564
|
+
swarm:
|
|
1565
|
+
agents:
|
|
1566
|
+
backend:
|
|
1567
|
+
model: ${MODEL} # Required env var
|
|
1568
|
+
base_url: ${BASE_URL:=http://localhost:8080} # With default
|
|
1569
|
+
headers:
|
|
1570
|
+
Authorization: "Bearer ${API_TOKEN}"
|
|
1571
|
+
parameters:
|
|
1572
|
+
temperature: ${TEMPERATURE:=0.7}
|
|
1573
|
+
|
|
1574
|
+
mcp_servers:
|
|
1575
|
+
- name: filesystem
|
|
1576
|
+
type: stdio
|
|
1577
|
+
command: npx
|
|
1578
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", "${ALLOWED_PATH:=.}"]
|
|
1579
|
+
```
|
|
1580
|
+
|
|
1581
|
+
**Shell usage:**
|
|
1582
|
+
```bash
|
|
1583
|
+
# With environment variables
|
|
1584
|
+
MODEL=gpt-5 API_TOKEN=abc123 swarm run config.yml -p "Task"
|
|
1585
|
+
|
|
1586
|
+
# With defaults (no env vars set)
|
|
1587
|
+
swarm run config.yml -p "Task" # Uses defaults from config
|
|
1588
|
+
```
|
|
1589
|
+
|
|
1590
|
+
---
|
|
1591
|
+
|
|
1592
|
+
## Permission Patterns
|
|
1593
|
+
|
|
1594
|
+
### Path Patterns (Glob)
|
|
1595
|
+
|
|
1596
|
+
Glob patterns for file paths.
|
|
1597
|
+
|
|
1598
|
+
**Syntax:**
|
|
1599
|
+
- `*`: Match any characters except `/`
|
|
1600
|
+
- `**`: Match any characters including `/`
|
|
1601
|
+
- `?`: Match single character
|
|
1602
|
+
- `[abc]`: Match a, b, or c
|
|
1603
|
+
- `{a,b}`: Match a or b
|
|
1604
|
+
|
|
1605
|
+
**Examples:**
|
|
1606
|
+
```yaml
|
|
1607
|
+
permissions:
|
|
1608
|
+
Write:
|
|
1609
|
+
allowed_paths:
|
|
1610
|
+
- "backend/**/*" # All files under backend/
|
|
1611
|
+
- "shared/**/*.rb" # All .rb files under shared/
|
|
1612
|
+
- "config/*.yml" # YAML files in config/ (not subdirs)
|
|
1613
|
+
- "**/test_*.rb" # test_*.rb anywhere
|
|
1614
|
+
- "src/{models,views}/**/*" # models/ and views/ in src/
|
|
1615
|
+
|
|
1616
|
+
denied_paths:
|
|
1617
|
+
- "backend/secrets/**" # No files in secrets/
|
|
1618
|
+
- "**/credentials.yml" # No credentials.yml anywhere
|
|
1619
|
+
- "*.key" # No .key files in root
|
|
1620
|
+
- ".env*" # No .env files
|
|
1621
|
+
```
|
|
1622
|
+
|
|
1623
|
+
---
|
|
1624
|
+
|
|
1625
|
+
### Command Patterns (Regex)
|
|
1626
|
+
|
|
1627
|
+
Regular expressions for bash commands.
|
|
1628
|
+
|
|
1629
|
+
**Syntax:** Standard Ruby/PCRE regex
|
|
1630
|
+
|
|
1631
|
+
**Examples:**
|
|
1632
|
+
```yaml
|
|
1633
|
+
permissions:
|
|
1634
|
+
Bash:
|
|
1635
|
+
allowed_commands:
|
|
1636
|
+
- "^git (status|diff|log)$" # Only safe git commands
|
|
1637
|
+
- "^bundle exec (rspec|rubocop)$" # Only test/lint
|
|
1638
|
+
- "^npm (test|run lint)$" # Safe npm commands
|
|
1639
|
+
- "^ls( -[lah]+)?$" # ls with optional flags
|
|
1640
|
+
- "^echo " # Echo commands
|
|
1641
|
+
|
|
1642
|
+
denied_commands:
|
|
1643
|
+
- "^rm -rf" # No rm -rf
|
|
1644
|
+
- "^sudo" # No sudo
|
|
1645
|
+
- "^dd if=" # No dd
|
|
1646
|
+
- "chmod 777" # No world-writable
|
|
1647
|
+
- "eval" # No eval
|
|
1648
|
+
```
|
|
1649
|
+
|
|
1650
|
+
---
|
|
1651
|
+
|
|
1652
|
+
## Complete Example
|
|
1653
|
+
|
|
1654
|
+
```yaml
|
|
1655
|
+
version: 2
|
|
1656
|
+
|
|
1657
|
+
swarm:
|
|
1658
|
+
name: "Full-Stack Development Team"
|
|
1659
|
+
lead: coordinator
|
|
1660
|
+
|
|
1661
|
+
# Global configuration for all agents
|
|
1662
|
+
all_agents:
|
|
1663
|
+
provider: openai
|
|
1664
|
+
timeout: 180
|
|
1665
|
+
coding_agent: false
|
|
1666
|
+
tools: [Read, Write]
|
|
1667
|
+
|
|
1668
|
+
permissions:
|
|
1669
|
+
Write:
|
|
1670
|
+
denied_paths:
|
|
1671
|
+
- "secrets/**"
|
|
1672
|
+
- "*.key"
|
|
1673
|
+
Bash:
|
|
1674
|
+
denied_commands:
|
|
1675
|
+
- "^rm -rf"
|
|
1676
|
+
- "^sudo"
|
|
1677
|
+
|
|
1678
|
+
hooks:
|
|
1679
|
+
pre_tool_use:
|
|
1680
|
+
- matcher: "Write|Edit"
|
|
1681
|
+
type: command
|
|
1682
|
+
command: "scripts/validate-write.sh"
|
|
1683
|
+
timeout: 10
|
|
1684
|
+
|
|
1685
|
+
# Swarm-level hooks
|
|
1686
|
+
hooks:
|
|
1687
|
+
swarm_start:
|
|
1688
|
+
- type: command
|
|
1689
|
+
command: "echo 'Starting development' >> log.txt"
|
|
1690
|
+
|
|
1691
|
+
swarm_stop:
|
|
1692
|
+
- type: command
|
|
1693
|
+
command: "scripts/cleanup.sh"
|
|
1694
|
+
timeout: 30
|
|
1695
|
+
|
|
1696
|
+
# Agent definitions
|
|
1697
|
+
agents:
|
|
1698
|
+
coordinator:
|
|
1699
|
+
description: "Lead coordinator managing the development process"
|
|
1700
|
+
model: gpt-5
|
|
1701
|
+
directory: "."
|
|
1702
|
+
system_prompt: |
|
|
1703
|
+
You are the lead coordinator. Your responsibilities:
|
|
1704
|
+
1. Understand requirements and create tasks
|
|
1705
|
+
2. Delegate to specialists (backend, frontend, reviewer)
|
|
1706
|
+
3. Synthesize results into final deliverable
|
|
1707
|
+
tools: [Read, TodoWrite]
|
|
1708
|
+
delegates_to: [backend, frontend, reviewer]
|
|
1709
|
+
coding_agent: true
|
|
1710
|
+
|
|
1711
|
+
hooks:
|
|
1712
|
+
pre_delegation:
|
|
1713
|
+
- type: command
|
|
1714
|
+
command: "echo 'Delegating to $DELEGATION_TARGET' >> delegation.log"
|
|
1715
|
+
|
|
1716
|
+
backend:
|
|
1717
|
+
description: "Backend developer specializing in Ruby on Rails"
|
|
1718
|
+
model: claude-sonnet-4
|
|
1719
|
+
provider: anthropic
|
|
1720
|
+
directory: "backend"
|
|
1721
|
+
system_prompt: "You build clean, testable backend APIs with Ruby on Rails"
|
|
1722
|
+
tools: [Read, Write, Edit, Bash, Grep, Glob]
|
|
1723
|
+
delegates_to: [database]
|
|
1724
|
+
coding_agent: true
|
|
1725
|
+
|
|
1726
|
+
parameters:
|
|
1727
|
+
temperature: 0.3
|
|
1728
|
+
max_tokens: 4000
|
|
1729
|
+
|
|
1730
|
+
permissions:
|
|
1731
|
+
Write:
|
|
1732
|
+
allowed_paths: ["**/*"]
|
|
1733
|
+
denied_paths: ["config/credentials.yml.enc"]
|
|
1734
|
+
Bash:
|
|
1735
|
+
allowed_commands:
|
|
1736
|
+
- "^bundle exec (rspec|rubocop)"
|
|
1737
|
+
- "^rails (db:migrate|routes)"
|
|
1738
|
+
|
|
1739
|
+
mcp_servers:
|
|
1740
|
+
- name: filesystem
|
|
1741
|
+
type: stdio
|
|
1742
|
+
command: npx
|
|
1743
|
+
args: ["-y", "@modelcontextprotocol/server-filesystem", "/backend"]
|
|
1744
|
+
|
|
1745
|
+
frontend:
|
|
1746
|
+
description: "Frontend developer specializing in React and TypeScript"
|
|
1747
|
+
model: gpt-5
|
|
1748
|
+
directory: "frontend"
|
|
1749
|
+
system_prompt: "You build modern, accessible frontends with React and TypeScript"
|
|
1750
|
+
tools: [Read, Write, Edit, Bash]
|
|
1751
|
+
coding_agent: true
|
|
1752
|
+
|
|
1753
|
+
permissions:
|
|
1754
|
+
Write:
|
|
1755
|
+
allowed_paths: ["**/*"]
|
|
1756
|
+
Bash:
|
|
1757
|
+
allowed_commands:
|
|
1758
|
+
- "^npm (test|run lint)"
|
|
1759
|
+
- "^npx (tsc|eslint)"
|
|
1760
|
+
|
|
1761
|
+
database:
|
|
1762
|
+
description: "Database expert for schema design and migrations"
|
|
1763
|
+
model: gpt-5
|
|
1764
|
+
directory: "backend"
|
|
1765
|
+
system_prompt: "You design efficient database schemas and write migrations"
|
|
1766
|
+
tools: [Read, Write, Bash]
|
|
1767
|
+
coding_agent: true
|
|
1768
|
+
|
|
1769
|
+
permissions:
|
|
1770
|
+
Write:
|
|
1771
|
+
allowed_paths: ["db/**/*"]
|
|
1772
|
+
Bash:
|
|
1773
|
+
allowed_commands:
|
|
1774
|
+
- "^rails db:(migrate|rollback|schema:dump)"
|
|
1775
|
+
|
|
1776
|
+
reviewer:
|
|
1777
|
+
description: "Code reviewer checking for bugs and best practices"
|
|
1778
|
+
model: o4
|
|
1779
|
+
directory: "."
|
|
1780
|
+
system_prompt: |
|
|
1781
|
+
You are a thorough code reviewer. For each change:
|
|
1782
|
+
1. Check for bugs and edge cases
|
|
1783
|
+
2. Verify test coverage
|
|
1784
|
+
3. Suggest improvements
|
|
1785
|
+
4. Check security issues
|
|
1786
|
+
tools: [Read, Grep, Glob]
|
|
1787
|
+
coding_agent: false
|
|
1788
|
+
|
|
1789
|
+
parameters:
|
|
1790
|
+
temperature: 0.2
|
|
1791
|
+
|
|
1792
|
+
# Multi-stage workflow (optional)
|
|
1793
|
+
nodes:
|
|
1794
|
+
planning:
|
|
1795
|
+
agents:
|
|
1796
|
+
- agent: coordinator
|
|
1797
|
+
|
|
1798
|
+
output_command: "tee plan.txt"
|
|
1799
|
+
|
|
1800
|
+
backend_implementation:
|
|
1801
|
+
agents:
|
|
1802
|
+
- agent: backend
|
|
1803
|
+
delegates_to: [database]
|
|
1804
|
+
- agent: database
|
|
1805
|
+
dependencies: [planning]
|
|
1806
|
+
|
|
1807
|
+
input_command: "scripts/prepare-backend-context.sh"
|
|
1808
|
+
output_command: "scripts/save-backend-results.sh"
|
|
1809
|
+
|
|
1810
|
+
frontend_implementation:
|
|
1811
|
+
agents:
|
|
1812
|
+
- agent: frontend
|
|
1813
|
+
dependencies: [planning]
|
|
1814
|
+
|
|
1815
|
+
input_command: "scripts/prepare-frontend-context.sh"
|
|
1816
|
+
|
|
1817
|
+
review:
|
|
1818
|
+
agents:
|
|
1819
|
+
- agent: reviewer
|
|
1820
|
+
dependencies: [backend_implementation, frontend_implementation]
|
|
1821
|
+
|
|
1822
|
+
input_command: "scripts/gather-changes.sh"
|
|
1823
|
+
output_command: "scripts/format-review.sh"
|
|
1824
|
+
|
|
1825
|
+
start_node: planning
|
|
1826
|
+
```
|
|
1827
|
+
|
|
1828
|
+
---
|
|
1829
|
+
|
|
1830
|
+
## See Also
|
|
1831
|
+
|
|
1832
|
+
- [Ruby DSL Reference](./ruby-dsl.md): Complete Ruby DSL reference
|
|
1833
|
+
- [CLI Reference](./cli.md): Command-line interface reference
|
|
1834
|
+
- [Getting Started Guide](../guides/getting-started.md): Introduction to SwarmSDK
|
|
1835
|
+
- [Quick Start CLI](../guides/quick-start-cli.md): Quick CLI examples
|