@claude-collective/cli 0.13.4 → 0.25.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 +357 -0
- package/README.md +41 -27
- package/config/skills-matrix.yaml +202 -134
- package/config/stacks.yaml +14 -20
- package/dist/chunk-3X5D7RM5.js +69 -0
- package/dist/chunk-3X5D7RM5.js.map +1 -0
- package/dist/chunk-4S4FCAA2.js +100 -0
- package/dist/chunk-4S4FCAA2.js.map +1 -0
- package/dist/chunk-4WGN6SUE.js +197 -0
- package/dist/chunk-4WGN6SUE.js.map +1 -0
- package/dist/{chunk-DHET7RCE.js → chunk-AWKZ5BDL.js} +9 -2
- package/dist/{chunk-DHET7RCE.js.map → chunk-AWKZ5BDL.js.map} +1 -1
- package/dist/{chunk-6Q3Y7KVB.js → chunk-DBRUQQUF.js} +8 -2
- package/dist/chunk-DBRUQQUF.js.map +1 -0
- package/dist/{chunk-Z7G4B5HJ.js → chunk-ETCVEV3S.js} +73 -150
- package/dist/chunk-ETCVEV3S.js.map +1 -0
- package/dist/chunk-F4RD5FYM.js +45 -0
- package/dist/chunk-F4RD5FYM.js.map +1 -0
- package/dist/{chunk-ACNBKXXJ.js → chunk-GGFOD5PK.js} +13 -44
- package/dist/chunk-GGFOD5PK.js.map +1 -0
- package/dist/chunk-H7SSBSPR.js +29 -0
- package/dist/chunk-H7SSBSPR.js.map +1 -0
- package/dist/chunk-HWD32NP7.js +19 -0
- package/dist/chunk-HWD32NP7.js.map +1 -0
- package/dist/{chunk-JIPWV2FX.js → chunk-IAYAE6MG.js} +12 -34
- package/dist/chunk-IAYAE6MG.js.map +1 -0
- package/dist/{chunk-RTE64SJA.js → chunk-IXBCRT3F.js} +2 -2
- package/dist/chunk-IXBCRT3F.js.map +1 -0
- package/dist/chunk-KWYO3M5Q.js +67 -0
- package/dist/chunk-KWYO3M5Q.js.map +1 -0
- package/dist/{chunk-E3FJH4TF.js → chunk-MCTSHLAF.js} +18 -18
- package/dist/chunk-MCTSHLAF.js.map +1 -0
- package/dist/chunk-MH66WDFV.js +251 -0
- package/dist/chunk-MH66WDFV.js.map +1 -0
- package/dist/{chunk-K3NB6DSG.js → chunk-MTPM7BX5.js} +108 -110
- package/dist/chunk-MTPM7BX5.js.map +1 -0
- package/dist/chunk-NQJ47R4N.js +1092 -0
- package/dist/chunk-NQJ47R4N.js.map +1 -0
- package/dist/chunk-NRC7XYCI.js +211 -0
- package/dist/chunk-NRC7XYCI.js.map +1 -0
- package/dist/{chunk-76DWXGQE.js → chunk-O6ZTD7ZI.js} +14 -3
- package/dist/chunk-O6ZTD7ZI.js.map +1 -0
- package/dist/chunk-OBXAY23Y.js +56 -0
- package/dist/chunk-OBXAY23Y.js.map +1 -0
- package/dist/{chunk-XY3XDVMI.js → chunk-QR2EBWL2.js} +3 -3
- package/dist/{chunk-66UDJBF6.js → chunk-REJGRCVQ.js} +2 -2
- package/dist/{chunk-D237EVNB.js → chunk-TMED5DQ2.js} +71 -48
- package/dist/chunk-TMED5DQ2.js.map +1 -0
- package/dist/chunk-U7HFKR74.js +21 -0
- package/dist/chunk-U7HFKR74.js.map +1 -0
- package/dist/chunk-UEMRJI2K.js +146 -0
- package/dist/chunk-UEMRJI2K.js.map +1 -0
- package/dist/{chunk-Z2CWURZ6.js → chunk-UNN7523L.js} +2 -2
- package/dist/chunk-V2ZIH7HV.js +29 -0
- package/dist/chunk-V2ZIH7HV.js.map +1 -0
- package/dist/{chunk-X6QONICW.js → chunk-VVYNZZUX.js} +7 -19
- package/dist/chunk-VVYNZZUX.js.map +1 -0
- package/dist/chunk-WXS4S3MA.js +220 -0
- package/dist/chunk-WXS4S3MA.js.map +1 -0
- package/dist/{chunk-CDX4W4DM.js → chunk-XENOESJZ.js} +53 -33
- package/dist/chunk-XENOESJZ.js.map +1 -0
- package/dist/chunk-YDBSSAJ6.js +4207 -0
- package/dist/chunk-YDBSSAJ6.js.map +1 -0
- package/dist/chunk-ZDREFYD2.js +696 -0
- package/dist/chunk-ZDREFYD2.js.map +1 -0
- package/dist/chunk-ZW2PELOH.js +197 -0
- package/dist/chunk-ZW2PELOH.js.map +1 -0
- package/dist/cli/defaults/agent-mappings.yaml +13 -14
- package/dist/commands/build/marketplace.js +19 -23
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +13 -240
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +13 -25
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +45 -82
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +9 -9
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/index.js +8 -8
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +7 -9
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/set-project.js +12 -13
- package/dist/commands/config/set-project.js.map +1 -1
- package/dist/commands/config/show.js +7 -7
- package/dist/commands/config/unset-project.js +12 -13
- package/dist/commands/config/unset-project.js.map +1 -1
- package/dist/commands/diff.js +15 -44
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +23 -67
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +98 -81
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +27 -79
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +38 -58
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +17 -24
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +103 -779
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +8 -11
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +11 -16
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/skill.js +14 -18
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +16 -97
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +24 -43
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +22 -30
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +23 -154
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +38 -89
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/version/bump.js +12 -28
- package/dist/commands/version/bump.js.map +1 -1
- package/dist/commands/version/index.js +8 -24
- package/dist/commands/version/index.js.map +1 -1
- package/dist/commands/version/set.js +11 -26
- package/dist/commands/version/set.js.map +1 -1
- package/dist/commands/version/show.js +8 -24
- package/dist/commands/version/show.js.map +1 -1
- package/dist/components/common/confirm.js +2 -2
- package/dist/components/common/confirm.test.js +203 -0
- package/dist/components/common/confirm.test.js.map +1 -0
- package/dist/components/common/message.js +3 -7
- package/dist/components/common/message.js.map +1 -1
- package/dist/components/common/spinner.js +1 -1
- package/dist/components/common/spinner.js.map +1 -1
- package/dist/components/skill-search/skill-search.js +3 -3
- package/dist/components/wizard/category-grid.js +2 -2
- package/dist/components/wizard/category-grid.test.js +138 -156
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/menu-item.js +9 -0
- package/dist/components/wizard/search-modal.js +9 -0
- package/dist/components/wizard/search-modal.test.js +216 -0
- package/dist/components/wizard/search-modal.test.js.map +1 -0
- package/dist/components/wizard/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +16 -106
- package/dist/components/wizard/section-progress.test.js.map +1 -1
- package/dist/components/wizard/source-grid.js +10 -0
- package/dist/components/wizard/source-grid.js.map +1 -0
- package/dist/components/wizard/source-grid.test.js +500 -0
- package/dist/components/wizard/source-grid.test.js.map +1 -0
- package/dist/components/wizard/step-approach.js +7 -5
- package/dist/components/wizard/step-approach.test.js +115 -0
- package/dist/components/wizard/step-approach.test.js.map +1 -0
- package/dist/components/wizard/step-build.js +9 -5
- package/dist/components/wizard/step-build.test.js +160 -284
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +3 -3
- package/dist/components/wizard/step-confirm.test.js +364 -0
- package/dist/components/wizard/step-confirm.test.js.map +1 -0
- package/dist/components/wizard/step-refine.js +2 -3
- package/dist/components/wizard/step-refine.test.js +24 -26
- package/dist/components/wizard/step-refine.test.js.map +1 -1
- package/dist/components/wizard/step-settings.js +14 -0
- package/dist/components/wizard/step-settings.js.map +1 -0
- package/dist/components/wizard/step-settings.test.js +240 -0
- package/dist/components/wizard/step-settings.test.js.map +1 -0
- package/dist/components/wizard/step-sources.js +17 -0
- package/dist/components/wizard/step-sources.js.map +1 -0
- package/dist/components/wizard/step-sources.test.js +290 -0
- package/dist/components/wizard/step-sources.test.js.map +1 -0
- package/dist/components/wizard/step-stack.js +7 -4
- package/dist/components/wizard/step-stack.test.js +344 -0
- package/dist/components/wizard/step-stack.test.js.map +1 -0
- package/dist/components/wizard/view-title.js +9 -0
- package/dist/components/wizard/view-title.js.map +1 -0
- package/dist/components/wizard/wizard-layout.js +17 -0
- package/dist/components/wizard/wizard-layout.js.map +1 -0
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard-tabs.test.js +292 -0
- package/dist/components/wizard/wizard-tabs.test.js.map +1 -0
- package/dist/components/wizard/wizard.js +22 -15
- package/dist/config/skills-matrix.yaml +202 -134
- package/dist/config/stacks.yaml +14 -20
- package/dist/hooks/init.js +6 -8
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{magic-string.es-RGXYGAW3.js → magic-string.es-PAH2SOTR.js} +2 -2
- package/dist/source-manager-DSYZEVGZ.js +16 -0
- package/dist/source-manager-DSYZEVGZ.js.map +1 -0
- package/dist/src/agents/developer/api-developer/agent.yaml +1 -1
- package/dist/src/agents/developer/cli-developer/agent.yaml +1 -1
- package/dist/src/agents/developer/web-architecture/agent.yaml +1 -1
- package/dist/src/agents/developer/web-developer/agent.yaml +1 -1
- package/dist/src/agents/developer/web-developer/examples.md +1 -6
- package/dist/src/agents/meta/agent-summoner/agent.yaml +1 -1
- package/dist/src/agents/meta/documentor/agent.yaml +1 -1
- package/dist/src/agents/meta/documentor/workflow.md +1 -5
- package/dist/src/agents/meta/skill-summoner/agent.yaml +1 -1
- package/dist/src/agents/migration/cli-migrator/agent.yaml +1 -1
- package/dist/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
- package/dist/src/agents/pattern/pattern-scout/agent.yaml +1 -1
- package/dist/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
- package/dist/src/agents/planning/web-pm/agent.yaml +1 -1
- package/dist/src/agents/researcher/api-researcher/agent.yaml +1 -1
- package/dist/src/agents/researcher/web-researcher/agent.yaml +1 -1
- package/dist/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
- package/dist/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
- package/dist/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
- package/dist/src/agents/tester/cli-tester/agent.yaml +1 -1
- package/dist/src/agents/tester/web-tester/agent.yaml +1 -1
- package/dist/src/agents/tester/web-tester/output-format.md +1 -3
- package/dist/stores/wizard-store.js +4 -3
- package/dist/stores/wizard-store.test.js +94 -88
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +5 -3
- package/src/agents/developer/api-developer/agent.yaml +1 -1
- package/src/agents/developer/cli-developer/agent.yaml +1 -1
- package/src/agents/developer/web-architecture/agent.yaml +1 -1
- package/src/agents/developer/web-developer/agent.yaml +1 -1
- package/src/agents/developer/web-developer/examples.md +1 -6
- package/src/agents/meta/agent-summoner/agent.yaml +1 -1
- package/src/agents/meta/documentor/agent.yaml +1 -1
- package/src/agents/meta/documentor/workflow.md +1 -5
- package/src/agents/meta/skill-summoner/agent.yaml +1 -1
- package/src/agents/migration/cli-migrator/agent.yaml +1 -1
- package/src/agents/migration/cli-migrator/anti-patterns.md +1 -3
- package/src/agents/pattern/pattern-scout/agent.yaml +1 -1
- package/src/agents/pattern/web-pattern-critique/agent.yaml +1 -1
- package/src/agents/planning/web-pm/agent.yaml +1 -1
- package/src/agents/researcher/api-researcher/agent.yaml +1 -1
- package/src/agents/researcher/web-researcher/agent.yaml +1 -1
- package/src/agents/reviewer/api-reviewer/agent.yaml +1 -1
- package/src/agents/reviewer/cli-reviewer/agent.yaml +1 -1
- package/src/agents/reviewer/web-reviewer/agent.yaml +1 -1
- package/src/agents/tester/cli-tester/agent.yaml +1 -1
- package/src/agents/tester/web-tester/agent.yaml +1 -1
- package/src/agents/tester/web-tester/output-format.md +1 -3
- package/dist/chunk-3U3R4NCG.js +0 -22
- package/dist/chunk-3U3R4NCG.js.map +0 -1
- package/dist/chunk-4K4ZXQRM.js +0 -317
- package/dist/chunk-4K4ZXQRM.js.map +0 -1
- package/dist/chunk-6Q3Y7KVB.js.map +0 -1
- package/dist/chunk-76DWXGQE.js.map +0 -1
- package/dist/chunk-7Q44DMSP.js +0 -582
- package/dist/chunk-7Q44DMSP.js.map +0 -1
- package/dist/chunk-ACNBKXXJ.js.map +0 -1
- package/dist/chunk-B7CCVP6Q.js +0 -639
- package/dist/chunk-B7CCVP6Q.js.map +0 -1
- package/dist/chunk-BDLUZVKU.js +0 -54
- package/dist/chunk-BDLUZVKU.js.map +0 -1
- package/dist/chunk-CDX4W4DM.js.map +0 -1
- package/dist/chunk-D237EVNB.js.map +0 -1
- package/dist/chunk-DRXPNNPB.js +0 -393
- package/dist/chunk-DRXPNNPB.js.map +0 -1
- package/dist/chunk-E3FJH4TF.js.map +0 -1
- package/dist/chunk-ED4E6Q2T.js +0 -114
- package/dist/chunk-ED4E6Q2T.js.map +0 -1
- package/dist/chunk-EHS3TWWP.js +0 -95
- package/dist/chunk-EHS3TWWP.js.map +0 -1
- package/dist/chunk-GDH553MV.js +0 -91
- package/dist/chunk-GDH553MV.js.map +0 -1
- package/dist/chunk-HLJX2FTL.js +0 -95
- package/dist/chunk-HLJX2FTL.js.map +0 -1
- package/dist/chunk-I2DSLOXZ.js +0 -75
- package/dist/chunk-I2DSLOXZ.js.map +0 -1
- package/dist/chunk-I4TPKIYX.js +0 -493
- package/dist/chunk-I4TPKIYX.js.map +0 -1
- package/dist/chunk-IAUAQJQ2.js +0 -57
- package/dist/chunk-IAUAQJQ2.js.map +0 -1
- package/dist/chunk-IBE7JIAG.js +0 -129
- package/dist/chunk-IBE7JIAG.js.map +0 -1
- package/dist/chunk-IMDW5ZUP.js +0 -132
- package/dist/chunk-IMDW5ZUP.js.map +0 -1
- package/dist/chunk-JIPWV2FX.js.map +0 -1
- package/dist/chunk-K3NB6DSG.js.map +0 -1
- package/dist/chunk-K7EVM5LY.js +0 -141
- package/dist/chunk-K7EVM5LY.js.map +0 -1
- package/dist/chunk-KAAEN2PO.js +0 -57
- package/dist/chunk-KAAEN2PO.js.map +0 -1
- package/dist/chunk-NDY25DTL.js +0 -453
- package/dist/chunk-NDY25DTL.js.map +0 -1
- package/dist/chunk-P26A2K5N.js +0 -64
- package/dist/chunk-P26A2K5N.js.map +0 -1
- package/dist/chunk-RFTSZDHV.js +0 -313
- package/dist/chunk-RFTSZDHV.js.map +0 -1
- package/dist/chunk-RTE64SJA.js.map +0 -1
- package/dist/chunk-SVYPSDWY.js +0 -84
- package/dist/chunk-SVYPSDWY.js.map +0 -1
- package/dist/chunk-TKFPKEV3.js +0 -69
- package/dist/chunk-TKFPKEV3.js.map +0 -1
- package/dist/chunk-UQTEPWU7.js +0 -108
- package/dist/chunk-UQTEPWU7.js.map +0 -1
- package/dist/chunk-V46GGCCI.js +0 -294
- package/dist/chunk-V46GGCCI.js.map +0 -1
- package/dist/chunk-X6QONICW.js.map +0 -1
- package/dist/chunk-Y2LW7R3Y.js +0 -23
- package/dist/chunk-Y2LW7R3Y.js.map +0 -1
- package/dist/chunk-Z7G4B5HJ.js.map +0 -1
- package/dist/chunk-ZENYS6KW.js +0 -90
- package/dist/chunk-ZENYS6KW.js.map +0 -1
- package/dist/chunk-ZFPSUQOU.js +0 -396
- package/dist/chunk-ZFPSUQOU.js.map +0 -1
- package/dist/commands/config/set.js +0 -61
- package/dist/commands/config/set.js.map +0 -1
- package/dist/commands/config/unset.js +0 -57
- package/dist/commands/config/unset.js.map +0 -1
- package/dist/commands/test-imports.js +0 -92
- package/dist/commands/test-imports.js.map +0 -1
- package/dist/components/wizard/step-stack-options.js +0 -11
- package/dist/components/wizard/wizard-footer.js +0 -9
- /package/dist/{chunk-XY3XDVMI.js.map → chunk-QR2EBWL2.js.map} +0 -0
- /package/dist/{chunk-66UDJBF6.js.map → chunk-REJGRCVQ.js.map} +0 -0
- /package/dist/{chunk-Z2CWURZ6.js.map → chunk-UNN7523L.js.map} +0 -0
- /package/dist/components/wizard/{step-stack-options.js.map → menu-item.js.map} +0 -0
- /package/dist/components/wizard/{wizard-footer.js.map → search-modal.js.map} +0 -0
- /package/dist/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/common/confirm.test.tsx"],"sourcesContent":["// ConfirmInput requires longer delays than other components for useInput processing\nimport React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { Confirm } from \"./confirm\";\nimport { KEY_Y, KEY_N, ENTER, RENDER_DELAY_MS, delay } from \"../../lib/__tests__/test-constants\";\n\nconst CONFIRM_INPUT_DELAY_MS = 100;\n\ndescribe(\"Confirm component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render the message\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Do you want to proceed?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Do you want to proceed?\");\n });\n\n it(\"should show y/n prompt\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Continue?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // ConfirmInput shows (Y/n) or (y/N) depending on default\n expect(output?.toLowerCase()).toMatch(/[yn]/);\n });\n\n it(\"should show Y/n when default is confirm (true)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Y/n\");\n });\n\n it(\"should show y/N when default is cancel (false)\", () => {\n const { lastFrame, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={() => {}}\n onCancel={() => {}}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"y/N\");\n });\n });\n\n describe(\"keyboard interactions\", () => {\n it(\"should call onConfirm when pressing y\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n // Wait for component to mount and set up input handler\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_Y);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when pressing n\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(KEY_N);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should call onConfirm when default is true and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={true}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n expect(onCancel).not.toHaveBeenCalled();\n });\n\n it(\"should call onCancel when default is false and enter pressed\", async () => {\n const onConfirm = vi.fn();\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm\n message=\"Confirm?\"\n onConfirm={onConfirm}\n onCancel={onCancel}\n defaultValue={false}\n />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(ENTER);\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n expect(onConfirm).not.toHaveBeenCalled();\n });\n\n it(\"should handle uppercase Y\", async () => {\n const onConfirm = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={onConfirm} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"Y\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onConfirm).toHaveBeenCalled();\n });\n\n it(\"should handle uppercase N\", async () => {\n const onCancel = vi.fn();\n\n const { stdin, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={onCancel} />,\n );\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n\n await stdin.write(\"N\");\n await delay(CONFIRM_INPUT_DELAY_MS);\n\n expect(onCancel).toHaveBeenCalled();\n });\n });\n\n describe(\"default value\", () => {\n it(\"should default to false when not specified\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is false, N is capitalized (y/N)\n expect(output).toContain(\"y/N\");\n });\n\n it(\"should render with specified default value of true\", () => {\n const { lastFrame, unmount } = render(\n <Confirm message=\"Confirm?\" onConfirm={() => {}} onCancel={() => {}} defaultValue={true} />,\n );\n cleanup = unmount;\n\n const output = lastFrame();\n // When default is true, Y is capitalized (Y/n)\n expect(output).toContain(\"Y/n\");\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
init_esm_shims
|
|
4
|
-
} from "../../chunk-
|
|
4
|
+
} from "../../chunk-AWKZ5BDL.js";
|
|
5
5
|
|
|
6
6
|
// src/cli/components/common/message.tsx
|
|
7
7
|
init_esm_shims();
|
|
8
8
|
import { Alert } from "@inkjs/ui";
|
|
9
9
|
import { jsx } from "react/jsx-runtime";
|
|
10
10
|
var InfoMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "info", children });
|
|
11
|
-
var WarningMessage = ({
|
|
12
|
-
children
|
|
13
|
-
}) => /* @__PURE__ */ jsx(Alert, { variant: "warning", children });
|
|
11
|
+
var WarningMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "warning", children });
|
|
14
12
|
var ErrorMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "error", children });
|
|
15
|
-
var SuccessMessage = ({
|
|
16
|
-
children
|
|
17
|
-
}) => /* @__PURE__ */ jsx(Alert, { variant: "success", children });
|
|
13
|
+
var SuccessMessage = ({ children }) => /* @__PURE__ */ jsx(Alert, { variant: "success", children });
|
|
18
14
|
export {
|
|
19
15
|
ErrorMessage,
|
|
20
16
|
InfoMessage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/common/message.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert } from \"@inkjs/ui\";\n\nexport const InfoMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"info\">{children}</Alert>\n);\n\nexport const WarningMessage: React.FC<{ children: string }> = ({
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/common/message.tsx"],"sourcesContent":["import React from \"react\";\nimport { Alert } from \"@inkjs/ui\";\n\nexport const InfoMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"info\">{children}</Alert>\n);\n\nexport const WarningMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"warning\">{children}</Alert>\n);\n\nexport const ErrorMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"error\">{children}</Alert>\n);\n\nexport const SuccessMessage: React.FC<{ children: string }> = ({ children }) => (\n <Alert variant=\"success\">{children}</Alert>\n);\n"],"mappings":";;;;;;AAAA;AACA,SAAS,aAAa;AAGpB;AADK,IAAM,cAA8C,CAAC,EAAE,SAAS,MACrE,oBAAC,SAAM,SAAQ,QAAQ,UAAS;AAG3B,IAAM,iBAAiD,CAAC,EAAE,SAAS,MACxE,oBAAC,SAAM,SAAQ,WAAW,UAAS;AAG9B,IAAM,eAA+C,CAAC,EAAE,SAAS,MACtE,oBAAC,SAAM,SAAQ,SAAS,UAAS;AAG5B,IAAM,iBAAiD,CAAC,EAAE,SAAS,MACxE,oBAAC,SAAM,SAAQ,WAAW,UAAS;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/cli/components/common/spinner.tsx"],"sourcesContent":["import React from \"react\";\nimport { Spinner as InkSpinner } from \"@inkjs/ui\";\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/common/spinner.tsx"],"sourcesContent":["import React from \"react\";\nimport { Spinner as InkSpinner } from \"@inkjs/ui\";\n\ntype SpinnerProps = {\n label: string;\n};\n\nexport const Spinner: React.FC<SpinnerProps> = ({ label }) => <InkSpinner label={label} />;\n"],"mappings":";;;;;;AAAA;AACA,SAAS,WAAW,kBAAkB;AAMwB;AAAvD,IAAM,UAAkC,CAAC,EAAE,MAAM,MAAM,oBAAC,cAAW,OAAc;","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SkillSearch
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
6
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-GGFOD5PK.js";
|
|
5
|
+
import "../../chunk-UNN7523L.js";
|
|
6
|
+
import "../../chunk-AWKZ5BDL.js";
|
|
7
7
|
export {
|
|
8
8
|
SkillSearch
|
|
9
9
|
};
|
|
@@ -8,23 +8,23 @@ import {
|
|
|
8
8
|
RENDER_DELAY_MS,
|
|
9
9
|
TAB,
|
|
10
10
|
delay
|
|
11
|
-
} from "../../chunk-
|
|
11
|
+
} from "../../chunk-DBRUQQUF.js";
|
|
12
12
|
import {
|
|
13
13
|
render
|
|
14
|
-
} from "../../chunk-
|
|
14
|
+
} from "../../chunk-REJGRCVQ.js";
|
|
15
15
|
import {
|
|
16
16
|
afterEach,
|
|
17
17
|
describe,
|
|
18
18
|
globalExpect,
|
|
19
19
|
it,
|
|
20
20
|
vi
|
|
21
|
-
} from "../../chunk-
|
|
21
|
+
} from "../../chunk-QR2EBWL2.js";
|
|
22
22
|
import {
|
|
23
23
|
CategoryGrid
|
|
24
|
-
} from "../../chunk-
|
|
24
|
+
} from "../../chunk-ETCVEV3S.js";
|
|
25
25
|
import {
|
|
26
26
|
init_esm_shims
|
|
27
|
-
} from "../../chunk-
|
|
27
|
+
} from "../../chunk-AWKZ5BDL.js";
|
|
28
28
|
|
|
29
29
|
// src/cli/components/wizard/category-grid.test.tsx
|
|
30
30
|
init_esm_shims();
|
|
@@ -36,9 +36,9 @@ var createOption = (id, label, overrides = {}) => ({
|
|
|
36
36
|
selected: false,
|
|
37
37
|
...overrides
|
|
38
38
|
});
|
|
39
|
-
var createCategory = (id,
|
|
39
|
+
var createCategory = (id, displayName, options, overrides = {}) => ({
|
|
40
40
|
id,
|
|
41
|
-
|
|
41
|
+
displayName,
|
|
42
42
|
required: false,
|
|
43
43
|
exclusive: true,
|
|
44
44
|
options,
|
|
@@ -49,13 +49,13 @@ var defaultCategories = [
|
|
|
49
49
|
"framework",
|
|
50
50
|
"Framework",
|
|
51
51
|
[
|
|
52
|
-
createOption("react", "React", {
|
|
52
|
+
createOption("web-test-react", "React", {
|
|
53
53
|
state: "recommended",
|
|
54
54
|
stateReason: "Popular choice"
|
|
55
55
|
}),
|
|
56
|
-
createOption("vue", "Vue"),
|
|
57
|
-
createOption("angular", "Angular"),
|
|
58
|
-
createOption("svelte", "Svelte")
|
|
56
|
+
createOption("web-test-vue", "Vue"),
|
|
57
|
+
createOption("web-test-angular", "Angular"),
|
|
58
|
+
createOption("web-test-svelte", "Svelte")
|
|
59
59
|
],
|
|
60
60
|
{ required: true }
|
|
61
61
|
),
|
|
@@ -63,45 +63,43 @@ var defaultCategories = [
|
|
|
63
63
|
"styling",
|
|
64
64
|
"Styling",
|
|
65
65
|
[
|
|
66
|
-
createOption("scss-mod", "SCSS Modules", { selected: true }),
|
|
67
|
-
createOption("tailwind", "Tailwind", { state: "recommended" }),
|
|
68
|
-
createOption("styled", "Styled Components"),
|
|
69
|
-
createOption("vanilla", "Vanilla CSS")
|
|
66
|
+
createOption("web-scss-mod", "SCSS Modules", { selected: true }),
|
|
67
|
+
createOption("web-test-tailwind", "Tailwind", { state: "recommended" }),
|
|
68
|
+
createOption("web-test-styled", "Styled Components"),
|
|
69
|
+
createOption("web-test-vanilla", "Vanilla CSS")
|
|
70
70
|
],
|
|
71
71
|
{ required: true }
|
|
72
72
|
),
|
|
73
73
|
createCategory("client-state", "Client State", [
|
|
74
|
-
createOption("zustand", "Zustand", { state: "recommended" }),
|
|
75
|
-
createOption("jotai", "Jotai"),
|
|
76
|
-
createOption("redux", "Redux", {
|
|
74
|
+
createOption("web-test-zustand", "Zustand", { state: "recommended" }),
|
|
75
|
+
createOption("web-test-jotai", "Jotai"),
|
|
76
|
+
createOption("web-test-redux", "Redux", {
|
|
77
77
|
state: "discouraged",
|
|
78
78
|
stateReason: "Complex for most apps"
|
|
79
79
|
}),
|
|
80
|
-
createOption("mobx", "MobX")
|
|
80
|
+
createOption("web-test-mobx", "MobX")
|
|
81
81
|
]),
|
|
82
82
|
createCategory("server-state", "Server State", [
|
|
83
|
-
createOption("react-query", "React Query", { selected: true }),
|
|
84
|
-
createOption("swr", "SWR"),
|
|
85
|
-
createOption("apollo", "Apollo")
|
|
83
|
+
createOption("web-react-query", "React Query", { selected: true }),
|
|
84
|
+
createOption("web-test-swr", "SWR"),
|
|
85
|
+
createOption("web-test-apollo", "Apollo")
|
|
86
86
|
]),
|
|
87
|
-
createCategory("analytics", "Analytics", [
|
|
88
|
-
createOption("posthog", "PostHog")
|
|
89
|
-
])
|
|
87
|
+
createCategory("analytics", "Analytics", [createOption("web-test-posthog", "PostHog")])
|
|
90
88
|
];
|
|
91
89
|
var categoriesWithFramework = [
|
|
92
90
|
createCategory(
|
|
93
91
|
"framework",
|
|
94
92
|
"Framework",
|
|
95
93
|
[
|
|
96
|
-
createOption("react", "React", {
|
|
94
|
+
createOption("web-test-react", "React", {
|
|
97
95
|
state: "recommended",
|
|
98
96
|
stateReason: "Popular choice",
|
|
99
97
|
selected: true
|
|
100
98
|
// Framework selected
|
|
101
99
|
}),
|
|
102
|
-
createOption("vue", "Vue"),
|
|
103
|
-
createOption("angular", "Angular"),
|
|
104
|
-
createOption("svelte", "Svelte")
|
|
100
|
+
createOption("web-test-vue", "Vue"),
|
|
101
|
+
createOption("web-test-angular", "Angular"),
|
|
102
|
+
createOption("web-test-svelte", "Svelte")
|
|
105
103
|
],
|
|
106
104
|
{ required: true }
|
|
107
105
|
),
|
|
@@ -109,18 +107,18 @@ var categoriesWithFramework = [
|
|
|
109
107
|
"styling",
|
|
110
108
|
"Styling",
|
|
111
109
|
[
|
|
112
|
-
createOption("scss-mod", "SCSS Modules"),
|
|
113
|
-
createOption("tailwind", "Tailwind", { state: "recommended" }),
|
|
114
|
-
createOption("styled", "Styled Components"),
|
|
115
|
-
createOption("vanilla", "Vanilla CSS")
|
|
110
|
+
createOption("web-scss-mod", "SCSS Modules"),
|
|
111
|
+
createOption("web-test-tailwind", "Tailwind", { state: "recommended" }),
|
|
112
|
+
createOption("web-test-styled", "Styled Components"),
|
|
113
|
+
createOption("web-test-vanilla", "Vanilla CSS")
|
|
116
114
|
],
|
|
117
115
|
{ required: true }
|
|
118
116
|
),
|
|
119
117
|
createCategory("client-state", "Client State", [
|
|
120
|
-
createOption("zustand", "Zustand", { state: "recommended" }),
|
|
121
|
-
createOption("jotai", "Jotai"),
|
|
122
|
-
createOption("redux", "Redux", { state: "discouraged" }),
|
|
123
|
-
createOption("mobx", "MobX")
|
|
118
|
+
createOption("web-test-zustand", "Zustand", { state: "recommended" }),
|
|
119
|
+
createOption("web-test-jotai", "Jotai"),
|
|
120
|
+
createOption("web-test-redux", "Redux", { state: "discouraged" }),
|
|
121
|
+
createOption("web-test-mobx", "MobX")
|
|
124
122
|
])
|
|
125
123
|
];
|
|
126
124
|
var defaultProps = {
|
|
@@ -131,8 +129,7 @@ var defaultProps = {
|
|
|
131
129
|
expertMode: false,
|
|
132
130
|
onToggle: vi.fn(),
|
|
133
131
|
onFocusChange: vi.fn(),
|
|
134
|
-
onToggleDescriptions: vi.fn()
|
|
135
|
-
onToggleExpertMode: vi.fn()
|
|
132
|
+
onToggleDescriptions: vi.fn()
|
|
136
133
|
};
|
|
137
134
|
var renderGrid = (props = {}) => {
|
|
138
135
|
return render(/* @__PURE__ */ jsx(CategoryGrid, { ...defaultProps, ...props }));
|
|
@@ -142,7 +139,6 @@ describe("CategoryGrid component", () => {
|
|
|
142
139
|
afterEach(() => {
|
|
143
140
|
cleanup?.();
|
|
144
141
|
cleanup = void 0;
|
|
145
|
-
vi.clearAllMocks();
|
|
146
142
|
});
|
|
147
143
|
describe("rendering", () => {
|
|
148
144
|
it("should render all categories as sections", () => {
|
|
@@ -178,23 +174,6 @@ describe("CategoryGrid component", () => {
|
|
|
178
174
|
const output = lastFrame();
|
|
179
175
|
globalExpect(output).not.toContain("(optional)");
|
|
180
176
|
});
|
|
181
|
-
it("should render legend row with visual states", () => {
|
|
182
|
-
const { lastFrame, unmount } = renderGrid();
|
|
183
|
-
cleanup = unmount;
|
|
184
|
-
const output = lastFrame();
|
|
185
|
-
globalExpect(output).toContain("Legend:");
|
|
186
|
-
globalExpect(output).toContain("selected");
|
|
187
|
-
globalExpect(output).toContain("recommended");
|
|
188
|
-
globalExpect(output).toContain("discouraged");
|
|
189
|
-
globalExpect(output).toContain("disabled");
|
|
190
|
-
});
|
|
191
|
-
it("should render header with toggle hints", () => {
|
|
192
|
-
const { lastFrame, unmount } = renderGrid();
|
|
193
|
-
cleanup = unmount;
|
|
194
|
-
const output = lastFrame();
|
|
195
|
-
globalExpect(output).toContain("[d] Descriptions");
|
|
196
|
-
globalExpect(output).toContain("[e] Expert Mode");
|
|
197
|
-
});
|
|
198
177
|
it("should handle empty categories array", () => {
|
|
199
178
|
const { lastFrame, unmount } = renderGrid({ categories: [] });
|
|
200
179
|
cleanup = unmount;
|
|
@@ -237,9 +216,9 @@ describe("CategoryGrid component", () => {
|
|
|
237
216
|
});
|
|
238
217
|
it("should show disabled options with dimmed styling", () => {
|
|
239
218
|
const categories = [
|
|
240
|
-
createCategory("
|
|
241
|
-
createOption("opt1", "Option 1"),
|
|
242
|
-
createOption("opt2", "Option 2", { state: "disabled" })
|
|
219
|
+
createCategory("testing", "Test", [
|
|
220
|
+
createOption("web-test-opt1", "Option 1"),
|
|
221
|
+
createOption("web-test-opt2", "Option 2", { state: "disabled" })
|
|
243
222
|
])
|
|
244
223
|
];
|
|
245
224
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -270,10 +249,10 @@ describe("CategoryGrid component", () => {
|
|
|
270
249
|
it("should not lock any sections when no framework category exists", () => {
|
|
271
250
|
const categoriesNoFramework = [
|
|
272
251
|
createCategory("styling", "Styling", [
|
|
273
|
-
createOption("scss", "SCSS"),
|
|
274
|
-
createOption("tailwind", "Tailwind")
|
|
252
|
+
createOption("web-test-scss", "SCSS"),
|
|
253
|
+
createOption("web-test-tailwind", "Tailwind")
|
|
275
254
|
]),
|
|
276
|
-
createCategory("state", "State", [createOption("zustand", "Zustand")])
|
|
255
|
+
createCategory("client-state", "State", [createOption("web-test-zustand", "Zustand")])
|
|
277
256
|
];
|
|
278
257
|
const { lastFrame, unmount } = renderGrid({
|
|
279
258
|
categories: categoriesNoFramework
|
|
@@ -488,7 +467,7 @@ describe("CategoryGrid component", () => {
|
|
|
488
467
|
await delay(RENDER_DELAY_MS);
|
|
489
468
|
await stdin.write(" ");
|
|
490
469
|
await delay(INPUT_DELAY_MS);
|
|
491
|
-
globalExpect(onToggle).toHaveBeenCalledWith("framework", "vue");
|
|
470
|
+
globalExpect(onToggle).toHaveBeenCalledWith("framework", "web-test-vue");
|
|
492
471
|
});
|
|
493
472
|
it("should call onToggle when pressing space on a selected option", async () => {
|
|
494
473
|
const onToggle = vi.fn();
|
|
@@ -497,8 +476,8 @@ describe("CategoryGrid component", () => {
|
|
|
497
476
|
"framework",
|
|
498
477
|
"Framework",
|
|
499
478
|
[
|
|
500
|
-
createOption("react", "React", { selected: true }),
|
|
501
|
-
createOption("vue", "Vue")
|
|
479
|
+
createOption("web-test-react", "React", { selected: true }),
|
|
480
|
+
createOption("web-test-vue", "Vue")
|
|
502
481
|
],
|
|
503
482
|
{ required: true }
|
|
504
483
|
)
|
|
@@ -515,14 +494,14 @@ describe("CategoryGrid component", () => {
|
|
|
515
494
|
await delay(RENDER_DELAY_MS);
|
|
516
495
|
await stdin.write(" ");
|
|
517
496
|
await delay(INPUT_DELAY_MS);
|
|
518
|
-
globalExpect(onToggle).toHaveBeenCalledWith("framework", "react");
|
|
497
|
+
globalExpect(onToggle).toHaveBeenCalledWith("framework", "web-test-react");
|
|
519
498
|
});
|
|
520
499
|
it("should NOT call onToggle when pressing space on a disabled option", async () => {
|
|
521
500
|
const onToggle = vi.fn();
|
|
522
501
|
const categories = [
|
|
523
|
-
createCategory("
|
|
524
|
-
createOption("opt1", "Option 1", { state: "disabled" }),
|
|
525
|
-
createOption("opt2", "Option 2")
|
|
502
|
+
createCategory("testing", "Test", [
|
|
503
|
+
createOption("web-test-opt1", "Option 1", { state: "disabled" }),
|
|
504
|
+
createOption("web-test-opt2", "Option 2")
|
|
526
505
|
])
|
|
527
506
|
];
|
|
528
507
|
const { stdin, unmount } = renderGrid({
|
|
@@ -558,10 +537,10 @@ describe("CategoryGrid component", () => {
|
|
|
558
537
|
it("should skip disabled options when navigating right", async () => {
|
|
559
538
|
const onFocusChange = vi.fn();
|
|
560
539
|
const categories = [
|
|
561
|
-
createCategory("
|
|
562
|
-
createOption("opt1", "Option 1"),
|
|
563
|
-
createOption("opt2", "Option 2", { state: "disabled" }),
|
|
564
|
-
createOption("opt3", "Option 3")
|
|
540
|
+
createCategory("testing", "Test", [
|
|
541
|
+
createOption("web-test-opt1", "Option 1"),
|
|
542
|
+
createOption("web-test-opt2", "Option 2", { state: "disabled" }),
|
|
543
|
+
createOption("web-test-opt3", "Option 3")
|
|
565
544
|
])
|
|
566
545
|
];
|
|
567
546
|
const { stdin, unmount } = renderGrid({
|
|
@@ -580,10 +559,10 @@ describe("CategoryGrid component", () => {
|
|
|
580
559
|
it("should skip disabled options when navigating left", async () => {
|
|
581
560
|
const onFocusChange = vi.fn();
|
|
582
561
|
const categories = [
|
|
583
|
-
createCategory("
|
|
584
|
-
createOption("opt1", "Option 1"),
|
|
585
|
-
createOption("opt2", "Option 2", { state: "disabled" }),
|
|
586
|
-
createOption("opt3", "Option 3")
|
|
562
|
+
createCategory("testing", "Test", [
|
|
563
|
+
createOption("web-test-opt1", "Option 1"),
|
|
564
|
+
createOption("web-test-opt2", "Option 2", { state: "disabled" }),
|
|
565
|
+
createOption("web-test-opt3", "Option 3")
|
|
587
566
|
])
|
|
588
567
|
];
|
|
589
568
|
const { stdin, unmount } = renderGrid({
|
|
@@ -603,9 +582,9 @@ describe("CategoryGrid component", () => {
|
|
|
603
582
|
it("should handle all options disabled in a row", async () => {
|
|
604
583
|
const onFocusChange = vi.fn();
|
|
605
584
|
const categories = [
|
|
606
|
-
createCategory("
|
|
607
|
-
createOption("opt1", "Option 1", { state: "disabled" }),
|
|
608
|
-
createOption("opt2", "Option 2", { state: "disabled" })
|
|
585
|
+
createCategory("testing", "Test", [
|
|
586
|
+
createOption("web-test-opt1", "Option 1", { state: "disabled" }),
|
|
587
|
+
createOption("web-test-opt2", "Option 2", { state: "disabled" })
|
|
609
588
|
])
|
|
610
589
|
];
|
|
611
590
|
const { stdin, unmount } = renderGrid({
|
|
@@ -683,57 +662,21 @@ describe("CategoryGrid component", () => {
|
|
|
683
662
|
const output = lastFrame();
|
|
684
663
|
globalExpect(output).toBeDefined();
|
|
685
664
|
});
|
|
686
|
-
it("should show
|
|
687
|
-
const { lastFrame
|
|
688
|
-
showDescriptions: false
|
|
689
|
-
});
|
|
690
|
-
const output1 = frame1();
|
|
691
|
-
unmount1();
|
|
692
|
-
const { lastFrame: frame2, unmount: unmount2 } = renderGrid({
|
|
665
|
+
it("should show descriptions when enabled", () => {
|
|
666
|
+
const { lastFrame, unmount } = renderGrid({
|
|
693
667
|
showDescriptions: true
|
|
694
668
|
});
|
|
695
|
-
cleanup = unmount2;
|
|
696
|
-
const output2 = frame2();
|
|
697
|
-
globalExpect(output1).toContain("Descriptions: OFF");
|
|
698
|
-
globalExpect(output2).toContain("Descriptions: ON");
|
|
699
|
-
});
|
|
700
|
-
});
|
|
701
|
-
describe("expert mode toggle", () => {
|
|
702
|
-
it("should call onToggleExpertMode when pressing e", async () => {
|
|
703
|
-
const onToggleExpertMode = vi.fn();
|
|
704
|
-
const { stdin, unmount } = renderGrid({
|
|
705
|
-
onToggleExpertMode
|
|
706
|
-
});
|
|
707
669
|
cleanup = unmount;
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
await delay(INPUT_DELAY_MS);
|
|
711
|
-
globalExpect(onToggleExpertMode).toHaveBeenCalled();
|
|
670
|
+
const output = lastFrame();
|
|
671
|
+
globalExpect(output).toContain("Popular choice");
|
|
712
672
|
});
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
});
|
|
673
|
+
});
|
|
674
|
+
describe("expert mode", () => {
|
|
675
|
+
it("should not handle expert mode toggle locally (handled globally)", () => {
|
|
676
|
+
const { lastFrame, unmount } = renderGrid();
|
|
718
677
|
cleanup = unmount;
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
await delay(INPUT_DELAY_MS);
|
|
722
|
-
globalExpect(onToggleExpertMode).toHaveBeenCalled();
|
|
723
|
-
});
|
|
724
|
-
it("should show toggle state in header", () => {
|
|
725
|
-
const { lastFrame: frame1, unmount: unmount1 } = renderGrid({
|
|
726
|
-
expertMode: false
|
|
727
|
-
});
|
|
728
|
-
const output1 = frame1();
|
|
729
|
-
unmount1();
|
|
730
|
-
const { lastFrame: frame2, unmount: unmount2 } = renderGrid({
|
|
731
|
-
expertMode: true
|
|
732
|
-
});
|
|
733
|
-
cleanup = unmount2;
|
|
734
|
-
const output2 = frame2();
|
|
735
|
-
globalExpect(output1).toContain("Expert Mode: OFF");
|
|
736
|
-
globalExpect(output2).toContain("Expert Mode: ON");
|
|
678
|
+
const output = lastFrame();
|
|
679
|
+
globalExpect(output).not.toContain("[e] Expert Mode");
|
|
737
680
|
});
|
|
738
681
|
});
|
|
739
682
|
describe("option ordering", () => {
|
|
@@ -753,9 +696,7 @@ describe("CategoryGrid component", () => {
|
|
|
753
696
|
describe("edge cases", () => {
|
|
754
697
|
it("should handle single category", () => {
|
|
755
698
|
const categories = [
|
|
756
|
-
createCategory("
|
|
757
|
-
createOption("opt1", "Option 1")
|
|
758
|
-
])
|
|
699
|
+
createCategory("forms", "Single Category", [createOption("web-test-opt1", "Option 1")])
|
|
759
700
|
];
|
|
760
701
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
761
702
|
cleanup = unmount;
|
|
@@ -765,9 +706,7 @@ describe("CategoryGrid component", () => {
|
|
|
765
706
|
});
|
|
766
707
|
it("should handle single option in category", () => {
|
|
767
708
|
const categories = [
|
|
768
|
-
createCategory("
|
|
769
|
-
createOption("only", "Only Option")
|
|
770
|
-
])
|
|
709
|
+
createCategory("forms", "Single", [createOption("web-test-only", "Only Option")])
|
|
771
710
|
];
|
|
772
711
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
773
712
|
cleanup = unmount;
|
|
@@ -777,11 +716,9 @@ describe("CategoryGrid component", () => {
|
|
|
777
716
|
it("should handle category with many options (flows naturally)", () => {
|
|
778
717
|
const options = Array.from(
|
|
779
718
|
{ length: 10 },
|
|
780
|
-
(_, i) => createOption(`opt${i}`, `Option ${i}`)
|
|
719
|
+
(_, i) => createOption(`web-test-opt${i}`, `Option ${i}`)
|
|
781
720
|
);
|
|
782
|
-
const categories = [
|
|
783
|
-
createCategory("many", "Many Options", options)
|
|
784
|
-
];
|
|
721
|
+
const categories = [createCategory("mocking", "Many Options", options)];
|
|
785
722
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
786
723
|
cleanup = unmount;
|
|
787
724
|
const output = lastFrame();
|
|
@@ -791,9 +728,9 @@ describe("CategoryGrid component", () => {
|
|
|
791
728
|
});
|
|
792
729
|
it("should handle long option labels", () => {
|
|
793
730
|
const categories = [
|
|
794
|
-
createCategory("
|
|
795
|
-
createOption("long1", "Very Long Option Name"),
|
|
796
|
-
createOption("long2", "Another Long Name")
|
|
731
|
+
createCategory("i18n", "Long Labels", [
|
|
732
|
+
createOption("web-test-long1", "Very Long Option Name"),
|
|
733
|
+
createOption("web-test-long2", "Another Long Name")
|
|
797
734
|
])
|
|
798
735
|
];
|
|
799
736
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -803,17 +740,15 @@ describe("CategoryGrid component", () => {
|
|
|
803
740
|
});
|
|
804
741
|
it("should handle categories with different option counts", () => {
|
|
805
742
|
const categories = [
|
|
806
|
-
createCategory("
|
|
807
|
-
createOption("opt1", "Option 1"),
|
|
808
|
-
createOption("opt2", "Option 2")
|
|
743
|
+
createCategory("framework", "Category 1", [
|
|
744
|
+
createOption("web-test-opt1", "Option 1"),
|
|
745
|
+
createOption("web-test-opt2", "Option 2")
|
|
809
746
|
]),
|
|
810
|
-
createCategory("
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
createOption("
|
|
815
|
-
createOption("opt5", "Option 5"),
|
|
816
|
-
createOption("opt6", "Option 6")
|
|
747
|
+
createCategory("styling", "Category 2", [createOption("web-test-opt3", "Option 3")]),
|
|
748
|
+
createCategory("client-state", "Category 3", [
|
|
749
|
+
createOption("web-test-opt4", "Option 4"),
|
|
750
|
+
createOption("web-test-opt5", "Option 5"),
|
|
751
|
+
createOption("web-test-opt6", "Option 6")
|
|
817
752
|
])
|
|
818
753
|
];
|
|
819
754
|
const { lastFrame, unmount } = renderGrid({ categories });
|
|
@@ -832,16 +767,14 @@ describe("CategoryGrid component", () => {
|
|
|
832
767
|
"framework",
|
|
833
768
|
"Framework",
|
|
834
769
|
[
|
|
835
|
-
createOption("opt1", "Option 1", { selected: true }),
|
|
770
|
+
createOption("web-test-opt1", "Option 1", { selected: true }),
|
|
836
771
|
// Framework selected
|
|
837
|
-
createOption("opt2", "Option 2"),
|
|
838
|
-
createOption("opt3", "Option 3")
|
|
772
|
+
createOption("web-test-opt2", "Option 2"),
|
|
773
|
+
createOption("web-test-opt3", "Option 3")
|
|
839
774
|
],
|
|
840
775
|
{ required: true }
|
|
841
776
|
),
|
|
842
|
-
createCategory("
|
|
843
|
-
createOption("opt4", "Option 4")
|
|
844
|
-
])
|
|
777
|
+
createCategory("styling", "Category 2", [createOption("web-test-opt4", "Option 4")])
|
|
845
778
|
];
|
|
846
779
|
const { stdin, unmount } = renderGrid({
|
|
847
780
|
categories,
|
|
@@ -857,5 +790,54 @@ describe("CategoryGrid component", () => {
|
|
|
857
790
|
globalExpect(onFocusChange).toHaveBeenCalledWith(1, 0);
|
|
858
791
|
});
|
|
859
792
|
});
|
|
793
|
+
describe("installed indicator", () => {
|
|
794
|
+
it("should show checkmark for installed skill", () => {
|
|
795
|
+
const categories = [
|
|
796
|
+
createCategory("forms", "Forms", [
|
|
797
|
+
createOption("web-test-opt1", "Option 1", { installed: true })
|
|
798
|
+
])
|
|
799
|
+
];
|
|
800
|
+
const { lastFrame, unmount } = renderGrid({ categories });
|
|
801
|
+
cleanup = unmount;
|
|
802
|
+
const output = lastFrame();
|
|
803
|
+
globalExpect(output).toContain("\u2713");
|
|
804
|
+
globalExpect(output).toContain("Option 1");
|
|
805
|
+
});
|
|
806
|
+
it("should NOT show checkmark for non-installed skill", () => {
|
|
807
|
+
const categories = [
|
|
808
|
+
createCategory("forms", "Forms", [createOption("web-test-opt1", "Option 1")])
|
|
809
|
+
];
|
|
810
|
+
const { lastFrame, unmount } = renderGrid({ categories });
|
|
811
|
+
cleanup = unmount;
|
|
812
|
+
const output = lastFrame();
|
|
813
|
+
globalExpect(output).not.toContain("\u2713");
|
|
814
|
+
globalExpect(output).toContain("Option 1");
|
|
815
|
+
});
|
|
816
|
+
it("should show both checkmark and cyan styling when installed and selected", () => {
|
|
817
|
+
const categories = [
|
|
818
|
+
createCategory("forms", "Forms", [
|
|
819
|
+
createOption("web-test-opt1", "Option 1", { installed: true, selected: true })
|
|
820
|
+
])
|
|
821
|
+
];
|
|
822
|
+
const { lastFrame, unmount } = renderGrid({ categories });
|
|
823
|
+
cleanup = unmount;
|
|
824
|
+
const output = lastFrame();
|
|
825
|
+
globalExpect(output).toContain("\u2713");
|
|
826
|
+
globalExpect(output).toContain("Option 1");
|
|
827
|
+
});
|
|
828
|
+
it("should show both L badge and checkmark when local and installed", () => {
|
|
829
|
+
const categories = [
|
|
830
|
+
createCategory("forms", "Forms", [
|
|
831
|
+
createOption("web-test-opt1", "Option 1", { local: true, installed: true })
|
|
832
|
+
])
|
|
833
|
+
];
|
|
834
|
+
const { lastFrame, unmount } = renderGrid({ categories });
|
|
835
|
+
cleanup = unmount;
|
|
836
|
+
const output = lastFrame();
|
|
837
|
+
globalExpect(output).toContain("L");
|
|
838
|
+
globalExpect(output).toContain("\u2713");
|
|
839
|
+
globalExpect(output).toContain("Option 1");
|
|
840
|
+
});
|
|
841
|
+
});
|
|
860
842
|
});
|
|
861
843
|
//# sourceMappingURL=category-grid.test.js.map
|