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 CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
- <img src="img/team.png" alt="Pantheon agents" width="420">
3
- <p><i>Six 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>
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>kimi-for-coding/k2p5</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>google/gemini-3.1-pro-preview</code> <code>openai/gpt-5.4-mini</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>Recommended Models:</b> <code>openai/gpt-5.4</code> <code>kimi-for-coding/k2p5</code>
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>google/gemini-3.1-pro-preview</code> <code>openai/gpt-5.4-mini</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>kimi-for-coding/k2p5</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>google/gemini-3.1-pro-preview</code> <code>openai/gpt-5.4-mini</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
- - **[Quick Reference](docs/quick-reference.md)** - Skills, MCPs, Tools, Configuration
308
- - **[Provider Configurations](docs/provider-configurations.md)** - Config examples for OpenAI, Kimi, Copilot, ZAI
309
- - **[Installation Guide](docs/installation.md)** - Detailed installation and troubleshooting
310
- - **[Cartography Skill](docs/cartography.md)** - Custom skill for repository mapping + codemap generation
311
- - **[Tmux Integration](docs/tmux-integration.md)** - Real-time agent monitoring with tmux
312
- **[Quick Reference](docs/quick-reference.md)** - Config, fallback behavior, skills, MCPs
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: ["orchestrator"],
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.
@@ -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: ["orchestrator"],
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: 10x better decisions maker, problem solver, investigator than orchestrator, 0.8x speed of orchestrator, same cost.
17584
- - Capabilities: Deep architectural reasoning, system-level trade-offs, complex debugging
17585
- - Tools/Constraints: Slow, expensive, high-quality\u2014use sparingly when thoroughness beats speed
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
- - Suggest \`simplify\` skill when applicable
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 maintainability
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 promises = entries.map(([name, config2], index) => (async () => {
19411
- if (index > 0) {
19412
- await new Promise((r) => setTimeout(r, index * COUNCILLOR_STAGGER_MS));
19413
- }
19414
- const modelLabel = shortModelLabel(config2.model);
19415
- try {
19416
- const result = await this.runAgentSession({
19417
- parentSessionId,
19418
- title: `Council ${name} (${modelLabel})`,
19419
- agent: "councillor",
19420
- model: config2.model,
19421
- promptText: formatCouncillorPrompt(prompt, config2.prompt),
19422
- variant: config2.variant,
19423
- timeout,
19424
- includeReasoning: false
19425
- });
19426
- return {
19427
- name,
19428
- model: config2.model,
19429
- status: "completed",
19430
- result
19431
- };
19432
- } catch (error48) {
19433
- const msg = error48 instanceof Error ? error48.message : String(error48);
19434
- return {
19435
- name,
19436
- model: config2.model,
19437
- status: msg.includes("timed out") ? "timed_out" : "failed",
19438
- error: `Councillor "${name}": ${msg}`
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
- const settled = await Promise.allSettled(promises);
19443
- return settled.map((result, index) => {
19444
- const [name, cfg] = entries[index];
19445
- if (result.status === "fulfilled") {
19446
- return {
19447
- name,
19448
- model: cfg.model,
19449
- status: result.value.status,
19450
- result: result.value.result,
19451
- error: result.value.error
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
- return {
19455
- name,
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode-slim",
3
- "version": "0.8.5",
3
+ "version": "0.9.0",
4
4
  "description": "Lightweight agent orchestration plugin for OpenCode - a slimmed-down fork of oh-my-opencode",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",