@agents-inc/cli 0.48.0 → 0.50.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 +26 -0
- package/README.md +1 -2
- package/config/stacks.yaml +0 -1
- package/dist/{chunk-YDASDMTH.js → chunk-26MXZUHU.js} +2 -2
- package/dist/{chunk-WSGKCBY5.js → chunk-2BWCR762.js} +2 -3
- package/dist/chunk-2BWCR762.js.map +1 -0
- package/dist/chunk-3VOL4WEG.js +31 -0
- package/dist/chunk-3VOL4WEG.js.map +1 -0
- package/dist/chunk-4QWDB2MD.js +571 -0
- package/dist/chunk-4QWDB2MD.js.map +1 -0
- package/dist/{chunk-ZML3OCYA.js → chunk-4R52TQ3K.js} +2 -2
- package/dist/{chunk-KPJJOLAQ.js → chunk-5FCHJLM7.js} +34 -16
- package/dist/chunk-5FCHJLM7.js.map +1 -0
- package/dist/chunk-5FPIKTSA.js +40 -0
- package/dist/chunk-5FPIKTSA.js.map +1 -0
- package/dist/{chunk-SPVSWDFM.js → chunk-5L724R4C.js} +5 -6
- package/dist/{chunk-SPVSWDFM.js.map → chunk-5L724R4C.js.map} +1 -1
- package/dist/{chunk-AXV7NFFJ.js → chunk-7LV4V6A4.js} +4 -4
- package/dist/{chunk-LESHL6SM.js → chunk-AWP5A6IM.js} +9 -3
- package/dist/chunk-AWP5A6IM.js.map +1 -0
- package/dist/chunk-C3Q43WLC.js +118 -0
- package/dist/chunk-C3Q43WLC.js.map +1 -0
- package/dist/{chunk-U2AEK4ZL.js → chunk-CMNKHDOX.js} +2 -2
- package/dist/{chunk-X3SZIBVW.js → chunk-D72AFYQR.js} +2 -2
- package/dist/chunk-D72AFYQR.js.map +1 -0
- package/dist/{chunk-FPTUCWBY.js → chunk-DCE423KO.js} +46 -30
- package/dist/chunk-DCE423KO.js.map +1 -0
- package/dist/chunk-GBOW6FUW.js +74 -0
- package/dist/chunk-GBOW6FUW.js.map +1 -0
- package/dist/{chunk-P2SFRDWI.js → chunk-HMSHB5EQ.js} +437 -185
- package/dist/chunk-HMSHB5EQ.js.map +1 -0
- package/dist/{chunk-GSPPOXMG.js → chunk-HYEUETIC.js} +2 -2
- package/dist/{chunk-IS7GP6XC.js → chunk-I6IOGZSZ.js} +61 -52
- package/dist/chunk-I6IOGZSZ.js.map +1 -0
- package/dist/{chunk-OTTITQ7C.js → chunk-JFF7P4LC.js} +30 -93
- package/dist/chunk-JFF7P4LC.js.map +1 -0
- package/dist/{chunk-FHKNG3UA.js → chunk-JWYRXE6C.js} +2 -2
- package/dist/{chunk-W62XVWXB.js → chunk-KAO3LKB5.js} +3 -3
- package/dist/{chunk-AMNCCZSG.js → chunk-KQOU4POU.js} +26 -28
- package/dist/chunk-KQOU4POU.js.map +1 -0
- package/dist/{chunk-VBAAATPU.js → chunk-M3GQ2R3E.js} +29 -28
- package/dist/chunk-M3GQ2R3E.js.map +1 -0
- package/dist/{chunk-2BVZOYJP.js → chunk-PGY5XROM.js} +2 -2
- package/dist/chunk-PGY5XROM.js.map +1 -0
- package/dist/{chunk-5MN5S3DV.js → chunk-QB5HHTAA.js} +8 -19
- package/dist/chunk-QB5HHTAA.js.map +1 -0
- package/dist/{chunk-34BP5BC4.js → chunk-QYLCINGC.js} +2 -2
- package/dist/{chunk-I52THVF6.js → chunk-RA2IPRO2.js} +2 -2
- package/dist/{chunk-G5OZQ376.js → chunk-RDWGYKDY.js} +4 -4
- package/dist/{chunk-7IAKVZL5.js → chunk-RFKDGJAJ.js} +26 -57
- package/dist/chunk-RFKDGJAJ.js.map +1 -0
- package/dist/{chunk-5O6GKXAN.js → chunk-SPFHPHYL.js} +7 -7
- package/dist/{chunk-NJVJ7VO5.js → chunk-U2W5SENM.js} +3 -3
- package/dist/{chunk-37QYD33C.js → chunk-U7X4V4HE.js} +2 -2
- package/dist/{chunk-C7DLY64D.js → chunk-UAD3SC27.js} +4 -12
- package/dist/chunk-UAD3SC27.js.map +1 -0
- package/dist/{chunk-YMUWTPOM.js → chunk-WBHPCBVN.js} +31 -11
- package/dist/chunk-WBHPCBVN.js.map +1 -0
- package/dist/chunk-WFFV254H.js +314 -0
- package/dist/chunk-WFFV254H.js.map +1 -0
- package/dist/{chunk-F7KTUFGU.js → chunk-WJHFV6RI.js} +3 -2
- package/dist/chunk-WJHFV6RI.js.map +1 -0
- package/dist/{chunk-DG2U2WY3.js → chunk-WLZHCM7O.js} +2 -2
- package/dist/{chunk-OHDEJEYB.js → chunk-XDSVV5GZ.js} +4 -4
- package/dist/{chunk-2DNDAXF6.js → chunk-YDYRAXSY.js} +57 -27
- package/dist/chunk-YDYRAXSY.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +11 -9
- package/dist/commands/compile.js.map +1 -1
- 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 +58 -52
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +4 -4
- package/dist/commands/import/skill.js +5 -5
- package/dist/commands/info.js +5 -5
- package/dist/commands/init.js +40 -435
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +4 -4
- package/dist/commands/new/agent.js +11 -10
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +24 -5
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +15 -208
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +11 -7
- package/dist/commands/outdated.js.map +1 -1
- 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 +26 -247
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/skill-search/skill-search.js +3 -3
- package/dist/components/wizard/category-grid.js +3 -2
- package/dist/components/wizard/category-grid.test.js +112 -58
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +5 -3
- package/dist/components/wizard/checkbox-grid.test.js +5 -4
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +11 -9
- 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 -2
- 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 +4 -3
- package/dist/components/wizard/source-grid.test.js +4 -3
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +8 -8
- package/dist/components/wizard/step-agents.js +10 -8
- package/dist/components/wizard/step-agents.test.js +18 -17
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +9 -8
- package/dist/components/wizard/step-build.test.js +11 -25
- 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 +7 -5
- package/dist/components/wizard/step-settings.test.js +10 -8
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +11 -10
- package/dist/components/wizard/step-sources.test.js +12 -11
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +15 -12
- package/dist/components/wizard/step-stack.test.js +16 -13
- 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 +27 -25
- package/dist/config/stacks.yaml +0 -1
- package/dist/hooks/init.js +55 -3
- package/dist/hooks/init.js.map +1 -1
- package/dist/{source-manager-Y7R6WPOW.js → source-manager-BVB2SG73.js} +4 -4
- package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
- package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
- package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
- package/dist/src/agents/meta/agent-summoner/output-format.md +1 -1
- package/dist/src/agents/meta/agent-summoner/workflow.md +5 -7
- package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
- package/dist/stores/wizard-store.js +5 -5
- package/dist/stores/wizard-store.test.js +79 -27
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
- package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
- package/src/agents/meta/agent-summoner/examples.md +2 -2
- package/src/agents/meta/agent-summoner/output-format.md +1 -1
- package/src/agents/meta/agent-summoner/workflow.md +5 -7
- package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
- package/src/schemas/agent.schema.json +1 -1
- package/src/schemas/project-config.schema.json +0 -3
- package/dist/chunk-2BVZOYJP.js.map +0 -1
- package/dist/chunk-2DNDAXF6.js.map +0 -1
- package/dist/chunk-5MN5S3DV.js.map +0 -1
- package/dist/chunk-7IAKVZL5.js.map +0 -1
- package/dist/chunk-AMNCCZSG.js.map +0 -1
- package/dist/chunk-AXZNJ5PN.js +0 -99
- package/dist/chunk-AXZNJ5PN.js.map +0 -1
- package/dist/chunk-C7DLY64D.js.map +0 -1
- package/dist/chunk-F7KTUFGU.js.map +0 -1
- package/dist/chunk-FPTUCWBY.js.map +0 -1
- package/dist/chunk-IS7GP6XC.js.map +0 -1
- package/dist/chunk-KPJJOLAQ.js.map +0 -1
- package/dist/chunk-LESHL6SM.js.map +0 -1
- package/dist/chunk-OTTITQ7C.js.map +0 -1
- package/dist/chunk-P2SFRDWI.js.map +0 -1
- package/dist/chunk-PY2XZUBF.js +0 -29
- package/dist/chunk-PY2XZUBF.js.map +0 -1
- package/dist/chunk-VBAAATPU.js.map +0 -1
- package/dist/chunk-WSGKCBY5.js.map +0 -1
- package/dist/chunk-X3SZIBVW.js.map +0 -1
- package/dist/chunk-YMUWTPOM.js.map +0 -1
- package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
- package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
- package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
- package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
- package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
- package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
- package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
- package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
- package/src/agents/migration/cli-migrator/agent.yaml +0 -12
- package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
- package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
- package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
- package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
- package/src/agents/migration/cli-migrator/intro.md +0 -15
- package/src/agents/migration/cli-migrator/output-format.md +0 -164
- package/src/agents/migration/cli-migrator/workflow.md +0 -230
- /package/dist/{chunk-YDASDMTH.js.map → chunk-26MXZUHU.js.map} +0 -0
- /package/dist/{chunk-ZML3OCYA.js.map → chunk-4R52TQ3K.js.map} +0 -0
- /package/dist/{chunk-AXV7NFFJ.js.map → chunk-7LV4V6A4.js.map} +0 -0
- /package/dist/{chunk-U2AEK4ZL.js.map → chunk-CMNKHDOX.js.map} +0 -0
- /package/dist/{chunk-GSPPOXMG.js.map → chunk-HYEUETIC.js.map} +0 -0
- /package/dist/{chunk-FHKNG3UA.js.map → chunk-JWYRXE6C.js.map} +0 -0
- /package/dist/{chunk-W62XVWXB.js.map → chunk-KAO3LKB5.js.map} +0 -0
- /package/dist/{chunk-34BP5BC4.js.map → chunk-QYLCINGC.js.map} +0 -0
- /package/dist/{chunk-I52THVF6.js.map → chunk-RA2IPRO2.js.map} +0 -0
- /package/dist/{chunk-G5OZQ376.js.map → chunk-RDWGYKDY.js.map} +0 -0
- /package/dist/{chunk-5O6GKXAN.js.map → chunk-SPFHPHYL.js.map} +0 -0
- /package/dist/{chunk-NJVJ7VO5.js.map → chunk-U2W5SENM.js.map} +0 -0
- /package/dist/{chunk-37QYD33C.js.map → chunk-U7X4V4HE.js.map} +0 -0
- /package/dist/{chunk-DG2U2WY3.js.map → chunk-WLZHCM7O.js.map} +0 -0
- /package/dist/{chunk-OHDEJEYB.js.map → chunk-XDSVV5GZ.js.map} +0 -0
- /package/dist/{source-manager-Y7R6WPOW.js.map → source-manager-BVB2SG73.js.map} +0 -0
- /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
getAvailableSkills,
|
|
4
4
|
resolveAlias
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-HMSHB5EQ.js";
|
|
6
6
|
import {
|
|
7
7
|
init_esm_shims
|
|
8
8
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -27,9 +27,6 @@ function validateBuildStep(categories, selections) {
|
|
|
27
27
|
return { valid: true };
|
|
28
28
|
}
|
|
29
29
|
function computeOptionState(skill) {
|
|
30
|
-
if (skill.disabled) {
|
|
31
|
-
return "disabled";
|
|
32
|
-
}
|
|
33
30
|
if (skill.discouraged) {
|
|
34
31
|
return "discouraged";
|
|
35
32
|
}
|
|
@@ -42,9 +39,6 @@ function getSkillDisplayLabel(skill) {
|
|
|
42
39
|
return skill.displayName || skill.id;
|
|
43
40
|
}
|
|
44
41
|
function getStateReason(skill) {
|
|
45
|
-
if (skill.disabled && skill.disabledReason) {
|
|
46
|
-
return skill.disabledReason;
|
|
47
|
-
}
|
|
48
42
|
if (skill.discouraged && skill.discouragedReason) {
|
|
49
43
|
return skill.discouragedReason;
|
|
50
44
|
}
|
|
@@ -69,7 +63,7 @@ function isCompatibleWithSelectedFrameworks(skillId, selectedFrameworkIds, matri
|
|
|
69
63
|
}
|
|
70
64
|
return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));
|
|
71
65
|
}
|
|
72
|
-
function buildCategoriesForDomain(domain, allSelections, matrix,
|
|
66
|
+
function buildCategoriesForDomain(domain, allSelections, matrix, selections, installedSkillIds) {
|
|
73
67
|
const frameworkSource = selections;
|
|
74
68
|
const frameworkSelected = isFrameworkSelected(frameworkSource);
|
|
75
69
|
const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource, matrix) : [];
|
|
@@ -80,9 +74,7 @@ function buildCategoriesForDomain(domain, allSelections, matrix, expertMode, sel
|
|
|
80
74
|
(cat) => cat.order ?? 0
|
|
81
75
|
);
|
|
82
76
|
const categoryRows = subcategories.map((cat) => {
|
|
83
|
-
const skillOptions = getAvailableSkills(cat.id, allSelections, matrix
|
|
84
|
-
expertMode
|
|
85
|
-
});
|
|
77
|
+
const skillOptions = getAvailableSkills(cat.id, allSelections, matrix);
|
|
86
78
|
const useFrameworkFilter = domain === WEB_DOMAIN_ID && cat.id !== FRAMEWORK_SUBCATEGORY_ID && frameworkSelected;
|
|
87
79
|
const filteredSkillOptions = useFrameworkFilter ? skillOptions.filter(
|
|
88
80
|
(skill) => isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds, matrix)
|
|
@@ -112,4 +104,4 @@ export {
|
|
|
112
104
|
getSkillDisplayLabel,
|
|
113
105
|
buildCategoriesForDomain
|
|
114
106
|
};
|
|
115
|
-
//# sourceMappingURL=chunk-
|
|
107
|
+
//# sourceMappingURL=chunk-UAD3SC27.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/wizard/build-step-logic.ts"],"sourcesContent":["import { sortBy } from \"remeda\";\nimport type {\n CategoryDefinition,\n Domain,\n MergedSkillsMatrix,\n SkillId,\n SubcategorySelections,\n} from \"../../types/index.js\";\nimport { getAvailableSkills, resolveAlias } from \"../matrix/index.js\";\nimport type {\n CategoryRow,\n CategoryOption,\n OptionState,\n} from \"../../components/wizard/category-grid.js\";\n\nconst FRAMEWORK_SUBCATEGORY_ID = \"web-framework\";\nconst WEB_DOMAIN_ID = \"web\";\n\nexport type BuildStepValidation = {\n valid: boolean;\n message?: string;\n};\n\nexport function validateBuildStep(\n categories: CategoryRow[],\n selections: SubcategorySelections,\n): BuildStepValidation {\n for (const category of categories) {\n if (category.required) {\n const categorySelections = selections[category.id] || [];\n if (categorySelections.length === 0) {\n return {\n valid: false,\n message: `Select at least one skill from the ${category.displayName} category. Use arrow keys to navigate, then SPACE to select.`,\n };\n }\n }\n }\n return { valid: true };\n}\n\nexport function computeOptionState(skill: {\n discouraged: boolean;\n recommended: boolean;\n}): OptionState {\n if (skill.discouraged) {\n return \"discouraged\";\n }\n if (skill.recommended) {\n return \"recommended\";\n }\n return \"normal\";\n}\n\nexport function getSkillDisplayLabel(skill: { displayName?: string; id: string }): string {\n return skill.displayName || skill.id;\n}\n\nfunction getStateReason(skill: {\n discouraged: boolean;\n discouragedReason?: string;\n recommended: boolean;\n recommendedReason?: string;\n}): string | undefined {\n if (skill.discouraged && skill.discouragedReason) {\n return skill.discouragedReason;\n }\n if (skill.recommended && skill.recommendedReason) {\n return skill.recommendedReason;\n }\n return undefined;\n}\n\nfunction isFrameworkSelected(selections: SubcategorySelections): boolean {\n const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];\n return frameworkSelections.length > 0;\n}\n\nfunction getSelectedFrameworks(\n selections: SubcategorySelections,\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];\n return frameworkSelections.map((alias) => resolveAlias(alias, matrix));\n}\n\nfunction isCompatibleWithSelectedFrameworks(\n skillId: SkillId,\n selectedFrameworkIds: SkillId[],\n matrix: MergedSkillsMatrix,\n): boolean {\n const skill = matrix.skills[skillId];\n if (!skill) return false;\n\n // No compatibleWith = compatible with all (allows legacy skills to appear)\n if (skill.compatibleWith.length === 0) {\n return true;\n }\n\n return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));\n}\n\n// Build CategoryRow[] from matrix for a domain, with framework-first filtering for web\nexport function buildCategoriesForDomain(\n domain: Domain,\n allSelections: SkillId[],\n matrix: MergedSkillsMatrix,\n selections: SubcategorySelections,\n installedSkillIds?: SkillId[],\n): CategoryRow[] {\n const frameworkSource = selections;\n const frameworkSelected = isFrameworkSelected(frameworkSource);\n const selectedFrameworkIds = frameworkSelected\n ? getSelectedFrameworks(frameworkSource, matrix)\n : [];\n\n // Object.values() on a Partial record only yields values that exist — all are CategoryDefinition\n const subcategories = sortBy(\n (Object.values(matrix.categories) as CategoryDefinition[]).filter(\n (cat) => cat.domain === domain,\n ),\n (cat) => cat.order ?? 0,\n );\n\n const categoryRows: CategoryRow[] = subcategories.map((cat) => {\n const skillOptions = getAvailableSkills(cat.id, allSelections, matrix);\n\n const useFrameworkFilter =\n domain === WEB_DOMAIN_ID && cat.id !== FRAMEWORK_SUBCATEGORY_ID && frameworkSelected;\n const filteredSkillOptions = useFrameworkFilter\n ? skillOptions.filter((skill) =>\n isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds, matrix),\n )\n : skillOptions;\n\n const options: CategoryOption[] = filteredSkillOptions.map((skill) => ({\n id: skill.id,\n label: getSkillDisplayLabel(skill),\n state: computeOptionState(skill),\n stateReason: getStateReason(skill),\n selected: skill.selected,\n local: matrix.skills[skill.id]?.local,\n installed: installedSkillIds?.includes(skill.id) || false,\n }));\n\n return {\n id: cat.id,\n displayName: cat.displayName,\n required: cat.required ?? false,\n exclusive: cat.exclusive ?? true,\n options,\n };\n });\n\n return categoryRows.filter((row) => row.options.length > 0);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
KEBAB_CASE_PATTERN
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-AWP5A6IM.js";
|
|
5
5
|
import {
|
|
6
6
|
init_esm_shims
|
|
7
7
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -26,7 +26,29 @@ function verbose(msg) {
|
|
|
26
26
|
function log(msg) {
|
|
27
27
|
console.log(msg);
|
|
28
28
|
}
|
|
29
|
+
var bufferMode = false;
|
|
30
|
+
var messageBuffer = [];
|
|
31
|
+
function enableBuffering() {
|
|
32
|
+
bufferMode = true;
|
|
33
|
+
messageBuffer = [];
|
|
34
|
+
}
|
|
35
|
+
function drainBuffer() {
|
|
36
|
+
const messages = [...messageBuffer];
|
|
37
|
+
messageBuffer = [];
|
|
38
|
+
return messages;
|
|
39
|
+
}
|
|
40
|
+
function disableBuffering() {
|
|
41
|
+
bufferMode = false;
|
|
42
|
+
messageBuffer = [];
|
|
43
|
+
}
|
|
44
|
+
function pushBufferMessage(level, text) {
|
|
45
|
+
messageBuffer.push({ level, text });
|
|
46
|
+
}
|
|
29
47
|
function warn(msg) {
|
|
48
|
+
if (bufferMode) {
|
|
49
|
+
messageBuffer.push({ level: "warn", text: msg });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
30
52
|
console.warn(` Warning: ${msg}`);
|
|
31
53
|
}
|
|
32
54
|
|
|
@@ -154,6 +176,7 @@ var SUBCATEGORY_VALUES = [
|
|
|
154
176
|
"cli-testing"
|
|
155
177
|
];
|
|
156
178
|
var subcategorySchema = z.enum(SUBCATEGORY_VALUES);
|
|
179
|
+
var SUBCATEGORY_VALUES_SET = new Set(SUBCATEGORY_VALUES);
|
|
157
180
|
var agentNameSchema = z.enum([
|
|
158
181
|
"web-developer",
|
|
159
182
|
"api-developer",
|
|
@@ -162,7 +185,6 @@ var agentNameSchema = z.enum([
|
|
|
162
185
|
"agent-summoner",
|
|
163
186
|
"documentor",
|
|
164
187
|
"skill-summoner",
|
|
165
|
-
"cli-migrator",
|
|
166
188
|
"pattern-scout",
|
|
167
189
|
"web-pattern-critique",
|
|
168
190
|
"web-pm",
|
|
@@ -422,13 +444,12 @@ var agentYamlConfigSchema = z.object({
|
|
|
422
444
|
custom: z.boolean().optional()
|
|
423
445
|
});
|
|
424
446
|
var skillAssignmentElementSchema = z.union([extensibleSkillIdSchema, skillAssignmentSchema]);
|
|
425
|
-
var stackSubcategoryValues = new Set(SUBCATEGORY_VALUES);
|
|
426
447
|
var stackAgentConfigSchema = z.record(
|
|
427
448
|
z.string(),
|
|
428
449
|
z.union([skillAssignmentElementSchema, z.array(skillAssignmentElementSchema)])
|
|
429
450
|
).superRefine(
|
|
430
451
|
validateExtensibleRecordKeys(
|
|
431
|
-
|
|
452
|
+
SUBCATEGORY_VALUES_SET,
|
|
432
453
|
customExtensions.categories,
|
|
433
454
|
"subcategory"
|
|
434
455
|
)
|
|
@@ -446,8 +467,6 @@ var projectConfigLoaderSchema = z.object({
|
|
|
446
467
|
author: z.string().optional(),
|
|
447
468
|
/** "local" = .claude/agents, "plugin" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */
|
|
448
469
|
installMode: z.enum(["local", "plugin"]).optional(),
|
|
449
|
-
/** Whether expert mode (advanced/niche skills) was enabled in the wizard */
|
|
450
|
-
expertMode: z.boolean().optional(),
|
|
451
470
|
/** Selected domains from the wizard (persisted for edit mode restoration) */
|
|
452
471
|
domains: z.array(extensibleDomainSchema).optional(),
|
|
453
472
|
/** Selected agents from the wizard (persisted for edit mode restoration) */
|
|
@@ -474,8 +493,6 @@ var projectConfigValidationSchema = z.object({
|
|
|
474
493
|
author: z.string().optional(),
|
|
475
494
|
/** "local" = .claude/agents, "plugin" = .claude/plugins/ (DEFAULT_PLUGIN_NAME) */
|
|
476
495
|
installMode: z.enum(["local", "plugin"]),
|
|
477
|
-
/** Whether expert mode (advanced/niche skills) was enabled in the wizard */
|
|
478
|
-
expertMode: z.boolean().optional(),
|
|
479
496
|
/** Selected domains from the wizard (persisted for edit mode restoration) */
|
|
480
497
|
domains: z.array(domainSchema).optional(),
|
|
481
498
|
/** Selected agents from the wizard (persisted for edit mode restoration) */
|
|
@@ -531,12 +548,11 @@ var relationshipDefinitionsSchema = z.object({
|
|
|
531
548
|
requires: z.array(requireRuleSchema),
|
|
532
549
|
alternatives: z.array(alternativeGroupSchema)
|
|
533
550
|
});
|
|
534
|
-
var builtinSubcategoryValues = new Set(SUBCATEGORY_VALUES);
|
|
535
551
|
var skillCategoriesFileSchema = z.object({
|
|
536
552
|
version: z.string(),
|
|
537
553
|
categories: z.record(z.string(), categoryDefinitionSchema).superRefine(
|
|
538
554
|
validateExtensibleRecordKeys(
|
|
539
|
-
|
|
555
|
+
SUBCATEGORY_VALUES_SET,
|
|
540
556
|
customExtensions.categories,
|
|
541
557
|
"category key"
|
|
542
558
|
)
|
|
@@ -897,6 +913,10 @@ export {
|
|
|
897
913
|
setVerbose,
|
|
898
914
|
verbose,
|
|
899
915
|
log,
|
|
916
|
+
enableBuffering,
|
|
917
|
+
drainBuffer,
|
|
918
|
+
disableBuffering,
|
|
919
|
+
pushBufferMessage,
|
|
900
920
|
warn,
|
|
901
921
|
readFile,
|
|
902
922
|
readFileSafe,
|
|
@@ -944,4 +964,4 @@ export {
|
|
|
944
964
|
warnUnknownFields,
|
|
945
965
|
extendSchemasWithCustomValues
|
|
946
966
|
};
|
|
947
|
-
//# sourceMappingURL=chunk-
|
|
967
|
+
//# sourceMappingURL=chunk-WBHPCBVN.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// --- Startup message buffering ---\n// When buffer mode is enabled (before Ink takes over the terminal), warn() pushes\n// messages into a buffer instead of writing to stderr. The buffer is drained and\n// passed to Ink's <Static> component so messages survive Ink's clearTerminal.\n\nexport type StartupMessage = {\n level: \"info\" | \"warn\" | \"error\";\n text: string;\n};\n\nlet bufferMode = false;\nlet messageBuffer: StartupMessage[] = [];\n\nexport function enableBuffering(): void {\n bufferMode = true;\n messageBuffer = [];\n}\n\nexport function drainBuffer(): StartupMessage[] {\n const messages = [...messageBuffer];\n messageBuffer = [];\n return messages;\n}\n\nexport function disableBuffering(): void {\n bufferMode = false;\n messageBuffer = [];\n}\n\nexport function pushBufferMessage(level: StartupMessage[\"level\"], text: string): void {\n messageBuffer.push({ level, text });\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 if (bufferMode) {\n messageBuffer.push({ level: \"warn\", text: msg });\n return;\n }\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 CategoryMap,\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 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\n/** Built-in subcategory values as a Set — used for record key validation in stack and category schemas */\nconst SUBCATEGORY_VALUES_SET = new Set<Subcategory>(SUBCATEGORY_VALUES);\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 \"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 \"result-types\",\n \"accessibility\",\n \"websockets\",\n \"sse\",\n \"socket-io\",\n \"service-workers\",\n \"offline-first\",\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() */\nexport const 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 author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n requires: z.array(extensibleSkillIdSchema).optional(),\n compatibleWith: z.array(extensibleSkillIdSchema).optional(),\n conflictsWith: z.array(extensibleSkillIdSchema).optional(),\n domain: extensibleDomainSchema.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 domain: extensibleDomainSchema.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([extensibleSkillIdSchema, skillAssignmentSchema]);\n\n/**\n * Agent config within a stack: maps subcategory to skill assignment(s).\n * Keys restricted to valid Subcategory values from skill-categories.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 */\nexport const stackAgentConfigSchema = z\n .record(\n z.string(),\n z.union([skillAssignmentElementSchema, z.array(skillAssignmentElementSchema)]),\n )\n .superRefine(\n validateExtensibleRecordKeys(\n SUBCATEGORY_VALUES_SET,\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 /** 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 /** 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 * Standalone skill-categories.yaml file schema.\n * Top-level object with version string and categories map using existing categoryDefinitionSchema.\n */\nexport const skillCategoriesFileSchema = z.object({\n version: z.string(),\n categories: z\n .record(z.string(), categoryDefinitionSchema)\n .superRefine(\n validateExtensibleRecordKeys(\n SUBCATEGORY_VALUES_SET,\n customExtensions.categories,\n \"category key\",\n ),\n ) as z.ZodType<CategoryMap>,\n});\n\n/**\n * Per-skill relationship rules from skill-rules.yaml.\n * All 5 fields use canonical skill IDs (aliases resolved at load time).\n */\nexport const perSkillRulesSchema = z.object({\n compatibleWith: z.array(extensibleSkillIdSchema).optional(),\n conflictsWith: z.array(extensibleSkillIdSchema).optional(),\n requires: z.array(extensibleSkillIdSchema).optional(),\n requiresSetup: z.array(extensibleSkillIdSchema).optional(),\n providesSetupFor: z.array(extensibleSkillIdSchema).optional(),\n});\n\n/**\n * Standalone skill-rules.yaml file schema.\n * Contains aliases (short name -> canonical skill ID), aggregate relationship rules,\n * and per-skill relationship rules previously stored in individual metadata.yaml files.\n */\nexport const skillRulesFileSchema = z.object({\n version: z.string(),\n aliases: z.record(z.string(), extensibleSkillIdSchema).optional(),\n relationships: relationshipDefinitionsSchema.optional(),\n \"per-skill\": z.record(z.string(), perSkillRulesSchema).optional(),\n});\n\n/**\n * Raw metadata from a local skill's metadata.yaml.\n * All fields optional — the loader validates displayName after parsing.\n */\nexport const localRawMetadataSchema = z\n .object({\n /** Short name shown in the wizard grid (e.g., \"my-custom-react\") */\n displayName: 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 /** When an AI agent should invoke this skill */\n usageGuidance: z.string().optional(),\n tags: z.array(z.string()).optional(),\n /** Explicit domain assignment (overrides inference from category prefix) */\n domain: extensibleDomainSchema.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 categories file path override (default: \"config/skill-categories.yaml\") */\n categoriesFile: z.string().optional(),\n /** Custom rules file path override (default: \"config/skill-rules.yaml\") */\n rulesFile: 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 categoriesFile: z.string().optional(),\n rulesFile: 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 metadata.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 domain: extensibleDomainSchema.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 /** 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 displayName: 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 /** Explicit domain assignment (overrides inference from category prefix) */\n domain: extensibleDomainSchema.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":[]}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
BaseCommand,
|
|
4
|
+
EXIT_CODES
|
|
5
|
+
} from "./chunk-PGY5XROM.js";
|
|
6
|
+
import {
|
|
7
|
+
LOCAL_DEFAULTS,
|
|
8
|
+
computeSkillFolderHash,
|
|
9
|
+
resolveAuthor
|
|
10
|
+
} from "./chunk-HMSHB5EQ.js";
|
|
11
|
+
import {
|
|
12
|
+
directoryExists,
|
|
13
|
+
ensureDir,
|
|
14
|
+
fileExists,
|
|
15
|
+
getErrorMessage,
|
|
16
|
+
readFile,
|
|
17
|
+
verbose,
|
|
18
|
+
writeFile
|
|
19
|
+
} from "./chunk-WBHPCBVN.js";
|
|
20
|
+
import {
|
|
21
|
+
CLI_BIN_NAME,
|
|
22
|
+
KEBAB_CASE_PATTERN,
|
|
23
|
+
LOCAL_SKILLS_PATH,
|
|
24
|
+
PLUGIN_MANIFEST_DIR,
|
|
25
|
+
SKILLS_DIR_PATH,
|
|
26
|
+
SKILL_CATEGORIES_YAML_PATH,
|
|
27
|
+
SKILL_RULES_YAML_PATH,
|
|
28
|
+
STANDARD_FILES
|
|
29
|
+
} from "./chunk-AWP5A6IM.js";
|
|
30
|
+
import {
|
|
31
|
+
init_esm_shims
|
|
32
|
+
} from "./chunk-DHET7RCE.js";
|
|
33
|
+
|
|
34
|
+
// src/cli/commands/new/skill.ts
|
|
35
|
+
init_esm_shims();
|
|
36
|
+
import { Args, Flags } from "@oclif/core";
|
|
37
|
+
import path from "path";
|
|
38
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
39
|
+
function validateSkillName(name) {
|
|
40
|
+
if (!name || name.trim() === "") {
|
|
41
|
+
return "Skill name is required";
|
|
42
|
+
}
|
|
43
|
+
if (!KEBAB_CASE_PATTERN.test(name)) {
|
|
44
|
+
return "Skill name must be kebab-case (lowercase letters, numbers, and hyphens, starting with a letter)";
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
function toTitleCase(kebabCase) {
|
|
49
|
+
return kebabCase.split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
|
|
50
|
+
}
|
|
51
|
+
function generateSkillMd(name) {
|
|
52
|
+
const titleName = toTitleCase(name);
|
|
53
|
+
return `---
|
|
54
|
+
name: ${name}
|
|
55
|
+
description: Brief description of this skill
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
# ${titleName}
|
|
59
|
+
|
|
60
|
+
> **Quick Guide:** Add a brief summary of what this skill teaches.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
<critical_requirements>
|
|
65
|
+
|
|
66
|
+
## CRITICAL: Before Using This Skill
|
|
67
|
+
|
|
68
|
+
**(Add critical requirements here)**
|
|
69
|
+
|
|
70
|
+
</critical_requirements>
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
**When to use:**
|
|
75
|
+
|
|
76
|
+
- Add use cases here
|
|
77
|
+
|
|
78
|
+
**Key patterns covered:**
|
|
79
|
+
|
|
80
|
+
- Add patterns here
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
<patterns>
|
|
85
|
+
|
|
86
|
+
## Core Patterns
|
|
87
|
+
|
|
88
|
+
### Pattern 1: Example Pattern
|
|
89
|
+
|
|
90
|
+
Add your patterns here.
|
|
91
|
+
|
|
92
|
+
</patterns>
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
<critical_reminders>
|
|
97
|
+
|
|
98
|
+
## CRITICAL REMINDERS
|
|
99
|
+
|
|
100
|
+
**(Repeat critical requirements here)**
|
|
101
|
+
|
|
102
|
+
</critical_reminders>
|
|
103
|
+
`;
|
|
104
|
+
}
|
|
105
|
+
function generateMetadataYaml(name, author, category, contentHash) {
|
|
106
|
+
const titleName = toTitleCase(name);
|
|
107
|
+
return `custom: true
|
|
108
|
+
category: ${category}
|
|
109
|
+
author: "${author}"
|
|
110
|
+
displayName: ${titleName}
|
|
111
|
+
cliDescription: Brief description
|
|
112
|
+
usageGuidance: Use when <guidance>.
|
|
113
|
+
contentHash: ${contentHash}
|
|
114
|
+
tags:
|
|
115
|
+
- local
|
|
116
|
+
- custom
|
|
117
|
+
`;
|
|
118
|
+
}
|
|
119
|
+
var KNOWN_DOMAINS = /* @__PURE__ */ new Set(["web", "api", "mobile", "cli", "shared"]);
|
|
120
|
+
var DEFAULT_CATEGORY_ORDER = 99;
|
|
121
|
+
function generateSkillCategoriesYaml(category) {
|
|
122
|
+
const prefix = category.split("-")[0];
|
|
123
|
+
const subcategoryPart = category.includes("-") ? category.slice(category.indexOf("-") + 1) : category;
|
|
124
|
+
const displayName = toTitleCase(subcategoryPart);
|
|
125
|
+
const domainLine = KNOWN_DOMAINS.has(prefix) ? `
|
|
126
|
+
domain: ${prefix}` : "";
|
|
127
|
+
return `version: "1.0.0"
|
|
128
|
+
|
|
129
|
+
categories:
|
|
130
|
+
${category}:
|
|
131
|
+
id: ${category}
|
|
132
|
+
displayName: ${displayName}
|
|
133
|
+
description: Skills for ${displayName}${domainLine}
|
|
134
|
+
exclusive: true
|
|
135
|
+
required: false
|
|
136
|
+
order: ${DEFAULT_CATEGORY_ORDER}
|
|
137
|
+
custom: true
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
function generateSkillRulesYaml(skillName) {
|
|
141
|
+
return `version: "1.0.0"
|
|
142
|
+
|
|
143
|
+
# Short aliases mapping to canonical skill IDs
|
|
144
|
+
# Example: react: "web-framework-react"
|
|
145
|
+
aliases:
|
|
146
|
+
${skillName}: "${skillName}"
|
|
147
|
+
`;
|
|
148
|
+
}
|
|
149
|
+
var NewSkill = class _NewSkill extends BaseCommand {
|
|
150
|
+
static summary = "Create a new local skill with proper structure";
|
|
151
|
+
static description = "Create a new local skill scaffold with SKILL.md and metadata.yaml files";
|
|
152
|
+
static args = {
|
|
153
|
+
name: Args.string({
|
|
154
|
+
description: "Name of the skill to create (kebab-case)",
|
|
155
|
+
required: true
|
|
156
|
+
})
|
|
157
|
+
};
|
|
158
|
+
static flags = {
|
|
159
|
+
...BaseCommand.baseFlags,
|
|
160
|
+
author: Flags.string({
|
|
161
|
+
char: "a",
|
|
162
|
+
description: "Author identifier (e.g., @myhandle)",
|
|
163
|
+
required: false
|
|
164
|
+
}),
|
|
165
|
+
category: Flags.string({
|
|
166
|
+
char: "c",
|
|
167
|
+
description: "Skill category",
|
|
168
|
+
default: LOCAL_DEFAULTS.CATEGORY
|
|
169
|
+
}),
|
|
170
|
+
force: Flags.boolean({
|
|
171
|
+
char: "f",
|
|
172
|
+
description: "Overwrite existing skill directory",
|
|
173
|
+
default: false
|
|
174
|
+
}),
|
|
175
|
+
output: Flags.string({
|
|
176
|
+
char: "o",
|
|
177
|
+
description: "Output directory for the skill (overrides marketplace detection)"
|
|
178
|
+
})
|
|
179
|
+
};
|
|
180
|
+
async run() {
|
|
181
|
+
const { args, flags } = await this.parse(_NewSkill);
|
|
182
|
+
const projectDir = process.cwd();
|
|
183
|
+
this.log("");
|
|
184
|
+
this.log("Create New Skill");
|
|
185
|
+
this.log("");
|
|
186
|
+
const validationError = validateSkillName(args.name);
|
|
187
|
+
if (validationError) {
|
|
188
|
+
this.error(validationError, { exit: EXIT_CODES.INVALID_ARGS });
|
|
189
|
+
}
|
|
190
|
+
let author = flags.author;
|
|
191
|
+
if (!author) {
|
|
192
|
+
author = await resolveAuthor(projectDir) || LOCAL_DEFAULTS.AUTHOR;
|
|
193
|
+
}
|
|
194
|
+
const category = flags.category;
|
|
195
|
+
let skillsBasePath;
|
|
196
|
+
if (flags.output) {
|
|
197
|
+
skillsBasePath = path.resolve(flags.output);
|
|
198
|
+
} else {
|
|
199
|
+
const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, "marketplace.json");
|
|
200
|
+
if (await fileExists(marketplacePath)) {
|
|
201
|
+
this.log(`Detected marketplace context, creating skill in ${SKILLS_DIR_PATH}/`);
|
|
202
|
+
skillsBasePath = path.join(projectDir, SKILLS_DIR_PATH);
|
|
203
|
+
} else {
|
|
204
|
+
skillsBasePath = path.join(projectDir, LOCAL_SKILLS_PATH);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const skillDir = path.join(skillsBasePath, args.name);
|
|
208
|
+
if (await directoryExists(skillDir)) {
|
|
209
|
+
if (!flags.force) {
|
|
210
|
+
this.error(`Skill directory already exists: ${skillDir}
|
|
211
|
+
Use --force to overwrite.`, {
|
|
212
|
+
exit: EXIT_CODES.ERROR
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
this.warn(`Overwriting existing skill at ${skillDir}`);
|
|
216
|
+
}
|
|
217
|
+
this.log(`Skill name: ${args.name}`);
|
|
218
|
+
this.log(`Author: ${author}`);
|
|
219
|
+
this.log(`Category: ${category}`);
|
|
220
|
+
this.log(`Directory: ${skillDir}`);
|
|
221
|
+
this.log("");
|
|
222
|
+
if (flags["dry-run"]) {
|
|
223
|
+
this.log("[DRY RUN] Would create skill files");
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
this.log("Creating skill files...");
|
|
227
|
+
try {
|
|
228
|
+
const skillMdContent = generateSkillMd(args.name);
|
|
229
|
+
const skillMdPath = path.join(skillDir, STANDARD_FILES.SKILL_MD);
|
|
230
|
+
const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);
|
|
231
|
+
await writeFile(skillMdPath, skillMdContent);
|
|
232
|
+
const contentHash = await computeSkillFolderHash(skillDir);
|
|
233
|
+
const metadataContent = generateMetadataYaml(args.name, author, category, contentHash);
|
|
234
|
+
await writeFile(metadataPath, metadataContent);
|
|
235
|
+
this.log("");
|
|
236
|
+
this.logSuccess(`Created ${STANDARD_FILES.SKILL_MD} at ${skillMdPath}`);
|
|
237
|
+
this.logSuccess(`Created ${STANDARD_FILES.METADATA_YAML} at ${metadataPath}`);
|
|
238
|
+
if (!flags.output) {
|
|
239
|
+
const marketplacePath = path.join(projectDir, PLUGIN_MANIFEST_DIR, "marketplace.json");
|
|
240
|
+
if (await fileExists(marketplacePath)) {
|
|
241
|
+
try {
|
|
242
|
+
await this.updateConfigFiles(projectDir, args.name, category);
|
|
243
|
+
} catch (error) {
|
|
244
|
+
this.warn(`Could not update config files: ${getErrorMessage(error)}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
this.log("");
|
|
249
|
+
this.log(
|
|
250
|
+
`Skill created successfully! Run '${CLI_BIN_NAME} compile' to include it in your agents.`
|
|
251
|
+
);
|
|
252
|
+
this.log("");
|
|
253
|
+
} catch (error) {
|
|
254
|
+
this.handleError(error);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async updateConfigFiles(projectRoot, skillName, category) {
|
|
258
|
+
const categoriesPath = path.join(projectRoot, SKILL_CATEGORIES_YAML_PATH);
|
|
259
|
+
const rulesPath = path.join(projectRoot, SKILL_RULES_YAML_PATH);
|
|
260
|
+
if (await fileExists(categoriesPath)) {
|
|
261
|
+
const content = await readFile(categoriesPath);
|
|
262
|
+
const parsed = parseYaml(content);
|
|
263
|
+
const categories = parsed.categories ?? {};
|
|
264
|
+
if (!categories[category]) {
|
|
265
|
+
const prefix = category.split("-")[0];
|
|
266
|
+
const subcategoryPart = category.includes("-") ? category.slice(category.indexOf("-") + 1) : category;
|
|
267
|
+
const entry = {
|
|
268
|
+
id: category,
|
|
269
|
+
displayName: toTitleCase(subcategoryPart),
|
|
270
|
+
description: `Skills for ${toTitleCase(subcategoryPart)}`,
|
|
271
|
+
exclusive: true,
|
|
272
|
+
required: false,
|
|
273
|
+
order: DEFAULT_CATEGORY_ORDER,
|
|
274
|
+
custom: true
|
|
275
|
+
};
|
|
276
|
+
if (KNOWN_DOMAINS.has(prefix)) entry.domain = prefix;
|
|
277
|
+
categories[category] = entry;
|
|
278
|
+
parsed.categories = categories;
|
|
279
|
+
await writeFile(categoriesPath, stringifyYaml(parsed));
|
|
280
|
+
verbose(`Added category '${category}' to ${SKILL_CATEGORIES_YAML_PATH}`);
|
|
281
|
+
}
|
|
282
|
+
} else {
|
|
283
|
+
await ensureDir(path.dirname(categoriesPath));
|
|
284
|
+
await writeFile(categoriesPath, generateSkillCategoriesYaml(category));
|
|
285
|
+
verbose(`Created ${SKILL_CATEGORIES_YAML_PATH}`);
|
|
286
|
+
}
|
|
287
|
+
if (await fileExists(rulesPath)) {
|
|
288
|
+
const content = await readFile(rulesPath);
|
|
289
|
+
const parsed = parseYaml(content);
|
|
290
|
+
const aliases = parsed.aliases ?? {};
|
|
291
|
+
if (!aliases[skillName]) {
|
|
292
|
+
aliases[skillName] = skillName;
|
|
293
|
+
parsed.aliases = aliases;
|
|
294
|
+
await writeFile(rulesPath, stringifyYaml(parsed));
|
|
295
|
+
verbose(`Added alias '${skillName}' to ${SKILL_RULES_YAML_PATH}`);
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
await ensureDir(path.dirname(rulesPath));
|
|
299
|
+
await writeFile(rulesPath, generateSkillRulesYaml(skillName));
|
|
300
|
+
verbose(`Created ${SKILL_RULES_YAML_PATH}`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
export {
|
|
306
|
+
validateSkillName,
|
|
307
|
+
toTitleCase,
|
|
308
|
+
generateSkillMd,
|
|
309
|
+
generateMetadataYaml,
|
|
310
|
+
generateSkillCategoriesYaml,
|
|
311
|
+
generateSkillRulesYaml,
|
|
312
|
+
NewSkill
|
|
313
|
+
};
|
|
314
|
+
//# sourceMappingURL=chunk-WFFV254H.js.map
|