@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/agent-forge.schema.json +2 -133
- package/dist/cli/index.js +99 -317
- package/dist/cli/providers.d.ts +0 -44
- package/dist/config/constants.d.ts +3 -4
- package/dist/config/index.d.ts +0 -1
- package/dist/config/schema.d.ts +2 -72
- package/dist/hooks/filter-available-skills/index.d.ts +4 -13
- package/dist/index.js +301 -1297
- package/dist/tools/index.d.ts +0 -1
- package/dist/tui.js +5 -32
- package/package.json +1 -1
- package/src/skills/brainstorming/SKILL.md +5 -6
- package/src/skills/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/src/skills/codemap/README.md +3 -3
- package/src/skills/codemap/SKILL.md +5 -5
- package/src/skills/codemap/codemap.md +4 -4
- package/src/skills/codemap/scripts/codemap.mjs +1 -1
- package/src/skills/codemap/scripts/codemap.test.ts +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/writing-plans/SKILL.md +2 -2
- package/dist/agents/council.d.ts +0 -27
- package/dist/agents/councillor.d.ts +0 -2
- package/dist/agents/implementer.d.ts +0 -2
- package/dist/agents/reviewer.d.ts +0 -2
- package/dist/cli/skill-sync.d.ts +0 -23
- 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/tools/council.d.ts +0 -10
- package/dist/utils/package-root.d.ts +0 -1
- package/src/skills/using-git-worktrees/SKILL.md +0 -226
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
|
|
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
|
|
217
|
-
var ProviderModelIdSchema =
|
|
218
|
-
var ManualAgentPlanSchema =
|
|
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:
|
|
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 =
|
|
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 =
|
|
244
|
-
var FallbackChainsSchema =
|
|
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 =
|
|
251
|
-
model:
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
id:
|
|
257
|
-
variant:
|
|
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:
|
|
262
|
-
variant:
|
|
263
|
-
skills:
|
|
264
|
-
mcps:
|
|
265
|
-
prompt:
|
|
266
|
-
orchestratorPrompt:
|
|
267
|
-
options:
|
|
268
|
-
displayName:
|
|
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 =
|
|
271
|
-
var MultiplexerLayoutSchema =
|
|
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 =
|
|
200
|
+
var MultiplexerConfigSchema = z.object({
|
|
280
201
|
type: MultiplexerTypeSchema.default("none"),
|
|
281
202
|
layout: MultiplexerLayoutSchema.default("main-vertical"),
|
|
282
|
-
main_pane_size:
|
|
203
|
+
main_pane_size: z.number().min(20).max(80).default(60)
|
|
283
204
|
});
|
|
284
|
-
var TmuxConfigSchema =
|
|
285
|
-
enabled:
|
|
205
|
+
var TmuxConfigSchema = z.object({
|
|
206
|
+
enabled: z.boolean().default(false),
|
|
286
207
|
layout: TmuxLayoutSchema.default("main-vertical"),
|
|
287
|
-
main_pane_size:
|
|
208
|
+
main_pane_size: z.number().min(20).max(80).default(60)
|
|
288
209
|
});
|
|
289
|
-
var PresetSchema =
|
|
290
|
-
var WebsearchConfigSchema =
|
|
291
|
-
provider:
|
|
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 =
|
|
294
|
-
var InterviewConfigSchema =
|
|
295
|
-
maxQuestions:
|
|
296
|
-
outputFolder:
|
|
297
|
-
autoOpenBrowser:
|
|
298
|
-
port:
|
|
299
|
-
dashboard:
|
|
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 =
|
|
302
|
-
maxSessionsPerAgent:
|
|
303
|
-
readContextMinLines:
|
|
304
|
-
readContextMaxFiles:
|
|
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 =
|
|
307
|
-
enabled:
|
|
308
|
-
python:
|
|
309
|
-
script:
|
|
310
|
-
size:
|
|
311
|
-
fps:
|
|
312
|
-
speed:
|
|
313
|
-
maxFrames:
|
|
314
|
-
posterizeBits:
|
|
315
|
-
gifs:
|
|
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 =
|
|
318
|
-
maxContinuations:
|
|
319
|
-
cooldownMs:
|
|
320
|
-
autoEnable:
|
|
321
|
-
autoEnableThreshold:
|
|
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 =
|
|
324
|
-
enabled:
|
|
325
|
-
timeoutMs:
|
|
326
|
-
retryDelayMs:
|
|
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:
|
|
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:
|
|
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:
|
|
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 =
|
|
353
|
-
preset:
|
|
354
|
-
setDefaultAgent:
|
|
355
|
-
scoringEngineVersion:
|
|
356
|
-
balanceProviderUsage:
|
|
357
|
-
autoUpdate:
|
|
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:
|
|
360
|
-
agents:
|
|
361
|
-
disabled_agents:
|
|
362
|
-
disabled_mcps:
|
|
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: ["
|
|
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: ["
|
|
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: ["
|
|
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: ["
|
|
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: ["
|
|
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: ["
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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 =
|
|
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 =
|
|
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) {
|