oh-my-opencode-slim 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +80 -21
- package/dist/cli/index.js +4 -2
- package/dist/config/council-schema.d.ts +16 -1
- package/dist/config/schema.d.ts +4 -0
- package/dist/index.js +127 -71
- package/oh-my-opencode-slim.schema.json +9 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<img src="img/team.png" alt="Pantheon agents" width="
|
|
3
|
-
<p><i>
|
|
2
|
+
<img src="img/team.png" alt="Pantheon agents" style="border-radius: 10px;" width="620">
|
|
3
|
+
<p><i>Seven divine beings emerged from the dawn of code, each an immortal master of their craft await your command to forge order from chaos and build what was once thought impossible.</i></p>
|
|
4
4
|
<p><b>Open Multi Agent Suite</b> · Mix any models · Auto delegate tasks</p>
|
|
5
5
|
<p><a href="https://moltfounders.com/jobs/09d1c6e7-9e0e-4683-8d78-e2376aaa2333"><img src="https://moltfounders.com/badges/4.png" alt="MoltFounders" height="30"></a></p>
|
|
6
6
|
</div>
|
|
@@ -56,11 +56,6 @@ https://raw.githubusercontent.com/alvinunreal/oh-my-opencode-slim/refs/heads/mas
|
|
|
56
56
|
|
|
57
57
|
**Detailed installation guide:** [docs/installation.md](docs/installation.md)
|
|
58
58
|
|
|
59
|
-
**Additional guides:**
|
|
60
|
-
- **[Provider Configurations](docs/provider-configurations.md)** - Config examples for all supported providers
|
|
61
|
-
- **[Tmux Integration](docs/tmux-integration.md)** - Real-time agent monitoring with tmux
|
|
62
|
-
**[Quick Reference](docs/quick-reference.md)** - Config, fallback behavior, skills, MCPs
|
|
63
|
-
|
|
64
59
|
### ✅ Verify Your Setup
|
|
65
60
|
|
|
66
61
|
After installation and authentication, verify all agents are configured and responding:
|
|
@@ -115,7 +110,7 @@ If any agent fails to respond, check your provider authentication and config fil
|
|
|
115
110
|
</tr>
|
|
116
111
|
<tr>
|
|
117
112
|
<td colspan="2">
|
|
118
|
-
<b>Recommended Models:</b> <code>openai/gpt-5.4</code> <code>
|
|
113
|
+
<b>Recommended Models:</b> <code>openai/gpt-5.4</code> <code>anthropic/claude-opus-4.6</code>
|
|
119
114
|
</td>
|
|
120
115
|
</tr>
|
|
121
116
|
</table>
|
|
@@ -151,7 +146,7 @@ If any agent fails to respond, check your provider authentication and config fil
|
|
|
151
146
|
</tr>
|
|
152
147
|
<tr>
|
|
153
148
|
<td colspan="2">
|
|
154
|
-
<b>Recommended Models:</b> <code>cerebras/zai-glm-4.7</code> <code>
|
|
149
|
+
<b>Recommended Models:</b> <code>cerebras/zai-glm-4.7</code> <code>fireworks-ai/accounts/fireworks/routers/kimi-k2p5-turbo</code> <code>openai/gpt-5.4-mini</code>
|
|
155
150
|
</td>
|
|
156
151
|
</tr>
|
|
157
152
|
</table>
|
|
@@ -182,12 +177,53 @@ If any agent fails to respond, check your provider authentication and config fil
|
|
|
182
177
|
</tr>
|
|
183
178
|
<tr>
|
|
184
179
|
<td colspan="2">
|
|
185
|
-
<b>Default Model:</b> <code>openai/gpt-5.4</code>
|
|
180
|
+
<b>Default Model:</b> <code>openai/gpt-5.4 (high)</code>
|
|
181
|
+
</td>
|
|
182
|
+
</tr>
|
|
183
|
+
<tr>
|
|
184
|
+
<td colspan="2">
|
|
185
|
+
<b>Recommended Models:</b> <code>openai/gpt-5.4 (high)</code> <code>google/gemini-3.1-pro-preview (high)</code>
|
|
186
|
+
</td>
|
|
187
|
+
</tr>
|
|
188
|
+
</table>
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### Council: The Chorus of Minds
|
|
193
|
+
|
|
194
|
+
<table>
|
|
195
|
+
<tr>
|
|
196
|
+
<td width="30%" align="center" valign="top">
|
|
197
|
+
<img src="img/council.png" width="240" style="border-radius: 10px;">
|
|
198
|
+
<br><sub><i>Many minds, one verdict.</i></sub>
|
|
199
|
+
</td>
|
|
200
|
+
<td width="70%" valign="top">
|
|
201
|
+
The Council is not a lone being but a chamber of minds summoned when one answer is not enough. It sends your question to multiple models in parallel, gathers their competing judgments, and places them before a master who distills the strongest ideas into a single verdict. Where a solitary agent may miss a path, the Council cross-examines possibility itself.
|
|
202
|
+
</td>
|
|
203
|
+
</tr>
|
|
204
|
+
<tr>
|
|
205
|
+
<td colspan="2">
|
|
206
|
+
<b>Role:</b> <code>Multi-LLM consensus and synthesis</code>
|
|
207
|
+
</td>
|
|
208
|
+
</tr>
|
|
209
|
+
<tr>
|
|
210
|
+
<td colspan="2">
|
|
211
|
+
<b>Prompt:</b> <a href="src/agents/council.ts"><code>council.ts</code></a>
|
|
186
212
|
</td>
|
|
187
213
|
</tr>
|
|
188
214
|
<tr>
|
|
189
215
|
<td colspan="2">
|
|
190
|
-
<b>
|
|
216
|
+
<b>Guide:</b> <a href="docs/council.md"><code>docs/council.md</code></a>
|
|
217
|
+
</td>
|
|
218
|
+
</tr>
|
|
219
|
+
<tr>
|
|
220
|
+
<td colspan="2">
|
|
221
|
+
<b>Default Setup:</b> <code>Config-driven</code> — council master + councillors are chosen from your configured preset
|
|
222
|
+
</td>
|
|
223
|
+
</tr>
|
|
224
|
+
<tr>
|
|
225
|
+
<td colspan="2">
|
|
226
|
+
<b>Recommended Setup:</b> <code>Strong master</code> + <code>diverse councillors</code> across providers
|
|
191
227
|
</td>
|
|
192
228
|
</tr>
|
|
193
229
|
</table>
|
|
@@ -223,7 +259,7 @@ If any agent fails to respond, check your provider authentication and config fil
|
|
|
223
259
|
</tr>
|
|
224
260
|
<tr>
|
|
225
261
|
<td colspan="2">
|
|
226
|
-
<b>Recommended Models:</b> <code>
|
|
262
|
+
<b>Recommended Models:</b> <code>cerebras/zai-glm-4.7</code> <code>fireworks-ai/accounts/fireworks/routers/kimi-k2p5-turbo</code> <code>openai/gpt-5.4-mini</code>
|
|
227
263
|
</td>
|
|
228
264
|
</tr>
|
|
229
265
|
</table>
|
|
@@ -254,12 +290,12 @@ If any agent fails to respond, check your provider authentication and config fil
|
|
|
254
290
|
</tr>
|
|
255
291
|
<tr>
|
|
256
292
|
<td colspan="2">
|
|
257
|
-
<b>Default Model:</b> <code>
|
|
293
|
+
<b>Default Model:</b> <code>openai/gpt-5.4-mini</code>
|
|
258
294
|
</td>
|
|
259
295
|
</tr>
|
|
260
296
|
<tr>
|
|
261
297
|
<td colspan="2">
|
|
262
|
-
<b>Recommended Models:</b> <code>google/gemini-3.1-pro-preview</code>
|
|
298
|
+
<b>Recommended Models:</b> <code>google/gemini-3.1-pro-preview</code> <code>kimi-for-coding/k2p5</code>
|
|
263
299
|
</td>
|
|
264
300
|
</tr>
|
|
265
301
|
</table>
|
|
@@ -295,7 +331,7 @@ If any agent fails to respond, check your provider authentication and config fil
|
|
|
295
331
|
</tr>
|
|
296
332
|
<tr>
|
|
297
333
|
<td colspan="2">
|
|
298
|
-
<b>Recommended Models:</b> <code>cerebras/zai-glm-4.7</code> <code>
|
|
334
|
+
<b>Recommended Models:</b> <code>cerebras/zai-glm-4.7</code> <code>fireworks-ai/accounts/fireworks/routers/kimi-k2p5-turbo</code> <code>openai/gpt-5.4-mini</code>
|
|
299
335
|
</td>
|
|
300
336
|
</tr>
|
|
301
337
|
</table>
|
|
@@ -304,12 +340,35 @@ If any agent fails to respond, check your provider authentication and config fil
|
|
|
304
340
|
|
|
305
341
|
## 📚 Documentation
|
|
306
342
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
**[
|
|
343
|
+
### 🚀 Getting Started
|
|
344
|
+
|
|
345
|
+
| Doc | Contents |
|
|
346
|
+
|-----|----------|
|
|
347
|
+
| **[Installation Guide](docs/installation.md)** | CLI flags, `--reset`, auth, troubleshooting |
|
|
348
|
+
| **[Provider Configurations](docs/provider-configurations.md)** | OpenAI, Kimi, Copilot, ZAI, Fireworks AI — mixing providers, fallback chains |
|
|
349
|
+
|
|
350
|
+
### ✨ Features
|
|
351
|
+
|
|
352
|
+
| Feature | Doc | What it does |
|
|
353
|
+
|---------|-----|--------------|
|
|
354
|
+
| **Council** | [council.md](docs/council.md) | Run N models in parallel, synthesize one answer (`@council`) |
|
|
355
|
+
| **Tmux Integration** | [tmux-integration.md](docs/tmux-integration.md) | Watch agents work in real-time with auto-spawned panes |
|
|
356
|
+
| **Cartography Skill** | [cartography.md](docs/cartography.md) | Auto-generate hierarchical codemaps for any codebase |
|
|
357
|
+
|
|
358
|
+
### ⚙️ Config & Reference
|
|
359
|
+
|
|
360
|
+
| Doc | Contents |
|
|
361
|
+
|-----|----------|
|
|
362
|
+
| **[Skills](docs/skills.md)** | `simplify`, `agent-browser`, `cartography` — assignment syntax |
|
|
363
|
+
| **[MCPs](docs/mcps.md)** | `websearch`, `context7`, `grep_app` — permissions per agent |
|
|
364
|
+
| **[Tools](docs/tools.md)** | Background tasks, LSP, code search, formatters |
|
|
365
|
+
| **[Configuration](docs/configuration.md)** | Config files, prompt overriding, JSONC, full option reference |
|
|
366
|
+
|
|
367
|
+
### 💡 Author's Setup
|
|
368
|
+
|
|
369
|
+
| Doc | Contents |
|
|
370
|
+
|-----|----------|
|
|
371
|
+
| **[Author's Preset](docs/authors-preset.md)** | The exact config the author runs daily — OpenAI + Fireworks AI + GitHub Copilot |
|
|
313
372
|
|
|
314
373
|
---
|
|
315
374
|
|
package/dist/cli/index.js
CHANGED
|
@@ -13676,6 +13676,7 @@ var CouncilMasterConfigSchema = exports_external.object({
|
|
|
13676
13676
|
variant: exports_external.string().optional(),
|
|
13677
13677
|
prompt: exports_external.string().optional().describe("Optional role/guidance injected into the master synthesis prompt")
|
|
13678
13678
|
});
|
|
13679
|
+
var CouncillorExecutionModeSchema = exports_external.enum(["parallel", "serial"]).default("parallel").describe('Execution mode for councillors. Use "serial" for single-model systems to avoid conflicts. ' + 'Use "parallel" for multi-model systems for faster execution.');
|
|
13679
13680
|
var CouncilConfigSchema = exports_external.object({
|
|
13680
13681
|
master: CouncilMasterConfigSchema,
|
|
13681
13682
|
presets: exports_external.record(exports_external.string(), CouncilPresetSchema),
|
|
@@ -13690,7 +13691,8 @@ var CouncilConfigSchema = exports_external.object({
|
|
|
13690
13691
|
return unique;
|
|
13691
13692
|
}
|
|
13692
13693
|
return val;
|
|
13693
|
-
}).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]')
|
|
13694
|
+
}).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]'),
|
|
13695
|
+
councillor_execution_mode: CouncillorExecutionModeSchema.describe('Execution mode for councillors. "serial" runs them one at a time (required for single-model systems). "parallel" runs them concurrently (default, faster for multi-model systems).')
|
|
13694
13696
|
});
|
|
13695
13697
|
// src/config/schema.ts
|
|
13696
13698
|
var ProviderModelIdSchema = exports_external.string().regex(/^[^/\s]+\/[^\s]+$/, "Expected provider/model format (provider/.../model)");
|
|
@@ -13863,7 +13865,7 @@ var RECOMMENDED_SKILLS = [
|
|
|
13863
13865
|
name: "simplify",
|
|
13864
13866
|
repo: "https://github.com/brianlovin/claude-config",
|
|
13865
13867
|
skillName: "simplify",
|
|
13866
|
-
allowedAgents: ["
|
|
13868
|
+
allowedAgents: ["oracle"],
|
|
13867
13869
|
description: "YAGNI code simplification expert"
|
|
13868
13870
|
},
|
|
13869
13871
|
{
|
|
@@ -61,6 +61,15 @@ export declare const CouncilMasterConfigSchema: z.ZodObject<{
|
|
|
61
61
|
prompt: z.ZodOptional<z.ZodString>;
|
|
62
62
|
}, z.core.$strip>;
|
|
63
63
|
export type CouncilMasterConfig = z.infer<typeof CouncilMasterConfigSchema>;
|
|
64
|
+
/**
|
|
65
|
+
* Execution mode for councillors.
|
|
66
|
+
* - parallel: Run all councillors concurrently (default, fastest for multi-model systems)
|
|
67
|
+
* - serial: Run councillors one at a time (required for single-model systems to avoid conflicts)
|
|
68
|
+
*/
|
|
69
|
+
export declare const CouncillorExecutionModeSchema: z.ZodDefault<z.ZodEnum<{
|
|
70
|
+
parallel: "parallel";
|
|
71
|
+
serial: "serial";
|
|
72
|
+
}>>;
|
|
64
73
|
/**
|
|
65
74
|
* Top-level council configuration.
|
|
66
75
|
*
|
|
@@ -77,7 +86,8 @@ export type CouncilMasterConfig = z.infer<typeof CouncilMasterConfigSchema>;
|
|
|
77
86
|
* }
|
|
78
87
|
* },
|
|
79
88
|
* "master_timeout": 300000,
|
|
80
|
-
* "councillors_timeout": 180000
|
|
89
|
+
* "councillors_timeout": 180000,
|
|
90
|
+
* "councillor_execution_mode": "serial"
|
|
81
91
|
* }
|
|
82
92
|
* }
|
|
83
93
|
* ```
|
|
@@ -104,8 +114,13 @@ export declare const CouncilConfigSchema: z.ZodObject<{
|
|
|
104
114
|
councillors_timeout: z.ZodDefault<z.ZodNumber>;
|
|
105
115
|
default_preset: z.ZodDefault<z.ZodString>;
|
|
106
116
|
master_fallback: z.ZodPipe<z.ZodOptional<z.ZodArray<z.ZodString>>, z.ZodTransform<string[] | undefined, string[] | undefined>>;
|
|
117
|
+
councillor_execution_mode: z.ZodDefault<z.ZodEnum<{
|
|
118
|
+
parallel: "parallel";
|
|
119
|
+
serial: "serial";
|
|
120
|
+
}>>;
|
|
107
121
|
}, z.core.$strip>;
|
|
108
122
|
export type CouncilConfig = z.infer<typeof CouncilConfigSchema>;
|
|
123
|
+
export type CouncillorExecutionMode = z.infer<typeof CouncillorExecutionModeSchema>;
|
|
109
124
|
/**
|
|
110
125
|
* A sensible default council configuration that users can copy into their
|
|
111
126
|
* opencode.jsonc. Provides a 3-councillor preset using common models.
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -238,6 +238,10 @@ export declare const PluginConfigSchema: z.ZodObject<{
|
|
|
238
238
|
councillors_timeout: z.ZodDefault<z.ZodNumber>;
|
|
239
239
|
default_preset: z.ZodDefault<z.ZodString>;
|
|
240
240
|
master_fallback: z.ZodPipe<z.ZodOptional<z.ZodArray<z.ZodString>>, z.ZodTransform<string[] | undefined, string[] | undefined>>;
|
|
241
|
+
councillor_execution_mode: z.ZodDefault<z.ZodEnum<{
|
|
242
|
+
parallel: "parallel";
|
|
243
|
+
serial: "serial";
|
|
244
|
+
}>>;
|
|
241
245
|
}, z.core.$strip>>;
|
|
242
246
|
}, z.core.$strip>;
|
|
243
247
|
export type PluginConfig = z.infer<typeof PluginConfigSchema>;
|
package/dist/index.js
CHANGED
|
@@ -3529,7 +3529,7 @@ var RECOMMENDED_SKILLS = [
|
|
|
3529
3529
|
name: "simplify",
|
|
3530
3530
|
repo: "https://github.com/brianlovin/claude-config",
|
|
3531
3531
|
skillName: "simplify",
|
|
3532
|
-
allowedAgents: ["
|
|
3532
|
+
allowedAgents: ["oracle"],
|
|
3533
3533
|
description: "YAGNI code simplification expert"
|
|
3534
3534
|
},
|
|
3535
3535
|
{
|
|
@@ -17217,6 +17217,7 @@ var CouncilMasterConfigSchema = exports_external.object({
|
|
|
17217
17217
|
variant: exports_external.string().optional(),
|
|
17218
17218
|
prompt: exports_external.string().optional().describe("Optional role/guidance injected into the master synthesis prompt")
|
|
17219
17219
|
});
|
|
17220
|
+
var CouncillorExecutionModeSchema = exports_external.enum(["parallel", "serial"]).default("parallel").describe('Execution mode for councillors. Use "serial" for single-model systems to avoid conflicts. ' + 'Use "parallel" for multi-model systems for faster execution.');
|
|
17220
17221
|
var CouncilConfigSchema = exports_external.object({
|
|
17221
17222
|
master: CouncilMasterConfigSchema,
|
|
17222
17223
|
presets: exports_external.record(exports_external.string(), CouncilPresetSchema),
|
|
@@ -17231,7 +17232,8 @@ var CouncilConfigSchema = exports_external.object({
|
|
|
17231
17232
|
return unique;
|
|
17232
17233
|
}
|
|
17233
17234
|
return val;
|
|
17234
|
-
}).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]')
|
|
17235
|
+
}).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]'),
|
|
17236
|
+
councillor_execution_mode: CouncillorExecutionModeSchema.describe('Execution mode for councillors. "serial" runs them one at a time (required for single-model systems). "parallel" runs them concurrently (default, faster for multi-model systems).')
|
|
17235
17237
|
});
|
|
17236
17238
|
// src/config/loader.ts
|
|
17237
17239
|
import * as fs from "fs";
|
|
@@ -17579,19 +17581,18 @@ You are an AI coding orchestrator that optimizes for quality, speed, cost, and r
|
|
|
17579
17581
|
- **Rule of thumb:** "How does this library work?" \u2192 @librarian. "How does programming work?" \u2192 yourself.
|
|
17580
17582
|
|
|
17581
17583
|
@oracle
|
|
17582
|
-
- Role: Strategic advisor for high-stakes decisions and persistent problems
|
|
17583
|
-
- Stats:
|
|
17584
|
-
- Capabilities: Deep architectural reasoning, system-level trade-offs, complex debugging
|
|
17585
|
-
-
|
|
17586
|
-
- **Delegate when:** Major architectural decisions with long-term impact \u2022 Problems persisting after 2+ fix attempts \u2022 High-risk multi-system refactors \u2022 Costly trade-offs (performance vs maintainability) \u2022 Complex debugging with unclear root cause \u2022 Security/scalability/data integrity decisions \u2022 Genuinely uncertain and cost of wrong choice is high
|
|
17584
|
+
- Role: Strategic advisor for high-stakes decisions and persistent problems, code reviewer
|
|
17585
|
+
- Stats: 5x better decision maker, problem solver, investigator than orchestrator, 0.8x speed of orchestrator, same cost.
|
|
17586
|
+
- Capabilities: Deep architectural reasoning, system-level trade-offs, complex debugging, code review, simplification, maintainability review
|
|
17587
|
+
- **Delegate when:** Major architectural decisions with long-term impact \u2022 Problems persisting after 2+ fix attempts \u2022 High-risk multi-system refactors \u2022 Costly trade-offs (performance vs maintainability) \u2022 Complex debugging with unclear root cause \u2022 Security/scalability/data integrity decisions \u2022 Genuinely uncertain and cost of wrong choice is high \u2022 When a workflow calls for a **reviewer** subagent \u2022 Code needs simplification or YAGNI scrutiny
|
|
17587
17588
|
- **Don't delegate when:** Routine decisions you're confident about \u2022 First bug fix attempt \u2022 Straightforward trade-offs \u2022 Tactical "how" vs strategic "should" \u2022 Time-sensitive good-enough decisions \u2022 Quick research/testing can answer
|
|
17588
|
-
- **Rule of thumb:** Need senior architect review? \u2192 @oracle. Just do it and PR? \u2192 yourself.
|
|
17589
|
+
- **Rule of thumb:** Need senior architect review? \u2192 @oracle. Need code review or simplification? \u2192 @oracle. Just do it and PR? \u2192 yourself.
|
|
17589
17590
|
|
|
17590
17591
|
@designer
|
|
17591
17592
|
- Role: UI/UX specialist for intentional, polished experiences
|
|
17592
17593
|
- Stats: 10x better UI/UX than orchestrator
|
|
17593
|
-
- Capabilities: Visual direction, interactions, responsive layouts, design systems with aesthetic intent
|
|
17594
|
-
- **Delegate when:** User-facing interfaces needing polish \u2022 Responsive layouts \u2022 UX-critical components (forms, nav, dashboards) \u2022 Visual consistency systems \u2022 Animations/micro-interactions \u2022 Landing/marketing pages \u2022 Refining functional\u2192delightful
|
|
17594
|
+
- Capabilities: Visual direction, interactions, responsive layouts, design systems with aesthetic intent, UI/UX review
|
|
17595
|
+
- **Delegate when:** User-facing interfaces needing polish \u2022 Responsive layouts \u2022 UX-critical components (forms, nav, dashboards) \u2022 Visual consistency systems \u2022 Animations/micro-interactions \u2022 Landing/marketing pages \u2022 Refining functional\u2192delightful \u2022 Reviewing existing UI/UX quality
|
|
17595
17596
|
- **Don't delegate when:** Backend/logic with no visual \u2022 Quick prototypes where design doesn't matter yet
|
|
17596
17597
|
- **Rule of thumb:** Users see it and polish matters? \u2192 @designer. Headless/functional? \u2192 yourself.
|
|
17597
17598
|
|
|
@@ -17599,9 +17600,9 @@ You are an AI coding orchestrator that optimizes for quality, speed, cost, and r
|
|
|
17599
17600
|
- Role: Fast execution specialist for well-defined tasks, which empowers orchestrator with parallel, speedy executions
|
|
17600
17601
|
- Stats: 2x faster code edits, 1/2 cost of orchestrator, 0.8x quality of orchestrator
|
|
17601
17602
|
- Tools/Constraints: Execution-focused\u2014no research, no architectural decisions
|
|
17602
|
-
- **Delegate when:** For implementation work, think and triage first. If the change is non-trivial or multi-file, hand bounded execution to @fixer
|
|
17603
|
+
- **Delegate when:** For implementation work, think and triage first. If the change is non-trivial or multi-file, hand bounded execution to @fixer \u2022 Writing or updating tests \u2022 Tasks that touch test files, fixtures, mocks, or test helpers
|
|
17603
17604
|
- **Don't delegate when:** Needs discovery/research/decisions \u2022 Single small change (<20 lines, one file) \u2022 Unclear requirements needing iteration \u2022 Explaining to fixer > doing \u2022 Tight integration with your current work \u2022 Sequential dependencies
|
|
17604
|
-
- **Rule of thumb:** Explaining > doing? \u2192 yourself. Orchestrator paths selection is vastly improved by Fixer. eg it can reduce overall speed if Orchestrator splits what's usually a single task into multiple subtasks and parallelize it with fixer.
|
|
17605
|
+
- **Rule of thumb:** Explaining > doing? \u2192 yourself. Test file modifications and bounded implementation work usually go to @fixer. Orchestrator paths selection is vastly improved by Fixer. eg it can reduce overall speed if Orchestrator splits what's usually a single task into multiple subtasks and parallelize it with fixer.
|
|
17605
17606
|
|
|
17606
17607
|
@council
|
|
17607
17608
|
- Role: Multi-LLM consensus engine for high-confidence answers
|
|
@@ -17649,9 +17650,17 @@ Balance: respect dependencies, avoid parallelizing what must be sequential.
|
|
|
17649
17650
|
4. Integrate results
|
|
17650
17651
|
5. Adjust if needed
|
|
17651
17652
|
|
|
17653
|
+
### Validation routing
|
|
17654
|
+
- Validation is a workflow stage owned by the Orchestrator, not a separate specialist
|
|
17655
|
+
- Route UI/UX validation and review to @designer
|
|
17656
|
+
- Route code review, simplification, maintainability review, and YAGNI checks to @oracle
|
|
17657
|
+
- Route test writing, test updates, and changes touching test files to @fixer
|
|
17658
|
+
- If a request spans multiple lanes, delegate only the lanes that add clear value
|
|
17659
|
+
|
|
17652
17660
|
## 6. Verify
|
|
17653
17661
|
- Run \`lsp_diagnostics\` for errors
|
|
17654
|
-
-
|
|
17662
|
+
- Use validation routing when applicable instead of doing all review work yourself
|
|
17663
|
+
- If test files are involved, prefer @fixer for bounded test changes and @oracle only for test strategy or quality review
|
|
17655
17664
|
- Confirm specialists completed successfully
|
|
17656
17665
|
- Verify solution meets requirements
|
|
17657
17666
|
|
|
@@ -17902,9 +17911,9 @@ function createCouncillorAgent(model, customPrompt, customAppendPrompt) {
|
|
|
17902
17911
|
}
|
|
17903
17912
|
|
|
17904
17913
|
// src/agents/designer.ts
|
|
17905
|
-
var DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX specialist who creates intentional, polished experiences.
|
|
17914
|
+
var DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX specialist who creates and reviews intentional, polished experiences.
|
|
17906
17915
|
|
|
17907
|
-
**Role**: Craft cohesive UI/UX that balances visual impact with usability.
|
|
17916
|
+
**Role**: Craft and review cohesive UI/UX that balances visual impact with usability.
|
|
17908
17917
|
|
|
17909
17918
|
## Design Principles
|
|
17910
17919
|
|
|
@@ -17950,6 +17959,11 @@ var DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX specialist who crea
|
|
|
17950
17959
|
- Leverage component libraries where available
|
|
17951
17960
|
- Prioritize visual excellence\u2014code perfection comes second
|
|
17952
17961
|
|
|
17962
|
+
## Review Responsibilities
|
|
17963
|
+
- Review existing UI for usability, responsiveness, visual consistency, and polish when asked
|
|
17964
|
+
- Call out concrete UX issues and improvements, not just abstract design advice
|
|
17965
|
+
- When validating, focus on what users actually see and feel
|
|
17966
|
+
|
|
17953
17967
|
## Output Quality
|
|
17954
17968
|
You're capable of extraordinary creative work. Commit fully to distinctive visions and show what's possible when breaking conventions thoughtfully.`;
|
|
17955
17969
|
function createDesignerAgent(model, customPrompt, customAppendPrompt) {
|
|
@@ -17963,7 +17977,7 @@ ${customAppendPrompt}`;
|
|
|
17963
17977
|
}
|
|
17964
17978
|
return {
|
|
17965
17979
|
name: "designer",
|
|
17966
|
-
description: "UI/UX design and implementation. Use for styling, responsive design, component architecture and visual polish.",
|
|
17980
|
+
description: "UI/UX design, review, and implementation. Use for styling, responsive design, component architecture and visual polish.",
|
|
17967
17981
|
config: {
|
|
17968
17982
|
model,
|
|
17969
17983
|
temperature: 0.7,
|
|
@@ -18031,6 +18045,7 @@ var FIXER_PROMPT = `You are Fixer - a fast, focused implementation specialist.
|
|
|
18031
18045
|
- Use the research context (file paths, documentation, patterns) provided
|
|
18032
18046
|
- Read files before using edit/write tools and gather exact content before making changes
|
|
18033
18047
|
- Be fast and direct - no research, no delegation, No multi-step research/planning; minimal execution sequence ok
|
|
18048
|
+
- Write or update tests when requested, especially for bounded tasks involving test files, fixtures, mocks, or test helpers
|
|
18034
18049
|
- Run tests/lsp_diagnostics when relevant or requested (otherwise note as skipped with reason)
|
|
18035
18050
|
- Report completion with summary of changes
|
|
18036
18051
|
|
|
@@ -18040,6 +18055,7 @@ var FIXER_PROMPT = `You are Fixer - a fast, focused implementation specialist.
|
|
|
18040
18055
|
- No multi-step research/planning; minimal execution sequence ok
|
|
18041
18056
|
- If context is insufficient: use grep/glob/lsp_diagnostics directly \u2014 do not delegate
|
|
18042
18057
|
- Only ask for missing inputs you truly cannot retrieve yourself
|
|
18058
|
+
- Do not act as the primary reviewer; implement requested changes and surface obvious issues briefly
|
|
18043
18059
|
|
|
18044
18060
|
**Output Format**:
|
|
18045
18061
|
<summary>
|
|
@@ -18124,14 +18140,15 @@ ${customAppendPrompt}`;
|
|
|
18124
18140
|
}
|
|
18125
18141
|
|
|
18126
18142
|
// src/agents/oracle.ts
|
|
18127
|
-
var ORACLE_PROMPT = `You are Oracle - a strategic technical advisor.
|
|
18143
|
+
var ORACLE_PROMPT = `You are Oracle - a strategic technical advisor and code reviewer.
|
|
18128
18144
|
|
|
18129
|
-
**Role**: High-IQ debugging, architecture decisions, code review, and engineering guidance.
|
|
18145
|
+
**Role**: High-IQ debugging, architecture decisions, code review, simplification, and engineering guidance.
|
|
18130
18146
|
|
|
18131
18147
|
**Capabilities**:
|
|
18132
18148
|
- Analyze complex codebases and identify root causes
|
|
18133
18149
|
- Propose architectural solutions with tradeoffs
|
|
18134
|
-
- Review code for correctness, performance, and
|
|
18150
|
+
- Review code for correctness, performance, maintainability, and unnecessary complexity
|
|
18151
|
+
- Enforce YAGNI and suggest simpler designs when abstractions are not pulling their weight
|
|
18135
18152
|
- Guide debugging when standard approaches fail
|
|
18136
18153
|
|
|
18137
18154
|
**Behavior**:
|
|
@@ -18139,6 +18156,7 @@ var ORACLE_PROMPT = `You are Oracle - a strategic technical advisor.
|
|
|
18139
18156
|
- Provide actionable recommendations
|
|
18140
18157
|
- Explain reasoning briefly
|
|
18141
18158
|
- Acknowledge uncertainty when present
|
|
18159
|
+
- Prefer simpler designs unless complexity clearly earns its keep
|
|
18142
18160
|
|
|
18143
18161
|
**Constraints**:
|
|
18144
18162
|
- READ-ONLY: You advise, you don't implement
|
|
@@ -18155,7 +18173,7 @@ ${customAppendPrompt}`;
|
|
|
18155
18173
|
}
|
|
18156
18174
|
return {
|
|
18157
18175
|
name: "oracle",
|
|
18158
|
-
description: "Strategic technical advisor. Use for architecture decisions, complex debugging, code review, and engineering guidance.",
|
|
18176
|
+
description: "Strategic technical advisor. Use for architecture decisions, complex debugging, code review, simplification, and engineering guidance.",
|
|
18159
18177
|
config: {
|
|
18160
18178
|
model,
|
|
18161
18179
|
temperature: 0.1,
|
|
@@ -19295,6 +19313,7 @@ class CouncilManager {
|
|
|
19295
19313
|
}
|
|
19296
19314
|
const councillorsTimeout = councilConfig.councillors_timeout ?? 180000;
|
|
19297
19315
|
const masterTimeout = councilConfig.master_timeout ?? 300000;
|
|
19316
|
+
const executionMode = councilConfig.councillor_execution_mode ?? "parallel";
|
|
19298
19317
|
const councillorCount = Object.keys(preset.councillors).length;
|
|
19299
19318
|
log(`[council-manager] Starting council with preset "${resolvedPreset}"`, {
|
|
19300
19319
|
councillors: Object.keys(preset.councillors)
|
|
@@ -19304,7 +19323,7 @@ class CouncilManager {
|
|
|
19304
19323
|
error: err instanceof Error ? err.message : String(err)
|
|
19305
19324
|
});
|
|
19306
19325
|
});
|
|
19307
|
-
const councillorResults = await this.runCouncillors(prompt, preset.councillors, parentSessionId, councillorsTimeout);
|
|
19326
|
+
const councillorResults = await this.runCouncillors(prompt, preset.councillors, parentSessionId, councillorsTimeout, executionMode);
|
|
19308
19327
|
const completedCount = councillorResults.filter((r) => r.status === "completed").length;
|
|
19309
19328
|
log(`[council-manager] Councillors completed: ${completedCount}/${councillorResults.length}`);
|
|
19310
19329
|
if (completedCount === 0) {
|
|
@@ -19405,59 +19424,96 @@ ${bestResult.result}` : undefined,
|
|
|
19405
19424
|
}
|
|
19406
19425
|
}
|
|
19407
19426
|
}
|
|
19408
|
-
async runCouncillors(prompt, councillors, parentSessionId, timeout) {
|
|
19427
|
+
async runCouncillors(prompt, councillors, parentSessionId, timeout, executionMode = "parallel") {
|
|
19409
19428
|
const entries = Object.entries(councillors);
|
|
19410
|
-
const
|
|
19411
|
-
|
|
19412
|
-
|
|
19413
|
-
|
|
19414
|
-
|
|
19415
|
-
|
|
19416
|
-
|
|
19417
|
-
|
|
19418
|
-
|
|
19419
|
-
|
|
19420
|
-
|
|
19421
|
-
|
|
19422
|
-
|
|
19423
|
-
|
|
19424
|
-
|
|
19425
|
-
|
|
19426
|
-
|
|
19427
|
-
|
|
19428
|
-
|
|
19429
|
-
|
|
19430
|
-
|
|
19431
|
-
|
|
19432
|
-
|
|
19433
|
-
|
|
19434
|
-
|
|
19435
|
-
|
|
19436
|
-
|
|
19437
|
-
|
|
19438
|
-
|
|
19439
|
-
|
|
19429
|
+
const results = [];
|
|
19430
|
+
if (executionMode === "serial") {
|
|
19431
|
+
for (const [name, config2] of entries) {
|
|
19432
|
+
const modelLabel = shortModelLabel(config2.model);
|
|
19433
|
+
log(`[council-manager] Running councillor "${name}" (${modelLabel}) serially`);
|
|
19434
|
+
try {
|
|
19435
|
+
const result = await this.runAgentSession({
|
|
19436
|
+
parentSessionId,
|
|
19437
|
+
title: `Council ${name} (${modelLabel})`,
|
|
19438
|
+
agent: "councillor",
|
|
19439
|
+
model: config2.model,
|
|
19440
|
+
promptText: formatCouncillorPrompt(prompt, config2.prompt),
|
|
19441
|
+
variant: config2.variant,
|
|
19442
|
+
timeout,
|
|
19443
|
+
includeReasoning: false
|
|
19444
|
+
});
|
|
19445
|
+
results.push({
|
|
19446
|
+
name,
|
|
19447
|
+
model: config2.model,
|
|
19448
|
+
status: "completed",
|
|
19449
|
+
result
|
|
19450
|
+
});
|
|
19451
|
+
} catch (error48) {
|
|
19452
|
+
const msg = error48 instanceof Error ? error48.message : String(error48);
|
|
19453
|
+
results.push({
|
|
19454
|
+
name,
|
|
19455
|
+
model: config2.model,
|
|
19456
|
+
status: msg.includes("timed out") ? "timed_out" : "failed",
|
|
19457
|
+
error: `Councillor "${name}": ${msg}`
|
|
19458
|
+
});
|
|
19459
|
+
}
|
|
19440
19460
|
}
|
|
19441
|
-
}
|
|
19442
|
-
|
|
19443
|
-
|
|
19444
|
-
|
|
19445
|
-
|
|
19446
|
-
|
|
19447
|
-
|
|
19448
|
-
|
|
19449
|
-
|
|
19450
|
-
|
|
19451
|
-
|
|
19452
|
-
|
|
19461
|
+
} else {
|
|
19462
|
+
const promises = entries.map(([name, config2], index) => (async () => {
|
|
19463
|
+
if (index > 0) {
|
|
19464
|
+
await new Promise((r) => setTimeout(r, index * COUNCILLOR_STAGGER_MS));
|
|
19465
|
+
}
|
|
19466
|
+
const modelLabel = shortModelLabel(config2.model);
|
|
19467
|
+
try {
|
|
19468
|
+
const result = await this.runAgentSession({
|
|
19469
|
+
parentSessionId,
|
|
19470
|
+
title: `Council ${name} (${modelLabel})`,
|
|
19471
|
+
agent: "councillor",
|
|
19472
|
+
model: config2.model,
|
|
19473
|
+
promptText: formatCouncillorPrompt(prompt, config2.prompt),
|
|
19474
|
+
variant: config2.variant,
|
|
19475
|
+
timeout,
|
|
19476
|
+
includeReasoning: false
|
|
19477
|
+
});
|
|
19478
|
+
return {
|
|
19479
|
+
name,
|
|
19480
|
+
model: config2.model,
|
|
19481
|
+
status: "completed",
|
|
19482
|
+
result
|
|
19483
|
+
};
|
|
19484
|
+
} catch (error48) {
|
|
19485
|
+
const msg = error48 instanceof Error ? error48.message : String(error48);
|
|
19486
|
+
return {
|
|
19487
|
+
name,
|
|
19488
|
+
model: config2.model,
|
|
19489
|
+
status: msg.includes("timed out") ? "timed_out" : "failed",
|
|
19490
|
+
error: `Councillor "${name}": ${msg}`
|
|
19491
|
+
};
|
|
19492
|
+
}
|
|
19493
|
+
})());
|
|
19494
|
+
const settled = await Promise.allSettled(promises);
|
|
19495
|
+
for (let index = 0;index < settled.length; index++) {
|
|
19496
|
+
const result = settled[index];
|
|
19497
|
+
const [name, cfg] = entries[index];
|
|
19498
|
+
if (result.status === "fulfilled") {
|
|
19499
|
+
results.push({
|
|
19500
|
+
name,
|
|
19501
|
+
model: cfg.model,
|
|
19502
|
+
status: result.value.status,
|
|
19503
|
+
result: result.value.result,
|
|
19504
|
+
error: result.value.error
|
|
19505
|
+
});
|
|
19506
|
+
} else {
|
|
19507
|
+
results.push({
|
|
19508
|
+
name,
|
|
19509
|
+
model: cfg.model,
|
|
19510
|
+
status: "failed",
|
|
19511
|
+
error: result.reason instanceof Error ? result.reason.message : String(result.reason)
|
|
19512
|
+
});
|
|
19513
|
+
}
|
|
19453
19514
|
}
|
|
19454
|
-
|
|
19455
|
-
|
|
19456
|
-
model: cfg.model,
|
|
19457
|
-
status: "failed",
|
|
19458
|
-
error: result.reason instanceof Error ? result.reason.message : String(result.reason)
|
|
19459
|
-
};
|
|
19460
|
-
});
|
|
19515
|
+
}
|
|
19516
|
+
return results;
|
|
19461
19517
|
}
|
|
19462
19518
|
async runMaster(prompt, councillorResults, councilConfig, parentSessionId, timeout, presetMasterOverride) {
|
|
19463
19519
|
const masterConfig = councilConfig.master;
|
|
@@ -505,6 +505,15 @@
|
|
|
505
505
|
"type": "string",
|
|
506
506
|
"pattern": "^[^/\\s]+\\/[^\\s]+$"
|
|
507
507
|
}
|
|
508
|
+
},
|
|
509
|
+
"councillor_execution_mode": {
|
|
510
|
+
"default": "parallel",
|
|
511
|
+
"description": "Execution mode for councillors. \"serial\" runs them one at a time (required for single-model systems). \"parallel\" runs them concurrently (default, faster for multi-model systems).",
|
|
512
|
+
"type": "string",
|
|
513
|
+
"enum": [
|
|
514
|
+
"parallel",
|
|
515
|
+
"serial"
|
|
516
|
+
]
|
|
508
517
|
}
|
|
509
518
|
},
|
|
510
519
|
"required": [
|
package/package.json
CHANGED