@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,500 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
ARROW_DOWN,
|
|
4
|
+
ARROW_LEFT,
|
|
5
|
+
ARROW_RIGHT,
|
|
6
|
+
ARROW_UP,
|
|
7
|
+
ENTER,
|
|
8
|
+
ESCAPE,
|
|
9
|
+
INPUT_DELAY_MS,
|
|
10
|
+
RENDER_DELAY_MS,
|
|
11
|
+
SPACE,
|
|
12
|
+
delay
|
|
13
|
+
} from "../../chunk-DBRUQQUF.js";
|
|
14
|
+
import {
|
|
15
|
+
render
|
|
16
|
+
} from "../../chunk-REJGRCVQ.js";
|
|
17
|
+
import {
|
|
18
|
+
afterEach,
|
|
19
|
+
describe,
|
|
20
|
+
globalExpect,
|
|
21
|
+
it,
|
|
22
|
+
vi
|
|
23
|
+
} from "../../chunk-QR2EBWL2.js";
|
|
24
|
+
import {
|
|
25
|
+
SourceGrid
|
|
26
|
+
} from "../../chunk-ZW2PELOH.js";
|
|
27
|
+
import "../../chunk-4S4FCAA2.js";
|
|
28
|
+
import {
|
|
29
|
+
init_esm_shims
|
|
30
|
+
} from "../../chunk-AWKZ5BDL.js";
|
|
31
|
+
|
|
32
|
+
// src/cli/components/wizard/source-grid.test.tsx
|
|
33
|
+
init_esm_shims();
|
|
34
|
+
import { jsx } from "react/jsx-runtime";
|
|
35
|
+
var createSourceOption = (id, label, overrides = {}) => ({
|
|
36
|
+
id,
|
|
37
|
+
label,
|
|
38
|
+
selected: false,
|
|
39
|
+
installed: false,
|
|
40
|
+
...overrides
|
|
41
|
+
});
|
|
42
|
+
var createSourceRow = (skillId, displayName, options) => ({
|
|
43
|
+
skillId,
|
|
44
|
+
displayName,
|
|
45
|
+
alias: displayName,
|
|
46
|
+
options
|
|
47
|
+
});
|
|
48
|
+
var defaultRows = [
|
|
49
|
+
createSourceRow("web-framework-react", "react", [
|
|
50
|
+
createSourceOption("public", "Public", { selected: true })
|
|
51
|
+
]),
|
|
52
|
+
createSourceRow("web-state-zustand", "zustand", [
|
|
53
|
+
createSourceOption("public", "Public", { selected: true })
|
|
54
|
+
]),
|
|
55
|
+
createSourceRow("web-testing-vitest", "vitest", [
|
|
56
|
+
createSourceOption("public", "Public", { selected: true })
|
|
57
|
+
])
|
|
58
|
+
];
|
|
59
|
+
var multiSourceRows = [
|
|
60
|
+
createSourceRow("web-framework-react", "react", [
|
|
61
|
+
createSourceOption("public", "Public", { selected: true }),
|
|
62
|
+
createSourceOption("acme-corp", "Acme Corp")
|
|
63
|
+
]),
|
|
64
|
+
createSourceRow("web-state-zustand", "zustand", [
|
|
65
|
+
createSourceOption("public", "Public", { selected: true }),
|
|
66
|
+
createSourceOption("acme-corp", "Acme Corp"),
|
|
67
|
+
createSourceOption("internal", "Internal")
|
|
68
|
+
])
|
|
69
|
+
];
|
|
70
|
+
var defaultProps = {
|
|
71
|
+
rows: defaultRows,
|
|
72
|
+
focusedRow: 0,
|
|
73
|
+
focusedCol: 0,
|
|
74
|
+
onSelect: vi.fn(),
|
|
75
|
+
onFocusChange: vi.fn()
|
|
76
|
+
};
|
|
77
|
+
var renderGrid = (props = {}) => {
|
|
78
|
+
return render(/* @__PURE__ */ jsx(SourceGrid, { ...defaultProps, ...props }));
|
|
79
|
+
};
|
|
80
|
+
describe("SourceGrid component", () => {
|
|
81
|
+
let cleanup;
|
|
82
|
+
afterEach(() => {
|
|
83
|
+
cleanup?.();
|
|
84
|
+
cleanup = void 0;
|
|
85
|
+
});
|
|
86
|
+
describe("rendering", () => {
|
|
87
|
+
it("should render all skill rows", () => {
|
|
88
|
+
const { lastFrame, unmount } = renderGrid();
|
|
89
|
+
cleanup = unmount;
|
|
90
|
+
const output = lastFrame();
|
|
91
|
+
globalExpect(output).toContain("react");
|
|
92
|
+
globalExpect(output).toContain("zustand");
|
|
93
|
+
globalExpect(output).toContain("vitest");
|
|
94
|
+
});
|
|
95
|
+
it("should render source option labels", () => {
|
|
96
|
+
const { lastFrame, unmount } = renderGrid();
|
|
97
|
+
cleanup = unmount;
|
|
98
|
+
const output = lastFrame();
|
|
99
|
+
globalExpect(output).toContain("Public");
|
|
100
|
+
});
|
|
101
|
+
it("should render multiple source options per row", () => {
|
|
102
|
+
const { lastFrame, unmount } = renderGrid({ rows: multiSourceRows });
|
|
103
|
+
cleanup = unmount;
|
|
104
|
+
const output = lastFrame();
|
|
105
|
+
globalExpect(output).toContain("Public");
|
|
106
|
+
globalExpect(output).toContain("Acme Corp");
|
|
107
|
+
});
|
|
108
|
+
it("should handle empty rows array", () => {
|
|
109
|
+
const { lastFrame, unmount } = renderGrid({ rows: [] });
|
|
110
|
+
cleanup = unmount;
|
|
111
|
+
const output = lastFrame();
|
|
112
|
+
globalExpect(output).toContain("No skills to display");
|
|
113
|
+
});
|
|
114
|
+
it("should render single row", () => {
|
|
115
|
+
const rows = [
|
|
116
|
+
createSourceRow("web-framework-react", "react", [
|
|
117
|
+
createSourceOption("public", "Public", { selected: true })
|
|
118
|
+
])
|
|
119
|
+
];
|
|
120
|
+
const { lastFrame, unmount } = renderGrid({ rows });
|
|
121
|
+
cleanup = unmount;
|
|
122
|
+
const output = lastFrame();
|
|
123
|
+
globalExpect(output).toContain("react");
|
|
124
|
+
globalExpect(output).toContain("Public");
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe("keyboard navigation - vertical", () => {
|
|
128
|
+
it("should move down with arrow down", async () => {
|
|
129
|
+
const onFocusChange = vi.fn();
|
|
130
|
+
const { stdin, unmount } = renderGrid({
|
|
131
|
+
focusedRow: 0,
|
|
132
|
+
focusedCol: 0,
|
|
133
|
+
onFocusChange
|
|
134
|
+
});
|
|
135
|
+
cleanup = unmount;
|
|
136
|
+
await delay(RENDER_DELAY_MS);
|
|
137
|
+
stdin.write(ARROW_DOWN);
|
|
138
|
+
await delay(INPUT_DELAY_MS);
|
|
139
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(1, 0);
|
|
140
|
+
});
|
|
141
|
+
it("should move up with arrow up", async () => {
|
|
142
|
+
const onFocusChange = vi.fn();
|
|
143
|
+
const { stdin, unmount } = renderGrid({
|
|
144
|
+
focusedRow: 1,
|
|
145
|
+
focusedCol: 0,
|
|
146
|
+
onFocusChange
|
|
147
|
+
});
|
|
148
|
+
cleanup = unmount;
|
|
149
|
+
await delay(RENDER_DELAY_MS);
|
|
150
|
+
stdin.write(ARROW_UP);
|
|
151
|
+
await delay(INPUT_DELAY_MS);
|
|
152
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
|
|
153
|
+
});
|
|
154
|
+
it("should wrap down to first row from last row", async () => {
|
|
155
|
+
const onFocusChange = vi.fn();
|
|
156
|
+
const { stdin, unmount } = renderGrid({
|
|
157
|
+
focusedRow: 2,
|
|
158
|
+
// Last row (Vitest)
|
|
159
|
+
focusedCol: 0,
|
|
160
|
+
onFocusChange
|
|
161
|
+
});
|
|
162
|
+
cleanup = unmount;
|
|
163
|
+
await delay(RENDER_DELAY_MS);
|
|
164
|
+
stdin.write(ARROW_DOWN);
|
|
165
|
+
await delay(INPUT_DELAY_MS);
|
|
166
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
|
|
167
|
+
});
|
|
168
|
+
it("should wrap up to last row from first row", async () => {
|
|
169
|
+
const onFocusChange = vi.fn();
|
|
170
|
+
const { stdin, unmount } = renderGrid({
|
|
171
|
+
focusedRow: 0,
|
|
172
|
+
focusedCol: 0,
|
|
173
|
+
onFocusChange
|
|
174
|
+
});
|
|
175
|
+
cleanup = unmount;
|
|
176
|
+
await delay(RENDER_DELAY_MS);
|
|
177
|
+
stdin.write(ARROW_UP);
|
|
178
|
+
await delay(INPUT_DELAY_MS);
|
|
179
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(2, 0);
|
|
180
|
+
});
|
|
181
|
+
it("should clamp column when moving to row with fewer options", async () => {
|
|
182
|
+
const onFocusChange = vi.fn();
|
|
183
|
+
const { stdin, unmount } = renderGrid({
|
|
184
|
+
rows: multiSourceRows,
|
|
185
|
+
focusedRow: 1,
|
|
186
|
+
// Zustand has 3 options
|
|
187
|
+
focusedCol: 2,
|
|
188
|
+
// Internal (index 2)
|
|
189
|
+
onFocusChange
|
|
190
|
+
});
|
|
191
|
+
cleanup = unmount;
|
|
192
|
+
await delay(RENDER_DELAY_MS);
|
|
193
|
+
stdin.write(ARROW_UP);
|
|
194
|
+
await delay(INPUT_DELAY_MS);
|
|
195
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe("keyboard navigation - horizontal", () => {
|
|
199
|
+
it("should move right with arrow right", async () => {
|
|
200
|
+
const onFocusChange = vi.fn();
|
|
201
|
+
const { stdin, unmount } = renderGrid({
|
|
202
|
+
rows: multiSourceRows,
|
|
203
|
+
focusedRow: 0,
|
|
204
|
+
focusedCol: 0,
|
|
205
|
+
onFocusChange
|
|
206
|
+
});
|
|
207
|
+
cleanup = unmount;
|
|
208
|
+
await delay(RENDER_DELAY_MS);
|
|
209
|
+
stdin.write(ARROW_RIGHT);
|
|
210
|
+
await delay(INPUT_DELAY_MS);
|
|
211
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
|
|
212
|
+
});
|
|
213
|
+
it("should move left with arrow left", async () => {
|
|
214
|
+
const onFocusChange = vi.fn();
|
|
215
|
+
const { stdin, unmount } = renderGrid({
|
|
216
|
+
rows: multiSourceRows,
|
|
217
|
+
focusedRow: 0,
|
|
218
|
+
focusedCol: 1,
|
|
219
|
+
onFocusChange
|
|
220
|
+
});
|
|
221
|
+
cleanup = unmount;
|
|
222
|
+
await delay(RENDER_DELAY_MS);
|
|
223
|
+
stdin.write(ARROW_LEFT);
|
|
224
|
+
await delay(INPUT_DELAY_MS);
|
|
225
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
|
|
226
|
+
});
|
|
227
|
+
it("should wrap right to first column from last column", async () => {
|
|
228
|
+
const onFocusChange = vi.fn();
|
|
229
|
+
const { stdin, unmount } = renderGrid({
|
|
230
|
+
rows: multiSourceRows,
|
|
231
|
+
focusedRow: 0,
|
|
232
|
+
focusedCol: 1,
|
|
233
|
+
// Last option in React row
|
|
234
|
+
onFocusChange
|
|
235
|
+
});
|
|
236
|
+
cleanup = unmount;
|
|
237
|
+
await delay(RENDER_DELAY_MS);
|
|
238
|
+
stdin.write(ARROW_RIGHT);
|
|
239
|
+
await delay(INPUT_DELAY_MS);
|
|
240
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
|
|
241
|
+
});
|
|
242
|
+
it("should wrap left to last column from first column", async () => {
|
|
243
|
+
const onFocusChange = vi.fn();
|
|
244
|
+
const { stdin, unmount } = renderGrid({
|
|
245
|
+
rows: multiSourceRows,
|
|
246
|
+
focusedRow: 0,
|
|
247
|
+
focusedCol: 0,
|
|
248
|
+
onFocusChange
|
|
249
|
+
});
|
|
250
|
+
cleanup = unmount;
|
|
251
|
+
await delay(RENDER_DELAY_MS);
|
|
252
|
+
stdin.write(ARROW_LEFT);
|
|
253
|
+
await delay(INPUT_DELAY_MS);
|
|
254
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe("selection", () => {
|
|
258
|
+
it("should call onSelect when pressing space", async () => {
|
|
259
|
+
const onSelect = vi.fn();
|
|
260
|
+
const { stdin, unmount } = renderGrid({
|
|
261
|
+
focusedRow: 0,
|
|
262
|
+
focusedCol: 0,
|
|
263
|
+
onSelect
|
|
264
|
+
});
|
|
265
|
+
cleanup = unmount;
|
|
266
|
+
await delay(RENDER_DELAY_MS);
|
|
267
|
+
stdin.write(" ");
|
|
268
|
+
await delay(INPUT_DELAY_MS);
|
|
269
|
+
globalExpect(onSelect).toHaveBeenCalledWith("web-framework-react", "public");
|
|
270
|
+
});
|
|
271
|
+
it("should call onSelect with correct skill and source IDs", async () => {
|
|
272
|
+
const onSelect = vi.fn();
|
|
273
|
+
const { stdin, unmount } = renderGrid({
|
|
274
|
+
rows: multiSourceRows,
|
|
275
|
+
focusedRow: 0,
|
|
276
|
+
focusedCol: 1,
|
|
277
|
+
// Acme Corp
|
|
278
|
+
onSelect
|
|
279
|
+
});
|
|
280
|
+
cleanup = unmount;
|
|
281
|
+
await delay(RENDER_DELAY_MS);
|
|
282
|
+
stdin.write(" ");
|
|
283
|
+
await delay(INPUT_DELAY_MS);
|
|
284
|
+
globalExpect(onSelect).toHaveBeenCalledWith("web-framework-react", "acme-corp");
|
|
285
|
+
});
|
|
286
|
+
it("should call onSelect on second row", async () => {
|
|
287
|
+
const onSelect = vi.fn();
|
|
288
|
+
const { stdin, unmount } = renderGrid({
|
|
289
|
+
rows: multiSourceRows,
|
|
290
|
+
focusedRow: 1,
|
|
291
|
+
focusedCol: 2,
|
|
292
|
+
// Internal
|
|
293
|
+
onSelect
|
|
294
|
+
});
|
|
295
|
+
cleanup = unmount;
|
|
296
|
+
await delay(RENDER_DELAY_MS);
|
|
297
|
+
stdin.write(" ");
|
|
298
|
+
await delay(INPUT_DELAY_MS);
|
|
299
|
+
globalExpect(onSelect).toHaveBeenCalledWith("web-state-zustand", "internal");
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe("edge cases", () => {
|
|
303
|
+
it("should handle single option per row", async () => {
|
|
304
|
+
const onFocusChange = vi.fn();
|
|
305
|
+
const { stdin, unmount } = renderGrid({
|
|
306
|
+
focusedRow: 0,
|
|
307
|
+
focusedCol: 0,
|
|
308
|
+
onFocusChange
|
|
309
|
+
});
|
|
310
|
+
cleanup = unmount;
|
|
311
|
+
await delay(RENDER_DELAY_MS);
|
|
312
|
+
stdin.write(ARROW_RIGHT);
|
|
313
|
+
await delay(INPUT_DELAY_MS);
|
|
314
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 0);
|
|
315
|
+
});
|
|
316
|
+
it("should handle many rows", () => {
|
|
317
|
+
const rows = Array.from(
|
|
318
|
+
{ length: 10 },
|
|
319
|
+
(_, i) => createSourceRow(`web-test-${i}`, `test-${i}`, [
|
|
320
|
+
createSourceOption("public", "Public", { selected: true })
|
|
321
|
+
])
|
|
322
|
+
);
|
|
323
|
+
const { lastFrame, unmount } = renderGrid({ rows });
|
|
324
|
+
cleanup = unmount;
|
|
325
|
+
const output = lastFrame();
|
|
326
|
+
globalExpect(output).toContain("test-0");
|
|
327
|
+
globalExpect(output).toContain("test-9");
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
describe("search pill", () => {
|
|
331
|
+
const mockSearch = vi.fn();
|
|
332
|
+
const mockBind = vi.fn();
|
|
333
|
+
const mockSearchStateChange = vi.fn();
|
|
334
|
+
const searchCandidates = [
|
|
335
|
+
{
|
|
336
|
+
id: "web-framework-react-pro",
|
|
337
|
+
sourceUrl: "github:awesome-dev/skills",
|
|
338
|
+
sourceName: "awesome-dev",
|
|
339
|
+
alias: "react",
|
|
340
|
+
version: 3,
|
|
341
|
+
description: "Opinionated React with strict TS"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
id: "web-framework-react-strict",
|
|
345
|
+
sourceUrl: "github:team-xyz/skills",
|
|
346
|
+
sourceName: "team-xyz",
|
|
347
|
+
alias: "react",
|
|
348
|
+
version: 1,
|
|
349
|
+
description: "Strict mode React"
|
|
350
|
+
}
|
|
351
|
+
];
|
|
352
|
+
afterEach(() => {
|
|
353
|
+
mockSearch.mockReset();
|
|
354
|
+
mockBind.mockReset();
|
|
355
|
+
mockSearchStateChange.mockReset();
|
|
356
|
+
});
|
|
357
|
+
it("should render search pill at end of each row when onSearch is provided", () => {
|
|
358
|
+
const { lastFrame, unmount } = renderGrid({
|
|
359
|
+
onSearch: mockSearch
|
|
360
|
+
});
|
|
361
|
+
cleanup = unmount;
|
|
362
|
+
const output = lastFrame();
|
|
363
|
+
globalExpect(output).toContain("Search");
|
|
364
|
+
});
|
|
365
|
+
it("should not render search pill when onSearch is not provided", () => {
|
|
366
|
+
const { lastFrame, unmount } = renderGrid();
|
|
367
|
+
cleanup = unmount;
|
|
368
|
+
const output = lastFrame();
|
|
369
|
+
globalExpect(output).not.toContain("Search");
|
|
370
|
+
});
|
|
371
|
+
it("should navigate to search pill with arrow right", async () => {
|
|
372
|
+
const onFocusChange = vi.fn();
|
|
373
|
+
const { stdin, unmount } = renderGrid({
|
|
374
|
+
rows: defaultRows,
|
|
375
|
+
focusedRow: 0,
|
|
376
|
+
focusedCol: 0,
|
|
377
|
+
// On the only option (Public)
|
|
378
|
+
onFocusChange,
|
|
379
|
+
onSearch: mockSearch
|
|
380
|
+
});
|
|
381
|
+
cleanup = unmount;
|
|
382
|
+
await delay(RENDER_DELAY_MS);
|
|
383
|
+
stdin.write(ARROW_RIGHT);
|
|
384
|
+
await delay(INPUT_DELAY_MS);
|
|
385
|
+
globalExpect(onFocusChange).toHaveBeenCalledWith(0, 1);
|
|
386
|
+
});
|
|
387
|
+
it("should not call onSelect when space is pressed on search pill", async () => {
|
|
388
|
+
const onSelect = vi.fn();
|
|
389
|
+
const { stdin, unmount } = renderGrid({
|
|
390
|
+
rows: defaultRows,
|
|
391
|
+
focusedRow: 0,
|
|
392
|
+
focusedCol: 1,
|
|
393
|
+
// Search pill position (after Public)
|
|
394
|
+
onSelect,
|
|
395
|
+
onSearch: mockSearch
|
|
396
|
+
});
|
|
397
|
+
cleanup = unmount;
|
|
398
|
+
await delay(RENDER_DELAY_MS);
|
|
399
|
+
stdin.write(" ");
|
|
400
|
+
await delay(INPUT_DELAY_MS);
|
|
401
|
+
globalExpect(onSelect).not.toHaveBeenCalled();
|
|
402
|
+
});
|
|
403
|
+
it("should trigger search on Space when search pill is focused", async () => {
|
|
404
|
+
mockSearch.mockResolvedValue(searchCandidates);
|
|
405
|
+
const { stdin, unmount } = renderGrid({
|
|
406
|
+
rows: defaultRows,
|
|
407
|
+
focusedRow: 0,
|
|
408
|
+
focusedCol: 1,
|
|
409
|
+
// Search pill position
|
|
410
|
+
onSearch: mockSearch,
|
|
411
|
+
onSearchStateChange: mockSearchStateChange
|
|
412
|
+
});
|
|
413
|
+
cleanup = unmount;
|
|
414
|
+
await delay(RENDER_DELAY_MS);
|
|
415
|
+
stdin.write(SPACE);
|
|
416
|
+
await delay(INPUT_DELAY_MS);
|
|
417
|
+
globalExpect(mockSearch).toHaveBeenCalledWith("react");
|
|
418
|
+
globalExpect(mockSearchStateChange).toHaveBeenCalledWith(true);
|
|
419
|
+
});
|
|
420
|
+
it("should render modal with results after search completes", async () => {
|
|
421
|
+
mockSearch.mockResolvedValue(searchCandidates);
|
|
422
|
+
const { stdin, lastFrame, unmount } = renderGrid({
|
|
423
|
+
rows: defaultRows,
|
|
424
|
+
focusedRow: 0,
|
|
425
|
+
focusedCol: 1,
|
|
426
|
+
onSearch: mockSearch
|
|
427
|
+
});
|
|
428
|
+
cleanup = unmount;
|
|
429
|
+
await delay(RENDER_DELAY_MS);
|
|
430
|
+
stdin.write(SPACE);
|
|
431
|
+
await delay(RENDER_DELAY_MS);
|
|
432
|
+
const output = lastFrame();
|
|
433
|
+
globalExpect(output).toContain("react");
|
|
434
|
+
globalExpect(output).toContain("awesome-dev");
|
|
435
|
+
globalExpect(output).toContain("team-xyz");
|
|
436
|
+
});
|
|
437
|
+
it("should close modal on Escape without binding", async () => {
|
|
438
|
+
mockSearch.mockResolvedValue(searchCandidates);
|
|
439
|
+
const { stdin, lastFrame, unmount } = renderGrid({
|
|
440
|
+
rows: defaultRows,
|
|
441
|
+
focusedRow: 0,
|
|
442
|
+
focusedCol: 1,
|
|
443
|
+
onSearch: mockSearch,
|
|
444
|
+
onBind: mockBind,
|
|
445
|
+
onSearchStateChange: mockSearchStateChange
|
|
446
|
+
});
|
|
447
|
+
cleanup = unmount;
|
|
448
|
+
await delay(RENDER_DELAY_MS);
|
|
449
|
+
stdin.write(SPACE);
|
|
450
|
+
await delay(RENDER_DELAY_MS);
|
|
451
|
+
stdin.write(ESCAPE);
|
|
452
|
+
await delay(INPUT_DELAY_MS);
|
|
453
|
+
globalExpect(mockBind).not.toHaveBeenCalled();
|
|
454
|
+
globalExpect(mockSearchStateChange).toHaveBeenLastCalledWith(false);
|
|
455
|
+
const output = lastFrame();
|
|
456
|
+
globalExpect(output).not.toContain("awesome-dev");
|
|
457
|
+
});
|
|
458
|
+
it("should not respond to grid navigation while modal is open", async () => {
|
|
459
|
+
mockSearch.mockResolvedValue(searchCandidates);
|
|
460
|
+
const onFocusChange = vi.fn();
|
|
461
|
+
const { stdin, unmount } = renderGrid({
|
|
462
|
+
rows: defaultRows,
|
|
463
|
+
focusedRow: 0,
|
|
464
|
+
focusedCol: 1,
|
|
465
|
+
onSearch: mockSearch,
|
|
466
|
+
onFocusChange
|
|
467
|
+
});
|
|
468
|
+
cleanup = unmount;
|
|
469
|
+
await delay(RENDER_DELAY_MS);
|
|
470
|
+
stdin.write(SPACE);
|
|
471
|
+
await delay(RENDER_DELAY_MS);
|
|
472
|
+
onFocusChange.mockClear();
|
|
473
|
+
stdin.write(ARROW_LEFT);
|
|
474
|
+
await delay(INPUT_DELAY_MS);
|
|
475
|
+
stdin.write(ARROW_RIGHT);
|
|
476
|
+
await delay(INPUT_DELAY_MS);
|
|
477
|
+
globalExpect(onFocusChange).not.toHaveBeenCalled();
|
|
478
|
+
});
|
|
479
|
+
it("should bind result on Enter in modal", async () => {
|
|
480
|
+
mockSearch.mockResolvedValue(searchCandidates);
|
|
481
|
+
const { stdin, unmount } = renderGrid({
|
|
482
|
+
rows: defaultRows,
|
|
483
|
+
focusedRow: 0,
|
|
484
|
+
focusedCol: 1,
|
|
485
|
+
onSearch: mockSearch,
|
|
486
|
+
onBind: mockBind,
|
|
487
|
+
onSearchStateChange: mockSearchStateChange
|
|
488
|
+
});
|
|
489
|
+
cleanup = unmount;
|
|
490
|
+
await delay(RENDER_DELAY_MS);
|
|
491
|
+
stdin.write(SPACE);
|
|
492
|
+
await delay(RENDER_DELAY_MS);
|
|
493
|
+
stdin.write(ENTER);
|
|
494
|
+
await delay(INPUT_DELAY_MS);
|
|
495
|
+
globalExpect(mockBind).toHaveBeenCalledWith(searchCandidates[0]);
|
|
496
|
+
globalExpect(mockSearchStateChange).toHaveBeenLastCalledWith(false);
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
});
|
|
500
|
+
//# sourceMappingURL=source-grid.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/components/wizard/source-grid.test.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"ink-testing-library\";\nimport { describe, expect, it, afterEach, vi } from \"vitest\";\nimport { SourceGrid, type SourceGridProps, type SourceRow, type SourceOption } from \"./source-grid\";\nimport type { BoundSkillCandidate, SkillId } from \"../../types\";\nimport {\n ARROW_UP,\n ARROW_DOWN,\n ARROW_LEFT,\n ARROW_RIGHT,\n ENTER,\n SPACE,\n ESCAPE,\n RENDER_DELAY_MS,\n INPUT_DELAY_MS,\n delay,\n} from \"../../lib/__tests__/test-constants\";\n\nconst createSourceOption = (\n id: string,\n label: string,\n overrides: Partial<SourceOption> = {},\n): SourceOption => ({\n id,\n label,\n selected: false,\n installed: false,\n ...overrides,\n});\n\nconst createSourceRow = (\n skillId: SkillId,\n displayName: string,\n options: SourceOption[],\n): SourceRow => ({\n skillId,\n displayName,\n alias: displayName,\n options,\n});\n\nconst defaultRows: SourceRow[] = [\n createSourceRow(\"web-framework-react\", \"react\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n createSourceRow(\"web-state-zustand\", \"zustand\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n createSourceRow(\"web-testing-vitest\", \"vitest\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n];\n\nconst multiSourceRows: SourceRow[] = [\n createSourceRow(\"web-framework-react\", \"react\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n createSourceOption(\"acme-corp\", \"Acme Corp\"),\n ]),\n createSourceRow(\"web-state-zustand\", \"zustand\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n createSourceOption(\"acme-corp\", \"Acme Corp\"),\n createSourceOption(\"internal\", \"Internal\"),\n ]),\n];\n\nconst defaultProps: SourceGridProps = {\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 0,\n onSelect: vi.fn(),\n onFocusChange: vi.fn(),\n};\n\nconst renderGrid = (props: Partial<SourceGridProps> = {}) => {\n return render(<SourceGrid {...defaultProps} {...props} />);\n};\n\ndescribe(\"SourceGrid component\", () => {\n let cleanup: (() => void) | undefined;\n\n afterEach(() => {\n cleanup?.();\n cleanup = undefined;\n });\n\n describe(\"rendering\", () => {\n it(\"should render all skill rows\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"zustand\");\n expect(output).toContain(\"vitest\");\n });\n\n it(\"should render source option labels\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n });\n\n it(\"should render multiple source options per row\", () => {\n const { lastFrame, unmount } = renderGrid({ rows: multiSourceRows });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Public\");\n expect(output).toContain(\"Acme Corp\");\n });\n\n it(\"should handle empty rows array\", () => {\n const { lastFrame, unmount } = renderGrid({ rows: [] });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"No skills to display\");\n });\n\n it(\"should render single row\", () => {\n const rows: SourceRow[] = [\n createSourceRow(\"web-framework-react\", \"react\", [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n ];\n\n const { lastFrame, unmount } = renderGrid({ rows });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"Public\");\n });\n });\n\n describe(\"keyboard navigation - vertical\", () => {\n it(\"should move down with arrow down\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(1, 0);\n });\n\n it(\"should move up with arrow up\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 1,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap down to first row from last row\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 2, // Last row (Vitest)\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_DOWN);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap up to last row from first row\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(2, 0);\n });\n\n it(\"should clamp column when moving to row with fewer options\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 1, // Zustand has 3 options\n focusedCol: 2, // Internal (index 2)\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_UP);\n await delay(INPUT_DELAY_MS);\n\n // React only has 2 options, so col should be clamped to 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"keyboard navigation - horizontal\", () => {\n it(\"should move right with arrow right\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should move left with arrow left\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 1,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap right to first column from last column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 1, // Last option in React row\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should wrap left to last column from first column\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n });\n\n describe(\"selection\", () => {\n it(\"should call onSelect when pressing space\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onSelect,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).toHaveBeenCalledWith(\"web-framework-react\", \"public\");\n });\n\n it(\"should call onSelect with correct skill and source IDs\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 0,\n focusedCol: 1, // Acme Corp\n onSelect,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).toHaveBeenCalledWith(\"web-framework-react\", \"acme-corp\");\n });\n\n it(\"should call onSelect on second row\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: multiSourceRows,\n focusedRow: 1,\n focusedCol: 2, // Internal\n onSelect,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).toHaveBeenCalledWith(\"web-state-zustand\", \"internal\");\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle single option per row\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n focusedRow: 0,\n focusedCol: 0,\n onFocusChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Should wrap to 0 (only one option)\n expect(onFocusChange).toHaveBeenCalledWith(0, 0);\n });\n\n it(\"should handle many rows\", () => {\n const rows: SourceRow[] = Array.from({ length: 10 }, (_, i) =>\n createSourceRow(`web-test-${i}`, `test-${i}`, [\n createSourceOption(\"public\", \"Public\", { selected: true }),\n ]),\n );\n\n const { lastFrame, unmount } = renderGrid({ rows });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"test-0\");\n expect(output).toContain(\"test-9\");\n });\n });\n\n describe(\"search pill\", () => {\n const mockSearch = vi.fn<(alias: string) => Promise<BoundSkillCandidate[]>>();\n const mockBind = vi.fn();\n const mockSearchStateChange = vi.fn();\n\n const searchCandidates: BoundSkillCandidate[] = [\n {\n id: \"web-framework-react-pro\" as SkillId,\n sourceUrl: \"github:awesome-dev/skills\",\n sourceName: \"awesome-dev\",\n alias: \"react\",\n version: 3,\n description: \"Opinionated React with strict TS\",\n },\n {\n id: \"web-framework-react-strict\" as SkillId,\n sourceUrl: \"github:team-xyz/skills\",\n sourceName: \"team-xyz\",\n alias: \"react\",\n version: 1,\n description: \"Strict mode React\",\n },\n ];\n\n afterEach(() => {\n mockSearch.mockReset();\n mockBind.mockReset();\n mockSearchStateChange.mockReset();\n });\n\n it(\"should render search pill at end of each row when onSearch is provided\", () => {\n const { lastFrame, unmount } = renderGrid({\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).toContain(\"Search\");\n });\n\n it(\"should not render search pill when onSearch is not provided\", () => {\n const { lastFrame, unmount } = renderGrid();\n cleanup = unmount;\n\n const output = lastFrame();\n expect(output).not.toContain(\"Search\");\n });\n\n it(\"should navigate to search pill with arrow right\", async () => {\n const onFocusChange = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 0, // On the only option (Public)\n onFocusChange,\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n // Public is at index 0, search pill at index 1\n expect(onFocusChange).toHaveBeenCalledWith(0, 1);\n });\n\n it(\"should not call onSelect when space is pressed on search pill\", async () => {\n const onSelect = vi.fn();\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1, // Search pill position (after Public)\n onSelect,\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(\" \");\n await delay(INPUT_DELAY_MS);\n\n expect(onSelect).not.toHaveBeenCalled();\n });\n\n it(\"should trigger search on Space when search pill is focused\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1, // Search pill position\n onSearch: mockSearch,\n onSearchStateChange: mockSearchStateChange,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(INPUT_DELAY_MS);\n\n expect(mockSearch).toHaveBeenCalledWith(\"react\");\n expect(mockSearchStateChange).toHaveBeenCalledWith(true);\n });\n\n it(\"should render modal with results after search completes\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, lastFrame, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n });\n cleanup = unmount;\n\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n // Wait for async search to resolve\n await delay(RENDER_DELAY_MS);\n\n const output = lastFrame();\n expect(output).toContain(\"react\");\n expect(output).toContain(\"awesome-dev\");\n expect(output).toContain(\"team-xyz\");\n });\n\n it(\"should close modal on Escape without binding\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, lastFrame, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n onBind: mockBind,\n onSearchStateChange: mockSearchStateChange,\n });\n cleanup = unmount;\n\n // Open modal\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(RENDER_DELAY_MS);\n\n // Close modal\n stdin.write(ESCAPE);\n await delay(INPUT_DELAY_MS);\n\n expect(mockBind).not.toHaveBeenCalled();\n expect(mockSearchStateChange).toHaveBeenLastCalledWith(false);\n\n const output = lastFrame();\n expect(output).not.toContain(\"awesome-dev\");\n });\n\n it(\"should not respond to grid navigation while modal is open\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n const onFocusChange = vi.fn();\n\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n onFocusChange,\n });\n cleanup = unmount;\n\n // Open modal\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(RENDER_DELAY_MS);\n\n // Try grid navigation while modal is open\n onFocusChange.mockClear();\n stdin.write(ARROW_LEFT);\n await delay(INPUT_DELAY_MS);\n stdin.write(ARROW_RIGHT);\n await delay(INPUT_DELAY_MS);\n\n expect(onFocusChange).not.toHaveBeenCalled();\n });\n\n it(\"should bind result on Enter in modal\", async () => {\n mockSearch.mockResolvedValue(searchCandidates);\n\n const { stdin, unmount } = renderGrid({\n rows: defaultRows,\n focusedRow: 0,\n focusedCol: 1,\n onSearch: mockSearch,\n onBind: mockBind,\n onSearchStateChange: mockSearchStateChange,\n });\n cleanup = unmount;\n\n // Open modal with Space\n await delay(RENDER_DELAY_MS);\n stdin.write(SPACE);\n await delay(RENDER_DELAY_MS);\n\n // Bind first result\n stdin.write(ENTER);\n await delay(INPUT_DELAY_MS);\n\n expect(mockBind).toHaveBeenCalledWith(searchCandidates[0]);\n expect(mockSearchStateChange).toHaveBeenLastCalledWith(false);\n });\n });\n});\n"],"mappings":"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","names":[]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StepApproach
|
|
4
|
-
} from "../../chunk-
|
|
5
|
-
import "../../chunk-
|
|
6
|
-
import "../../chunk-
|
|
7
|
-
import "../../chunk-
|
|
8
|
-
import "../../chunk-
|
|
4
|
+
} from "../../chunk-KWYO3M5Q.js";
|
|
5
|
+
import "../../chunk-U7HFKR74.js";
|
|
6
|
+
import "../../chunk-H7SSBSPR.js";
|
|
7
|
+
import "../../chunk-TMED5DQ2.js";
|
|
8
|
+
import "../../chunk-HWD32NP7.js";
|
|
9
|
+
import "../../chunk-O6ZTD7ZI.js";
|
|
10
|
+
import "../../chunk-AWKZ5BDL.js";
|
|
9
11
|
export {
|
|
10
12
|
StepApproach
|
|
11
13
|
};
|