@agents-inc/cli 0.42.1 → 0.46.0
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/CHANGELOG.md +52 -0
- package/README.md +128 -113
- package/assets/logo.png +0 -0
- package/assets/logo.svg +75 -0
- package/dist/{chunk-ZHJEZ7AU.js → chunk-3WKFSTG6.js} +2 -2
- package/dist/{chunk-IUYU2TP6.js → chunk-4C7PDDLY.js} +7 -7
- package/dist/{chunk-AQANPOLS.js → chunk-5M6JI76P.js} +2 -2
- package/dist/{chunk-UXNHU7Y7.js → chunk-5QRJUBK7.js} +133 -56
- package/dist/chunk-5QRJUBK7.js.map +1 -0
- package/dist/{chunk-33D24DAF.js → chunk-72GS6PIH.js} +10 -10
- package/dist/{chunk-PP7NDFFE.js → chunk-74HSA7C4.js} +10 -1
- package/dist/chunk-74HSA7C4.js.map +1 -0
- package/dist/chunk-7LDSHHKN.js +132 -0
- package/dist/chunk-7LDSHHKN.js.map +1 -0
- package/dist/{chunk-52SI5XJH.js → chunk-C7BO2ASM.js} +2 -7
- package/dist/chunk-C7BO2ASM.js.map +1 -0
- package/dist/{chunk-53K3URKF.js → chunk-CD64ZNYI.js} +5 -3
- package/dist/chunk-CD64ZNYI.js.map +1 -0
- package/dist/chunk-CDGHSTB6.js +69 -0
- package/dist/chunk-CDGHSTB6.js.map +1 -0
- package/dist/{chunk-FF4Z7MHY.js → chunk-CTQHZELA.js} +28 -20
- package/dist/chunk-CTQHZELA.js.map +1 -0
- package/dist/{chunk-44QCEK7E.js → chunk-D7JTL3DJ.js} +2 -2
- package/dist/{chunk-MMD26LKJ.js → chunk-DO5OZHSS.js} +2 -2
- package/dist/{chunk-ORJPGZVD.js → chunk-FKBCYT7B.js} +7 -7
- package/dist/chunk-FKBCYT7B.js.map +1 -0
- package/dist/{chunk-WMAALRQI.js → chunk-FUEZQ2H6.js} +5 -5
- package/dist/{chunk-WMAALRQI.js.map → chunk-FUEZQ2H6.js.map} +1 -1
- package/dist/{chunk-HMGWGWFT.js → chunk-G2WNOT3R.js} +2 -2
- package/dist/{chunk-BKW34TKI.js → chunk-GVLYNP2I.js} +4 -4
- package/dist/{chunk-VHGIQN5O.js → chunk-HM3DHMW7.js} +70 -24
- package/dist/chunk-HM3DHMW7.js.map +1 -0
- package/dist/{chunk-MI4NWOWD.js → chunk-I26YP2Q3.js} +5 -12
- package/dist/chunk-I26YP2Q3.js.map +1 -0
- package/dist/{chunk-FDY6SGSA.js → chunk-J64CA4V6.js} +5 -3
- package/dist/chunk-J64CA4V6.js.map +1 -0
- package/dist/{chunk-EFZN22TO.js → chunk-KWQ2BQXF.js} +3 -3
- package/dist/{chunk-ALWLM5MC.js → chunk-LFZXMQOH.js} +2 -2
- package/dist/{chunk-2TWELY5M.js → chunk-NMXNHRAK.js} +3 -3
- package/dist/{chunk-GCN7GGWE.js → chunk-ODQ2BKWU.js} +3 -3
- package/dist/{chunk-KA253GGY.js → chunk-PZLUO4OY.js} +4 -4
- package/dist/{chunk-X34RGEFX.js → chunk-QBUOZVNZ.js} +2 -2
- package/dist/{chunk-SYHRJG5G.js → chunk-RT6IBH37.js} +3498 -3592
- package/dist/chunk-RT6IBH37.js.map +1 -0
- package/dist/{chunk-YRVTXSXP.js → chunk-RWR56UVK.js} +3 -18
- package/dist/chunk-RWR56UVK.js.map +1 -0
- package/dist/{chunk-PEAPABFI.js → chunk-SGXUMZWL.js} +2 -2
- package/dist/{chunk-MHET2RG2.js → chunk-TOWP4T5L.js} +2 -2
- package/dist/{chunk-XRA4LHTJ.js → chunk-UK3AMBR7.js} +18 -14
- package/dist/chunk-UK3AMBR7.js.map +1 -0
- package/dist/{chunk-GIZ6DENW.js → chunk-VH3PI43B.js} +4 -4
- package/dist/{chunk-J73KIP6Z.js → chunk-XE6RTHUD.js} +66 -5
- package/dist/chunk-XE6RTHUD.js.map +1 -0
- package/dist/{chunk-EPJ2GJNJ.js → chunk-YT7UHV67.js} +10 -10
- package/dist/{chunk-UVVNWF43.js → chunk-YVMYQSED.js} +2 -2
- package/dist/commands/build/marketplace.js +12 -126
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +6 -6
- package/dist/commands/config/get.js +4 -4
- package/dist/commands/config/index.js +5 -5
- package/dist/commands/config/path.js +4 -4
- package/dist/commands/config/set-project.js +4 -4
- package/dist/commands/config/show.js +5 -5
- package/dist/commands/config/unset-project.js +4 -4
- package/dist/commands/diff.js +4 -4
- package/dist/commands/doctor.js +4 -4
- package/dist/commands/edit.js +33 -30
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +54 -33
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +5 -5
- package/dist/commands/info.js +5 -5
- package/dist/commands/init.js +33 -37
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +4 -4
- package/dist/commands/new/agent.js +52 -38
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +252 -0
- package/dist/commands/new/marketplace.js.map +1 -0
- package/dist/commands/new/skill.js +30 -15
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +4 -4
- package/dist/commands/search.js +7 -7
- package/dist/commands/uninstall.js +6 -6
- package/dist/commands/update.js +6 -6
- package/dist/commands/validate.js +5 -5
- package/dist/components/skill-search/skill-search.js +3 -3
- package/dist/components/wizard/category-grid.js +2 -2
- package/dist/components/wizard/category-grid.test.js +184 -98
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +3 -3
- package/dist/components/wizard/checkbox-grid.test.js +3 -3
- package/dist/components/wizard/domain-selection.js +9 -8
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/menu-item.js +1 -1
- package/dist/components/wizard/search-modal.js +2 -2
- package/dist/components/wizard/search-modal.test.js +2 -11
- package/dist/components/wizard/search-modal.test.js.map +1 -1
- package/dist/components/wizard/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +2 -2
- package/dist/components/wizard/selection-card.js +2 -2
- package/dist/components/wizard/source-grid.js +3 -3
- package/dist/components/wizard/source-grid.test.js +5 -9
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +8 -9
- package/dist/components/wizard/step-agents.js +8 -7
- package/dist/components/wizard/step-agents.test.js +25 -20
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +8 -8
- package/dist/components/wizard/step-build.test.js +25 -40
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +4 -4
- package/dist/components/wizard/step-confirm.test.js +8 -8
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +2 -2
- package/dist/components/wizard/step-settings.js +5 -5
- package/dist/components/wizard/step-settings.test.js +8 -8
- package/dist/components/wizard/step-sources.js +11 -11
- package/dist/components/wizard/step-sources.test.js +14 -20
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +12 -12
- package/dist/components/wizard/step-stack.test.js +32 -29
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +2 -2
- package/dist/components/wizard/wizard-layout.js +8 -8
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard-tabs.test.js +2 -2
- package/dist/components/wizard/wizard.js +26 -26
- package/dist/hooks/init.js +3 -5
- package/dist/hooks/init.js.map +1 -1
- package/dist/{source-manager-ABK5COKX.js → source-manager-6QZ2GDUA.js} +4 -4
- package/dist/stores/wizard-store.js +5 -5
- package/dist/stores/wizard-store.test.js +29 -49
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +3 -1
- package/src/schemas/agent.schema.json +3 -0
- package/src/schemas/metadata.schema.json +4 -46
- package/src/schemas/project-config.schema.json +8 -4
- package/src/schemas/skills-matrix.schema.json +11 -298
- package/src/schemas/stacks.schema.json +2 -4
- package/dist/chunk-52SI5XJH.js.map +0 -1
- package/dist/chunk-53K3URKF.js.map +0 -1
- package/dist/chunk-FDY6SGSA.js.map +0 -1
- package/dist/chunk-FF4Z7MHY.js.map +0 -1
- package/dist/chunk-GVRZY5KI.js +0 -45
- package/dist/chunk-GVRZY5KI.js.map +0 -1
- package/dist/chunk-J73KIP6Z.js.map +0 -1
- package/dist/chunk-MI4NWOWD.js.map +0 -1
- package/dist/chunk-ORJPGZVD.js.map +0 -1
- package/dist/chunk-PP7NDFFE.js.map +0 -1
- package/dist/chunk-SYHRJG5G.js.map +0 -1
- package/dist/chunk-UXNHU7Y7.js.map +0 -1
- package/dist/chunk-VHGIQN5O.js.map +0 -1
- package/dist/chunk-XRA4LHTJ.js.map +0 -1
- package/dist/chunk-YRVTXSXP.js.map +0 -1
- package/dist/cli/defaults/agent-mappings.yaml +0 -215
- package/dist/commands/version/bump.js +0 -79
- package/dist/commands/version/bump.js.map +0 -1
- package/dist/commands/version/index.js +0 -54
- package/dist/commands/version/index.js.map +0 -1
- package/dist/commands/version/set.js +0 -86
- package/dist/commands/version/set.js.map +0 -1
- package/dist/commands/version/show.js +0 -54
- package/dist/commands/version/show.js.map +0 -1
- /package/dist/{chunk-ZHJEZ7AU.js.map → chunk-3WKFSTG6.js.map} +0 -0
- /package/dist/{chunk-IUYU2TP6.js.map → chunk-4C7PDDLY.js.map} +0 -0
- /package/dist/{chunk-AQANPOLS.js.map → chunk-5M6JI76P.js.map} +0 -0
- /package/dist/{chunk-33D24DAF.js.map → chunk-72GS6PIH.js.map} +0 -0
- /package/dist/{chunk-44QCEK7E.js.map → chunk-D7JTL3DJ.js.map} +0 -0
- /package/dist/{chunk-MMD26LKJ.js.map → chunk-DO5OZHSS.js.map} +0 -0
- /package/dist/{chunk-HMGWGWFT.js.map → chunk-G2WNOT3R.js.map} +0 -0
- /package/dist/{chunk-BKW34TKI.js.map → chunk-GVLYNP2I.js.map} +0 -0
- /package/dist/{chunk-EFZN22TO.js.map → chunk-KWQ2BQXF.js.map} +0 -0
- /package/dist/{chunk-ALWLM5MC.js.map → chunk-LFZXMQOH.js.map} +0 -0
- /package/dist/{chunk-2TWELY5M.js.map → chunk-NMXNHRAK.js.map} +0 -0
- /package/dist/{chunk-GCN7GGWE.js.map → chunk-ODQ2BKWU.js.map} +0 -0
- /package/dist/{chunk-KA253GGY.js.map → chunk-PZLUO4OY.js.map} +0 -0
- /package/dist/{chunk-X34RGEFX.js.map → chunk-QBUOZVNZ.js.map} +0 -0
- /package/dist/{chunk-PEAPABFI.js.map → chunk-SGXUMZWL.js.map} +0 -0
- /package/dist/{chunk-MHET2RG2.js.map → chunk-TOWP4T5L.js.map} +0 -0
- /package/dist/{chunk-GIZ6DENW.js.map → chunk-VH3PI43B.js.map} +0 -0
- /package/dist/{chunk-EPJ2GJNJ.js.map → chunk-YT7UHV67.js.map} +0 -0
- /package/dist/{chunk-UVVNWF43.js.map → chunk-YVMYQSED.js.map} +0 -0
- /package/dist/{source-manager-ABK5COKX.js.map → source-manager-6QZ2GDUA.js.map} +0 -0
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
KEBAB_CASE_PATTERN
|
|
4
|
+
} from "./chunk-74HSA7C4.js";
|
|
2
5
|
import {
|
|
3
6
|
init_esm_shims
|
|
4
7
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -90,7 +93,14 @@ async function copy(src, dest) {
|
|
|
90
93
|
// src/cli/lib/schemas.ts
|
|
91
94
|
init_esm_shims();
|
|
92
95
|
import { z } from "zod";
|
|
93
|
-
var
|
|
96
|
+
var customExtensions = {
|
|
97
|
+
categories: /* @__PURE__ */ new Set(),
|
|
98
|
+
domains: /* @__PURE__ */ new Set(),
|
|
99
|
+
agentNames: /* @__PURE__ */ new Set(),
|
|
100
|
+
skillIds: /* @__PURE__ */ new Set()
|
|
101
|
+
};
|
|
102
|
+
var DOMAIN_VALUES = ["web", "api", "cli", "mobile", "shared"];
|
|
103
|
+
var domainSchema = z.enum(DOMAIN_VALUES);
|
|
94
104
|
var skillSourceTypeSchema = z.enum([
|
|
95
105
|
"public",
|
|
96
106
|
"private",
|
|
@@ -144,7 +154,6 @@ var SUBCATEGORY_VALUES = [
|
|
|
144
154
|
"cli-testing"
|
|
145
155
|
];
|
|
146
156
|
var subcategorySchema = z.enum(SUBCATEGORY_VALUES);
|
|
147
|
-
var stackSubcategorySchema = z.enum(SUBCATEGORY_VALUES);
|
|
148
157
|
var agentNameSchema = z.enum([
|
|
149
158
|
"web-developer",
|
|
150
159
|
"api-developer",
|
|
@@ -264,15 +273,67 @@ var skillDisplayNameSchema = z.enum([
|
|
|
264
273
|
"context-management"
|
|
265
274
|
]);
|
|
266
275
|
var SKILL_ID_PATTERN = /^(web|api|cli|mobile|infra|meta|security)-.+-.+$/;
|
|
276
|
+
function isValidSkillId(id) {
|
|
277
|
+
return SKILL_ID_PATTERN.test(id) || customExtensions.skillIds.has(id);
|
|
278
|
+
}
|
|
267
279
|
var skillIdSchema = z.string().regex(
|
|
268
280
|
SKILL_ID_PATTERN,
|
|
269
281
|
"Must be a valid skill ID (e.g., 'web-framework-react')"
|
|
270
282
|
);
|
|
283
|
+
var extensibleDomainSchema = z.string().refine(
|
|
284
|
+
(val) => domainSchema.safeParse(val).success || customExtensions.domains.has(val),
|
|
285
|
+
{ message: "Must be a valid domain" }
|
|
286
|
+
);
|
|
287
|
+
var extensibleSkillIdSchema = z.string().refine(
|
|
288
|
+
(val) => skillIdSchema.safeParse(val).success || customExtensions.skillIds.has(val),
|
|
289
|
+
{ message: "Must be a valid skill ID" }
|
|
290
|
+
);
|
|
291
|
+
var extensibleSubcategorySchema = z.string().refine(
|
|
292
|
+
(val) => subcategorySchema.safeParse(val).success || customExtensions.categories.has(val),
|
|
293
|
+
{ message: "Must be a valid subcategory" }
|
|
294
|
+
);
|
|
295
|
+
var extensibleAgentNameSchema = z.string().refine(
|
|
296
|
+
(val) => agentNameSchema.safeParse(val).success || customExtensions.agentNames.has(val),
|
|
297
|
+
{ message: "Must be a valid agent name" }
|
|
298
|
+
);
|
|
299
|
+
function validateCategoryField(val, ctx) {
|
|
300
|
+
if (!val.category) return;
|
|
301
|
+
if (val.custom) {
|
|
302
|
+
if (!KEBAB_CASE_PATTERN.test(val.category)) {
|
|
303
|
+
ctx.addIssue({
|
|
304
|
+
code: "custom",
|
|
305
|
+
path: ["category"],
|
|
306
|
+
message: "Custom category must be kebab-case"
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const result = categoryPathSchema.safeParse(val.category);
|
|
312
|
+
if (!result.success) {
|
|
313
|
+
for (const issue of result.error.issues) {
|
|
314
|
+
ctx.addIssue({ ...issue, path: ["category"] });
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
function validateExtensibleRecordKeys(builtinSet, extensionSet, label) {
|
|
319
|
+
return (val, ctx) => {
|
|
320
|
+
for (const key of Object.keys(val)) {
|
|
321
|
+
if (!builtinSet.has(key) && !extensionSet.has(key)) {
|
|
322
|
+
ctx.addIssue({
|
|
323
|
+
code: "custom",
|
|
324
|
+
path: [key],
|
|
325
|
+
message: `Invalid ${label} '${key}'.`
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
}
|
|
271
331
|
var categoryPathSchema = z.string().refine(
|
|
272
332
|
(val) => {
|
|
273
333
|
if (val === "local") return true;
|
|
274
334
|
if (/^(web|api|cli|mobile|infra|meta|security|shared)-.+$/.test(val)) return true;
|
|
275
|
-
|
|
335
|
+
if (subcategorySchema.safeParse(val).success) return true;
|
|
336
|
+
return customExtensions.categories.has(val);
|
|
276
337
|
},
|
|
277
338
|
{
|
|
278
339
|
message: "Must be a valid category path (e.g., 'web-framework', 'shared-testing', or 'local')"
|
|
@@ -298,7 +359,7 @@ var strictHooksRecordSchema = z.record(
|
|
|
298
359
|
z.array(strictAgentHookDefinitionSchema)
|
|
299
360
|
);
|
|
300
361
|
var skillAssignmentSchema = z.object({
|
|
301
|
-
id:
|
|
362
|
+
id: extensibleSkillIdSchema,
|
|
302
363
|
preloaded: z.boolean().optional(),
|
|
303
364
|
local: z.boolean().optional(),
|
|
304
365
|
path: z.string().optional()
|
|
@@ -309,15 +370,16 @@ var skillFrontmatterLoaderSchema = z.object({
|
|
|
309
370
|
model: modelNameSchema.optional()
|
|
310
371
|
});
|
|
311
372
|
var skillMetadataLoaderSchema = z.object({
|
|
312
|
-
|
|
373
|
+
// Field accepts any string; cross-field validation in superRefine enforces strict/custom rules
|
|
374
|
+
category: z.string().optional(),
|
|
313
375
|
categoryExclusive: z.boolean().optional(),
|
|
314
376
|
author: z.string().optional(),
|
|
315
|
-
version: z.union([z.string(), z.number()]).transform(String).optional(),
|
|
316
377
|
tags: z.array(z.string()).optional(),
|
|
317
378
|
requires: z.array(skillIdSchema).optional(),
|
|
318
379
|
compatibleWith: z.array(skillIdSchema).optional(),
|
|
319
|
-
conflictsWith: z.array(skillIdSchema).optional()
|
|
320
|
-
|
|
380
|
+
conflictsWith: z.array(skillIdSchema).optional(),
|
|
381
|
+
custom: z.boolean().optional()
|
|
382
|
+
}).passthrough().superRefine(validateCategoryField);
|
|
321
383
|
var pluginAuthorSchema = z.object({
|
|
322
384
|
name: z.string().min(1),
|
|
323
385
|
email: z.string().optional()
|
|
@@ -345,7 +407,7 @@ var pluginManifestValidationSchema = z.object({
|
|
|
345
407
|
hooks: z.union([z.string(), strictHooksRecordSchema]).optional()
|
|
346
408
|
}).strict();
|
|
347
409
|
var agentYamlConfigSchema = z.object({
|
|
348
|
-
id:
|
|
410
|
+
id: extensibleAgentNameSchema,
|
|
349
411
|
title: z.string(),
|
|
350
412
|
description: z.string(),
|
|
351
413
|
model: modelNameSchema.optional(),
|
|
@@ -353,24 +415,21 @@ var agentYamlConfigSchema = z.object({
|
|
|
353
415
|
disallowedTools: z.array(z.string()).optional(),
|
|
354
416
|
permissionMode: permissionModeSchema.optional(),
|
|
355
417
|
hooks: hooksRecordSchema.optional(),
|
|
356
|
-
outputFormat: z.string().optional()
|
|
418
|
+
outputFormat: z.string().optional(),
|
|
419
|
+
custom: z.boolean().optional()
|
|
357
420
|
});
|
|
358
421
|
var skillAssignmentElementSchema = z.union([skillIdSchema, skillAssignmentSchema]);
|
|
359
|
-
var stackSubcategoryValues = new Set(
|
|
422
|
+
var stackSubcategoryValues = new Set(SUBCATEGORY_VALUES);
|
|
360
423
|
var stackAgentConfigSchema = z.record(
|
|
361
424
|
z.string(),
|
|
362
425
|
z.union([skillAssignmentElementSchema, z.array(skillAssignmentElementSchema)])
|
|
363
|
-
).superRefine(
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
});
|
|
426
|
+
).superRefine(
|
|
427
|
+
validateExtensibleRecordKeys(
|
|
428
|
+
stackSubcategoryValues,
|
|
429
|
+
customExtensions.categories,
|
|
430
|
+
"subcategory"
|
|
431
|
+
)
|
|
432
|
+
);
|
|
374
433
|
var projectConfigLoaderSchema = z.object({
|
|
375
434
|
version: z.literal("1").optional(),
|
|
376
435
|
/** Project/plugin name in kebab-case */
|
|
@@ -379,7 +438,7 @@ var projectConfigLoaderSchema = z.object({
|
|
|
379
438
|
/** Agent IDs to compile (e.g., ["web-developer", "api-developer"]) */
|
|
380
439
|
agents: z.array(z.string()).optional(),
|
|
381
440
|
/** Flat list of all skill IDs used by this project */
|
|
382
|
-
skills: z.array(
|
|
441
|
+
skills: z.array(extensibleSkillIdSchema).optional(),
|
|
383
442
|
/** Author handle (e.g., "@vince") */
|
|
384
443
|
author: z.string().optional(),
|
|
385
444
|
/** "local" = .claude/agents, "plugin" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */
|
|
@@ -387,7 +446,9 @@ var projectConfigLoaderSchema = z.object({
|
|
|
387
446
|
/** Whether expert mode (advanced/niche skills) was enabled in the wizard */
|
|
388
447
|
expertMode: z.boolean().optional(),
|
|
389
448
|
/** Selected domains from the wizard (persisted for edit mode restoration) */
|
|
390
|
-
domains: z.array(
|
|
449
|
+
domains: z.array(extensibleDomainSchema).optional(),
|
|
450
|
+
/** Selected agents from the wizard (persisted for edit mode restoration) */
|
|
451
|
+
selectedAgents: z.array(z.string()).optional(),
|
|
391
452
|
/** Agent-to-subcategory-to-skill mappings from selected stack (accepts same formats as stacks.yaml) */
|
|
392
453
|
stack: z.record(z.string(), stackAgentConfigSchema).optional(),
|
|
393
454
|
/** Skills source path or URL (e.g., "github:my-org/skills") */
|
|
@@ -414,6 +475,8 @@ var projectConfigValidationSchema = z.object({
|
|
|
414
475
|
expertMode: z.boolean().optional(),
|
|
415
476
|
/** Selected domains from the wizard (persisted for edit mode restoration) */
|
|
416
477
|
domains: z.array(domainSchema).optional(),
|
|
478
|
+
/** Selected agents from the wizard (persisted for edit mode restoration) */
|
|
479
|
+
selectedAgents: z.array(z.string()).optional(),
|
|
417
480
|
/** Agent-to-subcategory-to-skill mappings from selected stack */
|
|
418
481
|
stack: z.record(z.string(), stackAgentConfigSchema),
|
|
419
482
|
/** Skills source path or URL (e.g., "github:my-org/skills") */
|
|
@@ -424,14 +487,15 @@ var projectConfigValidationSchema = z.object({
|
|
|
424
487
|
agentsSource: z.string().optional()
|
|
425
488
|
});
|
|
426
489
|
var categoryDefinitionSchema = z.object({
|
|
427
|
-
id:
|
|
490
|
+
id: extensibleSubcategorySchema,
|
|
428
491
|
displayName: z.string(),
|
|
429
492
|
description: z.string(),
|
|
430
|
-
domain:
|
|
493
|
+
domain: extensibleDomainSchema.optional(),
|
|
431
494
|
exclusive: z.boolean(),
|
|
432
495
|
required: z.boolean(),
|
|
433
496
|
order: z.number(),
|
|
434
|
-
icon: z.string().optional()
|
|
497
|
+
icon: z.string().optional(),
|
|
498
|
+
custom: z.boolean().optional()
|
|
435
499
|
});
|
|
436
500
|
var skillRefInYaml = z.string();
|
|
437
501
|
var conflictRuleSchema = z.object({
|
|
@@ -464,11 +528,18 @@ var relationshipDefinitionsSchema = z.object({
|
|
|
464
528
|
requires: z.array(requireRuleSchema),
|
|
465
529
|
alternatives: z.array(alternativeGroupSchema)
|
|
466
530
|
});
|
|
531
|
+
var builtinSubcategoryValues = new Set(SUBCATEGORY_VALUES);
|
|
467
532
|
var skillsMatrixConfigSchema = z.object({
|
|
468
533
|
version: z.string(),
|
|
469
|
-
categories: z.record(
|
|
470
|
-
|
|
471
|
-
|
|
534
|
+
categories: z.record(z.string(), categoryDefinitionSchema).superRefine(
|
|
535
|
+
validateExtensibleRecordKeys(
|
|
536
|
+
builtinSubcategoryValues,
|
|
537
|
+
customExtensions.categories,
|
|
538
|
+
"category key"
|
|
539
|
+
)
|
|
540
|
+
),
|
|
541
|
+
relationships: relationshipDefinitionsSchema.optional(),
|
|
542
|
+
skillAliases: z.record(z.string(), extensibleSkillIdSchema).optional()
|
|
472
543
|
});
|
|
473
544
|
var localRawMetadataSchema = z.object({
|
|
474
545
|
/** Short name shown in the wizard grid (e.g., "my-custom-react") */
|
|
@@ -476,7 +547,8 @@ var localRawMetadataSchema = z.object({
|
|
|
476
547
|
/** One-line description for the wizard */
|
|
477
548
|
cliDescription: z.string().optional(),
|
|
478
549
|
/** Subcategory to place this skill in (e.g., "web-framework") */
|
|
479
|
-
|
|
550
|
+
// Field accepts any string; cross-field validation in superRefine enforces strict/custom rules
|
|
551
|
+
category: z.string().optional(),
|
|
480
552
|
/** If true, only one skill from this category can be selected */
|
|
481
553
|
categoryExclusive: z.boolean().optional(),
|
|
482
554
|
/** When an AI agent should invoke this skill */
|
|
@@ -491,8 +563,10 @@ var localRawMetadataSchema = z.object({
|
|
|
491
563
|
/** Setup skills that must be installed first (e.g., env setup) */
|
|
492
564
|
requiresSetup: z.array(skillIdSchema).optional(),
|
|
493
565
|
/** Usage skills this setup skill configures (inverse relationship) */
|
|
494
|
-
providesSetupFor: z.array(skillIdSchema).optional()
|
|
495
|
-
|
|
566
|
+
providesSetupFor: z.array(skillIdSchema).optional(),
|
|
567
|
+
/** True if this skill was created outside the CLI's built-in vocabulary */
|
|
568
|
+
custom: z.boolean().optional()
|
|
569
|
+
}).passthrough().superRefine(validateCategoryField);
|
|
496
570
|
var localSkillMetadataSchema = z.object({
|
|
497
571
|
forkedFrom: z.object({
|
|
498
572
|
/** Original skill ID before forking (e.g., "web-framework-react") */
|
|
@@ -551,20 +625,6 @@ var marketplaceSchema = z.object({
|
|
|
551
625
|
metadata: marketplaceMetadataSchema.optional(),
|
|
552
626
|
plugins: z.array(marketplacePluginSchema).min(1)
|
|
553
627
|
});
|
|
554
|
-
var versionedMetadataSchema = z.object({
|
|
555
|
-
/** Content version integer (incremented on each publish) */
|
|
556
|
-
version: z.number(),
|
|
557
|
-
/** Short SHA hash of skill content for change detection */
|
|
558
|
-
contentHash: z.string().optional(),
|
|
559
|
-
/** ISO date of last update */
|
|
560
|
-
updated: z.string().optional()
|
|
561
|
-
}).passthrough();
|
|
562
|
-
var defaultMappingsSchema = z.object({
|
|
563
|
-
/** Maps skill path patterns to the agent IDs that should receive them */
|
|
564
|
-
skillToAgents: z.record(z.string(), z.array(z.string())),
|
|
565
|
-
/** Maps agent IDs to skill ID prefixes they should receive by default */
|
|
566
|
-
agentSkillPrefixes: z.record(z.string(), z.array(z.string())).optional()
|
|
567
|
-
});
|
|
568
628
|
var permissionConfigSchema = z.object({
|
|
569
629
|
/** Tool names or patterns to explicitly allow */
|
|
570
630
|
allow: z.array(z.string()).optional(),
|
|
@@ -646,7 +706,6 @@ var projectSourceConfigValidationSchema = z.object({
|
|
|
646
706
|
stacksFile: z.string().optional(),
|
|
647
707
|
matrixFile: z.string().optional()
|
|
648
708
|
});
|
|
649
|
-
var KEBAB_CASE_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
|
|
650
709
|
var agentYamlGenerationSchema = z.object({
|
|
651
710
|
$schema: z.string().optional(),
|
|
652
711
|
id: z.string().min(1),
|
|
@@ -657,7 +716,8 @@ var agentYamlGenerationSchema = z.object({
|
|
|
657
716
|
disallowedTools: z.array(z.string()).optional(),
|
|
658
717
|
permissionMode: permissionModeSchema.optional(),
|
|
659
718
|
hooks: strictHooksRecordSchema.optional(),
|
|
660
|
-
outputFormat: z.string().optional()
|
|
719
|
+
outputFormat: z.string().optional(),
|
|
720
|
+
custom: z.boolean().optional()
|
|
661
721
|
}).strict();
|
|
662
722
|
var agentFrontmatterValidationSchema = z.object({
|
|
663
723
|
/** Agent name in kebab-case (becomes the Task tool identifier) */
|
|
@@ -692,12 +752,10 @@ var skillFrontmatterValidationSchema = z.object({
|
|
|
692
752
|
}).strict();
|
|
693
753
|
var metadataValidationSchema = z.object({
|
|
694
754
|
/** Domain-prefixed subcategory (e.g., "web-framework") */
|
|
695
|
-
category:
|
|
755
|
+
category: extensibleSubcategorySchema,
|
|
696
756
|
categoryExclusive: z.boolean().optional(),
|
|
697
757
|
/** Author handle — must start with @ (e.g., "@vince") */
|
|
698
758
|
author: z.string().regex(/^@[a-z][a-z0-9-]*$/),
|
|
699
|
-
/** Content version integer, incremented on each publish */
|
|
700
|
-
version: z.number().int().min(1).optional(),
|
|
701
759
|
/** Short display name for the wizard grid (max 30 chars) */
|
|
702
760
|
cliName: z.string().min(1).max(30),
|
|
703
761
|
/** One-line description for the wizard (max 60 chars) */
|
|
@@ -727,7 +785,9 @@ var metadataValidationSchema = z.object({
|
|
|
727
785
|
source: z.string().optional(),
|
|
728
786
|
/** ISO date of the fork */
|
|
729
787
|
date: z.string()
|
|
730
|
-
}).optional()
|
|
788
|
+
}).optional(),
|
|
789
|
+
/** True if this skill was created outside the CLI's built-in vocabulary */
|
|
790
|
+
custom: z.boolean().optional()
|
|
731
791
|
}).strict();
|
|
732
792
|
var stackSkillAssignmentSchema = z.object({
|
|
733
793
|
id: z.string().min(1),
|
|
@@ -808,6 +868,20 @@ function warnUnknownFields(parsed, expectedKeys, context) {
|
|
|
808
868
|
warn(`Unknown fields in ${context}: ${unknownKeys.join(", ")}`);
|
|
809
869
|
}
|
|
810
870
|
}
|
|
871
|
+
function extendSchemasWithCustomValues(options) {
|
|
872
|
+
for (const category of options.categories ?? []) {
|
|
873
|
+
customExtensions.categories.add(category);
|
|
874
|
+
}
|
|
875
|
+
for (const domain of options.domains ?? []) {
|
|
876
|
+
customExtensions.domains.add(domain);
|
|
877
|
+
}
|
|
878
|
+
for (const agentName of options.agentNames ?? []) {
|
|
879
|
+
customExtensions.agentNames.add(agentName);
|
|
880
|
+
}
|
|
881
|
+
for (const skillId of options.skillIds ?? []) {
|
|
882
|
+
customExtensions.skillIds.add(skillId);
|
|
883
|
+
}
|
|
884
|
+
}
|
|
811
885
|
|
|
812
886
|
export {
|
|
813
887
|
getErrorMessage,
|
|
@@ -826,8 +900,11 @@ export {
|
|
|
826
900
|
ensureDir,
|
|
827
901
|
remove,
|
|
828
902
|
copy,
|
|
903
|
+
SUBCATEGORY_VALUES,
|
|
904
|
+
agentNameSchema,
|
|
829
905
|
skillDisplayNameSchema,
|
|
830
906
|
SKILL_ID_PATTERN,
|
|
907
|
+
isValidSkillId,
|
|
831
908
|
skillIdSchema,
|
|
832
909
|
categoryPathSchema,
|
|
833
910
|
hooksRecordSchema,
|
|
@@ -842,7 +919,6 @@ export {
|
|
|
842
919
|
localSkillMetadataSchema,
|
|
843
920
|
stacksConfigSchema,
|
|
844
921
|
marketplaceSchema,
|
|
845
|
-
defaultMappingsSchema,
|
|
846
922
|
settingsFileSchema,
|
|
847
923
|
importedSkillMetadataSchema,
|
|
848
924
|
projectSourceConfigSchema,
|
|
@@ -853,6 +929,7 @@ export {
|
|
|
853
929
|
stackConfigValidationSchema,
|
|
854
930
|
formatZodErrors,
|
|
855
931
|
validateNestingDepth,
|
|
856
|
-
warnUnknownFields
|
|
932
|
+
warnUnknownFields,
|
|
933
|
+
extendSchemasWithCustomValues
|
|
857
934
|
};
|
|
858
|
-
//# sourceMappingURL=chunk-
|
|
935
|
+
//# sourceMappingURL=chunk-5QRJUBK7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/utils/errors.ts","../src/cli/utils/logger.ts","../src/cli/utils/fs.ts","../src/cli/lib/schemas.ts"],"sourcesContent":["/** Extract a human-readable message from an unknown error value. */\nexport function getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","// Logging utility for lib/ modules that don't have access to oclif command context.\n// In oclif commands, prefer using this.log() instead.\n\nlet verboseMode = false;\n\nexport function setVerbose(enabled: boolean): void {\n verboseMode = enabled;\n}\n\nexport function verbose(msg: string): void {\n if (verboseMode) {\n console.log(` ${msg}`);\n }\n}\n\n// Always visible (not gated by verbose mode).\n// Used for user-facing progress output: compilation ticks, summaries, validation results.\nexport function log(msg: string): void {\n console.log(msg);\n}\n\n// Always visible (not gated by verbose mode).\n// Used for issues the user should know about, like unresolved references.\n//\n// Error/warning message style guide:\n// - Start with a capital letter (restructure if it would capitalize a function name)\n// - End with a period if it's a complete sentence\n// - End without a period if it's a fragment (e.g., \"Skipping 'foo': missing SKILL.md\")\n// - Wrap dynamic values in single quotes: 'value' (not bare or double-quoted)\n// - Do NOT prefix the message with \"Warning:\" — this function adds it automatically\n// - After a colon, use lowercase (e.g., \"Skipping 'foo': invalid frontmatter\")\n// - Use em dash for supplemental info (e.g., \"Missing category — defaulting to 'local'\")\nexport function warn(msg: string): void {\n console.warn(` Warning: ${msg}`);\n}\n","import fs from \"fs-extra\";\nimport fg from \"fast-glob\";\nimport path from \"path\";\n\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, \"utf-8\");\n}\n\n/**\n * Reads a file with a size limit check before reading content.\n * Throws if the file exceeds maxSizeBytes. Prevents DoS from oversized files.\n */\nexport async function readFileSafe(filePath: string, maxSizeBytes: number): Promise<string> {\n const stats = await fs.stat(filePath);\n if (stats.size > maxSizeBytes) {\n throw new Error(\n `File too large: '${filePath}' is ${stats.size} bytes (limit: ${maxSizeBytes} bytes)`,\n );\n }\n return fs.readFile(filePath, \"utf-8\");\n}\n\nexport async function readFileOptional(filePath: string, fallback = \"\"): Promise<string> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch {\n return fallback;\n }\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n return fs.pathExists(filePath);\n}\n\nexport async function directoryExists(dirPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dirPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function listDirectories(dirPath: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dirPath, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\nexport async function glob(pattern: string, cwd: string): Promise<string[]> {\n return fg(pattern, { cwd, onlyFiles: true });\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, \"utf-8\");\n}\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\nexport async function remove(filePath: string): Promise<void> {\n await fs.remove(filePath);\n}\n\nexport async function copy(src: string, dest: string): Promise<void> {\n await fs.copy(src, dest);\n}\n","import { z } from \"zod\";\nimport { KEBAB_CASE_PATTERN } from \"../consts\";\nimport { warn } from \"../utils/logger\";\nimport type {\n AgentHookAction,\n AgentHookDefinition,\n AgentName,\n AgentYamlConfig,\n AlternativeGroup,\n BoundSkill,\n CategoryDefinition,\n CategoryPath,\n ConflictRule,\n DiscourageRule,\n Domain,\n Marketplace,\n MarketplaceMetadata,\n MarketplaceOwner,\n MarketplacePlugin,\n MarketplaceRemoteSource,\n ModelName,\n PermissionMode,\n PluginAuthor,\n PluginManifest,\n RecommendRule,\n RelationshipDefinitions,\n RequireRule,\n SkillAssignment,\n SkillDisplayName,\n SkillId,\n SkillSourceType,\n SkillsMatrixConfig,\n Subcategory,\n} from \"../types\";\n\n/**\n * Runtime-extensible sets of custom values discovered from source matrices.\n * Populated by extendSchemasWithCustomValues() after matrix merge.\n * Checked by categoryPathSchema, stackAgentConfigSchema, and agentYamlConfigSchema\n * to accept custom categories, domains, and agent names at parse time.\n */\nconst customExtensions = {\n categories: new Set<string>(),\n domains: new Set<string>(),\n agentNames: new Set<string>(),\n skillIds: new Set<string>(),\n};\n\n/** Raw domain values (before cast) — single source of truth for built-in domains */\nexport const DOMAIN_VALUES = [\"web\", \"api\", \"cli\", \"mobile\", \"shared\"] as const;\n\n// Bridge pattern: z.ZodType<ExistingType> ensures Zod output matches our union types\nexport const domainSchema = z.enum(DOMAIN_VALUES) as z.ZodType<Domain>;\n\nexport const skillSourceTypeSchema = z.enum([\n \"public\",\n \"private\",\n \"local\",\n]) as z.ZodType<SkillSourceType>;\n\nexport const boundSkillSchema: z.ZodType<BoundSkill> = z.object({\n id: z.string() as z.ZodType<SkillId>,\n sourceUrl: z.string(),\n sourceName: z.string(),\n boundTo: z.string(),\n description: z.string().optional(),\n});\n\n/** Raw subcategory values (before cast) — single source of truth for built-in subcategories */\nexport const SUBCATEGORY_VALUES = [\n \"web-framework\",\n \"web-styling\",\n \"web-client-state\",\n \"web-server-state\",\n \"web-forms\",\n \"web-testing\",\n \"web-ui-components\",\n \"web-mocking\",\n \"web-error-handling\",\n \"web-i18n\",\n \"web-file-upload\",\n \"web-files\",\n \"web-utilities\",\n \"web-realtime\",\n \"web-animation\",\n \"web-pwa\",\n \"web-accessibility\",\n \"web-performance\",\n \"web-base-framework\",\n \"api-api\",\n \"api-database\",\n \"api-auth\",\n \"api-observability\",\n \"api-analytics\",\n \"api-email\",\n \"api-performance\",\n \"mobile-framework\",\n \"mobile-platform\",\n \"shared-monorepo\",\n \"shared-tooling\",\n \"shared-security\",\n \"shared-methodology\",\n \"shared-research\",\n \"shared-reviewing\",\n \"shared-ci-cd\",\n \"cli-framework\",\n \"cli-prompts\",\n \"cli-testing\",\n] as const;\n\n// Bridge pattern: z.ZodType<ExistingType> ensures Zod output matches our union types\nexport const subcategorySchema = z.enum(SUBCATEGORY_VALUES) as z.ZodType<Subcategory>;\n\nexport const agentNameSchema = z.enum([\n \"web-developer\",\n \"api-developer\",\n \"cli-developer\",\n \"web-architecture\",\n \"agent-summoner\",\n \"documentor\",\n \"skill-summoner\",\n \"cli-migrator\",\n \"pattern-scout\",\n \"web-pattern-critique\",\n \"web-pm\",\n \"api-researcher\",\n \"web-researcher\",\n \"api-reviewer\",\n \"cli-reviewer\",\n \"web-reviewer\",\n \"cli-tester\",\n \"web-tester\",\n]) as z.ZodType<AgentName>;\n\nexport const modelNameSchema = z.enum([\n \"sonnet\",\n \"opus\",\n \"haiku\",\n \"inherit\",\n]) as z.ZodType<ModelName>;\n\nexport const permissionModeSchema = z.enum([\n \"default\",\n \"acceptEdits\",\n \"dontAsk\",\n \"bypassPermissions\",\n \"plan\",\n \"delegate\",\n]) as z.ZodType<PermissionMode>;\n\nexport const skillDisplayNameSchema = z.enum([\n \"react\",\n \"vue\",\n \"angular\",\n \"solidjs\",\n \"nextjs-app-router\",\n \"nextjs-server-actions\",\n \"remix\",\n \"nuxt\",\n \"scss-modules\",\n \"cva\",\n \"tailwind\",\n \"zustand\",\n \"redux-toolkit\",\n \"pinia\",\n \"ngrx-signalstore\",\n \"jotai\",\n \"mobx\",\n \"react-query\",\n \"swr\",\n \"graphql-apollo\",\n \"graphql-urql\",\n \"trpc\",\n \"react-hook-form\",\n \"vee-validate\",\n \"zod-validation\",\n \"vitest\",\n \"playwright-e2e\",\n \"cypress-e2e\",\n \"react-testing-library\",\n \"vue-test-utils\",\n \"msw\",\n \"shadcn-ui\",\n \"tanstack-table\",\n \"radix-ui\",\n \"hono\",\n \"express\",\n \"fastify\",\n \"drizzle\",\n \"prisma\",\n \"better-auth\",\n \"axiom-pino-sentry\",\n \"posthog\",\n \"posthog-flags\",\n \"resend\",\n \"github-actions\",\n \"react-native\",\n \"expo\",\n \"turborepo\",\n \"tooling\",\n \"posthog-setup\",\n \"env\",\n \"observability-setup\",\n \"email-setup\",\n \"framer-motion\",\n \"css-animations\",\n \"view-transitions\",\n \"storybook\",\n \"error-boundaries\",\n \"accessibility\",\n \"websockets\",\n \"sse\",\n \"socket-io\",\n \"service-workers\",\n \"file-upload\",\n \"image-handling\",\n \"date-fns\",\n \"api-testing\",\n \"api-performance\",\n \"web-performance\",\n \"security\",\n \"commander\",\n \"cli-commander\",\n \"oclif\",\n \"reviewing\",\n \"cli-reviewing\",\n \"research-methodology\",\n \"investigation-requirements\",\n \"anti-over-engineering\",\n \"success-criteria\",\n \"write-verification\",\n \"improvement-protocol\",\n \"context-management\",\n]) as z.ZodType<SkillDisplayName>;\n\n/** Matches SkillId format: prefix-subcategory-name (at least 3 dash-separated segments) */\nexport const SKILL_ID_PATTERN = /^(web|api|cli|mobile|infra|meta|security)-.+-.+$/;\n\n/**\n * Checks if a string is a valid skill ID: either matches the built-in prefix pattern\n * (web|api|cli|mobile|infra|meta|security) or was registered as a custom skill ID\n * via extendSchemasWithCustomValues().\n */\nexport function isValidSkillId(id: string): boolean {\n return SKILL_ID_PATTERN.test(id) || customExtensions.skillIds.has(id);\n}\n\n// Regex-based since Zod cannot express template literal types natively\nexport const skillIdSchema = z\n .string()\n .regex(\n SKILL_ID_PATTERN,\n \"Must be a valid skill ID (e.g., 'web-framework-react')\",\n ) as z.ZodType<SkillId>;\n\n/** Extensible schemas that accept both built-in values and custom values registered via extendSchemasWithCustomValues() */\nconst extensibleDomainSchema = z\n .string()\n .refine(\n (val): val is Domain =>\n domainSchema.safeParse(val).success || customExtensions.domains.has(val),\n { message: \"Must be a valid domain\" },\n ) as z.ZodType<Domain>;\n\nconst extensibleSkillIdSchema = z\n .string()\n .refine(\n (val): val is SkillId =>\n skillIdSchema.safeParse(val).success || customExtensions.skillIds.has(val),\n { message: \"Must be a valid skill ID\" },\n ) as z.ZodType<SkillId>;\n\nconst extensibleSubcategorySchema = z\n .string()\n .refine(\n (val): val is Subcategory =>\n subcategorySchema.safeParse(val).success || customExtensions.categories.has(val),\n { message: \"Must be a valid subcategory\" },\n ) as z.ZodType<Subcategory>;\n\nconst extensibleAgentNameSchema = z\n .string()\n .refine(\n (val): val is AgentName =>\n agentNameSchema.safeParse(val).success || customExtensions.agentNames.has(val),\n { message: \"Must be a valid agent name\" },\n ) as z.ZodType<AgentName>;\n\n/** Validates category: strict categoryPathSchema by default, any kebab-case string when custom: true */\nfunction validateCategoryField(\n val: { category?: string; custom?: boolean },\n ctx: z.RefinementCtx,\n): void {\n if (!val.category) return;\n\n if (val.custom) {\n if (!KEBAB_CASE_PATTERN.test(val.category)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"category\"],\n message: \"Custom category must be kebab-case\",\n });\n }\n return;\n }\n\n const result = categoryPathSchema.safeParse(val.category);\n if (!result.success) {\n for (const issue of result.error.issues) {\n ctx.addIssue({ ...issue, path: [\"category\"] });\n }\n }\n}\n\n/** Creates a superRefine callback that validates record keys against built-in + custom extension sets */\nfunction validateExtensibleRecordKeys(\n builtinSet: Set<string>,\n extensionSet: Set<string>,\n label: string,\n) {\n return (val: Record<string, unknown>, ctx: z.RefinementCtx) => {\n for (const key of Object.keys(val)) {\n if (!builtinSet.has(key) && !extensionSet.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n path: [key],\n message: `Invalid ${label} '${key}'.`,\n });\n }\n }\n };\n}\n\n// Accepts: \"prefix-subcategory\", bare subcategory, \"local\", or custom category from extended schema\nexport const categoryPathSchema = z.string().refine(\n (val): val is CategoryPath => {\n if (val === \"local\") return true;\n if (/^(web|api|cli|mobile|infra|meta|security|shared)-.+$/.test(val)) return true;\n if (subcategorySchema.safeParse(val).success) return true;\n // Accept custom categories registered via extendSchemasWithCustomValues()\n return customExtensions.categories.has(val);\n },\n {\n message: \"Must be a valid category path (e.g., 'web-framework', 'shared-testing', or 'local')\",\n },\n) as z.ZodType<CategoryPath>;\n\nexport const agentHookActionSchema: z.ZodType<AgentHookAction> = z.object({\n type: z.enum([\"command\", \"script\", \"prompt\"]),\n command: z.string().optional(),\n script: z.string().optional(),\n prompt: z.string().optional(),\n});\n\nexport const agentHookDefinitionSchema: z.ZodType<AgentHookDefinition> = z.object({\n matcher: z.string().optional(),\n hooks: z.array(agentHookActionSchema).optional(),\n});\n\nexport const hooksRecordSchema = z.record(z.string(), z.array(agentHookDefinitionSchema));\n\n/** Strict hook definition — hooks array is required and must have at least one action */\nconst strictAgentHookDefinitionSchema = z.object({\n matcher: z.string().optional(),\n hooks: z.array(agentHookActionSchema).min(1),\n});\n\n/** Strict hooks record for validation schemas (requires at least one hook action per definition) */\nexport const strictHooksRecordSchema = z.record(\n z.string(),\n z.array(strictAgentHookDefinitionSchema),\n);\n\nexport const skillAssignmentSchema: z.ZodType<SkillAssignment> = z.object({\n id: extensibleSkillIdSchema,\n preloaded: z.boolean().optional(),\n local: z.boolean().optional(),\n path: z.string().optional(),\n});\n\n// Lenient: accepts any string for `name` since local/custom skills may not follow strict SkillId pattern\nexport const skillFrontmatterLoaderSchema = z.object({\n name: z.string(),\n description: z.string(),\n model: modelNameSchema.optional(),\n});\n\n// Loader schema: category strictness depends on custom field (see validateCategoryField)\nexport const skillMetadataLoaderSchema = z\n .object({\n // Field accepts any string; cross-field validation in superRefine enforces strict/custom rules\n category: (z.string() as z.ZodType<CategoryPath>).optional(),\n categoryExclusive: z.boolean().optional(),\n author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n requires: z.array(skillIdSchema).optional(),\n compatibleWith: z.array(skillIdSchema).optional(),\n conflictsWith: z.array(skillIdSchema).optional(),\n custom: z.boolean().optional(),\n })\n .passthrough()\n .superRefine(validateCategoryField);\n\nexport const pluginAuthorSchema: z.ZodType<PluginAuthor> = z.object({\n name: z.string().min(1),\n email: z.string().optional(),\n});\n\nexport const pluginManifestSchema: z.ZodType<PluginManifest> = z.object({\n name: z.string(),\n version: z.string().optional(),\n description: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), hooksRecordSchema]).optional(),\n});\n\n/** Strict schema for plugin.json validation (IDE, agentsinc validate). Rejects unknown fields. */\nexport const pluginManifestValidationSchema = z\n .object({\n name: z.string().min(1),\n version: z.string().optional(),\n description: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n keywords: z.array(z.string()).optional(),\n commands: z.union([z.string(), z.array(z.string())]).optional(),\n agents: z.union([z.string(), z.array(z.string())]).optional(),\n skills: z.union([z.string(), z.array(z.string())]).optional(),\n hooks: z.union([z.string(), strictHooksRecordSchema]).optional(),\n })\n .strict();\n\nexport const agentYamlConfigSchema: z.ZodType<AgentYamlConfig> = z.object({\n id: extensibleAgentNameSchema,\n title: z.string(),\n description: z.string(),\n model: modelNameSchema.optional(),\n tools: z.array(z.string()),\n disallowedTools: z.array(z.string()).optional(),\n permissionMode: permissionModeSchema.optional(),\n hooks: hooksRecordSchema.optional(),\n outputFormat: z.string().optional(),\n custom: z.boolean().optional(),\n});\n\n// Defined before projectConfigLoaderSchema so it can reference stackAgentConfigSchema\n// Single skill assignment element: either a bare SkillId string or an object { id, preloaded? }\nconst skillAssignmentElementSchema = z.union([skillIdSchema, skillAssignmentSchema]);\n\n/**\n * Agent config within a stack: maps subcategory to skill assignment(s).\n * Keys restricted to valid Subcategory values from skills-matrix.yaml.\n * Lenient: accepts bare string, object, or array from YAML.\n * Consumers normalize all values to SkillAssignment[] after parsing.\n *\n * Uses z.record(z.string()) with superRefine for key validation because\n * z.record(z.enum()) treats all enum values as required properties.\n */\nconst stackSubcategoryValues: Set<string> = new Set(SUBCATEGORY_VALUES);\nexport const stackAgentConfigSchema = z\n .record(\n z.string(),\n z.union([skillAssignmentElementSchema, z.array(skillAssignmentElementSchema)]),\n )\n .superRefine(\n validateExtensibleRecordKeys(\n stackSubcategoryValues,\n customExtensions.categories,\n \"subcategory\",\n ),\n );\n\n/**\n * Lenient loader for .claude/config.yaml (ProjectConfig).\n * name/agents optional since partial configs are valid at load time.\n * Full validation happens in validateProjectConfig().\n */\nexport const projectConfigLoaderSchema = z\n .object({\n version: z.literal(\"1\").optional(),\n /** Project/plugin name in kebab-case */\n name: z.string().optional(),\n description: z.string().optional(),\n /** Agent IDs to compile (e.g., [\"web-developer\", \"api-developer\"]) */\n agents: z.array(z.string()).optional(),\n /** Flat list of all skill IDs used by this project */\n skills: z.array(extensibleSkillIdSchema).optional(),\n\n /** Author handle (e.g., \"@vince\") */\n author: z.string().optional(),\n /** \"local\" = .claude/agents, \"plugin\" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */\n installMode: z.enum([\"local\", \"plugin\"]).optional(),\n /** Whether expert mode (advanced/niche skills) was enabled in the wizard */\n expertMode: z.boolean().optional(),\n /** Selected domains from the wizard (persisted for edit mode restoration) */\n domains: z.array(extensibleDomainSchema).optional(),\n /** Selected agents from the wizard (persisted for edit mode restoration) */\n selectedAgents: z.array(z.string()).optional(),\n /** Agent-to-subcategory-to-skill mappings from selected stack (accepts same formats as stacks.yaml) */\n stack: z.record(z.string(), stackAgentConfigSchema).optional(),\n /** Skills source path or URL (e.g., \"github:my-org/skills\") */\n source: z.string().optional(),\n /** Marketplace identifier for plugin installation */\n marketplace: z.string().optional(),\n /** Separate source for agents when different from skills source */\n agentsSource: z.string().optional(),\n })\n .passthrough();\n\n/**\n * Strict schema for IDE validation of .claude-src/config.yaml (ProjectConfig).\n * Used to generate project-config.schema.json for yaml-language-server.\n * Requires name/agents (the fields validateProjectConfig checks) and\n * does NOT use .passthrough() so the IDE flags unknown properties.\n */\nexport const projectConfigValidationSchema = z.object({\n version: z.literal(\"1\").optional(),\n /** Project/plugin name in kebab-case */\n name: z.string(),\n description: z.string().optional(),\n /** Agent IDs to compile (e.g., [\"web-developer\", \"api-developer\"]) */\n agents: z.array(z.string()),\n /** Flat list of all skill IDs used by this project */\n skills: z.array(skillIdSchema),\n /** Author handle (e.g., \"@vince\") */\n author: z.string().optional(),\n /** \"local\" = .claude/agents, \"plugin\" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */\n installMode: z.enum([\"local\", \"plugin\"]),\n /** Whether expert mode (advanced/niche skills) was enabled in the wizard */\n expertMode: z.boolean().optional(),\n /** Selected domains from the wizard (persisted for edit mode restoration) */\n domains: z.array(domainSchema).optional(),\n /** Selected agents from the wizard (persisted for edit mode restoration) */\n selectedAgents: z.array(z.string()).optional(),\n /** Agent-to-subcategory-to-skill mappings from selected stack */\n stack: z.record(z.string(), stackAgentConfigSchema),\n /** Skills source path or URL (e.g., \"github:my-org/skills\") */\n source: z.string(),\n /** Marketplace identifier for plugin installation */\n marketplace: z.string().optional(),\n /** Separate source for agents when different from skills source */\n agentsSource: z.string().optional(),\n});\n\nexport const categoryDefinitionSchema: z.ZodType<CategoryDefinition> = z.object({\n id: extensibleSubcategorySchema,\n displayName: z.string(),\n description: z.string(),\n domain: extensibleDomainSchema.optional() as z.ZodType<Domain | undefined>,\n exclusive: z.boolean(),\n required: z.boolean(),\n order: z.number(),\n icon: z.string().optional(),\n custom: z.boolean().optional(),\n});\n\n// Lenient: accepts both SkillId and SkillDisplayName, resolved to canonical IDs by matrix-loader\nconst skillRefInYaml = z.string() as z.ZodType<SkillId>;\n\nexport const conflictRuleSchema: z.ZodType<ConflictRule> = z.object({\n skills: z.array(skillRefInYaml).min(2),\n reason: z.string(),\n});\n\nexport const discourageRuleSchema: z.ZodType<DiscourageRule> = z.object({\n skills: z.array(skillRefInYaml).min(2),\n reason: z.string(),\n});\n\nexport const recommendRuleSchema: z.ZodType<RecommendRule> = z.object({\n when: skillRefInYaml,\n suggest: z.array(skillRefInYaml).min(1),\n reason: z.string(),\n});\n\nexport const requireRuleSchema: z.ZodType<RequireRule> = z.object({\n skill: skillRefInYaml,\n needs: z.array(skillRefInYaml).min(1),\n needsAny: z.boolean().optional(),\n reason: z.string(),\n});\n\nexport const alternativeGroupSchema: z.ZodType<AlternativeGroup> = z.object({\n purpose: z.string(),\n skills: z.array(skillRefInYaml).min(1),\n});\n\nexport const relationshipDefinitionsSchema: z.ZodType<RelationshipDefinitions> = z.object({\n conflicts: z.array(conflictRuleSchema),\n discourages: z.array(discourageRuleSchema),\n recommends: z.array(recommendRuleSchema),\n requires: z.array(requireRuleSchema),\n alternatives: z.array(alternativeGroupSchema),\n});\n\n/**\n * Skills matrix config schema with runtime-extensible key validation.\n * Category keys and skill alias entries accept custom values registered via\n * extendSchemasWithCustomValues() (called by discoverAndExtendFromSource).\n *\n * Uses z.record(z.string()) + superRefine for key validation (same pattern as\n * stackAgentConfigSchema) because z.record(z.enum()) cannot be extended at runtime.\n *\n * Relationships and skillAliases are optional since source matrices may only define\n * custom categories without relationships or aliases.\n */\nconst builtinSubcategoryValues: Set<string> = new Set(SUBCATEGORY_VALUES);\n// Bridge cast removed: optional fields require runtime defaults in loadSkillsMatrix()\nexport const skillsMatrixConfigSchema = z.object({\n version: z.string(),\n categories: z\n .record(z.string(), categoryDefinitionSchema)\n .superRefine(\n validateExtensibleRecordKeys(\n builtinSubcategoryValues,\n customExtensions.categories,\n \"category key\",\n ),\n ) as z.ZodType<SkillsMatrixConfig[\"categories\"]>,\n relationships: relationshipDefinitionsSchema.optional(),\n skillAliases: z.record(z.string(), extensibleSkillIdSchema).optional(),\n});\n\n/**\n * Raw metadata from a local skill's metadata.yaml.\n * All fields optional — the loader validates cliName after parsing.\n */\nexport const localRawMetadataSchema = z\n .object({\n /** Short name shown in the wizard grid (e.g., \"my-custom-react\") */\n cliName: z.string().optional(),\n /** One-line description for the wizard */\n cliDescription: z.string().optional(),\n /** Subcategory to place this skill in (e.g., \"web-framework\") */\n // Field accepts any string; cross-field validation in superRefine enforces strict/custom rules\n category: (z.string() as z.ZodType<CategoryPath>).optional(),\n /** If true, only one skill from this category can be selected */\n categoryExclusive: z.boolean().optional(),\n /** When an AI agent should invoke this skill */\n usageGuidance: z.string().optional(),\n tags: z.array(z.string()).optional(),\n /** Framework skills this is compatible with (for Build step filtering) */\n compatibleWith: z.array(skillIdSchema).optional(),\n /** Skills that cannot coexist with this one */\n conflictsWith: z.array(skillIdSchema).optional(),\n /** Skills that must be selected before this one */\n requires: z.array(skillIdSchema).optional(),\n /** Setup skills that must be installed first (e.g., env setup) */\n requiresSetup: z.array(skillIdSchema).optional(),\n /** Usage skills this setup skill configures (inverse relationship) */\n providesSetupFor: z.array(skillIdSchema).optional(),\n /** True if this skill was created outside the CLI's built-in vocabulary */\n custom: z.boolean().optional(),\n })\n .passthrough()\n .superRefine(validateCategoryField);\n\n/** Metadata for local skills that were forked/copied from a marketplace skill */\nexport const localSkillMetadataSchema = z\n .object({\n forkedFrom: z\n .object({\n /** Original skill ID before forking (e.g., \"web-framework-react\") */\n skillId: skillIdSchema,\n /** SHA hash of the original content at fork time (for diff detection) */\n contentHash: z.string(),\n /** ISO date when the fork was created */\n date: z.string(),\n /** Source URL the skill was installed from (e.g., \"github:agents-inc/skills\") */\n source: z.string().optional(),\n })\n .optional(),\n })\n .passthrough();\n\nexport const stackSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string(),\n /** Maps agent IDs to their subcategory-to-skill assignments */\n agents: z.record(z.string(), stackAgentConfigSchema),\n /** High-level philosophy guiding this stack's technology choices */\n philosophy: z.string().optional(),\n});\n\n// Pre-normalization schema: values may be string or string[].\n// loadStacks() normalizes to StacksConfig (all values SkillId[]) after parsing.\nexport const stacksConfigSchema = z.object({\n stacks: z.array(stackSchema).min(1),\n});\n\nexport const marketplaceRemoteSourceSchema: z.ZodType<MarketplaceRemoteSource> = z.object({\n source: z.enum([\"github\", \"url\"]),\n repo: z.string().optional(),\n url: z.string().optional(),\n ref: z.string().optional(),\n});\n\nexport const marketplacePluginSchema: z.ZodType<MarketplacePlugin> = z.object({\n name: z.string().min(1),\n /** Local directory path (relative to pluginRoot) or remote source config */\n source: z.union([z.string(), marketplaceRemoteSourceSchema]),\n description: z.string().optional(),\n version: z.string().optional(),\n author: pluginAuthorSchema.optional(),\n /** Marketplace category for grouping (e.g., \"framework\", \"testing\") */\n category: z.string().optional(),\n keywords: z.array(z.string()).optional(),\n});\n\nexport const marketplaceOwnerSchema: z.ZodType<MarketplaceOwner> = z.object({\n name: z.string().min(1),\n email: z.string().optional(),\n});\n\nexport const marketplaceMetadataSchema: z.ZodType<MarketplaceMetadata> = z.object({\n /** Base directory for resolving plugin source paths (e.g., \"plugins/\") */\n pluginRoot: z.string().optional(),\n});\n\nexport const marketplaceSchema: z.ZodType<Marketplace> = z.object({\n $schema: z.string().optional(),\n name: z.string().min(1),\n version: z.string().min(1),\n description: z.string().optional(),\n owner: marketplaceOwnerSchema,\n metadata: marketplaceMetadataSchema.optional(),\n plugins: z.array(marketplacePluginSchema).min(1),\n});\n\n/** Tool permission overrides (allow/deny lists for Claude Code tool access) */\nexport const permissionConfigSchema = z.object({\n /** Tool names or patterns to explicitly allow */\n allow: z.array(z.string()).optional(),\n /** Tool names or patterns to explicitly deny */\n deny: z.array(z.string()).optional(),\n});\n\n/** Settings file schema (.claude/settings.yaml) for project-level configuration */\nexport const settingsFileSchema = z\n .object({\n permissions: permissionConfigSchema.optional(),\n })\n .passthrough();\n\n/** Metadata for skills imported via `agentsinc import skill` (tracks original source for updates) */\nexport const importedSkillMetadataSchema = z\n .object({\n forkedFrom: z\n .object({\n /** Source URL or identifier where the skill was imported from */\n source: z.string(),\n /** Original skill name in the source */\n skillName: z.string(),\n /** SHA hash of the original content at import time */\n contentHash: z.string(),\n /** ISO date when the import was performed */\n date: z.string(),\n })\n .optional(),\n })\n .passthrough();\n\n/** Branding overrides for white-labeling the CLI */\nexport const brandingConfigSchema = z.object({\n /** Custom CLI name (e.g., \"Acme Dev Tools\") */\n name: z.string().optional(),\n /** Custom tagline shown in wizard header */\n tagline: z.string().optional(),\n});\n\n/**\n * Project source configuration from .claude/config.yaml.\n * Stores multi-source settings, custom directory overrides, and bound skills.\n */\nexport const projectSourceConfigSchema = z\n .object({\n /** Primary skills source (path or URL) */\n source: z.string().optional(),\n /** Author handle for this project's config */\n author: z.string().optional(),\n /** Marketplace identifier for plugin installation */\n marketplace: z.string().optional(),\n /** Separate source for agent definitions (when different from skills) */\n agentsSource: z.string().optional(),\n /** Additional skill sources (private marketplaces, custom repos) */\n sources: z\n .array(\n z.object({\n /** Display name for the source (shown in wizard) */\n name: z.string(),\n /** Source URL (e.g., \"github:acme-corp/claude-skills\") */\n url: z.string(),\n description: z.string().optional(),\n /** Git ref (branch/tag/commit) for the source */\n ref: z.string().optional(),\n }),\n )\n .optional(),\n /** Skills explicitly bound to subcategories via search (from Step Sources) */\n boundSkills: z.array(boundSkillSchema).optional(),\n /** Branding overrides for white-labeling the CLI */\n branding: brandingConfigSchema.optional(),\n /** Custom skills directory override (default: \"src/skills\") */\n skillsDir: z.string().optional(),\n /** Custom agents directory override (default: \"src/agents\") */\n agentsDir: z.string().optional(),\n /** Custom stacks file path override (default: \"config/stacks.yaml\") */\n stacksFile: z.string().optional(),\n /** Custom matrix file path override (default: \"config/skills-matrix.yaml\") */\n matrixFile: z.string().optional(),\n })\n .passthrough();\n\n/**\n * Strict schema for IDE validation of .claude-src/config.yaml (ProjectSourceConfig).\n * Used to generate project-source-config.schema.json for yaml-language-server.\n * All fields optional (source configs may have any subset) but no unknown properties.\n */\nexport const projectSourceConfigValidationSchema = z.object({\n source: z.string().optional(),\n author: z.string().optional(),\n marketplace: z.string().optional(),\n agentsSource: z.string().optional(),\n sources: z\n .array(\n z.object({\n name: z.string(),\n url: z.string(),\n description: z.string().optional(),\n ref: z.string().optional(),\n }),\n )\n .optional(),\n boundSkills: z.array(boundSkillSchema).optional(),\n branding: brandingConfigSchema.optional(),\n skillsDir: z.string().optional(),\n agentsDir: z.string().optional(),\n stacksFile: z.string().optional(),\n matrixFile: z.string().optional(),\n});\n\n// Strict validation schemas enforce all constraints and use .strict() to reject unknown fields,\n// unlike the lenient loader schemas above which use .passthrough() for forward compatibility at parse boundaries\n\n/** Strict schema for compiled agent.yaml output. Lenient id (any string) since marketplace agents may use custom identifiers. */\nexport const agentYamlGenerationSchema = z\n .object({\n $schema: z.string().optional(),\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string().min(1),\n model: modelNameSchema.optional(),\n tools: z.array(z.string()).min(1),\n disallowedTools: z.array(z.string()).optional(),\n permissionMode: permissionModeSchema.optional(),\n hooks: strictHooksRecordSchema.optional(),\n outputFormat: z.string().optional(),\n custom: z.boolean().optional(),\n })\n .strict();\n\n/** Strict validation for agent AGENT.md frontmatter (used by plugin-validator) */\nexport const agentFrontmatterValidationSchema = z\n .object({\n /** Agent name in kebab-case (becomes the Task tool identifier) */\n name: z.string().regex(KEBAB_CASE_PATTERN).min(1),\n description: z.string().min(1),\n /** Comma-separated list of allowed tools */\n tools: z.string().optional(),\n /** Comma-separated list of denied tools */\n disallowedTools: z.string().optional(),\n model: modelNameSchema.optional(),\n permissionMode: permissionModeSchema.optional(),\n /** Skill names to preload (embed in agent prompt) */\n skills: z.array(z.string().min(1)).optional(),\n hooks: strictHooksRecordSchema.optional(),\n })\n .strict();\n\n/** Strict validation for SKILL.md frontmatter (matches Claude Code plugin spec) */\nexport const skillFrontmatterValidationSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().min(1),\n /** If true, Claude cannot invoke this skill on its own */\n \"disable-model-invocation\": z.boolean().optional(),\n /** If true, user can invoke this skill directly */\n \"user-invocable\": z.boolean().optional(),\n /** Comma-separated list of tools this skill can use */\n \"allowed-tools\": z.string().optional(),\n model: modelNameSchema.optional(),\n /** \"fork\" means skill runs in a forked context (separate conversation) */\n context: z.enum([\"fork\"]).optional(),\n /** Agent name this skill is scoped to */\n agent: z.string().optional(),\n /** Hint text shown when user invokes the skill */\n \"argument-hint\": z.string().optional(),\n })\n .strict();\n\n/** Strict validation for metadata.yaml in published skills (enforces author format, length limits) */\nexport const metadataValidationSchema = z\n .object({\n /** Domain-prefixed subcategory (e.g., \"web-framework\") */\n category: extensibleSubcategorySchema,\n categoryExclusive: z.boolean().optional(),\n /** Author handle — must start with @ (e.g., \"@vince\") */\n author: z.string().regex(/^@[a-z][a-z0-9-]*$/),\n /** Short display name for the wizard grid (max 30 chars) */\n cliName: z.string().min(1).max(30),\n /** One-line description for the wizard (max 60 chars) */\n cliDescription: z.string().min(1).max(60),\n /** When an AI agent should invoke this skill (min 10 chars to ensure usefulness) */\n usageGuidance: z.string().min(10),\n requires: z.array(z.string().min(1)).optional(),\n compatibleWith: z.array(z.string().min(1)).optional(),\n conflictsWith: z.array(z.string().min(1)).optional(),\n /** Searchable tags — kebab-case only */\n tags: z.array(z.string().regex(/^[a-z][a-z0-9-]*$/)).optional(),\n requiresSetup: z.array(z.string().min(1)).optional(),\n providesSetupFor: z.array(z.string().min(1)).optional(),\n /** 7-char hex SHA of skill content (for change detection) */\n contentHash: z\n .string()\n .regex(/^[a-f0-9]{7}$/)\n .optional(),\n /** ISO date of last update */\n updated: z.string().optional(),\n /** Provenance tracking when skill was forked from another */\n forkedFrom: z\n .object({\n /** Original skill ID */\n skillId: z.string(),\n /** Version of the original at fork time */\n version: z.number().int().min(1).optional(),\n /** Content hash of the original at fork time */\n contentHash: z.string(),\n /** Source URL or identifier */\n source: z.string().optional(),\n /** ISO date of the fork */\n date: z.string(),\n })\n .optional(),\n /** True if this skill was created outside the CLI's built-in vocabulary */\n custom: z.boolean().optional(),\n })\n .strict();\n\nconst stackSkillAssignmentSchema = z\n .object({\n id: z.string().min(1),\n /** If true, skill content is embedded in the compiled agent prompt */\n preloaded: z.boolean().optional(),\n })\n .strict();\n\n/** Strict validation for published stack config.yaml (marketplace stacks) */\nexport const stackConfigValidationSchema = z\n .object({\n /** Unique stack identifier in kebab-case */\n id: z.string().regex(KEBAB_CASE_PATTERN).optional(),\n name: z.string().min(1),\n version: z.string(),\n author: z.string().min(1),\n description: z.string().optional(),\n /** ISO date when this stack was first created */\n created: z.string().optional(),\n /** ISO date of last update */\n updated: z.string().optional(),\n /** Primary framework this stack is designed for (e.g., \"nextjs\", \"remix\") */\n framework: z.string().optional(),\n /** All skills used in this stack (flat list, at least one required) */\n skills: z.array(stackSkillAssignmentSchema).min(1),\n /** Agent IDs this stack compiles (at least one required) */\n agents: z.array(z.string().regex(KEBAB_CASE_PATTERN)).min(1),\n /** Per-agent skill assignments: { agentId: { subcategory: [skillAssignment] } } */\n agentSkills: z\n .record(z.string(), z.record(z.string(), z.array(stackSkillAssignmentSchema)))\n .optional(),\n /** High-level philosophy guiding technology choices */\n philosophy: z.string().optional(),\n /** Guiding principles for agents using this stack */\n principles: z.array(z.string().min(1)).optional(),\n tags: z.array(z.string().regex(KEBAB_CASE_PATTERN)).optional(),\n /** Per-skill overrides: alternative suggestions and lock status */\n overrides: z\n .record(\n z.string(),\n z\n .object({\n /** Suggested alternative skill IDs if this one is swapped */\n alternatives: z.array(z.string().min(1)).optional(),\n /** If true, this skill cannot be swapped by the user */\n locked: z.boolean().optional(),\n })\n .strict(),\n )\n .optional(),\n /** Community metrics for sorting/ranking */\n metrics: z\n .object({\n upvotes: z.number().int().min(0).optional(),\n downloads: z.number().int().min(0).optional(),\n })\n .strict()\n .optional(),\n /** Lifecycle hooks triggered by file changes or commands */\n hooks: z\n .record(\n z.string(),\n z.array(\n z.object({\n /** Glob pattern to match file paths (e.g., \"*.tsx\") */\n matcher: z.string().optional(),\n hooks: z.array(agentHookActionSchema).min(1),\n }),\n ),\n )\n .optional(),\n })\n .strict();\n\n/** Format Zod validation issues into a human-readable string (e.g., \"path.to.field: Expected string; other: Required\") */\nexport function formatZodErrors(issues: z.ZodIssue[]): string {\n return issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \");\n}\n\n/**\n * Validates that a parsed JSON/YAML value does not exceed a maximum nesting depth.\n * Returns true if the structure is within limits, false if it exceeds maxDepth.\n */\nexport function validateNestingDepth(value: unknown, maxDepth: number): boolean {\n function check(val: unknown, depth: number): boolean {\n if (depth > maxDepth) return false;\n if (Array.isArray(val)) {\n return val.every((item) => check(item, depth + 1));\n }\n if (val !== null && typeof val === \"object\") {\n return Object.values(val).every((v) => check(v, depth + 1));\n }\n return true;\n }\n return check(value, 0);\n}\n\n/**\n * Logs warnings for unknown fields in a parsed object compared to a list of expected keys.\n * Used at security-critical parsing boundaries (marketplace, settings) where `.passthrough()`\n * is kept for forward compatibility but unexpected fields should be surfaced.\n */\nexport function warnUnknownFields(\n parsed: Record<string, unknown>,\n expectedKeys: readonly string[],\n context: string,\n): void {\n const expectedSet = new Set(expectedKeys);\n const unknownKeys = Object.keys(parsed).filter((k) => !expectedSet.has(k));\n if (unknownKeys.length > 0) {\n warn(`Unknown fields in ${context}: ${unknownKeys.join(\", \")}`);\n }\n}\n\nexport type SchemaExtensionOptions = {\n categories?: string[];\n domains?: string[];\n agentNames?: string[];\n skillIds?: string[];\n};\n\n/**\n * Extends runtime schema validation to accept custom values discovered from\n * source matrices, agent directories, and skill directories.\n *\n * This populates the customExtensions sets checked by categoryPathSchema,\n * stackAgentConfigSchema, agentYamlConfigSchema, metadataValidationSchema,\n * skillAssignmentSchema, and projectConfigLoaderSchema at parse time.\n *\n * Idempotent: calling multiple times accumulates values (Set deduplicates).\n */\nexport function extendSchemasWithCustomValues(options: SchemaExtensionOptions): void {\n for (const category of options.categories ?? []) {\n customExtensions.categories.add(category);\n }\n for (const domain of options.domains ?? []) {\n customExtensions.domains.add(domain);\n }\n for (const agentName of options.agentNames ?? []) {\n customExtensions.agentNames.add(agentName);\n }\n for (const skillId of options.skillIds ?? []) {\n customExtensions.skillIds.add(skillId);\n }\n}\n\n/**\n * Clears all custom schema extensions. Used in tests to reset state between runs.\n */\nexport function resetSchemaExtensions(): void {\n customExtensions.categories.clear();\n customExtensions.domains.clear();\n customExtensions.agentNames.clear();\n customExtensions.skillIds.clear();\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
useMeasuredHeight
|
|
4
|
+
} from "./chunk-K77I4XGL.js";
|
|
5
5
|
import {
|
|
6
6
|
SelectionCard
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3WKFSTG6.js";
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
} from "./chunk-
|
|
9
|
+
SourceGrid
|
|
10
|
+
} from "./chunk-KWQ2BQXF.js";
|
|
11
11
|
import {
|
|
12
12
|
ViewTitle
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-DO5OZHSS.js";
|
|
14
14
|
import {
|
|
15
15
|
useWizardStore
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-UK3AMBR7.js";
|
|
17
17
|
import {
|
|
18
18
|
resolveAllSources,
|
|
19
19
|
searchExtraSources
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-RT6IBH37.js";
|
|
21
21
|
import {
|
|
22
22
|
CLI_COLORS,
|
|
23
23
|
DEFAULT_BRANDING
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-74HSA7C4.js";
|
|
25
25
|
import {
|
|
26
26
|
init_esm_shims
|
|
27
27
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -159,4 +159,4 @@ var StepSources = ({
|
|
|
159
159
|
export {
|
|
160
160
|
StepSources
|
|
161
161
|
};
|
|
162
|
-
//# sourceMappingURL=chunk-
|
|
162
|
+
//# sourceMappingURL=chunk-72GS6PIH.js.map
|
|
@@ -102,6 +102,7 @@ var GITHUB_SOURCE = {
|
|
|
102
102
|
GH_PREFIX: "gh:"
|
|
103
103
|
};
|
|
104
104
|
var DEFAULT_SKILLS_SUBDIR = "skills";
|
|
105
|
+
var KEBAB_CASE_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
|
|
105
106
|
var HASH_PREFIX_LENGTH = 7;
|
|
106
107
|
var CACHE_HASH_LENGTH = 16;
|
|
107
108
|
var CACHE_READABLE_PREFIX_LENGTH = 32;
|
|
@@ -140,6 +141,12 @@ var CLI_COLORS = {
|
|
|
140
141
|
WHITE: "white"
|
|
141
142
|
};
|
|
142
143
|
var DEFAULT_SCRATCH_DOMAINS = ["web", "api", "mobile"];
|
|
144
|
+
var ASCII_LOGO = ` \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
145
|
+
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D
|
|
146
|
+
\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551
|
|
147
|
+
\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551 \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551
|
|
148
|
+
\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557
|
|
149
|
+
\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D`;
|
|
143
150
|
var DEFAULT_PRESELECTED_SKILLS = [
|
|
144
151
|
"meta-methodology-anti-over-engineering",
|
|
145
152
|
"meta-methodology-context-management",
|
|
@@ -176,6 +183,7 @@ export {
|
|
|
176
183
|
UI_LAYOUT,
|
|
177
184
|
GITHUB_SOURCE,
|
|
178
185
|
DEFAULT_SKILLS_SUBDIR,
|
|
186
|
+
KEBAB_CASE_PATTERN,
|
|
179
187
|
HASH_PREFIX_LENGTH,
|
|
180
188
|
CACHE_HASH_LENGTH,
|
|
181
189
|
CACHE_READABLE_PREFIX_LENGTH,
|
|
@@ -189,6 +197,7 @@ export {
|
|
|
189
197
|
DEFAULT_PUBLIC_SOURCE_NAME,
|
|
190
198
|
CLI_COLORS,
|
|
191
199
|
DEFAULT_SCRATCH_DOMAINS,
|
|
200
|
+
ASCII_LOGO,
|
|
192
201
|
DEFAULT_PRESELECTED_SKILLS
|
|
193
202
|
};
|
|
194
|
-
//# sourceMappingURL=chunk-
|
|
203
|
+
//# sourceMappingURL=chunk-74HSA7C4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/consts.ts"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { Domain, SkillId } from \"./types/index.js\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// After tsup build, dist/ is flat, so we go up one level from dist/ to get CLI root\n// In development (src/cli/consts.ts), we go up two levels\nconst isInDist = __dirname.includes(\"/dist\");\nconst CLI_ROOT = isInDist ? path.resolve(__dirname, \"..\") : path.resolve(__dirname, \"../..\");\nexport const PROJECT_ROOT = CLI_ROOT;\n\nexport const CLAUDE_DIR = \".claude\";\nexport const CLAUDE_SRC_DIR = \".claude-src\";\nexport const PLUGINS_SUBDIR = \"plugins\";\nexport const PLUGIN_MANIFEST_DIR = \".claude-plugin\";\nexport const PLUGIN_MANIFEST_FILE = \"plugin.json\";\nexport const DEFAULT_PLUGIN_NAME = \"agents-inc\";\n\nexport const CACHE_DIR = path.join(os.homedir(), \".cache\", DEFAULT_PLUGIN_NAME);\n\nexport const CLI_BIN_NAME = \"agentsinc\";\n\nexport const SKILLS_MATRIX_PATH = \"config/skills-matrix.yaml\";\nexport const STACKS_FILE_PATH = \"config/stacks.yaml\";\nexport const SKILLS_DIR_PATH = \"src/skills\";\nexport const LOCAL_SKILLS_PATH = \".claude/skills\";\nexport const ARCHIVED_SKILLS_DIR_NAME = \"_archived\";\n\nexport const DIRS = {\n agents: \"src/agents\",\n skills: \"src/skills\",\n stacks: \"src/stacks\",\n templates: \"src/agents/_templates\",\n commands: \"src/commands\",\n} as const;\n\nexport const STANDARD_FILES = {\n SKILL_MD: \"SKILL.md\",\n METADATA_YAML: \"metadata.yaml\",\n METADATA_JSON: \"metadata.json\",\n CONFIG_YAML: \"config.yaml\",\n SKILLS_MATRIX_YAML: \"skills-matrix.yaml\",\n AGENT_YAML: \"agent.yaml\",\n PLUGIN_JSON: \"plugin.json\",\n CLAUDE_MD: \"CLAUDE.md\",\n REFERENCE_MD: \"reference.md\",\n INTRO_MD: \"intro.md\",\n WORKFLOW_MD: \"workflow.md\",\n EXAMPLES_MD: \"examples.md\",\n OUTPUT_FORMAT_MD: \"output-format.md\",\n CRITICAL_REQUIREMENTS_MD: \"critical-requirements.md\",\n CRITICAL_REMINDERS_MD: \"critical-reminders.md\",\n} as const;\n\nexport const STANDARD_DIRS = {\n EXAMPLES: \"examples\",\n SCRIPTS: \"scripts\",\n SKILLS: \"skills\",\n} as const;\n\nexport const DEFAULT_VERSION = \"1.0.0\";\n\n// \"0.0.0\" indicates no version was explicitly set\nexport const DEFAULT_DISPLAY_VERSION = \"0.0.0\";\n\n// JSON Schema URLs for yaml-language-server $schema comments.\n// Uses raw.githubusercontent.com so schemas resolve without requiring the CLI as a dependency.\nconst SCHEMA_PKG_PREFIX = \"https://raw.githubusercontent.com/agents-inc/cli/main/src/schemas\";\n\nexport const SCHEMA_PATHS = {\n agent: `${SCHEMA_PKG_PREFIX}/agent.schema.json`,\n metadata: `${SCHEMA_PKG_PREFIX}/metadata.schema.json`,\n marketplace: `${SCHEMA_PKG_PREFIX}/marketplace.schema.json`,\n projectConfig: `${SCHEMA_PKG_PREFIX}/project-config.schema.json`,\n projectSourceConfig: `${SCHEMA_PKG_PREFIX}/project-source-config.schema.json`,\n skillsMatrix: `${SCHEMA_PKG_PREFIX}/skills-matrix.schema.json`,\n stacks: `${SCHEMA_PKG_PREFIX}/stacks.schema.json`,\n} as const;\n\n/** Generates a yaml-language-server schema comment for the top of YAML files. */\nexport function yamlSchemaComment(schemaPath: string): string {\n return `# yaml-language-server: $schema=${schemaPath}`;\n}\n\nexport const YAML_FORMATTING = {\n INDENT: 2,\n LINE_WIDTH: 120,\n /** lineWidth: 0 disables wrapping — used for metadata files */\n LINE_WIDTH_NONE: 0,\n} as const;\n\nexport const UI_SYMBOLS = {\n CHECKBOX_CHECKED: \"[x]\",\n CHECKBOX_UNCHECKED: \"[ ]\",\n CHEVRON: \"\\u276F\",\n CHEVRON_SPACER: \" \",\n SELECTED: \"\\u2713\",\n UNSELECTED: \"\\u25CB\",\n CURRENT: \"\\u25CF\",\n SKIPPED: \"\\u2013\",\n DISCOURAGED: \"!\",\n DISABLED: \"\\u2013\",\n SCROLL_UP: \"\\u25B2\",\n SCROLL_DOWN: \"\\u25BC\",\n} as const;\n\nexport const UI_LAYOUT = {\n MAX_VISIBLE_RESULTS: 10,\n DESCRIPTION_WIDTH: 30,\n COPIED_MESSAGE_TIMEOUT_MS: 2000,\n FALLBACK_MESSAGE_TIMEOUT_MS: 3000,\n} as const;\n\nexport const GITHUB_SOURCE = {\n HTTPS_PREFIX: \"https://github.com/\",\n GITHUB_PREFIX: \"github:\",\n GH_PREFIX: \"gh:\",\n} as const;\n\nexport const DEFAULT_SKILLS_SUBDIR = \"skills\";\n\n/** Strict kebab-case: starts with letter, segments separated by single hyphens, no trailing hyphens */\nexport const KEBAB_CASE_PATTERN = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;\n\nexport const HASH_PREFIX_LENGTH = 7;\n\n/** Hex chars from SHA-256 hash used in cache directory names (64 bits of collision resistance) */\nexport const CACHE_HASH_LENGTH = 16;\n\n/** Max chars of human-readable prefix in cache directory names (for debugging) */\nexport const CACHE_READABLE_PREFIX_LENGTH = 32;\n\n// File size limits for parsing boundaries (DoS prevention)\nconst ONE_MB = 1024 * 1024;\nexport const MAX_MARKETPLACE_FILE_SIZE = 10 * ONE_MB;\nexport const MAX_PLUGIN_FILE_SIZE = ONE_MB;\nexport const MAX_CONFIG_FILE_SIZE = ONE_MB;\n\nexport const MAX_JSON_NESTING_DEPTH = 10;\nexport const MAX_MARKETPLACE_PLUGINS = 10_000;\n\nexport const SCROLL_VIEWPORT = {\n /** Height of the \"N more above\" scroll indicator */\n SCROLL_INDICATOR_HEIGHT: 1,\n /** Estimated lines per category name row (including top margin) */\n CATEGORY_NAME_LINES: 2,\n /** Margin between category sections (marginTop on CategorySection) */\n CATEGORY_MARGIN_LINES: 1,\n /** Minimum rows to show at least 1 category before enabling scroll */\n MIN_VIEWPORT_ROWS: 5,\n /** Minimum terminal height to show the wizard at all */\n MIN_TERMINAL_HEIGHT: 15,\n} as const;\n\nexport const DEFAULT_BRANDING = {\n NAME: \"Agents Inc.\",\n TAGLINE: \"AI-powered development tools\",\n} as const;\n\n/** Fallback name for the default public marketplace when marketplace.json is unavailable */\nexport const DEFAULT_PUBLIC_SOURCE_NAME = \"Agents Inc\";\n\nexport const CLI_COLORS = {\n PRIMARY: \"cyan\",\n SUCCESS: \"green\",\n ERROR: \"red\",\n WARNING: \"yellow\",\n INFO: \"blue\",\n NEUTRAL: \"gray\",\n FOCUS: \"cyan\",\n UNFOCUSED: \"white\",\n WHITE: \"white\",\n} as const;\n\n/** Default domains pre-selected when \"Start from scratch\" is chosen (all except CLI) */\nexport const DEFAULT_SCRATCH_DOMAINS: readonly Domain[] = [\"web\", \"api\", \"mobile\"];\n\nexport const ASCII_LOGO = ` █████╗ ██████╗ ███████╗███╗ ██╗████████╗███████╗ ██╗███╗ ██╗ ██████╗\n██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔════╝ ██║████╗ ██║██╔════╝\n███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ███████╗ ██║██╔██╗ ██║██║\n██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ╚════██║ ██║██║╚██╗██║██║\n██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ███████║ ██║██║ ╚████║╚██████╗\n╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚══════╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝`;\n\nexport const DEFAULT_PRESELECTED_SKILLS: readonly SkillId[] = [\n \"meta-methodology-anti-over-engineering\",\n \"meta-methodology-context-management\",\n \"meta-methodology-improvement-protocol\",\n \"meta-methodology-investigation-requirements\",\n \"meta-methodology-success-criteria\",\n \"meta-methodology-write-verification\",\n];\n"],"mappings":"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","names":[]}
|