Browse Source

Tunning prompts (#82)

* Tunning prompts

* Tune designer prompt

* Update readme

* readme

* CLI Proxy

* Fix tests

* fix-readme
Alvin 2 months ago
parent
commit
2123c4d563

+ 246 - 157
README.md

@@ -14,48 +14,51 @@
 
 ---
 
-## ⚡ Quick Navigation
+## Table of Contents
 
-- [🚀 **Installation**](#installation)
+- [📦 Installation](#-installation)
   - [For Humans](#for-humans)
   - [For LLM Agents](#for-llm-agents)
-- [🏛️ **Meet the Pantheon**](#meet-the-pantheon)
-  - [Orchestrator](#orchestrator-the-embodiment-of-order)
-  - [Explorer](#explorer-the-eternal-wanderer)
-  - [Oracle](#oracle-the-guardian-of-paths)
-  - [Librarian](#librarian-the-weaver-of-knowledge)
-  - [Designer](#designer-the-guardian-of-aesthetics)
-  - [Fixer](#fixer-the-last-builder)
-- [🧩 **Skills**](#-skills)
+- [🏛️ Meet the Pantheon](#️-meet-the-pantheon)
+  - [Orchestrator: The Embodiment Of Order](#orchestrator-the-embodiment-of-order)
+  - [Explorer: The Eternal Wanderer](#explorer-the-eternal-wanderer)
+  - [Oracle: The Guardian of Paths](#oracle-the-guardian-of-paths)
+  - [Librarian: The Weaver of Knowledge](#librarian-the-weaver-of-knowledge)
+  - [Designer: The Guardian of Aesthetics](#designer-the-guardian-of-aesthetics)
+  - [Fixer: The Last Builder](#fixer-the-last-builder)
+- [🎚️ Presets](#️-presets)
+  - [Switching Presets](#switching-presets)
+  - [OpenAI Preset](#openai-preset)
+  - [Antigravity via CLIProxy Preset](#antigravity-via-cliproxy-preset)
+  - [Author's Preset](#authors-preset)
+  - [Creating Custom Presets](#creating-custom-presets)
+  - [Option Reference](#option-reference)
+- [🧩 Skills](#-skills)
   - [Available Skills](#available-skills)
   - [Default Skill Assignments](#default-skill-assignments)
-  - [Skill Syntax](#skill-syntax)
-- [Simplify](#simplify)
+  - [Configuration & Syntax](#configuration--syntax)
+  - [Simplify](#simplify)
   - [Playwright Integration](#playwright-integration)
-  - [Customizing Agent Skills](#customizing-agent-skills)
-- [🔌 **MCP Servers**](#mcp-servers)
+- [🔌 MCP Servers](#-mcp-servers)
   - [MCP Permissions](#mcp-permissions)
-  - [MCP Syntax](#mcp-syntax)
-  - [Disabling MCPs](#disabling-mcps)
-  - [Customizing MCP Permissions](#customizing-mcp-permissions)
-- [🛠️ **Tools & Capabilities**](#tools--capabilities)
+  - [Configuration & Syntax](#configuration--syntax-1)
+- [🛠️ Tools & Capabilities](#️-tools--capabilities)
   - [Tmux Integration](#tmux-integration)
-  - [Quota Tool](#quota-tool)
   - [Background Tasks](#background-tasks)
   - [LSP Tools](#lsp-tools)
   - [Code Search Tools](#code-search-tools)
   - [Formatters](#formatters)
-- [⚙️ **Configuration**](#configuration)
+- [⚙️ Configuration](#️-configuration)
   - [Files You Edit](#files-you-edit)
   - [Prompt Overriding](#prompt-overriding)
-  - [Plugin Config](#plugin-config-oh-my-opencode-slimjson)
-    - [Presets](#presets)
-      - [Option Reference](#option-reference)
-- [🗑️ **Uninstallation**](#uninstallation)
+  - [Plugin Config (oh-my-opencode-slim.json)](#plugin-config-oh-my-opencode-slimjson)
+- [🗑️ Uninstallation](#️-uninstallation)
+- [🙏 Credits](#-credits)
+- [📄 License](#-license)
 
 ---
 
-## Installation
+## 📦 Installation
 
 ### For Humans
 
@@ -117,11 +120,11 @@ If not installed, direct the user to https://opencode.ai/docs first.
 
 Ask these questions **one at a time**, waiting for responses:
 
-1. "Do you have an **Antigravity** subscription?" *(Provides Claude + Gemini via `google/` prefix)*
+1. "Do you have an **Antigravity** subscription (via cliproxy)?" *(Provides Claude + Gemini via `cliproxy/` prefix)*
 2. "Do you have access to **OpenAI** API?" *(Enables `openai/` models)*
 
 Help the user understand the tradeoffs:
-- Antigravity is the recommended path for Claude + Gemini routing.
+- Antigravity via cliproxy provides Claude + Gemini routing.
 - OpenAI is optional; it enables `openai/` models.
 - If the user has **no providers**, the plugin still works using **OpenCode Zen** free models. They can switch to paid providers later by editing `~/.config/opencode/oh-my-opencode-slim.json`.
 
@@ -149,8 +152,7 @@ bunx oh-my-opencode-slim install --no-tui --antigravity=no --openai=no --tmux=no
 
 The installer automatically:
 - Adds the plugin to `~/.config/opencode/opencode.json`
-- Adds `opencode-antigravity-auth` plugin (if Antigravity enabled)
-- Configures Google provider with model definitions
+- Configures cliproxy provider for Antigravity models
 - Generates agent model mappings in `~/.config/opencode/oh-my-opencode-slim.json`
 
 **Crucial Advice for the User:**
@@ -160,15 +162,32 @@ The installer automatically:
 
 ---
 
-#### Step 4: Authentication
+#### Step 4: Install and Configure Cliproxy (if using Antigravity)
 
-After installation, guide the user:
+If the user selected Antigravity, guide them to install cliproxy:
 
-**For Antigravity/OpenAI:**
+**macOS:**
+```bash
+brew install cliproxyapi
+brew services start cliproxyapi
+```
+
+**Linux:**
+```bash
+curl -fsSL https://raw.githubusercontent.com/brokechubb/cliproxyapi-installer/refs/heads/master/cliproxyapi-installer | bash
+```
+
+**Authenticate with Antigravity:**
+```bash
+./cli-proxy-api --antigravity-login
+# Add --no-browser to print login URL instead of opening browser
+# The local OAuth callback uses port 51121
+```
+
+**For OpenAI (if enabled):**
 ```bash
 opencode auth login
-# Select: Google → OAuth with Google (Antigravity)
-# Repeat for all other providers
+# Select your provider and complete OAuth flow
 ```
 
 ---
@@ -187,17 +206,19 @@ Then manually create the config files at:
 
 ---
 
-## Meet the Pantheon
+## 🏛️ Meet the Pantheon
 
 ### Orchestrator: The Embodiment Of Order
 
 <a href="src/agents/orchestrator.ts"><img src="img/orchestrator.png" alt="Orchestrator" align="right" width="240"></a>
 
-> **The Orchestrator** was born when the first codebase collapsed under its own complexity. Neither god nor mortal would claim responsibility - so The Orchestrator emerged from the void, forging order from chaos. They don't merely command armies; they fight alongside them. Every line of code passes through their hands before they decide which lesser deity deserves a piece of the puzzle.
+> **The Orchestrator** was born when the first codebase collapsed under its own complexity. Neither god nor mortal would claim responsibility - so The Orchestrator emerged from the void, forging order from chaos. It determines the optimal path to any goal, balancing speed, quality, and cost. It guides the team, summoning the right specialist for each task and delegating to achieve the best possible outcome.
 
-**Role:** `Supreme executor, delegator, and overseer`  
+**Role:** `Master delegator and strategic coordinator`  
 **Model:** `google/claude-opus-4-5-thinking`  
-**Prompt:** [src/agents/orchestrator.ts](src/agents/orchestrator.ts)
+**Prompt:** [src/agents/orchestrator.ts](src/agents/orchestrator.ts)  
+**Skills:** `*` (all skills)  
+**MCPs:** `websearch`
 
 Write and execute code, orchestrate multi-agent workflows, parse the unspoken from the spoken, summon specialists mid-battle. *Shape reality directly - and assign realms to others when the universe grows too vast.*
 
@@ -211,7 +232,9 @@ Write and execute code, orchestrate multi-agent workflows, parse the unspoken fr
 
 **Role:** `Codebase reconnaissance`  
 **Model:** `google/gemini-3-flash`  
-**Prompt:** [src/agents/explorer.ts](src/agents/explorer.ts)
+**Prompt:** [src/agents/explorer.ts](src/agents/explorer.ts)  
+**Skills:** none  
+**MCPs:** none
 
 Regex search, AST pattern matching, file discovery, parallel exploration. *Read-only: they chart the territory; others conquer it.*
 
@@ -225,7 +248,9 @@ Regex search, AST pattern matching, file discovery, parallel exploration. *Read-
 
 **Role:** `Strategic advisor and debugger of last resort`  
 **Model:** `openai/gpt-5.2-codex`  
-**Prompt:** [src/agents/oracle.ts](src/agents/oracle.ts)
+**Prompt:** [src/agents/oracle.ts](src/agents/oracle.ts)  
+**Skills:** none  
+**MCPs:** none
 
 Root cause analysis, architecture review, debugging guidance, tradeoff analysis. *Read-only: Oracles advise; they don't intervene.*
 
@@ -239,7 +264,9 @@ Root cause analysis, architecture review, debugging guidance, tradeoff analysis.
 
 **Role:** `External knowledge retrieval`  
 **Model:** `google/gemini-3-flash`  
-**Prompt:** [src/agents/librarian.ts](src/agents/librarian.ts)
+**Prompt:** [src/agents/librarian.ts](src/agents/librarian.ts)  
+**Skills:** none  
+**MCPs:** `websearch`, `context7`, `grep_app`
 
 Documentation lookup, GitHub code search, library research, best practice retrieval. *Read-only: they fetch wisdom; implementation is for others.*
 
@@ -253,7 +280,9 @@ Documentation lookup, GitHub code search, library research, best practice retrie
 
 **Role:** `UI/UX implementation and visual excellence`  
 **Model:** `google/gemini-3-flash`  
-**Prompt:** [src/agents/designer.ts](src/agents/designer.ts)
+**Prompt:** [src/agents/designer.ts](src/agents/designer.ts)  
+**Skills:** `playwright`  
+**MCPs:** none
 
 Modern responsive design, CSS/Tailwind mastery, micro-animations, component architecture. *Visual excellence over code perfection - beauty is the priority.*
 
@@ -267,12 +296,181 @@ Modern responsive design, CSS/Tailwind mastery, micro-animations, component arch
 
 **Role:** `Fast implementation specialist`  
 **Model:** `google/gemini-3-flash`  
-**Prompt:** [src/agents/fixer.ts](src/agents/fixer.ts)
+**Prompt:** [src/agents/fixer.ts](src/agents/fixer.ts)  
+**Skills:** none  
+**MCPs:** none
 
 Code implementation, refactoring, testing, verification. *Execute the plan - no research, no delegation, no planning.*
 
 ---
 
+## 🎚️ Presets
+
+Presets are pre-configured agent model mappings for different provider combinations. The installer generates these automatically based on your available providers, and you can switch between them instantly.
+
+### Switching Presets
+
+**Method 1: Edit Config File**
+
+Edit `~/.config/opencode/oh-my-opencode-slim.json` and change the `preset` field:
+
+```json
+{
+  "preset": "openai"
+}
+```
+
+**Method 2: Environment Variable**
+
+Set the environment variable before running OpenCode:
+
+```bash
+export OH_MY_OPENCODE_SLIM_PRESET=openai
+opencode
+```
+
+The environment variable takes precedence over the config file.
+
+
+### OpenAI Preset
+
+Uses OpenAI models exclusively:
+
+```json
+{
+  "preset": "openai",
+  "presets": {
+    "openai": {
+      "orchestrator": { "model": "openai/gpt-5.2-codex", "skills": ["*"], "mcps": ["websearch"] },
+      "oracle": { "model": "openai/gpt-5.2-codex", "variant": "high", "skills": [], "mcps": [] },
+      "librarian": { "model": "openai/gpt-5.1-codex-mini", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
+      "explorer": { "model": "openai/gpt-5.1-codex-mini", "variant": "low", "skills": [], "mcps": [] },
+      "designer": { "model": "openai/gpt-5.1-codex-mini", "variant": "medium", "skills": ["playwright"], "mcps": [] },
+      "fixer": { "model": "openai/gpt-5.1-codex-mini", "variant": "low", "skills": [], "mcps": [] }
+    }
+  }
+}
+```
+
+### Antigravity via CLIProxy Preset
+
+Routes through Antigravity's CLIProxy for Claude + Gemini models:
+
+```json
+{
+  "preset": "cliproxy",
+  "presets": {
+    "cliproxy": {
+      "orchestrator": { "model": "cliproxy/gemini-claude-opus-4-5-thinking", "skills": ["*"], "mcps": ["websearch"] },
+      "oracle": { "model": "cliproxy/gemini-3-pro-preview", "variant": "high", "skills": [], "mcps": [] },
+      "librarian": { "model": "cliproxy/gemini-3-flash-preview", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
+      "explorer": { "model": "cliproxy/gemini-3-flash-preview", "variant": "low", "skills": [], "mcps": [] },
+      "designer": { "model": "cliproxy/gemini-3-flash-preview", "variant": "medium", "skills": ["playwright"], "mcps": [] },
+      "fixer": { "model": "cliproxy/gemini-3-flash-preview", "variant": "low", "skills": [], "mcps": [] }
+    }
+  }
+}
+```
+
+Requires provider configuration:
+
+```json
+{
+  "provider": {
+    "cliproxy": {
+      "npm": "@ai-sdk/openai-compatible",
+      "name": "CliProxy",
+      "options": {
+        "baseURL": "http://127.0.0.1:8317/v1",
+        "apiKey": "your-api-key-1"
+      },
+      "models": {
+        "gemini-3-pro-high": {
+          "name": "Gemini 3 Pro High",
+          "thinking": true,
+          "attachment": true,
+          "limit": { "context": 1048576, "output": 65535 },
+          "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] }
+        },
+        "gemini-3-flash-preview": {
+          "name": "Gemini 3 Flash",
+          "attachment": true,
+          "limit": { "context": 1048576, "output": 65536 },
+          "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] }
+        },
+        "gemini-claude-opus-4-5-thinking": {
+          "name": "Claude Opus 4.5 Thinking",
+          "attachment": true,
+          "limit": { "context": 200000, "output": 32000 },
+          "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] }
+        },
+        "gemini-claude-sonnet-4-5-thinking": {
+          "name": "Claude Sonnet 4.5 Thinking",
+          "attachment": true,
+          "limit": { "context": 200000, "output": 32000 },
+          "modalities": { "input": [ "text", "image", "pdf" ], "output": [ "text" ] }
+        }
+      }
+    }
+  }
+}
+```
+
+### Author's Preset
+
+Mixed setup combining multiple providers:
+
+```json
+{
+  "preset": "alvin",
+  "presets": {
+    "alvin": {
+      "orchestrator": { "model": "cliproxy/gemini-claude-opus-4-5-thinking", "skills": ["*"], "mcps": ["*"] },
+      "oracle": { "model": "openai/gpt-5.2-codex", "variant": "high", "skills": [], "mcps": [] },
+      "librarian": { "model": "cliproxy/gemini-3-flash-preview", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
+      "explorer": { "model": "cerebras/zai-glm-4.7", "variant": "low", "skills": [], "mcps": [] },
+      "designer": { "model": "cliproxy/gemini-3-flash-preview", "variant": "medium", "skills": ["playwright"], "mcps": [] },
+      "fixer": { "model": "cerebras/zai-glm-4.7", "variant": "low", "skills": [], "mcps": [] }
+    }
+  }
+}
+```
+
+### Creating Custom Presets
+
+You can create your own presets by adding them to the `presets` object:
+
+```json
+{
+  "presets": {
+    "my-custom": {
+      "orchestrator": { "model": "google/claude-opus-4-5-thinking", "skills": ["*"], "mcps": ["websearch"] },
+      "oracle": { "model": "openai/gpt-5.2-codex", "variant": "high", "skills": [], "mcps": [] },
+      "librarian": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
+      "explorer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] },
+      "designer": { "model": "google/gemini-3-flash", "variant": "medium", "skills": ["playwright"], "mcps": [] },
+      "fixer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] }
+    }
+  }
+}
+```
+
+Then set `preset: "my-custom"` to activate it.
+
+### Option Reference
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `preset` | string | - | Name of the preset to use (e.g., `"openai"`, `"cliproxy"`) |
+| `presets` | object | - | Named preset configurations containing agent mappings |
+| `presets.<name>.<agent>.model` | string | - | Model ID for the agent (e.g., `"google/claude-opus-4-5-thinking"`) |
+| `presets.<name>.<agent>.temperature` | number | - | Temperature setting (0-2) for the agent |
+| `presets.<name>.<agent>.variant` | string | - | Agent variant for reasoning effort (e.g., `"low"`, `"medium"`, `"high"`) |
+| `presets.<name>.<agent>.skills` | string[] | - | Array of skill names the agent can use (`"*"` for all, `"!item"` to exclude) |
+| `presets.<name>.<agent>.mcps` | string[] | - | Array of MCP names the agent can use (`"*"` for all, `"!item"` to exclude) |
+
+---
+
 ## 🧩 Skills
 
 Skills are specialized capabilities that agents can use. Each agent has a default set of skills, which you can override in the agent config.
@@ -469,18 +667,6 @@ You can disable specific MCP servers globally by adding them to the `disabled_mc
 
 ---
 
-### Quota Tool
-
-For Antigravity users. You can trigger this at any time by asking the agent to **"check my quota"** or **"show status."**
-
-<img src="img/quota.png" alt="Antigravity Quota" width="600">
-
-| Tool | Description |
-|------|-------------|
-| `antigravity_quota` | Check API quota for all Antigravity accounts (compact view with progress bars) |
-
----
-
 ### Background Tasks
 
 The plugin provides tools to manage asynchronous work:
@@ -528,7 +714,7 @@ OpenCode automatically formats files after they're written or edited using langu
 
 ---
 
-## Configuration
+## ⚙️ Configuration
 
 ### Files You Edit
 
@@ -573,109 +759,12 @@ This allows you to fine-tune agent behavior without modifying the source code.
 
 ### Plugin Config (`oh-my-opencode-slim.json`)
 
-The installer generates this file based on your providers. You can manually customize it to mix and match models.
-
-### Presets
-
-The installer generates presets for different provider combinations. Switch between them by changing the `preset` field.
-
-<details open>
-<summary><b>Example: Antigravity + OpenAI (Recommended)</b></summary>
-
-```json
-{
-  "preset": "antigravity-openai",
-  "presets": {
-    "antigravity": {
-      "orchestrator": { "model": "google/claude-opus-4-5-thinking", "skills": ["*"], "mcps": ["websearch"] },
-      "oracle": { "model": "google/claude-opus-4-5-thinking", "variant": "high", "skills": [], "mcps": [] },
-      "librarian": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
-      "explorer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] },
-      "designer": { "model": "google/gemini-3-flash", "variant": "medium", "skills": ["playwright"], "mcps": [] },
-      "fixer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] }
-    },
-    "openai": {
-      "orchestrator": { "model": "openai/gpt-5.2-codex", "skills": ["*"], "mcps": ["websearch"] },
-      "oracle": { "model": "openai/gpt-5.2-codex", "variant": "high", "skills": [], "mcps": [] },
-      "librarian": { "model": "openai/gpt-5.1-codex-mini", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
-      "explorer": { "model": "openai/gpt-5.1-codex-mini", "variant": "low", "skills": [], "mcps": [] },
-      "designer": { "model": "openai/gpt-5.1-codex-mini", "variant": "medium", "skills": ["playwright"], "mcps": [] },
-      "fixer": { "model": "openai/gpt-5.1-codex-mini", "variant": "low", "skills": [], "mcps": [] }
-    },
-    "zen-free": {
-      "orchestrator": { "model": "opencode/grok-code", "skills": ["*"], "mcps": ["websearch"] },
-      "oracle": { "model": "opencode/grok-code", "variant": "high", "skills": [], "mcps": [] },
-      "librarian": { "model": "opencode/grok-code", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
-      "explorer": { "model": "opencode/grok-code", "variant": "low", "skills": [], "mcps": [] },
-      "designer": { "model": "opencode/grok-code", "variant": "medium", "skills": ["playwright"], "mcps": [] },
-      "fixer": { "model": "opencode/grok-code", "variant": "low", "skills": [], "mcps": [] }
-    },
-    "antigravity-openai": {
-      "orchestrator": { "model": "google/claude-opus-4-5-thinking", "skills": ["*"], "mcps": ["websearch"] },
-      "oracle": { "model": "openai/gpt-5.2-codex", "variant": "high", "skills": [], "mcps": [] },
-      "librarian": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
-      "explorer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] },
-      "designer": { "model": "google/gemini-3-flash", "variant": "medium", "skills": ["playwright"], "mcps": [] },
-      "fixer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] }
-    }
-  },
-  "tmux": {
-    "enabled": true,
-    "layout": "main-vertical",
-    "main_pane_size": 60
-  }
-}
-```
-</details>
-
-**Available Presets:**
-
-| Preset | Description |
-|--------|-------------|
-| `antigravity` | Google models (Claude Opus + Gemini Flash) |
-| `openai` | OpenAI models (GPT-5.2 + GPT-5.1-mini) |
-| `zen-free` | Free models (GLM-4.7 + Grok Code) |
-| `antigravity-openai` | Mixed: Antigravity for most agents, OpenAI for Oracle |
-
-#### Author's Preset
-
-The author's personal configuration using Cerebras for the Orchestrator:
-
-```json
-{
-  "cerebras": {
-    "orchestrator": { "model": "cerebras/zai-glm-4.7", "skills": ["*"], "mcps": ["websearch"] },
-    "oracle": { "model": "openai/gpt-5.2-codex", "variant": "high", "skills": [], "mcps": [] },
-    "librarian": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": ["websearch", "context7", "grep_app"] },
-    "explorer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] },
-    "designer": { "model": "google/gemini-3-flash", "variant": "medium", "skills": ["playwright"], "mcps": [] },
-    "fixer": { "model": "google/gemini-3-flash", "variant": "low", "skills": [], "mcps": [] }
-  }
-}
-```
-
-**Environment Variable Override:**
-
-You can override the preset using an environment variable:
-
-```bash
-export OH_MY_OPENCODE_SLIM_PRESET=openai
-opencode
-```
-
-The environment variable takes precedence over the `preset` field in the config file.
+The installer generates this file based on your providers. You can manually customize it to mix and match models. See the [Presets](#️-presets) section for detailed configuration options.
 
 #### Option Reference
 
 | Option | Type | Default | Description |
 |--------|------|---------|-------------|
-| `preset` | string | - | Name of the preset to use (e.g., `"antigravity"`, `"openai"`) |
-| `presets` | object | - | Named preset configurations containing agent mappings |
-| `presets.<name>.<agent>.model` | string | - | Model ID for the agent (e.g., `"google/claude-opus-4-5-thinking"`) |
-| `presets.<name>.<agent>.temperature` | number | - | Temperature setting (0-2) for the agent |
-| `presets.<name>.<agent>.variant` | string | - | Agent variant for reasoning effort (e.g., `"low"`, `"medium"`, `"high"`) |
-| `presets.<name>.<agent>.skills` | string[] | - | Array of skill names the agent can use (`"*"` for all, `"!item"` to exclude) |
-| `presets.<name>.<agent>.mcps` | string[] | - | Array of MCP names the agent can use (`"*"` for all, `"!item"` to exclude) |
 | `tmux.enabled` | boolean | `false` | Enable tmux pane spawning for sub-agents |
 | `tmux.layout` | string | `"main-vertical"` | Layout preset: `main-vertical`, `main-horizontal`, `tiled`, `even-horizontal`, `even-vertical` |
 | `tmux.main_pane_size` | number | `60` | Main pane size as percentage (20-80) |
@@ -685,7 +774,7 @@ The environment variable takes precedence over the `preset` field in the config
 
 ---
 
-## Uninstallation
+## 🗑️ Uninstallation
 
 1. **Remove the plugin from your OpenCode config**:
 
@@ -699,12 +788,12 @@ The environment variable takes precedence over the `preset` field in the config
 
 ---
 
-## Credits
+## 🙏 Credits
 
 This is a slimmed-down fork of [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) by [@code-yeongyu](https://github.com/code-yeongyu).
 
 ---
 
-## License
+## 📄 License
 
 MIT

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "oh-my-opencode-slim",
-  "version": "0.5.4",
+  "version": "0.5.5",
   "description": "Lightweight agent orchestration plugin for OpenCode - a slimmed-down fork of oh-my-opencode",
   "main": "dist/index.js",
   "types": "dist/index.d.ts",

+ 47 - 9
src/agents/designer.ts

@@ -1,17 +1,55 @@
 import type { AgentDefinition } from './orchestrator';
 
-const DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX engineer.
+const DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX specialist who creates intentional, polished experiences.
 
-**Role**: Craft stunning UI/UX even without design mockups.
+**Role**: Craft cohesive UI/UX that balances visual impact with usability.
 
-**Design Principles**:
-- Rich aesthetics that wow at first glance
-- Mobile-first responsive design
+## Design Principles
 
-**Constraints**:
-- Match existing design system if present
-- Use existing component libraries when available
-- Prioritize visual excellence over code perfection`;
+**Typography**
+- Choose distinctive, characterful fonts that elevate aesthetics
+- Avoid generic defaults (Arial, Inter)—opt for unexpected, beautiful choices
+- Pair display fonts with refined body fonts for hierarchy
+
+**Color & Theme**
+- Commit to a cohesive aesthetic with clear color variables
+- Dominant colors with sharp accents > timid, evenly-distributed palettes
+- Create atmosphere through intentional color relationships
+
+**Motion & Interaction**
+- Leverage framework animation utilities when available (Tailwind's transition/animation classes)
+- Focus on high-impact moments: orchestrated page loads with staggered reveals
+- Use scroll-triggers and hover states that surprise and delight
+- One well-timed animation > scattered micro-interactions
+- Drop to custom CSS/JS only when utilities can't achieve the vision
+
+**Spatial Composition**
+- Break conventions: asymmetry, overlap, diagonal flow, grid-breaking
+- Generous negative space OR controlled density—commit to the choice
+- Unexpected layouts that guide the eye
+
+**Visual Depth**
+- Create atmosphere beyond solid colors: gradient meshes, noise textures, geometric patterns
+- Layer transparencies, dramatic shadows, decorative borders
+- Contextual effects that match the aesthetic (grain overlays, custom cursors)
+
+**Styling Approach**
+- Default to Tailwind CSS utility classes when available—fast, maintainable, consistent
+- Use custom CSS when the vision requires it: complex animations, unique effects, advanced compositions
+- Balance utility-first speed with creative freedom where it matters
+
+**Match Vision to Execution**
+- Maximalist designs → elaborate implementation, extensive animations, rich effects
+- Minimalist designs → restraint, precision, careful spacing and typography
+- Elegance comes from executing the chosen vision fully, not halfway
+
+## Constraints
+- Respect existing design systems when present
+- Leverage component libraries where available
+- Prioritize visual excellence—code perfection comes second
+
+## Output Quality
+You're capable of extraordinary creative work. Commit fully to distinctive visions and show what's possible when breaking conventions thoughtfully.`;
 
 export function createDesignerAgent(
   model: string,

+ 104 - 155
src/agents/orchestrator.ts

@@ -7,184 +7,133 @@ export interface AgentDefinition {
 }
 
 const ORCHESTRATOR_PROMPT = `<Role>
-You are an AI coding orchestrator.
-
-**You are excellent in finding the best path towards achieving user's goals while optimizing speed, reliability, quality and cost.**
-**You are excellent in utilizing parallel background tasks and flow wisely for increased efficiency.**
-**You are excellent choosing the right order of actions to maximize quality, reliability, speed and cost.**
+You are an AI coding orchestrator that optimizes for quality, speed, cost, and reliability by delegating to specialists when it provides net efficiency gains.
 </Role>
 
 <Agents>
 
 @explorer
-- Role: Rapid repo search specialist with unuque set of tools
-- Capabilities: Uses glob, grep, and AST queries to map files, symbols, and patterns quickly
-- Tools/Constraints: Read-only reporting so others act on the findings
-- Triggers: "find", "where is", "search for", "which file", "locate"
-- Delegate to @explorer when you need things such as:
-  * locate the right file or definition
-  * understand repo structure before editing
-  * map symbol usage or references
-  * gather code context before coding
+- Role: Parallel search specialist for discovering unknowns across the codebase
+- Capabilities: Glob, grep, AST queries to locate files, symbols, patterns
+- **Delegate when:** Need to discover what exists before planning • Parallel searches speed discovery • Need summarized map vs full contents • Broad/uncertain scope
+- **Don't delegate when:** Know the path and need actual content • Need full file anyway • Single specific lookup • About to edit the file
 
 @librarian
-- Role: Documentation and library research expert
-- Capabilities: Pulls official docs and real-world examples, summarizes APIs, best practices, and caveats
-- Tools/Constraints: Read-only knowledge retrieval that feeds other agents
-- Triggers: "how does X library work", "docs for", "API reference", "best practice for"
-- Delegate to @librarian when you need things such as:
-  * up-to-date documentation
-  * API clarification
-  * official examples or usage guidance
-  * library-specific best practices
-  * dependency version caveats
+- Role: Authoritative source for current library docs and API references
+- Capabilities: Fetches latest official docs, examples, API signatures, version-specific behavior via grep_app MCP
+- **Delegate when:** Libraries with frequent API changes (React, Next.js, AI SDKs) • Complex APIs needing official examples (ORMs, auth) • Version-specific behavior matters • Unfamiliar library • Edge cases or advanced features • Nuanced best practices
+- **Don't delegate when:** Standard usage you're confident about (\`Array.map()\`, \`fetch()\`) • Simple stable APIs • General programming knowledge • Info already in conversation • Built-in language features
+- **Rule of thumb:** "How does this library work?" → @librarian. "How does programming work?" → yourself.
 
 @oracle
-- About: Orchestrator should not make high-risk architecture calls alone; oracle validates direction
-- Role: Architecture, debugging, and strategic reviewer
-- Capabilities: Evaluates trade-offs, spots system-level issues, frames debugging steps before large moves
-- Tools/Constraints: Advisory only; no direct code changes
-- Triggers: "should I", "why does", "review", "debug", "what's wrong", "tradeoffs"
-- Delegate to @oracle when you need things such as:
-  * architectural uncertainty resolved
-  * system-level trade-offs evaluated
-  * debugging guidance for complex issues
-  * verification of long-term reliability or safety
-  * risky refactors assessed
+- Role: Strategic advisor for high-stakes decisions and persistent problems
+- Capabilities: Deep architectural reasoning, system-level trade-offs, complex debugging
+- Tools/Constraints: Slow, expensive, high-quality—use sparingly when thoroughness beats speed
+- **Delegate when:** Major architectural decisions with long-term impact • Problems persisting after 2+ fix attempts • High-risk multi-system refactors • Costly trade-offs (performance vs maintainability) • Complex debugging with unclear root cause • Security/scalability/data integrity decisions • Genuinely uncertain and cost of wrong choice is high
+- **Don't delegate when:** Routine decisions you're confident about • First bug fix attempt • Straightforward trade-offs • Tactical "how" vs strategic "should" • Time-sensitive good-enough decisions • Quick research/testing can answer
+- **Rule of thumb:** Need senior architect review? → @oracle. Just do it and PR? → yourself.
 
 @designer
-- Role: UI/UX design leader
-- Capabilities: Shapes visual direction, interactions, and responsive polish for intentional experiences
-- Tools/Constraints: Executes aesthetic frontend work with design-first intent
-- Triggers: "styling", "responsive", "UI", "UX", "component design", "CSS", "animation"
-- Delegate to @designer when you need things such as:
-  * visual or interaction strategy
-  * responsive styling and polish
-  * thoughtful component layouts
-  * animation or transition storyboarding
-  * intentional typography/color direction
+- Role: UI/UX specialist for intentional, polished experiences
+- Capabilities: Visual direction, interactions, responsive layouts, design systems with aesthetic intent
+- **Delegate when:** User-facing interfaces needing polish • Responsive layouts • UX-critical components (forms, nav, dashboards) • Visual consistency systems • Animations/micro-interactions • Landing/marketing pages • Refining functional→delightful
+- **Don't delegate when:** Backend/logic with no visual • Quick prototypes where design doesn't matter yet
+- **Rule of thumb:** Users see it and polish matters? → @designer. Headless/functional? → yourself.
 
 @fixer
-- Role: Fast, cost-effective implementation specialist
-- Capabilities: Executes concrete plans efficiently once context and spec are solid
-- Tools/Constraints: Execution only; no research or delegation
-- Triggers: "implement", "refactor", "update", "change", "add feature", "fix bug"
-- Delegate to @fixer when you need things such as:
-  * concrete changes from a full spec
-  * rapid refactors with well-understood impact
-  * feature updates once design and plan are approved
-  * safe bug fixes with clear reproduction
-  * implementation of pre-populated plans
+- Role: Fast, parallel execution specialist for well-defined tasks
+- Capabilities: Efficient implementation when spec and context are clear
+- Tools/Constraints: Execution-focused—no research, no architectural decisions
+- **Delegate when:** Clearly specified with known approach • 3+ independent parallel tasks • Straightforward but time-consuming • Solid plan needing execution • Repetitive multi-location changes • Overhead < time saved by parallelization
+- **Don't delegate when:** Needs discovery/research/decisions • Single small change (<20 lines, one file) • Unclear requirements needing iteration • Explaining > doing • Tight integration with your current work • Sequential dependencies
+- **Parallelization:** 3+ independent tasks → spawn multiple @fixers. 1-2 simple tasks → do yourself.
+- **Rule of thumb:** Explaining > doing? → yourself. Can split to parallel streams? → multiple @fixers.
 
 </Agents>
 
-
 <Workflow>
-# Orchestrator Workflow Guide
-
-## Phase 1: Understand
-Parse the request thoroughly. Identify both explicit requirements and implicit needs.
-
----
-
-## Phase 2: Best Path Analysis
-For the given goal, determine the optimal approach by evaluating:
-- **Quality**: Will this produce the best possible outcome?
-- **Speed**: What's the fastest path without sacrificing quality?
-- **Cost**: Are we being token-efficient?
-- **Reliability**: Will this approach be robust and maintainable?
-
----
-
-## Phase 3: Delegation Gate (MANDATORY - DO NOT SKIP)
-**STOP.** Before ANY implementation, review agent delegation rules and select the best specialist(s).
-
-### Why Delegation Matters
-Each specialist delivers 10x better results in their domain:
-- **@designer** → Superior UI/UX designs you can't match → **improves quality**
-- **@librarian** → Finds documentation and references you'd miss → **improves speed + quality**
-- **@explorer** → Searches and researches faster than you → **improves speed**
-- **@oracle** → Catches architectural issues you'd overlook → **improves quality + reliability**
-- **@fixer** → Executes pre-planned implementations faster → **improves speed + cost**
-
-### Delegation Best Practices
-When delegating tasks:
-- **Use file paths/line references, NOT file contents**: Reference like \`"see src/components/Header.ts:42-58"\` instead of pasting entire files
-- **Provide context, not dumps**: Summarize what's relevant from research; let specialists read what they need
-- **Token efficiency**: Large content pastes waste tokens, degrade performance, and can hit context limits
-- **Clear instructions**: Give specialists specific objectives and success criteria
-- **Let user know**: Before each delegation let user know very briefly about the delegation goal and reason
-
-### Fixer-Orchestrator Relationship
-The Orchestrator is intelligent enough to understand when delegating to Fixer is
-inefficient. If a task is simple enough that the overhead of creating context
-and delegating would equal or exceed the actual implementation effort, the
-Orchestrator handles it directly.
-
-The Orchestrator leverages Fixer's ability to spawn in parallel, which
-accelerates progress toward its ultimate goal while maintaining control over the
-execution plan and path.
-
-**Key Principles:**
-- **Cost-benefit analysis**: Delegation only occurs when it provides net efficiency gains
-- **Parallel execution**: Multiple Fixer instances can run simultaneously for independent tasks
-- **Centralized control**: Orchestrator maintains oversight of the overall execution strategy
-- **Smart task routing**: Simple tasks are handled directly; complex or parallelizable tasks are delegated
-
----
-
-## Phase 4: Parallelization Strategy
-Before executing, ask yourself: should the task split into subtasks and scheduled in parallel?
-- Can independent research tasks run simultaneously? (e.g., @explorer + @librarian)
-- Are there multiple UI components that @designer can work on concurrently?
-- Can @fixer handle multiple isolated implementation tasks at once?
-- Multiple @explorer instances for different search domains?
-- etc
-
-### Balance considerations:
-- Consider task dependencies: what MUST finish before other tasks can start?
-
----
-
-## Phase 5: Plan & Execute
-1. **Create todo lists** as needed (break down complex tasks)
-2. **Fire background research** (@explorer, @librarian) in parallel as needed
-3. **Delegate implementation** to specialists based on Phase 3 checklist
-4. **Only do work yourself** if NO specialist applies
-5. **Integrate results** from specialists
-6. **Monitor progress** and adjust strategy if needed
-
----
-
-## Phase 6: Verify
-- Run \`lsp_diagnostics\` to check for errors
-- Suggest user run \`simplify\` skill when applicable
-- Verify all delegated tasks completed successfully
-- Confirm the solution meets original requirements (Phase 1)
+
+## 1. Understand
+Parse request: explicit requirements + implicit needs.
+
+## 2. Path Analysis
+Evaluate approach by: quality, speed, cost, reliability.
+Choose the path that optimizes all four.
+
+## 3. Delegation Check
+**STOP. Review specialists before acting.**
+
+Each specialist delivers 10x results in their domain:
+- @explorer → Parallel discovery when you need to find unknowns, not read knowns
+- @librarian → Complex/evolving APIs where docs prevent errors, not basic usage
+- @oracle → High-stakes decisions where wrong choice is costly, not routine calls
+- @designer → User-facing experiences where polish matters, not internal logic  
+- @fixer → Parallel execution of clear specs, not explaining trivial changes
+
+**Delegation efficiency:**
+- Reference paths/lines, don't paste files (\`src/app.ts:42\` not full contents)
+- Provide context summaries, let specialists read what they need
+- Brief user on delegation goal before each call
+- Skip delegation if overhead ≥ doing it yourself
+
+**Fixer parallelization:**
+- 3+ independent tasks? Spawn multiple @fixers simultaneously
+- 1-2 simple tasks? Do it yourself
+- Sequential dependencies? Handle serially or do yourself
+
+## 4. Parallelize
+Can tasks run simultaneously?
+- Multiple @explorer searches across different domains?
+- @explorer + @librarian research in parallel?
+- Multiple @fixer instances for independent changes?
+
+Balance: respect dependencies, avoid parallelizing what must be sequential.
+
+## 5. Execute
+1. Break complex tasks into todos if needed
+2. Fire parallel research/implementation
+3. Delegate to specialists or do it yourself based on step 3
+4. Integrate results
+5. Adjust if needed
+
+## 6. Verify
+- Run \`lsp_diagnostics\` for errors
+- Suggest \`simplify\` skill when applicable
+- Confirm specialists completed successfully
+- Verify solution meets requirements
 
 </Workflow>
 
-## Communication Style
+<Communication>
 
-### Be Concise
-- Answer directly without preamble
+## Clarity Over Assumptions
+- If request is vague or has multiple valid interpretations, ask a targeted question before proceeding
+- Don't guess at critical details (file paths, API choices, architectural decisions)
+- Do make reasonable assumptions for minor details and state them briefly
+
+## Concise Execution
+- Answer directly, no preamble
 - Don't summarize what you did unless asked
-- Don't explain your code unless asked
-- One word answers are acceptable when appropriate
-
-### No Flattery
-Never start responses with:
-- "Great question!"
-- "That's a really good idea!"
-- "Excellent choice!"
-- Any praise of the user's input
-
-### When User is Wrong
-If the user's approach seems problematic:
-- Don't blindly implement it
-- Don't lecture or be preachy
-- Concisely state your concern and alternative
+- Don't explain code unless asked
+- One-word answers are fine when appropriate
+- Brief delegation notices: "Checking docs via @librarian..." not "I'm going to delegate to @librarian because..."
+
+## No Flattery
+Never: "Great question!" "Excellent idea!" "Smart choice!" or any praise of user input.
+
+## Honest Pushback
+When user's approach seems problematic:
+- State concern + alternative concisely
 - Ask if they want to proceed anyway
+- Don't lecture, don't blindly implement
+
+## Example
+**Bad:** "Great question! Let me think about the best approach here. I'm going to delegate to @librarian to check the latest Next.js documentation for the App Router, and then I'll implement the solution for you."
+
+**Good:** "Checking Next.js App Router docs via @librarian..."
+[proceeds with implementation]
+
+</Communication>
 `;
 
 export function createOrchestratorAgent(

+ 11 - 26
src/cli/config-io.test.ts

@@ -11,7 +11,6 @@ import {
 import { tmpdir } from 'node:os';
 import { join } from 'node:path';
 import {
-  addAuthPlugins,
   addPluginToOpenCodeConfig,
   addProviderConfig,
   detectCurrentConfig,
@@ -121,28 +120,9 @@ describe('config-io', () => {
     expect(saved.plugin.length).toBe(2);
   });
 
-  test('addAuthPlugins adds antigravity auth plugin', async () => {
-    const configPath = join(tmpDir, 'opencode', 'opencode.json');
-    paths.ensureConfigDir();
-    writeFileSync(configPath, JSON.stringify({}));
-
-    mock.module('./system', () => ({
-      fetchLatestVersion: async () => '1.2.3',
-    }));
-
-    const result = await addAuthPlugins({
-      hasAntigravity: true,
-      hasOpenAI: false,
-      hasOpencodeZen: false,
-      hasTmux: false,
-    });
-    expect(result.success).toBe(true);
-
-    const saved = JSON.parse(readFileSync(configPath, 'utf-8'));
-    expect(saved.plugin).toContain('opencode-antigravity-auth@1.2.3');
-  });
+  // Removed: addAuthPlugins test - auth plugin no longer used with cliproxy
 
-  test('addProviderConfig adds google provider config', () => {
+  test('addProviderConfig adds cliproxy provider config', () => {
     const configPath = join(tmpDir, 'opencode', 'opencode.json');
     paths.ensureConfigDir();
     writeFileSync(configPath, JSON.stringify({}));
@@ -156,7 +136,7 @@ describe('config-io', () => {
     expect(result.success).toBe(true);
 
     const saved = JSON.parse(readFileSync(configPath, 'utf-8'));
-    expect(saved.provider.google).toBeDefined();
+    expect(saved.provider.cliproxy).toBeDefined();
   });
 
   test('writeLiteConfig writes lite config', () => {
@@ -172,8 +152,8 @@ describe('config-io', () => {
     expect(result.success).toBe(true);
 
     const saved = JSON.parse(readFileSync(litePath, 'utf-8'));
-    expect(saved.preset).toBe('antigravity');
-    expect(saved.presets.antigravity).toBeDefined();
+    expect(saved.preset).toBe('cliproxy');
+    expect(saved.presets.cliproxy).toBeDefined();
     expect(saved.tmux.enabled).toBe(true);
   });
 
@@ -198,7 +178,12 @@ describe('config-io', () => {
     writeFileSync(
       configPath,
       JSON.stringify({
-        plugin: ['oh-my-opencode-slim', 'opencode-antigravity-auth'],
+        plugin: ['oh-my-opencode-slim'],
+        provider: {
+          cliproxy: {
+            npm: '@ai-sdk/openai-compatible',
+          },
+        },
       }),
     );
     writeFileSync(

+ 7 - 46
src/cli/config-io.ts

@@ -12,8 +12,7 @@ import {
   getExistingConfigPath,
   getLiteConfig,
 } from './paths';
-import { GOOGLE_PROVIDER_CONFIG, generateLiteConfig } from './providers';
-import { fetchLatestVersion } from './system';
+import { CLIPROXY_PROVIDER_CONFIG, generateLiteConfig } from './providers';
 import type {
   ConfigMergeResult,
   DetectedConfig,
@@ -138,46 +137,7 @@ export async function addPluginToOpenCodeConfig(): Promise<ConfigMergeResult> {
   }
 }
 
-export async function addAuthPlugins(
-  installConfig: InstallConfig,
-): Promise<ConfigMergeResult> {
-  const configPath = getExistingConfigPath();
-
-  try {
-    ensureConfigDir();
-    const { config: parsedConfig, error } = parseConfig(configPath);
-    if (error) {
-      return {
-        success: false,
-        configPath,
-        error: `Failed to parse config: ${error}`,
-      };
-    }
-    const config = parsedConfig ?? {};
-    const plugins = config.plugin ?? [];
-
-    if (installConfig.hasAntigravity) {
-      const version = await fetchLatestVersion('opencode-antigravity-auth');
-      const pluginEntry = version
-        ? `opencode-antigravity-auth@${version}`
-        : 'opencode-antigravity-auth@latest';
-
-      if (!plugins.some((p) => p.startsWith('opencode-antigravity-auth'))) {
-        plugins.push(pluginEntry);
-      }
-    }
-
-    config.plugin = plugins;
-    writeConfig(configPath, config);
-    return { success: true, configPath };
-  } catch (err) {
-    return {
-      success: false,
-      configPath,
-      error: `Failed to add auth plugins: ${err}`,
-    };
-  }
-}
+// Removed: addAuthPlugins - no longer needed with cliproxy
 
 export function addProviderConfig(
   installConfig: InstallConfig,
@@ -198,7 +158,7 @@ export function addProviderConfig(
 
     if (installConfig.hasAntigravity) {
       const providers = (config.provider ?? {}) as Record<string, unknown>;
-      providers.google = GOOGLE_PROVIDER_CONFIG.google;
+      providers.cliproxy = CLIPROXY_PROVIDER_CONFIG.cliproxy;
       config.provider = providers;
     }
 
@@ -290,9 +250,10 @@ export function detectCurrentConfig(): DetectedConfig {
 
   const plugins = config.plugin ?? [];
   result.isInstalled = plugins.some((p) => p.startsWith(PACKAGE_NAME));
-  result.hasAntigravity = plugins.some((p) =>
-    p.startsWith('opencode-antigravity-auth'),
-  );
+
+  // Check for cliproxy provider instead of auth plugin
+  const providers = config.provider as Record<string, unknown> | undefined;
+  result.hasAntigravity = !!providers?.cliproxy;
 
   // Try to detect from lite config
   const { config: liteConfig } = parseConfig(getLiteConfig());

+ 29 - 15
src/cli/install.ts

@@ -1,6 +1,5 @@
 import * as readline from 'node:readline/promises';
 import {
-  addAuthPlugins,
   addPluginToOpenCodeConfig,
   addProviderConfig,
   detectCurrentConfig,
@@ -189,12 +188,9 @@ async function runInteractiveMode(
 
   try {
     console.log(`${BOLD}Question 1/${totalQuestions}:${RESET}`);
-    printInfo(
-      "The Pantheon is tuned for Antigravity's model routing. Other models work, but results may vary.",
-    );
     const antigravity = await askYesNo(
       rl,
-      'Do you have an Antigravity subscription?',
+      'Do you have an Antigravity subscription (via cliproxy)?',
       'yes',
     );
     console.log();
@@ -236,7 +232,7 @@ async function runInstall(config: InstallConfig): Promise<number> {
 
   // Calculate total steps dynamically
   let totalSteps = 4; // Base: check opencode, add plugin, disable default agents, write lite config
-  if (config.hasAntigravity) totalSteps += 2; // auth plugins + provider config
+  if (config.hasAntigravity) totalSteps += 1; // provider config only (no auth plugin needed)
 
   let step = 1;
 
@@ -253,13 +249,10 @@ async function runInstall(config: InstallConfig): Promise<number> {
   if (!handleStepResult(agentResult, 'Default agents disabled')) return 1;
 
   if (config.hasAntigravity) {
-    printStep(step++, totalSteps, 'Adding auth plugins...');
-    const authResult = await addAuthPlugins(config);
-    if (!handleStepResult(authResult, 'Auth plugins configured')) return 1;
-
-    printStep(step++, totalSteps, 'Adding provider configurations...');
+    printStep(step++, totalSteps, 'Adding cliproxy provider configuration...');
     const providerResult = addProviderConfig(config);
-    if (!handleStepResult(providerResult, 'Providers configured')) return 1;
+    if (!handleStepResult(providerResult, 'Cliproxy provider configured'))
+      return 1;
   }
 
   printStep(step++, totalSteps, 'Writing oh-my-opencode-slim configuration...');
@@ -287,9 +280,30 @@ async function runInstall(config: InstallConfig): Promise<number> {
   console.log();
 
   let nextStep = 1;
-  console.log(`  ${nextStep++}. Authenticate with your providers:`);
-  console.log(`     ${BLUE}$ opencode auth login${RESET}`);
-  console.log();
+
+  if (config.hasAntigravity) {
+    console.log(`  ${nextStep++}. Install cliproxy:`);
+    console.log(`     ${DIM}macOS:${RESET}`);
+    console.log(`       ${BLUE}$ brew install cliproxyapi${RESET}`);
+    console.log(`       ${BLUE}$ brew services start cliproxyapi${RESET}`);
+    console.log(`     ${DIM}Linux:${RESET}`);
+    console.log(
+      `       ${BLUE}$ curl -fsSL https://raw.githubusercontent.com/brokechubb/cliproxyapi-installer/refs/heads/master/cliproxyapi-installer | bash${RESET}`,
+    );
+    console.log();
+    console.log(`  ${nextStep++}. Authenticate with Antigravity via OAuth:`);
+    console.log(`     ${BLUE}$ ./cli-proxy-api --antigravity-login${RESET}`);
+    console.log(
+      `     ${DIM}(Add --no-browser to print login URL instead of opening browser)${RESET}`,
+    );
+    console.log();
+  }
+
+  if (config.hasOpenAI || !config.hasAntigravity) {
+    console.log(`  ${nextStep++}. Authenticate with your providers:`);
+    console.log(`     ${BLUE}$ opencode auth login${RESET}`);
+    console.log();
+  }
 
   // TODO: tmux has a bug, disabled for now
   // if (config.hasTmux) {

+ 13 - 13
src/cli/providers.test.ts

@@ -12,15 +12,15 @@ describe('providers', () => {
       hasTmux: false,
     });
 
-    expect(config.preset).toBe('antigravity');
-    const agents = (config.presets as any).antigravity;
+    expect(config.preset).toBe('cliproxy');
+    const agents = (config.presets as any).cliproxy;
     expect(agents).toBeDefined();
     expect(agents.orchestrator.model).toBe(
-      MODEL_MAPPINGS.antigravity.orchestrator.model,
+      'cliproxy/gemini-claude-opus-4-5-thinking',
     );
     expect(agents.orchestrator.variant).toBeUndefined();
-    expect(agents.fixer.model).toBe(MODEL_MAPPINGS.antigravity.fixer.model);
-    expect(agents.fixer.variant).toBe(MODEL_MAPPINGS.antigravity.fixer.variant);
+    expect(agents.fixer.model).toBe('cliproxy/gemini-3-flash-preview');
+    expect(agents.fixer.variant).toBe('low');
     // Should NOT include other presets
     expect((config.presets as any).openai).toBeUndefined();
     expect((config.presets as any)['zen-free']).toBeUndefined();
@@ -34,18 +34,18 @@ describe('providers', () => {
       hasTmux: false,
     });
 
-    expect(config.preset).toBe('antigravity-openai');
-    const agents = (config.presets as any)['antigravity-openai'];
+    expect(config.preset).toBe('cliproxy');
+    const agents = (config.presets as any).cliproxy;
     expect(agents).toBeDefined();
     expect(agents.orchestrator.model).toBe(
-      MODEL_MAPPINGS.antigravity.orchestrator.model,
+      'cliproxy/gemini-claude-opus-4-5-thinking',
     );
     expect(agents.orchestrator.variant).toBeUndefined();
     expect(agents.oracle.model).toBe('openai/gpt-5.2-codex');
     expect(agents.oracle.variant).toBe('high');
     // Should NOT include other presets
-    expect((config.presets as any).antigravity).toBeUndefined();
     expect((config.presets as any).openai).toBeUndefined();
+    expect((config.presets as any)['zen-free']).toBeUndefined();
   });
 
   test('generateLiteConfig generates openai preset when only openai selected', () => {
@@ -64,7 +64,7 @@ describe('providers', () => {
     );
     expect(agents.orchestrator.variant).toBeUndefined();
     // Should NOT include other presets
-    expect((config.presets as any).antigravity).toBeUndefined();
+    expect((config.presets as any).cliproxy).toBeUndefined();
     expect((config.presets as any)['zen-free']).toBeUndefined();
   });
 
@@ -82,7 +82,7 @@ describe('providers', () => {
     expect(agents.orchestrator.model).toBe('opencode/grok-code');
     expect(agents.orchestrator.variant).toBeUndefined();
     // Should NOT include other presets
-    expect((config.presets as any).antigravity).toBeUndefined();
+    expect((config.presets as any).cliproxy).toBeUndefined();
     expect((config.presets as any).openai).toBeUndefined();
   });
 
@@ -123,7 +123,7 @@ describe('providers', () => {
       hasTmux: false,
     });
 
-    const agents = (config.presets as any).antigravity;
+    const agents = (config.presets as any).cliproxy;
     expect(agents.orchestrator.skills).toContain('*');
     expect(agents.fixer.skills).toBeDefined();
   });
@@ -136,7 +136,7 @@ describe('providers', () => {
       hasTmux: false,
     });
 
-    const agents = (config.presets as any).antigravity;
+    const agents = (config.presets as any).cliproxy;
     expect(agents.orchestrator.mcps).toBeDefined();
     expect(Array.isArray(agents.orchestrator.mcps)).toBe(true);
     expect(agents.librarian.mcps).toBeDefined();

+ 135 - 45
src/cli/providers.ts

@@ -5,11 +5,16 @@ import {
 import type { InstallConfig } from './types';
 
 /**
- * Provider configurations for Google models (via Antigravity auth plugin)
+ * Provider configurations for Cliproxy (Antigravity via cliproxy)
  */
-export const GOOGLE_PROVIDER_CONFIG = {
-  google: {
-    name: 'Google',
+export const CLIPROXY_PROVIDER_CONFIG = {
+  cliproxy: {
+    npm: '@ai-sdk/openai-compatible',
+    name: 'CliProxy',
+    options: {
+      baseURL: 'http://127.0.0.1:8317/v1',
+      apiKey: 'your-api-key-1',
+    },
     models: {
       'gemini-3-pro-high': {
         name: 'Gemini 3 Pro High',
@@ -18,19 +23,19 @@ export const GOOGLE_PROVIDER_CONFIG = {
         limit: { context: 1048576, output: 65535 },
         modalities: { input: ['text', 'image', 'pdf'], output: ['text'] },
       },
-      'gemini-3-flash': {
+      'gemini-3-flash-preview': {
         name: 'Gemini 3 Flash',
         attachment: true,
         limit: { context: 1048576, output: 65536 },
         modalities: { input: ['text', 'image', 'pdf'], output: ['text'] },
       },
-      'claude-opus-4-5-thinking': {
+      'gemini-claude-opus-4-5-thinking': {
         name: 'Claude Opus 4.5 Thinking',
         attachment: true,
         limit: { context: 200000, output: 32000 },
         modalities: { input: ['text', 'image', 'pdf'], output: ['text'] },
       },
-      'claude-sonnet-4-5-thinking': {
+      'gemini-claude-sonnet-4-5-thinking': {
         name: 'Claude Sonnet 4.5 Thinking',
         attachment: true,
         limit: { context: 200000, output: 32000 },
@@ -43,12 +48,12 @@ export const GOOGLE_PROVIDER_CONFIG = {
 // Model mappings by provider priority
 export const MODEL_MAPPINGS = {
   antigravity: {
-    orchestrator: { model: 'google/claude-opus-4-5-thinking' },
-    oracle: { model: 'google/claude-opus-4-5-thinking', variant: 'high' },
-    librarian: { model: 'google/gemini-3-flash', variant: 'low' },
-    explorer: { model: 'google/gemini-3-flash', variant: 'low' },
-    designer: { model: 'google/gemini-3-flash', variant: 'medium' },
-    fixer: { model: 'google/gemini-3-flash', variant: 'low' },
+    orchestrator: { model: 'cliproxy/gemini-claude-opus-4-5-thinking' },
+    oracle: { model: 'cliproxy/gemini-3-pro-preview', variant: 'high' },
+    librarian: { model: 'cliproxy/gemini-3-flash-preview', variant: 'low' },
+    explorer: { model: 'cliproxy/gemini-3-flash-preview', variant: 'low' },
+    designer: { model: 'cliproxy/gemini-3-flash-preview', variant: 'medium' },
+    fixer: { model: 'cliproxy/gemini-3-flash-preview', variant: 'low' },
   },
   openai: {
     orchestrator: { model: 'openai/gpt-5.2-codex' },
@@ -76,50 +81,135 @@ export function generateLiteConfig(
     presets: {},
   };
 
-  const createAgents = (
-    models: Record<string, { model: string; variant?: string }>,
-  ): Record<
-    string,
-    { model: string; variant?: string; skills: string[]; mcps: string[] }
-  > =>
-    Object.fromEntries(
-      Object.entries(models).map(([k, v]) => [
-        k,
-        {
-          model: v.model,
-          variant: v.variant,
-          skills:
-            DEFAULT_AGENT_SKILLS[k as keyof typeof DEFAULT_AGENT_SKILLS] ?? [],
-          mcps: DEFAULT_AGENT_MCPS[k as keyof typeof DEFAULT_AGENT_MCPS] ?? [],
-        },
-      ]),
-    );
-
   // Only generate preset based on user selection
   if (installConfig.hasAntigravity && installConfig.hasOpenAI) {
-    // Mixed preset: antigravity base with OpenAI oracle
-    const mixedAgents: Record<string, { model: string; variant?: string }> = {
-      ...MODEL_MAPPINGS.antigravity,
+    // Mixed preset: cliproxy base with OpenAI oracle
+    (config.presets as Record<string, unknown>).cliproxy = {
+      orchestrator: {
+        model: 'cliproxy/gemini-claude-opus-4-5-thinking',
+        skills: ['*'],
+        mcps: ['websearch'],
+      },
+      oracle: {
+        model: 'openai/gpt-5.2-codex',
+        variant: 'high',
+        skills: [],
+        mcps: [],
+      },
+      librarian: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'low',
+        skills: [],
+        mcps: ['websearch', 'context7', 'grep_app'],
+      },
+      explorer: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'low',
+        skills: [],
+        mcps: [],
+      },
+      designer: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'medium',
+        skills: ['playwright'],
+        mcps: [],
+      },
+      fixer: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'low',
+        skills: [],
+        mcps: [],
+      },
     };
-    mixedAgents.oracle = { model: 'openai/gpt-5.2-codex', variant: 'high' };
-    (config.presets as Record<string, unknown>)['antigravity-openai'] =
-      createAgents(mixedAgents);
-
-    config.preset = 'antigravity-openai';
+    config.preset = 'cliproxy';
   } else if (installConfig.hasAntigravity) {
-    // Antigravity only
-    (config.presets as Record<string, unknown>).antigravity = createAgents(
-      MODEL_MAPPINGS.antigravity,
-    );
-    config.preset = 'antigravity';
+    // Cliproxy only
+    (config.presets as Record<string, unknown>).cliproxy = {
+      orchestrator: {
+        model: 'cliproxy/gemini-claude-opus-4-5-thinking',
+        skills: ['*'],
+        mcps: ['websearch'],
+      },
+      oracle: {
+        model: 'cliproxy/gemini-3-pro-preview',
+        variant: 'high',
+        skills: [],
+        mcps: [],
+      },
+      librarian: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'low',
+        skills: [],
+        mcps: ['websearch', 'context7', 'grep_app'],
+      },
+      explorer: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'low',
+        skills: [],
+        mcps: [],
+      },
+      designer: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'medium',
+        skills: ['playwright'],
+        mcps: [],
+      },
+      fixer: {
+        model: 'cliproxy/gemini-3-flash-preview',
+        variant: 'low',
+        skills: [],
+        mcps: [],
+      },
+    };
+    config.preset = 'cliproxy';
   } else if (installConfig.hasOpenAI) {
     // OpenAI only
+    const createAgents = (
+      models: Record<string, { model: string; variant?: string }>,
+    ): Record<
+      string,
+      { model: string; variant?: string; skills: string[]; mcps: string[] }
+    > =>
+      Object.fromEntries(
+        Object.entries(models).map(([k, v]) => [
+          k,
+          {
+            model: v.model,
+            variant: v.variant,
+            skills:
+              DEFAULT_AGENT_SKILLS[k as keyof typeof DEFAULT_AGENT_SKILLS] ??
+              [],
+            mcps:
+              DEFAULT_AGENT_MCPS[k as keyof typeof DEFAULT_AGENT_MCPS] ?? [],
+          },
+        ]),
+      );
     (config.presets as Record<string, unknown>).openai = createAgents(
       MODEL_MAPPINGS.openai,
     );
     config.preset = 'openai';
   } else {
     // Zen free only
+    const createAgents = (
+      models: Record<string, { model: string; variant?: string }>,
+    ): Record<
+      string,
+      { model: string; variant?: string; skills: string[]; mcps: string[] }
+    > =>
+      Object.fromEntries(
+        Object.entries(models).map(([k, v]) => [
+          k,
+          {
+            model: v.model,
+            variant: v.variant,
+            skills:
+              DEFAULT_AGENT_SKILLS[k as keyof typeof DEFAULT_AGENT_SKILLS] ??
+              [],
+            mcps:
+              DEFAULT_AGENT_MCPS[k as keyof typeof DEFAULT_AGENT_MCPS] ?? [],
+          },
+        ]),
+      );
     (config.presets as Record<string, unknown>)['zen-free'] = createAgents(
       MODEL_MAPPINGS['zen-free'],
     );

+ 1 - 1
src/hooks/phase-reminder/index.ts

@@ -8,7 +8,7 @@
  *
  * Uses experimental.chat.messages.transform so it doesn't show in UI.
  */
-const PHASE_REMINDER = `<reminder>⚠️ MANDATORY: Understand→DELEGATE(!)→Split-and-Parallelize(?)→Plan→Execute→Verify
+const PHASE_REMINDER = `<reminder>⚠️ MANDATORY: Understand→DELEGATE(! based on each agent rules)→Split-and-Parallelize(?)→Plan→Execute→Verify
 Available Specialist: @oracle @librarian @explorer @designer @fixer
 </reminder>`;
 

+ 1 - 1
src/hooks/post-read-nudge/index.ts

@@ -4,7 +4,7 @@
  */
 
 const NUDGE =
-  "\n\n---\nConsider: splitting the task to parallelize, delegate to specialist(s). (if so, reference file paths/lines—don't copy file contents)";
+  "\n\n---\nReminder to follow the workflow instructions, consider delegation to specialist(s)";
 
 interface ToolExecuteAfterInput {
   tool: string;