@agents-inc/cli 0.50.0 → 0.60.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 (237) hide show
  1. package/CHANGELOG.md +155 -5
  2. package/dist/{chunk-YDYRAXSY.js → chunk-52M2XF3W.js} +6 -6
  3. package/dist/{chunk-2BWCR762.js → chunk-52XO4ULK.js} +6 -8
  4. package/dist/chunk-52XO4ULK.js.map +1 -0
  5. package/dist/{chunk-KQOU4POU.js → chunk-6G3KZSO4.js} +72 -51
  6. package/dist/chunk-6G3KZSO4.js.map +1 -0
  7. package/dist/{chunk-AWP5A6IM.js → chunk-6OWHQ7HM.js} +14 -12
  8. package/dist/chunk-6OWHQ7HM.js.map +1 -0
  9. package/dist/{chunk-D72AFYQR.js → chunk-7FMEMXJ4.js} +71 -71
  10. package/dist/chunk-7FMEMXJ4.js.map +1 -0
  11. package/dist/{chunk-RA2IPRO2.js → chunk-AJJJE7F7.js} +2 -2
  12. package/dist/{chunk-4R52TQ3K.js → chunk-AX3SZZWA.js} +2 -2
  13. package/dist/{chunk-U2W5SENM.js → chunk-BFD5NZQ4.js} +5 -4
  14. package/dist/chunk-BFD5NZQ4.js.map +1 -0
  15. package/dist/{chunk-HYEUETIC.js → chunk-BKJHAJQW.js} +2 -2
  16. package/dist/{chunk-HYEUETIC.js.map → chunk-BKJHAJQW.js.map} +1 -1
  17. package/dist/{chunk-DCE423KO.js → chunk-BMJZBLP7.js} +5 -5
  18. package/dist/{chunk-GBOW6FUW.js → chunk-BNQ5O6LE.js} +2 -2
  19. package/dist/{chunk-KAO3LKB5.js → chunk-C577AJE7.js} +3 -3
  20. package/dist/{chunk-C3Q43WLC.js → chunk-CIG7IKX3.js} +4 -4
  21. package/dist/chunk-EC3UJRKZ.js +1534 -0
  22. package/dist/chunk-EC3UJRKZ.js.map +1 -0
  23. package/dist/{chunk-I6IOGZSZ.js → chunk-EMIUPGPL.js} +11 -15
  24. package/dist/chunk-EMIUPGPL.js.map +1 -0
  25. package/dist/{chunk-4QWDB2MD.js → chunk-G6WHCALR.js} +127 -105
  26. package/dist/chunk-G6WHCALR.js.map +1 -0
  27. package/dist/{chunk-JFF7P4LC.js → chunk-H7WJK7NJ.js} +22 -6
  28. package/dist/chunk-H7WJK7NJ.js.map +1 -0
  29. package/dist/chunk-HGTC76BX.js +16 -0
  30. package/dist/chunk-HGTC76BX.js.map +1 -0
  31. package/dist/{chunk-RDWGYKDY.js → chunk-K6OLORQL.js} +6 -6
  32. package/dist/{chunk-XDSVV5GZ.js → chunk-KIWFEBKH.js} +41 -11
  33. package/dist/chunk-KIWFEBKH.js.map +1 -0
  34. package/dist/{chunk-WBHPCBVN.js → chunk-LWXRUR6B.js} +66 -94
  35. package/dist/chunk-LWXRUR6B.js.map +1 -0
  36. package/dist/{chunk-CMNKHDOX.js → chunk-MGNYPVOJ.js} +2 -2
  37. package/dist/{chunk-5FPIKTSA.js → chunk-MKCHLXMY.js} +7 -7
  38. package/dist/{chunk-U7X4V4HE.js → chunk-MMFQNJPE.js} +2 -2
  39. package/dist/{chunk-WLZHCM7O.js → chunk-MR6OBL3B.js} +3 -11
  40. package/dist/{chunk-WLZHCM7O.js.map → chunk-MR6OBL3B.js.map} +1 -1
  41. package/dist/{chunk-RFKDGJAJ.js → chunk-O6BA7Q2B.js} +6 -6
  42. package/dist/chunk-O6BA7Q2B.js.map +1 -0
  43. package/dist/chunk-OCEFD7V6.js +201 -0
  44. package/dist/chunk-OCEFD7V6.js.map +1 -0
  45. package/dist/{chunk-YZTWZVGX.js → chunk-PUT7X3GA.js} +1 -1
  46. package/dist/chunk-PUT7X3GA.js.map +1 -0
  47. package/dist/{chunk-WFFV254H.js → chunk-RO6LX3UV.js} +110 -82
  48. package/dist/chunk-RO6LX3UV.js.map +1 -0
  49. package/dist/{chunk-QYLCINGC.js → chunk-SDKCQXWE.js} +2 -2
  50. package/dist/{chunk-M3GQ2R3E.js → chunk-SEJF7CGJ.js} +19 -7
  51. package/dist/chunk-SEJF7CGJ.js.map +1 -0
  52. package/dist/{chunk-SPFHPHYL.js → chunk-SZRK3VOR.js} +24 -14
  53. package/dist/chunk-SZRK3VOR.js.map +1 -0
  54. package/dist/{chunk-QB5HHTAA.js → chunk-TC3NHO34.js} +28 -12
  55. package/dist/chunk-TC3NHO34.js.map +1 -0
  56. package/dist/{chunk-5L724R4C.js → chunk-TGLRDEEL.js} +8 -13
  57. package/dist/chunk-TGLRDEEL.js.map +1 -0
  58. package/dist/{chunk-HMSHB5EQ.js → chunk-TZXYBG3R.js} +3544 -3037
  59. package/dist/chunk-TZXYBG3R.js.map +1 -0
  60. package/dist/{chunk-PGY5XROM.js → chunk-VR3CDXDT.js} +2 -6
  61. package/dist/chunk-VR3CDXDT.js.map +1 -0
  62. package/dist/{chunk-5FCHJLM7.js → chunk-WF6RM73R.js} +252 -38
  63. package/dist/chunk-WF6RM73R.js.map +1 -0
  64. package/dist/{chunk-3VOL4WEG.js → chunk-WYVDNGJB.js} +3 -3
  65. package/dist/{chunk-WJHFV6RI.js → chunk-X5EG4EFP.js} +2 -2
  66. package/dist/{chunk-JWYRXE6C.js → chunk-XUDTFI4M.js} +2 -2
  67. package/dist/{chunk-7LV4V6A4.js → chunk-YHCYKUA3.js} +14 -10
  68. package/dist/chunk-YHCYKUA3.js.map +1 -0
  69. package/dist/commands/build/marketplace.js +4 -4
  70. package/dist/commands/build/plugins.js +9 -7
  71. package/dist/commands/build/plugins.js.map +1 -1
  72. package/dist/commands/build/stack.js +13 -10
  73. package/dist/commands/build/stack.js.map +1 -1
  74. package/dist/commands/compile.js +42 -71
  75. package/dist/commands/compile.js.map +1 -1
  76. package/dist/commands/config/index.js +7 -5
  77. package/dist/commands/config/index.js.map +1 -1
  78. package/dist/commands/config/path.js +8 -6
  79. package/dist/commands/config/path.js.map +1 -1
  80. package/dist/commands/config/show.js +7 -5
  81. package/dist/commands/diff.js +9 -7
  82. package/dist/commands/diff.js.map +1 -1
  83. package/dist/commands/doctor.js +20 -16
  84. package/dist/commands/doctor.js.map +1 -1
  85. package/dist/commands/edit.js +175 -79
  86. package/dist/commands/edit.js.map +1 -1
  87. package/dist/commands/eject.js +20 -41
  88. package/dist/commands/eject.js.map +1 -1
  89. package/dist/commands/import/skill.js +10 -18
  90. package/dist/commands/import/skill.js.map +1 -1
  91. package/dist/commands/info.js +21 -20
  92. package/dist/commands/info.js.map +1 -1
  93. package/dist/commands/init.js +32 -31
  94. package/dist/commands/list.js +8 -6
  95. package/dist/commands/list.js.map +1 -1
  96. package/dist/commands/new/agent.js +23 -11
  97. package/dist/commands/new/agent.js.map +1 -1
  98. package/dist/commands/new/marketplace.js +63 -46
  99. package/dist/commands/new/marketplace.js.map +1 -1
  100. package/dist/commands/new/skill.js +11 -9
  101. package/dist/commands/outdated.js +9 -7
  102. package/dist/commands/outdated.js.map +1 -1
  103. package/dist/commands/search.js +45 -35
  104. package/dist/commands/search.js.map +1 -1
  105. package/dist/commands/uninstall.js +93 -123
  106. package/dist/commands/uninstall.js.map +1 -1
  107. package/dist/commands/update.js +11 -9
  108. package/dist/commands/update.js.map +1 -1
  109. package/dist/commands/validate.js +23 -27
  110. package/dist/commands/validate.js.map +1 -1
  111. package/dist/components/common/confirm.test.js +4 -4
  112. package/dist/components/skill-search/skill-search.js +3 -3
  113. package/dist/components/wizard/category-grid.js +3 -3
  114. package/dist/components/wizard/category-grid.test.js +4 -4
  115. package/dist/components/wizard/category-grid.test.js.map +1 -1
  116. package/dist/components/wizard/checkbox-grid.js +5 -5
  117. package/dist/components/wizard/checkbox-grid.test.js +6 -6
  118. package/dist/components/wizard/domain-selection.js +12 -11
  119. package/dist/components/wizard/help-modal.js +2 -2
  120. package/dist/components/wizard/menu-item.js +1 -1
  121. package/dist/components/wizard/search-modal.js +2 -2
  122. package/dist/components/wizard/search-modal.test.js +3 -3
  123. package/dist/components/wizard/search-modal.test.js.map +1 -1
  124. package/dist/components/wizard/section-progress.js +2 -2
  125. package/dist/components/wizard/section-progress.test.js +4 -4
  126. package/dist/components/wizard/section-progress.test.js.map +1 -1
  127. package/dist/components/wizard/selection-card.js +2 -2
  128. package/dist/components/wizard/source-grid.js +4 -4
  129. package/dist/components/wizard/source-grid.test.js +5 -5
  130. package/dist/components/wizard/source-grid.test.js.map +1 -1
  131. package/dist/components/wizard/stack-selection.js +9 -8
  132. package/dist/components/wizard/step-agents.js +11 -10
  133. package/dist/components/wizard/step-agents.test.js +13 -12
  134. package/dist/components/wizard/step-agents.test.js.map +1 -1
  135. package/dist/components/wizard/step-build.js +11 -9
  136. package/dist/components/wizard/step-build.test.js +18 -22
  137. package/dist/components/wizard/step-build.test.js.map +1 -1
  138. package/dist/components/wizard/step-confirm.js +4 -4
  139. package/dist/components/wizard/step-confirm.test.js +83 -23
  140. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  141. package/dist/components/wizard/step-refine.js +2 -2
  142. package/dist/components/wizard/step-refine.test.js +3 -3
  143. package/dist/components/wizard/step-settings.js +9 -7
  144. package/dist/components/wizard/step-settings.test.js +13 -11
  145. package/dist/components/wizard/step-settings.test.js.map +1 -1
  146. package/dist/components/wizard/step-sources.js +13 -11
  147. package/dist/components/wizard/step-sources.test.js +19 -17
  148. package/dist/components/wizard/step-sources.test.js.map +1 -1
  149. package/dist/components/wizard/step-stack.js +15 -14
  150. package/dist/components/wizard/step-stack.test.js +17 -16
  151. package/dist/components/wizard/step-stack.test.js.map +1 -1
  152. package/dist/components/wizard/view-title.js +2 -2
  153. package/dist/components/wizard/wizard-layout.js +10 -8
  154. package/dist/components/wizard/wizard-tabs.js +2 -2
  155. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  156. package/dist/components/wizard/wizard.js +29 -27
  157. package/dist/config-exports.js +20 -0
  158. package/dist/config-exports.js.map +1 -0
  159. package/dist/hooks/init.js +34 -33
  160. package/dist/hooks/init.js.map +1 -1
  161. package/dist/loader-2O32KKAQ.js +19 -0
  162. package/dist/source-loader-A6B3NDI4.js +16 -0
  163. package/dist/source-loader-A6B3NDI4.js.map +1 -0
  164. package/dist/source-manager-Q7IQSGIX.js +18 -0
  165. package/dist/source-manager-Q7IQSGIX.js.map +1 -0
  166. package/dist/src/agents/meta/agent-summoner/workflow.md +3 -3
  167. package/dist/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  168. package/dist/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  169. package/dist/src/agents/meta/skill-summoner/intro.md +1 -1
  170. package/dist/src/agents/meta/skill-summoner/output-format.md +3 -3
  171. package/dist/src/agents/meta/skill-summoner/workflow.md +8 -8
  172. package/dist/stores/wizard-store.js +6 -5
  173. package/dist/stores/wizard-store.test.js +299 -59
  174. package/dist/stores/wizard-store.test.js.map +1 -1
  175. package/package.json +5 -1
  176. package/src/agents/meta/agent-summoner/workflow.md +3 -3
  177. package/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
  178. package/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
  179. package/src/agents/meta/skill-summoner/intro.md +1 -1
  180. package/src/agents/meta/skill-summoner/output-format.md +3 -3
  181. package/src/agents/meta/skill-summoner/workflow.md +8 -8
  182. package/src/schemas/metadata.schema.json +6 -0
  183. package/src/schemas/stacks.schema.json +1 -1
  184. package/config/skill-categories.yaml +0 -344
  185. package/config/skill-rules.yaml +0 -740
  186. package/config/stacks.yaml +0 -1864
  187. package/dist/chunk-26MXZUHU.js +0 -183
  188. package/dist/chunk-26MXZUHU.js.map +0 -1
  189. package/dist/chunk-2BWCR762.js.map +0 -1
  190. package/dist/chunk-4QWDB2MD.js.map +0 -1
  191. package/dist/chunk-5FCHJLM7.js.map +0 -1
  192. package/dist/chunk-5L724R4C.js.map +0 -1
  193. package/dist/chunk-7LV4V6A4.js.map +0 -1
  194. package/dist/chunk-AWP5A6IM.js.map +0 -1
  195. package/dist/chunk-D72AFYQR.js.map +0 -1
  196. package/dist/chunk-HMSHB5EQ.js.map +0 -1
  197. package/dist/chunk-I6IOGZSZ.js.map +0 -1
  198. package/dist/chunk-JFF7P4LC.js.map +0 -1
  199. package/dist/chunk-KQOU4POU.js.map +0 -1
  200. package/dist/chunk-M3GQ2R3E.js.map +0 -1
  201. package/dist/chunk-PGY5XROM.js.map +0 -1
  202. package/dist/chunk-QB5HHTAA.js.map +0 -1
  203. package/dist/chunk-RFKDGJAJ.js.map +0 -1
  204. package/dist/chunk-SPFHPHYL.js.map +0 -1
  205. package/dist/chunk-U2W5SENM.js.map +0 -1
  206. package/dist/chunk-UAD3SC27.js +0 -107
  207. package/dist/chunk-UAD3SC27.js.map +0 -1
  208. package/dist/chunk-WBHPCBVN.js.map +0 -1
  209. package/dist/chunk-WFFV254H.js.map +0 -1
  210. package/dist/chunk-XDSVV5GZ.js.map +0 -1
  211. package/dist/chunk-YZTWZVGX.js.map +0 -1
  212. package/dist/commands/config/get.js +0 -61
  213. package/dist/commands/config/get.js.map +0 -1
  214. package/dist/commands/config/set-project.js +0 -61
  215. package/dist/commands/config/set-project.js.map +0 -1
  216. package/dist/commands/config/unset-project.js +0 -57
  217. package/dist/commands/config/unset-project.js.map +0 -1
  218. package/dist/config/skill-categories.yaml +0 -344
  219. package/dist/config/skill-rules.yaml +0 -740
  220. package/dist/config/stacks.yaml +0 -1864
  221. package/dist/source-manager-BVB2SG73.js +0 -16
  222. /package/dist/{chunk-YDYRAXSY.js.map → chunk-52M2XF3W.js.map} +0 -0
  223. /package/dist/{chunk-RA2IPRO2.js.map → chunk-AJJJE7F7.js.map} +0 -0
  224. /package/dist/{chunk-4R52TQ3K.js.map → chunk-AX3SZZWA.js.map} +0 -0
  225. /package/dist/{chunk-DCE423KO.js.map → chunk-BMJZBLP7.js.map} +0 -0
  226. /package/dist/{chunk-GBOW6FUW.js.map → chunk-BNQ5O6LE.js.map} +0 -0
  227. /package/dist/{chunk-KAO3LKB5.js.map → chunk-C577AJE7.js.map} +0 -0
  228. /package/dist/{chunk-C3Q43WLC.js.map → chunk-CIG7IKX3.js.map} +0 -0
  229. /package/dist/{chunk-RDWGYKDY.js.map → chunk-K6OLORQL.js.map} +0 -0
  230. /package/dist/{chunk-CMNKHDOX.js.map → chunk-MGNYPVOJ.js.map} +0 -0
  231. /package/dist/{chunk-5FPIKTSA.js.map → chunk-MKCHLXMY.js.map} +0 -0
  232. /package/dist/{chunk-U7X4V4HE.js.map → chunk-MMFQNJPE.js.map} +0 -0
  233. /package/dist/{chunk-QYLCINGC.js.map → chunk-SDKCQXWE.js.map} +0 -0
  234. /package/dist/{chunk-3VOL4WEG.js.map → chunk-WYVDNGJB.js.map} +0 -0
  235. /package/dist/{chunk-WJHFV6RI.js.map → chunk-X5EG4EFP.js.map} +0 -0
  236. /package/dist/{chunk-JWYRXE6C.js.map → chunk-XUDTFI4M.js.map} +0 -0
  237. /package/dist/{source-manager-BVB2SG73.js.map → loader-2O32KKAQ.js.map} +0 -0
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ TEST_CATEGORIES,
4
+ TEST_SKILLS,
3
5
  createMockMatrix,
4
6
  getTestSkill
5
- } from "../chunk-D72AFYQR.js";
7
+ } from "../chunk-7FMEMXJ4.js";
6
8
  import {
7
9
  beforeEach,
8
10
  describe,
@@ -11,16 +13,17 @@ import {
11
13
  } from "../chunk-XY3XDVMI.js";
12
14
  import {
13
15
  useWizardStore
14
- } from "../chunk-5FCHJLM7.js";
15
- import "../chunk-UAD3SC27.js";
16
- import "../chunk-HMSHB5EQ.js";
16
+ } from "../chunk-WF6RM73R.js";
17
+ import "../chunk-TZXYBG3R.js";
18
+ import "../chunk-OCEFD7V6.js";
17
19
  import {
18
20
  typedKeys
19
21
  } from "../chunk-T4EXUIBY.js";
20
- import "../chunk-WBHPCBVN.js";
22
+ import "../chunk-LWXRUR6B.js";
21
23
  import {
22
24
  DEFAULT_PRESELECTED_SKILLS
23
- } from "../chunk-AWP5A6IM.js";
25
+ } from "../chunk-6OWHQ7HM.js";
26
+ import "../chunk-EC3UJRKZ.js";
24
27
  import {
25
28
  init_esm_shims
26
29
  } from "../chunk-DHET7RCE.js";
@@ -47,9 +50,13 @@ describe("WizardStore", () => {
47
50
  const { selectedStackId } = useWizardStore.getState();
48
51
  globalExpect(selectedStackId).toBeNull();
49
52
  });
50
- it("should default to local install mode", () => {
51
- const { installMode } = useWizardStore.getState();
52
- globalExpect(installMode).toBe("local");
53
+ it("should have empty skillConfigs", () => {
54
+ const { skillConfigs } = useWizardStore.getState();
55
+ globalExpect(skillConfigs).toEqual([]);
56
+ });
57
+ it("should have null focusedSkillId", () => {
58
+ const { focusedSkillId } = useWizardStore.getState();
59
+ globalExpect(focusedSkillId).toBeNull();
53
60
  });
54
61
  it("should have empty navigation history", () => {
55
62
  const { history } = useWizardStore.getState();
@@ -216,12 +223,12 @@ describe("WizardStore", () => {
216
223
  it("should restore stack skills when re-toggling a domain ON after populateFromSkillIds", () => {
217
224
  const store = useWizardStore.getState();
218
225
  const skills = {
219
- "web-framework-react": { category: "web-framework", displayName: "React" },
220
- "api-framework-hono": { category: "api-api", displayName: "Hono" }
226
+ "web-framework-react": TEST_SKILLS.react,
227
+ "api-framework-hono": TEST_SKILLS.hono
221
228
  };
222
229
  const categories = {
223
- "web-framework": { domain: "web" },
224
- "api-api": { domain: "api" }
230
+ "web-framework": TEST_CATEGORIES.framework,
231
+ "api-api": TEST_CATEGORIES.api
225
232
  };
226
233
  store.populateFromSkillIds(["web-framework-react", "api-framework-hono"], skills, categories);
227
234
  store.toggleDomain("web");
@@ -349,19 +356,6 @@ describe("WizardStore", () => {
349
356
  });
350
357
  });
351
358
  describe("mode toggles", () => {
352
- it("should toggle install mode to plugin", () => {
353
- const store = useWizardStore.getState();
354
- store.toggleInstallMode();
355
- const { installMode } = useWizardStore.getState();
356
- globalExpect(installMode).toBe("plugin");
357
- });
358
- it("should toggle install mode back to local", () => {
359
- const store = useWizardStore.getState();
360
- store.toggleInstallMode();
361
- store.toggleInstallMode();
362
- const { installMode } = useWizardStore.getState();
363
- globalExpect(installMode).toBe("local");
364
- });
365
359
  it("should toggle show labels", () => {
366
360
  const store = useWizardStore.getState();
367
361
  store.toggleShowLabels();
@@ -417,28 +411,175 @@ describe("WizardStore", () => {
417
411
  globalExpect(showSettings).toBe(false);
418
412
  });
419
413
  });
420
- describe("install mode auto-defaulting", () => {
421
- it("should default installMode to plugin when set via setState (marketplace available)", () => {
422
- useWizardStore.setState({ installMode: "plugin" });
423
- const { installMode } = useWizardStore.getState();
424
- globalExpect(installMode).toBe("plugin");
425
- });
426
- it("should keep installMode as local when set via setState (no marketplace)", () => {
427
- useWizardStore.setState({ installMode: "local" });
428
- const { installMode } = useWizardStore.getState();
429
- globalExpect(installMode).toBe("local");
430
- });
431
- it("should allow toggling installMode after auto-defaulting to plugin", () => {
432
- useWizardStore.setState({ installMode: "plugin" });
433
- useWizardStore.getState().toggleInstallMode();
434
- const { installMode } = useWizardStore.getState();
435
- globalExpect(installMode).toBe("local");
436
- });
437
- it("should reset installMode to local after reset even if previously set to plugin", () => {
438
- useWizardStore.setState({ installMode: "plugin" });
439
- useWizardStore.getState().reset();
440
- const { installMode } = useWizardStore.getState();
441
- globalExpect(installMode).toBe("local");
414
+ describe("skillConfigs and per-skill scope", () => {
415
+ it("should sync skillConfigs when toggling a technology on", () => {
416
+ const store = useWizardStore.getState();
417
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
418
+ const { skillConfigs } = useWizardStore.getState();
419
+ globalExpect(skillConfigs).toHaveLength(1);
420
+ globalExpect(skillConfigs[0]).toEqual({
421
+ id: "web-framework-react",
422
+ scope: "project",
423
+ source: "agents-inc"
424
+ });
425
+ });
426
+ it("should remove from skillConfigs when toggling a technology off", () => {
427
+ const store = useWizardStore.getState();
428
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
429
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
430
+ const { skillConfigs } = useWizardStore.getState();
431
+ globalExpect(skillConfigs).toHaveLength(0);
432
+ });
433
+ it("should replace skillConfigs entry in exclusive mode", () => {
434
+ const store = useWizardStore.getState();
435
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
436
+ store.toggleTechnology("web", "web-framework", "web-framework-vue", true);
437
+ const { skillConfigs } = useWizardStore.getState();
438
+ globalExpect(skillConfigs).toHaveLength(1);
439
+ globalExpect(skillConfigs[0].id).toBe("web-framework-vue");
440
+ });
441
+ it("should accumulate skillConfigs in non-exclusive mode", () => {
442
+ const store = useWizardStore.getState();
443
+ store.toggleTechnology("web", "web-testing", "web-testing-vitest", false);
444
+ store.toggleTechnology("web", "web-testing", "web-testing-playwright-e2e", false);
445
+ const { skillConfigs } = useWizardStore.getState();
446
+ globalExpect(skillConfigs).toHaveLength(2);
447
+ globalExpect(skillConfigs.map((sc) => sc.id)).toEqual([
448
+ "web-testing-vitest",
449
+ "web-testing-playwright-e2e"
450
+ ]);
451
+ });
452
+ it("should toggle skill scope between project and global", () => {
453
+ const store = useWizardStore.getState();
454
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
455
+ store.toggleSkillScope("web-framework-react");
456
+ const { skillConfigs } = useWizardStore.getState();
457
+ globalExpect(skillConfigs[0].scope).toBe("global");
458
+ });
459
+ it("should toggle skill scope back to project", () => {
460
+ const store = useWizardStore.getState();
461
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
462
+ store.toggleSkillScope("web-framework-react");
463
+ store.toggleSkillScope("web-framework-react");
464
+ const { skillConfigs } = useWizardStore.getState();
465
+ globalExpect(skillConfigs[0].scope).toBe("project");
466
+ });
467
+ it("should update source via setSkillSource", () => {
468
+ const store = useWizardStore.getState();
469
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
470
+ store.setSkillSource("web-framework-react", "local");
471
+ const { skillConfigs } = useWizardStore.getState();
472
+ globalExpect(skillConfigs[0].source).toBe("local");
473
+ });
474
+ it("should set and clear focusedSkillId", () => {
475
+ const store = useWizardStore.getState();
476
+ store.setFocusedSkillId("web-framework-react");
477
+ globalExpect(useWizardStore.getState().focusedSkillId).toBe("web-framework-react");
478
+ store.setFocusedSkillId(null);
479
+ globalExpect(useWizardStore.getState().focusedSkillId).toBeNull();
480
+ });
481
+ it("should update source via setSourceSelection on skillConfigs", () => {
482
+ const store = useWizardStore.getState();
483
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
484
+ store.setSourceSelection("web-framework-react", "local");
485
+ const { skillConfigs } = useWizardStore.getState();
486
+ globalExpect(skillConfigs[0].source).toBe("local");
487
+ });
488
+ it("should populate skillConfigs from populateFromStack", () => {
489
+ const store = useWizardStore.getState();
490
+ const stack = {
491
+ agents: {
492
+ web: {
493
+ "web-framework": [sa("web-framework-react", true)],
494
+ "web-client-state": [sa("web-state-zustand")]
495
+ }
496
+ }
497
+ };
498
+ const categories = {
499
+ "web-framework": { domain: "web" },
500
+ "web-client-state": { domain: "web" }
501
+ };
502
+ store.populateFromStack(stack, categories);
503
+ const { skillConfigs } = useWizardStore.getState();
504
+ globalExpect(skillConfigs).toHaveLength(2);
505
+ globalExpect(skillConfigs.map((sc) => sc.id)).toEqual(["web-framework-react", "web-state-zustand"]);
506
+ globalExpect(skillConfigs.every((sc) => sc.scope === "project")).toBe(true);
507
+ globalExpect(skillConfigs.every((sc) => sc.source === "agents-inc")).toBe(true);
508
+ });
509
+ it("should populate skillConfigs from populateFromSkillIds", () => {
510
+ const store = useWizardStore.getState();
511
+ const skills = {
512
+ "web-framework-react": TEST_SKILLS.react,
513
+ "api-framework-hono": TEST_SKILLS.hono
514
+ };
515
+ const categories = {
516
+ "web-framework": TEST_CATEGORIES.framework,
517
+ "api-api": TEST_CATEGORIES.api
518
+ };
519
+ store.populateFromSkillIds(["web-framework-react", "api-framework-hono"], skills, categories);
520
+ const { skillConfigs } = useWizardStore.getState();
521
+ globalExpect(skillConfigs).toHaveLength(2);
522
+ globalExpect(skillConfigs.map((sc) => sc.id)).toEqual([
523
+ "web-framework-react",
524
+ "api-framework-hono"
525
+ ]);
526
+ });
527
+ it("should remove skillConfigs when domain is deselected", () => {
528
+ const store = useWizardStore.getState();
529
+ store.toggleDomain("web");
530
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
531
+ globalExpect(useWizardStore.getState().skillConfigs).toHaveLength(1);
532
+ store.toggleDomain("web");
533
+ globalExpect(useWizardStore.getState().skillConfigs).toHaveLength(0);
534
+ });
535
+ it("should restore skillConfigs when domain is re-toggled after populateFromStack", () => {
536
+ const store = useWizardStore.getState();
537
+ const stack = {
538
+ agents: {
539
+ web: { "web-framework": [sa("web-framework-react", true)] }
540
+ }
541
+ };
542
+ const categories = {
543
+ "web-framework": { domain: "web" }
544
+ };
545
+ store.populateFromStack(stack, categories);
546
+ globalExpect(useWizardStore.getState().skillConfigs).toHaveLength(1);
547
+ store.toggleDomain("web");
548
+ globalExpect(useWizardStore.getState().skillConfigs).toHaveLength(0);
549
+ store.toggleDomain("web");
550
+ globalExpect(useWizardStore.getState().skillConfigs).toHaveLength(1);
551
+ globalExpect(useWizardStore.getState().skillConfigs[0].id).toBe("web-framework-react");
552
+ });
553
+ it("should reset skillConfigs and focusedSkillId on reset", () => {
554
+ const store = useWizardStore.getState();
555
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
556
+ store.setFocusedSkillId("web-framework-react");
557
+ store.reset();
558
+ const state = useWizardStore.getState();
559
+ globalExpect(state.skillConfigs).toEqual([]);
560
+ globalExpect(state.focusedSkillId).toBeNull();
561
+ });
562
+ it("should set all sources to local via setAllSourcesLocal", () => {
563
+ const store = useWizardStore.getState();
564
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
565
+ store.toggleTechnology("api", "api-api", "api-framework-hono", true);
566
+ store.setAllSourcesLocal();
567
+ const { skillConfigs } = useWizardStore.getState();
568
+ globalExpect(skillConfigs.every((sc) => sc.source === "local")).toBe(true);
569
+ });
570
+ it("should set all sources to plugin via setAllSourcesPlugin", () => {
571
+ const store = useWizardStore.getState();
572
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
573
+ store.setSourceSelection("web-framework-react", "local");
574
+ const matrix = createMockMatrix({
575
+ "web-framework-react": {
576
+ ...getTestSkill("react"),
577
+ availableSources: [{ name: "Acme Corp", type: "private", installed: false }]
578
+ }
579
+ });
580
+ store.setAllSourcesPlugin(matrix);
581
+ const { skillConfigs } = useWizardStore.getState();
582
+ globalExpect(skillConfigs[0].source).toBe("Acme Corp");
442
583
  });
443
584
  });
444
585
  describe("computed getters", () => {
@@ -474,7 +615,7 @@ describe("WizardStore", () => {
474
615
  const perDomain = store.getSelectedTechnologiesPerDomain();
475
616
  globalExpect(perDomain).toEqual({});
476
617
  });
477
- it("should omit domains with empty subcategory arrays from getSelectedTechnologiesPerDomain", () => {
618
+ it("should omit domains with empty category arrays from getSelectedTechnologiesPerDomain", () => {
478
619
  const store = useWizardStore.getState();
479
620
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
480
621
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
@@ -540,7 +681,6 @@ describe("WizardStore", () => {
540
681
  globalExpect(state.approach).toBeNull();
541
682
  globalExpect(state.selectedStackId).toBeNull();
542
683
  globalExpect(state.selectedDomains).toEqual([]);
543
- globalExpect(state.installMode).toBe("local");
544
684
  globalExpect(state.history).toEqual([]);
545
685
  });
546
686
  });
@@ -598,7 +738,7 @@ describe("WizardStore", () => {
598
738
  const { domainSelections } = useWizardStore.getState();
599
739
  globalExpect(typedKeys(domainSelections)).toHaveLength(0);
600
740
  });
601
- it("should populate multiple skills from array-valued subcategories", () => {
741
+ it("should populate multiple skills from array-valued categories", () => {
602
742
  const store = useWizardStore.getState();
603
743
  const stack = {
604
744
  agents: {
@@ -754,7 +894,7 @@ describe("WizardStore", () => {
754
894
  const skill = {
755
895
  ...getTestSkill("react"),
756
896
  availableSources: [
757
- makeSource({ name: "Agents Inc", type: "public" }),
897
+ makeSource({ name: "agents-inc", type: "public" }),
758
898
  makeSource({ name: "Acme Corp", type: "private", primary: true })
759
899
  ]
760
900
  };
@@ -762,8 +902,9 @@ describe("WizardStore", () => {
762
902
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
763
903
  const rows = store.buildSourceRows(matrix);
764
904
  globalExpect(rows).toHaveLength(1);
765
- globalExpect(rows[0].options[0].id).toBe("Acme Corp");
766
- globalExpect(rows[0].options[1].id).toBe("Agents Inc");
905
+ globalExpect(rows[0].options[0].id).toBe("local");
906
+ globalExpect(rows[0].options[1].id).toBe("Acme Corp");
907
+ globalExpect(rows[0].options[2].id).toBe("agents-inc");
767
908
  });
768
909
  it("should sort default public marketplace before third-party sources", () => {
769
910
  const store = useWizardStore.getState();
@@ -771,15 +912,16 @@ describe("WizardStore", () => {
771
912
  ...getTestSkill("react"),
772
913
  availableSources: [
773
914
  makeSource({ name: "Extra Corp", type: "private" }),
774
- makeSource({ name: "Agents Inc", type: "public" })
915
+ makeSource({ name: "agents-inc", type: "public" })
775
916
  ]
776
917
  };
777
918
  const matrix = createMockMatrix({ "web-framework-react": skill });
778
919
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
779
920
  const rows = store.buildSourceRows(matrix);
780
921
  globalExpect(rows).toHaveLength(1);
781
- globalExpect(rows[0].options[0].id).toBe("Agents Inc");
782
- globalExpect(rows[0].options[1].id).toBe("Extra Corp");
922
+ globalExpect(rows[0].options[0].id).toBe("local");
923
+ globalExpect(rows[0].options[1].id).toBe("agents-inc");
924
+ globalExpect(rows[0].options[2].id).toBe("Extra Corp");
783
925
  });
784
926
  it("should sort all four tiers in correct order", () => {
785
927
  const store = useWizardStore.getState();
@@ -787,7 +929,7 @@ describe("WizardStore", () => {
787
929
  ...getTestSkill("react"),
788
930
  availableSources: [
789
931
  makeSource({ name: "Extra Corp", type: "private" }),
790
- makeSource({ name: "Agents Inc", type: "public" }),
932
+ makeSource({ name: "agents-inc", type: "public" }),
791
933
  makeSource({ name: "Acme Corp", type: "private", primary: true }),
792
934
  makeSource({ name: "local", type: "local", installed: true, installMode: "local" })
793
935
  ]
@@ -797,7 +939,7 @@ describe("WizardStore", () => {
797
939
  const rows = store.buildSourceRows(matrix);
798
940
  globalExpect(rows).toHaveLength(1);
799
941
  const sourceNames = rows[0].options.map((opt) => opt.id);
800
- globalExpect(sourceNames).toEqual(["local", "Acme Corp", "Agents Inc", "Extra Corp"]);
942
+ globalExpect(sourceNames).toEqual(["local", "Acme Corp", "agents-inc", "Extra Corp"]);
801
943
  });
802
944
  });
803
945
  describe("agent selection", () => {
@@ -834,6 +976,59 @@ describe("WizardStore", () => {
834
976
  globalExpect(selectedAgents).toEqual([]);
835
977
  });
836
978
  });
979
+ describe("agentConfigs and scope management", () => {
980
+ it("should have empty agentConfigs initially", () => {
981
+ const { agentConfigs } = useWizardStore.getState();
982
+ globalExpect(agentConfigs).toEqual([]);
983
+ });
984
+ it("should sync agentConfigs when toggleAgent is called", () => {
985
+ const store = useWizardStore.getState();
986
+ store.toggleAgent("web-developer");
987
+ const { agentConfigs } = useWizardStore.getState();
988
+ globalExpect(agentConfigs).toEqual([{ name: "web-developer", scope: "project" }]);
989
+ });
990
+ it("should remove from agentConfigs when agent is toggled off", () => {
991
+ const store = useWizardStore.getState();
992
+ store.toggleAgent("web-developer");
993
+ store.toggleAgent("web-developer");
994
+ const { agentConfigs } = useWizardStore.getState();
995
+ globalExpect(agentConfigs).toEqual([]);
996
+ });
997
+ it("should toggle agent scope between project and global", () => {
998
+ const store = useWizardStore.getState();
999
+ store.toggleAgent("web-developer");
1000
+ store.toggleAgentScope("web-developer");
1001
+ const { agentConfigs } = useWizardStore.getState();
1002
+ globalExpect(agentConfigs).toEqual([{ name: "web-developer", scope: "global" }]);
1003
+ store.toggleAgentScope("web-developer");
1004
+ globalExpect(useWizardStore.getState().agentConfigs).toEqual([
1005
+ { name: "web-developer", scope: "project" }
1006
+ ]);
1007
+ });
1008
+ it("should set and clear focusedAgentId", () => {
1009
+ const store = useWizardStore.getState();
1010
+ store.setFocusedAgentId("web-developer");
1011
+ globalExpect(useWizardStore.getState().focusedAgentId).toBe("web-developer");
1012
+ store.setFocusedAgentId(null);
1013
+ globalExpect(useWizardStore.getState().focusedAgentId).toBeNull();
1014
+ });
1015
+ it("should not toggle locked agents", () => {
1016
+ useWizardStore.setState({ lockedAgentNames: ["web-developer"] });
1017
+ const store = useWizardStore.getState();
1018
+ store.toggleAgent("web-developer");
1019
+ const { selectedAgents, agentConfigs } = useWizardStore.getState();
1020
+ globalExpect(selectedAgents).toEqual([]);
1021
+ globalExpect(agentConfigs).toEqual([]);
1022
+ });
1023
+ it("should not toggle scope of locked agents", () => {
1024
+ const store = useWizardStore.getState();
1025
+ store.toggleAgent("web-developer");
1026
+ useWizardStore.setState({ lockedAgentNames: ["web-developer"] });
1027
+ store.toggleAgentScope("web-developer");
1028
+ const { agentConfigs } = useWizardStore.getState();
1029
+ globalExpect(agentConfigs).toEqual([{ name: "web-developer", scope: "project" }]);
1030
+ });
1031
+ });
837
1032
  describe("preselectAgentsFromDomains", () => {
838
1033
  it("should preselect web-related agents when web domain is selected", () => {
839
1034
  const store = useWizardStore.getState();
@@ -959,5 +1154,50 @@ describe("WizardStore", () => {
959
1154
  globalExpect(skippedSteps).toContain("sources");
960
1155
  });
961
1156
  });
1157
+ describe("deriveInstallMode", () => {
1158
+ it("should return 'plugin' when all skills have default marketplace source", () => {
1159
+ const store = useWizardStore.getState();
1160
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
1161
+ store.toggleTechnology("web", "web-styling", "web-styling-scss-modules", true);
1162
+ const result = store.deriveInstallMode();
1163
+ globalExpect(result).toBe("plugin");
1164
+ });
1165
+ it("should return 'local' when all skills are set to local", () => {
1166
+ const store = useWizardStore.getState();
1167
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
1168
+ store.toggleTechnology("api", "api-api", "api-framework-hono", true);
1169
+ store.setSourceSelection("web-framework-react", "local");
1170
+ store.setSourceSelection("api-framework-hono", "local");
1171
+ const result = store.deriveInstallMode();
1172
+ globalExpect(result).toBe("local");
1173
+ });
1174
+ it("should return 'mixed' when some skills are local and some are not", () => {
1175
+ const store = useWizardStore.getState();
1176
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
1177
+ store.toggleTechnology("api", "api-api", "api-framework-hono", true);
1178
+ store.setSourceSelection("web-framework-react", "local");
1179
+ store.setSourceSelection("api-framework-hono", "agents-inc");
1180
+ const result = store.deriveInstallMode();
1181
+ globalExpect(result).toBe("mixed");
1182
+ });
1183
+ it("should return 'local' when no skills are configured", () => {
1184
+ const store = useWizardStore.getState();
1185
+ const result = store.deriveInstallMode();
1186
+ globalExpect(result).toBe("local");
1187
+ });
1188
+ it("should handle single skill as local", () => {
1189
+ const store = useWizardStore.getState();
1190
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
1191
+ store.setSourceSelection("web-framework-react", "local");
1192
+ const result = store.deriveInstallMode();
1193
+ globalExpect(result).toBe("local");
1194
+ });
1195
+ it("should handle single skill as plugin", () => {
1196
+ const store = useWizardStore.getState();
1197
+ store.toggleTechnology("web", "web-framework", "web-framework-react", true);
1198
+ const result = store.deriveInstallMode();
1199
+ globalExpect(result).toBe("plugin");
1200
+ });
1201
+ });
962
1202
  });
963
1203
  //# sourceMappingURL=wizard-store.test.js.map