@agents-inc/cli 0.38.0 → 0.41.1

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 (182) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/config/skills-matrix.yaml +115 -123
  3. package/config/stacks.yaml +687 -687
  4. package/dist/{chunk-YHQNTBBN.js → chunk-2D6LKRHW.js} +2 -2
  5. package/dist/{chunk-CYFU3ARY.js → chunk-342YB6TQ.js} +15 -17
  6. package/dist/chunk-342YB6TQ.js.map +1 -0
  7. package/dist/{chunk-HRMQ2RGY.js → chunk-423MJ6DT.js} +31 -56
  8. package/dist/chunk-423MJ6DT.js.map +1 -0
  9. package/dist/{chunk-NFV4SKH5.js → chunk-4LT6RXMY.js} +4 -4
  10. package/dist/{chunk-IVIK776Y.js → chunk-4SYXPG7L.js} +2 -2
  11. package/dist/{chunk-DUQFF45G.js → chunk-4UTPJXUX.js} +8 -8
  12. package/dist/{chunk-3E2V5YL3.js → chunk-5TMB53BV.js} +3 -3
  13. package/dist/{chunk-NI2RSNWB.js → chunk-7FBM7V3E.js} +10 -22
  14. package/dist/chunk-7FBM7V3E.js.map +1 -0
  15. package/dist/chunk-ACVJVYMC.js +111 -0
  16. package/dist/chunk-ACVJVYMC.js.map +1 -0
  17. package/dist/{chunk-FWQK3HWB.js → chunk-AH7XHAKN.js} +11 -11
  18. package/dist/chunk-AH7XHAKN.js.map +1 -0
  19. package/dist/{chunk-VAHVSQIG.js → chunk-AVVYFEMF.js} +2 -2
  20. package/dist/{chunk-EISBUEBL.js → chunk-BFISETQG.js} +3 -3
  21. package/dist/{chunk-ZBJQXDQN.js → chunk-BK7TANUV.js} +4 -2
  22. package/dist/chunk-BK7TANUV.js.map +1 -0
  23. package/dist/{chunk-VAK5PX72.js → chunk-DV4ALU5I.js} +6 -6
  24. package/dist/{chunk-OEX5JDQD.js → chunk-FHBICUXB.js} +4 -4
  25. package/dist/{chunk-TA6IIQI4.js → chunk-GEDWVX6Y.js} +3 -3
  26. package/dist/chunk-GEDWVX6Y.js.map +1 -0
  27. package/dist/{chunk-M6PGIZNS.js → chunk-H6H3COI5.js} +5 -5
  28. package/dist/{chunk-54ZZCWN4.js → chunk-KC2SIUIA.js} +3 -8
  29. package/dist/chunk-KC2SIUIA.js.map +1 -0
  30. package/dist/{chunk-2XX4TMCI.js → chunk-KXM7KOPE.js} +2 -2
  31. package/dist/{chunk-HKDE4LJW.js → chunk-LJRP4SWY.js} +6 -5
  32. package/dist/chunk-LJRP4SWY.js.map +1 -0
  33. package/dist/{chunk-TBDIR6LY.js → chunk-MNPPGIZQ.js} +5 -5
  34. package/dist/{chunk-3NQJOJZL.js → chunk-NYP5SB2V.js} +2 -2
  35. package/dist/{chunk-UOMMQ5M6.js → chunk-NZYKDVRL.js} +2 -2
  36. package/dist/{chunk-UV6JUGIY.js → chunk-PURJZ72D.js} +2 -2
  37. package/dist/{chunk-ATLRUR3B.js → chunk-R52N7DBG.js} +2 -2
  38. package/dist/{chunk-WSGGJKD5.js → chunk-SILUTTV7.js} +6 -6
  39. package/dist/chunk-SILUTTV7.js.map +1 -0
  40. package/dist/{chunk-IZRVFC2Z.js → chunk-TJAZ7QCF.js} +4 -4
  41. package/dist/{chunk-U5OB5ADP.js → chunk-TTXV55NQ.js} +57 -16
  42. package/dist/chunk-TTXV55NQ.js.map +1 -0
  43. package/dist/{chunk-TY5GELDB.js → chunk-UKTYDNWJ.js} +2 -2
  44. package/dist/{chunk-HRW7BIDE.js → chunk-WS6OQIEN.js} +2 -2
  45. package/dist/{chunk-YJIJTBSX.js → chunk-XJXJZ2MJ.js} +42 -54
  46. package/dist/chunk-XJXJZ2MJ.js.map +1 -0
  47. package/dist/chunk-YLJYAQSG.js +210 -0
  48. package/dist/chunk-YLJYAQSG.js.map +1 -0
  49. package/dist/{chunk-MZB3GGOH.js → chunk-YRVTXSXP.js} +1 -2
  50. package/dist/chunk-YRVTXSXP.js.map +1 -0
  51. package/dist/{chunk-TNFACSWF.js → chunk-ZLHGJSRK.js} +3 -3
  52. package/dist/cli/defaults/agent-mappings.yaml +14 -70
  53. package/dist/commands/build/marketplace.js +3 -3
  54. package/dist/commands/build/plugins.js +5 -5
  55. package/dist/commands/build/stack.js +5 -5
  56. package/dist/commands/compile.js +8 -7
  57. package/dist/commands/compile.js.map +1 -1
  58. package/dist/commands/config/get.js +4 -4
  59. package/dist/commands/config/index.js +5 -5
  60. package/dist/commands/config/path.js +4 -4
  61. package/dist/commands/config/set-project.js +4 -4
  62. package/dist/commands/config/show.js +5 -5
  63. package/dist/commands/config/unset-project.js +4 -4
  64. package/dist/commands/diff.js +8 -5
  65. package/dist/commands/diff.js.map +1 -1
  66. package/dist/commands/doctor.js +8 -7
  67. package/dist/commands/doctor.js.map +1 -1
  68. package/dist/commands/edit.js +33 -30
  69. package/dist/commands/edit.js.map +1 -1
  70. package/dist/commands/eject.js +4 -4
  71. package/dist/commands/import/skill.js +5 -5
  72. package/dist/commands/info.js +7 -6
  73. package/dist/commands/info.js.map +1 -1
  74. package/dist/commands/init.js +40 -32
  75. package/dist/commands/init.js.map +1 -1
  76. package/dist/commands/list.js +6 -5
  77. package/dist/commands/list.js.map +1 -1
  78. package/dist/commands/new/agent.js +5 -5
  79. package/dist/commands/new/skill.js +8 -5
  80. package/dist/commands/new/skill.js.map +1 -1
  81. package/dist/commands/outdated.js +8 -5
  82. package/dist/commands/outdated.js.map +1 -1
  83. package/dist/commands/search.js +7 -7
  84. package/dist/commands/uninstall.js +19 -7
  85. package/dist/commands/uninstall.js.map +1 -1
  86. package/dist/commands/update.js +8 -7
  87. package/dist/commands/update.js.map +1 -1
  88. package/dist/commands/validate.js +5 -5
  89. package/dist/commands/version/bump.js +4 -4
  90. package/dist/commands/version/index.js +4 -4
  91. package/dist/commands/version/set.js +4 -4
  92. package/dist/commands/version/show.js +4 -4
  93. package/dist/components/skill-search/skill-search.js +3 -3
  94. package/dist/components/wizard/category-grid.js +2 -2
  95. package/dist/components/wizard/category-grid.test.js +40 -40
  96. package/dist/components/wizard/category-grid.test.js.map +1 -1
  97. package/dist/components/wizard/checkbox-grid.js +2 -2
  98. package/dist/components/wizard/checkbox-grid.test.js +16 -6
  99. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  100. package/dist/components/wizard/domain-selection.js +7 -7
  101. package/dist/components/wizard/help-modal.js +2 -2
  102. package/dist/components/wizard/menu-item.js +2 -2
  103. package/dist/components/wizard/search-modal.js +2 -2
  104. package/dist/components/wizard/search-modal.test.js +2 -2
  105. package/dist/components/wizard/section-progress.js +2 -2
  106. package/dist/components/wizard/section-progress.test.js +2 -2
  107. package/dist/components/wizard/source-grid.js +3 -3
  108. package/dist/components/wizard/source-grid.test.js +3 -3
  109. package/dist/components/wizard/stack-selection.js +9 -9
  110. package/dist/components/wizard/step-agents.js +7 -7
  111. package/dist/components/wizard/step-agents.test.js +24 -19
  112. package/dist/components/wizard/step-agents.test.js.map +1 -1
  113. package/dist/components/wizard/step-build.js +8 -8
  114. package/dist/components/wizard/step-build.test.js +40 -39
  115. package/dist/components/wizard/step-build.test.js.map +1 -1
  116. package/dist/components/wizard/step-confirm.js +3 -3
  117. package/dist/components/wizard/step-confirm.test.js +19 -13
  118. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  119. package/dist/components/wizard/step-refine.js +2 -2
  120. package/dist/components/wizard/step-refine.test.js +2 -2
  121. package/dist/components/wizard/step-settings.js +5 -5
  122. package/dist/components/wizard/step-settings.test.js +8 -8
  123. package/dist/components/wizard/step-sources.js +9 -9
  124. package/dist/components/wizard/step-sources.test.js +13 -13
  125. package/dist/components/wizard/step-sources.test.js.map +1 -1
  126. package/dist/components/wizard/step-stack.js +12 -12
  127. package/dist/components/wizard/step-stack.test.js +19 -21
  128. package/dist/components/wizard/step-stack.test.js.map +1 -1
  129. package/dist/components/wizard/view-title.js +2 -2
  130. package/dist/components/wizard/wizard-layout.js +8 -8
  131. package/dist/components/wizard/wizard-tabs.js +2 -2
  132. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  133. package/dist/components/wizard/wizard.js +25 -25
  134. package/dist/config/skills-matrix.yaml +115 -123
  135. package/dist/config/stacks.yaml +687 -687
  136. package/dist/hooks/init.js +3 -3
  137. package/dist/{source-manager-FEGVYDFZ.js → source-manager-PPABS6BC.js} +4 -4
  138. package/dist/stores/wizard-store.js +5 -5
  139. package/dist/stores/wizard-store.test.js +115 -187
  140. package/dist/stores/wizard-store.test.js.map +1 -1
  141. package/package.json +1 -1
  142. package/src/schemas/metadata.schema.json +41 -1
  143. package/src/schemas/project-config.schema.json +34 -35
  144. package/src/schemas/skills-matrix.schema.json +100 -101
  145. package/src/schemas/stacks.schema.json +34 -35
  146. package/dist/chunk-54ZZCWN4.js.map +0 -1
  147. package/dist/chunk-CYFU3ARY.js.map +0 -1
  148. package/dist/chunk-EXFVAEPY.js +0 -80
  149. package/dist/chunk-EXFVAEPY.js.map +0 -1
  150. package/dist/chunk-FWQK3HWB.js.map +0 -1
  151. package/dist/chunk-HKDE4LJW.js.map +0 -1
  152. package/dist/chunk-HRMQ2RGY.js.map +0 -1
  153. package/dist/chunk-IWNPFIGY.js +0 -110
  154. package/dist/chunk-IWNPFIGY.js.map +0 -1
  155. package/dist/chunk-MZB3GGOH.js.map +0 -1
  156. package/dist/chunk-NI2RSNWB.js.map +0 -1
  157. package/dist/chunk-TA6IIQI4.js.map +0 -1
  158. package/dist/chunk-U5OB5ADP.js.map +0 -1
  159. package/dist/chunk-WSGGJKD5.js.map +0 -1
  160. package/dist/chunk-YJIJTBSX.js.map +0 -1
  161. package/dist/chunk-ZBJQXDQN.js.map +0 -1
  162. /package/dist/{chunk-YHQNTBBN.js.map → chunk-2D6LKRHW.js.map} +0 -0
  163. /package/dist/{chunk-NFV4SKH5.js.map → chunk-4LT6RXMY.js.map} +0 -0
  164. /package/dist/{chunk-IVIK776Y.js.map → chunk-4SYXPG7L.js.map} +0 -0
  165. /package/dist/{chunk-DUQFF45G.js.map → chunk-4UTPJXUX.js.map} +0 -0
  166. /package/dist/{chunk-3E2V5YL3.js.map → chunk-5TMB53BV.js.map} +0 -0
  167. /package/dist/{chunk-VAHVSQIG.js.map → chunk-AVVYFEMF.js.map} +0 -0
  168. /package/dist/{chunk-EISBUEBL.js.map → chunk-BFISETQG.js.map} +0 -0
  169. /package/dist/{chunk-VAK5PX72.js.map → chunk-DV4ALU5I.js.map} +0 -0
  170. /package/dist/{chunk-OEX5JDQD.js.map → chunk-FHBICUXB.js.map} +0 -0
  171. /package/dist/{chunk-M6PGIZNS.js.map → chunk-H6H3COI5.js.map} +0 -0
  172. /package/dist/{chunk-2XX4TMCI.js.map → chunk-KXM7KOPE.js.map} +0 -0
  173. /package/dist/{chunk-TBDIR6LY.js.map → chunk-MNPPGIZQ.js.map} +0 -0
  174. /package/dist/{chunk-3NQJOJZL.js.map → chunk-NYP5SB2V.js.map} +0 -0
  175. /package/dist/{chunk-UOMMQ5M6.js.map → chunk-NZYKDVRL.js.map} +0 -0
  176. /package/dist/{chunk-UV6JUGIY.js.map → chunk-PURJZ72D.js.map} +0 -0
  177. /package/dist/{chunk-ATLRUR3B.js.map → chunk-R52N7DBG.js.map} +0 -0
  178. /package/dist/{chunk-IZRVFC2Z.js.map → chunk-TJAZ7QCF.js.map} +0 -0
  179. /package/dist/{chunk-TY5GELDB.js.map → chunk-UKTYDNWJ.js.map} +0 -0
  180. /package/dist/{chunk-HRW7BIDE.js.map → chunk-WS6OQIEN.js.map} +0 -0
  181. /package/dist/{chunk-TNFACSWF.js.map → chunk-ZLHGJSRK.js.map} +0 -0
  182. /package/dist/{source-manager-FEGVYDFZ.js.map → source-manager-PPABS6BC.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getErrorMessage
4
- } from "./chunk-YJIJTBSX.js";
4
+ } from "./chunk-XJXJZ2MJ.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -53,4 +53,4 @@ export {
53
53
  EXIT_CODES,
54
54
  BaseCommand
55
55
  };
56
- //# sourceMappingURL=chunk-YHQNTBBN.js.map
56
+ //# sourceMappingURL=chunk-2D6LKRHW.js.map
@@ -1,44 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepStack
4
- } from "./chunk-NFV4SKH5.js";
4
+ } from "./chunk-4LT6RXMY.js";
5
5
  import {
6
6
  WizardLayout
7
- } from "./chunk-TBDIR6LY.js";
7
+ } from "./chunk-MNPPGIZQ.js";
8
8
  import {
9
9
  StepConfirm
10
- } from "./chunk-3E2V5YL3.js";
10
+ } from "./chunk-5TMB53BV.js";
11
11
  import {
12
12
  StepSettings
13
- } from "./chunk-M6PGIZNS.js";
13
+ } from "./chunk-H6H3COI5.js";
14
14
  import {
15
15
  StepSources
16
- } from "./chunk-DUQFF45G.js";
16
+ } from "./chunk-4UTPJXUX.js";
17
17
  import {
18
18
  StepAgents
19
- } from "./chunk-EXFVAEPY.js";
19
+ } from "./chunk-YLJYAQSG.js";
20
20
  import {
21
21
  StepBuild
22
- } from "./chunk-NI2RSNWB.js";
22
+ } from "./chunk-7FBM7V3E.js";
23
23
  import {
24
24
  getStackName
25
- } from "./chunk-MZB3GGOH.js";
25
+ } from "./chunk-YRVTXSXP.js";
26
26
  import {
27
27
  cliTheme
28
- } from "./chunk-VAHVSQIG.js";
28
+ } from "./chunk-AVVYFEMF.js";
29
29
  import {
30
30
  useWizardStore
31
- } from "./chunk-HRMQ2RGY.js";
31
+ } from "./chunk-423MJ6DT.js";
32
32
  import {
33
33
  resolveAlias,
34
34
  validateSelection
35
- } from "./chunk-U5OB5ADP.js";
35
+ } from "./chunk-TTXV55NQ.js";
36
36
  import {
37
37
  warn
38
- } from "./chunk-YJIJTBSX.js";
38
+ } from "./chunk-XJXJZ2MJ.js";
39
39
  import {
40
40
  CLI_COLORS
41
- } from "./chunk-ZBJQXDQN.js";
41
+ } from "./chunk-BK7TANUV.js";
42
42
  import {
43
43
  init_esm_shims
44
44
  } from "./chunk-DHET7RCE.js";
@@ -90,7 +90,6 @@ function useBuildStepProps({
90
90
  const effectiveDomains = store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;
91
91
  const allSelections = store.getAllSelectedTechnologies();
92
92
  const activeDomain = currentDomain || effectiveDomains[0] || "web";
93
- const parentDomainSelections = store.getParentDomainSelections(activeDomain, matrix);
94
93
  const onToggle = useCallback(
95
94
  (subcategoryId, techId) => {
96
95
  const domain = store.getCurrentDomain() || "web";
@@ -117,7 +116,6 @@ function useBuildStepProps({
117
116
  allSelections,
118
117
  showLabels: store.showLabels,
119
118
  expertMode: store.expertMode,
120
- parentDomainSelections,
121
119
  installedSkillIds,
122
120
  onToggle,
123
121
  onToggleLabels: store.toggleShowLabels,
@@ -265,7 +263,7 @@ var Wizard = ({
265
263
  matrix,
266
264
  projectDir,
267
265
  onContinue: () => {
268
- store.preselectAgentsFromSkills();
266
+ store.preselectAgentsFromDomains();
269
267
  store.setStep("agents");
270
268
  },
271
269
  onBack: store.goBack
@@ -310,4 +308,4 @@ var Wizard = ({
310
308
  export {
311
309
  Wizard
312
310
  };
313
- //# sourceMappingURL=chunk-CYFU3ARY.js.map
311
+ //# sourceMappingURL=chunk-342YB6TQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard.tsx","../src/cli/components/hooks/use-wizard-initialization.ts","../src/cli/components/hooks/use-build-step-props.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useApp, useInput, useStdout } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardLayout } from \"./wizard-layout.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { StepSources } from \"./step-sources.js\";\nimport { StepSettings } from \"./step-settings.js\";\nimport { StepAgents } from \"./step-agents.js\";\nimport { resolveAlias, validateSelection } from \"../../lib/matrix/index.js\";\nimport type {\n AgentName,\n DomainSelections,\n MergedSkillsMatrix,\n SkillId,\n} from \"../../types/index.js\";\nimport { getStackName } from \"./utils.js\";\nimport { warn } from \"../../utils/logger.js\";\nimport { useWizardInitialization } from \"../hooks/use-wizard-initialization.js\";\nimport { useBuildStepProps } from \"../hooks/use-build-step-props.js\";\n\nexport type WizardResultV2 = {\n selectedSkills: SkillId[];\n selectedAgents: AgentName[];\n selectedStackId: string | null;\n domainSelections: DomainSelections;\n sourceSelections: Partial<Record<SkillId, string>>;\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n};\n\ntype WizardProps = {\n matrix: MergedSkillsMatrix;\n onComplete: (result: WizardResultV2) => void;\n onCancel: () => void;\n version?: string;\n marketplaceLabel?: string;\n logo?: string;\n initialStep?: WizardStep;\n initialInstallMode?: \"plugin\" | \"local\";\n initialExpertMode?: boolean;\n installedSkillIds?: SkillId[];\n projectDir?: string;\n};\n\nconst MIN_TERMINAL_WIDTH = 80;\nconst MIN_TERMINAL_HEIGHT = 15;\n\nexport const Wizard: React.FC<WizardProps> = ({\n matrix,\n onComplete,\n onCancel,\n version,\n marketplaceLabel,\n logo,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n installedSkillIds,\n projectDir,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;\n const terminalHeight = stdout.rows || MIN_TERMINAL_HEIGHT;\n const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;\n const isShortTerminal = terminalHeight < MIN_TERMINAL_HEIGHT;\n\n useWizardInitialization({\n matrix,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n installedSkillIds,\n });\n\n const buildStepProps = useBuildStepProps({ store, matrix, installedSkillIds });\n\n useInput((input, key) => {\n // ESC is handled by step-settings.tsx's own useKeyboardNavigation hook\n if (store.showSettings) {\n if (input === \"g\" || input === \"G\") {\n store.toggleSettings();\n }\n return;\n }\n\n if (store.showHelp) {\n if (key.escape || input === \"?\") {\n store.toggleHelp();\n }\n return;\n }\n\n if (input === \"?\") {\n store.toggleHelp();\n return;\n }\n\n if (key.escape) {\n // At the initial stack/scratch selection (approach not yet set), ESC cancels the wizard.\n // StackSelection handles its own ESC via the onCancel prop.\n // Other steps that don't have their own escape handler use goBack.\n if (\n store.step !== \"build\" &&\n store.step !== \"confirm\" &&\n store.step !== \"sources\" &&\n store.step !== \"agents\" &&\n store.step !== \"stack\"\n ) {\n store.goBack();\n }\n return;\n }\n\n if ((input === \"a\" || input === \"A\") && store.step === \"build\" && store.selectedStackId) {\n store.setStackAction(\"defaults\");\n store.setStep(\"confirm\");\n return;\n }\n\n if ((input === \"g\" || input === \"G\") && store.step === \"sources\") {\n store.toggleSettings();\n return;\n }\n\n if (input === \"e\" || input === \"E\") {\n store.toggleExpertMode();\n return;\n }\n if (input === \"p\" || input === \"P\") {\n store.toggleInstallMode();\n }\n });\n\n const handleComplete = useCallback(() => {\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = matrix.suggestedStacks.find((s) => s.id === store.selectedStackId);\n if (!stack) {\n warn(`Stack not found in matrix: '${store.selectedStackId}'`);\n }\n allSkills = [...(stack?.allSkillIds || [])];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => {\n const resolved = resolveAlias(tech, matrix);\n if (!matrix.skills[resolved]) {\n warn(\n `Technology '${tech}' could not be resolved to a skill ID - it may be missing from skill_aliases`,\n );\n }\n return resolved;\n });\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 const result: WizardResultV2 = {\n selectedSkills: allSkills,\n selectedAgents: store.selectedAgents,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n sourceSelections: store.sourceSelections,\n expertMode: store.expertMode,\n installMode: store.installMode,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, matrix, onComplete, exit]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n exit();\n }, [onCancel, exit]);\n\n const renderStep = () => {\n switch (store.step) {\n case \"stack\":\n return <StepStack matrix={matrix} onCancel={handleCancel} />;\n\n case \"build\":\n return <StepBuild {...buildStepProps} />;\n\n case \"sources\": {\n if (store.showSettings) {\n return (\n <StepSettings\n projectDir={projectDir || process.cwd()}\n onClose={() => store.toggleSettings()}\n />\n );\n }\n return (\n <StepSources\n matrix={matrix}\n projectDir={projectDir}\n onContinue={() => {\n store.preselectAgentsFromDomains();\n store.setStep(\"agents\");\n }}\n onBack={store.goBack}\n />\n );\n }\n\n case \"agents\":\n return <StepAgents />;\n\n case \"confirm\": {\n const stackName = getStackName(store.selectedStackId, matrix);\n const technologyCount = store.getTechnologyCount();\n return (\n <StepConfirm\n onComplete={handleComplete}\n stackName={stackName}\n selectedDomains={store.selectedDomains}\n domainSelections={store.domainSelections}\n technologyCount={technologyCount}\n skillCount={technologyCount}\n agentCount={store.selectedAgents.length}\n installMode={store.installMode}\n onBack={store.goBack}\n />\n );\n }\n\n default:\n return null;\n }\n };\n\n if (isNarrowTerminal || isShortTerminal) {\n const issue = isNarrowTerminal\n ? `too narrow (${terminalWidth} columns, need ${MIN_TERMINAL_WIDTH})`\n : `too short (${terminalHeight} rows, need ${MIN_TERMINAL_HEIGHT})`;\n\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <Text color={CLI_COLORS.WARNING}>Terminal {issue}. Please resize your terminal.</Text>\n </Box>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={cliTheme}>\n <WizardLayout version={version} marketplaceLabel={marketplaceLabel} logo={logo}>\n {renderStep()}\n </WizardLayout>\n </ThemeProvider>\n );\n};\n","import { useRef } from \"react\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport type { MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\n\ntype UseWizardInitializationOptions = {\n matrix: MergedSkillsMatrix;\n initialStep?: WizardStep;\n initialInstallMode?: \"plugin\" | \"local\";\n initialExpertMode?: boolean;\n installedSkillIds?: SkillId[];\n};\n\n/**\n * Runs one-time wizard store initialization before the first render.\n * Populates step, approach, install mode, and skill selections from props.\n */\nexport function useWizardInitialization({\n matrix,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n installedSkillIds,\n}: UseWizardInitializationOptions): void {\n const initialized = useRef(false);\n\n if (!initialized.current) {\n initialized.current = true;\n\n if (initialStep) {\n if (installedSkillIds?.length) {\n useWizardStore\n .getState()\n .populateFromSkillIds(installedSkillIds, matrix.skills, matrix.categories);\n }\n useWizardStore.setState({ step: initialStep, approach: \"scratch\" });\n }\n if (initialInstallMode) {\n useWizardStore.setState({ installMode: initialInstallMode });\n }\n if (initialExpertMode) {\n useWizardStore.setState({ expertMode: initialExpertMode });\n }\n }\n}\n","import { useCallback } from \"react\";\nimport type { Domain, MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\nimport type { WizardState } from \"../../stores/wizard-store.js\";\nimport type { StepBuildProps } from \"../wizard/step-build.js\";\n\ntype UseBuildStepPropsOptions = {\n store: WizardState;\n matrix: MergedSkillsMatrix;\n installedSkillIds?: SkillId[];\n};\n\nexport function useBuildStepProps({\n store,\n matrix,\n installedSkillIds,\n}: UseBuildStepPropsOptions): StepBuildProps {\n const currentDomain = store.getCurrentDomain();\n const defaultDomains: Domain[] = [\"web\"];\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;\n\n const allSelections = store.getAllSelectedTechnologies();\n\n const activeDomain: Domain = currentDomain || effectiveDomains[0] || \"web\";\n\n const onToggle = useCallback(\n (subcategoryId: Parameters<StepBuildProps[\"onToggle\"]>[0], techId: SkillId) => {\n const domain: Domain = store.getCurrentDomain() || \"web\";\n const cat = matrix.categories[subcategoryId];\n store.toggleTechnology(domain, subcategoryId, techId, cat?.exclusive ?? true);\n },\n [store, matrix],\n );\n\n const onContinue = useCallback(() => {\n if (!store.nextDomain()) {\n store.setStep(\"sources\");\n }\n }, [store]);\n\n const onBack = useCallback(() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }, [store]);\n\n return {\n matrix,\n domain: activeDomain,\n selectedDomains: effectiveDomains,\n selections: store.domainSelections[activeDomain] || {},\n allSelections,\n showLabels: store.showLabels,\n expertMode: store.expertMode,\n installedSkillIds,\n onToggle,\n onToggleLabels: store.toggleShowLabels,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -1,22 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getSkillDisplayLabel
4
- } from "./chunk-WSGGJKD5.js";
4
+ } from "./chunk-SILUTTV7.js";
5
5
  import {
6
- getCachedDefaults,
7
6
  resolveAlias
8
- } from "./chunk-U5OB5ADP.js";
7
+ } from "./chunk-TTXV55NQ.js";
9
8
  import {
10
9
  typedEntries,
11
10
  typedKeys
12
11
  } from "./chunk-T4EXUIBY.js";
13
12
  import {
14
13
  warn
15
- } from "./chunk-YJIJTBSX.js";
14
+ } from "./chunk-XJXJZ2MJ.js";
16
15
  import {
17
16
  DEFAULT_PRESELECTED_SKILLS,
18
17
  DEFAULT_PUBLIC_SOURCE_NAME
19
- } from "./chunk-ZBJQXDQN.js";
18
+ } from "./chunk-BK7TANUV.js";
20
19
  import {
21
20
  init_esm_shims
22
21
  } from "./chunk-DHET7RCE.js";
@@ -24,36 +23,21 @@ import {
24
23
  // src/cli/stores/wizard-store.ts
25
24
  init_esm_shims();
26
25
  import { create } from "zustand";
27
- var ALL_DOMAINS = ["web", "web-extras", "api", "cli", "mobile", "shared"];
28
- var OPTIONAL_AGENTS = [
29
- "agent-summoner",
30
- "skill-summoner",
31
- "documentor",
32
- "pattern-scout",
33
- "web-pattern-critique"
34
- ];
35
- function extractSkillPrefixes(skillIds) {
36
- const prefixes = /* @__PURE__ */ new Set();
37
- for (const id of skillIds) {
38
- const firstHyphen = id.indexOf("-");
39
- if (firstHyphen > 0) {
40
- prefixes.add(id.slice(0, firstHyphen));
41
- }
42
- }
43
- return prefixes;
44
- }
45
- function computeAgentPreselection(skillPrefixes, agentSkillPrefixes) {
46
- if (skillPrefixes.size === 0) return [];
47
- const result = [];
48
- for (const [agent, prefixes] of typedEntries(agentSkillPrefixes)) {
49
- if (OPTIONAL_AGENTS.includes(agent)) continue;
50
- const hasMatchingPrefix = prefixes?.some((prefix) => skillPrefixes.has(prefix));
51
- if (hasMatchingPrefix) {
52
- result.push(agent);
53
- }
54
- }
55
- return result.sort();
56
- }
26
+ var ALL_DOMAINS = ["web", "api", "cli", "mobile", "shared"];
27
+ var DOMAIN_AGENTS = {
28
+ web: [
29
+ "web-developer",
30
+ "web-reviewer",
31
+ "web-researcher",
32
+ "web-tester",
33
+ "web-pm",
34
+ "web-architecture"
35
+ ],
36
+ api: ["api-developer", "api-reviewer", "api-researcher"],
37
+ cli: ["cli-developer", "cli-tester", "cli-reviewer", "cli-migrator"],
38
+ mobile: [],
39
+ shared: []
40
+ };
57
41
  var SOURCE_SORT_TIER_LOCAL = 1;
58
42
  var SOURCE_SORT_TIER_SCOPED = 2;
59
43
  var SOURCE_SORT_TIER_PUBLIC = 3;
@@ -75,7 +59,7 @@ function formatSourceLabel(source) {
75
59
  }
76
60
  function resolveSkillForPopulation(skillId, skills, categories) {
77
61
  const skill = skills[skillId];
78
- if (!skill?.category || !skill.displayName) {
62
+ if (!skill?.category) {
79
63
  warn(
80
64
  `Installed skill '${skillId}' is missing from the marketplace \u2014 it may have been removed or renamed`
81
65
  );
@@ -87,7 +71,7 @@ function resolveSkillForPopulation(skillId, skills, categories) {
87
71
  warn(`Installed skill '${skillId}' has unknown category '${skill.category}' \u2014 skipping`);
88
72
  return null;
89
73
  }
90
- return { domain, subcat, techId: skill.displayName };
74
+ return { domain, subcat, techId: skillId };
91
75
  }
92
76
  function buildBoundSkillOptions(boundSkills, alias, selectedSource) {
93
77
  return boundSkills.filter((b) => b.boundTo === alias).map((bound) => ({
@@ -287,14 +271,15 @@ var useWizardStore = create((set, get) => ({
287
271
  selectedAgents: isSelected ? state.selectedAgents.filter((a) => a !== agent) : [...state.selectedAgents, agent]
288
272
  };
289
273
  }),
290
- preselectAgentsFromSkills: () => set(() => {
291
- const selectedSkills = get().getAllSelectedTechnologies();
292
- const skillPrefixes = extractSkillPrefixes(selectedSkills);
293
- const defaults = getCachedDefaults();
294
- const agentSkillPrefixes = defaults?.agentSkillPrefixes ?? {};
295
- return {
296
- selectedAgents: computeAgentPreselection(skillPrefixes, agentSkillPrefixes)
297
- };
274
+ preselectAgentsFromDomains: () => set(() => {
275
+ const agents = [];
276
+ for (const domain of get().selectedDomains) {
277
+ const domainAgents = DOMAIN_AGENTS[domain];
278
+ if (domainAgents) {
279
+ agents.push(...domainAgents);
280
+ }
281
+ }
282
+ return { selectedAgents: agents.sort() };
298
283
  }),
299
284
  reset: () => set(createInitialState()),
300
285
  getAllSelectedTechnologies: () => {
@@ -368,16 +353,6 @@ var useWizardStore = create((set, get) => ({
368
353
  const state = get();
369
354
  return state.currentDomainIndex > 0;
370
355
  },
371
- getParentDomain: (domain, matrix) => {
372
- const cat = Object.values(matrix.categories).find((c) => c.domain === domain && c.parentDomain);
373
- return cat?.parentDomain;
374
- },
375
- getParentDomainSelections: (domain, matrix) => {
376
- const state = get();
377
- const parentDomain = state.getParentDomain(domain, matrix);
378
- if (!parentDomain) return void 0;
379
- return state.domainSelections[parentDomain];
380
- },
381
356
  buildSourceRows: (matrix) => {
382
357
  const state = get();
383
358
  const selectedTechnologies = get().getAllSelectedTechnologies();
@@ -417,4 +392,4 @@ var useWizardStore = create((set, get) => ({
417
392
  export {
418
393
  useWizardStore
419
394
  };
420
- //# sourceMappingURL=chunk-HRMQ2RGY.js.map
395
+ //# sourceMappingURL=chunk-423MJ6DT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/stores/wizard-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { DEFAULT_PRESELECTED_SKILLS, DEFAULT_PUBLIC_SOURCE_NAME } from \"../consts.js\";\nimport { resolveAlias } from \"../lib/matrix/index.js\";\nimport { getSkillDisplayLabel } from \"../lib/wizard/build-step-logic.js\";\nimport type {\n AgentName,\n BoundSkill,\n Domain,\n DomainSelections,\n MergedSkillsMatrix,\n SkillAlias,\n SkillAssignment,\n SkillId,\n SkillSource,\n Subcategory,\n SubcategorySelections,\n} from \"../types/index.js\";\nimport { warn } from \"../utils/logger.js\";\nimport { typedEntries, typedKeys } from \"../utils/typed-object.js\";\n\nconst ALL_DOMAINS: Domain[] = [\"web\", \"api\", \"cli\", \"mobile\", \"shared\"];\n\n/** All known agent names grouped by domain prefix. */\nconst DOMAIN_AGENTS: Record<Domain, AgentName[]> = {\n web: [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-tester\",\n \"web-pm\",\n \"web-architecture\",\n ],\n api: [\"api-developer\", \"api-reviewer\", \"api-researcher\"],\n cli: [\"cli-developer\", \"cli-tester\", \"cli-reviewer\", \"cli-migrator\"],\n mobile: [],\n shared: [],\n};\n\n/**\n * Fixed source sort tiers (lower = higher priority):\n * 1 = local/global (installed on disk -- type \"local\" or installed via plugin)\n * 2 = scoped marketplace (primary source from --source flag)\n * 3 = default public marketplace (Agents Inc)\n * 4 = third-party marketplaces (extra configured sources)\n */\nconst SOURCE_SORT_TIER_LOCAL = 1;\nconst SOURCE_SORT_TIER_SCOPED = 2;\nconst SOURCE_SORT_TIER_PUBLIC = 3;\nconst SOURCE_SORT_TIER_THIRD_PARTY = 4;\n\nfunction getSourceSortTier(source: SkillSource): number {\n if (source.type === \"local\") return SOURCE_SORT_TIER_LOCAL;\n if (source.primary) return SOURCE_SORT_TIER_SCOPED;\n if (source.type === \"public\") return SOURCE_SORT_TIER_PUBLIC;\n return SOURCE_SORT_TIER_THIRD_PARTY;\n}\n\nconst SOURCE_DISPLAY_NAMES: Record<string, string> = {\n local: \"Local\",\n};\n\nfunction formatSourceLabel(source: {\n name: string;\n version?: string;\n installed?: boolean;\n}): string {\n const displayName = SOURCE_DISPLAY_NAMES[source.name] ?? source.name;\n const prefix = source.installed ? \"\\u2713 \" : \"\";\n const versionSuffix = source.version ? ` \\u00B7 v${source.version}` : \"\";\n return `${prefix}${displayName}${versionSuffix}`;\n}\n\ntype SkillLookupEntry = { category: string; displayName?: string };\n\nfunction resolveSkillForPopulation(\n skillId: SkillId,\n skills: Partial<Record<SkillId, SkillLookupEntry>>,\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n): { domain: Domain; subcat: Subcategory; techId: SkillId } | null {\n const skill = skills[skillId];\n if (!skill?.category) {\n warn(\n `Installed skill '${skillId}' is missing from the marketplace — it may have been removed or renamed`,\n );\n return null;\n }\n\n // Boundary cast: category is a Subcategory at the data boundary\n const subcat = skill.category as Subcategory;\n const domain = categories[subcat]?.domain;\n if (!domain) {\n warn(`Installed skill '${skillId}' has unknown category '${skill.category}' — skipping`);\n return null;\n }\n\n return { domain, subcat, techId: skillId };\n}\n\nfunction buildBoundSkillOptions(\n boundSkills: BoundSkill[],\n alias: SkillAlias,\n selectedSource: string,\n): { id: string; label: string; selected: boolean; installed: boolean }[] {\n return boundSkills\n .filter((b) => b.boundTo === alias)\n .map((bound) => ({\n id: bound.sourceName,\n label: formatSourceLabel({\n name: bound.sourceName,\n installed: false,\n }),\n selected: selectedSource === bound.sourceName,\n installed: false,\n }));\n}\n\nfunction getSkillAlias(skillId: SkillId, matrix: MergedSkillsMatrix): SkillAlias {\n const displayName = matrix.displayNames?.[skillId];\n if (displayName) return displayName;\n // Fallback: use the last segment of the skill ID (e.g., \"web-framework-react\" -> \"react\")\n const segments = skillId.split(\"-\");\n const fallback = segments[segments.length - 1] || skillId;\n warn(`No display name found for skill '${skillId}', using fallback alias '${fallback}'`);\n return fallback;\n}\n\n/**\n * Wizard step identifiers for the multi-step init/edit flow.\n *\n * Progression: stack -> build -> sources -> agents -> confirm\n * The \"stack\" step shows all stacks + \"Start from scratch\" in a unified list.\n * Navigation is tracked via the `history` stack for goBack() support.\n */\nexport type WizardStep =\n | \"stack\" // Unified first step: select stack or \"Start from scratch\", then domain selection\n | \"build\" // CategoryGrid for technology selection\n | \"sources\" // Choose skill sources (recommended vs custom)\n | \"agents\" // Select which agents to compile\n | \"confirm\"; // Final confirmation\n\n/**\n * Wizard store state and actions.\n *\n * The store uses a composition pattern: small, focused actions that each mutate\n * one or two state fields. Wizard step components compose these actions to build\n * up the full selection state incrementally (domains -> subcategories -> skills -> sources).\n *\n * State flow: unified stack/scratch selection -> domain selection -> per-domain skill\n * selection (build step) -> source customization -> confirmation.\n */\nexport type WizardState = {\n step: WizardStep;\n\n approach: \"stack\" | \"scratch\" | null;\n selectedStackId: string | null;\n stackAction: \"defaults\" | \"customize\" | null;\n\n selectedDomains: Domain[];\n\n currentDomainIndex: number;\n domainSelections: DomainSelections;\n\n showLabels: boolean;\n expertMode: boolean;\n\n installMode: \"plugin\" | \"local\";\n\n sourceSelections: Partial<Record<SkillId, string>>;\n customizeSources: boolean;\n\n showSettings: boolean;\n showHelp: boolean;\n enabledSources: Record<string, boolean>;\n\n selectedAgents: AgentName[];\n\n boundSkills: BoundSkill[];\n\n history: WizardStep[];\n\n /**\n * Navigate to a wizard step, pushing the current step onto history.\n * @param step - Target step to navigate to\n *\n * Side effects: sets `step`, appends previous step to `history`\n */\n setStep: (step: WizardStep) => void;\n /**\n * Set the wizard approach (stack-based or build-from-scratch).\n * @param approach - \"stack\" to use a pre-built template, \"scratch\" to select skills manually, null to reset\n *\n * Side effects: sets `approach`\n */\n setApproach: (approach: \"stack\" | \"scratch\" | null) => void;\n /**\n * Select a stack by ID, or null to deselect.\n * @param stackId - Stack identifier from suggestedStacks, or null to clear\n *\n * Side effects: sets `selectedStackId`\n */\n selectStack: (stackId: string | null) => void;\n /**\n * Set how to apply the selected stack.\n * @param action - \"defaults\" to use stack as-is, \"customize\" to enter the build step\n *\n * Side effects: sets `stackAction`\n */\n setStackAction: (action: \"defaults\" | \"customize\") => void;\n /**\n * Pre-populate domainSelections from a stack's agent-to-skill mappings.\n *\n * Iterates all agents in the stack, resolving each subcategory's skill assignments\n * to the appropriate domain. Enables all domains and deduplicates skill IDs.\n *\n * @param stack - Stack definition with agent-level skill assignments\n * @param stack.agents - Record of agent name to `{ subcategory: SkillAssignment[] }` mappings\n * @param categories - Category definitions used to resolve subcategory -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to ALL_DOMAINS\n */\n populateFromStack: (\n stack: { agents: Record<string, Partial<Record<Subcategory, SkillAssignment[]>>> },\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n /**\n * Pre-populate domainSelections from a flat list of installed skill IDs.\n *\n * Used by `agentsinc edit` to restore wizard state from existing project config.\n * Looks up each skill's category and domain, warns for unresolvable skills.\n *\n * @param skillIds - Flat array of currently installed skill IDs\n * @param skills - Skill lookup providing category and displayName per skill ID\n * @param categories - Category definitions used to resolve subcategory -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to ALL_DOMAINS\n */\n populateFromSkillIds: (\n skillIds: SkillId[],\n skills: Partial<Record<SkillId, { category: string; displayName?: string }>>,\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n /**\n * Toggle a domain on or off in the selectedDomains list.\n * @param domain - Domain to toggle\n *\n * Side effects: adds or removes from `selectedDomains`\n */\n toggleDomain: (domain: Domain) => void;\n /**\n * Toggle a skill selection within a domain's subcategory.\n *\n * When exclusive is true (radio behavior), selecting a new skill replaces any\n * existing selection in that subcategory. When false (checkbox behavior),\n * the skill is added to or removed from the selection array.\n *\n * @param domain - Domain containing the subcategory\n * @param subcategory - Subcategory within the domain\n * @param technology - Skill ID to toggle\n * @param exclusive - If true, only one skill can be selected per subcategory (radio)\n *\n * Side effects: updates `domainSelections[domain][subcategory]`\n */\n toggleTechnology: (\n domain: Domain,\n subcategory: Subcategory,\n technology: SkillId,\n exclusive: boolean,\n ) => void;\n /**\n * Advance to the next domain in the build step.\n * @returns true if advanced, false if already at the last domain\n *\n * Side effects: increments `currentDomainIndex`\n */\n nextDomain: () => boolean;\n /**\n * Go back to the previous domain in the build step.\n * @returns true if moved back, false if already at the first domain\n *\n * Side effects: decrements `currentDomainIndex`\n */\n prevDomain: () => boolean;\n /** Toggle compatibility label visibility on skill tags in the build step grid. */\n toggleShowLabels: () => void;\n /** Toggle expert mode (shows advanced/niche skills in the build step). */\n toggleExpertMode: () => void;\n /** Toggle between \"plugin\" and \"local\" install modes. */\n toggleInstallMode: () => void;\n /**\n * Set which source provides a specific skill.\n * @param skillId - Skill to configure the source for\n * @param sourceId - Source identifier (e.g., \"public\", \"local\", marketplace name)\n *\n * Side effects: updates `sourceSelections[skillId]`. No-op with warning if either param is empty.\n */\n setSourceSelection: (skillId: SkillId, sourceId: string) => void;\n /**\n * Enable or disable source customization on the sources step.\n * @param customize - true to show per-skill source pickers\n *\n * Side effects: sets `customizeSources`\n */\n setCustomizeSources: (customize: boolean) => void;\n /** Toggle the settings overlay (source management). */\n toggleSettings: () => void;\n /** Toggle the help overlay (hotkey reference). */\n toggleHelp: () => void;\n /**\n * Replace the full set of enabled/disabled sources.\n * @param sources - Record of source name to enabled boolean. Empty-string keys are filtered out.\n *\n * Side effects: sets `enabledSources`\n */\n setEnabledSources: (sources: Record<string, boolean>) => void;\n /**\n * Add a bound skill from search to the wizard's bound skills list.\n * Duplicates (same id + sourceUrl) are silently skipped with a warning.\n *\n * @param skill - Bound skill to add (foreign skill tied to a subcategory alias)\n *\n * Side effects: appends to `boundSkills`\n */\n bindSkill: (skill: BoundSkill) => void;\n /**\n * Navigate to the previous wizard step using the history stack.\n * Falls back to \"stack\" if history is empty.\n *\n * Side effects: pops from `history`, sets `step` to the popped value\n */\n goBack: () => void;\n /**\n * Toggle an agent on or off in the selectedAgents list.\n * @param agent - Agent name to toggle\n *\n * Side effects: adds or removes from `selectedAgents`\n */\n toggleAgent: (agent: AgentName) => void;\n /**\n * Preselect agents based on selected domains from the first wizard step.\n * Matches domains against agentSkillPrefixes from cached defaults.\n * Optional agents (meta/pattern) are excluded.\n *\n * Side effects: replaces `selectedAgents` with computed preselection\n */\n preselectAgentsFromDomains: () => void;\n /** Reset all wizard state to initial values. */\n reset: () => void;\n\n /**\n * Collect all selected skill IDs across all domains and subcategories.\n * @returns Flat array of every selected SkillId (may contain duplicates if shared across domains)\n */\n getAllSelectedTechnologies: () => SkillId[];\n /**\n * Group selected skill IDs by domain.\n * @returns Partial record mapping each domain with selections to its skill ID array\n */\n getSelectedTechnologiesPerDomain: () => Partial<Record<Domain, SkillId[]>>;\n /**\n * Get the domain currently visible in the build step.\n * @returns The domain at currentDomainIndex, or null if no domains are selected\n */\n getCurrentDomain: () => Domain | null;\n /** Returns the foundational methodology skills that are always preselected (DEFAULT_PRESELECTED_SKILLS). */\n getDefaultMethodologySkills: () => SkillId[];\n /**\n * Count total selected technologies across all domains.\n * @returns Number of selected skill IDs\n */\n getTechnologyCount: () => number;\n /**\n * Compute which wizard steps are completed and which are skipped.\n * Used by WizardTabs to render step progress indicators.\n * @returns Object with completedSteps and skippedSteps string arrays\n */\n getStepProgress: () => { completedSteps: WizardStep[]; skippedSteps: WizardStep[] };\n /** @returns true if there is a next domain after the current one */\n canGoToNextDomain: () => boolean;\n /** @returns true if there is a previous domain before the current one */\n canGoToPreviousDomain: () => boolean;\n /**\n * Build the source selection rows for the sources step UI.\n *\n * For each selected technology, resolves the canonical skill ID, looks up available\n * sources from the matrix, merges in any bound skills from search, and determines\n * which source is currently selected. Sources are sorted: local first, then public,\n * then private/other.\n *\n * @param matrix - Merged skills matrix with resolved skills and their available sources\n * @returns Array of row objects, one per selected technology, each containing:\n * - `skillId` - Canonical resolved skill ID\n * - `displayName` - Human-readable skill alias\n * - `alias` - Same as displayName (for backward compatibility)\n * - `options` - Available sources with selection state and install status\n */\n buildSourceRows: (matrix: MergedSkillsMatrix) => {\n skillId: SkillId;\n displayName: SkillAlias;\n alias: SkillAlias;\n options: { id: string; label: string; selected: boolean; installed: boolean }[];\n }[];\n};\n\nconst createInitialState = () => ({\n step: \"stack\" as WizardStep,\n approach: null as \"stack\" | \"scratch\" | null,\n selectedStackId: null as string | null,\n stackAction: null as \"defaults\" | \"customize\" | null,\n selectedDomains: [] as Domain[],\n currentDomainIndex: 0,\n domainSelections: {} as DomainSelections,\n showLabels: false,\n expertMode: false,\n installMode: \"local\" as \"plugin\" | \"local\",\n sourceSelections: {} as Partial<Record<SkillId, string>>,\n customizeSources: false,\n showSettings: false,\n showHelp: false,\n enabledSources: {} as Record<string, boolean>,\n selectedAgents: [] as AgentName[],\n boundSkills: [] as BoundSkill[],\n history: [] as WizardStep[],\n});\n\nexport const useWizardStore = create<WizardState>((set, get) => ({\n ...createInitialState(),\n\n setStep: (step) =>\n set((state) => ({\n step,\n history: [...state.history, state.step],\n })),\n\n setApproach: (approach) => set({ approach }),\n\n selectStack: (stackId) => set({ selectedStackId: stackId }),\n\n setStackAction: (action) => set({ stackAction: action }),\n\n populateFromStack: (stack, categories) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const domains = new Set<Domain>();\n\n for (const agentConfig of Object.values(stack.agents)) {\n for (const [subcat, assignments] of typedEntries<Subcategory, SkillAssignment[]>(\n agentConfig,\n )) {\n const category = categories[subcat];\n const domain = category?.domain;\n\n if (!domain || !assignments) {\n continue;\n }\n\n domains.add(domain);\n\n if (!domainSelections[domain]) {\n domainSelections[domain] = {};\n }\n\n if (!domainSelections[domain][subcat]) {\n domainSelections[domain][subcat] = [];\n }\n\n for (const assignment of assignments) {\n if (!domainSelections[domain][subcat].includes(assignment.id)) {\n domainSelections[domain][subcat].push(assignment.id);\n }\n }\n }\n }\n\n return {\n domainSelections,\n selectedDomains: ALL_DOMAINS,\n };\n }),\n\n populateFromSkillIds: (skillIds, skills, categories) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n let skippedCount = 0;\n\n for (const skillId of skillIds) {\n const resolved = resolveSkillForPopulation(skillId, skills, categories);\n if (!resolved) {\n skippedCount++;\n continue;\n }\n\n const { domain, subcat, techId } = resolved;\n if (!domainSelections[domain]) domainSelections[domain] = {};\n if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];\n\n if (!domainSelections[domain][subcat].includes(techId)) {\n domainSelections[domain][subcat].push(techId);\n }\n }\n\n if (skippedCount > 0) {\n warn(`${skippedCount} installed skill(s) could not be resolved and were skipped`);\n }\n\n return { domainSelections, selectedDomains: ALL_DOMAINS };\n }),\n\n toggleDomain: (domain) =>\n set((state) => {\n const isSelected = state.selectedDomains.includes(domain);\n return {\n selectedDomains: isSelected\n ? state.selectedDomains.filter((d) => d !== domain)\n : [...state.selectedDomains, domain],\n };\n }),\n\n toggleTechnology: (domain, subcategory, technology, exclusive) =>\n set((state) => {\n const currentSelections = state.domainSelections[domain]?.[subcategory] || [];\n const isSelected = currentSelections.includes(technology);\n\n let newSelections: SkillId[];\n if (exclusive) {\n newSelections = isSelected ? [] : [technology];\n } else {\n newSelections = isSelected\n ? currentSelections.filter((t) => t !== technology)\n : [...currentSelections, technology];\n }\n\n return {\n domainSelections: {\n ...state.domainSelections,\n [domain]: {\n ...state.domainSelections[domain],\n [subcategory]: newSelections,\n },\n },\n };\n }),\n\n nextDomain: () => {\n const state = get();\n if (state.currentDomainIndex < state.selectedDomains.length - 1) {\n set({\n currentDomainIndex: state.currentDomainIndex + 1,\n });\n return true;\n }\n return false;\n },\n\n prevDomain: () => {\n const state = get();\n if (state.currentDomainIndex > 0) {\n set({\n currentDomainIndex: state.currentDomainIndex - 1,\n });\n return true;\n }\n return false;\n },\n\n toggleShowLabels: () => set((state) => ({ showLabels: !state.showLabels })),\n\n toggleExpertMode: () => set((state) => ({ expertMode: !state.expertMode })),\n\n toggleInstallMode: () =>\n set((state) => ({\n installMode: state.installMode === \"plugin\" ? \"local\" : \"plugin\",\n })),\n\n setSourceSelection: (skillId, sourceId) =>\n set((state) => {\n if (!skillId) {\n warn(\"Ignoring setSourceSelection call with empty skillId\");\n return state;\n }\n if (!sourceId) {\n warn(`Ignoring setSourceSelection call with empty sourceId for skill '${skillId}'`);\n return state;\n }\n return {\n sourceSelections: { ...state.sourceSelections, [skillId]: sourceId },\n };\n }),\n\n setCustomizeSources: (customize) => set({ customizeSources: customize }),\n\n toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),\n\n toggleHelp: () => set((state) => ({ showHelp: !state.showHelp })),\n\n setEnabledSources: (sources) => {\n const invalidKeys = Object.keys(sources).filter((key) => !key.trim());\n if (invalidKeys.length > 0) {\n warn(\"Ignoring setEnabledSources call with empty source name(s)\");\n }\n const validSources = Object.fromEntries(Object.entries(sources).filter(([key]) => key.trim()));\n return set({ enabledSources: validSources });\n },\n\n bindSkill: (skill) =>\n set((state) => {\n const exists = state.boundSkills.some(\n (b) => b.id === skill.id && b.sourceUrl === skill.sourceUrl,\n );\n if (exists) {\n warn(`Skill '${skill.id}' from '${skill.sourceUrl}' is already bound — skipping duplicate`);\n return state;\n }\n return { boundSkills: [...state.boundSkills, skill] };\n }),\n\n goBack: () =>\n set((state) => {\n const history = [...state.history];\n const previousStep = history.pop();\n return {\n step: previousStep || \"stack\",\n history,\n };\n }),\n\n toggleAgent: (agent) =>\n set((state) => {\n const isSelected = state.selectedAgents.includes(agent);\n return {\n selectedAgents: isSelected\n ? state.selectedAgents.filter((a) => a !== agent)\n : [...state.selectedAgents, agent],\n };\n }),\n\n preselectAgentsFromDomains: () =>\n set(() => {\n const agents: AgentName[] = [];\n for (const domain of get().selectedDomains) {\n const domainAgents = DOMAIN_AGENTS[domain];\n if (domainAgents) {\n agents.push(...domainAgents);\n }\n }\n return { selectedAgents: agents.sort() };\n }),\n\n reset: () => set(createInitialState()),\n\n getAllSelectedTechnologies: () => {\n const state = get();\n const technologies: SkillId[] = [];\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n for (const subcategory of typedKeys<Subcategory>(domainSel)) {\n const techs = domainSel[subcategory];\n if (techs) technologies.push(...techs);\n }\n }\n return technologies;\n },\n\n getSelectedTechnologiesPerDomain: () => {\n const state = get();\n const result: Partial<Record<Domain, SkillId[]>> = {};\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n const techs: SkillId[] = [];\n for (const subcategory of typedKeys<Subcategory>(domainSel)) {\n const subTechs = domainSel[subcategory];\n if (subTechs) techs.push(...subTechs);\n }\n if (techs.length > 0) {\n result[domain] = techs;\n }\n }\n return result;\n },\n\n getCurrentDomain: () => {\n const state = get();\n return state.selectedDomains[state.currentDomainIndex] || null;\n },\n\n getDefaultMethodologySkills: () => {\n return [...DEFAULT_PRESELECTED_SKILLS];\n },\n\n getTechnologyCount: () => {\n return get().getAllSelectedTechnologies().length;\n },\n\n getStepProgress: () => {\n const state = get();\n const completed: WizardStep[] = [];\n const skipped: WizardStep[] = [];\n\n if (state.step !== \"stack\") {\n completed.push(\"stack\");\n }\n\n if (state.approach === \"stack\" && state.selectedStackId && state.stackAction === \"defaults\") {\n skipped.push(\"build\");\n skipped.push(\"sources\");\n skipped.push(\"agents\");\n } else if (state.step === \"confirm\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n completed.push(\"agents\");\n } else if (state.step === \"agents\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n } else if (state.step === \"sources\") {\n completed.push(\"build\");\n }\n\n return { completedSteps: completed, skippedSteps: skipped };\n },\n\n canGoToNextDomain: () => {\n const state = get();\n return state.currentDomainIndex < state.selectedDomains.length - 1;\n },\n\n canGoToPreviousDomain: () => {\n const state = get();\n return state.currentDomainIndex > 0;\n },\n\n buildSourceRows: (matrix) => {\n const state = get();\n const selectedTechnologies = get().getAllSelectedTechnologies();\n const { sourceSelections, boundSkills } = state;\n\n return selectedTechnologies.map((tech) => {\n const skillId = resolveAlias(tech, matrix);\n const skill = matrix.skills[skillId];\n const selectedSource =\n sourceSelections[skillId] || skill?.activeSource?.name || DEFAULT_PUBLIC_SOURCE_NAME;\n const alias = getSkillAlias(skillId, matrix);\n const displayLabel = skill ? getSkillDisplayLabel(skill) : skillId;\n\n const sortedSources = [...(skill?.availableSources || [])].sort(\n (a, b) => getSourceSortTier(a) - getSourceSortTier(b),\n );\n\n const options =\n sortedSources.length > 0\n ? sortedSources.map((source) => ({\n id: source.name,\n label: formatSourceLabel({\n name: source.name,\n version: source.version,\n installed: source.installed,\n }),\n selected: selectedSource === source.name,\n installed: source.installed,\n }))\n : [\n {\n id: DEFAULT_PUBLIC_SOURCE_NAME,\n label: DEFAULT_PUBLIC_SOURCE_NAME,\n selected: selectedSource === DEFAULT_PUBLIC_SOURCE_NAME,\n installed: false,\n },\n ];\n\n options.push(...buildBoundSkillOptions(boundSkills, alias, selectedSource));\n\n return { skillId, displayName: displayLabel, alias, options };\n });\n },\n}));\n"],"mappings":"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","names":[]}
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "./chunk-VAK5PX72.js";
4
+ } from "./chunk-DV4ALU5I.js";
5
5
  import {
6
6
  DomainSelection
7
- } from "./chunk-54ZZCWN4.js";
7
+ } from "./chunk-KC2SIUIA.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-HRMQ2RGY.js";
10
+ } from "./chunk-423MJ6DT.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-NFV4SKH5.js.map
29
+ //# sourceMappingURL=chunk-4LT6RXMY.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-ZBJQXDQN.js";
4
+ } from "./chunk-BK7TANUV.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -76,4 +76,4 @@ export {
76
76
  formatStepLabel,
77
77
  WizardTabs
78
78
  };
79
- //# sourceMappingURL=chunk-IVIK776Y.js.map
79
+ //# sourceMappingURL=chunk-4SYXPG7L.js.map
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SourceGrid
4
- } from "./chunk-EISBUEBL.js";
4
+ } from "./chunk-BFISETQG.js";
5
+ import {
6
+ ViewTitle
7
+ } from "./chunk-KXM7KOPE.js";
5
8
  import {
6
9
  useMeasuredHeight
7
10
  } from "./chunk-K77I4XGL.js";
8
- import {
9
- ViewTitle
10
- } from "./chunk-2XX4TMCI.js";
11
11
  import {
12
12
  useWizardStore
13
- } from "./chunk-HRMQ2RGY.js";
13
+ } from "./chunk-423MJ6DT.js";
14
14
  import {
15
15
  resolveAllSources,
16
16
  searchExtraSources
17
- } from "./chunk-U5OB5ADP.js";
17
+ } from "./chunk-TTXV55NQ.js";
18
18
  import {
19
19
  CLI_COLORS,
20
20
  DEFAULT_BRANDING
21
- } from "./chunk-ZBJQXDQN.js";
21
+ } from "./chunk-BK7TANUV.js";
22
22
  import {
23
23
  init_esm_shims
24
24
  } from "./chunk-DHET7RCE.js";
@@ -191,4 +191,4 @@ var StepSources = ({
191
191
  export {
192
192
  StepSources
193
193
  };
194
- //# sourceMappingURL=chunk-DUQFF45G.js.map
194
+ //# sourceMappingURL=chunk-4UTPJXUX.js.map
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDomainDisplayName
4
- } from "./chunk-MZB3GGOH.js";
4
+ } from "./chunk-YRVTXSXP.js";
5
5
  import {
6
6
  CLI_COLORS
7
- } from "./chunk-ZBJQXDQN.js";
7
+ } from "./chunk-BK7TANUV.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -81,4 +81,4 @@ var StepConfirm = ({
81
81
  export {
82
82
  StepConfirm
83
83
  };
84
- //# sourceMappingURL=chunk-3E2V5YL3.js.map
84
+ //# sourceMappingURL=chunk-5TMB53BV.js.map
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- useMeasuredHeight
4
- } from "./chunk-K77I4XGL.js";
5
2
  import {
6
3
  getDomainDisplayName
7
- } from "./chunk-MZB3GGOH.js";
4
+ } from "./chunk-YRVTXSXP.js";
8
5
  import {
9
6
  ViewTitle
10
- } from "./chunk-2XX4TMCI.js";
7
+ } from "./chunk-KXM7KOPE.js";
8
+ import {
9
+ useMeasuredHeight
10
+ } from "./chunk-K77I4XGL.js";
11
11
  import {
12
12
  CategoryGrid
13
- } from "./chunk-TA6IIQI4.js";
13
+ } from "./chunk-GEDWVX6Y.js";
14
14
  import {
15
15
  buildCategoriesForDomain,
16
16
  validateBuildStep
17
- } from "./chunk-WSGGJKD5.js";
17
+ } from "./chunk-SILUTTV7.js";
18
18
  import {
19
19
  CLI_COLORS
20
- } from "./chunk-ZBJQXDQN.js";
20
+ } from "./chunk-BK7TANUV.js";
21
21
  import {
22
22
  init_esm_shims
23
23
  } from "./chunk-DHET7RCE.js";
@@ -39,7 +39,6 @@ function useFrameworkFiltering({
39
39
  matrix,
40
40
  expertMode,
41
41
  selections,
42
- parentDomainSelections,
43
42
  installedSkillIds
44
43
  }) {
45
44
  return useMemo(
@@ -49,18 +48,9 @@ function useFrameworkFiltering({
49
48
  matrix,
50
49
  expertMode,
51
50
  selections,
52
- parentDomainSelections,
53
51
  installedSkillIds
54
52
  ),
55
- [
56
- domain,
57
- allSelections,
58
- matrix,
59
- expertMode,
60
- selections,
61
- parentDomainSelections,
62
- installedSkillIds
63
- ]
53
+ [domain, allSelections, matrix, expertMode, selections, installedSkillIds]
64
54
  );
65
55
  }
66
56
 
@@ -80,7 +70,6 @@ var StepBuild = ({
80
70
  allSelections,
81
71
  showLabels,
82
72
  expertMode,
83
- parentDomainSelections,
84
73
  installedSkillIds,
85
74
  onToggle,
86
75
  onToggleLabels,
@@ -95,7 +84,6 @@ var StepBuild = ({
95
84
  matrix,
96
85
  expertMode,
97
86
  selections,
98
- parentDomainSelections,
99
87
  installedSkillIds
100
88
  });
101
89
  useInput((_input, key) => {
@@ -153,4 +141,4 @@ var StepBuild = ({
153
141
  export {
154
142
  StepBuild
155
143
  };
156
- //# sourceMappingURL=chunk-NI2RSNWB.js.map
144
+ //# sourceMappingURL=chunk-7FBM7V3E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/step-build.tsx","../src/cli/lib/wizard/index.ts","../src/cli/components/hooks/use-framework-filtering.ts"],"sourcesContent":["import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type {\n Domain,\n MergedSkillsMatrix,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../../types/index.js\";\nimport { validateBuildStep } from \"../../lib/wizard/index.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { useFrameworkFiltering } from \"../hooks/use-framework-filtering.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { CategoryGrid } from \"./category-grid.js\";\nimport { ViewTitle } from \"./view-title.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\n\nexport type StepBuildProps = {\n matrix: MergedSkillsMatrix;\n domain: Domain;\n selectedDomains: Domain[];\n selections: SubcategorySelections;\n allSelections: SkillId[];\n showLabels: boolean;\n expertMode: boolean;\n /** Skill IDs already installed on disk, shown with a dimmed checkmark */\n installedSkillIds?: SkillId[];\n onToggle: (subcategoryId: Subcategory, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n onContinue: () => void;\n onBack: () => void;\n};\n\ntype FooterProps = {\n validationError?: string;\n};\n\nconst Footer: React.FC<FooterProps> = ({ validationError }) => {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {validationError && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={CLI_COLORS.WARNING}>{validationError}</Text>\n <Text dimColor>Press ESC to go back, or select a skill and press ENTER to continue.</Text>\n </Box>\n )}\n </Box>\n );\n};\n\nexport const StepBuild: React.FC<StepBuildProps> = ({\n matrix,\n domain: activeDomain,\n selectedDomains,\n selections,\n allSelections,\n showLabels,\n expertMode,\n installedSkillIds,\n onToggle,\n onToggleLabels,\n onContinue,\n onBack,\n}) => {\n const [validationError, setValidationError] = useState<string | undefined>(undefined);\n const { ref: gridRef, measuredHeight: gridHeight } = useMeasuredHeight();\n\n const categories = useFrameworkFiltering({\n domain: activeDomain,\n allSelections,\n matrix,\n expertMode,\n selections,\n installedSkillIds,\n });\n\n useInput((_input, key) => {\n if (key.return) {\n const validation = validateBuildStep(categories, selections);\n if (validation.valid) {\n setValidationError(undefined);\n onContinue();\n } else {\n setValidationError(validation.message);\n }\n } else if (key.escape) {\n setValidationError(undefined);\n onBack();\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" flexGrow={1} flexBasis={0}>\n <Box\n columnGap={2}\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n marginBottom={1}\n paddingRight={1}\n marginTop={-1}\n borderTop={false}\n borderRight={false}\n borderLeft={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderStyle=\"single\"\n >\n <Box columnGap={2} flexDirection=\"row\">\n {selectedDomains.map((domain) => {\n const isActive = domain === activeDomain;\n return (\n <Text key={domain} color={isActive ? CLI_COLORS.PRIMARY : undefined} bold={isActive}>\n {getDomainDisplayName(domain)}\n </Text>\n );\n })}\n </Box>\n </Box>\n <ViewTitle>{`[2] Customize your ${getDomainDisplayName(activeDomain)} stack`}</ViewTitle>\n\n <Box ref={gridRef} flexGrow={1} flexBasis={0}>\n <CategoryGrid\n key={activeDomain}\n categories={categories}\n availableHeight={gridHeight}\n expertMode={expertMode}\n showLabels={showLabels}\n onToggle={onToggle}\n onToggleLabels={onToggleLabels}\n />\n </Box>\n\n <Footer validationError={validationError} />\n </Box>\n );\n};\n","export {\n type BuildStepValidation,\n validateBuildStep,\n computeOptionState,\n getSkillDisplayLabel,\n buildCategoriesForDomain,\n} from \"./build-step-logic\";\n","import { useMemo } from \"react\";\nimport type {\n Domain,\n MergedSkillsMatrix,\n SkillId,\n SubcategorySelections,\n} from \"../../types/index.js\";\nimport { buildCategoriesForDomain } from \"../../lib/wizard/index.js\";\nimport type { CategoryRow } from \"../wizard/category-grid.js\";\n\ntype UseFrameworkFilteringOptions = {\n domain: Domain;\n allSelections: SkillId[];\n matrix: MergedSkillsMatrix;\n expertMode: boolean;\n selections: SubcategorySelections;\n installedSkillIds?: SkillId[];\n};\n\nexport function useFrameworkFiltering({\n domain,\n allSelections,\n matrix,\n expertMode,\n selections,\n installedSkillIds,\n}: UseFrameworkFilteringOptions): CategoryRow[] {\n return useMemo(\n () =>\n buildCategoriesForDomain(\n domain,\n allSelections,\n matrix,\n expertMode,\n selections,\n installedSkillIds,\n ),\n [domain, allSelections, matrix, expertMode, selections, installedSkillIds],\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,gBAAgB;AAChC,SAAS,KAAK,MAAM,gBAAgB;;;ACDpC;;;ACAA;AAAA,SAAS,eAAe;AAmBjB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,SAAO;AAAA,IACL,MACE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACF,CAAC,QAAQ,eAAe,QAAQ,YAAY,YAAY,iBAAiB;AAAA,EAC3E;AACF;;;AFEQ,SACE,KADF;AAJR,IAAM,SAAgC,CAAC,EAAE,gBAAgB,MAAM;AAC7D,SACE,oBAAC,OAAI,eAAc,UAAS,WAAW,GACpC,6BACC,qBAAC,OAAI,eAAc,UAAS,cAAc,GACxC;AAAA,wBAAC,QAAK,OAAO,WAAW,SAAU,2BAAgB;AAAA,IAClD,oBAAC,QAAK,UAAQ,MAAC,kFAAoE;AAAA,KACrF,GAEJ;AAEJ;AAEO,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA6B,MAAS;AACpF,QAAM,EAAE,KAAK,SAAS,gBAAgB,WAAW,IAAI,kBAAkB;AAEvE,QAAM,aAAa,sBAAsB;AAAA,IACvC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ;AACd,YAAM,aAAa,kBAAkB,YAAY,UAAU;AAC3D,UAAI,WAAW,OAAO;AACpB,2BAAmB,MAAS;AAC5B,mBAAW;AAAA,MACb,OAAO;AACL,2BAAmB,WAAW,OAAO;AAAA,MACvC;AAAA,IACF,WAAW,IAAI,QAAQ;AACrB,yBAAmB,MAAS;AAC5B,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SACE,qBAAC,OAAI,eAAc,UAAS,OAAM,QAAO,UAAU,GAAG,WAAW,GAC/D;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,cAAc;AAAA,QACd,cAAc;AAAA,QACd,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,WAAW;AAAA,QACxB,aAAY;AAAA,QAEZ,8BAAC,OAAI,WAAW,GAAG,eAAc,OAC9B,0BAAgB,IAAI,CAAC,WAAW;AAC/B,gBAAM,WAAW,WAAW;AAC5B,iBACE,oBAAC,QAAkB,OAAO,WAAW,WAAW,UAAU,QAAW,MAAM,UACxE,+BAAqB,MAAM,KADnB,MAEX;AAAA,QAEJ,CAAC,GACH;AAAA;AAAA,IACF;AAAA,IACA,oBAAC,aAAW,gCAAsB,qBAAqB,YAAY,CAAC,UAAS;AAAA,IAE7E,oBAAC,OAAI,KAAK,SAAS,UAAU,GAAG,WAAW,GACzC;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MANK;AAAA,IAOP,GACF;AAAA,IAEA,oBAAC,UAAO,iBAAkC;AAAA,KAC5C;AAEJ;","names":[]}