@agents-inc/cli 0.72.0 → 0.74.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 (174) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/{chunk-ZEJIEC2A.js → chunk-4CRWKTNQ.js} +66 -261
  3. package/dist/chunk-4CRWKTNQ.js.map +1 -0
  4. package/dist/{chunk-V2XIWRHP.js → chunk-ANUYSHQA.js} +6 -7
  5. package/dist/chunk-ANUYSHQA.js.map +1 -0
  6. package/dist/{chunk-URAXGHF2.js → chunk-B7KVPY3Z.js} +20 -15
  7. package/dist/chunk-B7KVPY3Z.js.map +1 -0
  8. package/dist/{chunk-ZYUASJUN.js → chunk-BH4LN7XV.js} +8 -6
  9. package/dist/chunk-BH4LN7XV.js.map +1 -0
  10. package/dist/{chunk-J4TVAB5H.js → chunk-BM5Y6LIC.js} +2 -2
  11. package/dist/{chunk-6YMW4HMX.js → chunk-DNPJ5GUK.js} +6 -6
  12. package/dist/chunk-DNPJ5GUK.js.map +1 -0
  13. package/dist/chunk-E74Q7GUE.js +5132 -0
  14. package/dist/chunk-E74Q7GUE.js.map +1 -0
  15. package/dist/chunk-EMX7PA2I.js +39 -0
  16. package/dist/chunk-EMX7PA2I.js.map +1 -0
  17. package/dist/chunk-GDUOOT3J.js +689 -0
  18. package/dist/chunk-GDUOOT3J.js.map +1 -0
  19. package/dist/{chunk-MGQVO357.js → chunk-IJLAVOKZ.js} +2 -2
  20. package/dist/chunk-IJLAVOKZ.js.map +1 -0
  21. package/dist/{chunk-G3LNIYZG.js → chunk-J5T7M2CS.js} +2 -2
  22. package/dist/{chunk-FKRYJOPC.js → chunk-J6SHWAS6.js} +5 -5
  23. package/dist/chunk-J6SHWAS6.js.map +1 -0
  24. package/dist/{chunk-RJOLQ7EK.js → chunk-JWZLVWTX.js} +4 -4
  25. package/dist/{chunk-CKPJTMNC.js → chunk-KSMT5FVM.js} +4 -4
  26. package/dist/chunk-KSMT5FVM.js.map +1 -0
  27. package/dist/{chunk-OODTDGEM.js → chunk-KTF5RKKP.js} +6 -6
  28. package/dist/{chunk-SEAL43IR.js → chunk-NTVY4G35.js} +3 -3
  29. package/dist/{chunk-52THXN5G.js → chunk-NUJHWYCR.js} +2 -2
  30. package/dist/{chunk-HJVWBSLM.js → chunk-QJUPZPXO.js} +4 -4
  31. package/dist/chunk-QJUPZPXO.js.map +1 -0
  32. package/dist/{chunk-F43WGOGN.js → chunk-RRBWNEG3.js} +2 -2
  33. package/dist/chunk-RRBWNEG3.js.map +1 -0
  34. package/dist/chunk-SRIH4U5Y.js +159 -0
  35. package/dist/chunk-SRIH4U5Y.js.map +1 -0
  36. package/dist/{chunk-Q3YMO5YG.js → chunk-TNSVPZHP.js} +20 -2
  37. package/dist/chunk-TNSVPZHP.js.map +1 -0
  38. package/dist/{chunk-UQTG4ZBA.js → chunk-UFAP6GHD.js} +18 -20
  39. package/dist/chunk-UFAP6GHD.js.map +1 -0
  40. package/dist/{chunk-WWHDP5CP.js → chunk-V5HR77EY.js} +94 -13
  41. package/dist/chunk-V5HR77EY.js.map +1 -0
  42. package/dist/{chunk-ZFRALAK5.js → chunk-VOYGRNLS.js} +4 -5
  43. package/dist/chunk-VOYGRNLS.js.map +1 -0
  44. package/dist/{chunk-LM5YQUBR.js → chunk-WQRFVEAA.js} +6 -6
  45. package/dist/{chunk-LBTW5HSY.js → chunk-XP7BXHFG.js} +11 -11
  46. package/dist/chunk-XP7BXHFG.js.map +1 -0
  47. package/dist/{chunk-AHZ34QVK.js → chunk-ZCJ4YYWL.js} +40 -35
  48. package/dist/chunk-ZCJ4YYWL.js.map +1 -0
  49. package/dist/{chunk-HMJGSAKV.js → chunk-ZLMKEYDF.js} +2514 -2687
  50. package/dist/chunk-ZLMKEYDF.js.map +1 -0
  51. package/dist/{chunk-3SLO2QPW.js → chunk-ZO7C5WMJ.js} +12 -14
  52. package/dist/chunk-ZO7C5WMJ.js.map +1 -0
  53. package/dist/commands/build/marketplace.js +4 -3
  54. package/dist/commands/build/marketplace.js.map +1 -1
  55. package/dist/commands/build/plugins.js +8 -7
  56. package/dist/commands/build/plugins.js.map +1 -1
  57. package/dist/commands/build/stack.js +8 -7
  58. package/dist/commands/build/stack.js.map +1 -1
  59. package/dist/commands/compile.js +13 -9
  60. package/dist/commands/compile.js.map +1 -1
  61. package/dist/commands/config/index.js +8 -7
  62. package/dist/commands/config/index.js.map +1 -1
  63. package/dist/commands/config/path.js +7 -6
  64. package/dist/commands/config/path.js.map +1 -1
  65. package/dist/commands/config/show.js +8 -7
  66. package/dist/commands/diff.js +7 -6
  67. package/dist/commands/diff.js.map +1 -1
  68. package/dist/commands/doctor.js +12 -13
  69. package/dist/commands/doctor.js.map +1 -1
  70. package/dist/commands/edit.js +32 -36
  71. package/dist/commands/edit.js.map +1 -1
  72. package/dist/commands/eject.js +15 -13
  73. package/dist/commands/eject.js.map +1 -1
  74. package/dist/commands/import/skill.js +7 -6
  75. package/dist/commands/import/skill.js.map +1 -1
  76. package/dist/commands/info.js +11 -10
  77. package/dist/commands/info.js.map +1 -1
  78. package/dist/commands/init.js +27 -26
  79. package/dist/commands/list.js +7 -6
  80. package/dist/commands/list.js.map +1 -1
  81. package/dist/commands/new/agent.js +8 -7
  82. package/dist/commands/new/agent.js.map +1 -1
  83. package/dist/commands/new/marketplace.js +11 -14
  84. package/dist/commands/new/marketplace.js.map +1 -1
  85. package/dist/commands/new/skill.js +8 -7
  86. package/dist/commands/outdated.js +7 -6
  87. package/dist/commands/outdated.js.map +1 -1
  88. package/dist/commands/search.js +8 -9
  89. package/dist/commands/search.js.map +1 -1
  90. package/dist/commands/uninstall.js +10 -7
  91. package/dist/commands/uninstall.js.map +1 -1
  92. package/dist/commands/update.js +9 -9
  93. package/dist/commands/update.js.map +1 -1
  94. package/dist/commands/validate.js +15 -17
  95. package/dist/commands/validate.js.map +1 -1
  96. package/dist/components/wizard/category-grid.js +2 -2
  97. package/dist/components/wizard/category-grid.test.js +16 -65
  98. package/dist/components/wizard/category-grid.test.js.map +1 -1
  99. package/dist/components/wizard/domain-selection.js +9 -8
  100. package/dist/components/wizard/source-grid.js +4 -4
  101. package/dist/components/wizard/source-grid.test.js +18 -16
  102. package/dist/components/wizard/source-grid.test.js.map +1 -1
  103. package/dist/components/wizard/stack-selection.js +8 -7
  104. package/dist/components/wizard/step-agents.js +9 -8
  105. package/dist/components/wizard/step-agents.test.js +14 -13
  106. package/dist/components/wizard/step-agents.test.js.map +1 -1
  107. package/dist/components/wizard/step-build.js +10 -9
  108. package/dist/components/wizard/step-build.test.js +16 -15
  109. package/dist/components/wizard/step-build.test.js.map +1 -1
  110. package/dist/components/wizard/step-confirm.js +5 -4
  111. package/dist/components/wizard/step-confirm.test.js +10 -9
  112. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  113. package/dist/components/wizard/step-settings.js +8 -7
  114. package/dist/components/wizard/step-settings.test.js +11 -10
  115. package/dist/components/wizard/step-settings.test.js.map +1 -1
  116. package/dist/components/wizard/step-sources.js +13 -12
  117. package/dist/components/wizard/step-sources.test.js +18 -17
  118. package/dist/components/wizard/step-sources.test.js.map +1 -1
  119. package/dist/components/wizard/step-stack.js +11 -10
  120. package/dist/components/wizard/step-stack.test.js +15 -14
  121. package/dist/components/wizard/step-stack.test.js.map +1 -1
  122. package/dist/components/wizard/wizard-layout.js +8 -7
  123. package/dist/components/wizard/wizard.js +25 -24
  124. package/dist/hooks/init.js +27 -26
  125. package/dist/hooks/init.js.map +1 -1
  126. package/dist/{loader-KVKSTKWX.js → loader-NHUCFMFQ.js} +4 -3
  127. package/dist/{source-loader-65IAJPNV.js → source-loader-RTG42MWG.js} +7 -6
  128. package/dist/source-manager-NCOFHYHD.js +20 -0
  129. package/dist/stores/wizard-store.js +7 -6
  130. package/dist/stores/wizard-store.test.js +29 -28
  131. package/dist/stores/wizard-store.test.js.map +1 -1
  132. package/package.json +1 -1
  133. package/src/schemas/custom-metadata.schema.json +81 -0
  134. package/src/schemas/metadata.schema.json +127 -41
  135. package/src/schemas/stacks.schema.json +3 -45
  136. package/dist/chunk-3SLO2QPW.js.map +0 -1
  137. package/dist/chunk-6YMW4HMX.js.map +0 -1
  138. package/dist/chunk-AHZ34QVK.js.map +0 -1
  139. package/dist/chunk-BKL3DF2Q.js +0 -45
  140. package/dist/chunk-BKL3DF2Q.js.map +0 -1
  141. package/dist/chunk-CKPJTMNC.js.map +0 -1
  142. package/dist/chunk-D7FEORKC.js +0 -253
  143. package/dist/chunk-D7FEORKC.js.map +0 -1
  144. package/dist/chunk-F43WGOGN.js.map +0 -1
  145. package/dist/chunk-FKRYJOPC.js.map +0 -1
  146. package/dist/chunk-HJVWBSLM.js.map +0 -1
  147. package/dist/chunk-HMJGSAKV.js.map +0 -1
  148. package/dist/chunk-LBTW5HSY.js.map +0 -1
  149. package/dist/chunk-MGQVO357.js.map +0 -1
  150. package/dist/chunk-Q3YMO5YG.js.map +0 -1
  151. package/dist/chunk-T4EXUIBY.js +0 -19
  152. package/dist/chunk-T4EXUIBY.js.map +0 -1
  153. package/dist/chunk-UQTG4ZBA.js.map +0 -1
  154. package/dist/chunk-URAXGHF2.js.map +0 -1
  155. package/dist/chunk-V2XIWRHP.js.map +0 -1
  156. package/dist/chunk-WWHDP5CP.js.map +0 -1
  157. package/dist/chunk-ZEJIEC2A.js.map +0 -1
  158. package/dist/chunk-ZFRALAK5.js.map +0 -1
  159. package/dist/chunk-ZYUASJUN.js.map +0 -1
  160. package/dist/source-manager-LJH225GA.js +0 -19
  161. package/dist/stores/matrix-store.js +0 -15
  162. package/dist/stores/matrix-store.js.map +0 -1
  163. package/dist/stores/matrix-store.test.js +0 -127
  164. package/dist/stores/matrix-store.test.js.map +0 -1
  165. /package/dist/{chunk-J4TVAB5H.js.map → chunk-BM5Y6LIC.js.map} +0 -0
  166. /package/dist/{chunk-G3LNIYZG.js.map → chunk-J5T7M2CS.js.map} +0 -0
  167. /package/dist/{chunk-RJOLQ7EK.js.map → chunk-JWZLVWTX.js.map} +0 -0
  168. /package/dist/{chunk-OODTDGEM.js.map → chunk-KTF5RKKP.js.map} +0 -0
  169. /package/dist/{chunk-SEAL43IR.js.map → chunk-NTVY4G35.js.map} +0 -0
  170. /package/dist/{chunk-52THXN5G.js.map → chunk-NUJHWYCR.js.map} +0 -0
  171. /package/dist/{chunk-LM5YQUBR.js.map → chunk-WQRFVEAA.js.map} +0 -0
  172. /package/dist/{loader-KVKSTKWX.js.map → loader-NHUCFMFQ.js.map} +0 -0
  173. /package/dist/{source-loader-65IAJPNV.js.map → source-loader-RTG42MWG.js.map} +0 -0
  174. /package/dist/{source-manager-LJH225GA.js.map → source-manager-NCOFHYHD.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/components/wizard/step-stack.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepStack } from \"./step-stack\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { useMatrixStore } from \"../../stores/matrix-store\";\nimport { createMockMatrix, createMockResolvedStack, SKILLS } from \"../../lib/__tests__/helpers\";\nimport { TEST_CATEGORIES } from \"../../lib/__tests__/test-fixtures\";\n\nimport type { MergedSkillsMatrix } from \"../../types\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n SELECT_NAV_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createMockStackWithSkills = (): MergedSkillsMatrix => {\n const suggestedStacks = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n description: \"Full React stack with Zustand and Hono\",\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"react-minimal\", \"React Minimal\", {\n allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.hono, {\n suggestedStacks,\n categories: {\n \"web-framework\": { ...TEST_CATEGORIES.framework, domain: \"web\" as const, exclusive: false },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\" as const, exclusive: false, order: 1 },\n \"cli-framework\": {\n ...TEST_CATEGORIES.cliFramework,\n domain: \"cli\" as const,\n exclusive: false,\n order: 2,\n },\n \"mobile-framework\": {\n ...TEST_CATEGORIES.mobileFramework,\n domain: \"mobile\" as const,\n exclusive: false,\n order: 3,\n },\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n mockMatrix = createMockStackWithSkills();\n useMatrixStore.getState().setMatrix(mockMatrix);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"unified stack/scratch selection (initial view)\", () => {\n describe(\"rendering\", () => {\n it(\"should render stack options and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"React Minimal\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should render focused stack description (only focused item shows description)\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render ViewTitle for stack selection\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n });\n\n it(\"should render divider between stacks and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should select first stack on Enter and show domain selection\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"scratch selection\", () => {\n it(\"should show domain selection when scratch is selected\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n expect(selectedStackId).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should pre-select domains except CLI when scratch is chosen\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n expect(selectedDomains).toContain(\"mobile\");\n expect(selectedDomains).not.toContain(\"cli\");\n });\n });\n\n describe(\"cancel navigation\", () => {\n it(\"should call onCancel when pressing Escape at initial view\", async () => {\n const onCancel = vi.fn();\n const { stdin, unmount } = render(<StepStack onCancel={onCancel} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down to second stack card\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should navigate down then up back to first stack\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at top boundary\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at bottom boundary (scratch is last)\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should still show scratch option with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n useMatrixStore.getState().setMatrix(emptyMatrix);\n\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n expect(output).toContain(\"Start from scratch\");\n });\n });\n });\n\n describe(\"domain selection mode (after stack/scratch choice)\", () => {\n beforeEach(() => {\n useWizardStore.getState().setApproach(\"scratch\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render domain options\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n });\n\n it(\"should render header text for domain selection\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should show domain descriptions\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Only the focused item (Web, first in list) shows its description\n expect(output).toContain(\"Frontend web applications\");\n });\n });\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain when selected\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default, toggle with space\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(useWizardStore.getState().selectedDomains).toContain(\"web\");\n\n useWizardStore.getState().toggleDomain(\"api\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n });\n\n it(\"should show selected domains summary when domains selected\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"web\");\n });\n\n it(\"should navigate to build step when continuing\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate to continue option (after 4 domains)\n for (let i = 0; i < 4; i++) {\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n }\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should return to stack/scratch selection when pressing ESC\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/cli/components/wizard/step-stack.test.tsx"],"sourcesContent":["import { render } from \"ink-testing-library\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { StepStack } from \"./step-stack\";\nimport { useWizardStore } from \"../../stores/wizard-store\";\nimport { initializeMatrix } from \"../../lib/matrix/matrix-provider\";\nimport { createMockMatrix, createMockResolvedStack, SKILLS } from \"../../lib/__tests__/helpers\";\nimport { TEST_CATEGORIES } from \"../../lib/__tests__/test-fixtures\";\n\nimport type { MergedSkillsMatrix } from \"../../types\";\nimport {\n ARROW_DOWN,\n ARROW_UP,\n ENTER,\n ESCAPE,\n RENDER_DELAY_MS,\n SELECT_NAV_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createMockStackWithSkills = (): MergedSkillsMatrix => {\n const suggestedStacks = [\n createMockResolvedStack(\"react-fullstack\", \"React Fullstack\", {\n description: \"Full React stack with Zustand and Hono\",\n allSkillIds: [\"web-framework-react\", \"web-state-zustand\", \"api-framework-hono\"],\n }),\n createMockResolvedStack(\"react-minimal\", \"React Minimal\", {\n allSkillIds: [\"web-framework-react\"],\n }),\n ];\n\n return createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.hono, {\n suggestedStacks,\n categories: {\n \"web-framework\": { ...TEST_CATEGORIES.framework, domain: \"web\" as const, exclusive: false },\n \"api-api\": { ...TEST_CATEGORIES.api, domain: \"api\" as const, exclusive: false, order: 1 },\n \"cli-framework\": {\n ...TEST_CATEGORIES.cliFramework,\n domain: \"cli\" as const,\n exclusive: false,\n order: 2,\n },\n \"mobile-framework\": {\n ...TEST_CATEGORIES.mobileFramework,\n domain: \"mobile\" as const,\n exclusive: false,\n order: 3,\n },\n },\n });\n};\n\ndescribe(\"StepStack component\", () => {\n let cleanup: (() => void) | undefined;\n let mockMatrix: MergedSkillsMatrix;\n\n beforeEach(() => {\n mockMatrix = createMockStackWithSkills();\n initializeMatrix(mockMatrix);\n });\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"unified stack/scratch selection (initial view)\", () => {\n describe(\"rendering\", () => {\n it(\"should render stack options and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"React Fullstack\");\n expect(output).toContain(\"React Minimal\");\n expect(output).toContain(\"Start from scratch\");\n });\n\n it(\"should render focused stack description (only focused item shows description)\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Full React stack\");\n });\n\n it(\"should render ViewTitle for stack selection\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n });\n\n it(\"should render divider between stacks and scratch option\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"\\u2500\");\n });\n });\n\n describe(\"stack selection\", () => {\n it(\"should select first stack on Enter and show domain selection\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"stack\");\n expect(selectedStackId).toBe(\"react-fullstack\");\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should select second stack when navigated to\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n });\n\n describe(\"scratch selection\", () => {\n it(\"should show domain selection when scratch is selected\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach, selectedStackId } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n expect(selectedStackId).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should pre-select domains except CLI when scratch is chosen\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n expect(selectedDomains).toContain(\"mobile\");\n expect(selectedDomains).not.toContain(\"cli\");\n });\n });\n\n describe(\"cancel navigation\", () => {\n it(\"should call onCancel when pressing Escape at initial view\", async () => {\n const onCancel = vi.fn();\n const { stdin, unmount } = render(<StepStack onCancel={onCancel} />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"arrow key navigation\", () => {\n it(\"should navigate down to second stack card\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-minimal\");\n });\n\n it(\"should navigate down then up back to first stack\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at top boundary\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedStackId } = useWizardStore.getState();\n expect(selectedStackId).toBe(\"react-fullstack\");\n });\n\n it(\"should clamp at bottom boundary (scratch is last)\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBe(\"scratch\");\n });\n });\n\n describe(\"empty state\", () => {\n it(\"should still show scratch option with no stacks available\", () => {\n const emptyMatrix = createMockMatrix({}, { suggestedStacks: [] });\n initializeMatrix(emptyMatrix);\n\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n expect(output).toContain(\"Start from scratch\");\n });\n });\n });\n\n describe(\"domain selection mode (after stack/scratch choice)\", () => {\n beforeEach(() => {\n useWizardStore.getState().setApproach(\"scratch\");\n });\n\n describe(\"rendering\", () => {\n it(\"should render domain options\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Web\");\n expect(output).toContain(\"API\");\n expect(output).toContain(\"CLI\");\n });\n\n it(\"should render header text for domain selection\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Select domains to configure\");\n });\n\n it(\"should show domain descriptions\", () => {\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n // Only the focused item (Web, first in list) shows its description\n expect(output).toContain(\"Frontend web applications\");\n });\n });\n\n describe(\"domain selection\", () => {\n it(\"should toggle domain when selected\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default, toggle with space\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n });\n\n it(\"should allow multiple domain selection\", async () => {\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // First domain (Web) is focused by default\n stdin.write(\" \");\n await delay(SELECT_NAV_DELAY_MS);\n\n expect(useWizardStore.getState().selectedDomains).toContain(\"web\");\n\n useWizardStore.getState().toggleDomain(\"api\");\n\n const { selectedDomains } = useWizardStore.getState();\n expect(selectedDomains).toContain(\"web\");\n expect(selectedDomains).toContain(\"api\");\n });\n\n it(\"should show selected domains summary when domains selected\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Selected:\");\n expect(output).toContain(\"web\");\n });\n\n it(\"should navigate to build step when continuing\", async () => {\n useWizardStore.getState().toggleDomain(\"web\");\n\n const { stdin, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n // Navigate to continue option (after 4 domains)\n for (let i = 0; i < 4; i++) {\n stdin.write(ARROW_DOWN);\n await delay(SELECT_NAV_DELAY_MS);\n }\n stdin.write(ENTER);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { step } = useWizardStore.getState();\n expect(step).toBe(\"build\");\n });\n });\n\n describe(\"back navigation\", () => {\n it(\"should return to stack/scratch selection when pressing ESC\", async () => {\n const { stdin, lastFrame, unmount } = render(<StepStack />);\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n stdin.write(ESCAPE);\n await delay(SELECT_NAV_DELAY_MS);\n\n const { approach } = useWizardStore.getState();\n expect(approach).toBeNull();\n\n const output = lastFrame();\n expect(output).toContain(\"Choose a stack\");\n });\n });\n });\n});\n"],"mappings":"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","names":[]}
@@ -1,17 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  WizardLayout
4
- } from "../../chunk-G3LNIYZG.js";
4
+ } from "../../chunk-J5T7M2CS.js";
5
5
  import "../../chunk-SXGBPQY6.js";
6
6
  import "../../chunk-HGTC76BX.js";
7
7
  import "../../chunk-KYULKBFC.js";
8
- import "../../chunk-URAXGHF2.js";
8
+ import "../../chunk-B7KVPY3Z.js";
9
9
  import "../../chunk-6VIOO74O.js";
10
- import "../../chunk-HMJGSAKV.js";
11
- import "../../chunk-F43WGOGN.js";
12
- import "../../chunk-T4EXUIBY.js";
13
- import "../../chunk-BKL3DF2Q.js";
14
- import "../../chunk-ZEJIEC2A.js";
10
+ import "../../chunk-ZLMKEYDF.js";
11
+ import "../../chunk-RRBWNEG3.js";
12
+ import "../../chunk-EMX7PA2I.js";
13
+ import "../../chunk-E74Q7GUE.js";
14
+ import "../../chunk-4CRWKTNQ.js";
15
+ import "../../chunk-SRIH4U5Y.js";
15
16
  import "../../chunk-EGMQ3SXN.js";
16
17
  import "../../chunk-NKKYTCBH.js";
17
18
  import "../../chunk-DHET7RCE.js";
@@ -1,42 +1,43 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "../../chunk-UQTG4ZBA.js";
5
- import "../../chunk-G3LNIYZG.js";
4
+ } from "../../chunk-UFAP6GHD.js";
5
+ import "../../chunk-J5T7M2CS.js";
6
6
  import "../../chunk-SXGBPQY6.js";
7
- import "../../chunk-LM5YQUBR.js";
8
- import "../../chunk-OODTDGEM.js";
7
+ import "../../chunk-WQRFVEAA.js";
8
+ import "../../chunk-KTF5RKKP.js";
9
9
  import "../../chunk-HGTC76BX.js";
10
- import "../../chunk-RJOLQ7EK.js";
11
- import "../../chunk-6YMW4HMX.js";
12
- import "../../chunk-7SOPVGDV.js";
13
- import "../../chunk-ZFRALAK5.js";
14
- import "../../chunk-LBTW5HSY.js";
15
- import "../../chunk-3SLO2QPW.js";
10
+ import "../../chunk-JWZLVWTX.js";
11
+ import "../../chunk-VOYGRNLS.js";
12
+ import "../../chunk-XP7BXHFG.js";
13
+ import "../../chunk-ZO7C5WMJ.js";
16
14
  import "../../chunk-K77I4XGL.js";
17
- import "../../chunk-52THXN5G.js";
18
- import "../../chunk-V2XIWRHP.js";
19
- import "../../chunk-ZYUASJUN.js";
20
- import "../../chunk-KYULKBFC.js";
21
- import "../../chunk-2MHSOPIU.js";
15
+ import "../../chunk-NUJHWYCR.js";
22
16
  import "../../chunk-MWGDG4QN.js";
23
- import "../../chunk-WF5PMBIR.js";
24
- import "../../chunk-KUV24B5M.js";
25
- import "../../chunk-CKPJTMNC.js";
17
+ import "../../chunk-DNPJ5GUK.js";
18
+ import "../../chunk-7SOPVGDV.js";
19
+ import "../../chunk-2MHSOPIU.js";
20
+ import "../../chunk-KSMT5FVM.js";
26
21
  import "../../chunk-GG4BSB6S.js";
22
+ import "../../chunk-ANUYSHQA.js";
23
+ import "../../chunk-BH4LN7XV.js";
27
24
  import "../../chunk-OV5UJWS5.js";
28
25
  import "../../chunk-XMLCXRTS.js";
29
26
  import "../../chunk-AQYAVLZK.js";
30
27
  import "../../chunk-AUNBGZS4.js";
31
- import "../../chunk-URAXGHF2.js";
28
+ import "../../chunk-KYULKBFC.js";
29
+ import "../../chunk-WF5PMBIR.js";
30
+ import "../../chunk-KUV24B5M.js";
31
+ import "../../chunk-B7KVPY3Z.js";
32
32
  import "../../chunk-T5DJCIUP.js";
33
33
  import "../../chunk-U3IGFMCY.js";
34
34
  import "../../chunk-6VIOO74O.js";
35
- import "../../chunk-HMJGSAKV.js";
36
- import "../../chunk-F43WGOGN.js";
37
- import "../../chunk-T4EXUIBY.js";
38
- import "../../chunk-BKL3DF2Q.js";
39
- import "../../chunk-ZEJIEC2A.js";
35
+ import "../../chunk-ZLMKEYDF.js";
36
+ import "../../chunk-RRBWNEG3.js";
37
+ import "../../chunk-EMX7PA2I.js";
38
+ import "../../chunk-E74Q7GUE.js";
39
+ import "../../chunk-4CRWKTNQ.js";
40
+ import "../../chunk-SRIH4U5Y.js";
40
41
  import "../../chunk-EGMQ3SXN.js";
41
42
  import "../../chunk-NKKYTCBH.js";
42
43
  import "../../chunk-DHET7RCE.js";
@@ -1,35 +1,35 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  showDashboard
4
- } from "../chunk-AHZ34QVK.js";
5
- import "../chunk-UQTG4ZBA.js";
6
- import "../chunk-G3LNIYZG.js";
4
+ } from "../chunk-ZCJ4YYWL.js";
5
+ import "../chunk-UFAP6GHD.js";
6
+ import "../chunk-J5T7M2CS.js";
7
7
  import "../chunk-SXGBPQY6.js";
8
- import "../chunk-LM5YQUBR.js";
9
- import "../chunk-OODTDGEM.js";
8
+ import "../chunk-WQRFVEAA.js";
9
+ import "../chunk-KTF5RKKP.js";
10
10
  import "../chunk-HGTC76BX.js";
11
- import "../chunk-RJOLQ7EK.js";
12
- import "../chunk-6YMW4HMX.js";
13
- import "../chunk-7SOPVGDV.js";
14
- import "../chunk-ZFRALAK5.js";
15
- import "../chunk-LBTW5HSY.js";
16
- import "../chunk-3SLO2QPW.js";
11
+ import "../chunk-JWZLVWTX.js";
12
+ import "../chunk-VOYGRNLS.js";
13
+ import "../chunk-XP7BXHFG.js";
14
+ import "../chunk-ZO7C5WMJ.js";
17
15
  import "../chunk-K77I4XGL.js";
18
- import "../chunk-52THXN5G.js";
19
- import "../chunk-V2XIWRHP.js";
20
- import "../chunk-ZYUASJUN.js";
21
- import "../chunk-KYULKBFC.js";
22
- import "../chunk-2MHSOPIU.js";
16
+ import "../chunk-NUJHWYCR.js";
23
17
  import "../chunk-MWGDG4QN.js";
24
- import "../chunk-WF5PMBIR.js";
25
- import "../chunk-KUV24B5M.js";
26
- import "../chunk-CKPJTMNC.js";
18
+ import "../chunk-DNPJ5GUK.js";
19
+ import "../chunk-7SOPVGDV.js";
20
+ import "../chunk-2MHSOPIU.js";
21
+ import "../chunk-KSMT5FVM.js";
27
22
  import "../chunk-GG4BSB6S.js";
23
+ import "../chunk-ANUYSHQA.js";
24
+ import "../chunk-BH4LN7XV.js";
28
25
  import "../chunk-OV5UJWS5.js";
29
26
  import "../chunk-XMLCXRTS.js";
30
27
  import "../chunk-AQYAVLZK.js";
31
28
  import "../chunk-AUNBGZS4.js";
32
- import "../chunk-URAXGHF2.js";
29
+ import "../chunk-KYULKBFC.js";
30
+ import "../chunk-WF5PMBIR.js";
31
+ import "../chunk-KUV24B5M.js";
32
+ import "../chunk-B7KVPY3Z.js";
33
33
  import "../chunk-T5DJCIUP.js";
34
34
  import "../chunk-U3IGFMCY.js";
35
35
  import "../chunk-6VIOO74O.js";
@@ -38,14 +38,15 @@ import {
38
38
  detectInstallation,
39
39
  hasIndividualPlugins,
40
40
  resolveSource
41
- } from "../chunk-HMJGSAKV.js";
42
- import "../chunk-F43WGOGN.js";
43
- import "../chunk-T4EXUIBY.js";
44
- import "../chunk-BKL3DF2Q.js";
41
+ } from "../chunk-ZLMKEYDF.js";
42
+ import "../chunk-RRBWNEG3.js";
43
+ import "../chunk-EMX7PA2I.js";
44
+ import "../chunk-E74Q7GUE.js";
45
45
  import {
46
46
  EXIT_CODES
47
- } from "../chunk-MGQVO357.js";
48
- import "../chunk-ZEJIEC2A.js";
47
+ } from "../chunk-IJLAVOKZ.js";
48
+ import "../chunk-4CRWKTNQ.js";
49
+ import "../chunk-SRIH4U5Y.js";
49
50
  import "../chunk-EGMQ3SXN.js";
50
51
  import "../chunk-NKKYTCBH.js";
51
52
  import {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import { Hook } from \"@oclif/core\";\nimport { resolveSource } from \"../lib/configuration/index.js\";\nimport { detectInstallation } from \"../lib/installation/installation.js\";\nimport { hasIndividualPlugins } from \"../lib/plugins/index.js\";\nimport { showDashboard } from \"../commands/init.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport type { ConfigWithSource } from \"../base-command.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n const projectDir = process.cwd();\n\n // When no command is given and project is already initialized, show dashboard\n if (options.id === undefined) {\n const [installation, individualPlugins] = await Promise.all([\n detectInstallation(projectDir),\n hasIndividualPlugins(projectDir),\n ]);\n\n if (installation || individualPlugins) {\n const selectedCommand = await showDashboard(projectDir);\n if (selectedCommand) {\n await options.config.runCommand(selectedCommand);\n }\n this.exit(EXIT_CODES.SUCCESS);\n }\n }\n\n // Extract --source flag from argv (not yet parsed by oclif at this point)\n let sourceFlag: string | undefined;\n const sourceArgIndex = options.argv.indexOf(\"--source\");\n if (sourceArgIndex !== -1 && sourceArgIndex + 1 < options.argv.length) {\n sourceFlag = options.argv[sourceArgIndex + 1];\n } else {\n const sourceFlagWithEquals = options.argv.find((arg) => arg.startsWith(\"--source=\"));\n if (sourceFlagWithEquals) {\n sourceFlag = sourceFlagWithEquals.split(\"=\")[1];\n }\n }\n\n // Short form -s\n const sArgIndex = options.argv.indexOf(\"-s\");\n if (sArgIndex !== -1 && sArgIndex + 1 < options.argv.length) {\n sourceFlag = options.argv[sArgIndex + 1];\n }\n\n try {\n const resolvedConfig = await resolveSource(sourceFlag, projectDir);\n // Boundary cast: oclif Config doesn't declare sourceConfig; read in BaseCommand.sourceConfig\n (options.config as unknown as ConfigWithSource).sourceConfig = resolvedConfig;\n } catch (error) {\n // Let the command handle config failures - commands can check if sourceConfig is undefined\n }\n};\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAQA,IAAM,OAAqB,eAAgB,SAAS;AAClD,QAAM,aAAa,QAAQ,IAAI;AAG/B,MAAI,QAAQ,OAAO,QAAW;AAC5B,UAAM,CAAC,cAAc,iBAAiB,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1D,mBAAmB,UAAU;AAAA,MAC7B,qBAAqB,UAAU;AAAA,IACjC,CAAC;AAED,QAAI,gBAAgB,mBAAmB;AACrC,YAAM,kBAAkB,MAAM,cAAc,UAAU;AACtD,UAAI,iBAAiB;AACnB,cAAM,QAAQ,OAAO,WAAW,eAAe;AAAA,MACjD;AACA,WAAK,KAAK,WAAW,OAAO;AAAA,IAC9B;AAAA,EACF;AAGA,MAAI;AACJ,QAAM,iBAAiB,QAAQ,KAAK,QAAQ,UAAU;AACtD,MAAI,mBAAmB,MAAM,iBAAiB,IAAI,QAAQ,KAAK,QAAQ;AACrE,iBAAa,QAAQ,KAAK,iBAAiB,CAAC;AAAA,EAC9C,OAAO;AACL,UAAM,uBAAuB,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,WAAW,CAAC;AACnF,QAAI,sBAAsB;AACxB,mBAAa,qBAAqB,MAAM,GAAG,EAAE,CAAC;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,YAAY,QAAQ,KAAK,QAAQ,IAAI;AAC3C,MAAI,cAAc,MAAM,YAAY,IAAI,QAAQ,KAAK,QAAQ;AAC3D,iBAAa,QAAQ,KAAK,YAAY,CAAC;AAAA,EACzC;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,cAAc,YAAY,UAAU;AAEjE,IAAC,QAAQ,OAAuC,eAAe;AAAA,EACjE,SAAS,OAAO;AAAA,EAEhB;AACF;AAEA,IAAO,eAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/hooks/init.ts"],"sourcesContent":["import { Hook } from \"@oclif/core\";\nimport { resolveSource } from \"../lib/configuration/index.js\";\nimport { detectInstallation } from \"../lib/installation/installation.js\";\nimport { hasIndividualPlugins } from \"../lib/plugins/index.js\";\nimport { showDashboard } from \"../commands/init.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport type { ConfigWithSource } from \"../base-command.js\";\n\nconst hook: Hook<\"init\"> = async function (options) {\n const projectDir = process.cwd();\n\n // When no command is given and project is already initialized, show dashboard\n if (options.id === undefined) {\n const [installation, individualPlugins] = await Promise.all([\n detectInstallation(projectDir),\n hasIndividualPlugins(projectDir),\n ]);\n\n if (installation || individualPlugins) {\n const selectedCommand = await showDashboard(projectDir);\n if (selectedCommand) {\n await options.config.runCommand(selectedCommand);\n }\n this.exit(EXIT_CODES.SUCCESS);\n }\n }\n\n // Extract --source flag from argv (not yet parsed by oclif at this point)\n let sourceFlag: string | undefined;\n const sourceArgIndex = options.argv.indexOf(\"--source\");\n if (sourceArgIndex !== -1 && sourceArgIndex + 1 < options.argv.length) {\n sourceFlag = options.argv[sourceArgIndex + 1];\n } else {\n const sourceFlagWithEquals = options.argv.find((arg) => arg.startsWith(\"--source=\"));\n if (sourceFlagWithEquals) {\n sourceFlag = sourceFlagWithEquals.split(\"=\")[1];\n }\n }\n\n // Short form -s\n const sArgIndex = options.argv.indexOf(\"-s\");\n if (sArgIndex !== -1 && sArgIndex + 1 < options.argv.length) {\n sourceFlag = options.argv[sArgIndex + 1];\n }\n\n try {\n const resolvedConfig = await resolveSource(sourceFlag, projectDir);\n // Boundary cast: oclif Config is a class (not augmentable); read in BaseCommand.sourceConfig\n (options.config as unknown as ConfigWithSource).sourceConfig = resolvedConfig;\n } catch (error) {\n // Let the command handle config failures - commands can check if sourceConfig is undefined\n }\n};\n\nexport default hook;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAQA,IAAM,OAAqB,eAAgB,SAAS;AAClD,QAAM,aAAa,QAAQ,IAAI;AAG/B,MAAI,QAAQ,OAAO,QAAW;AAC5B,UAAM,CAAC,cAAc,iBAAiB,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC1D,mBAAmB,UAAU;AAAA,MAC7B,qBAAqB,UAAU;AAAA,IACjC,CAAC;AAED,QAAI,gBAAgB,mBAAmB;AACrC,YAAM,kBAAkB,MAAM,cAAc,UAAU;AACtD,UAAI,iBAAiB;AACnB,cAAM,QAAQ,OAAO,WAAW,eAAe;AAAA,MACjD;AACA,WAAK,KAAK,WAAW,OAAO;AAAA,IAC9B;AAAA,EACF;AAGA,MAAI;AACJ,QAAM,iBAAiB,QAAQ,KAAK,QAAQ,UAAU;AACtD,MAAI,mBAAmB,MAAM,iBAAiB,IAAI,QAAQ,KAAK,QAAQ;AACrE,iBAAa,QAAQ,KAAK,iBAAiB,CAAC;AAAA,EAC9C,OAAO;AACL,UAAM,uBAAuB,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,WAAW,CAAC;AACnF,QAAI,sBAAsB;AACxB,mBAAa,qBAAqB,MAAM,GAAG,EAAE,CAAC;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,YAAY,QAAQ,KAAK,QAAQ,IAAI;AAC3C,MAAI,cAAc,MAAM,YAAY,IAAI,QAAQ,KAAK,QAAQ;AAC3D,iBAAa,QAAQ,KAAK,YAAY,CAAC;AAAA,EACzC;AAEA,MAAI;AACF,UAAM,iBAAiB,MAAM,cAAc,YAAY,UAAU;AAEjE,IAAC,QAAQ,OAAuC,eAAe;AAAA,EACjE,SAAS,OAAO;AAAA,EAEhB;AACF;AAEA,IAAO,eAAQ;","names":[]}
@@ -5,8 +5,9 @@ import {
5
5
  loadProjectAgents,
6
6
  loadSkillsByIds,
7
7
  parseFrontmatter
8
- } from "./chunk-F43WGOGN.js";
9
- import "./chunk-ZEJIEC2A.js";
8
+ } from "./chunk-RRBWNEG3.js";
9
+ import "./chunk-4CRWKTNQ.js";
10
+ import "./chunk-SRIH4U5Y.js";
10
11
  import "./chunk-EGMQ3SXN.js";
11
12
  import "./chunk-DHET7RCE.js";
12
13
  export {
@@ -16,4 +17,4 @@ export {
16
17
  loadSkillsByIds,
17
18
  parseFrontmatter
18
19
  };
19
- //# sourceMappingURL=loader-KVKSTKWX.js.map
20
+ //# sourceMappingURL=loader-NHUCFMFQ.js.map
@@ -2,11 +2,12 @@
2
2
  import {
3
3
  getMarketplaceLabel,
4
4
  loadSkillsMatrixFromSource
5
- } from "./chunk-HMJGSAKV.js";
6
- import "./chunk-F43WGOGN.js";
7
- import "./chunk-T4EXUIBY.js";
8
- import "./chunk-BKL3DF2Q.js";
9
- import "./chunk-ZEJIEC2A.js";
5
+ } from "./chunk-ZLMKEYDF.js";
6
+ import "./chunk-RRBWNEG3.js";
7
+ import "./chunk-EMX7PA2I.js";
8
+ import "./chunk-E74Q7GUE.js";
9
+ import "./chunk-4CRWKTNQ.js";
10
+ import "./chunk-SRIH4U5Y.js";
10
11
  import "./chunk-EGMQ3SXN.js";
11
12
  import "./chunk-NKKYTCBH.js";
12
13
  import "./chunk-DHET7RCE.js";
@@ -14,4 +15,4 @@ export {
14
15
  getMarketplaceLabel,
15
16
  loadSkillsMatrixFromSource
16
17
  };
17
- //# sourceMappingURL=source-loader-65IAJPNV.js.map
18
+ //# sourceMappingURL=source-loader-RTG42MWG.js.map
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ addSource,
4
+ getSourceSummary,
5
+ removeSource
6
+ } from "./chunk-ZLMKEYDF.js";
7
+ import "./chunk-RRBWNEG3.js";
8
+ import "./chunk-EMX7PA2I.js";
9
+ import "./chunk-E74Q7GUE.js";
10
+ import "./chunk-4CRWKTNQ.js";
11
+ import "./chunk-SRIH4U5Y.js";
12
+ import "./chunk-EGMQ3SXN.js";
13
+ import "./chunk-NKKYTCBH.js";
14
+ import "./chunk-DHET7RCE.js";
15
+ export {
16
+ addSource,
17
+ getSourceSummary,
18
+ removeSource
19
+ };
20
+ //# sourceMappingURL=source-manager-NCOFHYHD.js.map
@@ -1,12 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  useWizardStore
4
- } from "../chunk-URAXGHF2.js";
5
- import "../chunk-HMJGSAKV.js";
6
- import "../chunk-F43WGOGN.js";
7
- import "../chunk-T4EXUIBY.js";
8
- import "../chunk-BKL3DF2Q.js";
9
- import "../chunk-ZEJIEC2A.js";
4
+ } from "../chunk-B7KVPY3Z.js";
5
+ import "../chunk-ZLMKEYDF.js";
6
+ import "../chunk-RRBWNEG3.js";
7
+ import "../chunk-EMX7PA2I.js";
8
+ import "../chunk-E74Q7GUE.js";
9
+ import "../chunk-4CRWKTNQ.js";
10
+ import "../chunk-SRIH4U5Y.js";
10
11
  import "../chunk-EGMQ3SXN.js";
11
12
  import "../chunk-NKKYTCBH.js";
12
13
  import "../chunk-DHET7RCE.js";
@@ -9,12 +9,12 @@ import {
9
9
  ALL_SKILLS_WEB_FRAMEWORK_MATRIX,
10
10
  ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX,
11
11
  REACT_HONO_FRAMEWORK_API_MATRIX
12
- } from "../chunk-D7FEORKC.js";
13
- import "../chunk-Q3YMO5YG.js";
12
+ } from "../chunk-GDUOOT3J.js";
13
+ import "../chunk-TNSVPZHP.js";
14
14
  import {
15
15
  SKILLS,
16
16
  createMockMatrix
17
- } from "../chunk-WWHDP5CP.js";
17
+ } from "../chunk-V5HR77EY.js";
18
18
  import {
19
19
  beforeEach,
20
20
  describe,
@@ -23,16 +23,17 @@ import {
23
23
  } from "../chunk-XY3XDVMI.js";
24
24
  import {
25
25
  useWizardStore
26
- } from "../chunk-URAXGHF2.js";
27
- import "../chunk-HMJGSAKV.js";
28
- import "../chunk-F43WGOGN.js";
26
+ } from "../chunk-B7KVPY3Z.js";
27
+ import "../chunk-ZLMKEYDF.js";
28
+ import "../chunk-RRBWNEG3.js";
29
29
  import {
30
30
  typedKeys
31
- } from "../chunk-T4EXUIBY.js";
31
+ } from "../chunk-EMX7PA2I.js";
32
32
  import {
33
- useMatrixStore
34
- } from "../chunk-BKL3DF2Q.js";
35
- import "../chunk-ZEJIEC2A.js";
33
+ initializeMatrix
34
+ } from "../chunk-E74Q7GUE.js";
35
+ import "../chunk-4CRWKTNQ.js";
36
+ import "../chunk-SRIH4U5Y.js";
36
37
  import "../chunk-EGMQ3SXN.js";
37
38
  import "../chunk-NKKYTCBH.js";
38
39
  import {
@@ -46,7 +47,7 @@ function sa(id, preloaded = false) {
46
47
  }
47
48
  describe("WizardStore", () => {
48
49
  beforeEach(() => {
49
- useMatrixStore.getState().setMatrix(ALL_SKILLS_TEST_CATEGORIES_MATRIX);
50
+ initializeMatrix(ALL_SKILLS_TEST_CATEGORIES_MATRIX);
50
51
  });
51
52
  describe("initial state", () => {
52
53
  it("should start at stack step", () => {
@@ -218,7 +219,7 @@ describe("WizardStore", () => {
218
219
  api: { "api-api": [sa("api-framework-hono", true)] }
219
220
  }
220
221
  };
221
- useMatrixStore.getState().setMatrix(ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX);
222
+ initializeMatrix(ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX);
222
223
  store.populateFromStack(stack);
223
224
  store.toggleDomain("web");
224
225
  globalExpect(useWizardStore.getState().domainSelections.web).toBeUndefined();
@@ -229,7 +230,7 @@ describe("WizardStore", () => {
229
230
  });
230
231
  it("should restore stack skills when re-toggling a domain ON after populateFromSkillIds", () => {
231
232
  const store = useWizardStore.getState();
232
- useMatrixStore.getState().setMatrix(REACT_HONO_FRAMEWORK_API_MATRIX);
233
+ initializeMatrix(REACT_HONO_FRAMEWORK_API_MATRIX);
233
234
  store.populateFromSkillIds(["web-framework-react", "api-framework-hono"]);
234
235
  store.toggleDomain("web");
235
236
  globalExpect(useWizardStore.getState().domainSelections.web).toBeUndefined();
@@ -255,7 +256,7 @@ describe("WizardStore", () => {
255
256
  api: { "api-api": [sa("api-framework-hono", true)] }
256
257
  }
257
258
  };
258
- useMatrixStore.getState().setMatrix(ALL_SKILLS_WEB_AND_API_MATRIX);
259
+ initializeMatrix(ALL_SKILLS_WEB_AND_API_MATRIX);
259
260
  store.populateFromStack(stack);
260
261
  store.toggleTechnology("api", "api-api", "api-framework-hono", true);
261
262
  store.toggleTechnology("api", "api-api", "api-framework-express", true);
@@ -492,7 +493,7 @@ describe("WizardStore", () => {
492
493
  }
493
494
  }
494
495
  };
495
- useMatrixStore.getState().setMatrix(ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX);
496
+ initializeMatrix(ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX);
496
497
  store.populateFromStack(stack);
497
498
  const { skillConfigs } = useWizardStore.getState();
498
499
  globalExpect(skillConfigs).toHaveLength(2);
@@ -502,7 +503,7 @@ describe("WizardStore", () => {
502
503
  });
503
504
  it("should populate skillConfigs from populateFromSkillIds", () => {
504
505
  const store = useWizardStore.getState();
505
- useMatrixStore.getState().setMatrix(REACT_HONO_FRAMEWORK_API_MATRIX);
506
+ initializeMatrix(REACT_HONO_FRAMEWORK_API_MATRIX);
506
507
  store.populateFromSkillIds(["web-framework-react", "api-framework-hono"]);
507
508
  const { skillConfigs } = useWizardStore.getState();
508
509
  globalExpect(skillConfigs).toHaveLength(2);
@@ -526,7 +527,7 @@ describe("WizardStore", () => {
526
527
  web: { "web-framework": [sa("web-framework-react", true)] }
527
528
  }
528
529
  };
529
- useMatrixStore.getState().setMatrix(ALL_SKILLS_WEB_FRAMEWORK_MATRIX);
530
+ initializeMatrix(ALL_SKILLS_WEB_FRAMEWORK_MATRIX);
530
531
  store.populateFromStack(stack);
531
532
  globalExpect(useWizardStore.getState().skillConfigs).toHaveLength(1);
532
533
  store.toggleDomain("web");
@@ -556,7 +557,7 @@ describe("WizardStore", () => {
556
557
  const store = useWizardStore.getState();
557
558
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
558
559
  store.setSourceSelection("web-framework-react", "local");
559
- useMatrixStore.getState().setMatrix(
560
+ initializeMatrix(
560
561
  createMockMatrix({
561
562
  ...SKILLS.react,
562
563
  availableSources: [{ name: "Acme Corp", type: "private", installed: false }]
@@ -670,7 +671,7 @@ describe("WizardStore", () => {
670
671
  web: { "web-framework": [sa("web-framework-react", true)] }
671
672
  }
672
673
  };
673
- useMatrixStore.getState().setMatrix(ALL_SKILLS_WEB_FRAMEWORK_MATRIX);
674
+ initializeMatrix(ALL_SKILLS_WEB_FRAMEWORK_MATRIX);
674
675
  store.populateFromStack(stack);
675
676
  const { selectedDomains, domainSelections } = useWizardStore.getState();
676
677
  globalExpect(selectedDomains).toEqual(["web", "api", "mobile", "cli", "shared"]);
@@ -689,7 +690,7 @@ describe("WizardStore", () => {
689
690
  api: { "api-api": [sa("api-framework-hono", true)] }
690
691
  }
691
692
  };
692
- useMatrixStore.getState().setMatrix(ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX);
693
+ initializeMatrix(ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX);
693
694
  store.populateFromStack(stack);
694
695
  const { domainSelections } = useWizardStore.getState();
695
696
  globalExpect(domainSelections.web["web-framework"]).toEqual(["web-framework-react"]);
@@ -703,7 +704,7 @@ describe("WizardStore", () => {
703
704
  misc: { "shared-methodology": [sa("meta-methodology-vitest")] }
704
705
  }
705
706
  };
706
- useMatrixStore.getState().setMatrix(ALL_SKILLS_METHODOLOGY_BARE_MATRIX);
707
+ initializeMatrix(ALL_SKILLS_METHODOLOGY_BARE_MATRIX);
707
708
  store.populateFromStack(stack);
708
709
  const { domainSelections } = useWizardStore.getState();
709
710
  globalExpect(typedKeys(domainSelections)).toHaveLength(0);
@@ -721,7 +722,7 @@ describe("WizardStore", () => {
721
722
  }
722
723
  }
723
724
  };
724
- useMatrixStore.getState().setMatrix(ALL_SKILLS_METHODOLOGY_MATRIX);
725
+ initializeMatrix(ALL_SKILLS_METHODOLOGY_MATRIX);
725
726
  store.populateFromStack(stack);
726
727
  const { domainSelections } = useWizardStore.getState();
727
728
  globalExpect(domainSelections.shared["shared-methodology"]).toEqual([
@@ -744,7 +745,7 @@ describe("WizardStore", () => {
744
745
  api: { "api-api": [sa("api-framework-hono", true)] }
745
746
  }
746
747
  };
747
- useMatrixStore.getState().setMatrix(ALL_SKILLS_MULTI_DOMAIN_MATRIX);
748
+ initializeMatrix(ALL_SKILLS_MULTI_DOMAIN_MATRIX);
748
749
  store.populateFromStack(stack);
749
750
  const { domainSelections } = useWizardStore.getState();
750
751
  globalExpect(domainSelections.web["web-framework"]).toEqual(["web-framework-react"]);
@@ -772,7 +773,7 @@ describe("WizardStore", () => {
772
773
  }
773
774
  }
774
775
  };
775
- useMatrixStore.getState().setMatrix(ALL_SKILLS_METHODOLOGY_MATRIX);
776
+ initializeMatrix(ALL_SKILLS_METHODOLOGY_MATRIX);
776
777
  store.populateFromStack(stack);
777
778
  const { domainSelections } = useWizardStore.getState();
778
779
  globalExpect(domainSelections.shared["shared-methodology"]).toEqual([
@@ -844,7 +845,7 @@ describe("WizardStore", () => {
844
845
  makeSource({ name: "local", type: "local", installed: true, installMode: "local" })
845
846
  ]
846
847
  };
847
- useMatrixStore.getState().setMatrix(createMockMatrix(skill));
848
+ initializeMatrix(createMockMatrix(skill));
848
849
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
849
850
  const rows = store.buildSourceRows();
850
851
  globalExpect(rows).toHaveLength(1);
@@ -860,7 +861,7 @@ describe("WizardStore", () => {
860
861
  makeSource({ name: "Acme Corp", type: "private", primary: true })
861
862
  ]
862
863
  };
863
- useMatrixStore.getState().setMatrix(createMockMatrix(skill));
864
+ initializeMatrix(createMockMatrix(skill));
864
865
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
865
866
  const rows = store.buildSourceRows();
866
867
  globalExpect(rows).toHaveLength(1);
@@ -877,7 +878,7 @@ describe("WizardStore", () => {
877
878
  makeSource({ name: "agents-inc", type: "public" })
878
879
  ]
879
880
  };
880
- useMatrixStore.getState().setMatrix(createMockMatrix(skill));
881
+ initializeMatrix(createMockMatrix(skill));
881
882
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
882
883
  const rows = store.buildSourceRows();
883
884
  globalExpect(rows).toHaveLength(1);
@@ -896,7 +897,7 @@ describe("WizardStore", () => {
896
897
  makeSource({ name: "local", type: "local", installed: true, installMode: "local" })
897
898
  ]
898
899
  };
899
- useMatrixStore.getState().setMatrix(createMockMatrix(skill));
900
+ initializeMatrix(createMockMatrix(skill));
900
901
  store.toggleTechnology("web", "web-framework", "web-framework-react", true);
901
902
  const rows = store.buildSourceRows();
902
903
  globalExpect(rows).toHaveLength(1);