@agents-inc/cli 0.35.0 → 0.38.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 (190) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/config/skills-matrix.yaml +17 -17
  3. package/dist/{chunk-HTTPKSL6.js → chunk-2XX4TMCI.js} +2 -2
  4. package/dist/{chunk-CEWNZQMH.js → chunk-3E2V5YL3.js} +8 -2
  5. package/dist/chunk-3E2V5YL3.js.map +1 -0
  6. package/dist/{chunk-IG7CUREJ.js → chunk-3NQJOJZL.js} +2 -2
  7. package/dist/chunk-54ZZCWN4.js +51 -0
  8. package/dist/chunk-54ZZCWN4.js.map +1 -0
  9. package/dist/{chunk-VEZ2GZEK.js → chunk-ATLRUR3B.js} +2 -2
  10. package/dist/{chunk-KWF6D7ZP.js → chunk-CYFU3ARY.js} +26 -16
  11. package/dist/chunk-CYFU3ARY.js.map +1 -0
  12. package/dist/{chunk-CXWPUVA7.js → chunk-DUQFF45G.js} +7 -7
  13. package/dist/{chunk-U36YCEBK.js → chunk-EISBUEBL.js} +32 -23
  14. package/dist/chunk-EISBUEBL.js.map +1 -0
  15. package/dist/chunk-EXFVAEPY.js +80 -0
  16. package/dist/chunk-EXFVAEPY.js.map +1 -0
  17. package/dist/{chunk-YN35L5NE.js → chunk-FWQK3HWB.js} +4 -4
  18. package/dist/chunk-FWQK3HWB.js.map +1 -0
  19. package/dist/{chunk-DC5AK3LW.js → chunk-GG4BSB6S.js} +5 -11
  20. package/dist/chunk-GG4BSB6S.js.map +1 -0
  21. package/dist/{chunk-GGHH3KR2.js → chunk-HKDE4LJW.js} +2 -2
  22. package/dist/{chunk-OGXSTJP2.js → chunk-HRMQ2RGY.js} +81 -26
  23. package/dist/chunk-HRMQ2RGY.js.map +1 -0
  24. package/dist/{chunk-YPJKOM42.js → chunk-HRW7BIDE.js} +2 -2
  25. package/dist/{chunk-LFHZBF6N.js → chunk-IVIK776Y.js} +4 -3
  26. package/dist/chunk-IVIK776Y.js.map +1 -0
  27. package/dist/{chunk-NVQEHRJY.js → chunk-IWNPFIGY.js} +38 -48
  28. package/dist/chunk-IWNPFIGY.js.map +1 -0
  29. package/dist/{chunk-YIKBNGE3.js → chunk-IZRVFC2Z.js} +7 -7
  30. package/dist/chunk-IZRVFC2Z.js.map +1 -0
  31. package/dist/{chunk-AQQVSNUX.js → chunk-K77I4XGL.js} +20 -6
  32. package/dist/chunk-K77I4XGL.js.map +1 -0
  33. package/dist/{chunk-BPD4VUAU.js → chunk-M6PGIZNS.js} +5 -5
  34. package/dist/{chunk-5LPPIT6H.js → chunk-NFV4SKH5.js} +4 -4
  35. package/dist/chunk-NI2RSNWB.js +156 -0
  36. package/dist/chunk-NI2RSNWB.js.map +1 -0
  37. package/dist/{chunk-NJ775OJ4.js → chunk-OEX5JDQD.js} +7 -7
  38. package/dist/chunk-OEX5JDQD.js.map +1 -0
  39. package/dist/{chunk-OKILA27U.js → chunk-TA6IIQI4.js} +86 -99
  40. package/dist/chunk-TA6IIQI4.js.map +1 -0
  41. package/dist/{chunk-PKUIO2Z7.js → chunk-TBDIR6LY.js} +8 -8
  42. package/dist/chunk-TBDIR6LY.js.map +1 -0
  43. package/dist/{chunk-XYCN2GCV.js → chunk-TNFACSWF.js} +3 -3
  44. package/dist/{chunk-ZE355C6C.js → chunk-TY5GELDB.js} +9 -4
  45. package/dist/chunk-TY5GELDB.js.map +1 -0
  46. package/dist/{chunk-WMVGRAFB.js → chunk-U5OB5ADP.js} +186 -109
  47. package/dist/chunk-U5OB5ADP.js.map +1 -0
  48. package/dist/{chunk-JXMRTHDT.js → chunk-UOMMQ5M6.js} +2 -2
  49. package/dist/{chunk-XNQJBQ5X.js → chunk-UV6JUGIY.js} +2 -2
  50. package/dist/{chunk-5YNZJ5TP.js → chunk-VAHVSQIG.js} +2 -2
  51. package/dist/{chunk-OGJ7DFCL.js → chunk-VAK5PX72.js} +5 -5
  52. package/dist/chunk-WSGGJKD5.js +113 -0
  53. package/dist/chunk-WSGGJKD5.js.map +1 -0
  54. package/dist/{chunk-BLLXNFWP.js → chunk-YHQNTBBN.js} +2 -2
  55. package/dist/{chunk-OI4WBRC7.js → chunk-YJIJTBSX.js} +77 -102
  56. package/dist/chunk-YJIJTBSX.js.map +1 -0
  57. package/dist/{chunk-YCS7GF6Y.js → chunk-ZBJQXDQN.js} +3 -1
  58. package/dist/{chunk-YCS7GF6Y.js.map → chunk-ZBJQXDQN.js.map} +1 -1
  59. package/dist/cli/defaults/agent-mappings.yaml +4 -4
  60. package/dist/commands/build/marketplace.js +3 -3
  61. package/dist/commands/build/plugins.js +5 -5
  62. package/dist/commands/build/stack.js +5 -5
  63. package/dist/commands/compile.js +12 -17
  64. package/dist/commands/compile.js.map +1 -1
  65. package/dist/commands/config/get.js +8 -8
  66. package/dist/commands/config/get.js.map +1 -1
  67. package/dist/commands/config/index.js +5 -5
  68. package/dist/commands/config/path.js +4 -4
  69. package/dist/commands/config/set-project.js +7 -7
  70. package/dist/commands/config/set-project.js.map +1 -1
  71. package/dist/commands/config/show.js +5 -5
  72. package/dist/commands/config/unset-project.js +5 -5
  73. package/dist/commands/config/unset-project.js.map +1 -1
  74. package/dist/commands/diff.js +8 -8
  75. package/dist/commands/diff.js.map +1 -1
  76. package/dist/commands/doctor.js +4 -4
  77. package/dist/commands/edit.js +30 -27
  78. package/dist/commands/edit.js.map +1 -1
  79. package/dist/commands/eject.js +6 -6
  80. package/dist/commands/eject.js.map +1 -1
  81. package/dist/commands/import/skill.js +16 -16
  82. package/dist/commands/import/skill.js.map +1 -1
  83. package/dist/commands/info.js +5 -5
  84. package/dist/commands/init.js +29 -26
  85. package/dist/commands/init.js.map +1 -1
  86. package/dist/commands/list.js +4 -4
  87. package/dist/commands/new/agent.js +5 -5
  88. package/dist/commands/new/skill.js +8 -8
  89. package/dist/commands/new/skill.js.map +1 -1
  90. package/dist/commands/outdated.js +4 -4
  91. package/dist/commands/search.js +7 -7
  92. package/dist/commands/uninstall.js +109 -102
  93. package/dist/commands/uninstall.js.map +1 -1
  94. package/dist/commands/update.js +6 -6
  95. package/dist/commands/validate.js +5 -5
  96. package/dist/commands/version/bump.js +4 -4
  97. package/dist/commands/version/index.js +4 -4
  98. package/dist/commands/version/set.js +4 -4
  99. package/dist/commands/version/show.js +4 -4
  100. package/dist/components/skill-search/skill-search.js +3 -3
  101. package/dist/components/wizard/category-grid.js +3 -3
  102. package/dist/components/wizard/category-grid.test.js +42 -21
  103. package/dist/components/wizard/category-grid.test.js.map +1 -1
  104. package/dist/components/wizard/checkbox-grid.js +10 -0
  105. package/dist/components/wizard/checkbox-grid.test.js +260 -0
  106. package/dist/components/wizard/checkbox-grid.test.js.map +1 -0
  107. package/dist/components/wizard/domain-selection.js +7 -5
  108. package/dist/components/wizard/help-modal.js +2 -2
  109. package/dist/components/wizard/menu-item.js +2 -2
  110. package/dist/components/wizard/search-modal.js +2 -2
  111. package/dist/components/wizard/search-modal.test.js +2 -2
  112. package/dist/components/wizard/section-progress.js +2 -2
  113. package/dist/components/wizard/section-progress.test.js +2 -2
  114. package/dist/components/wizard/source-grid.js +4 -4
  115. package/dist/components/wizard/source-grid.test.js +4 -4
  116. package/dist/components/wizard/stack-selection.js +8 -7
  117. package/dist/components/wizard/step-agents.js +16 -0
  118. package/dist/components/wizard/step-agents.js.map +1 -0
  119. package/dist/components/wizard/step-agents.test.js +185 -0
  120. package/dist/components/wizard/step-agents.test.js.map +1 -0
  121. package/dist/components/wizard/step-build.js +9 -8
  122. package/dist/components/wizard/step-build.test.js +25 -23
  123. package/dist/components/wizard/step-build.test.js.map +1 -1
  124. package/dist/components/wizard/step-confirm.js +2 -2
  125. package/dist/components/wizard/step-confirm.test.js +6 -5
  126. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  127. package/dist/components/wizard/step-refine.js +2 -2
  128. package/dist/components/wizard/step-refine.test.js +2 -2
  129. package/dist/components/wizard/step-settings.js +5 -5
  130. package/dist/components/wizard/step-settings.test.js +8 -8
  131. package/dist/components/wizard/step-sources.js +11 -10
  132. package/dist/components/wizard/step-sources.test.js +13 -12
  133. package/dist/components/wizard/step-sources.test.js.map +1 -1
  134. package/dist/components/wizard/step-stack.js +11 -9
  135. package/dist/components/wizard/step-stack.test.js +12 -10
  136. package/dist/components/wizard/step-stack.test.js.map +1 -1
  137. package/dist/components/wizard/view-title.js +2 -2
  138. package/dist/components/wizard/wizard-layout.js +8 -7
  139. package/dist/components/wizard/wizard-tabs.js +2 -2
  140. package/dist/components/wizard/wizard-tabs.test.js +6 -4
  141. package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
  142. package/dist/components/wizard/wizard.js +26 -23
  143. package/dist/config/skills-matrix.yaml +17 -17
  144. package/dist/hooks/init.js +3 -3
  145. package/dist/{source-manager-PTK4P6BF.js → source-manager-FEGVYDFZ.js} +4 -4
  146. package/dist/source-manager-FEGVYDFZ.js.map +1 -0
  147. package/dist/stores/wizard-store.js +5 -4
  148. package/dist/stores/wizard-store.test.js +287 -15
  149. package/dist/stores/wizard-store.test.js.map +1 -1
  150. package/package.json +1 -1
  151. package/src/schemas/agent.schema.json +3 -3
  152. package/src/schemas/metadata.schema.json +14 -14
  153. package/src/schemas/project-config.schema.json +43 -2
  154. package/src/schemas/project-source-config.schema.json +5 -5
  155. package/src/schemas/skills-matrix.schema.json +4 -4
  156. package/src/schemas/stack.schema.json +1 -1
  157. package/src/schemas/stacks.schema.json +42 -1
  158. package/dist/chunk-AQQVSNUX.js.map +0 -1
  159. package/dist/chunk-CEWNZQMH.js.map +0 -1
  160. package/dist/chunk-DC5AK3LW.js.map +0 -1
  161. package/dist/chunk-KWF6D7ZP.js.map +0 -1
  162. package/dist/chunk-LFHZBF6N.js.map +0 -1
  163. package/dist/chunk-NJ775OJ4.js.map +0 -1
  164. package/dist/chunk-NVQEHRJY.js.map +0 -1
  165. package/dist/chunk-OGXSTJP2.js.map +0 -1
  166. package/dist/chunk-OI4WBRC7.js.map +0 -1
  167. package/dist/chunk-OKILA27U.js.map +0 -1
  168. package/dist/chunk-PKUIO2Z7.js.map +0 -1
  169. package/dist/chunk-U36YCEBK.js.map +0 -1
  170. package/dist/chunk-UFUQUFV6.js +0 -256
  171. package/dist/chunk-UFUQUFV6.js.map +0 -1
  172. package/dist/chunk-WMVGRAFB.js.map +0 -1
  173. package/dist/chunk-YIKBNGE3.js.map +0 -1
  174. package/dist/chunk-YN35L5NE.js.map +0 -1
  175. package/dist/chunk-ZE355C6C.js.map +0 -1
  176. /package/dist/{chunk-HTTPKSL6.js.map → chunk-2XX4TMCI.js.map} +0 -0
  177. /package/dist/{chunk-IG7CUREJ.js.map → chunk-3NQJOJZL.js.map} +0 -0
  178. /package/dist/{chunk-VEZ2GZEK.js.map → chunk-ATLRUR3B.js.map} +0 -0
  179. /package/dist/{chunk-CXWPUVA7.js.map → chunk-DUQFF45G.js.map} +0 -0
  180. /package/dist/{chunk-GGHH3KR2.js.map → chunk-HKDE4LJW.js.map} +0 -0
  181. /package/dist/{chunk-YPJKOM42.js.map → chunk-HRW7BIDE.js.map} +0 -0
  182. /package/dist/{chunk-BPD4VUAU.js.map → chunk-M6PGIZNS.js.map} +0 -0
  183. /package/dist/{chunk-5LPPIT6H.js.map → chunk-NFV4SKH5.js.map} +0 -0
  184. /package/dist/{chunk-XYCN2GCV.js.map → chunk-TNFACSWF.js.map} +0 -0
  185. /package/dist/{chunk-JXMRTHDT.js.map → chunk-UOMMQ5M6.js.map} +0 -0
  186. /package/dist/{chunk-XNQJBQ5X.js.map → chunk-UV6JUGIY.js.map} +0 -0
  187. /package/dist/{chunk-5YNZJ5TP.js.map → chunk-VAHVSQIG.js.map} +0 -0
  188. /package/dist/{chunk-OGJ7DFCL.js.map → chunk-VAK5PX72.js.map} +0 -0
  189. /package/dist/{chunk-BLLXNFWP.js.map → chunk-YHQNTBBN.js.map} +0 -0
  190. /package/dist/{source-manager-PTK4P6BF.js.map → components/wizard/checkbox-grid.js.map} +0 -0
@@ -103,7 +103,7 @@ categories:
103
103
  displayName: Error Handling
104
104
  description: Error boundaries, result types, and error patterns
105
105
  domain: web-extras
106
- parent_domain: web
106
+ parentDomain: web
107
107
  exclusive: false
108
108
  required: false
109
109
  order: 11
@@ -122,7 +122,7 @@ categories:
122
122
  displayName: File Upload
123
123
  description: File upload patterns and handling
124
124
  domain: web-extras
125
- parent_domain: web
125
+ parentDomain: web
126
126
  exclusive: false
127
127
  required: false
128
128
  order: 13
@@ -132,7 +132,7 @@ categories:
132
132
  displayName: Files & Images
133
133
  description: Image handling and file processing
134
134
  domain: web-extras
135
- parent_domain: web
135
+ parentDomain: web
136
136
  exclusive: false
137
137
  required: false
138
138
  order: 14
@@ -142,7 +142,7 @@ categories:
142
142
  displayName: Utilities
143
143
  description: Utility libraries (date-fns, native JS patterns)
144
144
  domain: web-extras
145
- parent_domain: web
145
+ parentDomain: web
146
146
  exclusive: false
147
147
  required: false
148
148
  order: 15
@@ -152,7 +152,7 @@ categories:
152
152
  displayName: Realtime
153
153
  description: WebSockets, SSE, and real-time communication
154
154
  domain: web-extras
155
- parent_domain: web
155
+ parentDomain: web
156
156
  exclusive: true
157
157
  required: false
158
158
  order: 16
@@ -162,7 +162,7 @@ categories:
162
162
  displayName: Animation
163
163
  description: Animation libraries and CSS animations
164
164
  domain: web-extras
165
- parent_domain: web
165
+ parentDomain: web
166
166
  exclusive: false
167
167
  required: false
168
168
  order: 17
@@ -172,7 +172,7 @@ categories:
172
172
  displayName: Progressive Web App
173
173
  description: Service workers, offline-first patterns, and PWA features
174
174
  domain: web-extras
175
- parent_domain: web
175
+ parentDomain: web
176
176
  exclusive: false
177
177
  required: false
178
178
  order: 18
@@ -182,7 +182,7 @@ categories:
182
182
  displayName: Accessibility
183
183
  description: WCAG compliance, ARIA, and keyboard navigation
184
184
  domain: web-extras
185
- parent_domain: web
185
+ parentDomain: web
186
186
  exclusive: false
187
187
  required: false
188
188
  order: 19
@@ -597,12 +597,12 @@ relationships:
597
597
  # React-specific libraries (note: these libraries have vanilla/other-framework options, but our skills teach React patterns)
598
598
  - skill: zustand
599
599
  needs: [react, react-native]
600
- needs_any: true
600
+ needsAny: true
601
601
  reason: "Our Zustand skill covers React/React Native patterns (zustand/vanilla exists for other frameworks)"
602
602
 
603
603
  - skill: redux-toolkit
604
604
  needs: [react, react-native]
605
- needs_any: true
605
+ needsAny: true
606
606
  reason: "Our Redux Toolkit skill covers React/React Native patterns (RTK core is framework-agnostic)"
607
607
 
608
608
  - skill: mobx
@@ -611,17 +611,17 @@ relationships:
611
611
 
612
612
  - skill: react-query
613
613
  needs: [react, react-native]
614
- needs_any: true
614
+ needsAny: true
615
615
  reason: "TanStack Query's React adapter. Note: TanStack Query also supports Vue, Solid, Svelte via separate adapters."
616
616
 
617
617
  - skill: swr
618
618
  needs: [react, react-native]
619
- needs_any: true
619
+ needsAny: true
620
620
  reason: "SWR is a React Hooks library. For React Native, requires @nandorojo/swr-react-native wrapper."
621
621
 
622
622
  - skill: react-hook-form
623
623
  needs: [react, react-native]
624
- needs_any: true
624
+ needsAny: true
625
625
  reason: "React Hook Form is React only"
626
626
 
627
627
  - skill: react-testing-library
@@ -659,7 +659,7 @@ relationships:
659
659
  # Backend dependencies
660
660
  - skill: better-auth
661
661
  needs: [drizzle, prisma]
662
- needs_any: true
662
+ needsAny: true
663
663
  reason: "Better Auth supports multiple database adapters (Drizzle, Prisma, Kysely, MongoDB). Our skill uses Drizzle adapter."
664
664
 
665
665
  # NOTE: Removed drizzle/prisma requires API framework - ORMs work standalone for scripts, CLI tools, workers, etc.
@@ -672,12 +672,12 @@ relationships:
672
672
  # GraphQL clients need a framework
673
673
  - skill: graphql-apollo
674
674
  needs: [react, vue, angular]
675
- needs_any: true
675
+ needsAny: true
676
676
  reason: "Apollo Client - first-party React support, community-maintained Vue/Angular integrations. Note: Svelte/Solid bindings exist but are stale (2020-2022)."
677
677
 
678
678
  - skill: graphql-urql
679
679
  needs: [react, vue, solidjs]
680
- needs_any: true
680
+ needsAny: true
681
681
  reason: "URQL has first-party support for React, Vue, and Solid (no Angular support). Svelte support exists but skill not yet created."
682
682
 
683
683
  # ─────────────────────────────────────────────────────────────────
@@ -759,7 +759,7 @@ relationships:
759
759
  # - Lowercase
760
760
  # =============================================================================
761
761
 
762
- skill_aliases:
762
+ skillAliases:
763
763
  # ─────────────────────────────────────────────────────────────────
764
764
  # Frameworks - normalized skill IDs
765
765
  # ─────────────────────────────────────────────────────────────────
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  loadDefaultMappings,
4
4
  resolveSource
5
- } from "../chunk-WMVGRAFB.js";
5
+ } from "../chunk-U5OB5ADP.js";
6
6
  import "../chunk-T4EXUIBY.js";
7
- import "../chunk-OI4WBRC7.js";
8
- import "../chunk-YCS7GF6Y.js";
7
+ import "../chunk-YJIJTBSX.js";
8
+ import "../chunk-ZBJQXDQN.js";
9
9
  import {
10
10
  init_esm_shims
11
11
  } from "../chunk-DHET7RCE.js";
@@ -3,14 +3,14 @@ import {
3
3
  addSource,
4
4
  getSourceSummary,
5
5
  removeSource
6
- } from "./chunk-WMVGRAFB.js";
6
+ } from "./chunk-U5OB5ADP.js";
7
7
  import "./chunk-T4EXUIBY.js";
8
- import "./chunk-OI4WBRC7.js";
9
- import "./chunk-YCS7GF6Y.js";
8
+ import "./chunk-YJIJTBSX.js";
9
+ import "./chunk-ZBJQXDQN.js";
10
10
  import "./chunk-DHET7RCE.js";
11
11
  export {
12
12
  addSource,
13
13
  getSourceSummary,
14
14
  removeSource
15
15
  };
16
- //# sourceMappingURL=source-manager-PTK4P6BF.js.map
16
+ //# sourceMappingURL=source-manager-FEGVYDFZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  useWizardStore
4
- } from "../chunk-OGXSTJP2.js";
5
- import "../chunk-WMVGRAFB.js";
4
+ } from "../chunk-HRMQ2RGY.js";
5
+ import "../chunk-WSGGJKD5.js";
6
+ import "../chunk-U5OB5ADP.js";
6
7
  import "../chunk-T4EXUIBY.js";
7
- import "../chunk-OI4WBRC7.js";
8
- import "../chunk-YCS7GF6Y.js";
8
+ import "../chunk-YJIJTBSX.js";
9
+ import "../chunk-ZBJQXDQN.js";
9
10
  import "../chunk-DHET7RCE.js";
10
11
  export {
11
12
  useWizardStore
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- createMockCategory
4
- } from "../chunk-YN35L5NE.js";
3
+ createMockCategory,
4
+ createMockMatrix,
5
+ createMockSkill
6
+ } from "../chunk-FWQK3HWB.js";
5
7
  import {
8
+ afterEach,
6
9
  beforeEach,
7
10
  describe,
8
11
  globalExpect,
@@ -10,13 +13,19 @@ import {
10
13
  } from "../chunk-XY3XDVMI.js";
11
14
  import {
12
15
  useWizardStore
13
- } from "../chunk-OGXSTJP2.js";
14
- import "../chunk-WMVGRAFB.js";
15
- import "../chunk-T4EXUIBY.js";
16
- import "../chunk-OI4WBRC7.js";
16
+ } from "../chunk-HRMQ2RGY.js";
17
+ import "../chunk-WSGGJKD5.js";
18
+ import {
19
+ clearDefaultsCache,
20
+ loadDefaultMappings
21
+ } from "../chunk-U5OB5ADP.js";
22
+ import {
23
+ typedKeys
24
+ } from "../chunk-T4EXUIBY.js";
25
+ import "../chunk-YJIJTBSX.js";
17
26
  import {
18
27
  DEFAULT_PRESELECTED_SKILLS
19
- } from "../chunk-YCS7GF6Y.js";
28
+ } from "../chunk-ZBJQXDQN.js";
20
29
  import {
21
30
  init_esm_shims
22
31
  } from "../chunk-DHET7RCE.js";
@@ -261,11 +270,11 @@ describe("WizardStore", () => {
261
270
  const { installMode } = useWizardStore.getState();
262
271
  globalExpect(installMode).toBe("local");
263
272
  });
264
- it("should toggle show descriptions", () => {
273
+ it("should toggle show labels", () => {
265
274
  const store = useWizardStore.getState();
266
- store.toggleShowDescriptions();
267
- const { showDescriptions } = useWizardStore.getState();
268
- globalExpect(showDescriptions).toBe(true);
275
+ store.toggleShowLabels();
276
+ const { showLabels } = useWizardStore.getState();
277
+ globalExpect(showLabels).toBe(true);
269
278
  });
270
279
  it("should toggle help on", () => {
271
280
  const store = useWizardStore.getState();
@@ -431,7 +440,7 @@ describe("WizardStore", () => {
431
440
  categories: {
432
441
  "error-handling": createMockCategory("error-handling", "Error Handling", {
433
442
  domain: "web-extras",
434
- parent_domain: "web",
443
+ parentDomain: "web",
435
444
  exclusive: false
436
445
  }),
437
446
  framework: createMockCategory("framework", "Framework", {
@@ -446,7 +455,7 @@ describe("WizardStore", () => {
446
455
  })
447
456
  }
448
457
  };
449
- it("should find parent domain for a domain with parent_domain", () => {
458
+ it("should find parent domain for a domain with parentDomain", () => {
450
459
  const store = useWizardStore.getState();
451
460
  const parent = store.getParentDomain(
452
461
  "web-extras",
@@ -454,7 +463,7 @@ describe("WizardStore", () => {
454
463
  );
455
464
  globalExpect(parent).toBe("web");
456
465
  });
457
- it("should return undefined for a domain without parent_domain", () => {
466
+ it("should return undefined for a domain without parentDomain", () => {
458
467
  const store = useWizardStore.getState();
459
468
  const parent = store.getParentDomain("web", matrixWithoutParent);
460
469
  globalExpect(parent).toBeUndefined();
@@ -556,7 +565,7 @@ describe("WizardStore", () => {
556
565
  };
557
566
  store.populateFromStack(stack, categories);
558
567
  const { domainSelections } = useWizardStore.getState();
559
- globalExpect(Object.keys(domainSelections)).toHaveLength(0);
568
+ globalExpect(typedKeys(domainSelections)).toHaveLength(0);
560
569
  });
561
570
  it("should populate multiple skills from array-valued subcategories", () => {
562
571
  const store = useWizardStore.getState();
@@ -685,5 +694,268 @@ describe("WizardStore", () => {
685
694
  globalExpect(state.domainSelections.web.framework).toEqual(["web-framework-react"]);
686
695
  });
687
696
  });
697
+ describe("buildSourceRows sort order", () => {
698
+ function makeSource(overrides) {
699
+ return {
700
+ type: "private",
701
+ installed: false,
702
+ ...overrides
703
+ };
704
+ }
705
+ it("should sort local sources before scoped marketplace sources", () => {
706
+ const store = useWizardStore.getState();
707
+ const skill = createMockSkill("web-framework-react", "framework", {
708
+ displayName: "react",
709
+ availableSources: [
710
+ makeSource({ name: "Photoroom", type: "private", primary: true }),
711
+ makeSource({ name: "local", type: "local", installed: true, installMode: "local" })
712
+ ]
713
+ });
714
+ const matrix = createMockMatrix(
715
+ { "web-framework-react": skill },
716
+ {
717
+ displayNames: { "web-framework-react": "react" }
718
+ }
719
+ );
720
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
721
+ const rows = store.buildSourceRows(matrix);
722
+ globalExpect(rows).toHaveLength(1);
723
+ globalExpect(rows[0].options[0].id).toBe("local");
724
+ globalExpect(rows[0].options[1].id).toBe("Photoroom");
725
+ });
726
+ it("should sort scoped marketplace before default public marketplace", () => {
727
+ const store = useWizardStore.getState();
728
+ const skill = createMockSkill("web-framework-react", "framework", {
729
+ displayName: "react",
730
+ availableSources: [
731
+ makeSource({ name: "Agents Inc", type: "public" }),
732
+ makeSource({ name: "Photoroom", type: "private", primary: true })
733
+ ]
734
+ });
735
+ const matrix = createMockMatrix(
736
+ { "web-framework-react": skill },
737
+ {
738
+ displayNames: { "web-framework-react": "react" }
739
+ }
740
+ );
741
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
742
+ const rows = store.buildSourceRows(matrix);
743
+ globalExpect(rows).toHaveLength(1);
744
+ globalExpect(rows[0].options[0].id).toBe("Photoroom");
745
+ globalExpect(rows[0].options[1].id).toBe("Agents Inc");
746
+ });
747
+ it("should sort default public marketplace before third-party sources", () => {
748
+ const store = useWizardStore.getState();
749
+ const skill = createMockSkill("web-framework-react", "framework", {
750
+ displayName: "react",
751
+ availableSources: [
752
+ makeSource({ name: "Extra Corp", type: "private" }),
753
+ makeSource({ name: "Agents Inc", type: "public" })
754
+ ]
755
+ });
756
+ const matrix = createMockMatrix(
757
+ { "web-framework-react": skill },
758
+ {
759
+ displayNames: { "web-framework-react": "react" }
760
+ }
761
+ );
762
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
763
+ const rows = store.buildSourceRows(matrix);
764
+ globalExpect(rows).toHaveLength(1);
765
+ globalExpect(rows[0].options[0].id).toBe("Agents Inc");
766
+ globalExpect(rows[0].options[1].id).toBe("Extra Corp");
767
+ });
768
+ it("should sort all four tiers in correct order", () => {
769
+ const store = useWizardStore.getState();
770
+ const skill = createMockSkill("web-framework-react", "framework", {
771
+ displayName: "react",
772
+ availableSources: [
773
+ makeSource({ name: "Extra Corp", type: "private" }),
774
+ makeSource({ name: "Agents Inc", type: "public" }),
775
+ makeSource({ name: "Photoroom", type: "private", primary: true }),
776
+ makeSource({ name: "local", type: "local", installed: true, installMode: "local" })
777
+ ]
778
+ });
779
+ const matrix = createMockMatrix(
780
+ { "web-framework-react": skill },
781
+ {
782
+ displayNames: { "web-framework-react": "react" }
783
+ }
784
+ );
785
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
786
+ const rows = store.buildSourceRows(matrix);
787
+ globalExpect(rows).toHaveLength(1);
788
+ const sourceNames = rows[0].options.map((opt) => opt.id);
789
+ globalExpect(sourceNames).toEqual(["local", "Photoroom", "Agents Inc", "Extra Corp"]);
790
+ });
791
+ });
792
+ describe("agent selection", () => {
793
+ it("should start with empty selectedAgents", () => {
794
+ const { selectedAgents } = useWizardStore.getState();
795
+ globalExpect(selectedAgents).toEqual([]);
796
+ });
797
+ it("should toggle agent on", () => {
798
+ const store = useWizardStore.getState();
799
+ store.toggleAgent("web-developer");
800
+ const { selectedAgents } = useWizardStore.getState();
801
+ globalExpect(selectedAgents).toContain("web-developer");
802
+ });
803
+ it("should toggle agent off", () => {
804
+ const store = useWizardStore.getState();
805
+ store.toggleAgent("web-developer");
806
+ store.toggleAgent("web-developer");
807
+ const { selectedAgents } = useWizardStore.getState();
808
+ globalExpect(selectedAgents).not.toContain("web-developer");
809
+ });
810
+ it("should allow multiple agents to be selected", () => {
811
+ const store = useWizardStore.getState();
812
+ store.toggleAgent("web-developer");
813
+ store.toggleAgent("api-developer");
814
+ store.toggleAgent("web-reviewer");
815
+ const { selectedAgents } = useWizardStore.getState();
816
+ globalExpect(selectedAgents).toEqual(["web-developer", "api-developer", "web-reviewer"]);
817
+ });
818
+ it("should reset selectedAgents on reset", () => {
819
+ const store = useWizardStore.getState();
820
+ store.toggleAgent("web-developer");
821
+ store.reset();
822
+ const { selectedAgents } = useWizardStore.getState();
823
+ globalExpect(selectedAgents).toEqual([]);
824
+ });
825
+ });
826
+ describe("preselectAgentsFromSkills", () => {
827
+ beforeEach(async () => {
828
+ clearDefaultsCache();
829
+ await loadDefaultMappings();
830
+ });
831
+ afterEach(() => {
832
+ clearDefaultsCache();
833
+ });
834
+ it("should preselect web-related agents when web skills are selected", () => {
835
+ const store = useWizardStore.getState();
836
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
837
+ store.preselectAgentsFromSkills();
838
+ const { selectedAgents } = useWizardStore.getState();
839
+ globalExpect(selectedAgents).toContain("web-developer");
840
+ globalExpect(selectedAgents).toContain("web-reviewer");
841
+ globalExpect(selectedAgents).toContain("web-researcher");
842
+ globalExpect(selectedAgents).toContain("web-tester");
843
+ globalExpect(selectedAgents).toContain("web-pm");
844
+ globalExpect(selectedAgents).toContain("web-architecture");
845
+ });
846
+ it("should preselect api-related agents when api skills are selected", () => {
847
+ const store = useWizardStore.getState();
848
+ store.toggleTechnology("api", "api", "api-framework-hono", true);
849
+ store.preselectAgentsFromSkills();
850
+ const { selectedAgents } = useWizardStore.getState();
851
+ globalExpect(selectedAgents).toContain("api-developer");
852
+ globalExpect(selectedAgents).toContain("api-reviewer");
853
+ globalExpect(selectedAgents).toContain("api-researcher");
854
+ globalExpect(selectedAgents).not.toContain("web-developer");
855
+ });
856
+ it("should never include optional agents regardless of skills", () => {
857
+ const store = useWizardStore.getState();
858
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
859
+ store.toggleTechnology("api", "api", "api-framework-hono", true);
860
+ store.toggleTechnology("cli", "framework", "cli-framework-oclif-ink", true);
861
+ store.preselectAgentsFromSkills();
862
+ const { selectedAgents } = useWizardStore.getState();
863
+ globalExpect(selectedAgents).not.toContain("agent-summoner");
864
+ globalExpect(selectedAgents).not.toContain("skill-summoner");
865
+ globalExpect(selectedAgents).not.toContain("documentor");
866
+ globalExpect(selectedAgents).not.toContain("pattern-scout");
867
+ globalExpect(selectedAgents).not.toContain("web-pattern-critique");
868
+ });
869
+ it("should return empty agents when no skills are selected", () => {
870
+ const store = useWizardStore.getState();
871
+ store.preselectAgentsFromSkills();
872
+ const { selectedAgents } = useWizardStore.getState();
873
+ globalExpect(selectedAgents).toEqual([]);
874
+ });
875
+ it("should produce union of agents for skills across multiple domains", () => {
876
+ const store = useWizardStore.getState();
877
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
878
+ store.toggleTechnology("api", "api", "api-framework-hono", true);
879
+ store.preselectAgentsFromSkills();
880
+ const { selectedAgents } = useWizardStore.getState();
881
+ globalExpect(selectedAgents).toContain("web-developer");
882
+ globalExpect(selectedAgents).toContain("api-developer");
883
+ globalExpect(selectedAgents).toContain("web-reviewer");
884
+ globalExpect(selectedAgents).toContain("api-reviewer");
885
+ });
886
+ it("should preselect cli agents when cli skills are selected", () => {
887
+ const store = useWizardStore.getState();
888
+ store.toggleTechnology("cli", "framework", "cli-framework-oclif-ink", true);
889
+ store.preselectAgentsFromSkills();
890
+ const { selectedAgents } = useWizardStore.getState();
891
+ globalExpect(selectedAgents).toContain("cli-developer");
892
+ globalExpect(selectedAgents).toContain("cli-tester");
893
+ globalExpect(selectedAgents).toContain("cli-reviewer");
894
+ globalExpect(selectedAgents).toContain("cli-migrator");
895
+ });
896
+ it("should not preselect api agents when only web skills are selected", () => {
897
+ const store = useWizardStore.getState();
898
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
899
+ store.toggleTechnology("web", "styling", "web-styling-scss-modules", false);
900
+ store.preselectAgentsFromSkills();
901
+ const { selectedAgents } = useWizardStore.getState();
902
+ globalExpect(selectedAgents).toContain("web-developer");
903
+ globalExpect(selectedAgents).not.toContain("api-developer");
904
+ globalExpect(selectedAgents).not.toContain("api-reviewer");
905
+ });
906
+ it("should return sorted agents", () => {
907
+ const store = useWizardStore.getState();
908
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
909
+ store.toggleTechnology("api", "api", "api-framework-hono", true);
910
+ store.preselectAgentsFromSkills();
911
+ const { selectedAgents } = useWizardStore.getState();
912
+ const sorted = [...selectedAgents].sort();
913
+ globalExpect(selectedAgents).toEqual(sorted);
914
+ });
915
+ it("should replace previous agent selection", () => {
916
+ const store = useWizardStore.getState();
917
+ store.toggleAgent("documentor");
918
+ store.toggleTechnology("web", "framework", "web-framework-react", true);
919
+ store.preselectAgentsFromSkills();
920
+ const { selectedAgents } = useWizardStore.getState();
921
+ globalExpect(selectedAgents).not.toContain("documentor");
922
+ });
923
+ });
924
+ describe("step progress with agents step", () => {
925
+ it("should include agents in completed steps when on confirm", () => {
926
+ const store = useWizardStore.getState();
927
+ store.setApproach("scratch");
928
+ store.setStep("build");
929
+ store.setStep("sources");
930
+ store.setStep("agents");
931
+ store.setStep("confirm");
932
+ const { completedSteps } = store.getStepProgress();
933
+ globalExpect(completedSteps).toContain("agents");
934
+ globalExpect(completedSteps).toContain("sources");
935
+ globalExpect(completedSteps).toContain("build");
936
+ });
937
+ it("should include sources in completed steps when on agents step", () => {
938
+ const store = useWizardStore.getState();
939
+ store.setApproach("scratch");
940
+ store.setStep("build");
941
+ store.setStep("sources");
942
+ store.setStep("agents");
943
+ const { completedSteps } = store.getStepProgress();
944
+ globalExpect(completedSteps).toContain("build");
945
+ globalExpect(completedSteps).toContain("sources");
946
+ globalExpect(completedSteps).not.toContain("agents");
947
+ });
948
+ it("should skip agents step when using stack defaults", () => {
949
+ const store = useWizardStore.getState();
950
+ store.setApproach("stack");
951
+ store.selectStack("nextjs-fullstack");
952
+ store.setStackAction("defaults");
953
+ store.setStep("confirm");
954
+ const { skippedSteps } = store.getStepProgress();
955
+ globalExpect(skippedSteps).toContain("agents");
956
+ globalExpect(skippedSteps).toContain("build");
957
+ globalExpect(skippedSteps).toContain("sources");
958
+ });
959
+ });
688
960
  });
689
961
  //# sourceMappingURL=wizard-store.test.js.map