@agents-inc/cli 0.47.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +113 -118
  3. package/config/skill-categories.yaml +344 -0
  4. package/config/skill-rules.yaml +740 -0
  5. package/config/stacks.yaml +0 -1
  6. package/dist/{chunk-CJFWO46A.js → chunk-26MXZUHU.js} +2 -2
  7. package/dist/{chunk-KQ27IDYL.js → chunk-2BWCR762.js} +2 -3
  8. package/dist/chunk-2BWCR762.js.map +1 -0
  9. package/dist/chunk-3VOL4WEG.js +31 -0
  10. package/dist/chunk-3VOL4WEG.js.map +1 -0
  11. package/dist/chunk-4QWDB2MD.js +571 -0
  12. package/dist/chunk-4QWDB2MD.js.map +1 -0
  13. package/dist/{chunk-LJ5E4GXC.js → chunk-4R52TQ3K.js} +2 -2
  14. package/dist/{chunk-SPSGZWTZ.js → chunk-5FCHJLM7.js} +34 -16
  15. package/dist/chunk-5FCHJLM7.js.map +1 -0
  16. package/dist/chunk-5FPIKTSA.js +40 -0
  17. package/dist/chunk-5FPIKTSA.js.map +1 -0
  18. package/dist/{chunk-HLTJK3XB.js → chunk-5L724R4C.js} +5 -6
  19. package/dist/{chunk-HLTJK3XB.js.map → chunk-5L724R4C.js.map} +1 -1
  20. package/dist/{chunk-JTTTXGHX.js → chunk-7LV4V6A4.js} +4 -4
  21. package/dist/{chunk-FTD5Z6QD.js → chunk-AWP5A6IM.js} +15 -7
  22. package/dist/chunk-AWP5A6IM.js.map +1 -0
  23. package/dist/chunk-C3Q43WLC.js +118 -0
  24. package/dist/chunk-C3Q43WLC.js.map +1 -0
  25. package/dist/{chunk-B4QYXVPZ.js → chunk-CMNKHDOX.js} +2 -2
  26. package/dist/{chunk-TBB3THSL.js → chunk-D72AFYQR.js} +8 -13
  27. package/dist/chunk-D72AFYQR.js.map +1 -0
  28. package/dist/{chunk-QR2TM4OY.js → chunk-DCE423KO.js} +46 -30
  29. package/dist/chunk-DCE423KO.js.map +1 -0
  30. package/dist/chunk-GBOW6FUW.js +74 -0
  31. package/dist/chunk-GBOW6FUW.js.map +1 -0
  32. package/dist/{chunk-GFDGYQ6M.js → chunk-HMSHB5EQ.js} +569 -269
  33. package/dist/chunk-HMSHB5EQ.js.map +1 -0
  34. package/dist/{chunk-NRCKIHND.js → chunk-HYEUETIC.js} +2 -2
  35. package/dist/{chunk-OEJDFGAF.js → chunk-I6IOGZSZ.js} +61 -52
  36. package/dist/chunk-I6IOGZSZ.js.map +1 -0
  37. package/dist/{chunk-3APMMQUA.js → chunk-JFF7P4LC.js} +30 -93
  38. package/dist/chunk-JFF7P4LC.js.map +1 -0
  39. package/dist/{chunk-N5OCAAXY.js → chunk-JWYRXE6C.js} +2 -2
  40. package/dist/{chunk-TWDVLTU6.js → chunk-KAO3LKB5.js} +3 -3
  41. package/dist/{chunk-XTRPYUWK.js → chunk-KQOU4POU.js} +26 -28
  42. package/dist/chunk-KQOU4POU.js.map +1 -0
  43. package/dist/{chunk-YTRFL3MR.js → chunk-M3GQ2R3E.js} +29 -28
  44. package/dist/chunk-M3GQ2R3E.js.map +1 -0
  45. package/dist/{chunk-LNA6M2IE.js → chunk-PGY5XROM.js} +2 -2
  46. package/dist/chunk-PGY5XROM.js.map +1 -0
  47. package/dist/{chunk-VAQJLHUW.js → chunk-QB5HHTAA.js} +8 -19
  48. package/dist/chunk-QB5HHTAA.js.map +1 -0
  49. package/dist/{chunk-VSZ5GDET.js → chunk-QYLCINGC.js} +2 -2
  50. package/dist/{chunk-IRJADQM7.js → chunk-RA2IPRO2.js} +2 -2
  51. package/dist/{chunk-DC333ZDC.js → chunk-RDWGYKDY.js} +4 -4
  52. package/dist/{chunk-FXQYEXLS.js → chunk-RFKDGJAJ.js} +26 -57
  53. package/dist/chunk-RFKDGJAJ.js.map +1 -0
  54. package/dist/{chunk-HPJP3HFD.js → chunk-SPFHPHYL.js} +7 -7
  55. package/dist/{chunk-EZ46ZTAQ.js → chunk-U2W5SENM.js} +3 -3
  56. package/dist/{chunk-MVEYK55V.js → chunk-U7X4V4HE.js} +2 -2
  57. package/dist/{chunk-INKJBMPJ.js → chunk-UAD3SC27.js} +4 -12
  58. package/dist/chunk-UAD3SC27.js.map +1 -0
  59. package/dist/{chunk-C4QI54PN.js → chunk-WBHPCBVN.js} +57 -34
  60. package/dist/chunk-WBHPCBVN.js.map +1 -0
  61. package/dist/chunk-WFFV254H.js +314 -0
  62. package/dist/chunk-WFFV254H.js.map +1 -0
  63. package/dist/{chunk-ZWAL2ZY7.js → chunk-WJHFV6RI.js} +3 -2
  64. package/dist/chunk-WJHFV6RI.js.map +1 -0
  65. package/dist/{chunk-2RQYJFKA.js → chunk-WLZHCM7O.js} +2 -2
  66. package/dist/{chunk-DVW6ASTO.js → chunk-XDSVV5GZ.js} +4 -4
  67. package/dist/{chunk-JZHIF3K7.js → chunk-YDYRAXSY.js} +57 -27
  68. package/dist/chunk-YDYRAXSY.js.map +1 -0
  69. package/dist/commands/build/marketplace.js +4 -4
  70. package/dist/commands/build/plugins.js +5 -5
  71. package/dist/commands/build/stack.js +5 -5
  72. package/dist/commands/compile.js +11 -9
  73. package/dist/commands/compile.js.map +1 -1
  74. package/dist/commands/config/get.js +4 -4
  75. package/dist/commands/config/index.js +5 -5
  76. package/dist/commands/config/path.js +4 -4
  77. package/dist/commands/config/set-project.js +4 -4
  78. package/dist/commands/config/show.js +5 -5
  79. package/dist/commands/config/unset-project.js +4 -4
  80. package/dist/commands/diff.js +4 -4
  81. package/dist/commands/doctor.js +4 -4
  82. package/dist/commands/edit.js +58 -52
  83. package/dist/commands/edit.js.map +1 -1
  84. package/dist/commands/eject.js +4 -4
  85. package/dist/commands/import/skill.js +7 -8
  86. package/dist/commands/import/skill.js.map +1 -1
  87. package/dist/commands/info.js +5 -5
  88. package/dist/commands/init.js +40 -435
  89. package/dist/commands/init.js.map +1 -1
  90. package/dist/commands/list.js +4 -4
  91. package/dist/commands/new/agent.js +11 -10
  92. package/dist/commands/new/agent.js.map +1 -1
  93. package/dist/commands/new/marketplace.js +24 -5
  94. package/dist/commands/new/marketplace.js.map +1 -1
  95. package/dist/commands/new/skill.js +15 -209
  96. package/dist/commands/new/skill.js.map +1 -1
  97. package/dist/commands/outdated.js +11 -7
  98. package/dist/commands/outdated.js.map +1 -1
  99. package/dist/commands/search.js +7 -8
  100. package/dist/commands/search.js.map +1 -1
  101. package/dist/commands/uninstall.js +6 -6
  102. package/dist/commands/update.js +6 -6
  103. package/dist/commands/validate.js +62 -250
  104. package/dist/commands/validate.js.map +1 -1
  105. package/dist/components/skill-search/skill-search.js +3 -3
  106. package/dist/components/wizard/category-grid.js +3 -2
  107. package/dist/components/wizard/category-grid.test.js +112 -58
  108. package/dist/components/wizard/category-grid.test.js.map +1 -1
  109. package/dist/components/wizard/checkbox-grid.js +5 -3
  110. package/dist/components/wizard/checkbox-grid.test.js +5 -4
  111. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  112. package/dist/components/wizard/domain-selection.js +11 -9
  113. package/dist/components/wizard/help-modal.js +2 -2
  114. package/dist/components/wizard/menu-item.js +1 -1
  115. package/dist/components/wizard/search-modal.js +2 -2
  116. package/dist/components/wizard/search-modal.test.js +2 -2
  117. package/dist/components/wizard/section-progress.js +2 -2
  118. package/dist/components/wizard/section-progress.test.js +2 -2
  119. package/dist/components/wizard/selection-card.js +2 -2
  120. package/dist/components/wizard/source-grid.js +4 -3
  121. package/dist/components/wizard/source-grid.test.js +4 -3
  122. package/dist/components/wizard/source-grid.test.js.map +1 -1
  123. package/dist/components/wizard/stack-selection.js +8 -8
  124. package/dist/components/wizard/step-agents.js +10 -8
  125. package/dist/components/wizard/step-agents.test.js +18 -17
  126. package/dist/components/wizard/step-agents.test.js.map +1 -1
  127. package/dist/components/wizard/step-build.js +9 -8
  128. package/dist/components/wizard/step-build.test.js +17 -35
  129. package/dist/components/wizard/step-build.test.js.map +1 -1
  130. package/dist/components/wizard/step-confirm.js +4 -4
  131. package/dist/components/wizard/step-confirm.test.js +8 -8
  132. package/dist/components/wizard/step-refine.js +2 -2
  133. package/dist/components/wizard/step-refine.test.js +2 -2
  134. package/dist/components/wizard/step-settings.js +7 -5
  135. package/dist/components/wizard/step-settings.test.js +10 -8
  136. package/dist/components/wizard/step-settings.test.js.map +1 -1
  137. package/dist/components/wizard/step-sources.js +11 -10
  138. package/dist/components/wizard/step-sources.test.js +12 -11
  139. package/dist/components/wizard/step-sources.test.js.map +1 -1
  140. package/dist/components/wizard/step-stack.js +15 -12
  141. package/dist/components/wizard/step-stack.test.js +16 -13
  142. package/dist/components/wizard/step-stack.test.js.map +1 -1
  143. package/dist/components/wizard/view-title.js +2 -2
  144. package/dist/components/wizard/wizard-layout.js +8 -8
  145. package/dist/components/wizard/wizard-tabs.js +2 -2
  146. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  147. package/dist/components/wizard/wizard.js +27 -25
  148. package/dist/config/skill-categories.yaml +344 -0
  149. package/dist/config/skill-rules.yaml +740 -0
  150. package/dist/config/stacks.yaml +0 -1
  151. package/dist/hooks/init.js +55 -3
  152. package/dist/hooks/init.js.map +1 -1
  153. package/dist/{source-manager-Q34LTUVM.js → source-manager-BVB2SG73.js} +4 -4
  154. package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  155. package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  156. package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
  157. package/dist/src/agents/meta/agent-summoner/output-format.md +1 -1
  158. package/dist/src/agents/meta/agent-summoner/workflow.md +5 -7
  159. package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
  160. package/dist/stores/wizard-store.js +5 -5
  161. package/dist/stores/wizard-store.test.js +79 -27
  162. package/dist/stores/wizard-store.test.js.map +1 -1
  163. package/package.json +5 -1
  164. package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  165. package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  166. package/src/agents/meta/agent-summoner/examples.md +2 -2
  167. package/src/agents/meta/agent-summoner/output-format.md +1 -1
  168. package/src/agents/meta/agent-summoner/workflow.md +5 -7
  169. package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
  170. package/src/schemas/agent.schema.json +1 -1
  171. package/src/schemas/metadata.schema.json +2 -5
  172. package/src/schemas/project-config.schema.json +0 -3
  173. package/src/schemas/project-source-config.schema.json +4 -1
  174. package/config/skills-matrix.yaml +0 -918
  175. package/dist/chunk-3APMMQUA.js.map +0 -1
  176. package/dist/chunk-C4QI54PN.js.map +0 -1
  177. package/dist/chunk-FMQ3A7W4.js +0 -29
  178. package/dist/chunk-FMQ3A7W4.js.map +0 -1
  179. package/dist/chunk-FTD5Z6QD.js.map +0 -1
  180. package/dist/chunk-FXQYEXLS.js.map +0 -1
  181. package/dist/chunk-GFDGYQ6M.js.map +0 -1
  182. package/dist/chunk-INKJBMPJ.js.map +0 -1
  183. package/dist/chunk-JZHIF3K7.js.map +0 -1
  184. package/dist/chunk-KQ27IDYL.js.map +0 -1
  185. package/dist/chunk-LNA6M2IE.js.map +0 -1
  186. package/dist/chunk-M4P5YJ45.js +0 -99
  187. package/dist/chunk-M4P5YJ45.js.map +0 -1
  188. package/dist/chunk-OEJDFGAF.js.map +0 -1
  189. package/dist/chunk-QR2TM4OY.js.map +0 -1
  190. package/dist/chunk-SPSGZWTZ.js.map +0 -1
  191. package/dist/chunk-TBB3THSL.js.map +0 -1
  192. package/dist/chunk-VAQJLHUW.js.map +0 -1
  193. package/dist/chunk-XTRPYUWK.js.map +0 -1
  194. package/dist/chunk-YTRFL3MR.js.map +0 -1
  195. package/dist/chunk-ZWAL2ZY7.js.map +0 -1
  196. package/dist/config/skills-matrix.yaml +0 -918
  197. package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
  198. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  199. package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  200. package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  201. package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  202. package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
  203. package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
  204. package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
  205. package/src/agents/migration/cli-migrator/agent.yaml +0 -12
  206. package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  207. package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  208. package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  209. package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  210. package/src/agents/migration/cli-migrator/intro.md +0 -15
  211. package/src/agents/migration/cli-migrator/output-format.md +0 -164
  212. package/src/agents/migration/cli-migrator/workflow.md +0 -230
  213. package/src/schemas/skills-matrix.schema.json +0 -179
  214. /package/dist/{chunk-CJFWO46A.js.map → chunk-26MXZUHU.js.map} +0 -0
  215. /package/dist/{chunk-LJ5E4GXC.js.map → chunk-4R52TQ3K.js.map} +0 -0
  216. /package/dist/{chunk-JTTTXGHX.js.map → chunk-7LV4V6A4.js.map} +0 -0
  217. /package/dist/{chunk-B4QYXVPZ.js.map → chunk-CMNKHDOX.js.map} +0 -0
  218. /package/dist/{chunk-NRCKIHND.js.map → chunk-HYEUETIC.js.map} +0 -0
  219. /package/dist/{chunk-N5OCAAXY.js.map → chunk-JWYRXE6C.js.map} +0 -0
  220. /package/dist/{chunk-TWDVLTU6.js.map → chunk-KAO3LKB5.js.map} +0 -0
  221. /package/dist/{chunk-VSZ5GDET.js.map → chunk-QYLCINGC.js.map} +0 -0
  222. /package/dist/{chunk-IRJADQM7.js.map → chunk-RA2IPRO2.js.map} +0 -0
  223. /package/dist/{chunk-DC333ZDC.js.map → chunk-RDWGYKDY.js.map} +0 -0
  224. /package/dist/{chunk-HPJP3HFD.js.map → chunk-SPFHPHYL.js.map} +0 -0
  225. /package/dist/{chunk-EZ46ZTAQ.js.map → chunk-U2W5SENM.js.map} +0 -0
  226. /package/dist/{chunk-MVEYK55V.js.map → chunk-U7X4V4HE.js.map} +0 -0
  227. /package/dist/{chunk-2RQYJFKA.js.map → chunk-WLZHCM7O.js.map} +0 -0
  228. /package/dist/{chunk-DVW6ASTO.js.map → chunk-XDSVV5GZ.js.map} +0 -0
  229. /package/dist/{source-manager-Q34LTUVM.js.map → source-manager-BVB2SG73.js.map} +0 -0
  230. /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  231. /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  232. /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  233. /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  234. /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  235. /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  236. /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  237. /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  238. /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  239. /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  240. /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  241. /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  242. /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  243. /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  244. /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  245. /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
  246. /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  247. /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  248. /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  249. /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  250. /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  251. /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  252. /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  253. /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  254. /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  255. /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  256. /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  257. /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  258. /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  259. /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  260. /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  261. /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
@@ -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 Domain,\n DomainSelections,\n MergedSkillsMatrix,\n SkillId,\n} from \"../../types/index.js\";\nimport { getStackName } from \"./utils.js\";\nimport { warn, type StartupMessage } 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 selectedDomains: Domain[];\n sourceSelections: Partial<Record<SkillId, string>>;\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 initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n projectDir?: string;\n startupMessages?: StartupMessage[];\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 initialDomains,\n initialAgents,\n installedSkillIds,\n projectDir,\n startupMessages,\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 initialDomains,\n initialAgents,\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 === \"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 selectedDomains: store.selectedDomains,\n sourceSelections: store.sourceSelections,\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 if (!initialAgents?.length) {\n store.preselectAgentsFromDomains();\n }\n store.setStep(\"agents\");\n }}\n onBack={store.goBack}\n />\n );\n }\n\n case \"agents\":\n return <StepAgents matrix={matrix} />;\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\n version={version}\n marketplaceLabel={marketplaceLabel}\n logo={logo}\n startupMessages={startupMessages}\n >\n {renderStep()}\n </WizardLayout>\n </ThemeProvider>\n );\n};\n","import { useRef } from \"react\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport type { AgentName, Domain, MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\n\ntype UseWizardInitializationOptions = {\n matrix: MergedSkillsMatrix;\n initialStep?: WizardStep;\n initialInstallMode?: \"plugin\" | \"local\";\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\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 initialDomains,\n initialAgents,\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 // Restore saved domains from config, overriding the domains\n // derived by populateFromSkillIds\n if (initialDomains?.length) {\n useWizardStore.setState({ selectedDomains: initialDomains });\n }\n // Restore saved agents from config, overriding the default empty array\n if (initialAgents?.length) {\n useWizardStore.setState({ selectedAgents: initialAgents });\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 installedSkillIds,\n onToggle,\n onToggleLabels: store.toggleShowLabels,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -4,21 +4,23 @@ import {
4
4
  } from "./chunk-K77I4XGL.js";
5
5
  import {
6
6
  getDomainDisplayName
7
- } from "./chunk-NRCKIHND.js";
7
+ } from "./chunk-HYEUETIC.js";
8
+ import {
9
+ useRowScroll
10
+ } from "./chunk-3VOL4WEG.js";
8
11
  import {
9
12
  ViewTitle
10
- } from "./chunk-B4QYXVPZ.js";
13
+ } from "./chunk-CMNKHDOX.js";
11
14
  import {
12
15
  useWizardStore
13
- } from "./chunk-SPSGZWTZ.js";
16
+ } from "./chunk-5FCHJLM7.js";
14
17
  import {
15
18
  typedKeys
16
19
  } from "./chunk-T4EXUIBY.js";
17
20
  import {
18
21
  CLI_COLORS,
19
- SCROLL_VIEWPORT,
20
22
  UI_SYMBOLS
21
- } from "./chunk-FTD5Z6QD.js";
23
+ } from "./chunk-AWP5A6IM.js";
22
24
  import {
23
25
  init_esm_shims
24
26
  } from "./chunk-DHET7RCE.js";
@@ -26,7 +28,7 @@ import {
26
28
  // src/cli/components/wizard/step-agents.tsx
27
29
  init_esm_shims();
28
30
  import { Box, Text, useInput } from "ink";
29
- import { useMemo, useRef, useState } from "react";
31
+ import { useMemo, useState } from "react";
30
32
  import { jsx, jsxs } from "react/jsx-runtime";
31
33
  var BUILT_IN_AGENT_GROUPS = [
32
34
  {
@@ -78,8 +80,7 @@ var BUILT_IN_AGENT_GROUPS = [
78
80
  description: "CLI commands, interactive prompts"
79
81
  },
80
82
  { id: "cli-tester", label: "CLI Tester", description: "CLI application tests" },
81
- { id: "cli-reviewer", label: "CLI Reviewer", description: "CLI code review" },
82
- { id: "cli-migrator", label: "CLI Migrator", description: "Commander.js to oclif migration" }
83
+ { id: "cli-reviewer", label: "CLI Reviewer", description: "CLI code review" }
83
84
  ]
84
85
  },
85
86
  {
@@ -153,20 +154,12 @@ var StepAgents = ({ matrix }) => {
153
154
  const focusableIds = useMemo(() => buildFocusableIds(agentGroups), [agentGroups]);
154
155
  const [focusedId, setFocusedId] = useState(focusableIds[0]);
155
156
  const { ref: listRef, measuredHeight: listHeight } = useMeasuredHeight();
156
- const scrollTopRef = useRef(0);
157
- const scrollEnabled = listHeight > 0 && listHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;
158
- if (scrollEnabled && focusedId !== "continue") {
159
- const rowIndex = flatRows.findIndex(
160
- (row) => row.type === "agent" && row.agent.id === focusedId
161
- );
162
- if (rowIndex >= 0) {
163
- if (rowIndex < scrollTopRef.current) {
164
- scrollTopRef.current = rowIndex;
165
- } else if (rowIndex + 1 > scrollTopRef.current + listHeight) {
166
- scrollTopRef.current = rowIndex + 1 - listHeight;
167
- }
168
- }
169
- }
157
+ const focusedRowIndex = focusedId !== "continue" ? flatRows.findIndex((row) => row.type === "agent" && row.agent.id === focusedId) : -1;
158
+ const { scrollEnabled, scrollTop } = useRowScroll({
159
+ focusedIndex: Math.max(0, focusedRowIndex),
160
+ itemCount: flatRows.length,
161
+ availableHeight: listHeight
162
+ });
170
163
  useInput((input, key) => {
171
164
  if (key.escape) {
172
165
  store.goBack();
@@ -233,15 +226,23 @@ var StepAgents = ({ matrix }) => {
233
226
  });
234
227
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: "100%", flexGrow: 1, flexBasis: 0, children: [
235
228
  /* @__PURE__ */ jsx(ViewTitle, { children: "Select agents to compile:" }),
236
- !scrollEnabled ? /* @__PURE__ */ jsx(Box, { ref: listRef, flexDirection: "column", flexGrow: 1, flexBasis: 0, overflow: "hidden", children: rowElements }) : /* @__PURE__ */ jsx(Box, { ref: listRef, flexDirection: "column", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", overflow: "hidden", flexGrow: 1, children: /* @__PURE__ */ jsx(
229
+ /* @__PURE__ */ jsx(Box, { ref: listRef, flexDirection: "column", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(
237
230
  Box,
238
231
  {
239
232
  flexDirection: "column",
240
- marginTop: scrollTopRef.current > 0 ? -scrollTopRef.current : 0,
241
- flexShrink: 0,
242
- children: rowElements
233
+ flexGrow: 1,
234
+ ...scrollEnabled && { overflow: "hidden" },
235
+ children: /* @__PURE__ */ jsx(
236
+ Box,
237
+ {
238
+ flexDirection: "column",
239
+ marginTop: scrollTop > 0 ? -scrollTop : 0,
240
+ ...scrollEnabled && { flexShrink: 0 },
241
+ children: rowElements
242
+ }
243
+ )
243
244
  }
244
- ) }) }),
245
+ ) }),
245
246
  /* @__PURE__ */ jsxs(Text, { color: isContinueFocused ? CLI_COLORS.PRIMARY : void 0, bold: isContinueFocused, children: [
246
247
  isContinueFocused ? UI_SYMBOLS.CURRENT : " ",
247
248
  " ",
@@ -255,4 +256,4 @@ var StepAgents = ({ matrix }) => {
255
256
  export {
256
257
  StepAgents
257
258
  };
258
- //# sourceMappingURL=chunk-YTRFL3MR.js.map
259
+ //# sourceMappingURL=chunk-M3GQ2R3E.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, useState } from \"react\";\nimport { CLI_COLORS, UI_SYMBOLS } from \"../../consts.js\";\nimport { useRowScroll } from \"../hooks/use-row-scroll.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 ],\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 metadata.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 focusedRowIndex =\n focusedId !== \"continue\"\n ? flatRows.findIndex((row) => row.type === \"agent\" && row.agent.id === focusedId)\n : -1;\n const { scrollEnabled, scrollTop } = useRowScroll({\n focusedIndex: Math.max(0, focusedRowIndex),\n itemCount: flatRows.length,\n availableHeight: listHeight,\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 <Box ref={listRef} flexDirection=\"column\" flexGrow={1} flexBasis={0}>\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n {...(scrollEnabled && { overflow: \"hidden\" as const })}\n >\n <Box\n flexDirection=\"column\"\n marginTop={scrollTop > 0 ? -scrollTop : 0}\n {...(scrollEnabled && { flexShrink: 0 })}\n >\n {rowElements}\n </Box>\n </Box>\n </Box>\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":[]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getErrorMessage
4
- } from "./chunk-C4QI54PN.js";
4
+ } from "./chunk-WBHPCBVN.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-LNA6M2IE.js.map
56
+ //# sourceMappingURL=chunk-PGY5XROM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/exit-codes.ts","../src/cli/base-command.ts"],"sourcesContent":["export const EXIT_CODES = {\n SUCCESS: 0,\n ERROR: 1,\n INVALID_ARGS: 2,\n NETWORK_ERROR: 3,\n CANCELLED: 4,\n} as const;\n","import { Command, Flags } from \"@oclif/core\";\nimport { getErrorMessage } from \"./utils/errors.js\";\nimport { EXIT_CODES } from \"./lib/exit-codes.js\";\nimport type { ResolvedConfig } from \"./lib/configuration/index.js\";\n\n/** Narrow interface for the sourceConfig we attach to oclif's Config in the init hook. */\nexport interface ConfigWithSource {\n sourceConfig?: ResolvedConfig;\n}\n\nexport abstract class BaseCommand extends Command {\n static baseFlags = {\n \"dry-run\": Flags.boolean({\n description: \"Preview operations without executing\",\n default: false,\n }),\n source: Flags.string({\n char: \"s\",\n description: \"Skills source path or URL\",\n required: false,\n }),\n };\n\n public get sourceConfig(): ResolvedConfig | undefined {\n // Boundary cast: oclif Config doesn't declare sourceConfig; we attach it in the init hook\n return (this.config as unknown as ConfigWithSource).sourceConfig;\n }\n\n protected handleError(error: unknown): never {\n const message = getErrorMessage(error);\n this.error(message, { exit: EXIT_CODES.ERROR });\n }\n\n protected logSuccess(message: string): void {\n this.log(`✓ ${message}`);\n }\n\n protected logWarning(message: string): void {\n this.warn(message);\n }\n\n protected logInfo(message: string): void {\n this.log(message);\n }\n}\n"],"mappings":";;;;;;;;;AAAA;AAAO,IAAM,aAAa;AAAA,EACxB,SAAS;AAAA,EACT,OAAO;AAAA,EACP,cAAc;AAAA,EACd,eAAe;AAAA,EACf,WAAW;AACb;;;ACNA;AAAA,SAAS,SAAS,aAAa;AAUxB,IAAe,cAAf,cAAmC,QAAQ;AAAA,EAChD,OAAO,YAAY;AAAA,IACjB,WAAW,MAAM,QAAQ;AAAA,MACvB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,IAAW,eAA2C;AAEpD,WAAQ,KAAK,OAAuC;AAAA,EACtD;AAAA,EAEU,YAAY,OAAuB;AAC3C,UAAM,UAAU,gBAAgB,KAAK;AACrC,SAAK,MAAM,SAAS,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,EAChD;AAAA,EAEU,WAAW,SAAuB;AAC1C,SAAK,IAAI,UAAK,OAAO,EAAE;AAAA,EACzB;AAAA,EAEU,WAAW,SAAuB;AAC1C,SAAK,KAAK,OAAO;AAAA,EACnB;AAAA,EAEU,QAAQ,SAAuB;AACvC,SAAK,IAAI,OAAO;AAAA,EAClB;AACF;","names":[]}
@@ -4,21 +4,21 @@ import {
4
4
  } from "./chunk-K77I4XGL.js";
5
5
  import {
6
6
  CategoryGrid
7
- } from "./chunk-3APMMQUA.js";
7
+ } from "./chunk-JFF7P4LC.js";
8
8
  import {
9
9
  getDomainDisplayName,
10
10
  orderDomains
11
- } from "./chunk-NRCKIHND.js";
11
+ } from "./chunk-HYEUETIC.js";
12
12
  import {
13
13
  ViewTitle
14
- } from "./chunk-B4QYXVPZ.js";
14
+ } from "./chunk-CMNKHDOX.js";
15
15
  import {
16
16
  buildCategoriesForDomain,
17
17
  validateBuildStep
18
- } from "./chunk-INKJBMPJ.js";
18
+ } from "./chunk-UAD3SC27.js";
19
19
  import {
20
20
  CLI_COLORS
21
- } from "./chunk-FTD5Z6QD.js";
21
+ } from "./chunk-AWP5A6IM.js";
22
22
  import {
23
23
  init_esm_shims
24
24
  } from "./chunk-DHET7RCE.js";
@@ -38,20 +38,12 @@ function useFrameworkFiltering({
38
38
  domain,
39
39
  allSelections,
40
40
  matrix,
41
- expertMode,
42
41
  selections,
43
42
  installedSkillIds
44
43
  }) {
45
44
  return useMemo(
46
- () => buildCategoriesForDomain(
47
- domain,
48
- allSelections,
49
- matrix,
50
- expertMode,
51
- selections,
52
- installedSkillIds
53
- ),
54
- [domain, allSelections, matrix, expertMode, selections, installedSkillIds]
45
+ () => buildCategoriesForDomain(domain, allSelections, matrix, selections, installedSkillIds),
46
+ [domain, allSelections, matrix, selections, installedSkillIds]
55
47
  );
56
48
  }
57
49
 
@@ -70,7 +62,6 @@ var StepBuild = ({
70
62
  selections,
71
63
  allSelections,
72
64
  showLabels,
73
- expertMode,
74
65
  installedSkillIds,
75
66
  onToggle,
76
67
  onToggleLabels,
@@ -84,7 +75,6 @@ var StepBuild = ({
84
75
  domain: activeDomain,
85
76
  allSelections,
86
77
  matrix,
87
- expertMode,
88
78
  selections,
89
79
  installedSkillIds
90
80
  });
@@ -129,7 +119,6 @@ var StepBuild = ({
129
119
  {
130
120
  categories,
131
121
  availableHeight: gridHeight,
132
- expertMode,
133
122
  showLabels,
134
123
  onToggle,
135
124
  onToggleLabels
@@ -143,4 +132,4 @@ var StepBuild = ({
143
132
  export {
144
133
  StepBuild
145
134
  };
146
- //# sourceMappingURL=chunk-VAQJLHUW.js.map
135
+ //# sourceMappingURL=chunk-QB5HHTAA.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 { Box, Text, useInput } from \"ink\";\nimport React, { useMemo, useState } from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { validateBuildStep } from \"../../lib/wizard/index.js\";\nimport type {\n Domain,\n MergedSkillsMatrix,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../../types/index.js\";\nimport { useFrameworkFiltering } from \"../hooks/use-framework-filtering.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { CategoryGrid } from \"./category-grid.js\";\nimport { getDomainDisplayName, orderDomains } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\nexport type StepBuildProps = {\n matrix: MergedSkillsMatrix;\n domain: Domain;\n selectedDomains: Domain[];\n selections: SubcategorySelections;\n allSelections: SkillId[];\n showLabels: 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 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 orderedDomains = useMemo(() => orderDomains(selectedDomains), [selectedDomains]);\n\n const categories = useFrameworkFiltering({\n domain: activeDomain,\n allSelections,\n matrix,\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 {orderedDomains.map((domain) => {\n const isActive = domain === activeDomain;\n return (\n <Text key={domain} color={isActive ? CLI_COLORS.WARNING : undefined} bold={isActive}>\n {getDomainDisplayName(domain)}\n </Text>\n );\n })}\n </Box>\n </Box>\n <ViewTitle>{`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 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 selections: SubcategorySelections;\n installedSkillIds?: SkillId[];\n};\n\nexport function useFrameworkFiltering({\n domain,\n allSelections,\n matrix,\n selections,\n installedSkillIds,\n}: UseFrameworkFilteringOptions): CategoryRow[] {\n return useMemo(\n () => buildCategoriesForDomain(domain, allSelections, matrix, selections, installedSkillIds),\n [domain, allSelections, matrix, selections, installedSkillIds],\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAgB,WAAAA,UAAS,gBAAgB;;;ACDzC;;;ACAA;AAAA,SAAS,eAAe;AAkBjB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgD;AAC9C,SAAO;AAAA,IACL,MAAM,yBAAyB,QAAQ,eAAe,QAAQ,YAAY,iBAAiB;AAAA,IAC3F,CAAC,QAAQ,eAAe,QAAQ,YAAY,iBAAiB;AAAA,EAC/D;AACF;;;AFWQ,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;AACF,MAAM;AACJ,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA6B,MAAS;AACpF,QAAM,EAAE,KAAK,SAAS,gBAAgB,WAAW,IAAI,kBAAkB;AAEvE,QAAM,iBAAiBC,SAAQ,MAAM,aAAa,eAAe,GAAG,CAAC,eAAe,CAAC;AAErF,QAAM,aAAa,sBAAsB;AAAA,IACvC,QAAQ;AAAA,IACR;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,yBAAe,IAAI,CAAC,WAAW;AAC9B,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,4BAAkB,qBAAqB,YAAY,CAAC,UAAS;AAAA,IAEzE,oBAAC,OAAI,KAAK,SAAS,UAAU,GAAG,WAAW,GACzC;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MALK;AAAA,IAMP,GACF;AAAA,IAEA,oBAAC,UAAO,iBAAkC;AAAA,KAC5C;AAEJ;","names":["useMemo","useMemo"]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-KUV24B5M.js";
5
5
  import {
6
6
  CLI_COLORS
7
- } from "./chunk-FTD5Z6QD.js";
7
+ } from "./chunk-AWP5A6IM.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-DHET7RCE.js";
@@ -87,4 +87,4 @@ var SearchModal = ({ results, alias, onBind, onClose }) => {
87
87
  export {
88
88
  SearchModal
89
89
  };
90
- //# sourceMappingURL=chunk-VSZ5GDET.js.map
90
+ //# sourceMappingURL=chunk-QYLCINGC.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-FTD5Z6QD.js";
4
+ } from "./chunk-AWP5A6IM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -45,4 +45,4 @@ var SectionProgress = ({
45
45
  export {
46
46
  SectionProgress
47
47
  };
48
- //# sourceMappingURL=chunk-IRJADQM7.js.map
48
+ //# sourceMappingURL=chunk-RA2IPRO2.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  BaseCommand
4
- } from "./chunk-LNA6M2IE.js";
4
+ } from "./chunk-PGY5XROM.js";
5
5
  import {
6
6
  DEFAULT_SOURCE,
7
7
  SOURCE_ENV_VAR,
@@ -10,10 +10,10 @@ import {
10
10
  loadProjectSourceConfig,
11
11
  resolveAgentsSource,
12
12
  resolveSource
13
- } from "./chunk-GFDGYQ6M.js";
13
+ } from "./chunk-HMSHB5EQ.js";
14
14
  import {
15
15
  DEFAULT_BRANDING
16
- } from "./chunk-FTD5Z6QD.js";
16
+ } from "./chunk-AWP5A6IM.js";
17
17
  import {
18
18
  init_esm_shims
19
19
  } from "./chunk-DHET7RCE.js";
@@ -90,4 +90,4 @@ ${DEFAULT_BRANDING.NAME} Configuration
90
90
  export {
91
91
  ConfigShow
92
92
  };
93
- //# sourceMappingURL=chunk-DC333ZDC.js.map
93
+ //# sourceMappingURL=chunk-RDWGYKDY.js.map
@@ -4,22 +4,24 @@ import {
4
4
  } from "./chunk-7SOPVGDV.js";
5
5
  import {
6
6
  SearchModal
7
- } from "./chunk-VSZ5GDET.js";
7
+ } from "./chunk-QYLCINGC.js";
8
8
  import {
9
9
  useFocusedListItem
10
10
  } from "./chunk-GG4BSB6S.js";
11
11
  import {
12
- CLI_COLORS,
13
- SCROLL_VIEWPORT
14
- } from "./chunk-FTD5Z6QD.js";
12
+ useSectionScroll
13
+ } from "./chunk-GBOW6FUW.js";
14
+ import {
15
+ CLI_COLORS
16
+ } from "./chunk-AWP5A6IM.js";
15
17
  import {
16
18
  init_esm_shims
17
19
  } from "./chunk-DHET7RCE.js";
18
20
 
19
21
  // src/cli/components/wizard/source-grid.tsx
20
22
  init_esm_shims();
21
- import { useCallback as useCallback2, useEffect, useRef, useState as useState2 } from "react";
22
- import { Box, Text, measureElement, useInput } from "ink";
23
+ import { useCallback as useCallback2 } from "react";
24
+ import { Box, Text, useInput } from "ink";
23
25
 
24
26
  // src/cli/components/hooks/use-source-grid-search-modal.ts
25
27
  init_esm_shims();
@@ -168,46 +170,11 @@ var SourceGrid = ({
168
170
  initialRow: defaultFocusedRow,
169
171
  initialCol: defaultFocusedCol
170
172
  });
171
- const sectionRefs = useRef([]);
172
- const [sectionHeights, setSectionHeights] = useState2([]);
173
- const [scrollTopPx, setScrollTopPx] = useState2(0);
174
- const setSectionRef = useCallback2((index, el) => {
175
- sectionRefs.current[index] = el;
176
- }, []);
177
- useEffect(() => {
178
- const heights = sectionRefs.current.map((el) => {
179
- if (el) {
180
- const { height } = measureElement(el);
181
- return height;
182
- }
183
- return 0;
184
- });
185
- setSectionHeights((prev) => {
186
- if (prev.length === heights.length && prev.every((h, i) => h === heights[i])) {
187
- return prev;
188
- }
189
- return heights;
190
- });
173
+ const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({
174
+ sectionCount: rows.length,
175
+ focusedIndex: focusedRow,
176
+ availableHeight
191
177
  });
192
- const scrollEnabled = availableHeight > 0 && availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;
193
- useEffect(() => {
194
- if (!scrollEnabled || sectionHeights.length === 0) return;
195
- let topOfFocused = 0;
196
- for (let i = 0; i < focusedRow; i++) {
197
- topOfFocused += sectionHeights[i] ?? 0;
198
- }
199
- const focusedHeight = sectionHeights[focusedRow] ?? 0;
200
- const bottomOfFocused = topOfFocused + focusedHeight;
201
- setScrollTopPx((prev) => {
202
- if (topOfFocused < prev) {
203
- return topOfFocused;
204
- }
205
- if (bottomOfFocused > prev + availableHeight) {
206
- return bottomOfFocused - availableHeight;
207
- }
208
- return prev;
209
- });
210
- }, [focusedRow, sectionHeights, scrollEnabled, availableHeight]);
211
178
  useInput(
212
179
  useCallback2(
213
180
  (input, key) => {
@@ -247,7 +214,8 @@ var SourceGrid = ({
247
214
  if (rows.length === 0) {
248
215
  return /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No skills to display." }) });
249
216
  }
250
- const sectionElements = rows.map((row, rowIndex) => /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(rowIndex, el), flexShrink: 0, children: /* @__PURE__ */ jsx(
217
+ const noShrink = scrollEnabled ? { flexShrink: 0 } : {};
218
+ const sectionElements = rows.map((row, rowIndex) => /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(rowIndex, el), ...noShrink, children: /* @__PURE__ */ jsx(
251
219
  SourceSection,
252
220
  {
253
221
  row,
@@ -265,19 +233,20 @@ var SourceGrid = ({
265
233
  onClose: handleCloseSearch
266
234
  }
267
235
  );
268
- if (!scrollEnabled) {
269
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [
270
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: sectionElements }),
271
- searchModalElement
272
- ] });
273
- }
274
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", height: availableHeight, children: [
275
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", overflow: "hidden", flexGrow: 1, children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: scrollTopPx > 0 ? -scrollTopPx : 0, flexShrink: 0, children: sectionElements }) }),
276
- searchModalElement
277
- ] });
236
+ return /* @__PURE__ */ jsxs(
237
+ Box,
238
+ {
239
+ flexDirection: "column",
240
+ ...scrollEnabled ? { height: availableHeight } : { flexGrow: 1 },
241
+ children: [
242
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", overflow: "hidden", flexGrow: 1, children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: scrollTopPx > 0 ? -scrollTopPx : 0, ...noShrink, children: sectionElements }) }),
243
+ searchModalElement
244
+ ]
245
+ }
246
+ );
278
247
  };
279
248
 
280
249
  export {
281
250
  SourceGrid
282
251
  };
283
- //# sourceMappingURL=chunk-FXQYEXLS.js.map
252
+ //# sourceMappingURL=chunk-RFKDGJAJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/source-grid.tsx","../src/cli/components/hooks/use-source-grid-search-modal.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { BoundSkillCandidate, SkillAlias, SkillId } from \"../../types/index.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\nimport { useSourceGridSearchModal } from \"../hooks/use-source-grid-search-modal.js\";\nimport { SearchModal } from \"./search-modal.js\";\n\nconst SEARCH_PILL_LABEL = \"\\u2315 Search\";\n\nexport type SourceOption = {\n id: string;\n label: string;\n selected: boolean;\n installed: boolean;\n};\n\nexport type SourceRow = {\n skillId: SkillId;\n displayName: string;\n alias: SkillAlias;\n options: SourceOption[];\n};\n\nexport type SourceGridProps = {\n rows: SourceRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onSelect: (skillId: SkillId, sourceId: string) => void;\n onSearch?: (alias: SkillAlias) => Promise<BoundSkillCandidate[]>;\n onBind?: (candidate: BoundSkillCandidate) => void;\n onSearchStateChange?: (active: boolean) => void;\n /** Optional initial focus row (default: 0). Use with React `key` to reset. */\n defaultFocusedRow?: number;\n /** Optional initial focus col (default: 0). Use with React `key` to reset. */\n defaultFocusedCol?: number;\n /** Optional callback fired whenever the focused position changes */\n onFocusChange?: (row: number, col: number) => void;\n};\n\ntype SearchPillProps = {\n isFocused: boolean;\n};\n\nconst SearchPill: React.FC<SearchPillProps> = ({ isFocused }) => {\n const borderColor = isFocused ? CLI_COLORS.UNFOCUSED : CLI_COLORS.NEUTRAL;\n\n return (\n <Box marginRight={1} borderColor={borderColor} borderStyle=\"single\" borderDimColor={!isFocused}>\n <Text dimColor={!isFocused} bold={isFocused}>\n {\" \"}\n {SEARCH_PILL_LABEL}{\" \"}\n </Text>\n </Box>\n );\n};\n\ntype SourceSectionProps = {\n row: SourceRow;\n isFocused: boolean;\n focusedOptionIndex: number;\n showSearchPill: boolean;\n};\n\nconst SourceTag: React.FC<{ option: SourceOption; isFocused: boolean }> = ({\n option,\n isFocused,\n}) => {\n const getBorderColor = (): string => {\n if (isFocused) {\n return option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.UNFOCUSED;\n }\n return CLI_COLORS.NEUTRAL;\n };\n\n const textColor = option.selected ? CLI_COLORS.PRIMARY : CLI_COLORS.NEUTRAL;\n const isBold = isFocused || option.selected;\n\n return (\n <Box\n marginRight={1}\n borderColor={getBorderColor()}\n borderStyle=\"single\"\n borderDimColor={!isFocused}\n >\n <Text color={textColor} bold={isBold} dimColor={false}>\n {\" \"}\n {option.label}{\" \"}\n </Text>\n </Box>\n );\n};\n\nconst SourceSection: React.FC<SourceSectionProps> = ({\n row,\n isFocused,\n focusedOptionIndex,\n showSearchPill,\n}) => {\n const searchPillIndex = row.options.length;\n\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n <Box flexDirection=\"row\">\n <Text>{row.displayName}</Text>\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {row.options.map((option, index) => (\n <SourceTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex}\n />\n ))}\n {showSearchPill && (\n <SearchPill isFocused={isFocused && focusedOptionIndex === searchPillIndex} />\n )}\n </Box>\n </Box>\n );\n};\n\n/** Total navigable columns for a row (options + search pill if applicable) */\nconst getNavigableCount = (row: SourceRow, showSearchPill: boolean): number => {\n return row.options.length + (showSearchPill ? 1 : 0);\n};\n\nexport const SourceGrid: React.FC<SourceGridProps> = ({\n rows,\n availableHeight = 0,\n onSelect,\n onSearch,\n onBind,\n onSearchStateChange,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n}) => {\n const {\n searchModal,\n searchResults,\n searchAlias,\n handleSearchTrigger,\n handleBind,\n handleCloseSearch,\n } = useSourceGridSearchModal({ rows, onSearch, onBind, onSearchStateChange });\n\n const showSearchPill = !!onSearch;\n\n const getColCount = useCallback(\n (row: number): number => {\n const rowData = rows[row];\n return rowData ? getNavigableCount(rowData, showSearchPill) : 0;\n },\n [rows, showSearchPill],\n );\n\n const { focusedRow, focusedCol, moveFocus } = useFocusedListItem(rows.length, getColCount, {\n wrap: true,\n onChange: onFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n });\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: rows.length,\n focusedIndex: focusedRow,\n availableHeight,\n });\n\n useInput(\n useCallback(\n (\n input: string,\n key: {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n return: boolean;\n },\n ) => {\n if (input === \" \") {\n const currentRow = rows[focusedRow];\n if (!currentRow) return;\n if (showSearchPill && focusedCol === currentRow.options.length) {\n void handleSearchTrigger(focusedRow);\n return;\n }\n if (focusedCol < currentRow.options.length) {\n const currentOption = currentRow.options[focusedCol];\n if (currentOption) {\n onSelect(currentRow.skillId, currentOption.id);\n }\n }\n return;\n }\n\n const isLeft = key.leftArrow;\n const isRight = key.rightArrow;\n const isUp = key.upArrow;\n const isDown = key.downArrow;\n\n if (isLeft) {\n moveFocus(\"left\");\n } else if (isRight) {\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n },\n [rows, focusedRow, focusedCol, onSelect, showSearchPill, handleSearchTrigger, moveFocus],\n ),\n { isActive: !searchModal.isOpen },\n );\n\n if (rows.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No skills to display.</Text>\n </Box>\n );\n }\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = rows.map((row, rowIndex) => (\n <Box key={row.skillId} ref={(el) => setSectionRef(rowIndex, el)} {...noShrink}>\n <SourceSection\n row={row}\n isFocused={rowIndex === focusedRow}\n focusedOptionIndex={focusedCol}\n showSearchPill={showSearchPill}\n />\n </Box>\n ));\n\n const searchModalElement = searchModal.isOpen && (\n <SearchModal\n results={searchResults}\n alias={searchAlias}\n onBind={handleBind}\n onClose={handleCloseSearch}\n />\n );\n\n return (\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled ? { height: availableHeight } : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" overflow=\"hidden\" flexGrow={1}>\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n </Box>\n </Box>\n {searchModalElement}\n </Box>\n );\n};\n","import { useCallback, useState } from \"react\";\nimport type { BoundSkillCandidate, SkillAlias } from \"../../types/index.js\";\nimport { useModalState } from \"./use-modal-state.js\";\nimport type { SourceRow } from \"../wizard/source-grid.js\";\n\ntype UseSourceGridSearchModalOptions = {\n rows: SourceRow[];\n onSearch?: (alias: SkillAlias) => Promise<BoundSkillCandidate[]>;\n onBind?: (candidate: BoundSkillCandidate) => void;\n onSearchStateChange?: (active: boolean) => void;\n};\n\ntype UseSourceGridSearchModalResult = {\n searchModal: { isOpen: boolean };\n searchResults: BoundSkillCandidate[];\n searchAlias: string;\n handleSearchTrigger: (rowIndex: number) => Promise<void>;\n handleBind: (candidate: BoundSkillCandidate) => void;\n handleCloseSearch: () => void;\n};\n\nexport function useSourceGridSearchModal({\n rows,\n onSearch,\n onBind,\n onSearchStateChange,\n}: UseSourceGridSearchModalOptions): UseSourceGridSearchModalResult {\n const searchModal = useModalState<number>();\n const [searchResults, setSearchResults] = useState<BoundSkillCandidate[]>([]);\n const [searchAlias, setSearchAlias] = useState(\"\");\n\n const resetSearch = useCallback(() => {\n searchModal.close();\n setSearchResults([]);\n setSearchAlias(\"\");\n onSearchStateChange?.(false);\n }, [onSearchStateChange, searchModal]);\n\n const handleSearchTrigger = useCallback(\n async (rowIndex: number) => {\n const row = rows[rowIndex];\n if (!row || !onSearch) return;\n\n const alias = row.alias;\n setSearchAlias(alias);\n searchModal.open(rowIndex);\n onSearchStateChange?.(true);\n\n const results = await onSearch(alias);\n setSearchResults(results);\n },\n [rows, onSearch, onSearchStateChange, searchModal],\n );\n\n const handleBind = useCallback(\n (candidate: BoundSkillCandidate) => {\n onBind?.(candidate);\n resetSearch();\n },\n [onBind, resetSearch],\n );\n\n const handleCloseSearch = useCallback(() => {\n resetSearch();\n }, [resetSearch]);\n\n return {\n searchModal: { isOpen: searchModal.isOpen },\n searchResults,\n searchAlias,\n handleSearchTrigger,\n handleBind,\n handleCloseSearch,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -4,24 +4,24 @@ import {
4
4
  } from "./chunk-K77I4XGL.js";
5
5
  import {
6
6
  SelectionCard
7
- } from "./chunk-ZWAL2ZY7.js";
7
+ } from "./chunk-WJHFV6RI.js";
8
8
  import {
9
9
  SourceGrid
10
- } from "./chunk-FXQYEXLS.js";
10
+ } from "./chunk-RFKDGJAJ.js";
11
11
  import {
12
12
  ViewTitle
13
- } from "./chunk-B4QYXVPZ.js";
13
+ } from "./chunk-CMNKHDOX.js";
14
14
  import {
15
15
  useWizardStore
16
- } from "./chunk-SPSGZWTZ.js";
16
+ } from "./chunk-5FCHJLM7.js";
17
17
  import {
18
18
  resolveAllSources,
19
19
  searchExtraSources
20
- } from "./chunk-GFDGYQ6M.js";
20
+ } from "./chunk-HMSHB5EQ.js";
21
21
  import {
22
22
  CLI_COLORS,
23
23
  DEFAULT_BRANDING
24
- } from "./chunk-FTD5Z6QD.js";
24
+ } from "./chunk-AWP5A6IM.js";
25
25
  import {
26
26
  init_esm_shims
27
27
  } from "./chunk-DHET7RCE.js";
@@ -159,4 +159,4 @@ var StepSources = ({
159
159
  export {
160
160
  StepSources
161
161
  };
162
- //# sourceMappingURL=chunk-HPJP3HFD.js.map
162
+ //# sourceMappingURL=chunk-SPFHPHYL.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  cliTheme
4
- } from "./chunk-N5OCAAXY.js";
4
+ } from "./chunk-JWYRXE6C.js";
5
5
  import {
6
6
  useTextInput
7
7
  } from "./chunk-U3IGFMCY.js";
@@ -9,7 +9,7 @@ import {
9
9
  CLI_COLORS,
10
10
  UI_LAYOUT,
11
11
  UI_SYMBOLS
12
- } from "./chunk-FTD5Z6QD.js";
12
+ } from "./chunk-AWP5A6IM.js";
13
13
  import {
14
14
  init_esm_shims
15
15
  } from "./chunk-DHET7RCE.js";
@@ -343,4 +343,4 @@ var SkillSearch = ({
343
343
  export {
344
344
  SkillSearch
345
345
  };
346
- //# sourceMappingURL=chunk-EZ46ZTAQ.js.map
346
+ //# sourceMappingURL=chunk-U2W5SENM.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-FTD5Z6QD.js";
4
+ } from "./chunk-AWP5A6IM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -81,4 +81,4 @@ export {
81
81
  formatStepLabel,
82
82
  WizardTabs
83
83
  };
84
- //# sourceMappingURL=chunk-MVEYK55V.js.map
84
+ //# sourceMappingURL=chunk-U7X4V4HE.js.map