@agents-inc/cli 0.46.0 → 0.48.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.
Files changed (169) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +114 -118
  3. package/config/skill-categories.yaml +344 -0
  4. package/config/skill-rules.yaml +740 -0
  5. package/dist/{chunk-LFZXMQOH.js → chunk-2BVZOYJP.js} +2 -2
  6. package/dist/{chunk-4C7PDDLY.js → chunk-2DNDAXF6.js} +5 -5
  7. package/dist/{chunk-C7BO2ASM.js → chunk-34BP5BC4.js} +2 -2
  8. package/dist/{chunk-TOWP4T5L.js → chunk-37QYD33C.js} +2 -2
  9. package/dist/{chunk-YT7UHV67.js → chunk-5MN5S3DV.js} +11 -9
  10. package/dist/chunk-5MN5S3DV.js.map +1 -0
  11. package/dist/{chunk-72GS6PIH.js → chunk-5O6GKXAN.js} +7 -7
  12. package/dist/{chunk-KWQ2BQXF.js → chunk-7IAKVZL5.js} +3 -3
  13. package/dist/{chunk-CTQHZELA.js → chunk-AMNCCZSG.js} +14 -14
  14. package/dist/{chunk-PZLUO4OY.js → chunk-AXV7NFFJ.js} +4 -4
  15. package/dist/{chunk-ODQ2BKWU.js → chunk-AXZNJ5PN.js} +3 -3
  16. package/dist/{chunk-J64CA4V6.js → chunk-C7DLY64D.js} +2 -2
  17. package/dist/{chunk-G2WNOT3R.js → chunk-DG2U2WY3.js} +2 -2
  18. package/dist/{chunk-3WKFSTG6.js → chunk-F7KTUFGU.js} +2 -2
  19. package/dist/{chunk-5M6JI76P.js → chunk-FHKNG3UA.js} +2 -2
  20. package/dist/{chunk-I26YP2Q3.js → chunk-FPTUCWBY.js} +5 -5
  21. package/dist/{chunk-VH3PI43B.js → chunk-G5OZQ376.js} +4 -4
  22. package/dist/{chunk-RWR56UVK.js → chunk-GSPPOXMG.js} +11 -2
  23. package/dist/chunk-GSPPOXMG.js.map +1 -0
  24. package/dist/{chunk-YVMYQSED.js → chunk-I52THVF6.js} +2 -2
  25. package/dist/{chunk-FKBCYT7B.js → chunk-IS7GP6XC.js} +5 -5
  26. package/dist/{chunk-UK3AMBR7.js → chunk-KPJJOLAQ.js} +13 -6
  27. package/dist/{chunk-UK3AMBR7.js.map → chunk-KPJJOLAQ.js.map} +1 -1
  28. package/dist/{chunk-74HSA7C4.js → chunk-LESHL6SM.js} +9 -5
  29. package/dist/chunk-LESHL6SM.js.map +1 -0
  30. package/dist/{chunk-NMXNHRAK.js → chunk-NJVJ7VO5.js} +3 -3
  31. package/dist/{chunk-GVLYNP2I.js → chunk-OHDEJEYB.js} +4 -4
  32. package/dist/{chunk-CD64ZNYI.js → chunk-OTTITQ7C.js} +11 -3
  33. package/dist/chunk-OTTITQ7C.js.map +1 -0
  34. package/dist/{chunk-RT6IBH37.js → chunk-P2SFRDWI.js} +191 -109
  35. package/dist/chunk-P2SFRDWI.js.map +1 -0
  36. package/dist/{chunk-FUEZQ2H6.js → chunk-PY2XZUBF.js} +4 -4
  37. package/dist/{chunk-CDGHSTB6.js → chunk-SPVSWDFM.js} +7 -5
  38. package/dist/chunk-SPVSWDFM.js.map +1 -0
  39. package/dist/{chunk-DO5OZHSS.js → chunk-U2AEK4ZL.js} +2 -2
  40. package/dist/{chunk-HM3DHMW7.js → chunk-VBAAATPU.js} +8 -8
  41. package/dist/chunk-VBAAATPU.js.map +1 -0
  42. package/dist/{chunk-7LDSHHKN.js → chunk-W62XVWXB.js} +3 -3
  43. package/dist/{chunk-D7JTL3DJ.js → chunk-WSGKCBY5.js} +2 -2
  44. package/dist/{chunk-XE6RTHUD.js → chunk-X3SZIBVW.js} +34 -4
  45. package/dist/chunk-X3SZIBVW.js.map +1 -0
  46. package/dist/{chunk-QBUOZVNZ.js → chunk-YDASDMTH.js} +2 -2
  47. package/dist/{chunk-5QRJUBK7.js → chunk-YMUWTPOM.js} +41 -29
  48. package/dist/chunk-YMUWTPOM.js.map +1 -0
  49. package/dist/{chunk-SGXUMZWL.js → chunk-ZML3OCYA.js} +2 -2
  50. package/dist/commands/build/marketplace.js +4 -4
  51. package/dist/commands/build/plugins.js +5 -5
  52. package/dist/commands/build/stack.js +5 -5
  53. package/dist/commands/compile.js +6 -6
  54. package/dist/commands/config/get.js +4 -4
  55. package/dist/commands/config/index.js +5 -5
  56. package/dist/commands/config/path.js +4 -4
  57. package/dist/commands/config/set-project.js +4 -4
  58. package/dist/commands/config/show.js +5 -5
  59. package/dist/commands/config/unset-project.js +4 -4
  60. package/dist/commands/diff.js +4 -4
  61. package/dist/commands/doctor.js +4 -4
  62. package/dist/commands/edit.js +29 -29
  63. package/dist/commands/eject.js +4 -4
  64. package/dist/commands/import/skill.js +7 -8
  65. package/dist/commands/import/skill.js.map +1 -1
  66. package/dist/commands/info.js +5 -5
  67. package/dist/commands/init.js +28 -28
  68. package/dist/commands/list.js +4 -4
  69. package/dist/commands/new/agent.js +6 -6
  70. package/dist/commands/new/marketplace.js +5 -5
  71. package/dist/commands/new/skill.js +10 -8
  72. package/dist/commands/new/skill.js.map +1 -1
  73. package/dist/commands/outdated.js +4 -4
  74. package/dist/commands/search.js +7 -8
  75. package/dist/commands/search.js.map +1 -1
  76. package/dist/commands/uninstall.js +6 -6
  77. package/dist/commands/update.js +6 -6
  78. package/dist/commands/validate.js +267 -24
  79. package/dist/commands/validate.js.map +1 -1
  80. package/dist/components/skill-search/skill-search.js +3 -3
  81. package/dist/components/wizard/category-grid.js +2 -2
  82. package/dist/components/wizard/category-grid.test.js +122 -2
  83. package/dist/components/wizard/category-grid.test.js.map +1 -1
  84. package/dist/components/wizard/checkbox-grid.js +3 -3
  85. package/dist/components/wizard/checkbox-grid.test.js +3 -3
  86. package/dist/components/wizard/domain-selection.js +9 -9
  87. package/dist/components/wizard/help-modal.js +2 -2
  88. package/dist/components/wizard/menu-item.js +1 -1
  89. package/dist/components/wizard/search-modal.js +2 -2
  90. package/dist/components/wizard/search-modal.test.js +2 -2
  91. package/dist/components/wizard/section-progress.js +2 -2
  92. package/dist/components/wizard/section-progress.test.js +2 -2
  93. package/dist/components/wizard/selection-card.js +2 -2
  94. package/dist/components/wizard/source-grid.js +3 -3
  95. package/dist/components/wizard/source-grid.test.js +3 -3
  96. package/dist/components/wizard/stack-selection.js +8 -8
  97. package/dist/components/wizard/step-agents.js +8 -8
  98. package/dist/components/wizard/step-agents.test.js +9 -9
  99. package/dist/components/wizard/step-build.js +8 -8
  100. package/dist/components/wizard/step-build.test.js +74 -46
  101. package/dist/components/wizard/step-build.test.js.map +1 -1
  102. package/dist/components/wizard/step-confirm.js +4 -4
  103. package/dist/components/wizard/step-confirm.test.js +8 -8
  104. package/dist/components/wizard/step-refine.js +2 -2
  105. package/dist/components/wizard/step-refine.test.js +2 -2
  106. package/dist/components/wizard/step-settings.js +5 -5
  107. package/dist/components/wizard/step-settings.test.js +8 -8
  108. package/dist/components/wizard/step-sources.js +10 -10
  109. package/dist/components/wizard/step-sources.test.js +11 -11
  110. package/dist/components/wizard/step-stack.js +12 -12
  111. package/dist/components/wizard/step-stack.test.js +13 -13
  112. package/dist/components/wizard/view-title.js +2 -2
  113. package/dist/components/wizard/wizard-layout.js +8 -8
  114. package/dist/components/wizard/wizard-tabs.js +2 -2
  115. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  116. package/dist/components/wizard/wizard.js +25 -25
  117. package/dist/config/skill-categories.yaml +344 -0
  118. package/dist/config/skill-rules.yaml +740 -0
  119. package/dist/hooks/init.js +3 -3
  120. package/dist/{source-manager-6QZ2GDUA.js → source-manager-Y7R6WPOW.js} +4 -4
  121. package/dist/src/agents/meta/documentor/examples.md +35 -36
  122. package/dist/src/agents/meta/documentor/workflow.md +91 -105
  123. package/dist/stores/wizard-store.js +5 -5
  124. package/dist/stores/wizard-store.test.js +48 -6
  125. package/dist/stores/wizard-store.test.js.map +1 -1
  126. package/package.json +5 -1
  127. package/src/agents/meta/documentor/examples.md +35 -36
  128. package/src/agents/meta/documentor/workflow.md +91 -105
  129. package/src/schemas/agent.schema.json +3 -0
  130. package/src/schemas/metadata.schema.json +5 -5
  131. package/src/schemas/project-source-config.schema.json +4 -1
  132. package/config/skills-matrix.yaml +0 -918
  133. package/dist/chunk-5QRJUBK7.js.map +0 -1
  134. package/dist/chunk-74HSA7C4.js.map +0 -1
  135. package/dist/chunk-CD64ZNYI.js.map +0 -1
  136. package/dist/chunk-CDGHSTB6.js.map +0 -1
  137. package/dist/chunk-HM3DHMW7.js.map +0 -1
  138. package/dist/chunk-RT6IBH37.js.map +0 -1
  139. package/dist/chunk-RWR56UVK.js.map +0 -1
  140. package/dist/chunk-XE6RTHUD.js.map +0 -1
  141. package/dist/chunk-YT7UHV67.js.map +0 -1
  142. package/dist/config/skills-matrix.yaml +0 -918
  143. package/src/schemas/skills-matrix.schema.json +0 -179
  144. /package/dist/{chunk-LFZXMQOH.js.map → chunk-2BVZOYJP.js.map} +0 -0
  145. /package/dist/{chunk-4C7PDDLY.js.map → chunk-2DNDAXF6.js.map} +0 -0
  146. /package/dist/{chunk-C7BO2ASM.js.map → chunk-34BP5BC4.js.map} +0 -0
  147. /package/dist/{chunk-TOWP4T5L.js.map → chunk-37QYD33C.js.map} +0 -0
  148. /package/dist/{chunk-72GS6PIH.js.map → chunk-5O6GKXAN.js.map} +0 -0
  149. /package/dist/{chunk-KWQ2BQXF.js.map → chunk-7IAKVZL5.js.map} +0 -0
  150. /package/dist/{chunk-CTQHZELA.js.map → chunk-AMNCCZSG.js.map} +0 -0
  151. /package/dist/{chunk-PZLUO4OY.js.map → chunk-AXV7NFFJ.js.map} +0 -0
  152. /package/dist/{chunk-ODQ2BKWU.js.map → chunk-AXZNJ5PN.js.map} +0 -0
  153. /package/dist/{chunk-J64CA4V6.js.map → chunk-C7DLY64D.js.map} +0 -0
  154. /package/dist/{chunk-G2WNOT3R.js.map → chunk-DG2U2WY3.js.map} +0 -0
  155. /package/dist/{chunk-3WKFSTG6.js.map → chunk-F7KTUFGU.js.map} +0 -0
  156. /package/dist/{chunk-5M6JI76P.js.map → chunk-FHKNG3UA.js.map} +0 -0
  157. /package/dist/{chunk-I26YP2Q3.js.map → chunk-FPTUCWBY.js.map} +0 -0
  158. /package/dist/{chunk-VH3PI43B.js.map → chunk-G5OZQ376.js.map} +0 -0
  159. /package/dist/{chunk-YVMYQSED.js.map → chunk-I52THVF6.js.map} +0 -0
  160. /package/dist/{chunk-FKBCYT7B.js.map → chunk-IS7GP6XC.js.map} +0 -0
  161. /package/dist/{chunk-NMXNHRAK.js.map → chunk-NJVJ7VO5.js.map} +0 -0
  162. /package/dist/{chunk-GVLYNP2I.js.map → chunk-OHDEJEYB.js.map} +0 -0
  163. /package/dist/{chunk-FUEZQ2H6.js.map → chunk-PY2XZUBF.js.map} +0 -0
  164. /package/dist/{chunk-DO5OZHSS.js.map → chunk-U2AEK4ZL.js.map} +0 -0
  165. /package/dist/{chunk-7LDSHHKN.js.map → chunk-W62XVWXB.js.map} +0 -0
  166. /package/dist/{chunk-D7JTL3DJ.js.map → chunk-WSGKCBY5.js.map} +0 -0
  167. /package/dist/{chunk-QBUOZVNZ.js.map → chunk-YDASDMTH.js.map} +0 -0
  168. /package/dist/{chunk-SGXUMZWL.js.map → chunk-ZML3OCYA.js.map} +0 -0
  169. /package/dist/{source-manager-6QZ2GDUA.js.map → source-manager-Y7R6WPOW.js.map} +0 -0
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "./chunk-I26YP2Q3.js";
4
+ } from "./chunk-FPTUCWBY.js";
5
5
  import {
6
6
  DomainSelection
7
- } from "./chunk-CDGHSTB6.js";
7
+ } from "./chunk-SPVSWDFM.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-UK3AMBR7.js";
10
+ } from "./chunk-KPJJOLAQ.js";
11
11
  import {
12
12
  init_esm_shims
13
13
  } from "./chunk-DHET7RCE.js";
@@ -26,4 +26,4 @@ var StepStack = ({ matrix, onCancel }) => {
26
26
  export {
27
27
  StepStack
28
28
  };
29
- //# sourceMappingURL=chunk-FUEZQ2H6.js.map
29
+ //# sourceMappingURL=chunk-PY2XZUBF.js.map
@@ -1,16 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDomainDisplayName
4
- } from "./chunk-RWR56UVK.js";
4
+ } from "./chunk-GSPPOXMG.js";
5
5
  import {
6
6
  CheckboxGrid
7
- } from "./chunk-ODQ2BKWU.js";
7
+ } from "./chunk-AXZNJ5PN.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-UK3AMBR7.js";
10
+ } from "./chunk-KPJJOLAQ.js";
11
11
  import {
12
12
  typedEntries
13
13
  } from "./chunk-T4EXUIBY.js";
14
+ import {
15
+ BUILT_IN_DOMAIN_ORDER
16
+ } from "./chunk-LESHL6SM.js";
14
17
  import {
15
18
  init_esm_shims
16
19
  } from "./chunk-DHET7RCE.js";
@@ -27,7 +30,6 @@ var BUILT_IN_DOMAIN_DESCRIPTIONS = {
27
30
  mobile: "Mobile applications",
28
31
  shared: "Shared utilities and methodology"
29
32
  };
30
- var BUILT_IN_DOMAIN_ORDER = ["web", "api", "cli", "mobile"];
31
33
  var DomainSelection = ({ matrix }) => {
32
34
  const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();
33
35
  const availableDomains = useMemo(() => {
@@ -66,4 +68,4 @@ var DomainSelection = ({ matrix }) => {
66
68
  export {
67
69
  DomainSelection
68
70
  };
69
- //# sourceMappingURL=chunk-CDGHSTB6.js.map
71
+ //# sourceMappingURL=chunk-SPVSWDFM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/domain-selection.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { unique } from \"remeda\";\nimport { BUILT_IN_DOMAIN_ORDER } from \"../../consts.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { Domain, MergedSkillsMatrix } from \"../../types/index.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\nimport { CheckboxGrid, type CheckboxItem } from \"./checkbox-grid.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\n\nconst BUILT_IN_DOMAIN_DESCRIPTIONS: Record<Domain, string> = {\n web: \"Frontend web applications\",\n api: \"Backend APIs and services\",\n cli: \"Command-line tools\",\n mobile: \"Mobile applications\",\n shared: \"Shared utilities and methodology\",\n};\n\ntype DomainSelectionProps = {\n matrix: MergedSkillsMatrix;\n};\n\nexport const DomainSelection: React.FC<DomainSelectionProps> = ({ matrix }) => {\n const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();\n\n const availableDomains = useMemo((): CheckboxItem<Domain>[] => {\n const matrixDomains = unique(\n typedEntries(matrix.categories)\n .map(([, cat]) => cat?.domain)\n .filter((d): d is Domain => d != null && d !== \"shared\"),\n );\n\n const ordered: Domain[] = [\n ...BUILT_IN_DOMAIN_ORDER.filter((d) => matrixDomains.includes(d)),\n ...matrixDomains.filter((d) => !BUILT_IN_DOMAIN_ORDER.includes(d)),\n ];\n\n return ordered.map((domain) => ({\n id: domain,\n label: getDomainDisplayName(domain),\n description: BUILT_IN_DOMAIN_DESCRIPTIONS[domain] ?? `${getDomainDisplayName(domain)} skills`,\n }));\n }, [matrix]);\n\n const handleBack = () => {\n setApproach(null);\n selectStack(null);\n };\n\n return (\n <CheckboxGrid\n title=\"Select domains to configure\"\n // subtitle=\"Select one or more domains, then continue\"\n items={availableDomains}\n selectedIds={selectedDomains}\n onToggle={toggleDomain}\n onContinue={() => setStep(\"build\")}\n onBack={handleBack}\n continueLabel={(count) => `Continue with ${count} domain(s)`}\n emptyMessage=\"Please select at least one domain\"\n />\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,eAAe;AAC/B,SAAS,cAAc;AAgDnB;AAxCJ,IAAM,+BAAuD;AAAA,EAC3D,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AACV;AAMO,IAAM,kBAAkD,CAAC,EAAE,OAAO,MAAM;AAC7E,QAAM,EAAE,iBAAiB,cAAc,SAAS,aAAa,YAAY,IAAI,eAAe;AAE5F,QAAM,mBAAmB,QAAQ,MAA8B;AAC7D,UAAM,gBAAgB;AAAA,MACpB,aAAa,OAAO,UAAU,EAC3B,IAAI,CAAC,CAAC,EAAE,GAAG,MAAM,KAAK,MAAM,EAC5B,OAAO,CAAC,MAAmB,KAAK,QAAQ,MAAM,QAAQ;AAAA,IAC3D;AAEA,UAAM,UAAoB;AAAA,MACxB,GAAG,sBAAsB,OAAO,CAAC,MAAM,cAAc,SAAS,CAAC,CAAC;AAAA,MAChE,GAAG,cAAc,OAAO,CAAC,MAAM,CAAC,sBAAsB,SAAS,CAAC,CAAC;AAAA,IACnE;AAEA,WAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC9B,IAAI;AAAA,MACJ,OAAO,qBAAqB,MAAM;AAAA,MAClC,aAAa,6BAA6B,MAAM,KAAK,GAAG,qBAAqB,MAAM,CAAC;AAAA,IACtF,EAAE;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,aAAa,MAAM;AACvB,gBAAY,IAAI;AAChB,gBAAY,IAAI;AAAA,EAClB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MAEN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY,MAAM,QAAQ,OAAO;AAAA,MACjC,QAAQ;AAAA,MACR,eAAe,CAAC,UAAU,iBAAiB,KAAK;AAAA,MAChD,cAAa;AAAA;AAAA,EACf;AAEJ;","names":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-74HSA7C4.js";
4
+ } from "./chunk-LESHL6SM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -17,4 +17,4 @@ var ViewTitle = ({ children }) => {
17
17
  export {
18
18
  ViewTitle
19
19
  };
20
- //# sourceMappingURL=chunk-DO5OZHSS.js.map
20
+ //# sourceMappingURL=chunk-U2AEK4ZL.js.map
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-K77I4XGL.js";
5
5
  import {
6
6
  getDomainDisplayName
7
- } from "./chunk-RWR56UVK.js";
7
+ } from "./chunk-GSPPOXMG.js";
8
8
  import {
9
9
  ViewTitle
10
- } from "./chunk-DO5OZHSS.js";
10
+ } from "./chunk-U2AEK4ZL.js";
11
11
  import {
12
12
  useWizardStore
13
- } from "./chunk-UK3AMBR7.js";
13
+ } from "./chunk-KPJJOLAQ.js";
14
14
  import {
15
15
  typedKeys
16
16
  } from "./chunk-T4EXUIBY.js";
@@ -18,7 +18,7 @@ import {
18
18
  CLI_COLORS,
19
19
  SCROLL_VIEWPORT,
20
20
  UI_SYMBOLS
21
- } from "./chunk-74HSA7C4.js";
21
+ } from "./chunk-LESHL6SM.js";
22
22
  import {
23
23
  init_esm_shims
24
24
  } from "./chunk-DHET7RCE.js";
@@ -118,13 +118,13 @@ function buildAgentGroups(matrix) {
118
118
  if (customAgentIds.length === 0) return BUILT_IN_AGENT_GROUPS;
119
119
  const customGroupMap = /* @__PURE__ */ new Map();
120
120
  for (const agentId of customAgentIds) {
121
- const prefix = agentId.split("-")[0] || "custom";
122
- const groupLabel = getDomainDisplayName(prefix);
121
+ const explicitDomain = matrix.agentDefinedDomains?.[agentId];
122
+ const domainKey = explicitDomain ?? (agentId.split("-")[0] || "custom");
123
+ const groupLabel = getDomainDisplayName(domainKey);
123
124
  if (!customGroupMap.has(groupLabel)) {
124
125
  customGroupMap.set(groupLabel, []);
125
126
  }
126
127
  customGroupMap.get(groupLabel).push({
127
- // Boundary cast: custom agent names from matrix stacks are not in the AgentName union
128
128
  id: agentId,
129
129
  label: agentIdToLabel(agentId),
130
130
  description: "Custom agent"
@@ -255,4 +255,4 @@ var StepAgents = ({ matrix }) => {
255
255
  export {
256
256
  StepAgents
257
257
  };
258
- //# sourceMappingURL=chunk-HM3DHMW7.js.map
258
+ //# sourceMappingURL=chunk-VBAAATPU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-agents.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React, { useMemo, useRef, useState } from \"react\";\nimport { CLI_COLORS, SCROLL_VIEWPORT, UI_SYMBOLS } from \"../../consts.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { AgentName, MergedSkillsMatrix } from \"../../types/index.js\";\nimport { typedKeys } from \"../../utils/typed-object.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\ntype AgentItem = {\n id: AgentName;\n label: string;\n description: string;\n};\n\ntype AgentGroup = {\n label: string;\n items: AgentItem[];\n};\n\nconst BUILT_IN_AGENT_GROUPS: AgentGroup[] = [\n {\n label: \"Web\",\n items: [\n {\n id: \"web-developer\",\n label: \"Web Developer\",\n description: \"Frontend features, components, TypeScript\",\n },\n { id: \"web-reviewer\", label: \"Web Reviewer\", description: \"UI component code review\" },\n { id: \"web-researcher\", label: \"Web Researcher\", description: \"Frontend pattern discovery\" },\n {\n id: \"web-tester\",\n label: \"Web Tester\",\n description: \"Frontend tests, E2E, component tests\",\n },\n { id: \"web-pm\", label: \"Web PM\", description: \"Implementation specs and planning\" },\n {\n id: \"web-architecture\",\n label: \"Web Architecture\",\n description: \"App scaffolding, foundational patterns\",\n },\n {\n id: \"web-pattern-critique\",\n label: \"Web Pattern Critique\",\n description: \"Critique patterns against industry standards\",\n },\n ],\n },\n {\n label: \"API\",\n items: [\n {\n id: \"api-developer\",\n label: \"API Developer\",\n description: \"Backend routes, database, middleware\",\n },\n { id: \"api-reviewer\", label: \"API Reviewer\", description: \"Backend and config code review\" },\n { id: \"api-researcher\", label: \"API Researcher\", description: \"Backend pattern discovery\" },\n ],\n },\n {\n label: \"CLI\",\n items: [\n {\n id: \"cli-developer\",\n label: \"CLI Developer\",\n description: \"CLI commands, interactive prompts\",\n },\n { id: \"cli-tester\", label: \"CLI Tester\", description: \"CLI application tests\" },\n { id: \"cli-reviewer\", label: \"CLI Reviewer\", description: \"CLI code review\" },\n { id: \"cli-migrator\", label: \"CLI Migrator\", description: \"Commander.js to oclif migration\" },\n ],\n },\n {\n label: \"Meta\",\n items: [\n {\n id: \"pattern-scout\",\n label: \"Pattern Scout\",\n description: \"Extract codebase patterns and standards\",\n },\n { id: \"agent-summoner\", label: \"Agent Summoner\", description: \"Create and improve agents\" },\n {\n id: \"skill-summoner\",\n label: \"Skill Summoner\",\n description: \"Create technology-specific skills\",\n },\n { id: \"documentor\", label: \"Documentor\", description: \"AI-focused documentation\" },\n ],\n },\n];\n\n/** IDs of all built-in agents for fast lookup. */\nconst BUILT_IN_AGENT_IDS = new Set<string>(\n BUILT_IN_AGENT_GROUPS.flatMap((group) => group.items.map((a) => a.id)),\n);\n\n/** Convert a kebab-case agent ID to a title-case label. */\nfunction agentIdToLabel(id: string): string {\n return id\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\ntype FocusId = AgentName | \"continue\";\n\ntype ListRow =\n | { type: \"header\"; label: string }\n | { type: \"spacer\" }\n | { type: \"agent\"; agent: AgentItem };\n\nfunction buildAgentGroups(matrix: MergedSkillsMatrix): AgentGroup[] {\n const customAgentIds: string[] = [];\n for (const stack of matrix.suggestedStacks) {\n for (const agentName of typedKeys(stack.skills)) {\n if (!BUILT_IN_AGENT_IDS.has(agentName) && !customAgentIds.includes(agentName)) {\n customAgentIds.push(agentName);\n }\n }\n }\n\n if (customAgentIds.length === 0) return BUILT_IN_AGENT_GROUPS;\n\n // Group custom agents by explicit domain (from agent.yaml) or kebab prefix fallback\n const customGroupMap = new Map<string, AgentItem[]>();\n for (const agentId of customAgentIds) {\n // Boundary cast: custom agent names from matrix stacks are not in the AgentName union\n const explicitDomain = matrix.agentDefinedDomains?.[agentId as AgentName];\n const domainKey = explicitDomain ?? (agentId.split(\"-\")[0] || \"custom\");\n const groupLabel = getDomainDisplayName(domainKey);\n if (!customGroupMap.has(groupLabel)) {\n customGroupMap.set(groupLabel, []);\n }\n customGroupMap.get(groupLabel)!.push({\n id: agentId as AgentName,\n label: agentIdToLabel(agentId),\n description: \"Custom agent\",\n });\n }\n\n const customGroups: AgentGroup[] = [];\n for (const [label, items] of customGroupMap) {\n customGroups.push({ label, items });\n }\n\n return [...BUILT_IN_AGENT_GROUPS, ...customGroups];\n}\n\nfunction buildFlatRows(groups: AgentGroup[]): ListRow[] {\n return groups.flatMap((group, groupIndex): ListRow[] => [\n ...(groupIndex > 0 ? [{ type: \"spacer\" as const }] : []),\n { type: \"header\" as const, label: group.label },\n ...group.items.map((agent): ListRow => ({ type: \"agent\", agent })),\n ]);\n}\n\nfunction buildFocusableIds(groups: AgentGroup[]): FocusId[] {\n return [...groups.flatMap((group) => group.items.map((a) => a.id)), \"continue\"];\n}\n\ntype StepAgentsProps = {\n matrix: MergedSkillsMatrix;\n};\n\nexport const StepAgents: React.FC<StepAgentsProps> = ({ matrix }) => {\n const store = useWizardStore();\n\n const agentGroups = useMemo(() => buildAgentGroups(matrix), [matrix]);\n const flatRows = useMemo(() => buildFlatRows(agentGroups), [agentGroups]);\n const focusableIds = useMemo(() => buildFocusableIds(agentGroups), [agentGroups]);\n\n const [focusedId, setFocusedId] = useState<FocusId>(focusableIds[0]!);\n const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();\n\n const scrollTopRef = useRef(0);\n const scrollEnabled = listHeight > 0 && listHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;\n\n if (scrollEnabled && focusedId !== \"continue\") {\n const rowIndex = flatRows.findIndex(\n (row) => row.type === \"agent\" && row.agent.id === focusedId,\n );\n if (rowIndex >= 0) {\n if (rowIndex < scrollTopRef.current) {\n scrollTopRef.current = rowIndex;\n } else if (rowIndex + 1 > scrollTopRef.current + listHeight) {\n scrollTopRef.current = rowIndex + 1 - listHeight;\n }\n }\n }\n\n useInput((input, key) => {\n if (key.escape) {\n store.goBack();\n return;\n }\n\n const currentIdx = focusableIds.indexOf(focusedId);\n\n if (key.upArrow || input === \"k\") {\n const nextIdx = currentIdx <= 0 ? focusableIds.length - 1 : currentIdx - 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n\n if (key.downArrow || input === \"j\") {\n const nextIdx = currentIdx >= focusableIds.length - 1 ? 0 : currentIdx + 1;\n setFocusedId(focusableIds[nextIdx]!);\n return;\n }\n\n if (key.return) {\n store.setStep(\"confirm\");\n return;\n }\n\n if (input === \" \" && focusedId !== \"continue\") {\n store.toggleAgent(focusedId);\n }\n });\n\n const selectedCount = store.selectedAgents.length;\n const continueLabel =\n selectedCount > 0 ? `Continue with ${selectedCount} agent(s)` : \"Continue without agents\";\n\n const isContinueFocused = focusedId === \"continue\";\n\n const rowElements = flatRows.map((row, index) => {\n switch (row.type) {\n case \"header\":\n return (\n <Box key={`header-${row.label}`} flexShrink={0}>\n <Text dimColor bold>\n {\" \"}\n {row.label}\n </Text>\n </Box>\n );\n case \"spacer\":\n return (\n <Box key={`spacer-${index}`} flexShrink={0}>\n <Text> </Text>\n </Box>\n );\n case \"agent\": {\n const isFocused = row.agent.id === focusedId;\n const isSelected = store.selectedAgents.includes(row.agent.id);\n const checkbox = isSelected ? \"[\\u2713]\" : \"[ ]\";\n const pointer = isFocused ? UI_SYMBOLS.CURRENT : \" \";\n return (\n <Box key={row.agent.id} flexShrink={0}>\n <Text>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined}>{pointer}</Text>\n <Text\n color={isSelected || isFocused ? CLI_COLORS.PRIMARY : undefined}\n bold={isFocused}\n >\n {\" \"}\n {checkbox} {row.agent.label}\n </Text>\n <Text dimColor> - {row.agent.description}</Text>\n </Text>\n </Box>\n );\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" flexGrow={1} flexBasis={0}>\n <ViewTitle>Select agents to compile:</ViewTitle>\n\n {!scrollEnabled ? (\n <Box ref={listRef} flexDirection=\"column\" flexGrow={1} flexBasis={0} overflow=\"hidden\">\n {rowElements}\n </Box>\n ) : (\n <Box ref={listRef} flexDirection=\"column\" flexGrow={1} flexBasis={0}>\n <Box flexDirection=\"column\" overflow=\"hidden\" flexGrow={1}>\n <Box\n flexDirection=\"column\"\n marginTop={scrollTopRef.current > 0 ? -scrollTopRef.current : 0}\n flexShrink={0}\n >\n {rowElements}\n </Box>\n </Box>\n </Box>\n )}\n\n <Text color={isContinueFocused ? CLI_COLORS.PRIMARY : undefined} bold={isContinueFocused}>\n {isContinueFocused ? UI_SYMBOLS.CURRENT : \" \"} {\"\\u2192\"} {continueLabel}\n </Text>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -8,10 +8,10 @@ import {
8
8
  verbose,
9
9
  warn,
10
10
  writeFile
11
- } from "./chunk-5QRJUBK7.js";
11
+ } from "./chunk-YMUWTPOM.js";
12
12
  import {
13
13
  MAX_PLUGIN_FILE_SIZE
14
- } from "./chunk-74HSA7C4.js";
14
+ } from "./chunk-LESHL6SM.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "./chunk-DHET7RCE.js";
@@ -129,4 +129,4 @@ export {
129
129
  writeMarketplace,
130
130
  getMarketplaceStats
131
131
  };
132
- //# sourceMappingURL=chunk-7LDSHHKN.js.map
132
+ //# sourceMappingURL=chunk-W62XVWXB.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-74HSA7C4.js";
4
+ } from "./chunk-LESHL6SM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -87,4 +87,4 @@ var HelpModal = ({ currentStep }) => {
87
87
  export {
88
88
  HelpModal
89
89
  };
90
- //# sourceMappingURL=chunk-D7JTL3DJ.js.map
90
+ //# sourceMappingURL=chunk-WSGKCBY5.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-T4EXUIBY.js";
5
5
  import {
6
6
  DEFAULT_BRANDING
7
- } from "./chunk-74HSA7C4.js";
7
+ } from "./chunk-LESHL6SM.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -58,7 +58,6 @@ function createMockSkill(id, category, overrides) {
58
58
  id,
59
59
  description: `${id} skill`,
60
60
  category,
61
- categoryExclusive: false,
62
61
  tags: [],
63
62
  author: "@test",
64
63
  conflictsWith: [],
@@ -198,12 +197,43 @@ var TEST_SKILLS = {
198
197
  hono: createMockSkill("api-framework-hono", "api-api"),
199
198
  vitest: createMockSkill("web-testing-vitest", "web-testing"),
200
199
  scssModules: createMockSkill("web-styling-scss-modules", "web-styling"),
201
- drizzle: createMockSkill("api-database-drizzle", "api-database")
200
+ drizzle: createMockSkill("api-database-drizzle", "api-database"),
201
+ // Methodology skills (DEFAULT_PRESELECTED_SKILLS) — used by createComprehensiveMatrix
202
+ investigationRequirements: createMockSkill(
203
+ "meta-methodology-investigation-requirements",
204
+ "shared-methodology",
205
+ { description: "Never speculate - read actual code first" }
206
+ ),
207
+ antiOverEngineering: createMockSkill(
208
+ "meta-methodology-anti-over-engineering",
209
+ "shared-methodology",
210
+ {
211
+ description: "Surgical implementation, not architectural innovation"
212
+ }
213
+ ),
214
+ successCriteria: createMockSkill("meta-methodology-success-criteria", "shared-methodology", {
215
+ description: "Explicit, measurable criteria defining done"
216
+ }),
217
+ writeVerification: createMockSkill("meta-methodology-write-verification", "shared-methodology", {
218
+ description: "Verify work was actually saved"
219
+ }),
220
+ improvementProtocol: createMockSkill(
221
+ "meta-methodology-improvement-protocol",
222
+ "shared-methodology",
223
+ { description: "Evidence-based self-improvement" }
224
+ ),
225
+ contextManagement: createMockSkill("meta-methodology-context-management", "shared-methodology", {
226
+ description: "Maintain project continuity across sessions"
227
+ })
202
228
  };
203
229
  var TEST_CATEGORIES = {
204
230
  framework: createMockCategory("web-framework", "Framework"),
205
231
  clientState: createMockCategory("web-client-state", "Client State"),
232
+ styling: createMockCategory("web-styling", "Styling"),
206
233
  testing: createMockCategory("web-testing", "Testing"),
234
+ api: createMockCategory("api-api", "Backend Framework"),
235
+ database: createMockCategory("api-database", "Database"),
236
+ methodology: createMockCategory("shared-methodology", "Methodology"),
207
237
  tooling: createMockCategory("shared-tooling", "Tooling")
208
238
  };
209
239
  var TEST_MATRICES = {
@@ -244,4 +274,4 @@ export {
244
274
  createMockCategory,
245
275
  createMockResolvedStack
246
276
  };
247
- //# sourceMappingURL=chunk-XE6RTHUD.js.map
277
+ //# sourceMappingURL=chunk-X3SZIBVW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/__tests__/test-fixtures.ts","../src/cli/lib/__tests__/helpers.ts"],"sourcesContent":["import type {\n CategoryPath,\n MergedSkillsMatrix,\n ResolvedSkill,\n SkillDisplayName,\n SkillId,\n} from \"../../types\";\nimport { createMockSkill, createMockCategory, createMockMatrix } from \"./helpers\";\n\ninterface SkillFixtureConfig {\n id: SkillId;\n category: CategoryPath;\n displayName?: SkillDisplayName;\n description: string;\n tags: string[];\n}\n\nconst SKILL_FIXTURES: Record<string, SkillFixtureConfig> = {\n react: {\n id: \"web-framework-react\",\n category: \"web-framework\",\n displayName: \"react\",\n description: \"React framework for building user interfaces\",\n tags: [\"react\", \"web\", \"ui\", \"component\"],\n },\n zustand: {\n id: \"web-state-zustand\",\n category: \"web-client-state\",\n displayName: \"zustand\",\n description: \"Bear necessities state management\",\n tags: [\"state\", \"react\", \"zustand\"],\n },\n hono: {\n id: \"api-framework-hono\",\n category: \"api-api\",\n displayName: \"hono\",\n description: \"Lightweight web framework for the edge\",\n tags: [\"api\", \"api\", \"edge\", \"serverless\"],\n },\n vitest: {\n id: \"web-testing-vitest\",\n category: \"web-testing\",\n displayName: \"vitest\",\n description: \"Next generation testing framework\",\n tags: [\"testing\", \"vitest\", \"unit\"],\n },\n vue: {\n id: \"web-framework-vue\",\n category: \"web-framework\",\n displayName: \"vue\",\n description: \"Progressive JavaScript framework\",\n tags: [\"vue\", \"web\", \"reactive\"],\n },\n \"auth-patterns\": {\n id: \"api-security-auth-patterns\",\n category: \"api-security\",\n description: \"Authentication and authorization patterns\",\n tags: [\"auth\", \"security\", \"jwt\", \"oauth\"],\n },\n drizzle: {\n id: \"api-database-drizzle\",\n category: \"api-database\",\n displayName: \"drizzle\",\n description: \"TypeScript ORM for SQL databases\",\n tags: [\"database\", \"orm\", \"sql\"],\n },\n methodology: {\n id: \"meta-methodology-anti-over-engineering\",\n category: \"shared-methodology\",\n description: \"Surgical implementation, not architectural innovation\",\n tags: [\"methodology\", \"foundational\"],\n },\n \"scss-modules\": {\n id: \"web-styling-scss-modules\",\n category: \"web-styling\",\n displayName: \"scss-modules\",\n description: \"CSS Modules with SCSS\",\n tags: [\"css\", \"scss\", \"modules\"],\n },\n} as const;\n\nexport type TestSkillName = keyof typeof SKILL_FIXTURES;\n\nexport function getTestSkill(\n name: TestSkillName,\n overrides?: Partial<ResolvedSkill>,\n): ResolvedSkill {\n const config = SKILL_FIXTURES[name];\n const { id, category, ...defaults } = config;\n return createMockSkill(id, category, { ...defaults, ...overrides });\n}\n\n// ---------------------------------------------------------------------------\n// Shared base skill fixtures — canonical defaults with no overrides.\n// Use spread for per-test customization: `{ ...TEST_SKILLS.react, displayName: \"react\" }`\n// ---------------------------------------------------------------------------\n\nexport const TEST_SKILLS = {\n react: createMockSkill(\"web-framework-react\", \"web-framework\"),\n vue: createMockSkill(\"web-framework-vue\", \"web-framework\"),\n zustand: createMockSkill(\"web-state-zustand\", \"web-client-state\", {\n compatibleWith: [\"web-framework-react\"],\n }),\n pinia: createMockSkill(\"web-state-pinia\", \"web-client-state\", {\n compatibleWith: [\"web-framework-vue\"],\n }),\n hono: createMockSkill(\"api-framework-hono\", \"api-api\"),\n vitest: createMockSkill(\"web-testing-vitest\", \"web-testing\"),\n scssModules: createMockSkill(\"web-styling-scss-modules\", \"web-styling\"),\n drizzle: createMockSkill(\"api-database-drizzle\", \"api-database\"),\n // Methodology skills (DEFAULT_PRESELECTED_SKILLS) — used by createComprehensiveMatrix\n investigationRequirements: createMockSkill(\n \"meta-methodology-investigation-requirements\",\n \"shared-methodology\",\n { description: \"Never speculate - read actual code first\" },\n ),\n antiOverEngineering: createMockSkill(\n \"meta-methodology-anti-over-engineering\",\n \"shared-methodology\",\n {\n description: \"Surgical implementation, not architectural innovation\",\n },\n ),\n successCriteria: createMockSkill(\"meta-methodology-success-criteria\", \"shared-methodology\", {\n description: \"Explicit, measurable criteria defining done\",\n }),\n writeVerification: createMockSkill(\"meta-methodology-write-verification\", \"shared-methodology\", {\n description: \"Verify work was actually saved\",\n }),\n improvementProtocol: createMockSkill(\n \"meta-methodology-improvement-protocol\",\n \"shared-methodology\",\n { description: \"Evidence-based self-improvement\" },\n ),\n contextManagement: createMockSkill(\"meta-methodology-context-management\", \"shared-methodology\", {\n description: \"Maintain project continuity across sessions\",\n }),\n};\n\n// ---------------------------------------------------------------------------\n// Shared base category fixtures — canonical defaults with no overrides.\n// Use spread for per-test customization: `{ ...TEST_CATEGORIES.framework, required: true }`\n// ---------------------------------------------------------------------------\n\nexport const TEST_CATEGORIES = {\n framework: createMockCategory(\"web-framework\", \"Framework\"),\n clientState: createMockCategory(\"web-client-state\", \"Client State\"),\n styling: createMockCategory(\"web-styling\", \"Styling\"),\n testing: createMockCategory(\"web-testing\", \"Testing\"),\n api: createMockCategory(\"api-api\", \"Backend Framework\"),\n database: createMockCategory(\"api-database\", \"Database\"),\n methodology: createMockCategory(\"shared-methodology\", \"Methodology\"),\n tooling: createMockCategory(\"shared-tooling\", \"Tooling\"),\n};\n\n// ---------------------------------------------------------------------------\n// Shared matrix fixtures — common skill combinations used across test files.\n// Use createMockMatrix overrides for per-test customization:\n// `createMockMatrix(TEST_MATRICES.react.skills, { suggestedStacks: [...] })`\n// ---------------------------------------------------------------------------\n\nexport const TEST_MATRICES: Record<string, MergedSkillsMatrix> = {\n empty: createMockMatrix({}),\n react: createMockMatrix({\n \"web-framework-react\": TEST_SKILLS.react,\n }),\n reactAndZustand: createMockMatrix({\n \"web-framework-react\": TEST_SKILLS.react,\n \"web-state-zustand\": TEST_SKILLS.zustand,\n }),\n reactAndHono: createMockMatrix({\n \"web-framework-react\": TEST_SKILLS.react,\n \"api-framework-hono\": TEST_SKILLS.hono,\n }),\n reactAndScss: createMockMatrix({\n \"web-framework-react\": TEST_SKILLS.react,\n \"web-styling-scss-modules\": TEST_SKILLS.scssModules,\n }),\n reactScssAndHono: createMockMatrix({\n \"web-framework-react\": TEST_SKILLS.react,\n \"web-styling-scss-modules\": TEST_SKILLS.scssModules,\n \"api-framework-hono\": TEST_SKILLS.hono,\n }),\n reactZustandAndHono: createMockMatrix({\n \"web-framework-react\": TEST_SKILLS.react,\n \"web-state-zustand\": TEST_SKILLS.zustand,\n \"api-framework-hono\": TEST_SKILLS.hono,\n }),\n};\n","import path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { mkdir, writeFile, readFile } from \"fs/promises\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { run, Errors } from \"@oclif/core\";\nimport ansis from \"ansis\";\nimport { DEFAULT_BRANDING, DEFAULT_PLUGIN_NAME, STANDARD_FILES } from \"../../consts\";\nimport { typedEntries } from \"../../utils/typed-object\";\nimport { computeSkillFolderHash } from \"../versioning\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const CLI_ROOT = path.resolve(__dirname, \"../../../..\");\n\nexport const OUTPUT_STRINGS = {\n CONFIG_HEADER: `${DEFAULT_BRANDING.NAME} Configuration`,\n CONFIG_PATHS_HEADER: \"Configuration File Paths\",\n CONFIG_LAYERS_HEADER: \"Configuration Layers:\",\n CONFIG_PRECEDENCE: \"Precedence: flag > env > project > global > default\",\n SOURCE_LABEL: \"Source:\",\n MARKETPLACE_LABEL: \"Marketplace:\",\n AGENTS_SOURCE_LABEL: \"Agents Source:\",\n GLOBAL_LABEL: \"Global:\",\n PROJECT_LABEL: \"Project:\",\n\n // Setup/Init outputs\n INIT_HEADER: `${DEFAULT_BRANDING.NAME} Setup`,\n INIT_SUCCESS: `${DEFAULT_BRANDING.NAME} initialized successfully!`,\n LOADING_MATRIX: \"Loading skills matrix...\",\n LOADING_SKILLS: \"Loading skills...\",\n LOADING_AGENTS: \"Loading agent partials...\",\n\n // Plugin/installation outputs\n NO_PLUGIN_FOUND: \"No plugin found\",\n NO_INSTALLATION_FOUND: \"No installation found\",\n NO_PLUGIN_INSTALLATION: \"No plugin installation found\",\n NOT_INSTALLED: `${DEFAULT_BRANDING.NAME} is not installed`,\n UNINSTALL_HEADER: `${DEFAULT_BRANDING.NAME} Uninstall`,\n UNINSTALL_COMPLETE: `${DEFAULT_BRANDING.NAME} has been uninstalled`,\n EJECT_HEADER: `${DEFAULT_BRANDING.NAME} Eject`,\n\n // Doctor command outputs\n DOCTOR_HEADER: `${DEFAULT_BRANDING.NAME} Doctor`,\n\n // Error message patterns (lowercase for case-insensitive matching)\n ERROR_MISSING_ARG: \"missing required arg\",\n ERROR_UNEXPECTED_ARG: \"unexpected argument\",\n ERROR_UNKNOWN_FLAG: \"unknown flag\",\n ERROR_PARSE: \"parse\",\n} as const;\n\n/**\n * Run a CLI command and capture its output.\n *\n * Bun's `console.log` does not go through `process.stdout.write`, so\n * `@oclif/test`'s `runCommand` (which only intercepts `process.stdout.write`)\n * returns empty stdout/stderr in bun. This helper intercepts both layers\n * to work correctly in both Node.js and bun environments.\n */\nexport async function runCliCommand(args: string[]) {\n const origStdoutWrite = process.stdout.write;\n const origStderrWrite = process.stderr.write;\n const origLog = console.log;\n const origWarn = console.warn;\n const origError = console.error;\n\n const stdoutBuf: string[] = [];\n const stderrBuf: string[] = [];\n\n // Intercept process.stdout/stderr.write (Node.js path)\n process.stdout.write = function (str: unknown, encoding?: unknown, cb?: unknown): boolean {\n stdoutBuf.push(String(str));\n if (typeof encoding === \"function\") {\n (encoding as () => void)();\n } else if (typeof cb === \"function\") {\n (cb as () => void)();\n }\n return true;\n } as typeof process.stdout.write;\n\n process.stderr.write = function (str: unknown, encoding?: unknown, cb?: unknown): boolean {\n stderrBuf.push(String(str));\n if (typeof encoding === \"function\") {\n (encoding as () => void)();\n } else if (typeof cb === \"function\") {\n (cb as () => void)();\n }\n return true;\n } as typeof process.stderr.write;\n\n // Intercept console methods (bun path — console.log bypasses process.stdout.write)\n console.log = (...logArgs: unknown[]) => {\n stdoutBuf.push(logArgs.map(String).join(\" \") + \"\\n\");\n };\n console.warn = (...warnArgs: unknown[]) => {\n stderrBuf.push(warnArgs.map(String).join(\" \") + \"\\n\");\n };\n console.error = (...errArgs: unknown[]) => {\n stderrBuf.push(errArgs.map(String).join(\" \") + \"\\n\");\n };\n\n let error: (Error & Partial<Errors.CLIError>) | undefined;\n try {\n await run(args, { root: CLI_ROOT });\n } catch (e) {\n if (e instanceof Error) {\n error = Object.assign(e, { message: ansis.strip(e.message) }) as Error &\n Partial<Errors.CLIError>;\n }\n } finally {\n process.stdout.write = origStdoutWrite;\n process.stderr.write = origStderrWrite;\n console.log = origLog;\n console.warn = origWarn;\n console.error = origError;\n }\n\n return {\n stdout: stdoutBuf.map((s) => ansis.strip(s)).join(\"\"),\n stderr: stderrBuf.map((s) => ansis.strip(s)).join(\"\"),\n error,\n };\n}\nimport type {\n AgentConfig,\n AgentDefinition,\n AgentName,\n CategoryDefinition,\n CategoryPath,\n CompileAgentConfig,\n CompileConfig,\n CompileContext,\n Domain,\n DomainSelections,\n ExtractedSkillMetadata,\n MergedSkillsMatrix,\n ResolvedSkill,\n ResolvedStack,\n Skill,\n SkillAssignment,\n SkillDefinition,\n SkillDisplayName,\n SkillId,\n SkillSource,\n SkillSourceType,\n RelationshipDefinitions,\n Stack,\n StackAgentConfig,\n Subcategory,\n} from \"../../types\";\nimport type { CompiledStackPlugin } from \"../stacks/stack-plugin-compiler\";\nimport type { WizardResultV2 } from \"../../components/wizard/wizard\";\nimport type { SourceLoadResult } from \"../loading/source-loader\";\nimport type { ResolvedConfig } from \"../configuration/config\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { resolveAlias, validateSelection } from \"../matrix\";\nimport type { TestProjectConfig } from \"./fixtures/create-test-source\";\nimport { getTestSkill, TEST_SKILLS, TEST_CATEGORIES } from \"./test-fixtures\";\n\nexport { fileExists, directoryExists } from \"./test-fs-utils\";\n\nexport async function readTestYaml<T>(filePath: string): Promise<T> {\n const content = await readFile(filePath, \"utf-8\");\n // Boundary cast: YAML parse returns `unknown`, caller provides expected type\n return parseYaml(content) as T;\n}\n\nexport function buildWizardResult(\n selectedSkills: SkillId[],\n overrides?: Partial<WizardResultV2>,\n): WizardResultV2 {\n return {\n selectedSkills,\n selectedAgents: [],\n selectedStackId: null,\n domainSelections: {} as DomainSelections,\n selectedDomains: [],\n sourceSelections: {},\n expertMode: false,\n installMode: \"local\",\n cancelled: false,\n validation: { valid: true, errors: [], warnings: [] },\n ...overrides,\n };\n}\n\nexport function buildSourceResult(\n matrix: MergedSkillsMatrix,\n sourcePath: string,\n overrides?: Partial<SourceLoadResult>,\n): SourceLoadResult {\n const sourceConfig: ResolvedConfig = {\n source: sourcePath,\n sourceOrigin: \"flag\",\n };\n return {\n matrix,\n sourceConfig,\n sourcePath,\n isLocal: true,\n ...overrides,\n };\n}\n\n/**\n * Lightweight frontmatter parser for test assertions.\n * Returns raw key-value pairs (unlike the production parseFrontmatter which\n * returns typed SkillFrontmatter with Zod validation).\n */\nexport function parseTestFrontmatter(content: string): Record<string, unknown> | null {\n if (!content.startsWith(\"---\")) {\n return null;\n }\n\n const endIndex = content.indexOf(\"---\", 3);\n if (endIndex === -1) {\n return null;\n }\n\n const yamlContent = content.slice(3, endIndex).trim();\n try {\n // Boundary cast: YAML parse returns `unknown`\n return parseYaml(yamlContent) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nimport { createTempDir, cleanupTempDir } from \"./test-fs-utils\";\nexport { createTempDir, cleanupTempDir };\n\nexport interface TestDirs {\n tempDir: string;\n projectDir: string;\n pluginDir: string;\n skillsDir: string;\n agentsDir: string;\n}\n\nexport async function createTestDirs(prefix = \"ai-test-\"): Promise<TestDirs> {\n const tempDir = await createTempDir(prefix);\n const projectDir = path.join(tempDir, \"project\");\n const pluginDir = path.join(projectDir, \".claude\", \"plugins\", DEFAULT_PLUGIN_NAME);\n const skillsDir = path.join(pluginDir, \"skills\");\n const agentsDir = path.join(pluginDir, \"agents\");\n\n await mkdir(skillsDir, { recursive: true });\n await mkdir(agentsDir, { recursive: true });\n\n return { tempDir, projectDir, pluginDir, skillsDir, agentsDir };\n}\n\nexport async function cleanupTestDirs(dirs: TestDirs): Promise<void> {\n await cleanupTempDir(dirs.tempDir);\n}\n\nexport function createMockSkill(\n id: SkillId,\n category: CategoryPath,\n overrides?: Partial<ResolvedSkill>,\n): ResolvedSkill {\n return {\n id,\n description: `${id} skill`,\n category,\n tags: [],\n author: \"@test\",\n conflictsWith: [],\n recommends: [],\n requires: [],\n alternatives: [],\n discourages: [],\n compatibleWith: [],\n requiresSetup: [],\n providesSetupFor: [],\n path: `skills/${category}/${id}/`,\n ...overrides,\n };\n}\n\nexport function createMockSkillSource(\n type: SkillSourceType,\n overrides?: Partial<SkillSource>,\n): SkillSource {\n const defaults: Record<SkillSourceType, SkillSource> = {\n public: { name: \"public\", type: \"public\", installed: false },\n private: {\n name: \"private-source\",\n type: \"private\",\n url: \"github:org/skills\",\n installed: false,\n },\n local: { name: \"local\", type: \"local\", installed: true, installMode: \"local\" },\n };\n return { ...defaults[type], ...overrides };\n}\n\n/**\n * Creates a mock ExtractedSkillMetadata for testing.\n * Used when mocking extractAllSkills() return values.\n */\nexport function createMockExtractedSkill(\n id: SkillId,\n overrides?: Partial<ExtractedSkillMetadata>,\n): ExtractedSkillMetadata {\n // Derive directory path and category from the skill ID convention: \"domain-subcategory-name\"\n const segments = id.split(\"-\");\n const domain = segments[0] ?? \"web\";\n const subcategory = segments[1] ?? \"framework\";\n const name = segments.slice(2).join(\"-\") || \"skill\";\n const directoryPath = `${domain}/${subcategory}/${name}`;\n\n return {\n id,\n directoryPath,\n description: `${id} skill`,\n category: `${domain}-${subcategory}` as CategoryPath,\n author: \"@test\",\n tags: [],\n path: `skills/${directoryPath}/`,\n ...overrides,\n };\n}\n\nexport function createMockMatrix(\n skills: Record<string, ResolvedSkill>,\n overrides?: Partial<MergedSkillsMatrix>,\n): MergedSkillsMatrix {\n // Auto-generate displayNames and displayNameToId from skills\n const autoDisplayNames = {} as Record<SkillId, SkillDisplayName>;\n const autoDisplayNameToId = {} as Record<SkillDisplayName, SkillId>;\n for (const [id, skill] of typedEntries(skills)) {\n if (skill.displayName) {\n autoDisplayNames[id as SkillId] = skill.displayName;\n autoDisplayNameToId[skill.displayName] = id as SkillId;\n }\n }\n\n return {\n version: \"1.0.0\",\n categories: {} as Record<Subcategory, import(\"../../types\").CategoryDefinition>,\n skills,\n suggestedStacks: [],\n displayNameToId: autoDisplayNameToId,\n displayNames: autoDisplayNames,\n generatedAt: new Date().toISOString(),\n ...overrides,\n };\n}\n\nexport function createMockAgent(\n name: string,\n overrides?: Partial<AgentDefinition>,\n): AgentDefinition {\n return {\n title: name,\n description: `${name} agent`,\n tools: [\"Read\", \"Write\", \"Edit\", \"Grep\", \"Glob\", \"Bash\"],\n model: \"opus\",\n permissionMode: \"default\",\n ...overrides,\n };\n}\n\nexport function createMockAgentConfig(\n name: string,\n skills: Skill[] = [],\n overrides?: Partial<AgentConfig>,\n): AgentConfig {\n return {\n name,\n title: `${name} agent`,\n description: `Test ${name}`,\n tools: [\"Read\", \"Write\"],\n skills,\n path: name,\n ...overrides,\n };\n}\n\nexport function createMockSkillEntry(\n id: SkillId,\n preloaded = false,\n overrides?: Partial<Skill>,\n): Skill {\n return {\n id,\n path: `skills/${id}/`,\n description: `${id} skill`,\n usage: `when working with ${id}`,\n preloaded,\n ...overrides,\n };\n}\n\nexport function createCompileContext(overrides?: Partial<CompileContext>): CompileContext {\n return {\n stackId: \"test-stack\",\n verbose: false,\n projectRoot: \"/project\",\n outputDir: `/project/.claude/plugins/${DEFAULT_PLUGIN_NAME}`,\n ...overrides,\n };\n}\n\nexport function createSkillContent(name: string, description = \"A test skill\"): string {\n return `---\nname: ${name}\ndescription: ${description}\ncategory: test\n---\n\n# ${name}\n\nThis is a test skill.\n`;\n}\n\nfunction createMetadataContent(author = \"@test\"): string {\n return `author: \"${author}\"\n`;\n}\n\nexport function createAgentYamlContent(name: string, description = `Test ${name} agent`): string {\n return `id: ${name}\ntitle: ${name} Agent\ndescription: ${description}\ntools:\n - Read\n - Write`;\n}\n\nexport async function writeTestSkill(\n skillsDir: string,\n skillName: string,\n options?: {\n author?: string;\n description?: string;\n /** Extra fields to merge into metadata.yaml (e.g., forkedFrom, displayName) */\n extraMetadata?: Record<string, unknown>;\n /** Skip metadata.yaml creation entirely */\n skipMetadata?: boolean;\n /** Custom SKILL.md content (overrides default generated content) */\n skillContent?: string;\n },\n): Promise<string> {\n const skillDir = path.join(skillsDir, skillName);\n await mkdir(skillDir, { recursive: true });\n\n await writeFile(\n path.join(skillDir, STANDARD_FILES.SKILL_MD),\n options?.skillContent ?? createSkillContent(skillName, options?.description),\n );\n\n if (!options?.skipMetadata) {\n const contentHash = await computeSkillFolderHash(skillDir);\n if (options?.extraMetadata) {\n const metadata = {\n author: options?.author ?? \"@test\",\n contentHash,\n ...options?.extraMetadata,\n };\n await writeFile(path.join(skillDir, STANDARD_FILES.METADATA_YAML), stringifyYaml(metadata));\n } else {\n const metadata = {\n author: options?.author ?? \"@test\",\n contentHash,\n };\n await writeFile(path.join(skillDir, STANDARD_FILES.METADATA_YAML), stringifyYaml(metadata));\n }\n }\n\n return skillDir;\n}\n\n/**\n * Creates a source-level skill directory with SKILL.md and rich metadata.yaml.\n * Use this when testing `extractAllSkills()` and `mergeMatrixWithSkills()`.\n *\n * Unlike `writeTestSkill()` which creates installed skills, this writes skills\n * in the source directory layout (under `src/skills/<domain>/<subcategory>/<name>/`).\n */\nexport async function writeSourceSkill(\n skillsDir: string,\n directoryPath: string,\n config: {\n id: string;\n description: string;\n category: string;\n author?: string;\n tags?: string[];\n content?: string;\n },\n): Promise<string> {\n const skillDir = path.join(skillsDir, directoryPath);\n await mkdir(skillDir, { recursive: true });\n\n await writeFile(\n path.join(skillDir, STANDARD_FILES.SKILL_MD),\n createSkillContent(config.id, config.description),\n );\n\n const metadata: Record<string, unknown> = {\n displayName: config.id,\n category: config.category,\n author: config.author ?? \"@test\",\n };\n if (config.tags) {\n metadata.tags = config.tags;\n }\n\n await writeFile(path.join(skillDir, STANDARD_FILES.METADATA_YAML), stringifyYaml(metadata));\n\n return skillDir;\n}\n\nexport async function writeTestAgent(\n agentsDir: string,\n agentName: string,\n options?: { description?: string },\n): Promise<string> {\n const agentDir = path.join(agentsDir, agentName);\n await mkdir(agentDir, { recursive: true });\n\n await writeFile(\n path.join(agentDir, STANDARD_FILES.AGENT_YAML),\n createAgentYamlContent(agentName, options?.description),\n );\n\n return agentDir;\n}\n\nexport function createMockCategory(\n id: Subcategory,\n displayName: string,\n overrides?: Partial<CategoryDefinition>,\n): CategoryDefinition {\n return {\n id,\n displayName,\n description: `${displayName} category`,\n domain: \"web\",\n exclusive: true,\n required: false,\n order: 0,\n ...overrides,\n };\n}\n\nexport function createMockResolvedStack(\n id: string,\n name: string,\n overrides?: Partial<ResolvedStack>,\n): ResolvedStack {\n return {\n id,\n name,\n description: `${name} stack`,\n skills: {},\n allSkillIds: [],\n philosophy: \"\",\n ...overrides,\n };\n}\n\n/**\n * Builds a comprehensive test matrix with 13 skills across 7 categories,\n * 2 suggested stacks, display name mappings, and relationship data\n * (conflicts, recommends). Includes all 6 DEFAULT_PRESELECTED_SKILLS\n * (methodology) so wizard handleComplete can resolve them.\n * @returns A fully populated MergedSkillsMatrix with realistic test data\n */\nexport function createComprehensiveMatrix(\n overrides?: Partial<MergedSkillsMatrix>,\n): MergedSkillsMatrix {\n // Skill categories use domain-prefixed Subcategory IDs (matching production\n // metadata.yaml and the categories map keys, e.g., \"web-framework\", \"api-api\").\n const skills = {\n \"web-framework-react\": getTestSkill(\"react\", { category: \"web-framework\" }),\n \"web-framework-vue\": getTestSkill(\"vue\", {\n category: \"web-framework\",\n conflictsWith: [{ skillId: \"web-framework-react\", reason: \"Choose one framework\" }],\n }),\n \"web-state-zustand\": getTestSkill(\"zustand\", {\n category: \"web-client-state\",\n recommends: [{ skillId: \"web-framework-react\", reason: \"Works great with React\" }],\n }),\n \"web-styling-scss-modules\": getTestSkill(\"scss-modules\", { category: \"web-styling\" }),\n \"api-framework-hono\": getTestSkill(\"hono\", { category: \"api-api\" }),\n \"api-database-drizzle\": getTestSkill(\"drizzle\", { category: \"api-database\" }),\n \"web-testing-vitest\": getTestSkill(\"vitest\", { category: \"web-testing\" }),\n // Methodology skills (DEFAULT_PRESELECTED_SKILLS) — auto-injected by wizard\n \"meta-methodology-investigation-requirements\": TEST_SKILLS.investigationRequirements,\n \"meta-methodology-anti-over-engineering\": TEST_SKILLS.antiOverEngineering,\n \"meta-methodology-success-criteria\": TEST_SKILLS.successCriteria,\n \"meta-methodology-write-verification\": TEST_SKILLS.writeVerification,\n \"meta-methodology-improvement-protocol\": TEST_SKILLS.improvementProtocol,\n \"meta-methodology-context-management\": TEST_SKILLS.contextManagement,\n };\n\n const categories = {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n domain: \"web\" as Domain,\n exclusive: true,\n required: true,\n },\n \"web-client-state\": { ...TEST_CATEGORIES.clientState, domain: \"web\" as Domain, order: 1 },\n \"web-styling\": { ...TEST_CATEGORIES.styling, domain: \"web\" as Domain, order: 2 },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\" as Domain, exclusive: true, required: true },\n \"api-database\": { ...TEST_CATEGORIES.database, domain: \"api\" as Domain, order: 1 },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n domain: \"shared\" as Domain,\n exclusive: false,\n order: 10,\n },\n \"shared-methodology\": {\n ...TEST_CATEGORIES.methodology,\n domain: \"shared\" as Domain,\n exclusive: false,\n required: false,\n order: 11,\n },\n } as Record<Subcategory, CategoryDefinition>;\n\n const suggestedStacks: ResolvedStack[] = [\n createMockResolvedStack(\"nextjs-fullstack\", \"Next.js Fullstack\", {\n description: \"Complete Next.js stack with React and Hono\",\n skills: {\n \"web-developer\": {\n \"web-framework\": [\"web-framework-react\"],\n \"web-client-state\": [\"web-state-zustand\"],\n \"web-styling\": [\"web-styling-scss-modules\"],\n },\n \"api-developer\": {\n \"api-api\": [\"api-framework-hono\"],\n \"api-database\": [\"api-database-drizzle\"],\n },\n } as ResolvedStack[\"skills\"],\n allSkillIds: [\n \"web-framework-react\",\n \"web-state-zustand\",\n \"web-styling-scss-modules\",\n \"api-framework-hono\",\n \"api-database-drizzle\",\n ],\n philosophy: \"Modern, type-safe fullstack development\",\n }),\n createMockResolvedStack(\"vue-stack\", \"Vue Stack\", {\n description: \"Vue.js frontend stack\",\n skills: {\n \"web-developer\": {\n \"web-framework\": [\"web-framework-vue\"],\n },\n } as ResolvedStack[\"skills\"],\n allSkillIds: [\"web-framework-vue\"],\n philosophy: \"Progressive framework approach\",\n }),\n ];\n\n const displayNameToId = {\n react: \"web-framework-react\",\n vue: \"web-framework-vue\",\n zustand: \"web-state-zustand\",\n \"scss-modules\": \"web-styling-scss-modules\",\n hono: \"api-framework-hono\",\n drizzle: \"api-database-drizzle\",\n vitest: \"web-testing-vitest\",\n \"investigation-requirements\": \"meta-methodology-investigation-requirements\",\n \"anti-over-engineering\": \"meta-methodology-anti-over-engineering\",\n \"success-criteria\": \"meta-methodology-success-criteria\",\n \"write-verification\": \"meta-methodology-write-verification\",\n \"improvement-protocol\": \"meta-methodology-improvement-protocol\",\n \"context-management\": \"meta-methodology-context-management\",\n // Double cast needed: object literal's string keys are not assignable to branded\n // SkillDisplayName/SkillId types without going through `unknown` first (boundary cast)\n } as unknown as Record<SkillDisplayName, SkillId>;\n\n const displayNames = {} as Record<SkillId, SkillDisplayName>;\n for (const [displayName, fullId] of typedEntries(displayNameToId)) {\n (displayNames as Record<string, string>)[fullId] = displayName;\n }\n\n return createMockMatrix(skills, {\n categories,\n suggestedStacks,\n displayNameToId,\n displayNames,\n ...overrides,\n });\n}\n\n/**\n * Builds a lightweight test matrix with 4 skills, 4 categories, and 2 stacks.\n * Use instead of createComprehensiveMatrix when relationship data is not needed.\n * @returns A minimal MergedSkillsMatrix for basic integration tests\n */\nexport function createBasicMatrix(overrides?: Partial<MergedSkillsMatrix>): MergedSkillsMatrix {\n // Domain-prefixed Subcategory IDs — see createComprehensiveMatrix comment\n const skills = {\n \"web-framework-react\": getTestSkill(\"react\", { category: \"web-framework\" }),\n \"web-state-zustand\": getTestSkill(\"zustand\", { category: \"web-client-state\" }),\n \"api-framework-hono\": getTestSkill(\"hono\", { category: \"api-api\" }),\n \"web-testing-vitest\": getTestSkill(\"vitest\", { category: \"web-testing\" }),\n };\n\n const suggestedStacks: ResolvedStack[] = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"testing-stack\", \"Testing Stack\", {\n allSkillIds: [\"web-testing-vitest\"],\n }),\n ];\n\n return createMockMatrix(skills, {\n suggestedStacks,\n categories: {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n domain: \"web\" as Domain,\n exclusive: true,\n required: true,\n },\n \"web-client-state\": { ...TEST_CATEGORIES.clientState, domain: \"web\" as Domain, order: 1 },\n \"api-api\": {\n ...TEST_CATEGORIES.api,\n domain: \"api\" as Domain,\n exclusive: true,\n required: true,\n },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n displayName: \"Testing Framework\",\n domain: \"shared\" as Domain,\n exclusive: false,\n },\n } as Record<Subcategory, CategoryDefinition>,\n ...overrides,\n });\n}\n\n/**\n * Replicates `handleComplete` from wizard.tsx for the \"customize\" path.\n *\n * Given the wizard store state (after simulated user selections), this\n * builds the same WizardResultV2 that the real wizard produces:\n * 1. Collects all selected technologies from domainSelections\n * 2. Resolves aliases to canonical skill IDs\n * 3. Adds methodology skills (DEFAULT_PRESELECTED_SKILLS)\n * 4. Runs validation\n */\nexport function buildWizardResultFromStore(\n matrix: MergedSkillsMatrix,\n overrides?: Partial<WizardResultV2>,\n): WizardResultV2 {\n const store = useWizardStore.getState();\n\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = matrix.suggestedStacks.find((s) => s.id === store.selectedStackId);\n allSkills = [...(stack?.allSkillIds || [])];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => resolveAlias(tech, matrix));\n }\n\n const methodologySkills = store.getDefaultMethodologySkills();\n for (const skill of methodologySkills) {\n if (!allSkills.includes(skill)) {\n allSkills.push(skill);\n }\n }\n\n const validation = validateSelection(allSkills, matrix);\n\n return {\n selectedSkills: allSkills,\n selectedAgents: store.selectedAgents,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n selectedDomains: store.selectedDomains,\n sourceSelections: store.sourceSelections,\n expertMode: store.expertMode,\n installMode: store.installMode,\n cancelled: false,\n validation,\n ...overrides,\n };\n}\n\n/**\n * Simulates a user selecting specific skills via the wizard store.\n *\n * Sets up domainSelections as if the user toggled each skill in the build step,\n * using the matrix to look up the correct domain and subcategory per skill.\n */\nexport function simulateSkillSelections(\n skillIds: SkillId[],\n matrix: MergedSkillsMatrix,\n selectedDomains: string[],\n): void {\n const domainSelections: DomainSelections = {};\n\n for (const skillId of skillIds) {\n const skill = matrix.skills[skillId];\n if (!skill) continue;\n\n // Boundary cast: skill.category is a Subcategory at runtime\n const subcategory = skill.category as Subcategory;\n const categoryDef = matrix.categories[subcategory];\n const domain = categoryDef?.domain;\n if (!domain) continue;\n\n if (!domainSelections[domain]) {\n domainSelections[domain] = {};\n }\n if (!domainSelections[domain][subcategory]) {\n domainSelections[domain][subcategory] = [];\n }\n if (!domainSelections[domain][subcategory].includes(skillId)) {\n domainSelections[domain][subcategory].push(skillId);\n }\n }\n\n useWizardStore.setState({\n domainSelections,\n selectedDomains: selectedDomains as Domain[],\n approach: \"scratch\",\n step: \"confirm\",\n });\n}\n\n/**\n * Extracts skill IDs from a stack assignment value, which may be:\n * - A bare string (e.g., \"web-framework-react\")\n * - An object with .id (e.g., { id: \"web-framework-react\", preloaded: true })\n * - An array of strings or objects\n */\nexport function extractSkillIdsFromAssignment(assignment: unknown): string[] {\n if (typeof assignment === \"string\") {\n return [assignment];\n }\n if (Array.isArray(assignment)) {\n return assignment.flatMap((item) => extractSkillIdsFromAssignment(item));\n }\n if (typeof assignment === \"object\" && assignment !== null && \"id\" in assignment) {\n return [String((assignment as { id: string }).id)];\n }\n return [];\n}\n\nexport function buildTestProjectConfig(\n agents: string[],\n skills: Array<string | { id: string }>,\n overrides?: Partial<TestProjectConfig>,\n): TestProjectConfig {\n return {\n name: \"test-project\",\n description: \"Test project\",\n agents,\n skills,\n ...overrides,\n };\n}\n\nexport function createMockSkillDefinition(\n id: SkillId,\n overrides?: Partial<SkillDefinition>,\n): SkillDefinition {\n return {\n id,\n path: `skills/${id}/`,\n description: `${id} skill`,\n ...overrides,\n };\n}\n\n/** Decomposed matrix config returned by createMockMatrixConfig (replaces SkillsMatrixConfig) */\nexport type MockMatrixConfig = {\n categories: Record<string, CategoryDefinition>;\n relationships: RelationshipDefinitions;\n aliases: Partial<Record<SkillDisplayName, SkillId>>;\n};\n\nexport function createMockMatrixConfig(\n categories: Record<string, CategoryDefinition>,\n overrides?: {\n relationships?: RelationshipDefinitions;\n skillAliases?: Partial<Record<SkillDisplayName, SkillId>>;\n },\n): MockMatrixConfig {\n return {\n categories,\n relationships: overrides?.relationships ?? {\n conflicts: [],\n discourages: [],\n recommends: [],\n requires: [],\n alternatives: [],\n },\n aliases: overrides?.skillAliases ?? {},\n };\n}\n\nexport function createMockStack(\n id: string,\n config: {\n name: string;\n description?: string;\n agents: Record<string, StackAgentConfig>;\n philosophy?: string;\n },\n): Stack {\n return {\n id,\n name: config.name,\n description: config.description ?? \"\",\n // Boundary cast: test callers may pass arbitrary agent names (e.g., \"nonexistent-agent\")\n agents: config.agents as Stack[\"agents\"],\n philosophy: config.philosophy,\n };\n}\n\nexport function createMockCompileConfig(\n agents: Record<string, CompileAgentConfig>,\n overrides?: Partial<CompileConfig>,\n): CompileConfig {\n return {\n name: \"Test Plugin\",\n description: \"Test description\",\n agents,\n ...overrides,\n };\n}\n\nexport function createMockCompiledStackPlugin(\n overrides?: Partial<CompiledStackPlugin>,\n): CompiledStackPlugin {\n return {\n pluginPath: \"/tmp/cc-stack-123456/test-stack\",\n manifest: { name: \"test-stack\", version: \"1.0.0\" },\n stackName: \"Test Stack\",\n agents: [\"web-developer\"] as AgentName[],\n skillPlugins: [\"web-framework-react\"] as SkillId[],\n hasHooks: false,\n ...overrides,\n };\n}\n\nexport function createMockSkillAssignment(id: SkillId, preloaded = false): SkillAssignment {\n return { id, preloaded };\n}\n\nexport { getTestSkill, TEST_SKILLS, TEST_CATEGORIES, TEST_MATRICES } from \"./test-fixtures\";\nexport type { TestSkillName } from \"./test-fixtures\";\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  getErrorMessage,
4
4
  warn
5
- } from "./chunk-5QRJUBK7.js";
5
+ } from "./chunk-YMUWTPOM.js";
6
6
  import {
7
7
  init_esm_shims
8
8
  } from "./chunk-DHET7RCE.js";
@@ -180,4 +180,4 @@ export {
180
180
  claudePluginMarketplaceAdd,
181
181
  claudePluginUninstall
182
182
  };
183
- //# sourceMappingURL=chunk-QBUOZVNZ.js.map
183
+ //# sourceMappingURL=chunk-YDASDMTH.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  KEBAB_CASE_PATTERN
4
- } from "./chunk-74HSA7C4.js";
4
+ } from "./chunk-LESHL6SM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -247,11 +247,13 @@ var skillDisplayNameSchema = z.enum([
247
247
  "view-transitions",
248
248
  "storybook",
249
249
  "error-boundaries",
250
+ "result-types",
250
251
  "accessibility",
251
252
  "websockets",
252
253
  "sse",
253
254
  "socket-io",
254
255
  "service-workers",
256
+ "offline-first",
255
257
  "file-upload",
256
258
  "image-handling",
257
259
  "date-fns",
@@ -372,12 +374,12 @@ var skillFrontmatterLoaderSchema = z.object({
372
374
  var skillMetadataLoaderSchema = z.object({
373
375
  // Field accepts any string; cross-field validation in superRefine enforces strict/custom rules
374
376
  category: z.string().optional(),
375
- categoryExclusive: z.boolean().optional(),
376
377
  author: z.string().optional(),
377
378
  tags: z.array(z.string()).optional(),
378
- requires: z.array(skillIdSchema).optional(),
379
- compatibleWith: z.array(skillIdSchema).optional(),
380
- conflictsWith: z.array(skillIdSchema).optional(),
379
+ requires: z.array(extensibleSkillIdSchema).optional(),
380
+ compatibleWith: z.array(extensibleSkillIdSchema).optional(),
381
+ conflictsWith: z.array(extensibleSkillIdSchema).optional(),
382
+ domain: extensibleDomainSchema.optional(),
381
383
  custom: z.boolean().optional()
382
384
  }).passthrough().superRefine(validateCategoryField);
383
385
  var pluginAuthorSchema = z.object({
@@ -416,9 +418,10 @@ var agentYamlConfigSchema = z.object({
416
418
  permissionMode: permissionModeSchema.optional(),
417
419
  hooks: hooksRecordSchema.optional(),
418
420
  outputFormat: z.string().optional(),
421
+ domain: extensibleDomainSchema.optional(),
419
422
  custom: z.boolean().optional()
420
423
  });
421
- var skillAssignmentElementSchema = z.union([skillIdSchema, skillAssignmentSchema]);
424
+ var skillAssignmentElementSchema = z.union([extensibleSkillIdSchema, skillAssignmentSchema]);
422
425
  var stackSubcategoryValues = new Set(SUBCATEGORY_VALUES);
423
426
  var stackAgentConfigSchema = z.record(
424
427
  z.string(),
@@ -529,7 +532,7 @@ var relationshipDefinitionsSchema = z.object({
529
532
  alternatives: z.array(alternativeGroupSchema)
530
533
  });
531
534
  var builtinSubcategoryValues = new Set(SUBCATEGORY_VALUES);
532
- var skillsMatrixConfigSchema = z.object({
535
+ var skillCategoriesFileSchema = z.object({
533
536
  version: z.string(),
534
537
  categories: z.record(z.string(), categoryDefinitionSchema).superRefine(
535
538
  validateExtensibleRecordKeys(
@@ -537,33 +540,34 @@ var skillsMatrixConfigSchema = z.object({
537
540
  customExtensions.categories,
538
541
  "category key"
539
542
  )
540
- ),
543
+ )
544
+ });
545
+ var perSkillRulesSchema = z.object({
546
+ compatibleWith: z.array(extensibleSkillIdSchema).optional(),
547
+ conflictsWith: z.array(extensibleSkillIdSchema).optional(),
548
+ requires: z.array(extensibleSkillIdSchema).optional(),
549
+ requiresSetup: z.array(extensibleSkillIdSchema).optional(),
550
+ providesSetupFor: z.array(extensibleSkillIdSchema).optional()
551
+ });
552
+ var skillRulesFileSchema = z.object({
553
+ version: z.string(),
554
+ aliases: z.record(z.string(), extensibleSkillIdSchema).optional(),
541
555
  relationships: relationshipDefinitionsSchema.optional(),
542
- skillAliases: z.record(z.string(), extensibleSkillIdSchema).optional()
556
+ "per-skill": z.record(z.string(), perSkillRulesSchema).optional()
543
557
  });
544
558
  var localRawMetadataSchema = z.object({
545
559
  /** Short name shown in the wizard grid (e.g., "my-custom-react") */
546
- cliName: z.string().optional(),
560
+ displayName: z.string().optional(),
547
561
  /** One-line description for the wizard */
548
562
  cliDescription: z.string().optional(),
549
563
  /** Subcategory to place this skill in (e.g., "web-framework") */
550
564
  // Field accepts any string; cross-field validation in superRefine enforces strict/custom rules
551
565
  category: z.string().optional(),
552
- /** If true, only one skill from this category can be selected */
553
- categoryExclusive: z.boolean().optional(),
554
566
  /** When an AI agent should invoke this skill */
555
567
  usageGuidance: z.string().optional(),
556
568
  tags: z.array(z.string()).optional(),
557
- /** Framework skills this is compatible with (for Build step filtering) */
558
- compatibleWith: z.array(skillIdSchema).optional(),
559
- /** Skills that cannot coexist with this one */
560
- conflictsWith: z.array(skillIdSchema).optional(),
561
- /** Skills that must be selected before this one */
562
- requires: z.array(skillIdSchema).optional(),
563
- /** Setup skills that must be installed first (e.g., env setup) */
564
- requiresSetup: z.array(skillIdSchema).optional(),
565
- /** Usage skills this setup skill configures (inverse relationship) */
566
- providesSetupFor: z.array(skillIdSchema).optional(),
569
+ /** Explicit domain assignment (overrides inference from category prefix) */
570
+ domain: extensibleDomainSchema.optional(),
567
571
  /** True if this skill was created outside the CLI's built-in vocabulary */
568
572
  custom: z.boolean().optional()
569
573
  }).passthrough().superRefine(validateCategoryField);
@@ -683,8 +687,10 @@ var projectSourceConfigSchema = z.object({
683
687
  agentsDir: z.string().optional(),
684
688
  /** Custom stacks file path override (default: "config/stacks.yaml") */
685
689
  stacksFile: z.string().optional(),
686
- /** Custom matrix file path override (default: "config/skills-matrix.yaml") */
687
- matrixFile: z.string().optional()
690
+ /** Custom categories file path override (default: "config/skill-categories.yaml") */
691
+ categoriesFile: z.string().optional(),
692
+ /** Custom rules file path override (default: "config/skill-rules.yaml") */
693
+ rulesFile: z.string().optional()
688
694
  }).passthrough();
689
695
  var projectSourceConfigValidationSchema = z.object({
690
696
  source: z.string().optional(),
@@ -704,7 +710,8 @@ var projectSourceConfigValidationSchema = z.object({
704
710
  skillsDir: z.string().optional(),
705
711
  agentsDir: z.string().optional(),
706
712
  stacksFile: z.string().optional(),
707
- matrixFile: z.string().optional()
713
+ categoriesFile: z.string().optional(),
714
+ rulesFile: z.string().optional()
708
715
  });
709
716
  var agentYamlGenerationSchema = z.object({
710
717
  $schema: z.string().optional(),
@@ -717,6 +724,7 @@ var agentYamlGenerationSchema = z.object({
717
724
  permissionMode: permissionModeSchema.optional(),
718
725
  hooks: strictHooksRecordSchema.optional(),
719
726
  outputFormat: z.string().optional(),
727
+ domain: extensibleDomainSchema.optional(),
720
728
  custom: z.boolean().optional()
721
729
  }).strict();
722
730
  var agentFrontmatterValidationSchema = z.object({
@@ -753,11 +761,10 @@ var skillFrontmatterValidationSchema = z.object({
753
761
  var metadataValidationSchema = z.object({
754
762
  /** Domain-prefixed subcategory (e.g., "web-framework") */
755
763
  category: extensibleSubcategorySchema,
756
- categoryExclusive: z.boolean().optional(),
757
764
  /** Author handle — must start with @ (e.g., "@vince") */
758
765
  author: z.string().regex(/^@[a-z][a-z0-9-]*$/),
759
766
  /** Short display name for the wizard grid (max 30 chars) */
760
- cliName: z.string().min(1).max(30),
767
+ displayName: z.string().min(1).max(30),
761
768
  /** One-line description for the wizard (max 60 chars) */
762
769
  cliDescription: z.string().min(1).max(60),
763
770
  /** When an AI agent should invoke this skill (min 10 chars to ensure usefulness) */
@@ -786,6 +793,8 @@ var metadataValidationSchema = z.object({
786
793
  /** ISO date of the fork */
787
794
  date: z.string()
788
795
  }).optional(),
796
+ /** Explicit domain assignment (overrides inference from category prefix) */
797
+ domain: extensibleDomainSchema.optional(),
789
798
  /** True if this skill was created outside the CLI's built-in vocabulary */
790
799
  custom: z.boolean().optional()
791
800
  }).strict();
@@ -900,12 +909,14 @@ export {
900
909
  ensureDir,
901
910
  remove,
902
911
  copy,
912
+ DOMAIN_VALUES,
903
913
  SUBCATEGORY_VALUES,
904
914
  agentNameSchema,
905
915
  skillDisplayNameSchema,
906
916
  SKILL_ID_PATTERN,
907
917
  isValidSkillId,
908
918
  skillIdSchema,
919
+ extensibleDomainSchema,
909
920
  categoryPathSchema,
910
921
  hooksRecordSchema,
911
922
  skillFrontmatterLoaderSchema,
@@ -914,7 +925,8 @@ export {
914
925
  pluginManifestSchema,
915
926
  agentYamlConfigSchema,
916
927
  projectConfigLoaderSchema,
917
- skillsMatrixConfigSchema,
928
+ skillCategoriesFileSchema,
929
+ skillRulesFileSchema,
918
930
  localRawMetadataSchema,
919
931
  localSkillMetadataSchema,
920
932
  stacksConfigSchema,
@@ -932,4 +944,4 @@ export {
932
944
  warnUnknownFields,
933
945
  extendSchemasWithCustomValues
934
946
  };
935
- //# sourceMappingURL=chunk-5QRJUBK7.js.map
947
+ //# sourceMappingURL=chunk-YMUWTPOM.js.map