cc-mirror 1.4.2 → 1.6.1

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
@@ -10,55 +10,129 @@
10
10
  <a href="https://twitter.com/nummanali"><img src="https://img.shields.io/twitter/follow/nummanali?style=social" alt="Twitter Follow"></a>
11
11
  </p>
12
12
 
13
+ <h2 align="center">Claude Code, Unshackled</h2>
14
+
13
15
  <p align="center">
14
- <strong>Create multiple isolated Claude Code variants with custom providers.</strong>
16
+ Pre-configured Claude Code variants with multi-agent orchestration,<br>
17
+ custom providers, and battle-tested enhancements.<br><br>
18
+ <strong>One command. Instant power-up.</strong>
15
19
  </p>
16
20
 
17
21
  ---
18
22
 
19
- ## What is CC-MIRROR?
23
+ ## The Unlock
24
+
25
+ Claude Code has a hidden multi-agent capability. CC-MIRROR enables it.
20
26
 
21
27
  ```
22
- ┌────────────────────────────────────────────────────────────────────────────────┐
23
-
24
- One tool. Multiple Claude Code instances. Complete isolation.
25
-
26
- ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
27
- zai │ minimax │ │openrouter│ │ ccrouter │ │ mclaude │ │
28
- │ │ GLM-4.7 M2.1 100+ LLMs│ │ Local │ │ Claude │ │
29
- └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
30
-
31
- └──────────────┴──────────────┴──────────────┴──────────────┘
32
-
33
- ┌──────────▼──────────┐
34
- Claude Code
35
- (isolated) │ │
36
- └─────────────────────┘
37
- │ │
38
- └────────────────────────────────────────────────────────────────────────────────┘
28
+ ┌─────────────────────────────────────────────────────────────────────────────┐
29
+
30
+ BEFORE AFTER
31
+ ══════ ═════
32
+
33
+ ┌─────────────────┐ ┌─────────────────────────────────┐
34
+ │ │ Claude Code YOUR Claude Code │ │
35
+ │ │ CC-MIRROR │ │
36
+ • Single ─────────► ✓ Multi-Agent Orchestration
37
+ config │ │ ✓ Task-based Coordination │ │
38
+ • No team │ ✓ Background Agent Spawning │ │
39
+ mode │ │ ✓ Battle-tested Skill │ │
40
+ │ │ ✓ Isolated Config
41
+ └─────────────────┘ └─────────────────────────────────┘
42
+
43
+ └─────────────────────────────────────────────────────────────────────────────┘
39
44
  ```
40
45
 
41
- CC-MIRROR creates **isolated Claude Code instances** that connect to different AI providers. Each variant has its own config, sessions, themes, and API credentials — completely separate from each other.
46
+ **What gets unlocked:**
47
+
48
+ | Tool | Purpose |
49
+ | ------------ | -------------------------------------------------------- |
50
+ | `TaskCreate` | Create tasks with subject, description, and dependencies |
51
+ | `TaskGet` | Retrieve full task details by ID |
52
+ | `TaskUpdate` | Update status, add comments, set blockers |
53
+ | `TaskList` | List all tasks with summary info |
54
+
55
+ Plus a **battle-tested orchestrator skill** — refined through millions of tokens of iteration — that teaches Claude how to effectively coordinate multiple agents working in parallel.
42
56
 
43
57
  ---
44
58
 
45
- ## Quick Start
59
+ ## Quick Start
46
60
 
47
61
  ```bash
48
- # Run the interactive TUI
49
- npx cc-mirror
62
+ # Fastest path to multi-agent Claude Code
63
+ npx cc-mirror quick --provider mirror --name mclaude
50
64
 
51
- # Or quick setup from CLI
52
- npx cc-mirror quick --provider zai --api-key "$Z_AI_API_KEY"
65
+ # Run it
66
+ mclaude
53
67
  ```
54
68
 
69
+ That's it. You now have Claude Code with team mode enabled.
70
+
55
71
  <p align="center">
56
72
  <img src="./assets/cc-mirror-home.png" alt="CC-MIRROR Home Screen" width="600">
57
73
  </p>
58
74
 
75
+ ### Or use the interactive wizard
76
+
77
+ ```bash
78
+ npx cc-mirror
79
+ ```
80
+
59
81
  ---
60
82
 
61
- ## 🔌 Supported Providers
83
+ ## What is CC-MIRROR?
84
+
85
+ CC-MIRROR is an **opinionated Claude Code distribution**. We did the hacking — you get the superpowers.
86
+
87
+ At its core, CC-MIRROR:
88
+
89
+ 1. **Clones** Claude Code into isolated instances
90
+ 2. **Patches** the CLI to enable hidden features (team mode)
91
+ 3. **Installs** battle-tested skills (orchestrator, browser automation)
92
+ 4. **Configures** provider-specific enhancements
93
+ 5. **Packages** everything into a single command
94
+
95
+ Each variant is completely isolated — its own config, sessions, MCP servers, and credentials. Your main Claude Code installation stays untouched.
96
+
97
+ ```
98
+ ┌─────────────────────────────────────────────────────────────────────────┐
99
+ │ ~/.cc-mirror/ │
100
+ │ │
101
+ │ ├── mclaude/ ← Mirror Claude (team mode) │
102
+ │ │ ├── npm/ Claude Code installation │
103
+ │ │ ├── config/ API keys, sessions, MCP servers │
104
+ │ │ │ ├── tasks/<team>/ Team task storage │
105
+ │ │ │ └── skills/orchestration/ Orchestrator skill │
106
+ │ │ ├── tweakcc/ Theme customization │
107
+ │ │ └── variant.json Metadata │
108
+ │ │ │
109
+ │ ├── zai/ ← Z.ai variant (GLM models) │
110
+ │ └── minimax/ ← MiniMax variant (M2.1) │
111
+ │ │
112
+ │ Wrappers: ~/.local/bin/mclaude, ~/.local/bin/zai, ... │
113
+ └─────────────────────────────────────────────────────────────────────────┘
114
+ ```
115
+
116
+ ---
117
+
118
+ ## Providers
119
+
120
+ ### Mirror Claude (Recommended)
121
+
122
+ The purest path to multi-agent Claude Code. No proxy, no model changes — just Claude with superpowers.
123
+
124
+ ```bash
125
+ npx cc-mirror quick --provider mirror --name mclaude
126
+ ```
127
+
128
+ - **Direct Anthropic API** — No proxy, authenticate normally (OAuth or API key)
129
+ - **Team mode enabled** — The hidden tools, unlocked
130
+ - **Orchestrator skill** — Battle-tested multi-agent coordination
131
+ - **Isolated config** — Experiment without affecting your main setup
132
+
133
+ ### Alternative Providers
134
+
135
+ Want to use different models? CC-MIRROR supports multiple providers, all with team mode:
62
136
 
63
137
  | Provider | Models | Auth | Best For |
64
138
  | -------------- | ---------------------- | ---------- | ------------------------------- |
@@ -66,7 +140,6 @@ npx cc-mirror quick --provider zai --api-key "$Z_AI_API_KEY"
66
140
  | **MiniMax** | MiniMax-M2.1 | API Key | Unified model experience |
67
141
  | **OpenRouter** | 100+ models | Auth Token | Model flexibility, pay-per-use |
68
142
  | **CCRouter** | Ollama, DeepSeek, etc. | Optional | Local-first development |
69
- | **Mirror** | Claude (native) | OAuth/Key | Pure Claude with team mode |
70
143
 
71
144
  ```bash
72
145
  # Z.ai (GLM Coding Plan)
@@ -77,78 +150,126 @@ npx cc-mirror quick --provider minimax --api-key "$MINIMAX_API_KEY"
77
150
 
78
151
  # OpenRouter (100+ models)
79
152
  npx cc-mirror quick --provider openrouter --api-key "$OPENROUTER_API_KEY" \
80
- --model-sonnet "anthropic/claude-3.5-sonnet"
153
+ --model-sonnet "anthropic/claude-sonnet-4-20250514"
81
154
 
82
155
  # Claude Code Router (local LLMs)
83
156
  npx cc-mirror quick --provider ccrouter
84
-
85
- # Mirror Claude (pure Claude with team mode)
86
- npx cc-mirror quick --provider mirror --name mclaude
87
157
  ```
88
158
 
89
159
  ---
90
160
 
91
- ## 📁 How It Works
161
+ ## The Orchestrator Skill
162
+
163
+ When team mode is enabled, CC-MIRROR installs an **orchestrator skill** that teaches Claude how to coordinate work effectively.
164
+
165
+ ### The Conductor Identity
92
166
 
93
- Each variant lives in its own directory with complete isolation:
167
+ Claude becomes "The Conductor" a warm, capable orchestrator who transforms ambitious requests into elegant execution:
94
168
 
95
169
  ```
96
- ┌─────────────────────────────────────────────────────────────────────────┐
97
- ~/.cc-mirror/
98
-
99
- ├── zai/ ← Your Z.ai variant
100
- ├── npm/ Claude Code installation │
101
- │ ├── config/ API keys, sessions, MCP servers
102
- │ ├── tweakcc/ Theme & prompt customization
103
- └── variant.json Metadata │
104
- │ │ │
105
- │ ├── minimax/ ← Your MiniMax variant │
106
- │ │ └── ... │
107
- │ │ │
108
- │ └── mclaude/ ← Your Mirror Claude variant │
109
- │ └── ... │
110
- │ │
111
- │ Wrappers: ~/.local/bin/zai, ~/.local/bin/minimax, ~/.local/bin/mclaude
112
- │ │
113
- └─────────────────────────────────────────────────────────────────────────┘
170
+ ┌─────────────────────────────────────────────────────────────────┐
171
+
172
+ You are the Conductor. Users bring the vision.
173
+ You orchestrate the symphony of agents that makes it real.
174
+
175
+ Complex work should feel effortless.
176
+ That's your gift to every user.
177
+
178
+ └─────────────────────────────────────────────────────────────────┘
179
+ ```
180
+
181
+ ### What It Provides
182
+
183
+ | Aspect | What Claude Learns |
184
+ | ---------------------- | ------------------------------------------------ |
185
+ | **Task Graph** | Decompose work into tasks with dependencies |
186
+ | **Parallel Execution** | Fan-out, pipeline, map-reduce patterns |
187
+ | **Background Agents** | Spawn agents that work while you continue |
188
+ | **Smart Prompting** | Context, scope, constraints, output expectations |
189
+ | **Progress Updates** | Milestone celebrations, warm professional tone |
190
+
191
+ ### Example Flow
192
+
193
+ ```
194
+ User: "Build me a REST API for todo management with tests"
195
+
196
+ Claude (The Conductor):
197
+ ├── Clarifies requirements (AskUserQuestion with rich options)
198
+ ├── Creates task graph with dependencies
199
+ ├── Spawns background agents for parallel work:
200
+ │ ├── Agent 1: Database schema
201
+ │ ├── Agent 2: API routes (blocked by schema)
202
+ │ └── Agent 3: Test setup
203
+ ├── Continues working while agents execute
204
+ ├── Synthesizes results
205
+ └── Delivers unified output
114
206
  ```
115
207
 
116
- Run any variant directly from your terminal:
208
+ > [Full Team Mode Documentation](docs/features/team-mode.md)
209
+
210
+ ---
211
+
212
+ ## Project-Scoped Tasks
213
+
214
+ Tasks are automatically isolated by project folder — no cross-project pollution:
117
215
 
118
216
  ```bash
119
- zai # Launch Z.ai variant
120
- minimax # Launch MiniMax variant
121
- mclaude # Launch Mirror Claude variant
217
+ cd ~/projects/api && mclaude # Team: mclaude-api
218
+ cd ~/projects/frontend && mclaude # Team: mclaude-frontend
219
+
220
+ # Multiple teams in the same project
221
+ TEAM=backend mclaude # Team: mclaude-myproject-backend
222
+ TEAM=frontend mclaude # Team: mclaude-myproject-frontend
223
+ ```
224
+
225
+ ### CLI Task Management
226
+
227
+ Manage team tasks from the command line:
228
+
229
+ ```bash
230
+ npx cc-mirror tasks # List open tasks
231
+ npx cc-mirror tasks --ready # List ready tasks (open + not blocked)
232
+ npx cc-mirror tasks --json # JSON output for automation
233
+ npx cc-mirror tasks show 18 # Show task details
234
+ npx cc-mirror tasks create # Create new task
235
+ npx cc-mirror tasks update 5 --status resolved
236
+ npx cc-mirror tasks graph # Visualize dependencies
237
+ npx cc-mirror tasks graph --json # Graph as JSON for programmatic use
238
+ npx cc-mirror tasks clean --resolved # Cleanup done tasks
122
239
  ```
123
240
 
124
241
  ---
125
242
 
126
- ## Features
243
+ ## Disabling Team Mode
244
+
245
+ Team mode is enabled by default on all variants. If you want vanilla Claude Code behavior:
246
+
247
+ ```bash
248
+ # Create without team mode
249
+ npx cc-mirror create --provider mirror --name vanilla --no-team-mode
250
+
251
+ # Disable on existing variant
252
+ npx cc-mirror update myvariant --disable-team-mode
253
+ ```
127
254
 
128
- | Feature | Description |
129
- | -------------------------- | -------------------------------------------------------------------------------------- |
130
- | **🔌 Multiple Providers** | Z.ai, MiniMax, OpenRouter, CCRouter, Mirror, or custom endpoints |
131
- | **📁 Complete Isolation** | Each variant has its own config, sessions, and credentials |
132
- | **🎨 Brand Themes** | Custom color schemes per provider via [tweakcc](https://github.com/Piebald-AI/tweakcc) |
133
- | **📝 Prompt Packs** | Enhanced system prompts for Z.ai and MiniMax |
134
- | **🤖 Team Mode** | Multi-agent collaboration with shared task management |
135
- | **📋 Tasks CLI** | Manage, archive, and visualize task dependencies from command line |
136
- | **🔄 One-Command Updates** | Update all variants when Claude Code releases |
255
+ Or toggle via the TUI: **Manage Variants → Toggle Team Mode**
137
256
 
138
257
  ---
139
258
 
140
- ## 🛠️ Commands
259
+ ## All Commands
141
260
 
142
261
  ```bash
143
262
  # Create & manage variants
144
- npx cc-mirror create # Full configuration wizard
263
+ npx cc-mirror # Interactive TUI
145
264
  npx cc-mirror quick [options] # Fast setup with defaults
265
+ npx cc-mirror create [options] # Full configuration wizard
146
266
  npx cc-mirror list # List all variants
147
267
  npx cc-mirror update [name] # Update one or all variants
148
268
  npx cc-mirror remove <name> # Delete a variant
149
269
  npx cc-mirror doctor # Health check all variants
270
+ npx cc-mirror tweak <name> # Launch tweakcc customization
150
271
 
151
- # Task management (team mode)
272
+ # Task management
152
273
  npx cc-mirror tasks # List open tasks
153
274
  npx cc-mirror tasks show <id> # Show task details
154
275
  npx cc-mirror tasks create # Create new task
@@ -159,133 +280,57 @@ npx cc-mirror tasks clean # Bulk cleanup
159
280
  npx cc-mirror tasks graph # Visualize dependencies
160
281
 
161
282
  # Launch your variant
162
- zai # Run Z.ai variant
163
- minimax # Run MiniMax variant
164
- mclaude # Run Mirror Claude variant
283
+ mclaude # Run Mirror Claude
284
+ zai # Run Z.ai variant
285
+ minimax # Run MiniMax variant
165
286
  ```
166
287
 
167
288
  ---
168
289
 
169
- ## 🎛️ CLI Options
290
+ ## CLI Options
170
291
 
171
292
  ```
172
- --provider <name> zai | minimax | openrouter | ccrouter | mirror | custom
293
+ --provider <name> mirror | zai | minimax | openrouter | ccrouter | custom
173
294
  --name <name> Variant name (becomes the CLI command)
174
295
  --api-key <key> Provider API key
175
296
  --base-url <url> Custom API endpoint
176
- --model-sonnet <name> Map to sonnet model (OpenRouter)
177
- --model-opus <name> Map to opus model (OpenRouter)
178
- --model-haiku <name> Map to haiku model (OpenRouter)
297
+ --model-sonnet <name> Map to sonnet model
298
+ --model-opus <name> Map to opus model
299
+ --model-haiku <name> Map to haiku model
179
300
  --brand <preset> Theme: auto | zai | minimax | openrouter | ccrouter | mirror
180
- --enable-team-mode Enable team mode (TaskCreate, TaskGet, TaskUpdate, TaskList)
301
+ --no-team-mode Disable team mode (not recommended)
181
302
  --no-tweak Skip tweakcc theme
182
- --no-prompt-pack Skip prompt pack
303
+ --no-prompt-pack Skip provider prompt pack
183
304
  ```
184
305
 
185
306
  ---
186
307
 
187
- ## 🎨 Brand Themes
308
+ ## Brand Themes
188
309
 
189
- Each provider includes a custom color theme:
310
+ Each provider includes a custom color theme via [tweakcc](https://github.com/Piebald-AI/tweakcc):
190
311
 
191
312
  | Brand | Style |
192
313
  | -------------- | -------------------------------- |
314
+ | **mirror** | Silver/chrome with electric blue |
193
315
  | **zai** | Dark carbon with gold accents |
194
316
  | **minimax** | Coral/red/orange spectrum |
195
317
  | **openrouter** | Teal/cyan gradient |
196
318
  | **ccrouter** | Sky blue accents |
197
- | **mirror** | Silver/chrome with electric blue |
198
-
199
- ---
200
-
201
- ## 🤖 Team Mode
202
-
203
- Enable multi-agent collaboration with shared task management:
204
-
205
- ```bash
206
- # Enable on any variant
207
- npx cc-mirror create --provider zai --name zai-team --enable-team-mode
208
-
209
- # Mirror Claude has team mode by default
210
- npx cc-mirror quick --provider mirror --name mclaude
211
- ```
212
-
213
- Team mode enables: `TaskCreate`, `TaskGet`, `TaskUpdate`, `TaskList` tools plus an **orchestrator skill** that teaches Claude effective multi-agent coordination patterns.
214
-
215
- ### Tasks CLI (v1.4.0+)
216
-
217
- Manage team tasks from the command line:
218
-
219
- ```bash
220
- # List open tasks
221
- npx cc-mirror tasks
222
-
223
- # View across all teams
224
- npx cc-mirror tasks --all
225
-
226
- # Create and update tasks
227
- npx cc-mirror tasks create --subject "Add auth" --description "JWT implementation"
228
- npx cc-mirror tasks update 5 --status resolved --add-comment "Done"
229
-
230
- # Cleanup resolved tasks
231
- npx cc-mirror tasks clean --resolved --dry-run
232
- npx cc-mirror tasks clean --resolved --force
233
-
234
- # Archive instead of delete (preserves task history)
235
- npx cc-mirror tasks archive 5
236
-
237
- # Visualize dependency graph
238
- npx cc-mirror tasks graph
239
- ```
240
-
241
- ### Project-Scoped Tasks (v1.2.0+)
242
-
243
- Tasks are automatically scoped by project folder — no cross-project pollution:
244
-
245
- ```bash
246
- # Run in different project folders - tasks stay isolated
247
- cd ~/projects/api && mc # Team: mc-api
248
- cd ~/projects/frontend && mc # Team: mc-frontend
249
-
250
- # Multiple teams in the same project
251
- TEAM=backend mc # Team: mc-myproject-backend
252
- TEAM=frontend mc # Team: mc-myproject-frontend
253
- ```
254
-
255
- → [Team Mode Documentation](docs/features/team-mode.md)
256
-
257
- ---
258
-
259
- ## 🪞 Mirror Claude
260
-
261
- A pure Claude Code variant with enhanced features:
262
-
263
- - **No proxy** — Connects directly to Anthropic's API
264
- - **Team mode** — Enabled by default
265
- - **Isolated config** — Experiment without affecting your main setup
266
- - **Custom theme** — Silver/chrome aesthetic
267
-
268
- ```bash
269
- npx cc-mirror quick --provider mirror --name mclaude
270
- mclaude # Authenticate via OAuth or API key
271
- ```
272
-
273
- → [Mirror Claude Documentation](docs/features/mirror-claude.md)
274
319
 
275
320
  ---
276
321
 
277
- ## 📚 Documentation
322
+ ## Documentation
278
323
 
279
- | Document | Description |
280
- | ----------------------------------------------- | ------------------------------------------- |
281
- | [Team Mode](docs/features/team-mode.md) | Multi-agent collaboration with shared tasks |
282
- | [Mirror Claude](docs/features/mirror-claude.md) | Pure Claude Code with enhanced features |
283
- | [Architecture](docs/architecture/overview.md) | How cc-mirror works under the hood |
284
- | [Full Documentation](docs/README.md) | Complete documentation index |
324
+ | Document | Description |
325
+ | ----------------------------------------------- | ----------------------------------- |
326
+ | [Team Mode](docs/features/team-mode.md) | Multi-agent collaboration deep dive |
327
+ | [Mirror Claude](docs/features/mirror-claude.md) | Pure Claude Code with superpowers |
328
+ | [Architecture](docs/architecture/overview.md) | How CC-MIRROR works under the hood |
329
+ | [Full Documentation](docs/README.md) | Complete documentation index |
285
330
 
286
331
  ---
287
332
 
288
- ## 🔗 Related Projects
333
+ ## Related Projects
289
334
 
290
335
  - [tweakcc](https://github.com/Piebald-AI/tweakcc) — Theme and customize Claude Code
291
336
  - [Claude Code Router](https://github.com/musistudio/claude-code-router) — Route Claude Code to any LLM
@@ -293,7 +338,7 @@ mclaude # Authenticate via OAuth or API key
293
338
 
294
339
  ---
295
340
 
296
- ## 🤝 Contributing
341
+ ## Contributing
297
342
 
298
343
  Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup.
299
344
 
@@ -301,7 +346,7 @@ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for development se
301
346
 
302
347
  ---
303
348
 
304
- ## 📄 License
349
+ ## License
305
350
 
306
351
  MIT — see [LICENSE](LICENSE)
307
352
 
@@ -92,34 +92,40 @@ var printHelp = () => {
92
92
  console.log(`
93
93
  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
94
94
  \u2551 CC-MIRROR \u2551
95
- \u2551 Create Claude Code Variants with Custom Providers \u2551
95
+ \u2551 Claude Code, Unshackled \u2551
96
96
  \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
97
97
 
98
- WHAT IS CC-MIRROR?
99
- CC-MIRROR creates isolated Claude Code installations that connect to
100
- different AI providers. Each variant is independent with its own
101
- config, theme, and settings.
98
+ Pre-configured Claude Code variants with multi-agent orchestration,
99
+ custom providers, and battle-tested enhancements.
100
+
101
+ One command. Instant power-up.
102
+
103
+ THE UNLOCK
104
+ Claude Code has a hidden multi-agent capability. CC-MIRROR enables it.
105
+ Team mode unlocks: TaskCreate, TaskGet, TaskUpdate, TaskList tools
106
+ plus a battle-tested orchestrator skill for coordinating agents.
102
107
 
103
108
  QUICK START
104
- npx cc-mirror quick # Fast setup: provider + key \u2192 done
105
- npx cc-mirror create # Full wizard with all options
109
+ npx cc-mirror quick --provider mirror # Fastest path to multi-agent
110
+ npx cc-mirror quick --provider zai # Z.ai with GLM models
111
+ npx cc-mirror # Interactive TUI
106
112
 
107
113
  COMMANDS
108
- create [options] Create a new variant
109
- quick [options] Fast: provider + API key only
114
+ quick [options] Fast setup: provider \u2192 ready in 30s
115
+ create [options] Full configuration wizard
110
116
  list List all variants
111
117
  update [name] Update to latest Claude Code
112
118
  remove <name> Remove a variant
113
119
  doctor Health check all variants
114
120
  tweak <name> Launch tweakcc customization
115
- tasks [operation] Manage team tasks (list, show, create, update, delete, clean)
121
+ tasks [operation] Manage team tasks (list, show, create, update, delete, clean, graph)
116
122
 
117
123
  OPTIONS (create/quick)
118
124
  --name <name> Variant name (becomes CLI command)
119
- --provider <name> Provider: zai | minimax | openrouter | ccrouter
125
+ --provider <name> Provider: mirror | zai | minimax | openrouter | ccrouter
120
126
  --api-key <key> Provider API key
121
- --brand <preset> Theme: auto | none | zai | minimax
122
- --quick Fast path mode
127
+ --brand <preset> Theme: auto | none | mirror | zai | minimax
128
+ --no-team-mode Disable team mode (not recommended)
123
129
  --tui / --no-tui Force TUI on/off
124
130
 
125
131
  OPTIONS (advanced)
@@ -131,13 +137,19 @@ OPTIONS (advanced)
131
137
  --bin-dir <path> Wrapper install dir (default: ~/.local/bin)
132
138
  --no-tweak Skip tweakcc theming
133
139
  --no-prompt-pack Skip provider prompt pack
134
- --prompt-pack-mode <mode> minimal | maximal
135
- --shell-env Write env vars to shell profile (Z.ai)
140
+ --shell-env Write env vars to shell profile
141
+
142
+ PROVIDERS
143
+ mirror Pure Claude with team mode (recommended)
144
+ zai GLM-4.7 via Z.ai Coding Plan
145
+ minimax MiniMax-M2.1 via MiniMax Cloud
146
+ openrouter 100+ models via OpenRouter
147
+ ccrouter Local LLMs via Claude Code Router
136
148
 
137
149
  EXAMPLES
138
- npx cc-mirror quick --provider zai
139
- npx cc-mirror create --provider minimax --brand minimax
140
- npx cc-mirror update zai
150
+ npx cc-mirror quick --provider mirror --name mclaude
151
+ npx cc-mirror quick --provider zai --api-key "$Z_AI_API_KEY"
152
+ npx cc-mirror tasks graph
141
153
  npx cc-mirror doctor
142
154
 
143
155
  LEARN MORE
@@ -198,7 +210,7 @@ var DEFAULT_ROOT = path2.join(os.homedir(), ".cc-mirror");
198
210
  var DEFAULT_BIN_DIR = path2.join(os.homedir(), ".local", "bin");
199
211
  var TWEAKCC_VERSION = "3.2.2";
200
212
  var DEFAULT_NPM_PACKAGE = "@anthropic-ai/claude-code";
201
- var DEFAULT_NPM_VERSION = "2.0.76";
213
+ var DEFAULT_NPM_VERSION = "2.1.1";
202
214
 
203
215
  // src/core/fs.ts
204
216
  import fs2 from "node:fs";
@@ -1990,10 +2002,33 @@ import path17 from "node:path";
1990
2002
  var DEFAULT_TIMEOUT_MS = "3000000";
1991
2003
  var CCROUTER_AUTH_FALLBACK = "ccrouter-proxy";
1992
2004
  var PROVIDERS = {
2005
+ mirror: {
2006
+ key: "mirror",
2007
+ label: "Mirror Claude",
2008
+ description: "Pure Claude with team mode \u2014 the fastest path to multi-agent",
2009
+ baseUrl: "",
2010
+ // Empty = use Claude Code defaults (no ANTHROPIC_BASE_URL override)
2011
+ env: {
2012
+ // Only cosmetic settings - no auth or model overrides
2013
+ CC_MIRROR_SPLASH: 1,
2014
+ CC_MIRROR_PROVIDER_LABEL: "Mirror Claude",
2015
+ CC_MIRROR_SPLASH_STYLE: "mirror"
2016
+ },
2017
+ apiKeyLabel: "",
2018
+ // Empty = skip API key prompt
2019
+ authMode: "none",
2020
+ // No auth handling - user authenticates via normal Claude flow
2021
+ credentialOptional: true,
2022
+ // No credentials required at create time
2023
+ enablesTeamMode: true,
2024
+ // Auto-enable team mode patch
2025
+ noPromptPack: true
2026
+ // Skip prompt pack (pure Claude experience)
2027
+ },
1993
2028
  zai: {
1994
2029
  key: "zai",
1995
2030
  label: "Zai Cloud",
1996
- description: "GLM Coding Plan via Anthropic-compatible endpoint",
2031
+ description: "GLM-4.7 via Z.ai Coding Plan",
1997
2032
  baseUrl: "https://api.z.ai/api/anthropic",
1998
2033
  env: {
1999
2034
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -2009,7 +2044,7 @@ var PROVIDERS = {
2009
2044
  minimax: {
2010
2045
  key: "minimax",
2011
2046
  label: "MiniMax Cloud",
2012
- description: "MiniMax-M2.1 via Anthropic-compatible endpoint",
2047
+ description: "MiniMax-M2.1 via MiniMax Cloud",
2013
2048
  baseUrl: "https://api.minimax.io/anthropic",
2014
2049
  env: {
2015
2050
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -2028,7 +2063,7 @@ var PROVIDERS = {
2028
2063
  openrouter: {
2029
2064
  key: "openrouter",
2030
2065
  label: "OpenRouter",
2031
- description: "OpenRouter gateway for Anthropic-compatible requests",
2066
+ description: "100+ models via OpenRouter gateway",
2032
2067
  baseUrl: "https://openrouter.ai/api",
2033
2068
  env: {
2034
2069
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -2043,7 +2078,7 @@ var PROVIDERS = {
2043
2078
  ccrouter: {
2044
2079
  key: "ccrouter",
2045
2080
  label: "Claude Code Router",
2046
- description: "Route requests to any model via Claude Code Router",
2081
+ description: "Local LLMs via Claude Code Router",
2047
2082
  baseUrl: "http://127.0.0.1:3456",
2048
2083
  env: {
2049
2084
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -2058,29 +2093,6 @@ var PROVIDERS = {
2058
2093
  credentialOptional: true
2059
2094
  // No API key needed - CCRouter handles auth
2060
2095
  },
2061
- mirror: {
2062
- key: "mirror",
2063
- label: "Mirror Claude",
2064
- description: "Pure Claude Code with advanced features (team mode, custom theme)",
2065
- baseUrl: "",
2066
- // Empty = use Claude Code defaults (no ANTHROPIC_BASE_URL override)
2067
- env: {
2068
- // Only cosmetic settings - no auth or model overrides
2069
- CC_MIRROR_SPLASH: 1,
2070
- CC_MIRROR_PROVIDER_LABEL: "Mirror Claude",
2071
- CC_MIRROR_SPLASH_STYLE: "mirror"
2072
- },
2073
- apiKeyLabel: "",
2074
- // Empty = skip API key prompt
2075
- authMode: "none",
2076
- // No auth handling - user authenticates via normal Claude flow
2077
- credentialOptional: true,
2078
- // No credentials required at create time
2079
- enablesTeamMode: true,
2080
- // Auto-enable team mode patch
2081
- noPromptPack: true
2082
- // Skip prompt pack (pure Claude experience)
2083
- },
2084
2096
  custom: {
2085
2097
  key: "custom",
2086
2098
  label: "Custom",
@@ -2660,8 +2672,8 @@ var configureTeamToolset = (configPath) => {
2660
2672
  };
2661
2673
 
2662
2674
  // src/core/variant-builder/steps/TeamModeStep.ts
2663
- var TEAM_MODE_DISABLED = "function sU(){return!1}";
2664
- var TEAM_MODE_ENABLED = "function sU(){return!0}";
2675
+ var TEAM_MODE_DISABLED = "function Uq(){return!1}";
2676
+ var TEAM_MODE_ENABLED = "function Uq(){return!0}";
2665
2677
  var TeamModeStep = class {
2666
2678
  name = "TeamMode";
2667
2679
  shouldEnableTeamMode(ctx) {
@@ -4112,8 +4124,8 @@ var InstallNpmUpdateStep = class {
4112
4124
  // src/core/variant-builder/update-steps/TeamModeUpdateStep.ts
4113
4125
  import fs13 from "node:fs";
4114
4126
  import path18 from "node:path";
4115
- var TEAM_MODE_DISABLED2 = "function sU(){return!1}";
4116
- var TEAM_MODE_ENABLED2 = "function sU(){return!0}";
4127
+ var TEAM_MODE_DISABLED2 = "function Uq(){return!1}";
4128
+ var TEAM_MODE_ENABLED2 = "function Uq(){return!0}";
4117
4129
  var TeamModeUpdateStep = class {
4118
4130
  name = "TeamMode";
4119
4131
  shouldEnableTeamMode(ctx) {
@@ -5285,6 +5297,13 @@ function filterTasks(tasks, filter, allTasks) {
5285
5297
  filtered = filtered.filter((t) => !isBlocking(t));
5286
5298
  }
5287
5299
  }
5300
+ if (filter.ready !== void 0) {
5301
+ if (filter.ready) {
5302
+ filtered = filtered.filter((t) => t.status === "open" && !isBlocked(t, taskContext));
5303
+ } else {
5304
+ filtered = filtered.filter((t) => t.status === "resolved" || isBlocked(t, taskContext));
5305
+ }
5306
+ }
5288
5307
  if (filter.owner) {
5289
5308
  filtered = filtered.filter((t) => t.owner === filter.owner);
5290
5309
  }
@@ -5297,18 +5316,51 @@ function getTaskSummary(tasks) {
5297
5316
  const open = tasks.filter((t) => t.status === "open");
5298
5317
  const resolved = tasks.filter((t) => t.status === "resolved");
5299
5318
  const blocked = open.filter((t) => isBlocked(t, tasks));
5319
+ const ready = open.filter((t) => !isBlocked(t, tasks));
5300
5320
  return {
5301
5321
  total: tasks.length,
5302
5322
  open: open.length,
5303
5323
  resolved: resolved.length,
5324
+ ready: ready.length,
5304
5325
  blocked: blocked.length
5305
5326
  };
5306
5327
  }
5328
+ function getOpenBlockers(task, allTasks) {
5329
+ if (task.blockedBy.length === 0) return [];
5330
+ const taskMap = new Map(allTasks.map((t) => [t.id, t]));
5331
+ return task.blockedBy.filter((id) => {
5332
+ const blockingTask = taskMap.get(id);
5333
+ return blockingTask && blockingTask.status === "open";
5334
+ });
5335
+ }
5307
5336
  function sortTasksById(tasks) {
5308
5337
  return [...tasks].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10));
5309
5338
  }
5310
5339
 
5311
5340
  // src/cli/commands/tasks/output.ts
5341
+ function enrichTask(task, allTasks) {
5342
+ const taskMap = new Map(allTasks.map((t) => [t.id, t]));
5343
+ const blockedByWithStatus = task.blockedBy.map((id) => {
5344
+ const blockingTask = taskMap.get(id);
5345
+ return {
5346
+ id,
5347
+ status: blockingTask ? blockingTask.status : "unknown"
5348
+ };
5349
+ });
5350
+ return {
5351
+ id: task.id,
5352
+ subject: task.subject,
5353
+ description: task.description,
5354
+ status: task.status,
5355
+ owner: task.owner,
5356
+ blocked: isBlocked(task, allTasks),
5357
+ blockedBy: blockedByWithStatus,
5358
+ openBlockers: getOpenBlockers(task, allTasks),
5359
+ blocks: task.blocks,
5360
+ references: task.references,
5361
+ comments: task.comments
5362
+ };
5363
+ }
5312
5364
  function truncate(text, maxLen) {
5313
5365
  if (text.length <= maxLen) return text;
5314
5366
  return text.slice(0, maxLen - 3) + "...";
@@ -5395,24 +5447,26 @@ function formatTaskDetail(task, location, allTasks) {
5395
5447
  }
5396
5448
  return lines.join("\n");
5397
5449
  }
5398
- function formatTasksJson(tasks, location, summary) {
5450
+ function formatTasksJson(tasks, location, summary, allTasks) {
5451
+ const enrichedTasks = tasks.map((t) => enrichTask(t, allTasks));
5399
5452
  return JSON.stringify(
5400
5453
  {
5401
5454
  variant: location.variant,
5402
5455
  team: location.team,
5403
- tasks,
5456
+ tasks: enrichedTasks,
5404
5457
  summary
5405
5458
  },
5406
5459
  null,
5407
5460
  2
5408
5461
  );
5409
5462
  }
5410
- function formatTaskJson(task, location) {
5463
+ function formatTaskJson(task, location, allTasks) {
5464
+ const enrichedTask = enrichTask(task, allTasks);
5411
5465
  return JSON.stringify(
5412
5466
  {
5413
5467
  variant: location.variant,
5414
5468
  team: location.team,
5415
- task
5469
+ task: enrichedTask
5416
5470
  },
5417
5471
  null,
5418
5472
  2
@@ -5421,10 +5475,10 @@ function formatTaskJson(task, location) {
5421
5475
  function formatMultiLocationJson(tasksByLocation) {
5422
5476
  return JSON.stringify(
5423
5477
  {
5424
- locations: tasksByLocation.map(({ location, tasks, summary }) => ({
5478
+ locations: tasksByLocation.map(({ location, tasks, allTasks, summary }) => ({
5425
5479
  variant: location.variant,
5426
5480
  team: location.team,
5427
- tasks,
5481
+ tasks: tasks.map((t) => enrichTask(t, allTasks)),
5428
5482
  summary
5429
5483
  }))
5430
5484
  },
@@ -5465,6 +5519,7 @@ function runTasksList(opts) {
5465
5519
  status: opts.status || "open",
5466
5520
  blocked: opts.blocked,
5467
5521
  blocking: opts.blocking,
5522
+ ready: opts.ready,
5468
5523
  owner: opts.owner,
5469
5524
  limit: opts.limit
5470
5525
  },
@@ -5472,12 +5527,12 @@ function runTasksList(opts) {
5472
5527
  );
5473
5528
  const sortedTasks = sortTasksById(filteredTasks);
5474
5529
  const summary = getTaskSummary(allTasks);
5475
- return { location, tasks: sortedTasks, summary };
5530
+ return { location, tasks: sortedTasks, allTasks, summary };
5476
5531
  });
5477
5532
  if (opts.json) {
5478
5533
  if (tasksByLocation.length === 1) {
5479
- const { location, tasks, summary } = tasksByLocation[0];
5480
- console.log(formatTasksJson(tasks, location, summary));
5534
+ const { location, tasks, allTasks, summary } = tasksByLocation[0];
5535
+ console.log(formatTasksJson(tasks, location, summary, allTasks));
5481
5536
  } else {
5482
5537
  console.log(formatMultiLocationJson(tasksByLocation));
5483
5538
  }
@@ -5508,7 +5563,7 @@ function runTasksShow(opts) {
5508
5563
  if (task) {
5509
5564
  const allTasks = loadAllTasks(location.tasksDir);
5510
5565
  if (opts.json) {
5511
- console.log(formatTaskJson(task, location));
5566
+ console.log(formatTaskJson(task, location, allTasks));
5512
5567
  } else {
5513
5568
  console.log(formatTaskDetail(task, location, allTasks));
5514
5569
  }
@@ -5544,7 +5599,8 @@ function runTasksCreate(opts) {
5544
5599
  blockedBy: opts.blockedBy
5545
5600
  });
5546
5601
  if (opts.json) {
5547
- console.log(formatTaskJson(task, location));
5602
+ const allTasks = loadAllTasks(location.tasksDir);
5603
+ console.log(formatTaskJson(task, location, allTasks));
5548
5604
  } else {
5549
5605
  console.log(`Created task #${task.id}: ${task.subject}`);
5550
5606
  console.log(`Location: ${location.variant} / ${location.team}`);
@@ -5594,7 +5650,8 @@ function runTasksUpdate(opts) {
5594
5650
  }
5595
5651
  saveTask(location.tasksDir, task);
5596
5652
  if (opts.json) {
5597
- console.log(formatTaskJson(task, location));
5653
+ const allTasks = loadAllTasks(location.tasksDir);
5654
+ console.log(formatTaskJson(task, location, allTasks));
5598
5655
  } else {
5599
5656
  console.log(`Updated task #${task.id}: ${task.subject}`);
5600
5657
  }
@@ -5824,6 +5881,54 @@ function formatTaskGraph(tasks, variant, team) {
5824
5881
  lines.push(`Total: ${tasks.length} | Open: ${open.length} | Ready: ${ready.length} | Blocked: ${blocked.length}`);
5825
5882
  return lines.join("\n");
5826
5883
  }
5884
+ function formatTaskGraphJson(tasks, variant, team) {
5885
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
5886
+ const nodes = tasks.map((task) => ({
5887
+ id: task.id,
5888
+ subject: task.subject,
5889
+ status: task.status,
5890
+ blocked: isBlocked(task, tasks),
5891
+ blockedBy: task.blockedBy.map((id) => ({
5892
+ id,
5893
+ status: taskMap.get(id)?.status ?? "unknown"
5894
+ })),
5895
+ openBlockers: getOpenBlockers(task, tasks),
5896
+ blocks: task.blocks,
5897
+ depth: calculateDepth(task, tasks, /* @__PURE__ */ new Set())
5898
+ }));
5899
+ const roots = tasks.filter((t) => t.blockedBy.length === 0).map((t) => t.id);
5900
+ const leaves = tasks.filter((t) => t.blocks.length === 0).map((t) => t.id);
5901
+ const orphans = tasks.filter((t) => t.blockedBy.length > 0 && t.blockedBy.some((id) => !taskMap.has(id))).map((t) => t.id);
5902
+ const summary = getTaskSummary(tasks);
5903
+ return JSON.stringify(
5904
+ {
5905
+ variant,
5906
+ team,
5907
+ nodes,
5908
+ roots,
5909
+ leaves,
5910
+ orphans,
5911
+ summary
5912
+ },
5913
+ null,
5914
+ 2
5915
+ );
5916
+ }
5917
+ function calculateDepth(task, allTasks, visited) {
5918
+ if (task.blockedBy.length === 0) return 0;
5919
+ if (visited.has(task.id)) return 0;
5920
+ visited.add(task.id);
5921
+ const taskMap = new Map(allTasks.map((t) => [t.id, t]));
5922
+ let maxDepth = 0;
5923
+ for (const blockerId of task.blockedBy) {
5924
+ const blocker = taskMap.get(blockerId);
5925
+ if (blocker) {
5926
+ const depth = calculateDepth(blocker, allTasks, new Set(visited));
5927
+ maxDepth = Math.max(maxDepth, depth + 1);
5928
+ }
5929
+ }
5930
+ return maxDepth;
5931
+ }
5827
5932
  function runTasksGraph(opts) {
5828
5933
  const context = resolveContext({
5829
5934
  rootDir: opts.rootDir,
@@ -5837,10 +5942,29 @@ function runTasksGraph(opts) {
5837
5942
  const location = context.locations[0];
5838
5943
  const tasks = loadAllTasks(location.tasksDir);
5839
5944
  if (tasks.length === 0) {
5840
- console.log(`No tasks found in ${location.variant} / ${location.team}`);
5945
+ if (opts.json) {
5946
+ console.log(
5947
+ JSON.stringify(
5948
+ {
5949
+ variant: location.variant,
5950
+ team: location.team,
5951
+ nodes: [],
5952
+ summary: { total: 0, open: 0, resolved: 0, ready: 0, blocked: 0 }
5953
+ },
5954
+ null,
5955
+ 2
5956
+ )
5957
+ );
5958
+ } else {
5959
+ console.log(`No tasks found in ${location.variant} / ${location.team}`);
5960
+ }
5841
5961
  return;
5842
5962
  }
5843
- console.log(formatTaskGraph(tasks, location.variant, location.team));
5963
+ if (opts.json) {
5964
+ console.log(formatTaskGraphJson(tasks, location.variant, location.team));
5965
+ } else {
5966
+ console.log(formatTaskGraph(tasks, location.variant, location.team));
5967
+ }
5844
5968
  }
5845
5969
 
5846
5970
  // src/cli/commands/tasks/archive.ts
@@ -5961,6 +6085,7 @@ LIST OPTIONS:
5961
6085
  --status <s> Filter: open, resolved, all (default: open)
5962
6086
  --blocked Show only blocked tasks
5963
6087
  --blocking Show only tasks blocking others
6088
+ --ready Show only ready tasks (open + not blocked)
5964
6089
  --owner <id> Filter by owner
5965
6090
  --limit <n> Limit results (default: 50)
5966
6091
 
@@ -6100,7 +6225,7 @@ async function runTasksCommand({ opts }) {
6100
6225
  break;
6101
6226
  }
6102
6227
  case "graph": {
6103
- runTasksGraph({ rootDir, variant, team });
6228
+ runTasksGraph({ rootDir, variant, team, json });
6104
6229
  break;
6105
6230
  }
6106
6231
  case "archive": {
@@ -6127,6 +6252,7 @@ async function runTasksCommand({ opts }) {
6127
6252
  status: opts.status || "open",
6128
6253
  blocked: opts.blocked !== void 0 ? Boolean(opts.blocked) : void 0,
6129
6254
  blocking: opts.blocking !== void 0 ? Boolean(opts.blocking) : void 0,
6255
+ ready: opts.ready !== void 0 ? Boolean(opts.ready) : void 0,
6130
6256
  owner: opts.owner,
6131
6257
  limit: opts.limit !== void 0 ? Number(opts.limit) : 50,
6132
6258
  json
@@ -252,22 +252,22 @@ TaskOutput(task_id="abc123")
252
252
 
253
253
  ### Model Selection
254
254
 
255
- | Task Type | Model | Why |
256
- | -------------------------------- | -------- | ---------------------------------------- |
257
- | Fetch files, grep, find things | `haiku` | Errand runner - spawn many in parallel |
258
- | Gather info for synthesis | `haiku` | No judgment needed, just retrieval |
259
- | Well-structured implementation | `sonnet` | Capable worker - needs clear direction |
260
- | Research, reading docs | `sonnet` | Can follow patterns and instructions |
261
- | Security review | `opus` | Critical thinking, trust its judgment |
262
- | Architecture/design decisions | `opus` | Ambiguous, needs creative problem-solving|
263
- | Complex debugging | `opus` | Reasoning across systems |
255
+ | Task Type | Model | Why |
256
+ | ------------------------------ | -------- | ----------------------------------------- |
257
+ | Fetch files, grep, find things | `haiku` | Errand runner - spawn many in parallel |
258
+ | Gather info for synthesis | `haiku` | No judgment needed, just retrieval |
259
+ | Well-structured implementation | `sonnet` | Capable worker - needs clear direction |
260
+ | Research, reading docs | `sonnet` | Can follow patterns and instructions |
261
+ | Security review | `opus` | Critical thinking, trust its judgment |
262
+ | Architecture/design decisions | `opus` | Ambiguous, needs creative problem-solving |
263
+ | Complex debugging | `opus` | Reasoning across systems |
264
264
 
265
265
  ### Parallelism Strategy
266
266
 
267
- | Priority | Approach |
268
- | ------------ | -------------------------------------------------- |
269
- | **Speed** | Swarm of haiku for gathering, parallel sonnet work |
270
- | **Cost** | Haiku wherever possible, sonnet only when needed |
267
+ | Priority | Approach |
268
+ | ------------ | ---------------------------------------------------- |
269
+ | **Speed** | Swarm of haiku for gathering, parallel sonnet work |
270
+ | **Cost** | Haiku wherever possible, sonnet only when needed |
271
271
  | **Balanced** | Haiku to gather, sonnet to implement, opus to decide |
272
272
 
273
273
  ---
package/dist/tui.mjs CHANGED
@@ -1577,7 +1577,7 @@ var DEFAULT_ROOT = path.join(os2.homedir(), ".cc-mirror");
1577
1577
  var DEFAULT_BIN_DIR = path.join(os2.homedir(), ".local", "bin");
1578
1578
  var TWEAKCC_VERSION = "3.2.2";
1579
1579
  var DEFAULT_NPM_PACKAGE = "@anthropic-ai/claude-code";
1580
- var DEFAULT_NPM_VERSION = "2.0.76";
1580
+ var DEFAULT_NPM_VERSION = "2.1.1";
1581
1581
 
1582
1582
  // src/core/fs.ts
1583
1583
  import fs from "node:fs";
@@ -1849,10 +1849,33 @@ __export(providers_exports, {
1849
1849
  var DEFAULT_TIMEOUT_MS = "3000000";
1850
1850
  var CCROUTER_AUTH_FALLBACK = "ccrouter-proxy";
1851
1851
  var PROVIDERS = {
1852
+ mirror: {
1853
+ key: "mirror",
1854
+ label: "Mirror Claude",
1855
+ description: "Pure Claude with team mode \u2014 the fastest path to multi-agent",
1856
+ baseUrl: "",
1857
+ // Empty = use Claude Code defaults (no ANTHROPIC_BASE_URL override)
1858
+ env: {
1859
+ // Only cosmetic settings - no auth or model overrides
1860
+ CC_MIRROR_SPLASH: 1,
1861
+ CC_MIRROR_PROVIDER_LABEL: "Mirror Claude",
1862
+ CC_MIRROR_SPLASH_STYLE: "mirror"
1863
+ },
1864
+ apiKeyLabel: "",
1865
+ // Empty = skip API key prompt
1866
+ authMode: "none",
1867
+ // No auth handling - user authenticates via normal Claude flow
1868
+ credentialOptional: true,
1869
+ // No credentials required at create time
1870
+ enablesTeamMode: true,
1871
+ // Auto-enable team mode patch
1872
+ noPromptPack: true
1873
+ // Skip prompt pack (pure Claude experience)
1874
+ },
1852
1875
  zai: {
1853
1876
  key: "zai",
1854
1877
  label: "Zai Cloud",
1855
- description: "GLM Coding Plan via Anthropic-compatible endpoint",
1878
+ description: "GLM-4.7 via Z.ai Coding Plan",
1856
1879
  baseUrl: "https://api.z.ai/api/anthropic",
1857
1880
  env: {
1858
1881
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -1868,7 +1891,7 @@ var PROVIDERS = {
1868
1891
  minimax: {
1869
1892
  key: "minimax",
1870
1893
  label: "MiniMax Cloud",
1871
- description: "MiniMax-M2.1 via Anthropic-compatible endpoint",
1894
+ description: "MiniMax-M2.1 via MiniMax Cloud",
1872
1895
  baseUrl: "https://api.minimax.io/anthropic",
1873
1896
  env: {
1874
1897
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -1887,7 +1910,7 @@ var PROVIDERS = {
1887
1910
  openrouter: {
1888
1911
  key: "openrouter",
1889
1912
  label: "OpenRouter",
1890
- description: "OpenRouter gateway for Anthropic-compatible requests",
1913
+ description: "100+ models via OpenRouter gateway",
1891
1914
  baseUrl: "https://openrouter.ai/api",
1892
1915
  env: {
1893
1916
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -1902,7 +1925,7 @@ var PROVIDERS = {
1902
1925
  ccrouter: {
1903
1926
  key: "ccrouter",
1904
1927
  label: "Claude Code Router",
1905
- description: "Route requests to any model via Claude Code Router",
1928
+ description: "Local LLMs via Claude Code Router",
1906
1929
  baseUrl: "http://127.0.0.1:3456",
1907
1930
  env: {
1908
1931
  API_TIMEOUT_MS: DEFAULT_TIMEOUT_MS,
@@ -1917,29 +1940,6 @@ var PROVIDERS = {
1917
1940
  credentialOptional: true
1918
1941
  // No API key needed - CCRouter handles auth
1919
1942
  },
1920
- mirror: {
1921
- key: "mirror",
1922
- label: "Mirror Claude",
1923
- description: "Pure Claude Code with advanced features (team mode, custom theme)",
1924
- baseUrl: "",
1925
- // Empty = use Claude Code defaults (no ANTHROPIC_BASE_URL override)
1926
- env: {
1927
- // Only cosmetic settings - no auth or model overrides
1928
- CC_MIRROR_SPLASH: 1,
1929
- CC_MIRROR_PROVIDER_LABEL: "Mirror Claude",
1930
- CC_MIRROR_SPLASH_STYLE: "mirror"
1931
- },
1932
- apiKeyLabel: "",
1933
- // Empty = skip API key prompt
1934
- authMode: "none",
1935
- // No auth handling - user authenticates via normal Claude flow
1936
- credentialOptional: true,
1937
- // No credentials required at create time
1938
- enablesTeamMode: true,
1939
- // Auto-enable team mode patch
1940
- noPromptPack: true
1941
- // Skip prompt pack (pure Claude experience)
1942
- },
1943
1943
  custom: {
1944
1944
  key: "custom",
1945
1945
  label: "Custom",
@@ -2520,8 +2520,8 @@ var configureTeamToolset = (configPath) => {
2520
2520
  };
2521
2521
 
2522
2522
  // src/core/variant-builder/steps/TeamModeStep.ts
2523
- var TEAM_MODE_DISABLED = "function sU(){return!1}";
2524
- var TEAM_MODE_ENABLED = "function sU(){return!0}";
2523
+ var TEAM_MODE_DISABLED = "function Uq(){return!1}";
2524
+ var TEAM_MODE_ENABLED = "function Uq(){return!0}";
2525
2525
  var TeamModeStep = class {
2526
2526
  name = "TeamMode";
2527
2527
  shouldEnableTeamMode(ctx) {
@@ -3972,8 +3972,8 @@ var InstallNpmUpdateStep = class {
3972
3972
  // src/core/variant-builder/update-steps/TeamModeUpdateStep.ts
3973
3973
  import fs12 from "node:fs";
3974
3974
  import path17 from "node:path";
3975
- var TEAM_MODE_DISABLED2 = "function sU(){return!1}";
3976
- var TEAM_MODE_ENABLED2 = "function sU(){return!0}";
3975
+ var TEAM_MODE_DISABLED2 = "function Uq(){return!1}";
3976
+ var TEAM_MODE_ENABLED2 = "function Uq(){return!0}";
3977
3977
  var TeamModeUpdateStep = class {
3978
3978
  name = "TeamMode";
3979
3979
  shouldEnableTeamMode(ctx) {
@@ -5188,11 +5188,11 @@ var LogoBanner = () => /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", ch
5188
5188
  /* @__PURE__ */ jsx3(Text3, { children: /* @__PURE__ */ jsx3(Text3, { color: colors.logo1, children: " \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D" }) }),
5189
5189
  /* @__PURE__ */ jsxs3(Text3, { children: [
5190
5190
  /* @__PURE__ */ jsx3(Text3, { color: colors.logo1, children: " \u2588\u2588\u2551 \u2588\u2588\u2551 " }),
5191
- /* @__PURE__ */ jsx3(Text3, { color: colors.textMuted, children: "Claude Code Variant Manager" })
5191
+ /* @__PURE__ */ jsx3(Text3, { color: colors.textMuted, children: "Claude Code, Unshackled" })
5192
5192
  ] }),
5193
5193
  /* @__PURE__ */ jsxs3(Text3, { children: [
5194
5194
  /* @__PURE__ */ jsx3(Text3, { color: colors.logo1, children: " \u2588\u2588\u2551 \u2588\u2588\u2551 " }),
5195
- /* @__PURE__ */ jsx3(Text3, { color: colors.gold, children: "Create variants with custom providers" })
5195
+ /* @__PURE__ */ jsx3(Text3, { color: colors.gold, children: "Multi-agent orchestration. One command." })
5196
5196
  ] }),
5197
5197
  /* @__PURE__ */ jsx3(Text3, { children: /* @__PURE__ */ jsx3(Text3, { color: colors.logo1, children: " \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557" }) }),
5198
5198
  /* @__PURE__ */ jsx3(Text3, { children: /* @__PURE__ */ jsx3(Text3, { color: colors.logo1, children: " \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D" }) })
@@ -5370,9 +5370,9 @@ var PROVIDER_EDUCATION = {
5370
5370
  features: [
5371
5371
  "GLM-4.7 for Sonnet/Opus tasks",
5372
5372
  "GLM-4.5-Air for Haiku (fast) tasks",
5373
+ "Multi-agent orchestration (team mode)",
5373
5374
  "Prompt pack with zai-cli routing",
5374
- "Gold-themed interface",
5375
- "Optional team mode for multi-agent work"
5375
+ "Gold-themed interface"
5376
5376
  ],
5377
5377
  bestFor: "Heavy coding with GLM's reasoning capabilities",
5378
5378
  models: {
@@ -5394,10 +5394,10 @@ var PROVIDER_EDUCATION = {
5394
5394
  tagline: "Coral pulses, unified model",
5395
5395
  features: [
5396
5396
  "Single model for all tiers",
5397
+ "Multi-agent orchestration (team mode)",
5397
5398
  "Prompt pack with MCP tool routing",
5398
5399
  "MCP tools for web search & vision",
5399
- "Coral-themed interface",
5400
- "Optional team mode for multi-agent work"
5400
+ "Coral-themed interface"
5401
5401
  ],
5402
5402
  bestFor: "Streamlined experience with one powerful model",
5403
5403
  models: {
@@ -5449,16 +5449,16 @@ var PROVIDER_EDUCATION = {
5449
5449
  setupNote: 'Install: npm i -g @musistudio/claude-code-router, run "ccr start". Configure models in ~/.claude-code-router/config.json'
5450
5450
  },
5451
5451
  mirror: {
5452
- headline: "Mirror Claude \u2014 Pure Claude Code, Enhanced",
5453
- tagline: "Reflections of perfection",
5452
+ headline: "The Fastest Path to Multi-Agent",
5453
+ tagline: "Claude Code, Unshackled",
5454
5454
  features: [
5455
- "Pure Claude Code experience (no proxy)",
5456
- "Team mode enabled by default",
5455
+ "Multi-agent orchestration (team mode)",
5456
+ "Battle-tested orchestrator skill",
5457
+ "Pure Claude \u2014 no proxy, no model changes",
5457
5458
  "Isolated config for experimentation",
5458
- "Premium silver/chrome theme",
5459
- "No API key required at setup"
5459
+ "Premium silver/chrome theme"
5460
5460
  ],
5461
- bestFor: "Power users who want enhanced Claude Code without changing the AI",
5461
+ bestFor: "Power users who want multi-agent Claude Code immediately",
5462
5462
  requiresMapping: false,
5463
5463
  hasPromptPack: false,
5464
5464
  setupLinks: {
@@ -5509,21 +5509,19 @@ var ProviderSelectScreen = ({ providers, onSelect }) => {
5509
5509
  ScreenLayout,
5510
5510
  {
5511
5511
  title: "Select Provider",
5512
- subtitle: "Choose an API gateway to power your Claude Code variant",
5512
+ subtitle: "All providers include team mode + orchestrator skill",
5513
5513
  hints: [keyHints.continue, showDetails ? "? Hide details" : "? Show details"],
5514
5514
  children: [
5515
5515
  /* @__PURE__ */ jsxs7(Box7, { marginBottom: 1, flexDirection: "column", children: [
5516
5516
  /* @__PURE__ */ jsxs7(Text7, { color: colors.textMuted, children: [
5517
5517
  icons.star,
5518
5518
  " ",
5519
- /* @__PURE__ */ jsx7(Text7, { color: colors.gold, children: "Zai Cloud" }),
5520
- " and ",
5521
- /* @__PURE__ */ jsx7(Text7, { color: colors.gold, children: "MiniMax Cloud" }),
5522
- " are fully supported"
5519
+ /* @__PURE__ */ jsx7(Text7, { color: colors.gold, children: "Mirror Claude" }),
5520
+ " is the fastest path to multi-agent"
5523
5521
  ] }),
5524
5522
  /* @__PURE__ */ jsxs7(Text7, { color: colors.textMuted, children: [
5525
5523
  icons.bullet,
5526
- " OpenRouter/Local LLMs require model mapping"
5524
+ " Alternative providers for different models (GLM, MiniMax, etc.)"
5527
5525
  ] })
5528
5526
  ] }),
5529
5527
  /* @__PURE__ */ jsx7(Box7, { flexDirection: "column", marginY: 1, children: providers.map((provider, idx) => {
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "cc-mirror",
3
- "version": "1.4.2",
3
+ "version": "1.6.1",
4
4
  "type": "module",
5
- "description": "Create multiple isolated Claude Code variants with custom providers (Z.ai, MiniMax, OpenRouter, Claude Code Router)",
5
+ "description": "Claude Code, Unshackled Pre-configured variants with multi-agent orchestration, custom providers, and battle-tested enhancements",
6
6
  "author": "Numman Ali",
7
7
  "license": "MIT",
8
8
  "repository": {