@agents-inc/cli 0.48.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +1 -2
  3. package/config/stacks.yaml +0 -1
  4. package/dist/{chunk-YDASDMTH.js → chunk-26MXZUHU.js} +2 -2
  5. package/dist/{chunk-WSGKCBY5.js → chunk-2BWCR762.js} +2 -3
  6. package/dist/chunk-2BWCR762.js.map +1 -0
  7. package/dist/chunk-3VOL4WEG.js +31 -0
  8. package/dist/chunk-3VOL4WEG.js.map +1 -0
  9. package/dist/chunk-4QWDB2MD.js +571 -0
  10. package/dist/chunk-4QWDB2MD.js.map +1 -0
  11. package/dist/{chunk-ZML3OCYA.js → chunk-4R52TQ3K.js} +2 -2
  12. package/dist/{chunk-KPJJOLAQ.js → chunk-5FCHJLM7.js} +34 -16
  13. package/dist/chunk-5FCHJLM7.js.map +1 -0
  14. package/dist/chunk-5FPIKTSA.js +40 -0
  15. package/dist/chunk-5FPIKTSA.js.map +1 -0
  16. package/dist/{chunk-SPVSWDFM.js → chunk-5L724R4C.js} +5 -6
  17. package/dist/{chunk-SPVSWDFM.js.map → chunk-5L724R4C.js.map} +1 -1
  18. package/dist/{chunk-AXV7NFFJ.js → chunk-7LV4V6A4.js} +4 -4
  19. package/dist/{chunk-LESHL6SM.js → chunk-AWP5A6IM.js} +9 -3
  20. package/dist/chunk-AWP5A6IM.js.map +1 -0
  21. package/dist/chunk-C3Q43WLC.js +118 -0
  22. package/dist/chunk-C3Q43WLC.js.map +1 -0
  23. package/dist/{chunk-U2AEK4ZL.js → chunk-CMNKHDOX.js} +2 -2
  24. package/dist/{chunk-X3SZIBVW.js → chunk-D72AFYQR.js} +2 -2
  25. package/dist/chunk-D72AFYQR.js.map +1 -0
  26. package/dist/{chunk-FPTUCWBY.js → chunk-DCE423KO.js} +46 -30
  27. package/dist/chunk-DCE423KO.js.map +1 -0
  28. package/dist/chunk-GBOW6FUW.js +74 -0
  29. package/dist/chunk-GBOW6FUW.js.map +1 -0
  30. package/dist/{chunk-P2SFRDWI.js → chunk-HMSHB5EQ.js} +437 -185
  31. package/dist/chunk-HMSHB5EQ.js.map +1 -0
  32. package/dist/{chunk-GSPPOXMG.js → chunk-HYEUETIC.js} +2 -2
  33. package/dist/{chunk-IS7GP6XC.js → chunk-I6IOGZSZ.js} +61 -52
  34. package/dist/chunk-I6IOGZSZ.js.map +1 -0
  35. package/dist/{chunk-OTTITQ7C.js → chunk-JFF7P4LC.js} +30 -93
  36. package/dist/chunk-JFF7P4LC.js.map +1 -0
  37. package/dist/{chunk-FHKNG3UA.js → chunk-JWYRXE6C.js} +2 -2
  38. package/dist/{chunk-W62XVWXB.js → chunk-KAO3LKB5.js} +3 -3
  39. package/dist/{chunk-AMNCCZSG.js → chunk-KQOU4POU.js} +26 -28
  40. package/dist/chunk-KQOU4POU.js.map +1 -0
  41. package/dist/{chunk-VBAAATPU.js → chunk-M3GQ2R3E.js} +29 -28
  42. package/dist/chunk-M3GQ2R3E.js.map +1 -0
  43. package/dist/{chunk-2BVZOYJP.js → chunk-PGY5XROM.js} +2 -2
  44. package/dist/chunk-PGY5XROM.js.map +1 -0
  45. package/dist/{chunk-5MN5S3DV.js → chunk-QB5HHTAA.js} +8 -19
  46. package/dist/chunk-QB5HHTAA.js.map +1 -0
  47. package/dist/{chunk-34BP5BC4.js → chunk-QYLCINGC.js} +2 -2
  48. package/dist/{chunk-I52THVF6.js → chunk-RA2IPRO2.js} +2 -2
  49. package/dist/{chunk-G5OZQ376.js → chunk-RDWGYKDY.js} +4 -4
  50. package/dist/{chunk-7IAKVZL5.js → chunk-RFKDGJAJ.js} +26 -57
  51. package/dist/chunk-RFKDGJAJ.js.map +1 -0
  52. package/dist/{chunk-5O6GKXAN.js → chunk-SPFHPHYL.js} +7 -7
  53. package/dist/{chunk-NJVJ7VO5.js → chunk-U2W5SENM.js} +3 -3
  54. package/dist/{chunk-37QYD33C.js → chunk-U7X4V4HE.js} +2 -2
  55. package/dist/{chunk-C7DLY64D.js → chunk-UAD3SC27.js} +4 -12
  56. package/dist/chunk-UAD3SC27.js.map +1 -0
  57. package/dist/{chunk-YMUWTPOM.js → chunk-WBHPCBVN.js} +31 -11
  58. package/dist/chunk-WBHPCBVN.js.map +1 -0
  59. package/dist/chunk-WFFV254H.js +314 -0
  60. package/dist/chunk-WFFV254H.js.map +1 -0
  61. package/dist/{chunk-F7KTUFGU.js → chunk-WJHFV6RI.js} +3 -2
  62. package/dist/chunk-WJHFV6RI.js.map +1 -0
  63. package/dist/{chunk-DG2U2WY3.js → chunk-WLZHCM7O.js} +2 -2
  64. package/dist/{chunk-OHDEJEYB.js → chunk-XDSVV5GZ.js} +4 -4
  65. package/dist/{chunk-2DNDAXF6.js → chunk-YDYRAXSY.js} +57 -27
  66. package/dist/chunk-YDYRAXSY.js.map +1 -0
  67. package/dist/commands/build/marketplace.js +4 -4
  68. package/dist/commands/build/plugins.js +5 -5
  69. package/dist/commands/build/stack.js +5 -5
  70. package/dist/commands/compile.js +11 -9
  71. package/dist/commands/compile.js.map +1 -1
  72. package/dist/commands/config/get.js +4 -4
  73. package/dist/commands/config/index.js +5 -5
  74. package/dist/commands/config/path.js +4 -4
  75. package/dist/commands/config/set-project.js +4 -4
  76. package/dist/commands/config/show.js +5 -5
  77. package/dist/commands/config/unset-project.js +4 -4
  78. package/dist/commands/diff.js +4 -4
  79. package/dist/commands/doctor.js +4 -4
  80. package/dist/commands/edit.js +58 -52
  81. package/dist/commands/edit.js.map +1 -1
  82. package/dist/commands/eject.js +4 -4
  83. package/dist/commands/import/skill.js +5 -5
  84. package/dist/commands/info.js +5 -5
  85. package/dist/commands/init.js +40 -435
  86. package/dist/commands/init.js.map +1 -1
  87. package/dist/commands/list.js +4 -4
  88. package/dist/commands/new/agent.js +11 -10
  89. package/dist/commands/new/agent.js.map +1 -1
  90. package/dist/commands/new/marketplace.js +24 -5
  91. package/dist/commands/new/marketplace.js.map +1 -1
  92. package/dist/commands/new/skill.js +15 -208
  93. package/dist/commands/new/skill.js.map +1 -1
  94. package/dist/commands/outdated.js +11 -7
  95. package/dist/commands/outdated.js.map +1 -1
  96. package/dist/commands/search.js +7 -7
  97. package/dist/commands/uninstall.js +6 -6
  98. package/dist/commands/update.js +6 -6
  99. package/dist/commands/validate.js +26 -247
  100. package/dist/commands/validate.js.map +1 -1
  101. package/dist/components/skill-search/skill-search.js +3 -3
  102. package/dist/components/wizard/category-grid.js +3 -2
  103. package/dist/components/wizard/category-grid.test.js +112 -58
  104. package/dist/components/wizard/category-grid.test.js.map +1 -1
  105. package/dist/components/wizard/checkbox-grid.js +5 -3
  106. package/dist/components/wizard/checkbox-grid.test.js +5 -4
  107. package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
  108. package/dist/components/wizard/domain-selection.js +11 -9
  109. package/dist/components/wizard/help-modal.js +2 -2
  110. package/dist/components/wizard/menu-item.js +1 -1
  111. package/dist/components/wizard/search-modal.js +2 -2
  112. package/dist/components/wizard/search-modal.test.js +2 -2
  113. package/dist/components/wizard/section-progress.js +2 -2
  114. package/dist/components/wizard/section-progress.test.js +2 -2
  115. package/dist/components/wizard/selection-card.js +2 -2
  116. package/dist/components/wizard/source-grid.js +4 -3
  117. package/dist/components/wizard/source-grid.test.js +4 -3
  118. package/dist/components/wizard/source-grid.test.js.map +1 -1
  119. package/dist/components/wizard/stack-selection.js +8 -8
  120. package/dist/components/wizard/step-agents.js +10 -8
  121. package/dist/components/wizard/step-agents.test.js +18 -17
  122. package/dist/components/wizard/step-agents.test.js.map +1 -1
  123. package/dist/components/wizard/step-build.js +9 -8
  124. package/dist/components/wizard/step-build.test.js +11 -25
  125. package/dist/components/wizard/step-build.test.js.map +1 -1
  126. package/dist/components/wizard/step-confirm.js +4 -4
  127. package/dist/components/wizard/step-confirm.test.js +8 -8
  128. package/dist/components/wizard/step-refine.js +2 -2
  129. package/dist/components/wizard/step-refine.test.js +2 -2
  130. package/dist/components/wizard/step-settings.js +7 -5
  131. package/dist/components/wizard/step-settings.test.js +10 -8
  132. package/dist/components/wizard/step-settings.test.js.map +1 -1
  133. package/dist/components/wizard/step-sources.js +11 -10
  134. package/dist/components/wizard/step-sources.test.js +12 -11
  135. package/dist/components/wizard/step-sources.test.js.map +1 -1
  136. package/dist/components/wizard/step-stack.js +15 -12
  137. package/dist/components/wizard/step-stack.test.js +16 -13
  138. package/dist/components/wizard/step-stack.test.js.map +1 -1
  139. package/dist/components/wizard/view-title.js +2 -2
  140. package/dist/components/wizard/wizard-layout.js +8 -8
  141. package/dist/components/wizard/wizard-tabs.js +2 -2
  142. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  143. package/dist/components/wizard/wizard.js +27 -25
  144. package/dist/config/stacks.yaml +0 -1
  145. package/dist/hooks/init.js +55 -3
  146. package/dist/hooks/init.js.map +1 -1
  147. package/dist/{source-manager-Y7R6WPOW.js → source-manager-BVB2SG73.js} +4 -4
  148. package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  149. package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  150. package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
  151. package/dist/src/agents/meta/agent-summoner/output-format.md +1 -1
  152. package/dist/src/agents/meta/agent-summoner/workflow.md +5 -7
  153. package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
  154. package/dist/stores/wizard-store.js +5 -5
  155. package/dist/stores/wizard-store.test.js +79 -27
  156. package/dist/stores/wizard-store.test.js.map +1 -1
  157. package/package.json +1 -1
  158. package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  159. package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  160. package/src/agents/meta/agent-summoner/examples.md +2 -2
  161. package/src/agents/meta/agent-summoner/output-format.md +1 -1
  162. package/src/agents/meta/agent-summoner/workflow.md +5 -7
  163. package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
  164. package/src/schemas/agent.schema.json +1 -1
  165. package/src/schemas/project-config.schema.json +0 -3
  166. package/dist/chunk-2BVZOYJP.js.map +0 -1
  167. package/dist/chunk-2DNDAXF6.js.map +0 -1
  168. package/dist/chunk-5MN5S3DV.js.map +0 -1
  169. package/dist/chunk-7IAKVZL5.js.map +0 -1
  170. package/dist/chunk-AMNCCZSG.js.map +0 -1
  171. package/dist/chunk-AXZNJ5PN.js +0 -99
  172. package/dist/chunk-AXZNJ5PN.js.map +0 -1
  173. package/dist/chunk-C7DLY64D.js.map +0 -1
  174. package/dist/chunk-F7KTUFGU.js.map +0 -1
  175. package/dist/chunk-FPTUCWBY.js.map +0 -1
  176. package/dist/chunk-IS7GP6XC.js.map +0 -1
  177. package/dist/chunk-KPJJOLAQ.js.map +0 -1
  178. package/dist/chunk-LESHL6SM.js.map +0 -1
  179. package/dist/chunk-OTTITQ7C.js.map +0 -1
  180. package/dist/chunk-P2SFRDWI.js.map +0 -1
  181. package/dist/chunk-PY2XZUBF.js +0 -29
  182. package/dist/chunk-PY2XZUBF.js.map +0 -1
  183. package/dist/chunk-VBAAATPU.js.map +0 -1
  184. package/dist/chunk-WSGKCBY5.js.map +0 -1
  185. package/dist/chunk-X3SZIBVW.js.map +0 -1
  186. package/dist/chunk-YMUWTPOM.js.map +0 -1
  187. package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
  188. package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  189. package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  190. package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  191. package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  192. package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
  193. package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
  194. package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
  195. package/src/agents/migration/cli-migrator/agent.yaml +0 -12
  196. package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
  197. package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
  198. package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
  199. package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
  200. package/src/agents/migration/cli-migrator/intro.md +0 -15
  201. package/src/agents/migration/cli-migrator/output-format.md +0 -164
  202. package/src/agents/migration/cli-migrator/workflow.md +0 -230
  203. /package/dist/{chunk-YDASDMTH.js.map → chunk-26MXZUHU.js.map} +0 -0
  204. /package/dist/{chunk-ZML3OCYA.js.map → chunk-4R52TQ3K.js.map} +0 -0
  205. /package/dist/{chunk-AXV7NFFJ.js.map → chunk-7LV4V6A4.js.map} +0 -0
  206. /package/dist/{chunk-U2AEK4ZL.js.map → chunk-CMNKHDOX.js.map} +0 -0
  207. /package/dist/{chunk-GSPPOXMG.js.map → chunk-HYEUETIC.js.map} +0 -0
  208. /package/dist/{chunk-FHKNG3UA.js.map → chunk-JWYRXE6C.js.map} +0 -0
  209. /package/dist/{chunk-W62XVWXB.js.map → chunk-KAO3LKB5.js.map} +0 -0
  210. /package/dist/{chunk-34BP5BC4.js.map → chunk-QYLCINGC.js.map} +0 -0
  211. /package/dist/{chunk-I52THVF6.js.map → chunk-RA2IPRO2.js.map} +0 -0
  212. /package/dist/{chunk-G5OZQ376.js.map → chunk-RDWGYKDY.js.map} +0 -0
  213. /package/dist/{chunk-5O6GKXAN.js.map → chunk-SPFHPHYL.js.map} +0 -0
  214. /package/dist/{chunk-NJVJ7VO5.js.map → chunk-U2W5SENM.js.map} +0 -0
  215. /package/dist/{chunk-37QYD33C.js.map → chunk-U7X4V4HE.js.map} +0 -0
  216. /package/dist/{chunk-DG2U2WY3.js.map → chunk-WLZHCM7O.js.map} +0 -0
  217. /package/dist/{chunk-OHDEJEYB.js.map → chunk-XDSVV5GZ.js.map} +0 -0
  218. /package/dist/{source-manager-Y7R6WPOW.js.map → source-manager-BVB2SG73.js.map} +0 -0
  219. /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  220. /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  221. /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  222. /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  223. /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  224. /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  225. /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  226. /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  227. /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  228. /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  229. /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  230. /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  231. /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  232. /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  233. /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  234. /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
  235. /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
  236. /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
  237. /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
  238. /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
  239. /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
  240. /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
  241. /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
  242. /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
  243. /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
  244. /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
  245. /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
  246. /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
  247. /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
  248. /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
  249. /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
  250. /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  BUILT_IN_DOMAIN_ORDER
4
- } from "./chunk-LESHL6SM.js";
4
+ } from "./chunk-AWP5A6IM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -35,4 +35,4 @@ export {
35
35
  getStackName,
36
36
  orderDomains
37
37
  };
38
- //# sourceMappingURL=chunk-GSPPOXMG.js.map
38
+ //# sourceMappingURL=chunk-HYEUETIC.js.map
@@ -2,24 +2,24 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "./chunk-37QYD33C.js";
5
+ } from "./chunk-U7X4V4HE.js";
6
6
  import {
7
7
  HelpModal
8
- } from "./chunk-WSGKCBY5.js";
8
+ } from "./chunk-2BWCR762.js";
9
9
  import {
10
10
  useWizardStore
11
- } from "./chunk-KPJJOLAQ.js";
11
+ } from "./chunk-5FCHJLM7.js";
12
12
  import {
13
13
  CLI_COLORS,
14
14
  DEFAULT_PLUGIN_NAME
15
- } from "./chunk-LESHL6SM.js";
15
+ } from "./chunk-AWP5A6IM.js";
16
16
  import {
17
17
  init_esm_shims
18
18
  } from "./chunk-DHET7RCE.js";
19
19
 
20
20
  // src/cli/components/wizard/wizard-layout.tsx
21
21
  init_esm_shims();
22
- import { Box, Text } from "ink";
22
+ import { Box, Static, Text } from "ink";
23
23
  import { Fragment } from "react";
24
24
 
25
25
  // src/cli/components/hooks/use-terminal-dimensions.ts
@@ -118,60 +118,69 @@ var WizardLayout = ({
118
118
  version,
119
119
  marketplaceLabel,
120
120
  logo,
121
+ startupMessages,
121
122
  children
122
123
  }) => {
123
124
  const store = useWizardStore();
124
125
  const { completedSteps, skippedSteps } = store.getStepProgress();
125
126
  const { rows: terminalHeight } = useTerminalDimensions();
126
- return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, height: terminalHeight, children: [
127
- logo && /* @__PURE__ */ jsx(Box, { flexDirection: "row", marginTop: 1, columnGap: 1, children: /* @__PURE__ */ jsx(Text, { children: logo }) }),
128
- /* @__PURE__ */ jsxs(Box, { children: [
129
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Marketplace: " }),
130
- /* @__PURE__ */ jsx(Text, { bold: true, children: marketplaceLabel || `${DEFAULT_PLUGIN_NAME} (public)` })
131
- ] }),
132
- /* @__PURE__ */ jsx(
133
- WizardTabs,
127
+ return /* @__PURE__ */ jsxs(Fragment2, { children: [
128
+ startupMessages && startupMessages.length > 0 && /* @__PURE__ */ jsx(Static, { items: startupMessages, children: (msg, index) => /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(
129
+ Text,
134
130
  {
135
- steps: WIZARD_STEPS,
136
- currentStep: store.step,
137
- completedSteps,
138
- skippedSteps,
139
- version
131
+ color: msg.level === "warn" ? "yellow" : msg.level === "error" ? "red" : void 0,
132
+ children: msg.level === "warn" ? ` Warning: ${msg.text}` : msg.text
140
133
  }
141
- ),
142
- store.showHelp ? /* @__PURE__ */ jsx(HelpModal, { currentStep: store.step }) : /* @__PURE__ */ jsxs(Fragment2, { children: [
143
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, marginTop: 1, children }),
144
- /* @__PURE__ */ jsxs(Box, { paddingX: 1, columnGap: 2, marginTop: 2, children: [
145
- /* @__PURE__ */ jsx(DefinitionItem, { label: "Expert mode", values: ["E"], isActive: store.expertMode }),
146
- /* @__PURE__ */ jsx(
147
- DefinitionItem,
148
- {
149
- label: "Labels",
150
- values: ["D"],
151
- isVisible: store.step === "build",
152
- isActive: store.showLabels
153
- }
154
- ),
155
- /* @__PURE__ */ jsx(
156
- DefinitionItem,
157
- {
158
- label: "Plugin mode",
159
- values: ["P"],
160
- isActive: store.installMode === "plugin"
161
- }
162
- ),
163
- /* @__PURE__ */ jsx(
164
- DefinitionItem,
165
- {
166
- label: "Settings",
167
- values: ["G"],
168
- isVisible: store.step === "sources",
169
- isActive: store.showSettings
170
- }
171
- ),
172
- /* @__PURE__ */ jsx(DefinitionItem, { label: "Help", values: ["?"] })
134
+ ) }, index) }),
135
+ /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, height: terminalHeight, children: [
136
+ logo && /* @__PURE__ */ jsx(Box, { flexDirection: "row", marginTop: 1, columnGap: 1, children: /* @__PURE__ */ jsx(Text, { children: logo }) }),
137
+ /* @__PURE__ */ jsxs(Box, { children: [
138
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Marketplace: " }),
139
+ /* @__PURE__ */ jsx(Text, { bold: true, children: marketplaceLabel || `${DEFAULT_PLUGIN_NAME} (public)` })
173
140
  ] }),
174
- /* @__PURE__ */ jsx(WizardFooter, {})
141
+ /* @__PURE__ */ jsx(
142
+ WizardTabs,
143
+ {
144
+ steps: WIZARD_STEPS,
145
+ currentStep: store.step,
146
+ completedSteps,
147
+ skippedSteps,
148
+ version
149
+ }
150
+ ),
151
+ store.showHelp ? /* @__PURE__ */ jsx(HelpModal, { currentStep: store.step }) : /* @__PURE__ */ jsxs(Fragment2, { children: [
152
+ /* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, marginTop: 1, children }),
153
+ /* @__PURE__ */ jsxs(Box, { paddingX: 1, columnGap: 2, marginTop: 2, children: [
154
+ /* @__PURE__ */ jsx(
155
+ DefinitionItem,
156
+ {
157
+ label: "Labels",
158
+ values: ["D"],
159
+ isVisible: store.step === "build",
160
+ isActive: store.showLabels
161
+ }
162
+ ),
163
+ /* @__PURE__ */ jsx(
164
+ DefinitionItem,
165
+ {
166
+ label: "Plugin mode",
167
+ values: ["P"],
168
+ isActive: store.installMode === "plugin"
169
+ }
170
+ ),
171
+ /* @__PURE__ */ jsx(
172
+ DefinitionItem,
173
+ {
174
+ label: "Settings",
175
+ values: ["G"],
176
+ isVisible: store.step === "sources",
177
+ isActive: store.showSettings
178
+ }
179
+ ),
180
+ /* @__PURE__ */ jsx(DefinitionItem, { label: "Help", values: ["?"] })
181
+ ] }),
182
+ /* @__PURE__ */ jsx(WizardFooter, {})
183
+ ] })
175
184
  ] })
176
185
  ] });
177
186
  };
@@ -179,4 +188,4 @@ var WizardLayout = ({
179
188
  export {
180
189
  WizardLayout
181
190
  };
182
- //# sourceMappingURL=chunk-IS7GP6XC.js.map
191
+ //# sourceMappingURL=chunk-I6IOGZSZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/wizard-layout.tsx","../src/cli/components/hooks/use-terminal-dimensions.ts"],"sourcesContent":["import { Box, Static, Text } from \"ink\";\nimport React, { Fragment } from \"react\";\nimport { CLI_COLORS, DEFAULT_PLUGIN_NAME } from \"../../consts.js\";\nimport type { StartupMessage } from \"../../utils/logger.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useTerminalDimensions } from \"../hooks/use-terminal-dimensions.js\";\nimport { HelpModal } from \"./help-modal.js\";\nimport { WIZARD_STEPS, WizardTabs } from \"./wizard-tabs.js\";\n\ntype KeyHintProps = {\n isVisible?: boolean;\n isActive?: boolean;\n label: string;\n values: string[];\n};\n\nconst DefinitionItem: React.FC<KeyHintProps> = ({\n isVisible = true,\n isActive = false,\n label,\n values,\n}) => {\n if (!isVisible) {\n return null;\n }\n\n return (\n <Text>\n {values.map((value) => (\n <Fragment key={value}>\n <Text\n backgroundColor=\"black\"\n color={isActive ? CLI_COLORS.PRIMARY : CLI_COLORS.UNFOCUSED}\n >\n {\" \"}\n {value}{\" \"}\n </Text>{\" \"}\n </Fragment>\n ))}\n <Text color={isActive ? CLI_COLORS.PRIMARY : undefined}>{label}</Text>\n </Text>\n );\n};\n\nconst HOT_KEYS: { label: string; values: string[] }[] = [\n { label: \"navigate\", values: [\"\\u2190/\\u2192\", \"\\u2191/\\u2193\"] },\n { label: \"select\", values: [\"SPACE\"] },\n { label: \"continue\", values: [\"ENTER\"] },\n { label: \"back\", values: [\"ESC\"] },\n];\n\nconst WizardFooter = () => {\n const store = useWizardStore();\n\n return (\n <Box\n columnGap={2}\n borderTop\n borderRight={false}\n borderBottom\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingLeft={1}\n paddingRight={1}\n >\n <DefinitionItem\n label=\"Accept defaults\"\n values={[\"A\"]}\n isVisible={store.step === \"build\" && !!store.selectedStackId}\n />\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string;\n marketplaceLabel?: string;\n logo?: string;\n startupMessages?: StartupMessage[];\n children: React.ReactNode;\n};\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({\n version,\n marketplaceLabel,\n logo,\n startupMessages,\n children,\n}) => {\n const store = useWizardStore();\n const { completedSteps, skippedSteps } = store.getStepProgress();\n const { rows: terminalHeight } = useTerminalDimensions();\n\n return (\n <>\n {startupMessages && startupMessages.length > 0 && (\n <Static items={startupMessages}>\n {(msg, index) => (\n <Box key={index}>\n <Text\n color={msg.level === \"warn\" ? \"yellow\" : msg.level === \"error\" ? \"red\" : undefined}\n >\n {msg.level === \"warn\" ? ` Warning: ${msg.text}` : msg.text}\n </Text>\n </Box>\n )}\n </Static>\n )}\n <Box flexDirection=\"column\" paddingX={1} height={terminalHeight}>\n {logo && (\n <Box flexDirection=\"row\" marginTop={1} columnGap={1}>\n <Text>{logo}</Text>\n </Box>\n )}\n <Box>\n <Text dimColor>Marketplace: </Text>\n <Text bold>{marketplaceLabel || `${DEFAULT_PLUGIN_NAME} (public)`}</Text>\n </Box>\n <WizardTabs\n steps={WIZARD_STEPS}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n version={version}\n />\n {store.showHelp ? (\n <HelpModal currentStep={store.step} />\n ) : (\n <>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginTop={1}>\n {children}\n </Box>\n <Box paddingX={1} columnGap={2} marginTop={2}>\n <DefinitionItem\n label=\"Labels\"\n values={[\"D\"]}\n isVisible={store.step === \"build\"}\n isActive={store.showLabels}\n />\n <DefinitionItem\n label=\"Plugin mode\"\n values={[\"P\"]}\n isActive={store.installMode === \"plugin\"}\n />\n <DefinitionItem\n label=\"Settings\"\n values={[\"G\"]}\n isVisible={store.step === \"sources\"}\n isActive={store.showSettings}\n />\n <DefinitionItem label=\"Help\" values={[\"?\"]} />\n </Box>\n <WizardFooter />\n </>\n )}\n </Box>\n </>\n );\n};\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport type TerminalDimensions = {\n /** Terminal width in columns */\n columns: number;\n /** Terminal height in rows */\n rows: number;\n};\n\n/**\n * Tracks terminal dimensions reactively. Re-renders on resize.\n *\n * Falls back to DEFAULT_COLUMNS x DEFAULT_ROWS when stdout is not a TTY\n * (e.g., piped output, CI environments, tests).\n */\nexport function useTerminalDimensions(): TerminalDimensions {\n const { stdout } = useStdout();\n\n const [dimensions, setDimensions] = useState<TerminalDimensions>(() => ({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n });\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return dimensions;\n}\n"],"mappings":"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","names":["Fragment"]}
@@ -3,17 +3,19 @@ import {
3
3
  useFocusedListItem
4
4
  } from "./chunk-GG4BSB6S.js";
5
5
  import {
6
- CLI_COLORS,
7
- SCROLL_VIEWPORT
8
- } from "./chunk-LESHL6SM.js";
6
+ useSectionScroll
7
+ } from "./chunk-GBOW6FUW.js";
8
+ import {
9
+ CLI_COLORS
10
+ } from "./chunk-AWP5A6IM.js";
9
11
  import {
10
12
  init_esm_shims
11
13
  } from "./chunk-DHET7RCE.js";
12
14
 
13
15
  // src/cli/components/wizard/category-grid.tsx
14
16
  init_esm_shims();
15
- import { useCallback as useCallback2, useEffect as useEffect2, useMemo, useRef as useRef2, useState } from "react";
16
- import { Box, Text, measureElement } from "ink";
17
+ import { useCallback as useCallback2, useMemo } from "react";
18
+ import { Box, Text } from "ink";
17
19
 
18
20
  // src/cli/components/hooks/use-category-grid-input.ts
19
21
  init_esm_shims();
@@ -100,7 +102,7 @@ function useCategoryGridInput({
100
102
  if (input === " ") {
101
103
  if (currentLocked) return;
102
104
  const currentOption = currentOptions[focusedCol];
103
- if (currentOption && currentOption.state !== "disabled") {
105
+ if (currentOption) {
104
106
  onToggle(currentRow.id, currentOption.id);
105
107
  }
106
108
  return;
@@ -130,18 +132,6 @@ function useCategoryGridInput({
130
132
  // src/cli/components/wizard/category-grid.tsx
131
133
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
132
134
  var SYMBOL_REQUIRED = "*";
133
- var STATE_PRIORITY = {
134
- recommended: 0,
135
- normal: 1,
136
- discouraged: 2,
137
- disabled: 3
138
- };
139
- var stableSortByState = (options) => {
140
- return [...options].sort((a, b) => {
141
- if (a.selected !== b.selected) return a.selected ? -1 : 1;
142
- return STATE_PRIORITY[a.state] - STATE_PRIORITY[b.state];
143
- });
144
- };
145
135
  var findNextValidOption = (options, currentIndex, direction, wrap = true) => {
146
136
  const length = options.length;
147
137
  if (length === 0) return currentIndex;
@@ -157,23 +147,21 @@ var findNextValidOption = (options, currentIndex, direction, wrap = true) => {
157
147
  };
158
148
  var getCompatibilityLabel = (option, isLocked) => {
159
149
  if (option.selected) return "(selected)";
160
- if (isLocked || option.state === "disabled") return "(disabled)";
150
+ if (isLocked) return "(disabled)";
161
151
  if (option.state === "recommended") return "(recommended)";
162
152
  if (option.state === "discouraged") return "(discouraged)";
163
153
  return null;
164
154
  };
165
155
  var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
166
156
  const getTextColor = () => {
167
- if (option.state === "disabled" && option.selected) return CLI_COLORS.PRIMARY;
168
- if (isLocked || option.state === "disabled") return CLI_COLORS.NEUTRAL;
157
+ if (isLocked) return CLI_COLORS.NEUTRAL;
169
158
  if (option.selected) return CLI_COLORS.PRIMARY;
170
159
  if (option.state === "recommended") return CLI_COLORS.UNFOCUSED;
171
160
  if (option.state === "discouraged") return CLI_COLORS.WARNING;
172
161
  return CLI_COLORS.NEUTRAL;
173
162
  };
174
163
  const getStateBorderColor = () => {
175
- if (option.state === "disabled" && option.selected) return CLI_COLORS.PRIMARY;
176
- if (isLocked || option.state === "disabled") return CLI_COLORS.NEUTRAL;
164
+ if (isLocked) return CLI_COLORS.NEUTRAL;
177
165
  if (option.selected) return CLI_COLORS.PRIMARY;
178
166
  if (option.state === "recommended") return CLI_COLORS.UNFOCUSED;
179
167
  if (option.state === "discouraged") return CLI_COLORS.WARNING;
@@ -189,7 +177,7 @@ var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
189
177
  borderStyle: "single",
190
178
  flexShrink: 0,
191
179
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
192
- /* @__PURE__ */ jsxs(Text, { color: textColor, bold: true, dimColor: option.state === "disabled" && option.selected, children: [
180
+ /* @__PURE__ */ jsxs(Text, { color: textColor, bold: true, children: [
193
181
  " ",
194
182
  option.label,
195
183
  " "
@@ -209,11 +197,10 @@ var CategorySection = ({
209
197
  isLocked,
210
198
  isFocused,
211
199
  focusedOptionIndex,
212
- showLabels,
213
- expertMode
200
+ showLabels
214
201
  }) => {
215
202
  const selectedCount = options.filter((o) => o.selected).length;
216
- const selectionCounter = expertMode ? null : category.exclusive ? `(${selectedCount} of 1)` : `(${selectedCount} selected)`;
203
+ const selectionCounter = category.exclusive ? `(${selectedCount} of 1)` : `(${selectedCount} selected)`;
217
204
  return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: isFirst ? 0 : 1, children: [
218
205
  /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
219
206
  /* @__PURE__ */ jsx(Text, { dimColor: isLocked, color: isFocused ? "#fff" : "gray", children: category.displayName }),
@@ -242,33 +229,14 @@ var CategoryGrid = ({
242
229
  categories,
243
230
  availableHeight = 0,
244
231
  showLabels,
245
- expertMode,
246
232
  onToggle,
247
233
  onToggleLabels,
248
234
  defaultFocusedRow = 0,
249
235
  defaultFocusedCol = 0,
250
236
  onFocusChange
251
237
  }) => {
252
- const initialOrderRef = useRef2(/* @__PURE__ */ new Map());
253
238
  const processedCategories = useMemo(
254
- () => categories.map((category) => {
255
- const cached = initialOrderRef.current.get(category.id);
256
- if (cached) {
257
- const orderMap = new Map(cached.map((id, idx) => [id, idx]));
258
- const sorted2 = [...category.options].sort((a, b) => {
259
- const aIdx = orderMap.get(a.id) ?? Infinity;
260
- const bIdx = orderMap.get(b.id) ?? Infinity;
261
- return aIdx - bIdx;
262
- });
263
- return { ...category, sortedOptions: sorted2 };
264
- }
265
- const sorted = stableSortByState(category.options);
266
- initialOrderRef.current.set(
267
- category.id,
268
- sorted.map((o) => o.id)
269
- );
270
- return { ...category, sortedOptions: sorted };
271
- }),
239
+ () => categories.map((category) => ({ ...category, sortedOptions: category.options })),
272
240
  [categories]
273
241
  );
274
242
  const getColCount = useCallback2(
@@ -313,52 +281,18 @@ var CategoryGrid = ({
313
281
  onToggle,
314
282
  onToggleLabels
315
283
  });
316
- const sectionRefs = useRef2([]);
317
- const [sectionHeights, setSectionHeights] = useState([]);
318
- const [scrollTopPx, setScrollTopPx] = useState(0);
319
- const setSectionRef = useCallback2((index, el) => {
320
- sectionRefs.current[index] = el;
321
- }, []);
322
- useEffect2(() => {
323
- const heights = sectionRefs.current.map((el) => {
324
- if (el) {
325
- const { height } = measureElement(el);
326
- return height;
327
- }
328
- return 0;
329
- });
330
- setSectionHeights((prev) => {
331
- if (prev.length === heights.length && prev.every((h, i) => h === heights[i])) {
332
- return prev;
333
- }
334
- return heights;
335
- });
284
+ const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({
285
+ sectionCount: processedCategories.length,
286
+ focusedIndex: focusedRow,
287
+ availableHeight
336
288
  });
337
- const scrollEnabled = availableHeight > 0 && availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;
338
- useEffect2(() => {
339
- if (!scrollEnabled || sectionHeights.length === 0) return;
340
- let topOfFocused = 0;
341
- for (let i = 0; i < focusedRow; i++) {
342
- topOfFocused += sectionHeights[i] ?? 0;
343
- }
344
- const focusedHeight = sectionHeights[focusedRow] ?? 0;
345
- const bottomOfFocused = topOfFocused + focusedHeight;
346
- setScrollTopPx((prev) => {
347
- if (topOfFocused < prev) {
348
- return topOfFocused;
349
- }
350
- if (bottomOfFocused > prev + availableHeight) {
351
- return bottomOfFocused - availableHeight;
352
- }
353
- return prev;
354
- });
355
- }, [focusedRow, sectionHeights, scrollEnabled, availableHeight]);
356
289
  if (categories.length === 0) {
357
290
  return /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No categories to display." }) });
358
291
  }
292
+ const noShrink = scrollEnabled ? { flexShrink: 0 } : {};
359
293
  const sectionElements = processedCategories.map((category, index) => {
360
294
  const isLocked = isSectionLocked(category.id, categories);
361
- return /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(index, el), flexShrink: 0, children: /* @__PURE__ */ jsx(
295
+ return /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(index, el), ...noShrink, children: /* @__PURE__ */ jsx(
362
296
  CategorySection,
363
297
  {
364
298
  category,
@@ -367,18 +301,21 @@ var CategoryGrid = ({
367
301
  isFocused: index === focusedRow,
368
302
  focusedOptionIndex: focusedCol,
369
303
  showLabels,
370
- expertMode,
371
304
  isFirst: index === 0
372
305
  }
373
306
  ) }, category.id);
374
307
  });
375
- if (!scrollEnabled) {
376
- return /* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: sectionElements });
377
- }
378
- return /* @__PURE__ */ jsx(Box, { flexDirection: "column", height: availableHeight, overflow: "hidden", children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: scrollTopPx > 0 ? -scrollTopPx : 0, flexShrink: 0, children: sectionElements }) });
308
+ return /* @__PURE__ */ jsx(
309
+ Box,
310
+ {
311
+ flexDirection: "column",
312
+ ...scrollEnabled ? { height: availableHeight, overflow: "hidden" } : { flexGrow: 1 },
313
+ children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: scrollTopPx > 0 ? -scrollTopPx : 0, ...noShrink, children: sectionElements })
314
+ }
315
+ );
379
316
  };
380
317
 
381
318
  export {
382
319
  CategoryGrid
383
320
  };
384
- //# sourceMappingURL=chunk-OTTITQ7C.js.map
321
+ //# sourceMappingURL=chunk-JFF7P4LC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/components/wizard/category-grid.tsx","../src/cli/components/hooks/use-category-grid-input.ts"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\n\nimport { Box, Text } from \"ink\";\n\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { SkillId, Subcategory } from \"../../types/index.js\";\nimport { isSectionLocked, useCategoryGridInput } from \"../hooks/use-category-grid-input.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\n\nexport type OptionState = \"normal\" | \"recommended\" | \"discouraged\";\n\nexport type CategoryOption = {\n id: SkillId;\n label: string;\n state: OptionState;\n stateReason?: string;\n selected: boolean;\n local?: boolean;\n installed?: boolean;\n};\n\nexport type CategoryRow = {\n id: Subcategory;\n displayName: string;\n required: boolean;\n exclusive: boolean;\n options: CategoryOption[];\n};\n\nexport type CategoryGridProps = {\n categories: CategoryRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n showLabels: boolean;\n onToggle: (categoryId: Subcategory, technologyId: SkillId) => void;\n onToggleLabels: () => 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\nconst SYMBOL_REQUIRED = \"*\";\n\nconst findNextValidOption = (\n options: CategoryOption[],\n currentIndex: number,\n direction: 1 | -1,\n wrap = true,\n): number => {\n const length = options.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex + direction;\n\n if (wrap) {\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n } else {\n if (index < 0) index = 0;\n if (index >= length) index = length - 1;\n }\n\n return index;\n};\n\ntype SkillTagProps = {\n option: CategoryOption;\n isFocused: boolean;\n isLocked: boolean;\n showLabels: boolean;\n};\n\nconst getCompatibilityLabel = (option: CategoryOption, isLocked: boolean): string | null => {\n if (option.selected) return \"(selected)\";\n if (isLocked) return \"(disabled)\";\n if (option.state === \"recommended\") return \"(recommended)\";\n if (option.state === \"discouraged\") return \"(discouraged)\";\n return null;\n};\n\nconst SkillTag: React.FC<SkillTagProps> = ({ option, isFocused, isLocked, showLabels }) => {\n const getTextColor = (): string => {\n if (isLocked) return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n\n return CLI_COLORS.NEUTRAL;\n };\n\n const getStateBorderColor = (): string => {\n if (isLocked) return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n return CLI_COLORS.UNFOCUSED;\n };\n\n const textColor = getTextColor();\n const compatibilityLabel = showLabels ? getCompatibilityLabel(option, isLocked) : null;\n\n return (\n <Box\n marginRight={1}\n borderColor={isFocused ? getStateBorderColor() : CLI_COLORS.NEUTRAL}\n borderStyle=\"single\"\n flexShrink={0}\n >\n <>\n <Text color={textColor} bold>\n {\" \"}\n {option.label}{\" \"}\n </Text>\n {compatibilityLabel && <Text dimColor>{compatibilityLabel} </Text>}\n </>\n </Box>\n );\n};\n\ntype CategorySectionProps = {\n isFirst: boolean;\n category: CategoryRow;\n options: CategoryOption[];\n isLocked: boolean;\n isFocused: boolean;\n focusedOptionIndex: number;\n showLabels: boolean;\n};\n\nconst CategorySection: React.FC<CategorySectionProps> = ({\n isFirst,\n category,\n options,\n isLocked,\n isFocused,\n focusedOptionIndex,\n showLabels,\n}) => {\n const selectedCount = options.filter((o) => o.selected).length;\n\n const selectionCounter = category.exclusive\n ? `(${selectedCount} of 1)`\n : `(${selectedCount} selected)`;\n\n return (\n <Box flexDirection=\"column\" marginTop={isFirst ? 0 : 1}>\n <Box flexDirection=\"row\">\n <Text dimColor={isLocked} color={isFocused ? \"#fff\" : \"gray\"}>\n {category.displayName}\n </Text>\n {category.required && (\n <Text color={isLocked ? CLI_COLORS.NEUTRAL : CLI_COLORS.ERROR} dimColor={isLocked}>\n {\" \"}\n {SYMBOL_REQUIRED}\n </Text>\n )}\n {selectionCounter && <Text dimColor> {selectionCounter}</Text>}\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {options.map((option, index) => (\n <SkillTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex && !isLocked}\n isLocked={isLocked}\n showLabels={showLabels}\n />\n ))}\n </Box>\n </Box>\n );\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\nexport const CategoryGrid: React.FC<CategoryGridProps> = ({\n categories,\n availableHeight = 0,\n showLabels,\n onToggle,\n onToggleLabels,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n}) => {\n const processedCategories = useMemo(\n () => categories.map((category) => ({ ...category, sortedOptions: category.options })),\n [categories],\n );\n\n const getColCount = useCallback(\n (row: number): number => processedCategories[row]?.sortedOptions.length ?? 0,\n [processedCategories],\n );\n\n const isRowLocked = useCallback(\n (row: number): boolean => {\n const cat = processedCategories[row];\n return cat ? isSectionLocked(cat.id, categories) : false;\n },\n [processedCategories, categories],\n );\n\n const findValidCol = useCallback(\n (row: number, currentCol: number, direction: 1 | -1): number => {\n const options = processedCategories[row]?.sortedOptions || [];\n const catId = processedCategories[row]?.id;\n if (catId && isSectionLocked(catId, categories)) return currentCol;\n return findNextValidOption(options, currentCol, direction, true);\n },\n [processedCategories, categories],\n );\n\n const { focusedRow, focusedCol, setFocused, moveFocus } = useFocusedListItem(\n processedCategories.length,\n getColCount,\n {\n wrap: true,\n isRowLocked,\n findValidCol,\n onChange: onFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n },\n );\n\n useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n });\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: processedCategories.length,\n focusedIndex: focusedRow,\n availableHeight,\n });\n\n if (categories.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No categories to display.</Text>\n </Box>\n );\n }\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = processedCategories.map((category, index) => {\n const isLocked = isSectionLocked(category.id, categories);\n\n return (\n <Box key={category.id} ref={(el) => setSectionRef(index, el)} {...noShrink}>\n <CategorySection\n category={category}\n options={category.sortedOptions}\n isLocked={isLocked}\n isFocused={index === focusedRow}\n focusedOptionIndex={focusedCol}\n showLabels={showLabels}\n isFirst={index === 0}\n />\n </Box>\n );\n });\n\n return (\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled\n ? { height: availableHeight, overflow: \"hidden\" as const }\n : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n </Box>\n </Box>\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { useInput } from \"ink\";\n\nimport type { Subcategory, SkillId } from \"../../types/index.js\";\nimport type { CategoryOption, CategoryRow } from \"../wizard/category-grid.js\";\n\nconst FRAMEWORK_CATEGORY_ID = \"web-framework\";\n\n// Locked = non-framework section when no framework is selected\nexport const isSectionLocked = (categoryId: Subcategory, categories: CategoryRow[]): boolean => {\n if (categoryId === FRAMEWORK_CATEGORY_ID) {\n return false;\n }\n\n const frameworkCategory = categories.find((cat) => cat.id === FRAMEWORK_CATEGORY_ID);\n if (!frameworkCategory) return false;\n\n return !frameworkCategory.options.some((opt) => opt.selected);\n};\n\nexport const findValidStartColumn = (_options: CategoryOption[]): number => {\n return 0;\n};\n\n/** Find next unlocked section index (wrapping, direction: forward) */\nexport const findNextUnlockedIndex = (\n processed: { id: Subcategory; sortedOptions: CategoryOption[] }[],\n currentIndex: number,\n allCategories: CategoryRow[],\n): number => {\n const length = processed.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex;\n let attempts = 0;\n\n while (attempts < length) {\n index += 1;\n if (index >= length) index = 0;\n\n const category = processed[index];\n if (category && !isSectionLocked(category.id, allCategories)) {\n return index;\n }\n\n attempts++;\n }\n\n return currentIndex;\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\ntype UseCategoryGridInputOptions = {\n processedCategories: ProcessedCategory[];\n categories: CategoryRow[];\n focusedRow: number;\n focusedCol: number;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: \"up\" | \"down\" | \"left\" | \"right\") => void;\n onToggle: (categoryId: Subcategory, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n};\n\nexport function useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n}: UseCategoryGridInputOptions): void {\n const currentRow = processedCategories[focusedRow];\n const currentOptions = currentRow?.sortedOptions || [];\n const currentLocked = currentRow ? isSectionLocked(currentRow.id, categories) : false;\n\n // Adjust column when current row's options change externally (e.g. option becomes disabled)\n useEffect(() => {\n if (!currentRow) return;\n\n const maxCol = currentOptions.length - 1;\n if (focusedCol > maxCol) {\n const newCol = Math.max(0, maxCol);\n setFocused(focusedRow, newCol);\n }\n }, [focusedRow, currentOptions, focusedCol, setFocused, currentRow]);\n\n // Bounce off locked sections when a section becomes locked (e.g. framework deselected)\n useEffect(() => {\n if (currentRow && currentLocked) {\n const nextUnlocked = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextUnlocked !== focusedRow) {\n const newRowOptions = processedCategories[nextUnlocked]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextUnlocked, newCol);\n }\n }\n }, [currentRow, currentLocked, focusedRow, processedCategories, categories, setFocused]);\n\n // Store the latest handler in a ref so that the useInput effect never needs to\n // re-register on the event emitter. This avoids a stale-closure race condition\n // where, after a domain switch (CategoryGrid remount via key={activeDomain}),\n // the useInput effect may not yet have re-registered the updated handler when\n // the first keypress arrives — causing the first space press to be silently lost.\n type InputKey = {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n tab: boolean;\n shift: boolean;\n };\n\n const handlerRef = useRef<((input: string, key: InputKey) => void) | null>(null);\n handlerRef.current = (input: string, key: InputKey) => {\n if (key.tab && key.shift) {\n onToggleLabels();\n return;\n }\n\n if (key.tab && !key.shift) {\n const nextSection = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextSection !== focusedRow) {\n const newRowOptions = processedCategories[nextSection]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextSection, newCol);\n }\n return;\n }\n\n if (input === \"d\" || input === \"D\") {\n onToggleLabels();\n return;\n }\n\n if (input === \" \") {\n if (currentLocked) return;\n const currentOption = currentOptions[focusedCol];\n if (currentOption) {\n onToggle(currentRow.id, currentOption.id);\n }\n return;\n }\n\n const isLeft = key.leftArrow || input === \"h\";\n const isRight = key.rightArrow || input === \"l\";\n const isUp = key.upArrow || input === \"k\";\n const isDown = key.downArrow || input === \"j\";\n\n if (isLeft) {\n if (currentLocked) return;\n moveFocus(\"left\");\n } else if (isRight) {\n if (currentLocked) return;\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n };\n\n // Stable handler reference — never changes, so useInput's effect registers once\n const stableHandler = useCallback((input: string, key: InputKey) => {\n handlerRef.current?.(input, key);\n }, []);\n\n useInput(stableHandler);\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  CLI_COLORS
4
- } from "./chunk-LESHL6SM.js";
4
+ } from "./chunk-AWP5A6IM.js";
5
5
  import {
6
6
  init_esm_shims
7
7
  } from "./chunk-DHET7RCE.js";
@@ -78,4 +78,4 @@ var cliTheme = extendTheme(defaultTheme, {
78
78
  export {
79
79
  cliTheme
80
80
  };
81
- //# sourceMappingURL=chunk-FHKNG3UA.js.map
81
+ //# sourceMappingURL=chunk-JWYRXE6C.js.map
@@ -8,10 +8,10 @@ import {
8
8
  verbose,
9
9
  warn,
10
10
  writeFile
11
- } from "./chunk-YMUWTPOM.js";
11
+ } from "./chunk-WBHPCBVN.js";
12
12
  import {
13
13
  MAX_PLUGIN_FILE_SIZE
14
- } from "./chunk-LESHL6SM.js";
14
+ } from "./chunk-AWP5A6IM.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "./chunk-DHET7RCE.js";
@@ -129,4 +129,4 @@ export {
129
129
  writeMarketplace,
130
130
  getMarketplaceStats
131
131
  };
132
- //# sourceMappingURL=chunk-W62XVWXB.js.map
132
+ //# sourceMappingURL=chunk-KAO3LKB5.js.map
@@ -1,44 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "./chunk-IS7GP6XC.js";
4
+ } from "./chunk-I6IOGZSZ.js";
5
5
  import {
6
6
  StepSettings
7
- } from "./chunk-2DNDAXF6.js";
7
+ } from "./chunk-YDYRAXSY.js";
8
8
  import {
9
9
  StepSources
10
- } from "./chunk-5O6GKXAN.js";
10
+ } from "./chunk-SPFHPHYL.js";
11
11
  import {
12
12
  StepStack
13
- } from "./chunk-PY2XZUBF.js";
13
+ } from "./chunk-5FPIKTSA.js";
14
14
  import {
15
15
  StepAgents
16
- } from "./chunk-VBAAATPU.js";
16
+ } from "./chunk-M3GQ2R3E.js";
17
17
  import {
18
18
  StepBuild
19
- } from "./chunk-5MN5S3DV.js";
19
+ } from "./chunk-QB5HHTAA.js";
20
20
  import {
21
21
  StepConfirm
22
- } from "./chunk-OHDEJEYB.js";
22
+ } from "./chunk-XDSVV5GZ.js";
23
23
  import {
24
24
  getStackName
25
- } from "./chunk-GSPPOXMG.js";
25
+ } from "./chunk-HYEUETIC.js";
26
26
  import {
27
27
  cliTheme
28
- } from "./chunk-FHKNG3UA.js";
28
+ } from "./chunk-JWYRXE6C.js";
29
29
  import {
30
30
  useWizardStore
31
- } from "./chunk-KPJJOLAQ.js";
31
+ } from "./chunk-5FCHJLM7.js";
32
32
  import {
33
33
  resolveAlias,
34
34
  validateSelection
35
- } from "./chunk-P2SFRDWI.js";
35
+ } from "./chunk-HMSHB5EQ.js";
36
36
  import {
37
37
  warn
38
- } from "./chunk-YMUWTPOM.js";
38
+ } from "./chunk-WBHPCBVN.js";
39
39
  import {
40
40
  CLI_COLORS
41
- } from "./chunk-LESHL6SM.js";
41
+ } from "./chunk-AWP5A6IM.js";
42
42
  import {
43
43
  init_esm_shims
44
44
  } from "./chunk-DHET7RCE.js";
@@ -56,7 +56,6 @@ function useWizardInitialization({
56
56
  matrix,
57
57
  initialStep,
58
58
  initialInstallMode,
59
- initialExpertMode,
60
59
  initialDomains,
61
60
  initialAgents,
62
61
  installedSkillIds
@@ -73,9 +72,6 @@ function useWizardInitialization({
73
72
  if (initialInstallMode) {
74
73
  useWizardStore.setState({ installMode: initialInstallMode });
75
74
  }
76
- if (initialExpertMode) {
77
- useWizardStore.setState({ expertMode: initialExpertMode });
78
- }
79
75
  if (initialDomains?.length) {
80
76
  useWizardStore.setState({ selectedDomains: initialDomains });
81
77
  }
@@ -123,7 +119,6 @@ function useBuildStepProps({
123
119
  selections: store.domainSelections[activeDomain] || {},
124
120
  allSelections,
125
121
  showLabels: store.showLabels,
126
- expertMode: store.expertMode,
127
122
  installedSkillIds,
128
123
  onToggle,
129
124
  onToggleLabels: store.toggleShowLabels,
@@ -145,11 +140,11 @@ var Wizard = ({
145
140
  logo,
146
141
  initialStep,
147
142
  initialInstallMode,
148
- initialExpertMode,
149
143
  initialDomains,
150
144
  initialAgents,
151
145
  installedSkillIds,
152
- projectDir
146
+ projectDir,
147
+ startupMessages
153
148
  }) => {
154
149
  const store = useWizardStore();
155
150
  const { exit } = useApp();
@@ -162,7 +157,6 @@ var Wizard = ({
162
157
  matrix,
163
158
  initialStep,
164
159
  initialInstallMode,
165
- initialExpertMode,
166
160
  initialDomains,
167
161
  initialAgents,
168
162
  installedSkillIds
@@ -200,10 +194,6 @@ var Wizard = ({
200
194
  store.toggleSettings();
201
195
  return;
202
196
  }
203
- if (input === "e" || input === "E") {
204
- store.toggleExpertMode();
205
- return;
206
- }
207
197
  if (input === "p" || input === "P") {
208
198
  store.toggleInstallMode();
209
199
  }
@@ -242,7 +232,6 @@ var Wizard = ({
242
232
  domainSelections: store.domainSelections,
243
233
  selectedDomains: store.selectedDomains,
244
234
  sourceSelections: store.sourceSelections,
245
- expertMode: store.expertMode,
246
235
  installMode: store.installMode,
247
236
  cancelled: false,
248
237
  validation
@@ -317,10 +306,19 @@ var Wizard = ({
317
306
  ". Please resize your terminal."
318
307
  ] }) }) });
319
308
  }
320
- return /* @__PURE__ */ jsx(ThemeProvider, { theme: cliTheme, children: /* @__PURE__ */ jsx(WizardLayout, { version, marketplaceLabel, logo, children: renderStep() }) });
309
+ return /* @__PURE__ */ jsx(ThemeProvider, { theme: cliTheme, children: /* @__PURE__ */ jsx(
310
+ WizardLayout,
311
+ {
312
+ version,
313
+ marketplaceLabel,
314
+ logo,
315
+ startupMessages,
316
+ children: renderStep()
317
+ }
318
+ ) });
321
319
  };
322
320
 
323
321
  export {
324
322
  Wizard
325
323
  };
326
- //# sourceMappingURL=chunk-AMNCCZSG.js.map
324
+ //# sourceMappingURL=chunk-KQOU4POU.js.map