@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.
- package/CHANGELOG.md +36 -0
- package/dist/{chunk-ZEJIEC2A.js → chunk-4CRWKTNQ.js} +66 -261
- package/dist/chunk-4CRWKTNQ.js.map +1 -0
- package/dist/{chunk-V2XIWRHP.js → chunk-ANUYSHQA.js} +6 -7
- package/dist/chunk-ANUYSHQA.js.map +1 -0
- package/dist/{chunk-URAXGHF2.js → chunk-B7KVPY3Z.js} +20 -15
- package/dist/chunk-B7KVPY3Z.js.map +1 -0
- package/dist/{chunk-ZYUASJUN.js → chunk-BH4LN7XV.js} +8 -6
- package/dist/chunk-BH4LN7XV.js.map +1 -0
- package/dist/{chunk-J4TVAB5H.js → chunk-BM5Y6LIC.js} +2 -2
- package/dist/{chunk-6YMW4HMX.js → chunk-DNPJ5GUK.js} +6 -6
- package/dist/chunk-DNPJ5GUK.js.map +1 -0
- package/dist/chunk-E74Q7GUE.js +5132 -0
- package/dist/chunk-E74Q7GUE.js.map +1 -0
- package/dist/chunk-EMX7PA2I.js +39 -0
- package/dist/chunk-EMX7PA2I.js.map +1 -0
- package/dist/chunk-GDUOOT3J.js +689 -0
- package/dist/chunk-GDUOOT3J.js.map +1 -0
- package/dist/{chunk-MGQVO357.js → chunk-IJLAVOKZ.js} +2 -2
- package/dist/chunk-IJLAVOKZ.js.map +1 -0
- package/dist/{chunk-G3LNIYZG.js → chunk-J5T7M2CS.js} +2 -2
- package/dist/{chunk-FKRYJOPC.js → chunk-J6SHWAS6.js} +5 -5
- package/dist/chunk-J6SHWAS6.js.map +1 -0
- package/dist/{chunk-RJOLQ7EK.js → chunk-JWZLVWTX.js} +4 -4
- package/dist/{chunk-CKPJTMNC.js → chunk-KSMT5FVM.js} +4 -4
- package/dist/chunk-KSMT5FVM.js.map +1 -0
- package/dist/{chunk-OODTDGEM.js → chunk-KTF5RKKP.js} +6 -6
- package/dist/{chunk-SEAL43IR.js → chunk-NTVY4G35.js} +3 -3
- package/dist/{chunk-52THXN5G.js → chunk-NUJHWYCR.js} +2 -2
- package/dist/{chunk-HJVWBSLM.js → chunk-QJUPZPXO.js} +4 -4
- package/dist/chunk-QJUPZPXO.js.map +1 -0
- package/dist/{chunk-F43WGOGN.js → chunk-RRBWNEG3.js} +2 -2
- package/dist/chunk-RRBWNEG3.js.map +1 -0
- package/dist/chunk-SRIH4U5Y.js +159 -0
- package/dist/chunk-SRIH4U5Y.js.map +1 -0
- package/dist/{chunk-Q3YMO5YG.js → chunk-TNSVPZHP.js} +20 -2
- package/dist/chunk-TNSVPZHP.js.map +1 -0
- package/dist/{chunk-UQTG4ZBA.js → chunk-UFAP6GHD.js} +18 -20
- package/dist/chunk-UFAP6GHD.js.map +1 -0
- package/dist/{chunk-WWHDP5CP.js → chunk-V5HR77EY.js} +94 -13
- package/dist/chunk-V5HR77EY.js.map +1 -0
- package/dist/{chunk-ZFRALAK5.js → chunk-VOYGRNLS.js} +4 -5
- package/dist/chunk-VOYGRNLS.js.map +1 -0
- package/dist/{chunk-LM5YQUBR.js → chunk-WQRFVEAA.js} +6 -6
- package/dist/{chunk-LBTW5HSY.js → chunk-XP7BXHFG.js} +11 -11
- package/dist/chunk-XP7BXHFG.js.map +1 -0
- package/dist/{chunk-AHZ34QVK.js → chunk-ZCJ4YYWL.js} +40 -35
- package/dist/chunk-ZCJ4YYWL.js.map +1 -0
- package/dist/{chunk-HMJGSAKV.js → chunk-ZLMKEYDF.js} +2514 -2687
- package/dist/chunk-ZLMKEYDF.js.map +1 -0
- package/dist/{chunk-3SLO2QPW.js → chunk-ZO7C5WMJ.js} +12 -14
- package/dist/chunk-ZO7C5WMJ.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -3
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +8 -7
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +8 -7
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +13 -9
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +8 -7
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +7 -6
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/show.js +8 -7
- package/dist/commands/diff.js +7 -6
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +12 -13
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +32 -36
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +15 -13
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +7 -6
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +11 -10
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +27 -26
- package/dist/commands/list.js +7 -6
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +8 -7
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +11 -14
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +8 -7
- package/dist/commands/outdated.js +7 -6
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +8 -9
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +10 -7
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +9 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +15 -17
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/wizard/category-grid.js +2 -2
- package/dist/components/wizard/category-grid.test.js +16 -65
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +9 -8
- package/dist/components/wizard/source-grid.js +4 -4
- package/dist/components/wizard/source-grid.test.js +18 -16
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +8 -7
- package/dist/components/wizard/step-agents.js +9 -8
- package/dist/components/wizard/step-agents.test.js +14 -13
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +10 -9
- package/dist/components/wizard/step-build.test.js +16 -15
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +5 -4
- package/dist/components/wizard/step-confirm.test.js +10 -9
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-settings.js +8 -7
- package/dist/components/wizard/step-settings.test.js +11 -10
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +13 -12
- package/dist/components/wizard/step-sources.test.js +18 -17
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +11 -10
- package/dist/components/wizard/step-stack.test.js +15 -14
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/wizard-layout.js +8 -7
- package/dist/components/wizard/wizard.js +25 -24
- package/dist/hooks/init.js +27 -26
- package/dist/hooks/init.js.map +1 -1
- package/dist/{loader-KVKSTKWX.js → loader-NHUCFMFQ.js} +4 -3
- package/dist/{source-loader-65IAJPNV.js → source-loader-RTG42MWG.js} +7 -6
- package/dist/source-manager-NCOFHYHD.js +20 -0
- package/dist/stores/wizard-store.js +7 -6
- package/dist/stores/wizard-store.test.js +29 -28
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/src/schemas/custom-metadata.schema.json +81 -0
- package/src/schemas/metadata.schema.json +127 -41
- package/src/schemas/stacks.schema.json +3 -45
- package/dist/chunk-3SLO2QPW.js.map +0 -1
- package/dist/chunk-6YMW4HMX.js.map +0 -1
- package/dist/chunk-AHZ34QVK.js.map +0 -1
- package/dist/chunk-BKL3DF2Q.js +0 -45
- package/dist/chunk-BKL3DF2Q.js.map +0 -1
- package/dist/chunk-CKPJTMNC.js.map +0 -1
- package/dist/chunk-D7FEORKC.js +0 -253
- package/dist/chunk-D7FEORKC.js.map +0 -1
- package/dist/chunk-F43WGOGN.js.map +0 -1
- package/dist/chunk-FKRYJOPC.js.map +0 -1
- package/dist/chunk-HJVWBSLM.js.map +0 -1
- package/dist/chunk-HMJGSAKV.js.map +0 -1
- package/dist/chunk-LBTW5HSY.js.map +0 -1
- package/dist/chunk-MGQVO357.js.map +0 -1
- package/dist/chunk-Q3YMO5YG.js.map +0 -1
- package/dist/chunk-T4EXUIBY.js +0 -19
- package/dist/chunk-T4EXUIBY.js.map +0 -1
- package/dist/chunk-UQTG4ZBA.js.map +0 -1
- package/dist/chunk-URAXGHF2.js.map +0 -1
- package/dist/chunk-V2XIWRHP.js.map +0 -1
- package/dist/chunk-WWHDP5CP.js.map +0 -1
- package/dist/chunk-ZEJIEC2A.js.map +0 -1
- package/dist/chunk-ZFRALAK5.js.map +0 -1
- package/dist/chunk-ZYUASJUN.js.map +0 -1
- package/dist/source-manager-LJH225GA.js +0 -19
- package/dist/stores/matrix-store.js +0 -15
- package/dist/stores/matrix-store.js.map +0 -1
- package/dist/stores/matrix-store.test.js +0 -127
- package/dist/stores/matrix-store.test.js.map +0 -1
- /package/dist/{chunk-J4TVAB5H.js.map → chunk-BM5Y6LIC.js.map} +0 -0
- /package/dist/{chunk-G3LNIYZG.js.map → chunk-J5T7M2CS.js.map} +0 -0
- /package/dist/{chunk-RJOLQ7EK.js.map → chunk-JWZLVWTX.js.map} +0 -0
- /package/dist/{chunk-OODTDGEM.js.map → chunk-KTF5RKKP.js.map} +0 -0
- /package/dist/{chunk-SEAL43IR.js.map → chunk-NTVY4G35.js.map} +0 -0
- /package/dist/{chunk-52THXN5G.js.map → chunk-NUJHWYCR.js.map} +0 -0
- /package/dist/{chunk-LM5YQUBR.js.map → chunk-WQRFVEAA.js.map} +0 -0
- /package/dist/{loader-KVKSTKWX.js.map → loader-NHUCFMFQ.js.map} +0 -0
- /package/dist/{source-loader-65IAJPNV.js.map → source-loader-RTG42MWG.js.map} +0 -0
- /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-
|
|
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-
|
|
8
|
+
import "../../chunk-B7KVPY3Z.js";
|
|
9
9
|
import "../../chunk-6VIOO74O.js";
|
|
10
|
-
import "../../chunk-
|
|
11
|
-
import "../../chunk-
|
|
12
|
-
import "../../chunk-
|
|
13
|
-
import "../../chunk-
|
|
14
|
-
import "../../chunk-
|
|
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-
|
|
5
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-UFAP6GHD.js";
|
|
5
|
+
import "../../chunk-J5T7M2CS.js";
|
|
6
6
|
import "../../chunk-SXGBPQY6.js";
|
|
7
|
-
import "../../chunk-
|
|
8
|
-
import "../../chunk-
|
|
7
|
+
import "../../chunk-WQRFVEAA.js";
|
|
8
|
+
import "../../chunk-KTF5RKKP.js";
|
|
9
9
|
import "../../chunk-HGTC76BX.js";
|
|
10
|
-
import "../../chunk-
|
|
11
|
-
import "../../chunk-
|
|
12
|
-
import "../../chunk-
|
|
13
|
-
import "../../chunk-
|
|
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-
|
|
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-
|
|
24
|
-
import "../../chunk-
|
|
25
|
-
import "../../chunk-
|
|
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-
|
|
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-
|
|
36
|
-
import "../../chunk-
|
|
37
|
-
import "../../chunk-
|
|
38
|
-
import "../../chunk-
|
|
39
|
-
import "../../chunk-
|
|
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";
|
package/dist/hooks/init.js
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
showDashboard
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
4
|
+
} from "../chunk-ZCJ4YYWL.js";
|
|
5
|
+
import "../chunk-UFAP6GHD.js";
|
|
6
|
+
import "../chunk-J5T7M2CS.js";
|
|
7
7
|
import "../chunk-SXGBPQY6.js";
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-WQRFVEAA.js";
|
|
9
|
+
import "../chunk-KTF5RKKP.js";
|
|
10
10
|
import "../chunk-HGTC76BX.js";
|
|
11
|
-
import "../chunk-
|
|
12
|
-
import "../chunk-
|
|
13
|
-
import "../chunk-
|
|
14
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-
|
|
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-
|
|
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-
|
|
42
|
-
import "../chunk-
|
|
43
|
-
import "../chunk-
|
|
44
|
-
import "../chunk-
|
|
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-
|
|
48
|
-
import "../chunk-
|
|
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 {
|
package/dist/hooks/init.js.map
CHANGED
|
@@ -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
|
|
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-
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
20
|
+
//# sourceMappingURL=loader-NHUCFMFQ.js.map
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
getMarketplaceLabel,
|
|
4
4
|
loadSkillsMatrixFromSource
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
5
|
-
import "../chunk-
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
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-
|
|
13
|
-
import "../chunk-
|
|
12
|
+
} from "../chunk-GDUOOT3J.js";
|
|
13
|
+
import "../chunk-TNSVPZHP.js";
|
|
14
14
|
import {
|
|
15
15
|
SKILLS,
|
|
16
16
|
createMockMatrix
|
|
17
|
-
} from "../chunk-
|
|
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-
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
26
|
+
} from "../chunk-B7KVPY3Z.js";
|
|
27
|
+
import "../chunk-ZLMKEYDF.js";
|
|
28
|
+
import "../chunk-RRBWNEG3.js";
|
|
29
29
|
import {
|
|
30
30
|
typedKeys
|
|
31
|
-
} from "../chunk-
|
|
31
|
+
} from "../chunk-EMX7PA2I.js";
|
|
32
32
|
import {
|
|
33
|
-
|
|
34
|
-
} from "../chunk-
|
|
35
|
-
import "../chunk-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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);
|