@agents-inc/cli 0.32.1 → 0.34.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +7 -7
  3. package/config/skills-matrix.yaml +1 -1
  4. package/config/stacks.yaml +1 -1
  5. package/dist/{chunk-OMV7TLWD.js → chunk-2LUXM5FB.js} +26 -89
  6. package/dist/chunk-2LUXM5FB.js.map +1 -0
  7. package/dist/{chunk-Z4TWOP3H.js → chunk-5YNZJ5TP.js} +2 -2
  8. package/dist/{chunk-UX2H2K2G.js → chunk-A5CYQQVG.js} +2 -2
  9. package/dist/chunk-ALS7SH7X.js +120 -0
  10. package/dist/chunk-ALS7SH7X.js.map +1 -0
  11. package/dist/{chunk-BZQBJP34.js → chunk-ANGAZ444.js} +2 -2
  12. package/dist/{chunk-IZZ4IIEG.js → chunk-B47QYIUL.js} +4 -4
  13. package/dist/{chunk-5PIKNCZX.js → chunk-CB7GYRUP.js} +5 -5
  14. package/dist/{chunk-4RAY5AOI.js → chunk-CEWNZQMH.js} +3 -3
  15. package/dist/{chunk-R74PZWQS.js → chunk-GGHH3KR2.js} +5 -5
  16. package/dist/chunk-GGHH3KR2.js.map +1 -0
  17. package/dist/{chunk-UICL22RT.js → chunk-GIFEDW27.js} +4 -4
  18. package/dist/{chunk-ODUOU55D.js → chunk-GVMA2EKC.js} +2 -2
  19. package/dist/chunk-HTTPKSL6.js +31 -0
  20. package/dist/chunk-HTTPKSL6.js.map +1 -0
  21. package/dist/{chunk-FJQRVFMB.js → chunk-JXMRTHDT.js} +2 -2
  22. package/dist/{chunk-PBEHPQLK.js → chunk-JZOLJVWA.js} +55 -20
  23. package/dist/chunk-JZOLJVWA.js.map +1 -0
  24. package/dist/{chunk-YND42IXK.js → chunk-KENWMEKN.js} +11 -9
  25. package/dist/chunk-KENWMEKN.js.map +1 -0
  26. package/dist/{chunk-IYG2LAIM.js → chunk-LFHZBF6N.js} +5 -17
  27. package/dist/chunk-LFHZBF6N.js.map +1 -0
  28. package/dist/{chunk-SO22IQPY.js → chunk-MZB3GGOH.js} +2 -2
  29. package/dist/chunk-MZB3GGOH.js.map +1 -0
  30. package/dist/{chunk-BZN2Z5P7.js → chunk-NLR6Z37M.js} +1 -1
  31. package/dist/chunk-NLR6Z37M.js.map +1 -0
  32. package/dist/{chunk-OGJIZ6QH.js → chunk-OKILA27U.js} +122 -232
  33. package/dist/chunk-OKILA27U.js.map +1 -0
  34. package/dist/{chunk-A27LOC4Z.js → chunk-QC37C32G.js} +2 -2
  35. package/dist/{chunk-3ZOIOVKT.js → chunk-R3AD6XBJ.js} +4 -4
  36. package/dist/chunk-R3AD6XBJ.js.map +1 -0
  37. package/dist/{chunk-LGUI3PMO.js → chunk-TKB4O2RY.js} +9 -9
  38. package/dist/chunk-TKB4O2RY.js.map +1 -0
  39. package/dist/{chunk-MM7NK5N2.js → chunk-TM4I4EHK.js} +5 -13
  40. package/dist/chunk-TM4I4EHK.js.map +1 -0
  41. package/dist/{chunk-R3XFQKPG.js → chunk-VEZ2GZEK.js} +2 -2
  42. package/dist/{chunk-WEUVWHMA.js → chunk-X7SPCWY6.js} +8 -8
  43. package/dist/{chunk-EMJ2ZKS7.js → chunk-XYCN2GCV.js} +3 -3
  44. package/dist/{chunk-LAPCUV4D.js → chunk-YCS7GF6Y.js} +2 -4
  45. package/dist/chunk-YCS7GF6Y.js.map +1 -0
  46. package/dist/{chunk-QPTOIZAT.js → chunk-YPJKOM42.js} +2 -2
  47. package/dist/{chunk-FZGYSLJL.js → chunk-ZE355C6C.js} +2 -2
  48. package/dist/{chunk-B2UBHA66.js → chunk-ZI5EBHCC.js} +26 -35
  49. package/dist/chunk-ZI5EBHCC.js.map +1 -0
  50. package/dist/{chunk-W2ZSCZ2U.js → chunk-ZP4BI6J2.js} +4 -4
  51. package/dist/commands/build/marketplace.js +3 -3
  52. package/dist/commands/build/plugins.js +5 -5
  53. package/dist/commands/build/stack.js +5 -5
  54. package/dist/commands/compile.js +7 -7
  55. package/dist/commands/compile.js.map +1 -1
  56. package/dist/commands/config/get.js +4 -4
  57. package/dist/commands/config/index.js +5 -5
  58. package/dist/commands/config/path.js +4 -4
  59. package/dist/commands/config/set-project.js +4 -4
  60. package/dist/commands/config/show.js +5 -5
  61. package/dist/commands/config/unset-project.js +4 -4
  62. package/dist/commands/diff.js +5 -5
  63. package/dist/commands/diff.js.map +1 -1
  64. package/dist/commands/doctor.js +7 -7
  65. package/dist/commands/doctor.js.map +1 -1
  66. package/dist/commands/edit.js +28 -31
  67. package/dist/commands/edit.js.map +1 -1
  68. package/dist/commands/eject.js +5 -5
  69. package/dist/commands/eject.js.map +1 -1
  70. package/dist/commands/import/skill.js +5 -5
  71. package/dist/commands/info.js +6 -6
  72. package/dist/commands/info.js.map +1 -1
  73. package/dist/commands/init.js +35 -41
  74. package/dist/commands/init.js.map +1 -1
  75. package/dist/commands/list.js +5 -5
  76. package/dist/commands/list.js.map +1 -1
  77. package/dist/commands/new/agent.js +5 -5
  78. package/dist/commands/new/skill.js +5 -5
  79. package/dist/commands/new/skill.js.map +1 -1
  80. package/dist/commands/outdated.js +5 -5
  81. package/dist/commands/outdated.js.map +1 -1
  82. package/dist/commands/search.js +7 -7
  83. package/dist/commands/uninstall.js +6 -6
  84. package/dist/commands/update.js +7 -7
  85. package/dist/commands/update.js.map +1 -1
  86. package/dist/commands/validate.js +5 -5
  87. package/dist/commands/version/bump.js +4 -4
  88. package/dist/commands/version/index.js +4 -4
  89. package/dist/commands/version/set.js +4 -4
  90. package/dist/commands/version/show.js +4 -4
  91. package/dist/components/skill-search/skill-search.js +3 -3
  92. package/dist/components/wizard/category-grid.js +2 -2
  93. package/dist/components/wizard/category-grid.test.js +34 -66
  94. package/dist/components/wizard/category-grid.test.js.map +1 -1
  95. package/dist/components/wizard/domain-selection.js +5 -5
  96. package/dist/components/wizard/help-modal.js +2 -2
  97. package/dist/components/wizard/menu-item.js +2 -2
  98. package/dist/components/wizard/search-modal.js +2 -2
  99. package/dist/components/wizard/search-modal.test.js +2 -2
  100. package/dist/components/wizard/section-progress.js +2 -2
  101. package/dist/components/wizard/section-progress.test.js +2 -2
  102. package/dist/components/wizard/source-grid.js +4 -4
  103. package/dist/components/wizard/source-grid.test.js +4 -4
  104. package/dist/components/wizard/stack-selection.js +8 -8
  105. package/dist/components/wizard/step-build.js +7 -7
  106. package/dist/components/wizard/step-build.test.js +17 -17
  107. package/dist/components/wizard/step-build.test.js.map +1 -1
  108. package/dist/components/wizard/step-confirm.js +3 -3
  109. package/dist/components/wizard/step-confirm.test.js +6 -6
  110. package/dist/components/wizard/step-refine.js +2 -2
  111. package/dist/components/wizard/step-refine.test.js +2 -2
  112. package/dist/components/wizard/step-settings.js +5 -5
  113. package/dist/components/wizard/step-settings.test.js +12 -12
  114. package/dist/components/wizard/step-settings.test.js.map +1 -1
  115. package/dist/components/wizard/step-sources.js +9 -9
  116. package/dist/components/wizard/step-sources.test.js +10 -10
  117. package/dist/components/wizard/step-stack.js +10 -10
  118. package/dist/components/wizard/step-stack.test.js +19 -23
  119. package/dist/components/wizard/step-stack.test.js.map +1 -1
  120. package/dist/components/wizard/view-title.js +2 -2
  121. package/dist/components/wizard/wizard-layout.js +7 -7
  122. package/dist/components/wizard/wizard-tabs.js +2 -2
  123. package/dist/components/wizard/wizard-tabs.test.js +7 -8
  124. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  125. package/dist/components/wizard/wizard.js +23 -23
  126. package/dist/config/skills-matrix.yaml +1 -1
  127. package/dist/config/stacks.yaml +1 -1
  128. package/dist/hooks/init.js +3 -3
  129. package/dist/{source-manager-SBPPLOQQ.js → source-manager-WJYANKDI.js} +4 -4
  130. package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
  131. package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
  132. package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
  133. package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
  134. package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
  135. package/dist/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  136. package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  137. package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
  138. package/dist/src/agents/meta/agent-summoner/workflow.md +3 -3
  139. package/dist/src/agents/meta/documentor/agent.yaml +1 -1
  140. package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
  141. package/dist/src/agents/meta/skill-summoner/output-format.md +1 -1
  142. package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
  143. package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  144. package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  145. package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
  146. package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
  147. package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
  148. package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  149. package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  150. package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  151. package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
  152. package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
  153. package/dist/stores/wizard-store.js +4 -4
  154. package/dist/stores/wizard-store.test.js +5 -5
  155. package/package.json +8 -8
  156. package/src/agents/developer/api-developer/agent.yaml +1 -1
  157. package/src/agents/developer/cli-developer/agent.yaml +1 -1
  158. package/src/agents/developer/web-architecture/agent.yaml +1 -1
  159. package/src/agents/developer/web-developer/agent.yaml +1 -1
  160. package/src/agents/meta/agent-summoner/agent.yaml +1 -1
  161. package/src/agents/meta/agent-summoner/critical-reminders.md +1 -1
  162. package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
  163. package/src/agents/meta/agent-summoner/examples.md +2 -2
  164. package/src/agents/meta/agent-summoner/workflow.md +3 -3
  165. package/src/agents/meta/documentor/agent.yaml +1 -1
  166. package/src/agents/meta/skill-summoner/agent.yaml +1 -1
  167. package/src/agents/meta/skill-summoner/output-format.md +1 -1
  168. package/src/agents/migration/cli-migrator/agent.yaml +1 -1
  169. package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
  170. package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
  171. package/src/agents/planning/web-pm/agent.yaml +1 -1
  172. package/src/agents/researcher/api-researcher/agent.yaml +1 -1
  173. package/src/agents/researcher/web-researcher/agent.yaml +1 -1
  174. package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
  175. package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
  176. package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
  177. package/src/agents/tester/cli-tester/agent.yaml +1 -1
  178. package/src/agents/tester/web-tester/agent.yaml +1 -1
  179. package/dist/chunk-3ZOIOVKT.js.map +0 -1
  180. package/dist/chunk-B2UBHA66.js.map +0 -1
  181. package/dist/chunk-BZN2Z5P7.js.map +0 -1
  182. package/dist/chunk-H566H3MQ.js +0 -87
  183. package/dist/chunk-H566H3MQ.js.map +0 -1
  184. package/dist/chunk-IYG2LAIM.js.map +0 -1
  185. package/dist/chunk-LAPCUV4D.js.map +0 -1
  186. package/dist/chunk-LGUI3PMO.js.map +0 -1
  187. package/dist/chunk-MM7NK5N2.js.map +0 -1
  188. package/dist/chunk-O4D67NN7.js +0 -24
  189. package/dist/chunk-O4D67NN7.js.map +0 -1
  190. package/dist/chunk-OGJIZ6QH.js.map +0 -1
  191. package/dist/chunk-OMV7TLWD.js.map +0 -1
  192. package/dist/chunk-PBEHPQLK.js.map +0 -1
  193. package/dist/chunk-R74PZWQS.js.map +0 -1
  194. package/dist/chunk-SO22IQPY.js.map +0 -1
  195. package/dist/chunk-YND42IXK.js.map +0 -1
  196. /package/dist/{chunk-Z4TWOP3H.js.map → chunk-5YNZJ5TP.js.map} +0 -0
  197. /package/dist/{chunk-UX2H2K2G.js.map → chunk-A5CYQQVG.js.map} +0 -0
  198. /package/dist/{chunk-BZQBJP34.js.map → chunk-ANGAZ444.js.map} +0 -0
  199. /package/dist/{chunk-IZZ4IIEG.js.map → chunk-B47QYIUL.js.map} +0 -0
  200. /package/dist/{chunk-5PIKNCZX.js.map → chunk-CB7GYRUP.js.map} +0 -0
  201. /package/dist/{chunk-4RAY5AOI.js.map → chunk-CEWNZQMH.js.map} +0 -0
  202. /package/dist/{chunk-UICL22RT.js.map → chunk-GIFEDW27.js.map} +0 -0
  203. /package/dist/{chunk-ODUOU55D.js.map → chunk-GVMA2EKC.js.map} +0 -0
  204. /package/dist/{chunk-FJQRVFMB.js.map → chunk-JXMRTHDT.js.map} +0 -0
  205. /package/dist/{chunk-A27LOC4Z.js.map → chunk-QC37C32G.js.map} +0 -0
  206. /package/dist/{chunk-R3XFQKPG.js.map → chunk-VEZ2GZEK.js.map} +0 -0
  207. /package/dist/{chunk-WEUVWHMA.js.map → chunk-X7SPCWY6.js.map} +0 -0
  208. /package/dist/{chunk-EMJ2ZKS7.js.map → chunk-XYCN2GCV.js.map} +0 -0
  209. /package/dist/{chunk-QPTOIZAT.js.map → chunk-YPJKOM42.js.map} +0 -0
  210. /package/dist/{chunk-FZGYSLJL.js.map → chunk-ZE355C6C.js.map} +0 -0
  211. /package/dist/{chunk-W2ZSCZ2U.js.map → chunk-ZP4BI6J2.js.map} +0 -0
  212. /package/dist/{source-manager-SBPPLOQQ.js.map → source-manager-WJYANKDI.js.map} +0 -0
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SearchModal
4
- } from "../../chunk-A27LOC4Z.js";
4
+ } from "../../chunk-QC37C32G.js";
5
5
  import "../../chunk-JMVWYAHT.js";
6
- import "../../chunk-LAPCUV4D.js";
6
+ import "../../chunk-YCS7GF6Y.js";
7
7
  import "../../chunk-DHET7RCE.js";
8
8
  export {
9
9
  SearchModal
@@ -20,9 +20,9 @@ import {
20
20
  } from "../../chunk-XY3XDVMI.js";
21
21
  import {
22
22
  SearchModal
23
- } from "../../chunk-A27LOC4Z.js";
23
+ } from "../../chunk-QC37C32G.js";
24
24
  import "../../chunk-JMVWYAHT.js";
25
- import "../../chunk-LAPCUV4D.js";
25
+ import "../../chunk-YCS7GF6Y.js";
26
26
  import {
27
27
  init_esm_shims
28
28
  } from "../../chunk-DHET7RCE.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SectionProgress
4
- } from "../../chunk-FJQRVFMB.js";
5
- import "../../chunk-LAPCUV4D.js";
4
+ } from "../../chunk-JXMRTHDT.js";
5
+ import "../../chunk-YCS7GF6Y.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  SectionProgress
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SectionProgress
4
- } from "../../chunk-FJQRVFMB.js";
4
+ } from "../../chunk-JXMRTHDT.js";
5
5
  import {
6
6
  render
7
7
  } from "../../chunk-66UDJBF6.js";
@@ -11,7 +11,7 @@ import {
11
11
  globalExpect,
12
12
  it
13
13
  } from "../../chunk-XY3XDVMI.js";
14
- import "../../chunk-LAPCUV4D.js";
14
+ import "../../chunk-YCS7GF6Y.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "../../chunk-DHET7RCE.js";
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  SourceGrid
4
- } from "../../chunk-5PIKNCZX.js";
4
+ } from "../../chunk-CB7GYRUP.js";
5
5
  import "../../chunk-7SOPVGDV.js";
6
- import "../../chunk-A27LOC4Z.js";
7
- import "../../chunk-JMVWYAHT.js";
8
6
  import "../../chunk-DC5AK3LW.js";
9
- import "../../chunk-LAPCUV4D.js";
7
+ import "../../chunk-QC37C32G.js";
8
+ import "../../chunk-JMVWYAHT.js";
9
+ import "../../chunk-YCS7GF6Y.js";
10
10
  import "../../chunk-DHET7RCE.js";
11
11
  export {
12
12
  SourceGrid
@@ -23,12 +23,12 @@ import {
23
23
  } from "../../chunk-XY3XDVMI.js";
24
24
  import {
25
25
  SourceGrid
26
- } from "../../chunk-5PIKNCZX.js";
26
+ } from "../../chunk-CB7GYRUP.js";
27
27
  import "../../chunk-7SOPVGDV.js";
28
- import "../../chunk-A27LOC4Z.js";
29
- import "../../chunk-JMVWYAHT.js";
30
28
  import "../../chunk-DC5AK3LW.js";
31
- import "../../chunk-LAPCUV4D.js";
29
+ import "../../chunk-QC37C32G.js";
30
+ import "../../chunk-JMVWYAHT.js";
31
+ import "../../chunk-YCS7GF6Y.js";
32
32
  import {
33
33
  init_esm_shims
34
34
  } from "../../chunk-DHET7RCE.js";
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "../../chunk-LGUI3PMO.js";
5
- import "../../chunk-O4D67NN7.js";
6
- import "../../chunk-SO22IQPY.js";
7
- import "../../chunk-QPTOIZAT.js";
8
- import "../../chunk-3ZOIOVKT.js";
9
- import "../../chunk-MM7NK5N2.js";
4
+ } from "../../chunk-TKB4O2RY.js";
5
+ import "../../chunk-MZB3GGOH.js";
6
+ import "../../chunk-HTTPKSL6.js";
7
+ import "../../chunk-YPJKOM42.js";
8
+ import "../../chunk-R3AD6XBJ.js";
9
+ import "../../chunk-TM4I4EHK.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-BZN2Z5P7.js";
12
- import "../../chunk-LAPCUV4D.js";
11
+ import "../../chunk-NLR6Z37M.js";
12
+ import "../../chunk-YCS7GF6Y.js";
13
13
  import "../../chunk-DHET7RCE.js";
14
14
  export {
15
15
  StackSelection
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepBuild
4
- } from "../../chunk-OMV7TLWD.js";
5
- import "../../chunk-O4D67NN7.js";
6
- import "../../chunk-SO22IQPY.js";
7
- import "../../chunk-OGJIZ6QH.js";
4
+ } from "../../chunk-2LUXM5FB.js";
5
+ import "../../chunk-MZB3GGOH.js";
6
+ import "../../chunk-HTTPKSL6.js";
7
+ import "../../chunk-OKILA27U.js";
8
8
  import "../../chunk-DC5AK3LW.js";
9
- import "../../chunk-MM7NK5N2.js";
9
+ import "../../chunk-TM4I4EHK.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-BZN2Z5P7.js";
12
- import "../../chunk-LAPCUV4D.js";
11
+ import "../../chunk-NLR6Z37M.js";
12
+ import "../../chunk-YCS7GF6Y.js";
13
13
  import "../../chunk-DHET7RCE.js";
14
14
  export {
15
15
  StepBuild
@@ -13,7 +13,7 @@ import {
13
13
  createMockCategory,
14
14
  createMockMatrix,
15
15
  createMockSkill
16
- } from "../../chunk-BZQBJP34.js";
16
+ } from "../../chunk-ANGAZ444.js";
17
17
  import {
18
18
  afterEach,
19
19
  describe,
@@ -25,15 +25,15 @@ import {
25
25
  StepBuild,
26
26
  getSkillDisplayLabel,
27
27
  validateBuildStep
28
- } from "../../chunk-OMV7TLWD.js";
29
- import "../../chunk-O4D67NN7.js";
30
- import "../../chunk-SO22IQPY.js";
31
- import "../../chunk-OGJIZ6QH.js";
28
+ } from "../../chunk-2LUXM5FB.js";
29
+ import "../../chunk-MZB3GGOH.js";
30
+ import "../../chunk-HTTPKSL6.js";
31
+ import "../../chunk-OKILA27U.js";
32
32
  import "../../chunk-DC5AK3LW.js";
33
- import "../../chunk-MM7NK5N2.js";
33
+ import "../../chunk-TM4I4EHK.js";
34
34
  import "../../chunk-T4EXUIBY.js";
35
- import "../../chunk-BZN2Z5P7.js";
36
- import "../../chunk-LAPCUV4D.js";
35
+ import "../../chunk-NLR6Z37M.js";
36
+ import "../../chunk-YCS7GF6Y.js";
37
37
  import {
38
38
  init_esm_shims
39
39
  } from "../../chunk-DHET7RCE.js";
@@ -204,7 +204,7 @@ describe("StepBuild component", () => {
204
204
  });
205
205
  cleanup = unmount;
206
206
  const output = lastFrame();
207
- globalExpect(output).toContain("Customize your Web stack");
207
+ globalExpect(output).toContain("[2] Customize your Web stack");
208
208
  });
209
209
  it("should show ViewTitle with domain when only one selected", () => {
210
210
  const { lastFrame, unmount } = renderStepBuild({
@@ -212,7 +212,7 @@ describe("StepBuild component", () => {
212
212
  });
213
213
  cleanup = unmount;
214
214
  const output = lastFrame();
215
- globalExpect(output).toContain("Customize your Web stack");
215
+ globalExpect(output).toContain("[2] Customize your Web stack");
216
216
  });
217
217
  it("should show ViewTitle for current domain on final domain", () => {
218
218
  const { lastFrame, unmount } = renderStepBuild({
@@ -221,7 +221,7 @@ describe("StepBuild component", () => {
221
221
  });
222
222
  cleanup = unmount;
223
223
  const output = lastFrame();
224
- globalExpect(output).toContain("Customize your API stack");
224
+ globalExpect(output).toContain("[2] Customize your API stack");
225
225
  });
226
226
  it("should show correct domain display names", () => {
227
227
  const { lastFrame, unmount } = renderStepBuild({
@@ -230,7 +230,7 @@ describe("StepBuild component", () => {
230
230
  });
231
231
  cleanup = unmount;
232
232
  const output = lastFrame();
233
- globalExpect(output).toContain("Customize your API stack");
233
+ globalExpect(output).toContain("[2] Customize your API stack");
234
234
  });
235
235
  });
236
236
  describe("category filtering", () => {
@@ -396,7 +396,7 @@ describe("StepBuild component", () => {
396
396
  });
397
397
  cleanup = unmount;
398
398
  const output = lastFrame();
399
- globalExpect(output).toContain("Customize your Web stack");
399
+ globalExpect(output).toContain("[2] Customize your Web stack");
400
400
  });
401
401
  it("should show ViewTitle for last domain in multi-domain flow", () => {
402
402
  const { lastFrame, unmount } = renderStepBuild({
@@ -405,7 +405,7 @@ describe("StepBuild component", () => {
405
405
  });
406
406
  cleanup = unmount;
407
407
  const output = lastFrame();
408
- globalExpect(output).toContain("Customize your API stack");
408
+ globalExpect(output).toContain("[2] Customize your API stack");
409
409
  });
410
410
  it("should show ViewTitle for current domain in three-domain flow", () => {
411
411
  const cliFrameworkCategory = createMockCategory("cli-framework", "CLI Framework", {
@@ -445,7 +445,7 @@ describe("StepBuild component", () => {
445
445
  });
446
446
  cleanup = unmount;
447
447
  const output = lastFrame();
448
- globalExpect(output).toContain("Customize your API stack");
448
+ globalExpect(output).toContain("[2] Customize your API stack");
449
449
  });
450
450
  });
451
451
  describe("header and selection count", () => {
@@ -453,7 +453,7 @@ describe("StepBuild component", () => {
453
453
  const { lastFrame, unmount } = renderStepBuild();
454
454
  cleanup = unmount;
455
455
  const output = lastFrame();
456
- globalExpect(output).toContain("Customize your Web stack");
456
+ globalExpect(output).toContain("[2] Customize your Web stack");
457
457
  });
458
458
  it("should render ViewTitle with domain display name", () => {
459
459
  const { lastFrame, unmount } = renderStepBuild({
@@ -461,7 +461,7 @@ describe("StepBuild component", () => {
461
461
  });
462
462
  cleanup = unmount;
463
463
  const output = lastFrame();
464
- globalExpect(output).toContain("Customize your API stack");
464
+ globalExpect(output).toContain("[2] Customize your API stack");
465
465
  });
466
466
  });
467
467
  describe("keyboard help text", () => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy, mapToObj } from \"remeda\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { StepBuild, type StepBuildProps } from \"./step-build\";\nimport { validateBuildStep, getSkillDisplayLabel } from \"../../lib/wizard/index\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n ResolvedSkill,\n SkillDisplayName,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockCategory, createMockSkill, createMockMatrix } from \"../../lib/__tests__/helpers\";\n\nconst SKILL_DEFAULTS: Partial<ResolvedSkill> = { categoryExclusive: true };\n\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) => {\n const withDisplayName = skills.filter((s) => s.displayName);\n return createMockMatrix(\n indexBy(skills, (s) => s.id),\n {\n categories: indexBy(categories, (c) => c.id) as Record<Subcategory, CategoryDefinition>,\n displayNameToId: mapToObj(withDisplayName, (s) => [s.displayName!, s.id]) as Record<\n SkillDisplayName,\n SkillId\n >,\n displayNames: mapToObj(withDisplayName, (s) => [s.id, s.displayName!]) as Record<\n SkillId,\n SkillDisplayName\n >,\n },\n );\n};\n\nconst frameworkCategory = createMockCategory(\"framework\", \"Framework\", {\n domain: \"web\",\n required: true,\n order: 0,\n});\n\nconst stylingCategory = createMockCategory(\"styling\", \"Styling\", {\n domain: \"web\",\n required: true,\n order: 1,\n});\n\nconst stateCategory = createMockCategory(\"client-state\", \"Client State\", {\n domain: \"web\",\n required: false,\n order: 2,\n});\n\nconst apiFrameworkCategory = createMockCategory(\"api\", \"API Framework\", {\n domain: \"api\",\n required: true,\n order: 0,\n});\n\nconst databaseCategory = createMockCategory(\"database\", \"Database\", {\n domain: \"api\",\n required: false,\n order: 1,\n});\n\nconst reactSkill = createMockSkill(\"web-framework-react\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"react\",\n});\n\nconst vueSkill = createMockSkill(\"web-framework-vue\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"vue\",\n});\n\nconst tailwindSkill = createMockSkill(\"web-styling-tailwind\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"tailwind\",\n});\n\nconst scssSkill = createMockSkill(\"web-styling-scss-modules\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"scss-modules\",\n});\n\nconst zustandSkill = createMockSkill(\"web-state-zustand\", \"client-state\", {\n ...SKILL_DEFAULTS,\n displayName: \"zustand\",\n});\n\nconst honoSkill = createMockSkill(\"api-framework-hono\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"hono\",\n});\n\nconst expressSkill = createMockSkill(\"api-framework-express\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"express\",\n});\n\nconst postgresSkill = createMockSkill(\"api-database-postgres\", \"database\", {\n ...SKILL_DEFAULTS,\n});\n\nconst defaultMatrix = buildTestMatrix(\n [frameworkCategory, stylingCategory, stateCategory, apiFrameworkCategory, databaseCategory],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n ],\n);\n\nconst defaultProps: StepBuildProps = {\n matrix: defaultMatrix,\n domain: \"web\",\n selectedDomains: [\"web\"],\n selections: {},\n allSelections: [],\n showDescriptions: false,\n expertMode: false,\n onToggle: vi.fn(),\n onToggleDescriptions: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepBuild = (props: Partial<StepBuildProps> = {}) => {\n return render(<StepBuild {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepBuild component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render CategoryGrid with correct categories for domain\", () => {\n // For web domain with framework-first flow, initially only shows Framework\n // To see other categories, need a framework selection\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] }, // Framework selected to show other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Web domain should show Framework, Styling, Client State (when framework selected)\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n // Should NOT show API categories\n expect(output).not.toContain(\"API Framework\");\n expect(output).not.toContain(\"Database\");\n });\n\n it(\"should render API categories when domain is api\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // API domain should show API Framework, Database\n expect(output).toContain(\"API Framework\");\n expect(output).toContain(\"Database\");\n // Should NOT show Web categories\n expect(output).not.toContain(\"Styling\");\n expect(output).not.toContain(\"Client State\");\n });\n\n it(\"should render skills as options\", () => {\n // Need framework selected to see other categories in web domain\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework skills (displayed as alias)\n expect(output).toContain(\"react\");\n expect(output).toContain(\"vue\");\n // Styling skills (visible after framework selected)\n expect(output).toContain(\"tailwind\");\n expect(output).toContain(\"scss-modules\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n expect(output).toContain(\"*\");\n });\n\n it(\"should render categories for the domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render the domain categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"domain header\", () => {\n it(\"should show ViewTitle with current domain when multiple domains selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should show ViewTitle with domain when only one selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should show ViewTitle for current domain on final domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n\n it(\"should show correct domain display names\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\", \"cli\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n });\n\n describe(\"category filtering\", () => {\n it(\"should filter categories correctly by domain\", () => {\n // Web domain with framework selected (to bypass framework-first filter)\n const { lastFrame: webFrame, unmount: webUnmount } = renderStepBuild({\n domain: \"web\",\n selections: { framework: [\"web-framework-react\"] },\n });\n const webOutput = webFrame();\n webUnmount();\n\n // API domain (no framework-first filter for API)\n const { lastFrame: apiFrame, unmount: apiUnmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = apiUnmount;\n const apiOutput = apiFrame();\n\n // Web should have Framework, Styling, Client State (with framework selected)\n expect(webOutput).toContain(\"Framework\");\n expect(webOutput).toContain(\"Styling\");\n expect(webOutput).toContain(\"Client State\");\n expect(webOutput).not.toContain(\"API Framework\");\n\n // API should have API Framework, Database\n expect(apiOutput).toContain(\"API Framework\");\n expect(apiOutput).toContain(\"Database\");\n expect(apiOutput).not.toContain(\"Styling\");\n });\n\n it(\"should sort categories by order\", () => {\n // Need framework selected to see all categories\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework (order 0) should appear before Styling (order 1)\n // and Styling before Client State (order 2)\n const frameworkIndex = output?.indexOf(\"Framework\") ?? -1;\n const stylingIndex = output?.indexOf(\"Styling\") ?? -1;\n const stateIndex = output?.indexOf(\"Client State\") ?? -1;\n\n expect(frameworkIndex).toBeLessThan(stylingIndex);\n expect(stylingIndex).toBeLessThan(stateIndex);\n });\n });\n\n describe(\"option states\", () => {\n it(\"should show selected options correctly\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"web-framework-react\"],\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show selected option (no circle symbol anymore, uses background)\n // Just verify the selected label is present (displayed as alias)\n expect(output).toContain(\"react\");\n });\n\n it(\"should pass expertMode to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n expertMode: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Expert mode is passed to CategoryGrid for option sorting behavior\n // The visual indicator is now shown globally in wizard-layout, not in CategoryGrid header\n expect(output).toBeDefined();\n });\n\n it(\"should pass showDescriptions to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showDescriptions: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Descriptions toggle is now shown globally in wizard-layout\n // Verify component renders without error\n expect(output).toBeDefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter is pressed with valid selections\", async () => {\n const onContinue = vi.fn();\n // Provide selections for required categories to pass validation\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n });\n\n it(\"should pass toggle callback to CategoryGrid\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Space should trigger toggle\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n });\n\n describe(\"toggle callbacks\", () => {\n it(\"should pass onToggleDescriptions to CategoryGrid\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles descriptions\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n\n it(\"should not handle expert mode toggle locally (handled globally)\", () => {\n // Expert mode toggle is now handled at wizard.tsx level\n // StepBuild no longer has onToggleExpertMode prop\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle domain with no categories\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"mobile\", // No mobile categories in test matrix\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show empty state message from CategoryGrid\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should handle unknown domain gracefully\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"shared\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render without crashing\n expect(output).toBeDefined();\n });\n\n it(\"should handle empty allSelections\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should handle allSelections with skills from other domains\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n allSelections: [\"api-framework-hono\", \"api-database-drizzle\"], // API skills (aliases)\n selections: { framework: [\"web-framework-react\"] }, // Need framework to see other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render web categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"multi-domain scenarios\", () => {\n it(\"should show ViewTitle for current domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should show ViewTitle for last domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n\n it(\"should show ViewTitle for current domain in three-domain flow\", () => {\n // Add cli category to matrix\n const cliFrameworkCategory = createMockCategory(\"cli-framework\", \"CLI Framework\", {\n domain: \"cli\",\n required: true,\n order: 0,\n });\n const commanderSkill = createMockSkill(\"cli-cli-framework-commander\", \"cli-framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n frameworkCategory,\n stylingCategory,\n stateCategory,\n apiFrameworkCategory,\n databaseCategory,\n cliFrameworkCategory,\n ],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n commanderSkill,\n ],\n );\n\n const { lastFrame, unmount } = renderStepBuild({\n matrix: matrixWithCli,\n domain: \"api\",\n selectedDomains: [\"web\", \"api\", \"cli\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n });\n\n describe(\"header and selection count\", () => {\n it(\"should show ViewTitle with domain name\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your Web stack\");\n });\n\n it(\"should render ViewTitle with domain display name\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Customize your API stack\");\n });\n });\n\n describe(\"keyboard help text\", () => {\n it(\"should respond to d key for toggling descriptions\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: true }],\n },\n ];\n const selections: SubcategorySelections = { framework: [\"web-framework-react\"] };\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n expect(result.message).toBeUndefined();\n });\n\n it(\"should return invalid when required category has no selection\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [\n { id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: false },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\");\n });\n\n it(\"should return valid when optional categories have no selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"client-state\",\n displayName: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"web-state-zustand\",\n label: \"Zustand\",\n state: \"normal\",\n selected: false,\n },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n });\n\n it(\"should return invalid for first missing required category\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\"); // Should be the first one\n });\n });\n\n describe(\"validation on continue\", () => {\n it(\"should show validation error when trying to continue without required selection\", async () => {\n const onContinue = vi.fn();\n const { stdin, lastFrame, unmount } = renderStepBuild({\n onContinue,\n selections: {},\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue without selecting required framework\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Should show validation error and NOT call onContinue\n const output = lastFrame();\n expect(output).toContain(\"Select at least one skill\");\n expect(onContinue).not.toHaveBeenCalled();\n });\n\n it(\"should call onContinue when validation passes\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue with required selections\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n });\n});\n\ndescribe(\"getSkillDisplayLabel\", () => {\n it(\"should return displayName when available\", () => {\n expect(getSkillDisplayLabel({ displayName: \"react\", id: \"web-framework-react\" })).toBe(\"react\");\n });\n\n it(\"should return id when no displayName\", () => {\n expect(getSkillDisplayLabel({ id: \"web-framework-react\" })).toBe(\"web-framework-react\");\n });\n\n it(\"should prefer displayName over id\", () => {\n expect(\n getSkillDisplayLabel({ displayName: \"scss-modules\", id: \"web-styling-scss-modules\" }),\n ).toBe(\"scss-modules\");\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-build.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { indexBy, mapToObj } from \"remeda\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { StepBuild, type StepBuildProps } from \"./step-build\";\nimport { validateBuildStep, getSkillDisplayLabel } from \"../../lib/wizard/index\";\nimport type { CategoryRow as GridCategoryRow } from \"./category-grid\";\nimport type {\n CategoryDefinition,\n ResolvedSkill,\n SkillDisplayName,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../../types\";\nimport {\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\nimport { createMockCategory, createMockSkill, createMockMatrix } from \"../../lib/__tests__/helpers\";\n\nconst SKILL_DEFAULTS: Partial<ResolvedSkill> = { categoryExclusive: true };\n\nconst buildTestMatrix = (categories: CategoryDefinition[], skills: ResolvedSkill[]) => {\n const withDisplayName = skills.filter((s) => s.displayName);\n return createMockMatrix(\n indexBy(skills, (s) => s.id),\n {\n categories: indexBy(categories, (c) => c.id) as Record<Subcategory, CategoryDefinition>,\n displayNameToId: mapToObj(withDisplayName, (s) => [s.displayName!, s.id]) as Record<\n SkillDisplayName,\n SkillId\n >,\n displayNames: mapToObj(withDisplayName, (s) => [s.id, s.displayName!]) as Record<\n SkillId,\n SkillDisplayName\n >,\n },\n );\n};\n\nconst frameworkCategory = createMockCategory(\"framework\", \"Framework\", {\n domain: \"web\",\n required: true,\n order: 0,\n});\n\nconst stylingCategory = createMockCategory(\"styling\", \"Styling\", {\n domain: \"web\",\n required: true,\n order: 1,\n});\n\nconst stateCategory = createMockCategory(\"client-state\", \"Client State\", {\n domain: \"web\",\n required: false,\n order: 2,\n});\n\nconst apiFrameworkCategory = createMockCategory(\"api\", \"API Framework\", {\n domain: \"api\",\n required: true,\n order: 0,\n});\n\nconst databaseCategory = createMockCategory(\"database\", \"Database\", {\n domain: \"api\",\n required: false,\n order: 1,\n});\n\nconst reactSkill = createMockSkill(\"web-framework-react\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"react\",\n});\n\nconst vueSkill = createMockSkill(\"web-framework-vue\", \"framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"vue\",\n});\n\nconst tailwindSkill = createMockSkill(\"web-styling-tailwind\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"tailwind\",\n});\n\nconst scssSkill = createMockSkill(\"web-styling-scss-modules\", \"styling\", {\n ...SKILL_DEFAULTS,\n displayName: \"scss-modules\",\n});\n\nconst zustandSkill = createMockSkill(\"web-state-zustand\", \"client-state\", {\n ...SKILL_DEFAULTS,\n displayName: \"zustand\",\n});\n\nconst honoSkill = createMockSkill(\"api-framework-hono\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"hono\",\n});\n\nconst expressSkill = createMockSkill(\"api-framework-express\", \"api\", {\n ...SKILL_DEFAULTS,\n displayName: \"express\",\n});\n\nconst postgresSkill = createMockSkill(\"api-database-postgres\", \"database\", {\n ...SKILL_DEFAULTS,\n});\n\nconst defaultMatrix = buildTestMatrix(\n [frameworkCategory, stylingCategory, stateCategory, apiFrameworkCategory, databaseCategory],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n ],\n);\n\nconst defaultProps: StepBuildProps = {\n matrix: defaultMatrix,\n domain: \"web\",\n selectedDomains: [\"web\"],\n selections: {},\n allSelections: [],\n showDescriptions: false,\n expertMode: false,\n onToggle: vi.fn(),\n onToggleDescriptions: vi.fn(),\n onContinue: vi.fn(),\n onBack: vi.fn(),\n};\n\nconst renderStepBuild = (props: Partial<StepBuildProps> = {}) => {\n return render(<StepBuild {...defaultProps} {...props} />);\n};\n\ndescribe(\"StepBuild component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render CategoryGrid with correct categories for domain\", () => {\n // For web domain with framework-first flow, initially only shows Framework\n // To see other categories, need a framework selection\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] }, // Framework selected to show other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Web domain should show Framework, Styling, Client State (when framework selected)\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n expect(output).toContain(\"Client State\");\n // Should NOT show API categories\n expect(output).not.toContain(\"API Framework\");\n expect(output).not.toContain(\"Database\");\n });\n\n it(\"should render API categories when domain is api\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // API domain should show API Framework, Database\n expect(output).toContain(\"API Framework\");\n expect(output).toContain(\"Database\");\n // Should NOT show Web categories\n expect(output).not.toContain(\"Styling\");\n expect(output).not.toContain(\"Client State\");\n });\n\n it(\"should render skills as options\", () => {\n // Need framework selected to see other categories in web domain\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework skills (displayed as alias)\n expect(output).toContain(\"react\");\n expect(output).toContain(\"vue\");\n // Styling skills (visible after framework selected)\n expect(output).toContain(\"tailwind\");\n expect(output).toContain(\"scss-modules\");\n });\n\n it(\"should show required indicator (*) for required categories\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework and Styling are required\n expect(output).toContain(\"*\");\n });\n\n it(\"should render categories for the domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render the domain categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"domain header\", () => {\n it(\"should show ViewTitle with current domain when multiple domains selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your Web stack\");\n });\n\n it(\"should show ViewTitle with domain when only one selected\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your Web stack\");\n });\n\n it(\"should show ViewTitle for current domain on final domain\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your API stack\");\n });\n\n it(\"should show correct domain display names\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n selectedDomains: [\"web\", \"api\", \"cli\"],\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your API stack\");\n });\n });\n\n describe(\"category filtering\", () => {\n it(\"should filter categories correctly by domain\", () => {\n // Web domain with framework selected (to bypass framework-first filter)\n const { lastFrame: webFrame, unmount: webUnmount } = renderStepBuild({\n domain: \"web\",\n selections: { framework: [\"web-framework-react\"] },\n });\n const webOutput = webFrame();\n webUnmount();\n\n // API domain (no framework-first filter for API)\n const { lastFrame: apiFrame, unmount: apiUnmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = apiUnmount;\n const apiOutput = apiFrame();\n\n // Web should have Framework, Styling, Client State (with framework selected)\n expect(webOutput).toContain(\"Framework\");\n expect(webOutput).toContain(\"Styling\");\n expect(webOutput).toContain(\"Client State\");\n expect(webOutput).not.toContain(\"API Framework\");\n\n // API should have API Framework, Database\n expect(apiOutput).toContain(\"API Framework\");\n expect(apiOutput).toContain(\"Database\");\n expect(apiOutput).not.toContain(\"Styling\");\n });\n\n it(\"should sort categories by order\", () => {\n // Need framework selected to see all categories\n const { lastFrame, unmount } = renderStepBuild({\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Framework (order 0) should appear before Styling (order 1)\n // and Styling before Client State (order 2)\n const frameworkIndex = output?.indexOf(\"Framework\") ?? -1;\n const stylingIndex = output?.indexOf(\"Styling\") ?? -1;\n const stateIndex = output?.indexOf(\"Client State\") ?? -1;\n\n expect(frameworkIndex).toBeLessThan(stylingIndex);\n expect(stylingIndex).toBeLessThan(stateIndex);\n });\n });\n\n describe(\"option states\", () => {\n it(\"should show selected options correctly\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [\"web-framework-react\"],\n selections: { framework: [\"web-framework-react\"] },\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show selected option (no circle symbol anymore, uses background)\n // Just verify the selected label is present (displayed as alias)\n expect(output).toContain(\"react\");\n });\n\n it(\"should pass expertMode to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n expertMode: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Expert mode is passed to CategoryGrid for option sorting behavior\n // The visual indicator is now shown globally in wizard-layout, not in CategoryGrid header\n expect(output).toBeDefined();\n });\n\n it(\"should pass showDescriptions to CategoryGrid\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n showDescriptions: true,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Descriptions toggle is now shown globally in wizard-layout\n // Verify component renders without error\n expect(output).toBeDefined();\n });\n });\n\n describe(\"keyboard navigation\", () => {\n it(\"should call onContinue when Enter is pressed with valid selections\", async () => {\n const onContinue = vi.fn();\n // Provide selections for required categories to pass validation\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n\n it(\"should call onBack when Escape is pressed\", async () => {\n const onBack = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onBack });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(onBack).toHaveBeenCalled();\n });\n\n it(\"should pass toggle callback to CategoryGrid\", async () => {\n const onToggle = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onToggle,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n // Space should trigger toggle\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggle).toHaveBeenCalled();\n });\n });\n\n describe(\"toggle callbacks\", () => {\n it(\"should pass onToggleDescriptions to CategoryGrid\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\"); // 'd' key toggles descriptions\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n\n it(\"should not handle expert mode toggle locally (handled globally)\", () => {\n // Expert mode toggle is now handled at wizard.tsx level\n // StepBuild no longer has onToggleExpertMode prop\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toBeDefined();\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle domain with no categories\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"mobile\", // No mobile categories in test matrix\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should show empty state message from CategoryGrid\n expect(output).toContain(\"No categories to display\");\n });\n\n it(\"should handle unknown domain gracefully\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"shared\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should render without crashing\n expect(output).toBeDefined();\n });\n\n it(\"should handle empty allSelections\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n allSelections: [],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Framework\");\n });\n\n it(\"should handle allSelections with skills from other domains\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n allSelections: [\"api-framework-hono\", \"api-database-drizzle\"], // API skills (aliases)\n selections: { framework: [\"web-framework-react\"] }, // Need framework to see other categories\n });\n cleanup = unmount;\n\n const output = lastFrame();\n // Should still render web categories\n expect(output).toContain(\"Framework\");\n expect(output).toContain(\"Styling\");\n });\n });\n\n describe(\"multi-domain scenarios\", () => {\n it(\"should show ViewTitle for current domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"web\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your Web stack\");\n });\n\n it(\"should show ViewTitle for last domain in multi-domain flow\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n selectedDomains: [\"web\", \"api\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your API stack\");\n });\n\n it(\"should show ViewTitle for current domain in three-domain flow\", () => {\n // Add cli category to matrix\n const cliFrameworkCategory = createMockCategory(\"cli-framework\", \"CLI Framework\", {\n domain: \"cli\",\n required: true,\n order: 0,\n });\n const commanderSkill = createMockSkill(\"cli-cli-framework-commander\", \"cli-framework\", {\n ...SKILL_DEFAULTS,\n displayName: \"commander\",\n });\n\n const matrixWithCli = buildTestMatrix(\n [\n frameworkCategory,\n stylingCategory,\n stateCategory,\n apiFrameworkCategory,\n databaseCategory,\n cliFrameworkCategory,\n ],\n [\n reactSkill,\n vueSkill,\n tailwindSkill,\n scssSkill,\n zustandSkill,\n honoSkill,\n expressSkill,\n postgresSkill,\n commanderSkill,\n ],\n );\n\n const { lastFrame, unmount } = renderStepBuild({\n matrix: matrixWithCli,\n domain: \"api\",\n selectedDomains: [\"web\", \"api\", \"cli\"],\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your API stack\");\n });\n });\n\n describe(\"header and selection count\", () => {\n it(\"should show ViewTitle with domain name\", () => {\n const { lastFrame, unmount } = renderStepBuild();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your Web stack\");\n });\n\n it(\"should render ViewTitle with domain display name\", () => {\n const { lastFrame, unmount } = renderStepBuild({\n domain: \"api\",\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"[2] Customize your API stack\");\n });\n });\n\n describe(\"keyboard help text\", () => {\n it(\"should respond to d key for toggling descriptions\", async () => {\n const onToggleDescriptions = vi.fn();\n const { stdin, unmount } = renderStepBuild({ onToggleDescriptions });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\"d\");\n await delay(INPUT_DELAY_MS);\n\n expect(onToggleDescriptions).toHaveBeenCalled();\n });\n });\n\n describe(\"validateBuildStep\", () => {\n it(\"should return valid when required categories have selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [{ id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: true }],\n },\n ];\n const selections: SubcategorySelections = { framework: [\"web-framework-react\"] };\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n expect(result.message).toBeUndefined();\n });\n\n it(\"should return invalid when required category has no selection\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [\n { id: \"web-framework-react\", label: \"React\", state: \"normal\", selected: false },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\");\n });\n\n it(\"should return valid when optional categories have no selections\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"client-state\",\n displayName: \"State Management\",\n required: false,\n exclusive: true,\n options: [\n {\n id: \"web-state-zustand\",\n label: \"Zustand\",\n state: \"normal\",\n selected: false,\n },\n ],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(true);\n });\n\n it(\"should return invalid for first missing required category\", () => {\n const categories: GridCategoryRow[] = [\n {\n id: \"framework\",\n displayName: \"Framework\",\n required: true,\n exclusive: true,\n options: [],\n },\n {\n id: \"styling\",\n displayName: \"Styling\",\n required: true,\n exclusive: true,\n options: [],\n },\n ];\n const selections: SubcategorySelections = {};\n\n const result = validateBuildStep(categories, selections);\n expect(result.valid).toBe(false);\n expect(result.message).toContain(\"Framework\"); // Should be the first one\n });\n });\n\n describe(\"validation on continue\", () => {\n it(\"should show validation error when trying to continue without required selection\", async () => {\n const onContinue = vi.fn();\n const { stdin, lastFrame, unmount } = renderStepBuild({\n onContinue,\n selections: {},\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue without selecting required framework\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n // Should show validation error and NOT call onContinue\n const output = lastFrame();\n expect(output).toContain(\"Select at least one skill\");\n expect(onContinue).not.toHaveBeenCalled();\n });\n\n it(\"should call onContinue when validation passes\", async () => {\n const onContinue = vi.fn();\n const { stdin, unmount } = renderStepBuild({\n onContinue,\n selections: {\n framework: [\"web-framework-react\"],\n styling: [\"web-styling-tailwind\"],\n },\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Press Enter to continue with required selections\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(onContinue).toHaveBeenCalled();\n });\n });\n});\n\ndescribe(\"getSkillDisplayLabel\", () => {\n it(\"should return displayName when available\", () => {\n expect(getSkillDisplayLabel({ displayName: \"react\", id: \"web-framework-react\" })).toBe(\"react\");\n });\n\n it(\"should return id when no displayName\", () => {\n expect(getSkillDisplayLabel({ id: \"web-framework-react\" })).toBe(\"web-framework-react\");\n });\n\n it(\"should prefer displayName over id\", () => {\n expect(\n getSkillDisplayLabel({ displayName: \"scss-modules\", id: \"web-styling-scss-modules\" }),\n ).toBe(\"scss-modules\");\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepConfirm
4
- } from "../../chunk-4RAY5AOI.js";
5
- import "../../chunk-SO22IQPY.js";
4
+ } from "../../chunk-CEWNZQMH.js";
5
+ import "../../chunk-MZB3GGOH.js";
6
6
  import "../../chunk-T4EXUIBY.js";
7
- import "../../chunk-LAPCUV4D.js";
7
+ import "../../chunk-YCS7GF6Y.js";
8
8
  import "../../chunk-DHET7RCE.js";
9
9
  export {
10
10
  StepConfirm
@@ -18,15 +18,15 @@ import {
18
18
  } from "../../chunk-XY3XDVMI.js";
19
19
  import {
20
20
  StepConfirm
21
- } from "../../chunk-4RAY5AOI.js";
22
- import "../../chunk-SO22IQPY.js";
21
+ } from "../../chunk-CEWNZQMH.js";
22
+ import "../../chunk-MZB3GGOH.js";
23
23
  import {
24
24
  useWizardStore
25
- } from "../../chunk-3ZOIOVKT.js";
26
- import "../../chunk-MM7NK5N2.js";
25
+ } from "../../chunk-R3AD6XBJ.js";
26
+ import "../../chunk-TM4I4EHK.js";
27
27
  import "../../chunk-T4EXUIBY.js";
28
- import "../../chunk-BZN2Z5P7.js";
29
- import "../../chunk-LAPCUV4D.js";
28
+ import "../../chunk-NLR6Z37M.js";
29
+ import "../../chunk-YCS7GF6Y.js";
30
30
  import {
31
31
  init_esm_shims
32
32
  } from "../../chunk-DHET7RCE.js";
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepRefine
4
- } from "../../chunk-R3XFQKPG.js";
5
- import "../../chunk-LAPCUV4D.js";
4
+ } from "../../chunk-VEZ2GZEK.js";
5
+ import "../../chunk-YCS7GF6Y.js";
6
6
  import "../../chunk-DHET7RCE.js";
7
7
  export {
8
8
  StepRefine
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepRefine
4
- } from "../../chunk-R3XFQKPG.js";
4
+ } from "../../chunk-VEZ2GZEK.js";
5
5
  import {
6
6
  ARROW_DOWN,
7
7
  ARROW_UP,
@@ -23,7 +23,7 @@ import {
23
23
  } from "../../chunk-XY3XDVMI.js";
24
24
  import {
25
25
  DEFAULT_BRANDING
26
- } from "../../chunk-LAPCUV4D.js";
26
+ } from "../../chunk-YCS7GF6Y.js";
27
27
  import {
28
28
  init_esm_shims
29
29
  } from "../../chunk-DHET7RCE.js";
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StepSettings
4
- } from "../../chunk-YND42IXK.js";
5
- import "../../chunk-O4D67NN7.js";
4
+ } from "../../chunk-KENWMEKN.js";
6
5
  import "../../chunk-7SOPVGDV.js";
6
+ import "../../chunk-HTTPKSL6.js";
7
7
  import "../../chunk-JMVWYAHT.js";
8
8
  import "../../chunk-U3IGFMCY.js";
9
- import "../../chunk-MM7NK5N2.js";
9
+ import "../../chunk-TM4I4EHK.js";
10
10
  import "../../chunk-T4EXUIBY.js";
11
- import "../../chunk-BZN2Z5P7.js";
12
- import "../../chunk-LAPCUV4D.js";
11
+ import "../../chunk-NLR6Z37M.js";
12
+ import "../../chunk-YCS7GF6Y.js";
13
13
  import "../../chunk-DHET7RCE.js";
14
14
  export {
15
15
  StepSettings
@@ -19,15 +19,15 @@ import {
19
19
  } from "../../chunk-XY3XDVMI.js";
20
20
  import {
21
21
  StepSettings
22
- } from "../../chunk-YND42IXK.js";
23
- import "../../chunk-O4D67NN7.js";
22
+ } from "../../chunk-KENWMEKN.js";
24
23
  import "../../chunk-7SOPVGDV.js";
24
+ import "../../chunk-HTTPKSL6.js";
25
25
  import "../../chunk-JMVWYAHT.js";
26
26
  import "../../chunk-U3IGFMCY.js";
27
- import "../../chunk-MM7NK5N2.js";
27
+ import "../../chunk-TM4I4EHK.js";
28
28
  import "../../chunk-T4EXUIBY.js";
29
- import "../../chunk-BZN2Z5P7.js";
30
- import "../../chunk-LAPCUV4D.js";
29
+ import "../../chunk-NLR6Z37M.js";
30
+ import "../../chunk-YCS7GF6Y.js";
31
31
  import {
32
32
  init_esm_shims
33
33
  } from "../../chunk-DHET7RCE.js";
@@ -41,7 +41,7 @@ vi.mock("../../lib/configuration/source-manager.js", () => ({
41
41
  removeSource: vi.fn()
42
42
  }));
43
43
  vi.mock("../../lib/configuration/config.js", () => ({
44
- DEFAULT_SOURCE: "github:claude-collective/skills"
44
+ DEFAULT_SOURCE: "github:agents-inc/skills"
45
45
  }));
46
46
  var LOADING_SETTLE_MS = 200;
47
47
  var defaultProps = {
@@ -55,10 +55,10 @@ describe("StepSettings component", () => {
55
55
  let cleanup;
56
56
  beforeEach(async () => {
57
57
  vi.resetAllMocks();
58
- const { getSourceSummary } = await import("../../source-manager-SBPPLOQQ.js");
58
+ const { getSourceSummary } = await import("../../source-manager-WJYANKDI.js");
59
59
  vi.mocked(getSourceSummary).mockResolvedValue({
60
60
  sources: [
61
- { name: "public", url: "github:claude-collective/skills", enabled: true },
61
+ { name: "public", url: "github:agents-inc/skills", enabled: true },
62
62
  { name: "acme-corp", url: "github:acme-corp/claude-skills", enabled: true }
63
63
  ],
64
64
  localSkillCount: 3,
@@ -97,7 +97,7 @@ describe("StepSettings component", () => {
97
97
  cleanup = unmount;
98
98
  await delay(LOADING_SETTLE_MS);
99
99
  const output = lastFrame();
100
- globalExpect(output).toContain("github:claude-collective/skills");
100
+ globalExpect(output).toContain("github:agents-inc/skills");
101
101
  globalExpect(output).toContain("github:acme-corp/claude-skills");
102
102
  });
103
103
  it("should show local skill count", async () => {
@@ -216,9 +216,9 @@ describe("StepSettings component", () => {
216
216
  });
217
217
  describe("edge cases", () => {
218
218
  it("should handle empty sources list gracefully", async () => {
219
- const { getSourceSummary } = await import("../../source-manager-SBPPLOQQ.js");
219
+ const { getSourceSummary } = await import("../../source-manager-WJYANKDI.js");
220
220
  vi.mocked(getSourceSummary).mockResolvedValue({
221
- sources: [{ name: "public", url: "github:claude-collective/skills", enabled: true }],
221
+ sources: [{ name: "public", url: "github:agents-inc/skills", enabled: true }],
222
222
  localSkillCount: 0,
223
223
  pluginSkillCount: 0
224
224
  });
@@ -230,7 +230,7 @@ describe("StepSettings component", () => {
230
230
  globalExpect(output).toContain("0");
231
231
  });
232
232
  it("should handle getSourceSummary failure gracefully", async () => {
233
- const { getSourceSummary } = await import("../../source-manager-SBPPLOQQ.js");
233
+ const { getSourceSummary } = await import("../../source-manager-WJYANKDI.js");
234
234
  vi.mocked(getSourceSummary).mockRejectedValue(new Error("Config read failed"));
235
235
  const { lastFrame, unmount } = renderStepSettings();
236
236
  cleanup = unmount;