@zcy2nn/agent-forge 1.1.3 → 1.1.5
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 +188 -247
- package/agent-forge.schema.json +2 -265
- package/dist/agents/orchestrator.d.ts +1 -1
- package/dist/cli/index.js +90 -259
- package/dist/cli/providers.d.ts +0 -44
- package/dist/cli/types.d.ts +0 -2
- package/dist/config/constants.d.ts +3 -8
- package/dist/config/index.d.ts +0 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/schema.d.ts +1 -184
- package/dist/hooks/index.d.ts +0 -6
- package/dist/hooks/json-error-recovery/hook.d.ts +1 -1
- package/dist/hooks/todo-continuation/index.d.ts +2 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7875 -31853
- package/dist/tools/index.d.ts +0 -3
- package/dist/tui.js +5 -61
- package/dist/utils/index.d.ts +0 -2
- package/package.json +95 -104
- package/src/skills/brainstorming/SKILL.md +185 -186
- package/src/skills/brainstorming/scripts/frame-template.html +214 -214
- package/src/skills/brainstorming/scripts/server.cjs +354 -354
- package/src/skills/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/src/skills/requesting-code-review/SKILL.md +1 -1
- package/src/skills/subagent-driven-development/SKILL.md +1 -1
- package/src/skills/systematic-debugging/SKILL.md +318 -318
- package/src/skills/test-driven-development/SKILL.md +392 -392
- package/src/skills/verification-before-completion/SKILL.md +153 -153
- package/src/skills/writing-plans/SKILL.md +2 -2
- package/src/skills/writing-skills/graphviz-conventions.dot +171 -171
- package/dist/agents/council.d.ts +0 -27
- package/dist/agents/councillor.d.ts +0 -2
- package/dist/agents/designer.d.ts +0 -2
- package/dist/agents/explorer.d.ts +0 -2
- package/dist/agents/fixer.d.ts +0 -2
- package/dist/agents/implementer.d.ts +0 -2
- package/dist/agents/librarian.d.ts +0 -2
- package/dist/agents/observer.d.ts +0 -2
- package/dist/agents/oracle.d.ts +0 -2
- package/dist/agents/reviewer.d.ts +0 -2
- package/dist/cli/migration.d.ts +0 -46
- package/dist/config/council-schema.d.ts +0 -127
- package/dist/council/council-manager.d.ts +0 -49
- package/dist/council/index.d.ts +0 -1
- package/dist/hooks/phase-reminder/index.d.ts +0 -26
- package/dist/hooks/post-file-tool-nudge/index.d.ts +0 -19
- package/dist/skills/systematic-debugging/condition-based-waiting-example.d.ts +0 -51
- package/dist/tools/council.d.ts +0 -10
- package/src/skills/codemap/README.md +0 -59
- package/src/skills/codemap/SKILL.md +0 -163
- package/src/skills/codemap/codemap.md +0 -36
- package/src/skills/codemap/scripts/codemap.mjs +0 -483
- package/src/skills/codemap/scripts/codemap.test.ts +0 -129
- package/src/skills/codemap.md +0 -40
- package/src/skills/simplify/README.md +0 -19
- package/src/skills/simplify/SKILL.md +0 -138
- package/src/skills/simplify/codemap.md +0 -36
- package/src/skills/using-git-worktrees/SKILL.md +0 -226
package/dist/cli/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
2
3
|
import { createRequire } from "node:module";
|
|
3
4
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
4
5
|
|
|
5
6
|
// src/cli/doctor.ts
|
|
6
7
|
import * as fs2 from "node:fs";
|
|
7
|
-
import { z as
|
|
8
|
+
import { z as z2 } from "zod";
|
|
8
9
|
|
|
9
10
|
// src/config/loader.ts
|
|
10
11
|
import * as fs from "node:fs";
|
|
@@ -125,96 +126,16 @@ function ensureOpenCodeConfigDir() {
|
|
|
125
126
|
}
|
|
126
127
|
|
|
127
128
|
// src/config/constants.ts
|
|
128
|
-
var SUBAGENT_NAMES = [
|
|
129
|
-
"researcher",
|
|
130
|
-
"reviewer",
|
|
131
|
-
"implementer",
|
|
132
|
-
"council",
|
|
133
|
-
"councillor"
|
|
134
|
-
];
|
|
129
|
+
var SUBAGENT_NAMES = ["researcher"];
|
|
135
130
|
var ORCHESTRATOR_NAME = "orchestrator";
|
|
136
131
|
var ALL_AGENT_NAMES = [ORCHESTRATOR_NAME, ...SUBAGENT_NAMES];
|
|
137
|
-
var PROTECTED_AGENTS = new Set([
|
|
138
|
-
"orchestrator",
|
|
139
|
-
"researcher",
|
|
140
|
-
"reviewer",
|
|
141
|
-
"implementer",
|
|
142
|
-
"councillor"
|
|
143
|
-
]);
|
|
132
|
+
var PROTECTED_AGENTS = new Set(["orchestrator", "researcher"]);
|
|
144
133
|
var DEFAULT_TIMEOUT_MS = 2 * 60 * 1000;
|
|
145
134
|
var MAX_POLL_TIME_MS = 5 * 60 * 1000;
|
|
146
|
-
// src/config/council-schema.ts
|
|
147
|
-
import { z } from "zod";
|
|
148
|
-
var ModelIdSchema = z.string().regex(/^[^/\s]+\/[^\s]+$/, 'Expected provider/model format (e.g. "openai/gpt-5.4-mini")');
|
|
149
|
-
var CouncillorConfigSchema = z.object({
|
|
150
|
-
model: ModelIdSchema.describe('Model ID in provider/model format (e.g. "openai/gpt-5.4-mini")'),
|
|
151
|
-
variant: z.string().optional(),
|
|
152
|
-
prompt: z.string().optional().describe("Optional role/guidance injected into the councillor user prompt")
|
|
153
|
-
});
|
|
154
|
-
var CouncilPresetSchema = z.record(z.string(), z.record(z.string(), z.unknown())).transform((entries, ctx) => {
|
|
155
|
-
const councillors = {};
|
|
156
|
-
for (const [key, raw] of Object.entries(entries)) {
|
|
157
|
-
if (key === "master")
|
|
158
|
-
continue;
|
|
159
|
-
if (key === "councillors" && typeof raw === "object" && raw !== null) {
|
|
160
|
-
for (const [innerKey, innerRaw] of Object.entries(raw)) {
|
|
161
|
-
const innerParsed = CouncillorConfigSchema.safeParse(innerRaw);
|
|
162
|
-
if (!innerParsed.success) {
|
|
163
|
-
ctx.addIssue({
|
|
164
|
-
code: z.ZodIssueCode.custom,
|
|
165
|
-
message: `Invalid councillor "${innerKey}" (nested under legacy "councillors" key): ${innerParsed.error.issues.map((i) => i.message).join(", ")}`
|
|
166
|
-
});
|
|
167
|
-
return z.NEVER;
|
|
168
|
-
}
|
|
169
|
-
councillors[innerKey] = innerParsed.data;
|
|
170
|
-
}
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
const parsed = CouncillorConfigSchema.safeParse(raw);
|
|
174
|
-
if (!parsed.success) {
|
|
175
|
-
ctx.addIssue({
|
|
176
|
-
code: z.ZodIssueCode.custom,
|
|
177
|
-
message: `Invalid councillor "${key}": ${parsed.error.issues.map((i) => i.message).join(", ")}`
|
|
178
|
-
});
|
|
179
|
-
return z.NEVER;
|
|
180
|
-
}
|
|
181
|
-
councillors[key] = parsed.data;
|
|
182
|
-
}
|
|
183
|
-
return councillors;
|
|
184
|
-
});
|
|
185
|
-
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.');
|
|
186
|
-
var CouncilConfigSchema = z.object({
|
|
187
|
-
presets: z.record(z.string(), CouncilPresetSchema),
|
|
188
|
-
timeout: z.number().min(0).default(180000),
|
|
189
|
-
default_preset: z.string().default("default"),
|
|
190
|
-
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).'),
|
|
191
|
-
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."),
|
|
192
|
-
master: z.unknown().optional().describe("DEPRECATED — ignored. Council agent synthesizes directly."),
|
|
193
|
-
master_timeout: z.unknown().optional().describe('DEPRECATED — ignored. Use "timeout" instead.'),
|
|
194
|
-
master_fallback: z.unknown().optional().describe("DEPRECATED — ignored. No separate master session.")
|
|
195
|
-
}).transform((data) => {
|
|
196
|
-
const deprecated = [];
|
|
197
|
-
if (data.master !== undefined)
|
|
198
|
-
deprecated.push("master");
|
|
199
|
-
if (data.master_timeout !== undefined)
|
|
200
|
-
deprecated.push("master_timeout");
|
|
201
|
-
if (data.master_fallback !== undefined)
|
|
202
|
-
deprecated.push("master_fallback");
|
|
203
|
-
const legacyMasterModel = typeof data.master === "object" && data.master !== null && "model" in data.master && typeof data.master.model === "string" ? data.master.model : undefined;
|
|
204
|
-
return {
|
|
205
|
-
presets: data.presets,
|
|
206
|
-
timeout: data.timeout,
|
|
207
|
-
default_preset: data.default_preset,
|
|
208
|
-
councillor_execution_mode: data.councillor_execution_mode,
|
|
209
|
-
councillor_retries: data.councillor_retries,
|
|
210
|
-
_deprecated: deprecated.length > 0 ? deprecated : undefined,
|
|
211
|
-
_legacyMasterModel: legacyMasterModel
|
|
212
|
-
};
|
|
213
|
-
});
|
|
214
135
|
// src/config/schema.ts
|
|
215
|
-
import { z
|
|
216
|
-
var ProviderModelIdSchema =
|
|
217
|
-
var ManualAgentPlanSchema =
|
|
136
|
+
import { z } from "zod";
|
|
137
|
+
var ProviderModelIdSchema = z.string().regex(/^[^/\s]+\/[^\s]+$/, "Expected provider/model format (provider/.../model)");
|
|
138
|
+
var ManualAgentPlanSchema = z.object({
|
|
218
139
|
primary: ProviderModelIdSchema,
|
|
219
140
|
fallback1: ProviderModelIdSchema,
|
|
220
141
|
fallback2: ProviderModelIdSchema,
|
|
@@ -228,103 +149,63 @@ var ManualAgentPlanSchema = z2.object({
|
|
|
228
149
|
]);
|
|
229
150
|
if (unique.size !== 4) {
|
|
230
151
|
ctx.addIssue({
|
|
231
|
-
code:
|
|
152
|
+
code: z.ZodIssueCode.custom,
|
|
232
153
|
message: "primary and fallbacks must be unique per agent"
|
|
233
154
|
});
|
|
234
155
|
}
|
|
235
156
|
});
|
|
236
|
-
var ManualPlanSchema =
|
|
157
|
+
var ManualPlanSchema = z.object({
|
|
237
158
|
orchestrator: ManualAgentPlanSchema,
|
|
238
|
-
researcher: ManualAgentPlanSchema
|
|
239
|
-
reviewer: ManualAgentPlanSchema,
|
|
240
|
-
implementer: ManualAgentPlanSchema
|
|
159
|
+
researcher: ManualAgentPlanSchema
|
|
241
160
|
}).strict();
|
|
242
|
-
var
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
model: z2.union([
|
|
251
|
-
z2.string(),
|
|
252
|
-
z2.array(z2.union([
|
|
253
|
-
z2.string(),
|
|
254
|
-
z2.object({
|
|
255
|
-
id: z2.string(),
|
|
256
|
-
variant: z2.string().optional()
|
|
161
|
+
var AgentOverrideConfigSchema = z.object({
|
|
162
|
+
model: z.union([
|
|
163
|
+
z.string(),
|
|
164
|
+
z.array(z.union([
|
|
165
|
+
z.string(),
|
|
166
|
+
z.object({
|
|
167
|
+
id: z.string(),
|
|
168
|
+
variant: z.string().optional()
|
|
257
169
|
})
|
|
258
170
|
])).min(1)
|
|
259
171
|
]).optional(),
|
|
260
|
-
temperature:
|
|
261
|
-
variant:
|
|
262
|
-
skills:
|
|
263
|
-
mcps:
|
|
264
|
-
prompt:
|
|
265
|
-
orchestratorPrompt:
|
|
266
|
-
options:
|
|
267
|
-
displayName:
|
|
172
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
173
|
+
variant: z.string().optional().catch(undefined),
|
|
174
|
+
skills: z.array(z.string()).optional(),
|
|
175
|
+
mcps: z.array(z.string()).optional(),
|
|
176
|
+
prompt: z.string().min(1).optional(),
|
|
177
|
+
orchestratorPrompt: z.string().min(1).optional(),
|
|
178
|
+
options: z.record(z.string(), z.unknown()).optional(),
|
|
179
|
+
displayName: z.string().min(1).optional()
|
|
268
180
|
}).strict();
|
|
269
|
-
var
|
|
270
|
-
var
|
|
271
|
-
"
|
|
272
|
-
"main-vertical",
|
|
273
|
-
"tiled",
|
|
274
|
-
"even-horizontal",
|
|
275
|
-
"even-vertical"
|
|
276
|
-
]);
|
|
277
|
-
var TmuxLayoutSchema = MultiplexerLayoutSchema;
|
|
278
|
-
var MultiplexerConfigSchema = z2.object({
|
|
279
|
-
type: MultiplexerTypeSchema.default("none"),
|
|
280
|
-
layout: MultiplexerLayoutSchema.default("main-vertical"),
|
|
281
|
-
main_pane_size: z2.number().min(20).max(80).default(60)
|
|
282
|
-
});
|
|
283
|
-
var TmuxConfigSchema = z2.object({
|
|
284
|
-
enabled: z2.boolean().default(false),
|
|
285
|
-
layout: TmuxLayoutSchema.default("main-vertical"),
|
|
286
|
-
main_pane_size: z2.number().min(20).max(80).default(60)
|
|
287
|
-
});
|
|
288
|
-
var PresetSchema = z2.record(z2.string(), AgentOverrideConfigSchema);
|
|
289
|
-
var WebsearchConfigSchema = z2.object({
|
|
290
|
-
provider: z2.enum(["exa", "tavily"]).default("exa")
|
|
291
|
-
});
|
|
292
|
-
var McpNameSchema = z2.enum(["websearch", "context7", "grep_app"]);
|
|
293
|
-
var InterviewConfigSchema = z2.object({
|
|
294
|
-
maxQuestions: z2.number().int().min(1).max(10).default(2),
|
|
295
|
-
outputFolder: z2.string().min(1).default("interview"),
|
|
296
|
-
autoOpenBrowser: z2.boolean().default(true).describe("Automatically open the interview UI in your default browser during interactive runs. Disabled automatically in tests and CI."),
|
|
297
|
-
port: z2.number().int().min(0).max(65535).default(0),
|
|
298
|
-
dashboard: z2.boolean().default(false)
|
|
299
|
-
});
|
|
300
|
-
var SessionManagerConfigSchema = z2.object({
|
|
301
|
-
maxSessionsPerAgent: z2.number().int().min(1).max(10).default(2),
|
|
302
|
-
readContextMinLines: z2.number().int().min(0).max(1000).default(10),
|
|
303
|
-
readContextMaxFiles: z2.number().int().min(0).max(50).default(8)
|
|
181
|
+
var PresetSchema = z.record(z.string(), AgentOverrideConfigSchema);
|
|
182
|
+
var WebsearchConfigSchema = z.object({
|
|
183
|
+
provider: z.enum(["exa", "tavily"]).default("exa")
|
|
304
184
|
});
|
|
305
|
-
var
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
maxFrames: z2.number().int().min(1).max(500).default(24),
|
|
313
|
-
posterizeBits: z2.number().int().min(1).max(8).default(3),
|
|
314
|
-
gifs: z2.record(z2.string(), z2.string().min(1)).optional()
|
|
185
|
+
var McpNameSchema = z.enum(["websearch", "context7", "grep_app"]);
|
|
186
|
+
var InterviewConfigSchema = z.object({
|
|
187
|
+
maxQuestions: z.number().int().min(1).max(10).default(2),
|
|
188
|
+
outputFolder: z.string().min(1).default("interview"),
|
|
189
|
+
autoOpenBrowser: z.boolean().default(true).describe("Automatically open the interview UI in your default browser during interactive runs. Disabled automatically in tests and CI."),
|
|
190
|
+
port: z.number().int().min(0).max(65535).default(0),
|
|
191
|
+
dashboard: z.boolean().default(false)
|
|
315
192
|
});
|
|
316
|
-
var
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
193
|
+
var DivoomConfigSchema = z.object({
|
|
194
|
+
enabled: z.boolean().default(false),
|
|
195
|
+
python: z.string().min(1).default("/Applications/Divoom MiniToo.app/Contents/Resources/.venv/bin/python"),
|
|
196
|
+
script: z.string().min(1).default("/Applications/Divoom MiniToo.app/Contents/Resources/tools/divoom_send.py"),
|
|
197
|
+
size: z.number().int().min(1).max(1024).default(128),
|
|
198
|
+
fps: z.number().int().min(1).max(60).default(8),
|
|
199
|
+
speed: z.number().int().min(1).max(1e4).default(125),
|
|
200
|
+
maxFrames: z.number().int().min(1).max(500).default(24),
|
|
201
|
+
posterizeBits: z.number().int().min(1).max(8).default(3),
|
|
202
|
+
gifs: z.record(z.string(), z.string().min(1)).optional()
|
|
321
203
|
});
|
|
322
|
-
var
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
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.")
|
|
204
|
+
var TodoContinuationConfigSchema = z.object({
|
|
205
|
+
maxContinuations: z.number().int().min(1).max(50).default(5).describe("Maximum consecutive auto-continuations before stopping to ask user"),
|
|
206
|
+
cooldownMs: z.number().int().min(0).max(30000).default(3000).describe("Delay in ms before auto-continuing (gives user time to abort)"),
|
|
207
|
+
autoEnable: z.boolean().default(false).describe("Automatically enable auto-continue when the orchestrator session has enough todos"),
|
|
208
|
+
autoEnableThreshold: z.number().int().min(1).max(50).default(4).describe("Number of todos that triggers auto-enable (only used when autoEnable is true)")
|
|
328
209
|
});
|
|
329
210
|
function validateCustomOnlyPromptFields(overrides, ctx, pathPrefix) {
|
|
330
211
|
for (const [name, override] of Object.entries(overrides)) {
|
|
@@ -334,40 +215,35 @@ function validateCustomOnlyPromptFields(overrides, ctx, pathPrefix) {
|
|
|
334
215
|
}
|
|
335
216
|
if (override.prompt !== undefined) {
|
|
336
217
|
ctx.addIssue({
|
|
337
|
-
code:
|
|
218
|
+
code: z.ZodIssueCode.custom,
|
|
338
219
|
path: [...pathPrefix, name, "prompt"],
|
|
339
220
|
message: "prompt is only supported for custom agents"
|
|
340
221
|
});
|
|
341
222
|
}
|
|
342
223
|
if (override.orchestratorPrompt !== undefined) {
|
|
343
224
|
ctx.addIssue({
|
|
344
|
-
code:
|
|
225
|
+
code: z.ZodIssueCode.custom,
|
|
345
226
|
path: [...pathPrefix, name, "orchestratorPrompt"],
|
|
346
227
|
message: "orchestratorPrompt is only supported for custom agents"
|
|
347
228
|
});
|
|
348
229
|
}
|
|
349
230
|
}
|
|
350
231
|
}
|
|
351
|
-
var PluginConfigSchema =
|
|
352
|
-
preset:
|
|
353
|
-
setDefaultAgent:
|
|
354
|
-
scoringEngineVersion:
|
|
355
|
-
balanceProviderUsage:
|
|
356
|
-
autoUpdate:
|
|
232
|
+
var PluginConfigSchema = z.object({
|
|
233
|
+
preset: z.string().optional(),
|
|
234
|
+
setDefaultAgent: z.boolean().optional(),
|
|
235
|
+
scoringEngineVersion: z.enum(["v1", "v2-shadow", "v2"]).optional(),
|
|
236
|
+
balanceProviderUsage: z.boolean().optional(),
|
|
237
|
+
autoUpdate: z.boolean().optional().describe("Disable automatic installation of plugin updates when false. Defaults to true."),
|
|
357
238
|
manualPlan: ManualPlanSchema.optional(),
|
|
358
|
-
presets:
|
|
359
|
-
agents:
|
|
360
|
-
disabled_agents:
|
|
361
|
-
disabled_mcps:
|
|
362
|
-
multiplexer: MultiplexerConfigSchema.optional(),
|
|
363
|
-
tmux: TmuxConfigSchema.optional(),
|
|
239
|
+
presets: z.record(z.string(), PresetSchema).optional(),
|
|
240
|
+
agents: z.record(z.string(), AgentOverrideConfigSchema).optional(),
|
|
241
|
+
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."),
|
|
242
|
+
disabled_mcps: z.array(z.string()).optional(),
|
|
364
243
|
websearch: WebsearchConfigSchema.optional(),
|
|
365
244
|
interview: InterviewConfigSchema.optional(),
|
|
366
|
-
sessionManager: SessionManagerConfigSchema.optional(),
|
|
367
245
|
divoom: DivoomConfigSchema.optional(),
|
|
368
|
-
todoContinuation: TodoContinuationConfigSchema.optional()
|
|
369
|
-
fallback: FailoverConfigSchema.optional(),
|
|
370
|
-
council: CouncilConfigSchema.optional()
|
|
246
|
+
todoContinuation: TodoContinuationConfigSchema.optional()
|
|
371
247
|
}).superRefine((value, ctx) => {
|
|
372
248
|
if (value.agents) {
|
|
373
249
|
validateCustomOnlyPromptFields(value.agents, ctx, ["agents"]);
|
|
@@ -381,27 +257,11 @@ var PluginConfigSchema = z2.object({
|
|
|
381
257
|
// src/config/agent-mcps.ts
|
|
382
258
|
var DEFAULT_AGENT_MCPS = {
|
|
383
259
|
orchestrator: ["*", "!context7"],
|
|
384
|
-
researcher: ["websearch", "context7", "grep_app"]
|
|
385
|
-
reviewer: [],
|
|
386
|
-
implementer: [],
|
|
387
|
-
council: [],
|
|
388
|
-
councillor: []
|
|
260
|
+
researcher: ["websearch", "context7", "grep_app"]
|
|
389
261
|
};
|
|
390
262
|
|
|
391
263
|
// src/cli/custom-skills.ts
|
|
392
264
|
var CUSTOM_SKILLS = [
|
|
393
|
-
{
|
|
394
|
-
name: "simplify",
|
|
395
|
-
description: "Code simplification and readability-focused refactoring",
|
|
396
|
-
allowedAgents: ["reviewer"],
|
|
397
|
-
sourcePath: "src/skills/simplify"
|
|
398
|
-
},
|
|
399
|
-
{
|
|
400
|
-
name: "codemap",
|
|
401
|
-
description: "Repository understanding and hierarchical codemap generation",
|
|
402
|
-
allowedAgents: ["orchestrator"],
|
|
403
|
-
sourcePath: "src/skills/codemap"
|
|
404
|
-
},
|
|
405
265
|
{
|
|
406
266
|
name: "brainstorming",
|
|
407
267
|
description: "Turn ideas into designs through collaborative dialogue before implementation",
|
|
@@ -432,12 +292,6 @@ var CUSTOM_SKILLS = [
|
|
|
432
292
|
allowedAgents: ["orchestrator"],
|
|
433
293
|
sourcePath: "src/skills/dispatching-parallel-agents"
|
|
434
294
|
},
|
|
435
|
-
{
|
|
436
|
-
name: "using-git-worktrees",
|
|
437
|
-
description: "Create isolated git worktrees before executing implementation plans",
|
|
438
|
-
allowedAgents: ["orchestrator"],
|
|
439
|
-
sourcePath: "src/skills/using-git-worktrees"
|
|
440
|
-
},
|
|
441
295
|
{
|
|
442
296
|
name: "finishing-a-development-branch",
|
|
443
297
|
description: "Guide completion of development work with structured merge/PR options",
|
|
@@ -453,25 +307,25 @@ var CUSTOM_SKILLS = [
|
|
|
453
307
|
{
|
|
454
308
|
name: "test-driven-development",
|
|
455
309
|
description: "Write failing tests first, then minimal code to pass, before any implementation",
|
|
456
|
-
allowedAgents: ["
|
|
310
|
+
allowedAgents: ["orchestrator"],
|
|
457
311
|
sourcePath: "src/skills/test-driven-development"
|
|
458
312
|
},
|
|
459
313
|
{
|
|
460
314
|
name: "verification-before-completion",
|
|
461
315
|
description: "Run verification commands and confirm output before claiming work is complete",
|
|
462
|
-
allowedAgents: ["
|
|
316
|
+
allowedAgents: ["orchestrator"],
|
|
463
317
|
sourcePath: "src/skills/verification-before-completion"
|
|
464
318
|
},
|
|
465
319
|
{
|
|
466
320
|
name: "systematic-debugging",
|
|
467
321
|
description: "Find root cause before attempting fixes for any bug or test failure",
|
|
468
|
-
allowedAgents: ["
|
|
322
|
+
allowedAgents: ["orchestrator"],
|
|
469
323
|
sourcePath: "src/skills/systematic-debugging"
|
|
470
324
|
},
|
|
471
325
|
{
|
|
472
326
|
name: "receiving-code-review",
|
|
473
327
|
description: "Evaluate code review feedback with technical rigor before implementing suggestions",
|
|
474
|
-
allowedAgents: ["
|
|
328
|
+
allowedAgents: ["orchestrator"],
|
|
475
329
|
sourcePath: "src/skills/receiving-code-review"
|
|
476
330
|
},
|
|
477
331
|
{
|
|
@@ -489,7 +343,7 @@ var RECOMMENDED_SKILLS = [
|
|
|
489
343
|
name: "agent-browser",
|
|
490
344
|
repo: "https://github.com/vercel-labs/agent-browser",
|
|
491
345
|
skillName: "agent-browser",
|
|
492
|
-
allowedAgents: ["
|
|
346
|
+
allowedAgents: ["orchestrator"],
|
|
493
347
|
description: "High-performance browser automation",
|
|
494
348
|
postInstallCommands: [
|
|
495
349
|
"npm install -g agent-browser",
|
|
@@ -538,34 +392,23 @@ var GENERATED_PRESETS = ["openai", "opencode-go"];
|
|
|
538
392
|
var MODEL_MAPPINGS = {
|
|
539
393
|
openai: {
|
|
540
394
|
orchestrator: { model: "openai/gpt-5.5" },
|
|
541
|
-
|
|
542
|
-
researcher: { model: "openai/gpt-5.4-mini", variant: "low" },
|
|
543
|
-
implementer: { model: "openai/gpt-5.4-mini", variant: "low" }
|
|
395
|
+
researcher: { model: "openai/gpt-5.4-mini", variant: "low" }
|
|
544
396
|
},
|
|
545
397
|
kimi: {
|
|
546
398
|
orchestrator: { model: "kimi-for-coding/k2p5" },
|
|
547
|
-
|
|
548
|
-
researcher: { model: "kimi-for-coding/k2p5", variant: "low" },
|
|
549
|
-
implementer: { model: "kimi-for-coding/k2p5", variant: "low" }
|
|
399
|
+
researcher: { model: "kimi-for-coding/k2p5", variant: "low" }
|
|
550
400
|
},
|
|
551
401
|
copilot: {
|
|
552
402
|
orchestrator: { model: "github-copilot/claude-opus-4.6" },
|
|
553
|
-
|
|
554
|
-
researcher: { model: "github-copilot/grok-code-fast-1", variant: "low" },
|
|
555
|
-
implementer: { model: "github-copilot/claude-sonnet-4.6", variant: "low" }
|
|
403
|
+
researcher: { model: "github-copilot/grok-code-fast-1", variant: "low" }
|
|
556
404
|
},
|
|
557
405
|
"zai-plan": {
|
|
558
406
|
orchestrator: { model: "zai-coding-plan/glm-5" },
|
|
559
|
-
|
|
560
|
-
researcher: { model: "zai-coding-plan/glm-5", variant: "low" },
|
|
561
|
-
implementer: { model: "zai-coding-plan/glm-5", variant: "low" }
|
|
407
|
+
researcher: { model: "zai-coding-plan/glm-5", variant: "low" }
|
|
562
408
|
},
|
|
563
409
|
"opencode-go": {
|
|
564
410
|
orchestrator: { model: "opencode-go/glm-5.1" },
|
|
565
|
-
|
|
566
|
-
council: { model: "opencode-go/deepseek-v4-pro", variant: "high" },
|
|
567
|
-
researcher: { model: "opencode-go/minimax-m2.7" },
|
|
568
|
-
implementer: { model: "opencode-go/deepseek-v4-flash", variant: "high" }
|
|
411
|
+
researcher: { model: "opencode-go/minimax-m2.7" }
|
|
569
412
|
}
|
|
570
413
|
};
|
|
571
414
|
function isGeneratedPresetName(value) {
|
|
@@ -593,9 +436,6 @@ function generateLiteConfig(installConfig) {
|
|
|
593
436
|
...RECOMMENDED_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.skillName),
|
|
594
437
|
...CUSTOM_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.name)
|
|
595
438
|
];
|
|
596
|
-
if (installConfig.installSkills && agentName === "implementer" && !skills.includes("agent-browser")) {
|
|
597
|
-
skills.push("agent-browser");
|
|
598
|
-
}
|
|
599
439
|
return {
|
|
600
440
|
model: modelInfo.model,
|
|
601
441
|
variant: modelInfo.variant,
|
|
@@ -614,13 +454,6 @@ function generateLiteConfig(installConfig) {
|
|
|
614
454
|
for (const presetName of GENERATED_PRESETS) {
|
|
615
455
|
presets[presetName] = buildPreset(presetName);
|
|
616
456
|
}
|
|
617
|
-
if (installConfig.hasTmux) {
|
|
618
|
-
config.tmux = {
|
|
619
|
-
enabled: true,
|
|
620
|
-
layout: "main-vertical",
|
|
621
|
-
main_pane_size: 60
|
|
622
|
-
};
|
|
623
|
-
}
|
|
624
457
|
return config;
|
|
625
458
|
}
|
|
626
459
|
|
|
@@ -908,8 +741,7 @@ function detectCurrentConfig() {
|
|
|
908
741
|
hasZaiPlan: false,
|
|
909
742
|
hasAntigravity: false,
|
|
910
743
|
hasChutes: false,
|
|
911
|
-
hasOpencodeZen: false
|
|
912
|
-
hasTmux: false
|
|
744
|
+
hasOpencodeZen: false
|
|
913
745
|
};
|
|
914
746
|
const { config } = parseConfig(getExistingConfigPath());
|
|
915
747
|
if (!config)
|
|
@@ -945,10 +777,6 @@ function detectCurrentConfig() {
|
|
|
945
777
|
result.hasChutes = true;
|
|
946
778
|
}
|
|
947
779
|
}
|
|
948
|
-
if (configObj.tmux && typeof configObj.tmux === "object") {
|
|
949
|
-
const tmuxConfig = configObj.tmux;
|
|
950
|
-
result.hasTmux = tmuxConfig.enabled === true;
|
|
951
|
-
}
|
|
952
780
|
}
|
|
953
781
|
return result;
|
|
954
782
|
}
|
|
@@ -985,13 +813,8 @@ function mergePluginConfigs(base, override) {
|
|
|
985
813
|
...base,
|
|
986
814
|
...override,
|
|
987
815
|
agents: deepMerge(base.agents, override.agents),
|
|
988
|
-
tmux: deepMerge(base.tmux, override.tmux),
|
|
989
|
-
multiplexer: deepMerge(base.multiplexer, override.multiplexer),
|
|
990
816
|
interview: deepMerge(base.interview, override.interview),
|
|
991
|
-
|
|
992
|
-
divoom: deepMerge(base.divoom, override.divoom),
|
|
993
|
-
fallback: deepMerge(base.fallback, override.fallback),
|
|
994
|
-
council: deepMerge(base.council, override.council)
|
|
817
|
+
divoom: deepMerge(base.divoom, override.divoom)
|
|
995
818
|
};
|
|
996
819
|
}
|
|
997
820
|
function deepMerge(base, override) {
|
|
@@ -1055,7 +878,7 @@ function checkConfigFile(scope, configPath) {
|
|
|
1055
878
|
ok: false,
|
|
1056
879
|
error: {
|
|
1057
880
|
kind: "invalid-schema",
|
|
1058
|
-
message:
|
|
881
|
+
message: z2.prettifyError(parseResult.error),
|
|
1059
882
|
issues: parseResult.error.issues
|
|
1060
883
|
}
|
|
1061
884
|
};
|
|
@@ -1601,7 +1424,6 @@ ${JSON.stringify(liteConfig, null, 2)}
|
|
|
1601
1424
|
}
|
|
1602
1425
|
async function install(args) {
|
|
1603
1426
|
const config = {
|
|
1604
|
-
hasTmux: false,
|
|
1605
1427
|
installSkills: args.skills === "yes",
|
|
1606
1428
|
preset: args.preset,
|
|
1607
1429
|
promptForStar: args.tui,
|
|
@@ -1611,6 +1433,15 @@ async function install(args) {
|
|
|
1611
1433
|
return runInstall(config);
|
|
1612
1434
|
}
|
|
1613
1435
|
|
|
1436
|
+
// src/cli/providers.ts
|
|
1437
|
+
var GENERATED_PRESETS2 = ["openai", "opencode-go"];
|
|
1438
|
+
function isGeneratedPresetName2(value) {
|
|
1439
|
+
return GENERATED_PRESETS2.includes(value);
|
|
1440
|
+
}
|
|
1441
|
+
function getGeneratedPresetNames2() {
|
|
1442
|
+
return [...GENERATED_PRESETS2];
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1614
1445
|
// src/cli/index.ts
|
|
1615
1446
|
function parseArgs(args) {
|
|
1616
1447
|
const result = {
|
|
@@ -1624,8 +1455,8 @@ function parseArgs(args) {
|
|
|
1624
1455
|
result.skills = arg.split("=")[1];
|
|
1625
1456
|
} else if (arg.startsWith("--preset=")) {
|
|
1626
1457
|
const preset = arg.split("=")[1];
|
|
1627
|
-
if (!
|
|
1628
|
-
console.error(`Unsupported preset: ${preset}. Available presets: ${
|
|
1458
|
+
if (!isGeneratedPresetName2(preset)) {
|
|
1459
|
+
console.error(`Unsupported preset: ${preset}. Available presets: ${getGeneratedPresetNames2().join(", ")}`);
|
|
1629
1460
|
process.exit(1);
|
|
1630
1461
|
}
|
|
1631
1462
|
result.preset = preset;
|
|
@@ -1659,7 +1490,7 @@ Options:
|
|
|
1659
1490
|
Doctor options:
|
|
1660
1491
|
--json Print diagnostics as JSON
|
|
1661
1492
|
|
|
1662
|
-
Available presets: ${
|
|
1493
|
+
Available presets: ${getGeneratedPresetNames2().join(", ")}
|
|
1663
1494
|
|
|
1664
1495
|
The installer generates OpenAI and OpenCode Go presets by default.
|
|
1665
1496
|
OpenAI is active unless --preset selects another generated preset.
|
package/dist/cli/providers.d.ts
CHANGED
|
@@ -5,89 +5,45 @@ export declare const MODEL_MAPPINGS: {
|
|
|
5
5
|
readonly orchestrator: {
|
|
6
6
|
readonly model: "openai/gpt-5.5";
|
|
7
7
|
};
|
|
8
|
-
readonly reviewer: {
|
|
9
|
-
readonly model: "openai/gpt-5.5";
|
|
10
|
-
readonly variant: "high";
|
|
11
|
-
};
|
|
12
8
|
readonly researcher: {
|
|
13
9
|
readonly model: "openai/gpt-5.4-mini";
|
|
14
10
|
readonly variant: "low";
|
|
15
11
|
};
|
|
16
|
-
readonly implementer: {
|
|
17
|
-
readonly model: "openai/gpt-5.4-mini";
|
|
18
|
-
readonly variant: "low";
|
|
19
|
-
};
|
|
20
12
|
};
|
|
21
13
|
readonly kimi: {
|
|
22
14
|
readonly orchestrator: {
|
|
23
15
|
readonly model: "kimi-for-coding/k2p5";
|
|
24
16
|
};
|
|
25
|
-
readonly reviewer: {
|
|
26
|
-
readonly model: "kimi-for-coding/k2p5";
|
|
27
|
-
readonly variant: "high";
|
|
28
|
-
};
|
|
29
17
|
readonly researcher: {
|
|
30
18
|
readonly model: "kimi-for-coding/k2p5";
|
|
31
19
|
readonly variant: "low";
|
|
32
20
|
};
|
|
33
|
-
readonly implementer: {
|
|
34
|
-
readonly model: "kimi-for-coding/k2p5";
|
|
35
|
-
readonly variant: "low";
|
|
36
|
-
};
|
|
37
21
|
};
|
|
38
22
|
readonly copilot: {
|
|
39
23
|
readonly orchestrator: {
|
|
40
24
|
readonly model: "github-copilot/claude-opus-4.6";
|
|
41
25
|
};
|
|
42
|
-
readonly reviewer: {
|
|
43
|
-
readonly model: "github-copilot/claude-opus-4.6";
|
|
44
|
-
readonly variant: "high";
|
|
45
|
-
};
|
|
46
26
|
readonly researcher: {
|
|
47
27
|
readonly model: "github-copilot/grok-code-fast-1";
|
|
48
28
|
readonly variant: "low";
|
|
49
29
|
};
|
|
50
|
-
readonly implementer: {
|
|
51
|
-
readonly model: "github-copilot/claude-sonnet-4.6";
|
|
52
|
-
readonly variant: "low";
|
|
53
|
-
};
|
|
54
30
|
};
|
|
55
31
|
readonly 'zai-plan': {
|
|
56
32
|
readonly orchestrator: {
|
|
57
33
|
readonly model: "zai-coding-plan/glm-5";
|
|
58
34
|
};
|
|
59
|
-
readonly reviewer: {
|
|
60
|
-
readonly model: "zai-coding-plan/glm-5";
|
|
61
|
-
readonly variant: "high";
|
|
62
|
-
};
|
|
63
35
|
readonly researcher: {
|
|
64
36
|
readonly model: "zai-coding-plan/glm-5";
|
|
65
37
|
readonly variant: "low";
|
|
66
38
|
};
|
|
67
|
-
readonly implementer: {
|
|
68
|
-
readonly model: "zai-coding-plan/glm-5";
|
|
69
|
-
readonly variant: "low";
|
|
70
|
-
};
|
|
71
39
|
};
|
|
72
40
|
readonly 'opencode-go': {
|
|
73
41
|
readonly orchestrator: {
|
|
74
42
|
readonly model: "opencode-go/glm-5.1";
|
|
75
43
|
};
|
|
76
|
-
readonly reviewer: {
|
|
77
|
-
readonly model: "opencode-go/deepseek-v4-pro";
|
|
78
|
-
readonly variant: "max";
|
|
79
|
-
};
|
|
80
|
-
readonly council: {
|
|
81
|
-
readonly model: "opencode-go/deepseek-v4-pro";
|
|
82
|
-
readonly variant: "high";
|
|
83
|
-
};
|
|
84
44
|
readonly researcher: {
|
|
85
45
|
readonly model: "opencode-go/minimax-m2.7";
|
|
86
46
|
};
|
|
87
|
-
readonly implementer: {
|
|
88
|
-
readonly model: "opencode-go/deepseek-v4-flash";
|
|
89
|
-
readonly variant: "high";
|
|
90
|
-
};
|
|
91
47
|
};
|
|
92
48
|
};
|
|
93
49
|
export type PresetName = keyof typeof MODEL_MAPPINGS;
|
package/dist/cli/types.d.ts
CHANGED
|
@@ -13,7 +13,6 @@ export interface OpenCodeConfig {
|
|
|
13
13
|
[key: string]: unknown;
|
|
14
14
|
}
|
|
15
15
|
export interface InstallConfig {
|
|
16
|
-
hasTmux: boolean;
|
|
17
16
|
installSkills: boolean;
|
|
18
17
|
preset?: string;
|
|
19
18
|
promptForStar?: boolean;
|
|
@@ -35,5 +34,4 @@ export interface DetectedConfig {
|
|
|
35
34
|
hasAntigravity: boolean;
|
|
36
35
|
hasChutes?: boolean;
|
|
37
36
|
hasOpencodeZen: boolean;
|
|
38
|
-
hasTmux: boolean;
|
|
39
37
|
}
|