@zcy2nn/agent-forge 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -5,7 +5,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
5
5
 
6
6
  // src/cli/doctor.ts
7
7
  import * as fs2 from "node:fs";
8
- import { z as z3 } from "zod";
8
+ import { z as z2 } from "zod";
9
9
 
10
10
  // src/config/loader.ts
11
11
  import * as fs from "node:fs";
@@ -127,95 +127,20 @@ function ensureOpenCodeConfigDir() {
127
127
 
128
128
  // src/config/constants.ts
129
129
  var SUBAGENT_NAMES = [
130
- "researcher",
131
- "reviewer",
132
- "implementer",
133
- "council",
134
- "councillor"
130
+ "researcher"
135
131
  ];
136
132
  var ORCHESTRATOR_NAME = "orchestrator";
137
133
  var ALL_AGENT_NAMES = [ORCHESTRATOR_NAME, ...SUBAGENT_NAMES];
138
134
  var PROTECTED_AGENTS = new Set([
139
135
  "orchestrator",
140
- "researcher",
141
- "reviewer",
142
- "implementer",
143
- "councillor"
136
+ "researcher"
144
137
  ]);
145
138
  var DEFAULT_TIMEOUT_MS = 2 * 60 * 1000;
146
139
  var MAX_POLL_TIME_MS = 5 * 60 * 1000;
147
- // src/config/council-schema.ts
148
- import { z } from "zod";
149
- var ModelIdSchema = z.string().regex(/^[^/\s]+\/[^\s]+$/, 'Expected provider/model format (e.g. "openai/gpt-5.4-mini")');
150
- var CouncillorConfigSchema = z.object({
151
- model: ModelIdSchema.describe('Model ID in provider/model format (e.g. "openai/gpt-5.4-mini")'),
152
- variant: z.string().optional(),
153
- prompt: z.string().optional().describe("Optional role/guidance injected into the councillor user prompt")
154
- });
155
- var CouncilPresetSchema = z.record(z.string(), z.record(z.string(), z.unknown())).transform((entries, ctx) => {
156
- const councillors = {};
157
- for (const [key, raw] of Object.entries(entries)) {
158
- if (key === "master")
159
- continue;
160
- if (key === "councillors" && typeof raw === "object" && raw !== null) {
161
- for (const [innerKey, innerRaw] of Object.entries(raw)) {
162
- const innerParsed = CouncillorConfigSchema.safeParse(innerRaw);
163
- if (!innerParsed.success) {
164
- ctx.addIssue({
165
- code: z.ZodIssueCode.custom,
166
- message: `Invalid councillor "${innerKey}" (nested under legacy "councillors" key): ${innerParsed.error.issues.map((i) => i.message).join(", ")}`
167
- });
168
- return z.NEVER;
169
- }
170
- councillors[innerKey] = innerParsed.data;
171
- }
172
- continue;
173
- }
174
- const parsed = CouncillorConfigSchema.safeParse(raw);
175
- if (!parsed.success) {
176
- ctx.addIssue({
177
- code: z.ZodIssueCode.custom,
178
- message: `Invalid councillor "${key}": ${parsed.error.issues.map((i) => i.message).join(", ")}`
179
- });
180
- return z.NEVER;
181
- }
182
- councillors[key] = parsed.data;
183
- }
184
- return councillors;
185
- });
186
- var CouncillorExecutionModeSchema = z.enum(["parallel", "serial"]).default("parallel").describe('Execution mode for councillors. Use "serial" for single-model systems to avoid conflicts. ' + 'Use "parallel" for multi-model systems for faster execution.');
187
- var CouncilConfigSchema = z.object({
188
- presets: z.record(z.string(), CouncilPresetSchema),
189
- timeout: z.number().min(0).default(180000),
190
- default_preset: z.string().default("default"),
191
- councillor_execution_mode: CouncillorExecutionModeSchema.describe('Execution mode for councillors. "serial" runs them one at a time (required for single-model systems). "parallel" runs them concurrently (default, faster for multi-model systems).'),
192
- councillor_retries: z.number().int().min(0).max(5).default(3).describe("Number of retry attempts for councillors that return empty responses " + "(e.g. due to provider rate limiting). Default: 3 retries."),
193
- master: z.unknown().optional().describe("DEPRECATED — ignored. Council agent synthesizes directly."),
194
- master_timeout: z.unknown().optional().describe('DEPRECATED — ignored. Use "timeout" instead.'),
195
- master_fallback: z.unknown().optional().describe("DEPRECATED — ignored. No separate master session.")
196
- }).transform((data) => {
197
- const deprecated = [];
198
- if (data.master !== undefined)
199
- deprecated.push("master");
200
- if (data.master_timeout !== undefined)
201
- deprecated.push("master_timeout");
202
- if (data.master_fallback !== undefined)
203
- deprecated.push("master_fallback");
204
- const legacyMasterModel = typeof data.master === "object" && data.master !== null && "model" in data.master && typeof data.master.model === "string" ? data.master.model : undefined;
205
- return {
206
- presets: data.presets,
207
- timeout: data.timeout,
208
- default_preset: data.default_preset,
209
- councillor_execution_mode: data.councillor_execution_mode,
210
- councillor_retries: data.councillor_retries,
211
- _deprecated: deprecated.length > 0 ? deprecated : undefined,
212
- _legacyMasterModel: legacyMasterModel
213
- };
214
- });
215
140
  // src/config/schema.ts
216
- import { z as z2 } from "zod";
217
- var ProviderModelIdSchema = z2.string().regex(/^[^/\s]+\/[^\s]+$/, "Expected provider/model format (provider/.../model)");
218
- var ManualAgentPlanSchema = z2.object({
141
+ import { z } from "zod";
142
+ var ProviderModelIdSchema = z.string().regex(/^[^/\s]+\/[^\s]+$/, "Expected provider/model format (provider/.../model)");
143
+ var ManualAgentPlanSchema = z.object({
219
144
  primary: ProviderModelIdSchema,
220
145
  fallback1: ProviderModelIdSchema,
221
146
  fallback2: ProviderModelIdSchema,
@@ -229,46 +154,42 @@ var ManualAgentPlanSchema = z2.object({
229
154
  ]);
230
155
  if (unique.size !== 4) {
231
156
  ctx.addIssue({
232
- code: z2.ZodIssueCode.custom,
157
+ code: z.ZodIssueCode.custom,
233
158
  message: "primary and fallbacks must be unique per agent"
234
159
  });
235
160
  }
236
161
  });
237
- var ManualPlanSchema = z2.object({
162
+ var ManualPlanSchema = z.object({
238
163
  orchestrator: ManualAgentPlanSchema,
239
- researcher: ManualAgentPlanSchema,
240
- reviewer: ManualAgentPlanSchema,
241
- implementer: ManualAgentPlanSchema
164
+ researcher: ManualAgentPlanSchema
242
165
  }).strict();
243
- var AgentModelChainSchema = z2.array(z2.string()).min(1);
244
- var FallbackChainsSchema = z2.object({
166
+ var AgentModelChainSchema = z.array(z.string()).min(1);
167
+ var FallbackChainsSchema = z.object({
245
168
  orchestrator: AgentModelChainSchema.optional(),
246
- researcher: AgentModelChainSchema.optional(),
247
- reviewer: AgentModelChainSchema.optional(),
248
- implementer: AgentModelChainSchema.optional()
169
+ researcher: AgentModelChainSchema.optional()
249
170
  }).catchall(AgentModelChainSchema);
250
- var AgentOverrideConfigSchema = z2.object({
251
- model: z2.union([
252
- z2.string(),
253
- z2.array(z2.union([
254
- z2.string(),
255
- z2.object({
256
- id: z2.string(),
257
- variant: z2.string().optional()
171
+ var AgentOverrideConfigSchema = z.object({
172
+ model: z.union([
173
+ z.string(),
174
+ z.array(z.union([
175
+ z.string(),
176
+ z.object({
177
+ id: z.string(),
178
+ variant: z.string().optional()
258
179
  })
259
180
  ])).min(1)
260
181
  ]).optional(),
261
- temperature: z2.number().min(0).max(2).optional(),
262
- variant: z2.string().optional().catch(undefined),
263
- skills: z2.array(z2.string()).optional(),
264
- mcps: z2.array(z2.string()).optional(),
265
- prompt: z2.string().min(1).optional(),
266
- orchestratorPrompt: z2.string().min(1).optional(),
267
- options: z2.record(z2.string(), z2.unknown()).optional(),
268
- displayName: z2.string().min(1).optional()
182
+ temperature: z.number().min(0).max(2).optional(),
183
+ variant: z.string().optional().catch(undefined),
184
+ skills: z.array(z.string()).optional(),
185
+ mcps: z.array(z.string()).optional(),
186
+ prompt: z.string().min(1).optional(),
187
+ orchestratorPrompt: z.string().min(1).optional(),
188
+ options: z.record(z.string(), z.unknown()).optional(),
189
+ displayName: z.string().min(1).optional()
269
190
  }).strict();
270
- var MultiplexerTypeSchema = z2.enum(["auto", "tmux", "zellij", "none"]);
271
- var MultiplexerLayoutSchema = z2.enum([
191
+ var MultiplexerTypeSchema = z.enum(["auto", "tmux", "zellij", "none"]);
192
+ var MultiplexerLayoutSchema = z.enum([
272
193
  "main-horizontal",
273
194
  "main-vertical",
274
195
  "tiled",
@@ -276,56 +197,56 @@ var MultiplexerLayoutSchema = z2.enum([
276
197
  "even-vertical"
277
198
  ]);
278
199
  var TmuxLayoutSchema = MultiplexerLayoutSchema;
279
- var MultiplexerConfigSchema = z2.object({
200
+ var MultiplexerConfigSchema = z.object({
280
201
  type: MultiplexerTypeSchema.default("none"),
281
202
  layout: MultiplexerLayoutSchema.default("main-vertical"),
282
- main_pane_size: z2.number().min(20).max(80).default(60)
203
+ main_pane_size: z.number().min(20).max(80).default(60)
283
204
  });
284
- var TmuxConfigSchema = z2.object({
285
- enabled: z2.boolean().default(false),
205
+ var TmuxConfigSchema = z.object({
206
+ enabled: z.boolean().default(false),
286
207
  layout: TmuxLayoutSchema.default("main-vertical"),
287
- main_pane_size: z2.number().min(20).max(80).default(60)
208
+ main_pane_size: z.number().min(20).max(80).default(60)
288
209
  });
289
- var PresetSchema = z2.record(z2.string(), AgentOverrideConfigSchema);
290
- var WebsearchConfigSchema = z2.object({
291
- provider: z2.enum(["exa", "tavily"]).default("exa")
210
+ var PresetSchema = z.record(z.string(), AgentOverrideConfigSchema);
211
+ var WebsearchConfigSchema = z.object({
212
+ provider: z.enum(["exa", "tavily"]).default("exa")
292
213
  });
293
- var McpNameSchema = z2.enum(["websearch", "context7", "grep_app"]);
294
- var InterviewConfigSchema = z2.object({
295
- maxQuestions: z2.number().int().min(1).max(10).default(2),
296
- outputFolder: z2.string().min(1).default("interview"),
297
- autoOpenBrowser: z2.boolean().default(true).describe("Automatically open the interview UI in your default browser during interactive runs. Disabled automatically in tests and CI."),
298
- port: z2.number().int().min(0).max(65535).default(0),
299
- dashboard: z2.boolean().default(false)
214
+ var McpNameSchema = z.enum(["websearch", "context7", "grep_app"]);
215
+ var InterviewConfigSchema = z.object({
216
+ maxQuestions: z.number().int().min(1).max(10).default(2),
217
+ outputFolder: z.string().min(1).default("interview"),
218
+ autoOpenBrowser: z.boolean().default(true).describe("Automatically open the interview UI in your default browser during interactive runs. Disabled automatically in tests and CI."),
219
+ port: z.number().int().min(0).max(65535).default(0),
220
+ dashboard: z.boolean().default(false)
300
221
  });
301
- var SessionManagerConfigSchema = z2.object({
302
- maxSessionsPerAgent: z2.number().int().min(1).max(10).default(2),
303
- readContextMinLines: z2.number().int().min(0).max(1000).default(10),
304
- readContextMaxFiles: z2.number().int().min(0).max(50).default(8)
222
+ var SessionManagerConfigSchema = z.object({
223
+ maxSessionsPerAgent: z.number().int().min(1).max(10).default(2),
224
+ readContextMinLines: z.number().int().min(0).max(1000).default(10),
225
+ readContextMaxFiles: z.number().int().min(0).max(50).default(8)
305
226
  });
306
- var DivoomConfigSchema = z2.object({
307
- enabled: z2.boolean().default(false),
308
- python: z2.string().min(1).default("/Applications/Divoom MiniToo.app/Contents/Resources/.venv/bin/python"),
309
- script: z2.string().min(1).default("/Applications/Divoom MiniToo.app/Contents/Resources/tools/divoom_send.py"),
310
- size: z2.number().int().min(1).max(1024).default(128),
311
- fps: z2.number().int().min(1).max(60).default(8),
312
- speed: z2.number().int().min(1).max(1e4).default(125),
313
- maxFrames: z2.number().int().min(1).max(500).default(24),
314
- posterizeBits: z2.number().int().min(1).max(8).default(3),
315
- gifs: z2.record(z2.string(), z2.string().min(1)).optional()
227
+ var DivoomConfigSchema = z.object({
228
+ enabled: z.boolean().default(false),
229
+ python: z.string().min(1).default("/Applications/Divoom MiniToo.app/Contents/Resources/.venv/bin/python"),
230
+ script: z.string().min(1).default("/Applications/Divoom MiniToo.app/Contents/Resources/tools/divoom_send.py"),
231
+ size: z.number().int().min(1).max(1024).default(128),
232
+ fps: z.number().int().min(1).max(60).default(8),
233
+ speed: z.number().int().min(1).max(1e4).default(125),
234
+ maxFrames: z.number().int().min(1).max(500).default(24),
235
+ posterizeBits: z.number().int().min(1).max(8).default(3),
236
+ gifs: z.record(z.string(), z.string().min(1)).optional()
316
237
  });
317
- var TodoContinuationConfigSchema = z2.object({
318
- maxContinuations: z2.number().int().min(1).max(50).default(5).describe("Maximum consecutive auto-continuations before stopping to ask user"),
319
- cooldownMs: z2.number().int().min(0).max(30000).default(3000).describe("Delay in ms before auto-continuing (gives user time to abort)"),
320
- autoEnable: z2.boolean().default(false).describe("Automatically enable auto-continue when the orchestrator session has enough todos"),
321
- autoEnableThreshold: z2.number().int().min(1).max(50).default(4).describe("Number of todos that triggers auto-enable (only used when autoEnable is true)")
238
+ var TodoContinuationConfigSchema = z.object({
239
+ maxContinuations: z.number().int().min(1).max(50).default(5).describe("Maximum consecutive auto-continuations before stopping to ask user"),
240
+ cooldownMs: z.number().int().min(0).max(30000).default(3000).describe("Delay in ms before auto-continuing (gives user time to abort)"),
241
+ autoEnable: z.boolean().default(false).describe("Automatically enable auto-continue when the orchestrator session has enough todos"),
242
+ autoEnableThreshold: z.number().int().min(1).max(50).default(4).describe("Number of todos that triggers auto-enable (only used when autoEnable is true)")
322
243
  });
323
- var FailoverConfigSchema = z2.object({
324
- enabled: z2.boolean().default(true),
325
- timeoutMs: z2.number().min(0).default(15000),
326
- retryDelayMs: z2.number().min(0).default(500),
244
+ var FailoverConfigSchema = z.object({
245
+ enabled: z.boolean().default(true),
246
+ timeoutMs: z.number().min(0).default(15000),
247
+ retryDelayMs: z.number().min(0).default(500),
327
248
  chains: FallbackChainsSchema.default({}),
328
- retry_on_empty: z2.boolean().default(true).describe("When true (default), empty provider responses are treated as failures, " + "triggering fallback/retry. Set to false to treat them as successes.")
249
+ retry_on_empty: z.boolean().default(true).describe("When true (default), empty provider responses are treated as failures, " + "triggering fallback/retry. Set to false to treat them as successes.")
329
250
  });
330
251
  function validateCustomOnlyPromptFields(overrides, ctx, pathPrefix) {
331
252
  for (const [name, override] of Object.entries(overrides)) {
@@ -335,31 +256,31 @@ function validateCustomOnlyPromptFields(overrides, ctx, pathPrefix) {
335
256
  }
336
257
  if (override.prompt !== undefined) {
337
258
  ctx.addIssue({
338
- code: z2.ZodIssueCode.custom,
259
+ code: z.ZodIssueCode.custom,
339
260
  path: [...pathPrefix, name, "prompt"],
340
261
  message: "prompt is only supported for custom agents"
341
262
  });
342
263
  }
343
264
  if (override.orchestratorPrompt !== undefined) {
344
265
  ctx.addIssue({
345
- code: z2.ZodIssueCode.custom,
266
+ code: z.ZodIssueCode.custom,
346
267
  path: [...pathPrefix, name, "orchestratorPrompt"],
347
268
  message: "orchestratorPrompt is only supported for custom agents"
348
269
  });
349
270
  }
350
271
  }
351
272
  }
352
- var PluginConfigSchema = z2.object({
353
- preset: z2.string().optional(),
354
- setDefaultAgent: z2.boolean().optional(),
355
- scoringEngineVersion: z2.enum(["v1", "v2-shadow", "v2"]).optional(),
356
- balanceProviderUsage: z2.boolean().optional(),
357
- autoUpdate: z2.boolean().optional().describe("Disable automatic installation of plugin updates when false. Defaults to true."),
273
+ var PluginConfigSchema = z.object({
274
+ preset: z.string().optional(),
275
+ setDefaultAgent: z.boolean().optional(),
276
+ scoringEngineVersion: z.enum(["v1", "v2-shadow", "v2"]).optional(),
277
+ balanceProviderUsage: z.boolean().optional(),
278
+ autoUpdate: z.boolean().optional().describe("Disable automatic installation of plugin updates when false. Defaults to true."),
358
279
  manualPlan: ManualPlanSchema.optional(),
359
- presets: z2.record(z2.string(), PresetSchema).optional(),
360
- agents: z2.record(z2.string(), AgentOverrideConfigSchema).optional(),
361
- disabled_agents: z2.array(z2.string()).optional().describe("Agent names to disable completely. " + "Disabled agents are not instantiated and cannot be delegated to. " + "Orchestrator, researcher, reviewer, implementer and council internal agents (councillor) cannot be disabled. " + "By default, only council is disabled."),
362
- disabled_mcps: z2.array(z2.string()).optional(),
280
+ presets: z.record(z.string(), PresetSchema).optional(),
281
+ agents: z.record(z.string(), AgentOverrideConfigSchema).optional(),
282
+ disabled_agents: z.array(z.string()).optional().describe("Agent names to disable completely. " + "Disabled agents are not instantiated and cannot be delegated to. " + "Orchestrator and researcher cannot be disabled."),
283
+ disabled_mcps: z.array(z.string()).optional(),
363
284
  multiplexer: MultiplexerConfigSchema.optional(),
364
285
  tmux: TmuxConfigSchema.optional(),
365
286
  websearch: WebsearchConfigSchema.optional(),
@@ -367,8 +288,7 @@ var PluginConfigSchema = z2.object({
367
288
  sessionManager: SessionManagerConfigSchema.optional(),
368
289
  divoom: DivoomConfigSchema.optional(),
369
290
  todoContinuation: TodoContinuationConfigSchema.optional(),
370
- fallback: FailoverConfigSchema.optional(),
371
- council: CouncilConfigSchema.optional()
291
+ fallback: FailoverConfigSchema.optional()
372
292
  }).superRefine((value, ctx) => {
373
293
  if (value.agents) {
374
294
  validateCustomOnlyPromptFields(value.agents, ctx, ["agents"]);
@@ -382,11 +302,7 @@ var PluginConfigSchema = z2.object({
382
302
  // src/config/agent-mcps.ts
383
303
  var DEFAULT_AGENT_MCPS = {
384
304
  orchestrator: ["*", "!context7"],
385
- researcher: ["websearch", "context7", "grep_app"],
386
- reviewer: [],
387
- implementer: [],
388
- council: [],
389
- councillor: []
305
+ researcher: ["websearch", "context7", "grep_app"]
390
306
  };
391
307
 
392
308
  // src/cli/custom-skills.ts
@@ -394,7 +310,7 @@ var CUSTOM_SKILLS = [
394
310
  {
395
311
  name: "simplify",
396
312
  description: "Code simplification and readability-focused refactoring",
397
- allowedAgents: ["reviewer"],
313
+ allowedAgents: ["orchestrator"],
398
314
  sourcePath: "src/skills/simplify"
399
315
  },
400
316
  {
@@ -433,12 +349,6 @@ var CUSTOM_SKILLS = [
433
349
  allowedAgents: ["orchestrator"],
434
350
  sourcePath: "src/skills/dispatching-parallel-agents"
435
351
  },
436
- {
437
- name: "using-git-worktrees",
438
- description: "Create isolated git worktrees before executing implementation plans",
439
- allowedAgents: ["orchestrator"],
440
- sourcePath: "src/skills/using-git-worktrees"
441
- },
442
352
  {
443
353
  name: "finishing-a-development-branch",
444
354
  description: "Guide completion of development work with structured merge/PR options",
@@ -454,25 +364,25 @@ var CUSTOM_SKILLS = [
454
364
  {
455
365
  name: "test-driven-development",
456
366
  description: "Write failing tests first, then minimal code to pass, before any implementation",
457
- allowedAgents: ["implementer"],
367
+ allowedAgents: ["orchestrator"],
458
368
  sourcePath: "src/skills/test-driven-development"
459
369
  },
460
370
  {
461
371
  name: "verification-before-completion",
462
372
  description: "Run verification commands and confirm output before claiming work is complete",
463
- allowedAgents: ["implementer"],
373
+ allowedAgents: ["orchestrator"],
464
374
  sourcePath: "src/skills/verification-before-completion"
465
375
  },
466
376
  {
467
377
  name: "systematic-debugging",
468
378
  description: "Find root cause before attempting fixes for any bug or test failure",
469
- allowedAgents: ["reviewer"],
379
+ allowedAgents: ["orchestrator"],
470
380
  sourcePath: "src/skills/systematic-debugging"
471
381
  },
472
382
  {
473
383
  name: "receiving-code-review",
474
384
  description: "Evaluate code review feedback with technical rigor before implementing suggestions",
475
- allowedAgents: ["reviewer"],
385
+ allowedAgents: ["orchestrator"],
476
386
  sourcePath: "src/skills/receiving-code-review"
477
387
  },
478
388
  {
@@ -490,7 +400,7 @@ var RECOMMENDED_SKILLS = [
490
400
  name: "agent-browser",
491
401
  repo: "https://github.com/vercel-labs/agent-browser",
492
402
  skillName: "agent-browser",
493
- allowedAgents: ["implementer"],
403
+ allowedAgents: ["orchestrator"],
494
404
  description: "High-performance browser automation",
495
405
  postInstallCommands: [
496
406
  "npm install -g agent-browser",
@@ -539,34 +449,23 @@ var GENERATED_PRESETS = ["openai", "opencode-go"];
539
449
  var MODEL_MAPPINGS = {
540
450
  openai: {
541
451
  orchestrator: { model: "openai/gpt-5.5" },
542
- reviewer: { model: "openai/gpt-5.5", variant: "high" },
543
- researcher: { model: "openai/gpt-5.4-mini", variant: "low" },
544
- implementer: { model: "openai/gpt-5.4-mini", variant: "low" }
452
+ researcher: { model: "openai/gpt-5.4-mini", variant: "low" }
545
453
  },
546
454
  kimi: {
547
455
  orchestrator: { model: "kimi-for-coding/k2p5" },
548
- reviewer: { model: "kimi-for-coding/k2p5", variant: "high" },
549
- researcher: { model: "kimi-for-coding/k2p5", variant: "low" },
550
- implementer: { model: "kimi-for-coding/k2p5", variant: "low" }
456
+ researcher: { model: "kimi-for-coding/k2p5", variant: "low" }
551
457
  },
552
458
  copilot: {
553
459
  orchestrator: { model: "github-copilot/claude-opus-4.6" },
554
- reviewer: { model: "github-copilot/claude-opus-4.6", variant: "high" },
555
- researcher: { model: "github-copilot/grok-code-fast-1", variant: "low" },
556
- implementer: { model: "github-copilot/claude-sonnet-4.6", variant: "low" }
460
+ researcher: { model: "github-copilot/grok-code-fast-1", variant: "low" }
557
461
  },
558
462
  "zai-plan": {
559
463
  orchestrator: { model: "zai-coding-plan/glm-5" },
560
- reviewer: { model: "zai-coding-plan/glm-5", variant: "high" },
561
- researcher: { model: "zai-coding-plan/glm-5", variant: "low" },
562
- implementer: { model: "zai-coding-plan/glm-5", variant: "low" }
464
+ researcher: { model: "zai-coding-plan/glm-5", variant: "low" }
563
465
  },
564
466
  "opencode-go": {
565
467
  orchestrator: { model: "opencode-go/glm-5.1" },
566
- reviewer: { model: "opencode-go/deepseek-v4-pro", variant: "max" },
567
- council: { model: "opencode-go/deepseek-v4-pro", variant: "high" },
568
- researcher: { model: "opencode-go/minimax-m2.7" },
569
- implementer: { model: "opencode-go/deepseek-v4-flash", variant: "high" }
468
+ researcher: { model: "opencode-go/minimax-m2.7" }
570
469
  }
571
470
  };
572
471
  function isGeneratedPresetName(value) {
@@ -594,9 +493,6 @@ function generateLiteConfig(installConfig) {
594
493
  ...RECOMMENDED_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.skillName),
595
494
  ...CUSTOM_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.name)
596
495
  ];
597
- if (installConfig.installSkills && agentName === "implementer" && !skills.includes("agent-browser")) {
598
- skills.push("agent-browser");
599
- }
600
496
  return {
601
497
  model: modelInfo.model,
602
498
  variant: modelInfo.variant,
@@ -991,8 +887,7 @@ function mergePluginConfigs(base, override) {
991
887
  interview: deepMerge(base.interview, override.interview),
992
888
  sessionManager: deepMerge(base.sessionManager, override.sessionManager),
993
889
  divoom: deepMerge(base.divoom, override.divoom),
994
- fallback: deepMerge(base.fallback, override.fallback),
995
- council: deepMerge(base.council, override.council)
890
+ fallback: deepMerge(base.fallback, override.fallback)
996
891
  };
997
892
  }
998
893
  function deepMerge(base, override) {
@@ -1056,7 +951,7 @@ function checkConfigFile(scope, configPath) {
1056
951
  ok: false,
1057
952
  error: {
1058
953
  kind: "invalid-schema",
1059
- message: z3.prettifyError(parseResult.error),
954
+ message: z2.prettifyError(parseResult.error),
1060
955
  issues: parseResult.error.issues
1061
956
  }
1062
957
  };
@@ -1208,8 +1103,7 @@ Options:
1208
1103
  }
1209
1104
 
1210
1105
  // src/cli/install.ts
1211
- import { existsSync as existsSync6 } from "node:fs";
1212
- import { join as join6 } from "node:path";
1106
+ import { existsSync as existsSync4 } from "node:fs";
1213
1107
  import { createInterface } from "node:readline/promises";
1214
1108
  // src/cli/system.ts
1215
1109
  import { spawnSync as spawnSync2 } from "node:child_process";
@@ -1386,97 +1280,6 @@ function getOpenCodePath() {
1386
1280
  const path2 = resolveOpenCodePath();
1387
1281
  return path2 === "opencode" ? null : path2;
1388
1282
  }
1389
- // src/cli/skill-sync.ts
1390
- import {
1391
- cpSync,
1392
- existsSync as existsSync5,
1393
- lstatSync,
1394
- mkdirSync as mkdirSync2,
1395
- readlinkSync,
1396
- rmSync,
1397
- symlinkSync
1398
- } from "node:fs";
1399
- import { join as join5 } from "node:path";
1400
-
1401
- // src/utils/package-root.ts
1402
- import { existsSync as existsSync4 } from "node:fs";
1403
- import { join as join4 } from "node:path";
1404
- var _cachedPackageRoot;
1405
- function resolvePackageRoot() {
1406
- if (_cachedPackageRoot)
1407
- return _cachedPackageRoot;
1408
- const distDir = import.meta.dirname;
1409
- if (!distDir) {
1410
- throw new Error("import.meta.dirname is not available");
1411
- }
1412
- const npmRoot = join4(distDir, "..", "..");
1413
- if (existsSync4(join4(npmRoot, "src", "skills"))) {
1414
- _cachedPackageRoot = npmRoot;
1415
- return npmRoot;
1416
- }
1417
- const localRoot = join4(distDir, "..");
1418
- if (existsSync4(join4(localRoot, "src", "skills"))) {
1419
- _cachedPackageRoot = localRoot;
1420
- return localRoot;
1421
- }
1422
- _cachedPackageRoot = npmRoot;
1423
- return npmRoot;
1424
- }
1425
-
1426
- // src/cli/skill-sync.ts
1427
- function syncBuiltinSkills(packageRoot, skillsDirOverride) {
1428
- const resolvedPackageRoot = packageRoot ?? resolvePackageRoot();
1429
- const skillsDir = skillsDirOverride ?? join5(getConfigDir(), "skills");
1430
- mkdirSync2(skillsDir, { recursive: true });
1431
- let installed = 0;
1432
- let skipped = 0;
1433
- let unchanged = 0;
1434
- let copied = 0;
1435
- for (const skill of CUSTOM_SKILLS) {
1436
- const sourcePath = join5(resolvedPackageRoot, skill.sourcePath);
1437
- const linkPath = join5(skillsDir, skill.name);
1438
- if (!existsSync5(sourcePath)) {
1439
- skipped++;
1440
- continue;
1441
- }
1442
- try {
1443
- if (lstatSync(linkPath).isSymbolicLink()) {
1444
- const currentTarget = getSymlinkTarget(linkPath);
1445
- if (currentTarget === sourcePath) {
1446
- unchanged++;
1447
- continue;
1448
- }
1449
- rmSync(linkPath, { recursive: true, force: true });
1450
- } else if (existsSync5(linkPath)) {
1451
- rmSync(linkPath, { recursive: true, force: true });
1452
- }
1453
- } catch {
1454
- try {
1455
- rmSync(linkPath, { recursive: true, force: true });
1456
- } catch {}
1457
- }
1458
- try {
1459
- symlinkSync(sourcePath, linkPath, "junction");
1460
- installed++;
1461
- } catch {
1462
- try {
1463
- cpSync(sourcePath, linkPath, { recursive: true, force: true });
1464
- copied++;
1465
- } catch {
1466
- skipped++;
1467
- }
1468
- }
1469
- }
1470
- return { installed, skipped, unchanged, copied };
1471
- }
1472
- function getSymlinkTarget(linkPath) {
1473
- try {
1474
- return readlinkSync(linkPath, "utf-8");
1475
- } catch {
1476
- return "";
1477
- }
1478
- }
1479
-
1480
1283
  // src/cli/install.ts
1481
1284
  var GREEN = "\x1B[32m";
1482
1285
  var BLUE = "\x1B[34m";
@@ -1526,9 +1329,6 @@ async function confirm(message, defaultYes = true) {
1526
1329
  rl.close();
1527
1330
  }
1528
1331
  }
1529
- function installBuiltinSkills() {
1530
- return syncBuiltinSkills();
1531
- }
1532
1332
  async function askToStarRepo(config) {
1533
1333
  if (!config.promptForStar || config.dryRun || !process.stdin.isTTY)
1534
1334
  return;
@@ -1576,7 +1376,7 @@ async function runInstall(config) {
1576
1376
  const detected = detectCurrentConfig();
1577
1377
  const isUpdate = detected.isInstalled;
1578
1378
  printHeader(isUpdate);
1579
- let totalSteps = 7;
1379
+ let totalSteps = 6;
1580
1380
  if (config.installSkills)
1581
1381
  totalSteps += 1;
1582
1382
  let step = 1;
@@ -1632,7 +1432,7 @@ ${JSON.stringify(liteConfig, null, 2)}
1632
1432
  `);
1633
1433
  } else {
1634
1434
  const configPath2 = getExistingLiteConfigPath();
1635
- const configExists = existsSync6(configPath2);
1435
+ const configExists = existsSync4(configPath2);
1636
1436
  if (configExists && !config.reset) {
1637
1437
  printInfo(`Configuration already exists at ${configPath2}. Use --reset to overwrite.`);
1638
1438
  } else {
@@ -1641,24 +1441,6 @@ ${JSON.stringify(liteConfig, null, 2)}
1641
1441
  return 1;
1642
1442
  }
1643
1443
  }
1644
- printStep(step++, totalSteps, "Installing built-in skills...");
1645
- if (config.dryRun) {
1646
- printInfo("Dry run mode - would install built-in skills:");
1647
- for (const skill of CUSTOM_SKILLS) {
1648
- printInfo(` - ${skill.name}`);
1649
- }
1650
- } else {
1651
- const result = installBuiltinSkills();
1652
- if (result.installed > 0) {
1653
- printSuccess(`${result.installed} built-in skill(s) symlinked to ${join6(getConfigDir(), "skills")}`);
1654
- }
1655
- if (result.copied > 0) {
1656
- printInfo(`${result.copied} skill(s) copied (symlink unavailable — auto-update will NOT sync these)`);
1657
- }
1658
- if (result.skipped > 0) {
1659
- printInfo(`${result.skipped} skill(s) skipped`);
1660
- }
1661
- }
1662
1444
  if (config.installSkills) {
1663
1445
  printStep(step++, totalSteps, "Installing recommended skills...");
1664
1446
  if (config.dryRun) {