@claude-collective/cli 0.21.0 → 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 +174 -0
- package/README.md +41 -27
- package/config/skills-matrix.yaml +38 -37
- package/config/stacks.yaml +8 -14
- package/dist/{chunk-ZNIDWLL5.js → chunk-3X5D7RM5.js} +4 -3
- 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-OQYYMQJR.js → chunk-ETCVEV3S.js} +8 -11
- package/dist/chunk-ETCVEV3S.js.map +1 -0
- package/dist/{chunk-ZSVMS677.js → chunk-F4RD5FYM.js} +2 -2
- package/dist/chunk-F4RD5FYM.js.map +1 -0
- package/dist/{chunk-5KXUDHAB.js → chunk-GGFOD5PK.js} +6 -9
- package/dist/chunk-GGFOD5PK.js.map +1 -0
- package/dist/{chunk-UMORK7OK.js → chunk-H7SSBSPR.js} +2 -2
- 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-HGCBZUH5.js → chunk-IAYAE6MG.js} +9 -10
- 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-WFEFICFM.js → chunk-KWYO3M5Q.js} +5 -5
- package/dist/chunk-KWYO3M5Q.js.map +1 -0
- package/dist/{chunk-HEOHU5EZ.js → chunk-MCTSHLAF.js} +22 -11
- 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-2LSGX6R4.js → chunk-MTPM7BX5.js} +83 -25
- 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-FJFEKPXF.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-CBLPAMZO.js → chunk-TMED5DQ2.js} +68 -42
- package/dist/chunk-TMED5DQ2.js.map +1 -0
- package/dist/{chunk-Q3J43SF3.js → chunk-U7HFKR74.js} +2 -2
- package/dist/chunk-U7HFKR74.js.map +1 -0
- package/dist/{chunk-3EHUF54X.js → chunk-UEMRJI2K.js} +17 -4
- 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-ZEI3ZUDU.js → chunk-VVYNZZUX.js} +7 -15
- 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-A46TPNBJ.js → chunk-XENOESJZ.js} +7 -16
- 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 +0 -1
- package/dist/commands/build/marketplace.js +15 -13
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +13 -229
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +11 -18
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +36 -58
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +8 -8
- package/dist/commands/config/get.js.map +1 -1
- package/dist/commands/config/index.js +7 -7
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +6 -6
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/set-project.js +8 -8
- 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 +8 -8
- package/dist/commands/config/unset-project.js.map +1 -1
- package/dist/commands/diff.js +10 -16
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +18 -51
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +87 -57
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +17 -49
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +26 -26
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +15 -17
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +45 -722
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +8 -87
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +8 -12
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/skill.js +6 -6
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +15 -19
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +21 -34
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +15 -14
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +13 -24
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +44 -487
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/version/bump.js +11 -11
- package/dist/commands/version/bump.js.map +1 -1
- package/dist/commands/version/index.js +9 -10
- package/dist/commands/version/index.js.map +1 -1
- package/dist/commands/version/set.js +10 -8
- package/dist/commands/version/set.js.map +1 -1
- package/dist/commands/version/show.js +9 -10
- 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 +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 +132 -78
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/menu-item.js +2 -2
- package/dist/components/wizard/search-modal.js +9 -0
- package/dist/components/wizard/search-modal.js.map +1 -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 +4 -4
- 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 -6
- 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 -4
- package/dist/components/wizard/step-build.test.js +103 -122
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +3 -2
- 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 -2
- package/dist/components/wizard/step-refine.test.js +19 -13
- 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 -6
- 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 +2 -2
- package/dist/components/wizard/wizard-layout.js +6 -5
- 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 -14
- package/dist/config/skills-matrix.yaml +38 -37
- package/dist/config/stacks.yaml +8 -14
- package/dist/hooks/init.js +5 -5
- 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/meta/agent-summoner/agent.yaml +1 -1
- package/dist/src/agents/meta/documentor/agent.yaml +1 -1
- 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/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/stores/wizard-store.js +4 -3
- package/dist/stores/wizard-store.test.js +51 -82
- 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/meta/agent-summoner/agent.yaml +1 -1
- package/src/agents/meta/documentor/agent.yaml +1 -1
- package/src/agents/meta/skill-summoner/agent.yaml +1 -1
- package/src/agents/migration/cli-migrator/agent.yaml +1 -1
- 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/dist/chunk-2LSGX6R4.js.map +0 -1
- package/dist/chunk-2OKUEELH.js +0 -32
- package/dist/chunk-2OKUEELH.js.map +0 -1
- package/dist/chunk-374JNMR6.js +0 -212
- package/dist/chunk-374JNMR6.js.map +0 -1
- package/dist/chunk-3EHUF54X.js.map +0 -1
- package/dist/chunk-3XR4PALU.js +0 -529
- package/dist/chunk-3XR4PALU.js.map +0 -1
- package/dist/chunk-5K2ZLUO5.js +0 -57
- package/dist/chunk-5K2ZLUO5.js.map +0 -1
- package/dist/chunk-5KXUDHAB.js.map +0 -1
- package/dist/chunk-6Q3Y7KVB.js.map +0 -1
- package/dist/chunk-7SLV7CMF.js +0 -615
- package/dist/chunk-7SLV7CMF.js.map +0 -1
- package/dist/chunk-A46TPNBJ.js.map +0 -1
- package/dist/chunk-AL74GBW4.js +0 -69
- package/dist/chunk-AL74GBW4.js.map +0 -1
- package/dist/chunk-BQX23RBV.js +0 -191
- package/dist/chunk-BQX23RBV.js.map +0 -1
- package/dist/chunk-CA4LH4LI.js +0 -132
- package/dist/chunk-CA4LH4LI.js.map +0 -1
- package/dist/chunk-CBLPAMZO.js.map +0 -1
- package/dist/chunk-CKPQHGXR.js +0 -417
- package/dist/chunk-CKPQHGXR.js.map +0 -1
- package/dist/chunk-CXOFOJCN.js +0 -80
- package/dist/chunk-CXOFOJCN.js.map +0 -1
- package/dist/chunk-EHGD7HIE.js +0 -104
- package/dist/chunk-EHGD7HIE.js.map +0 -1
- package/dist/chunk-EHS3TWWP.js +0 -95
- package/dist/chunk-EHS3TWWP.js.map +0 -1
- package/dist/chunk-FJFEKPXF.js.map +0 -1
- package/dist/chunk-HEOHU5EZ.js.map +0 -1
- package/dist/chunk-HGCBZUH5.js.map +0 -1
- package/dist/chunk-HPGFY5ZN.js +0 -114
- package/dist/chunk-HPGFY5ZN.js.map +0 -1
- package/dist/chunk-INJ2EFRW.js +0 -127
- package/dist/chunk-INJ2EFRW.js.map +0 -1
- package/dist/chunk-IOBFMF6X.js +0 -61
- package/dist/chunk-IOBFMF6X.js.map +0 -1
- package/dist/chunk-KH3HA7J7.js +0 -116
- package/dist/chunk-KH3HA7J7.js.map +0 -1
- package/dist/chunk-N6JNE326.js +0 -261
- package/dist/chunk-N6JNE326.js.map +0 -1
- package/dist/chunk-NAGU7TVZ.js +0 -36
- package/dist/chunk-NAGU7TVZ.js.map +0 -1
- package/dist/chunk-OQYYMQJR.js.map +0 -1
- package/dist/chunk-PLZOUVDD.js +0 -419
- package/dist/chunk-PLZOUVDD.js.map +0 -1
- package/dist/chunk-Q3J43SF3.js.map +0 -1
- package/dist/chunk-RTE64SJA.js.map +0 -1
- package/dist/chunk-T25OEQFI.js +0 -26
- package/dist/chunk-T25OEQFI.js.map +0 -1
- package/dist/chunk-UMORK7OK.js.map +0 -1
- package/dist/chunk-VFHWU7JU.js +0 -287
- package/dist/chunk-VFHWU7JU.js.map +0 -1
- package/dist/chunk-VS4GVTZE.js +0 -91
- package/dist/chunk-VS4GVTZE.js.map +0 -1
- package/dist/chunk-WFEFICFM.js.map +0 -1
- package/dist/chunk-WG6KIAPK.js +0 -54
- package/dist/chunk-WG6KIAPK.js.map +0 -1
- package/dist/chunk-ZEI3ZUDU.js.map +0 -1
- package/dist/chunk-ZNIDWLL5.js.map +0 -1
- package/dist/chunk-ZSVMS677.js.map +0 -1
- /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/{magic-string.es-RGXYGAW3.js.map → magic-string.es-PAH2SOTR.js.map} +0 -0
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
typedKeys
|
|
4
|
+
} from "./chunk-HWD32NP7.js";
|
|
2
5
|
import {
|
|
3
6
|
DEFAULT_PRESELECTED_SKILLS
|
|
4
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-O6ZTD7ZI.js";
|
|
5
8
|
import {
|
|
6
9
|
init_esm_shims
|
|
7
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-AWKZ5BDL.js";
|
|
8
11
|
|
|
9
12
|
// src/cli/stores/wizard-store.ts
|
|
10
13
|
init_esm_shims();
|
|
@@ -20,11 +23,14 @@ var createInitialState = () => ({
|
|
|
20
23
|
domainSelections: {},
|
|
21
24
|
focusedRow: 0,
|
|
22
25
|
focusedCol: 0,
|
|
23
|
-
currentRefineIndex: 0,
|
|
24
|
-
skillSources: {},
|
|
25
26
|
showDescriptions: false,
|
|
26
27
|
expertMode: false,
|
|
27
28
|
installMode: "local",
|
|
29
|
+
sourceSelections: {},
|
|
30
|
+
customizeSources: false,
|
|
31
|
+
showSettings: false,
|
|
32
|
+
enabledSources: {},
|
|
33
|
+
boundSkills: [],
|
|
28
34
|
history: []
|
|
29
35
|
});
|
|
30
36
|
var useWizardStore = create((set, get) => ({
|
|
@@ -32,7 +38,6 @@ var useWizardStore = create((set, get) => ({
|
|
|
32
38
|
setStep: (step) => set((state) => ({
|
|
33
39
|
step,
|
|
34
40
|
history: [...state.history, state.step],
|
|
35
|
-
// Reset focus when changing steps
|
|
36
41
|
focusedRow: 0,
|
|
37
42
|
focusedCol: 0
|
|
38
43
|
})),
|
|
@@ -44,8 +49,10 @@ var useWizardStore = create((set, get) => ({
|
|
|
44
49
|
const domains = /* @__PURE__ */ new Set();
|
|
45
50
|
for (const agentConfig of Object.values(stack.agents)) {
|
|
46
51
|
for (const [subcategoryId, technologyAlias] of Object.entries(agentConfig)) {
|
|
47
|
-
const
|
|
52
|
+
const subcat = subcategoryId;
|
|
53
|
+
const category = categories[subcat];
|
|
48
54
|
const domain = category?.domain;
|
|
55
|
+
const tech = technologyAlias;
|
|
49
56
|
if (!domain) {
|
|
50
57
|
continue;
|
|
51
58
|
}
|
|
@@ -53,11 +60,12 @@ var useWizardStore = create((set, get) => ({
|
|
|
53
60
|
if (!domainSelections[domain]) {
|
|
54
61
|
domainSelections[domain] = {};
|
|
55
62
|
}
|
|
56
|
-
if (!domainSelections[domain][
|
|
57
|
-
domainSelections[domain][
|
|
63
|
+
if (!domainSelections[domain][subcat]) {
|
|
64
|
+
domainSelections[domain][subcat] = [];
|
|
58
65
|
}
|
|
59
|
-
|
|
60
|
-
|
|
66
|
+
const techAsId = tech;
|
|
67
|
+
if (!domainSelections[domain][subcat].includes(techAsId)) {
|
|
68
|
+
domainSelections[domain][subcat].push(techAsId);
|
|
61
69
|
}
|
|
62
70
|
}
|
|
63
71
|
}
|
|
@@ -66,21 +74,41 @@ var useWizardStore = create((set, get) => ({
|
|
|
66
74
|
selectedDomains: ALL_DOMAINS
|
|
67
75
|
};
|
|
68
76
|
}),
|
|
77
|
+
populateFromSkillIds: (skillIds, skills, categories) => set(() => {
|
|
78
|
+
const domainSelections = {};
|
|
79
|
+
const domains = /* @__PURE__ */ new Set();
|
|
80
|
+
for (const skillId of skillIds) {
|
|
81
|
+
const skill = skills[skillId];
|
|
82
|
+
if (!skill?.category || !skill.displayName) {
|
|
83
|
+
console.warn(
|
|
84
|
+
`Installed skill '${skillId}' is missing from the marketplace \u2014 it may have been removed or renamed`
|
|
85
|
+
);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const subcat = skill.category;
|
|
89
|
+
const domain = categories[subcat]?.domain;
|
|
90
|
+
if (!domain) {
|
|
91
|
+
console.warn(
|
|
92
|
+
`Installed skill '${skillId}' has unknown category '${skill.category}' \u2014 skipping`
|
|
93
|
+
);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
domains.add(domain);
|
|
97
|
+
if (!domainSelections[domain]) domainSelections[domain] = {};
|
|
98
|
+
if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];
|
|
99
|
+
const techAsId = skill.displayName;
|
|
100
|
+
if (!domainSelections[domain][subcat].includes(techAsId)) {
|
|
101
|
+
domainSelections[domain][subcat].push(techAsId);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { domainSelections, selectedDomains: ALL_DOMAINS };
|
|
105
|
+
}),
|
|
69
106
|
toggleDomain: (domain) => set((state) => {
|
|
70
107
|
const isSelected = state.selectedDomains.includes(domain);
|
|
71
108
|
return {
|
|
72
109
|
selectedDomains: isSelected ? state.selectedDomains.filter((d) => d !== domain) : [...state.selectedDomains, domain]
|
|
73
110
|
};
|
|
74
111
|
}),
|
|
75
|
-
setDomainSelection: (domain, subcategory, technologies) => set((state) => ({
|
|
76
|
-
domainSelections: {
|
|
77
|
-
...state.domainSelections,
|
|
78
|
-
[domain]: {
|
|
79
|
-
...state.domainSelections[domain],
|
|
80
|
-
[subcategory]: technologies
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
})),
|
|
84
112
|
toggleTechnology: (domain, subcategory, technology, exclusive) => set((state) => {
|
|
85
113
|
const currentSelections = state.domainSelections[domain]?.[subcategory] || [];
|
|
86
114
|
const isSelected = currentSelections.includes(technology);
|
|
@@ -100,7 +128,6 @@ var useWizardStore = create((set, get) => ({
|
|
|
100
128
|
}
|
|
101
129
|
};
|
|
102
130
|
}),
|
|
103
|
-
setCurrentDomainIndex: (index) => set({ currentDomainIndex: index, focusedRow: 0, focusedCol: 0 }),
|
|
104
131
|
nextDomain: () => {
|
|
105
132
|
const state = get();
|
|
106
133
|
if (state.currentDomainIndex < state.selectedDomains.length - 1) {
|
|
@@ -126,18 +153,24 @@ var useWizardStore = create((set, get) => ({
|
|
|
126
153
|
return false;
|
|
127
154
|
},
|
|
128
155
|
setFocus: (row, col) => set({ focusedRow: row, focusedCol: col }),
|
|
129
|
-
setSkillSource: (technology, skillId) => set((state) => ({
|
|
130
|
-
skillSources: {
|
|
131
|
-
...state.skillSources,
|
|
132
|
-
[technology]: skillId
|
|
133
|
-
}
|
|
134
|
-
})),
|
|
135
|
-
setCurrentRefineIndex: (index) => set({ currentRefineIndex: index }),
|
|
136
156
|
toggleShowDescriptions: () => set((state) => ({ showDescriptions: !state.showDescriptions })),
|
|
137
157
|
toggleExpertMode: () => set((state) => ({ expertMode: !state.expertMode })),
|
|
138
158
|
toggleInstallMode: () => set((state) => ({
|
|
139
159
|
installMode: state.installMode === "plugin" ? "local" : "plugin"
|
|
140
160
|
})),
|
|
161
|
+
setSourceSelection: (skillId, sourceId) => set((state) => ({
|
|
162
|
+
sourceSelections: { ...state.sourceSelections, [skillId]: sourceId }
|
|
163
|
+
})),
|
|
164
|
+
setCustomizeSources: (customize) => set({ customizeSources: customize }),
|
|
165
|
+
toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),
|
|
166
|
+
setEnabledSources: (sources) => set({ enabledSources: sources }),
|
|
167
|
+
bindSkill: (skill) => set((state) => {
|
|
168
|
+
const exists = state.boundSkills.some(
|
|
169
|
+
(b) => b.id === skill.id && b.sourceUrl === skill.sourceUrl
|
|
170
|
+
);
|
|
171
|
+
if (exists) return state;
|
|
172
|
+
return { boundSkills: [...state.boundSkills, skill] };
|
|
173
|
+
}),
|
|
141
174
|
goBack: () => set((state) => {
|
|
142
175
|
const history = [...state.history];
|
|
143
176
|
const previousStep = history.pop();
|
|
@@ -149,15 +182,15 @@ var useWizardStore = create((set, get) => ({
|
|
|
149
182
|
};
|
|
150
183
|
}),
|
|
151
184
|
reset: () => set(createInitialState()),
|
|
152
|
-
// ─────────────────────────────────────────────────────────────────
|
|
153
|
-
// Computed getters
|
|
154
|
-
// ─────────────────────────────────────────────────────────────────
|
|
155
185
|
getAllSelectedTechnologies: () => {
|
|
156
186
|
const state = get();
|
|
157
187
|
const technologies = [];
|
|
158
|
-
for (const domain of
|
|
159
|
-
|
|
160
|
-
|
|
188
|
+
for (const domain of typedKeys(state.domainSelections)) {
|
|
189
|
+
const domainSel = state.domainSelections[domain];
|
|
190
|
+
if (!domainSel) continue;
|
|
191
|
+
for (const subcategory of typedKeys(domainSel)) {
|
|
192
|
+
const techs = domainSel[subcategory];
|
|
193
|
+
if (techs) technologies.push(...techs);
|
|
161
194
|
}
|
|
162
195
|
}
|
|
163
196
|
return technologies;
|
|
@@ -167,18 +200,11 @@ var useWizardStore = create((set, get) => ({
|
|
|
167
200
|
return state.selectedDomains[state.currentDomainIndex] || null;
|
|
168
201
|
},
|
|
169
202
|
getSelectedSkills: () => {
|
|
170
|
-
|
|
171
|
-
const skillIds = [...DEFAULT_PRESELECTED_SKILLS];
|
|
172
|
-
for (const skillId of Object.values(state.skillSources)) {
|
|
173
|
-
if (!skillIds.includes(skillId)) {
|
|
174
|
-
skillIds.push(skillId);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return skillIds;
|
|
203
|
+
return [...DEFAULT_PRESELECTED_SKILLS];
|
|
178
204
|
}
|
|
179
205
|
}));
|
|
180
206
|
|
|
181
207
|
export {
|
|
182
208
|
useWizardStore
|
|
183
209
|
};
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
210
|
+
//# sourceMappingURL=chunk-TMED5DQ2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/stores/wizard-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { DEFAULT_PRESELECTED_SKILLS } from \"../consts\";\nimport type {\n BoundSkill,\n Domain,\n DomainSelections,\n SkillDisplayName,\n SkillId,\n Subcategory,\n} from \"../types/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\n\nconst ALL_DOMAINS: Domain[] = [\"web\", \"web-extras\", \"api\", \"cli\", \"mobile\", \"shared\"];\n\nexport type WizardStep =\n | \"approach\" // Choose stack template or build from scratch\n | \"stack\" // Select pre-built stack (if approach=stack) or domains (if approach=scratch)\n | \"build\" // CategoryGrid for technology selection\n | \"sources\" // Choose skill sources (recommended vs custom)\n | \"confirm\"; // Final confirmation\n\nexport type WizardState = {\n step: WizardStep;\n\n approach: \"stack\" | \"scratch\" | null;\n selectedStackId: string | null;\n stackAction: \"defaults\" | \"customize\" | null;\n\n selectedDomains: Domain[];\n\n currentDomainIndex: number;\n domainSelections: DomainSelections;\n\n focusedRow: number;\n focusedCol: number;\n\n showDescriptions: boolean;\n expertMode: boolean;\n\n installMode: \"plugin\" | \"local\";\n\n sourceSelections: Partial<Record<SkillId, string>>;\n customizeSources: boolean;\n\n showSettings: boolean;\n enabledSources: Record<string, boolean>;\n\n boundSkills: BoundSkill[];\n\n history: WizardStep[];\n\n setStep: (step: WizardStep) => void;\n setApproach: (approach: \"stack\" | \"scratch\") => void;\n selectStack: (stackId: string | null) => void;\n setStackAction: (action: \"defaults\" | \"customize\") => void;\n /** Pre-populate domainSelections from a stack's technology mappings */\n populateFromStack: (\n stack: { agents: Record<string, Partial<Record<Subcategory, SkillDisplayName>>> },\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n populateFromSkillIds: (\n skillIds: SkillId[],\n skills: Partial<Record<SkillId, { category: string; displayName?: string }>>,\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n toggleDomain: (domain: Domain) => void;\n toggleTechnology: (\n domain: Domain,\n subcategory: Subcategory,\n technology: SkillId,\n exclusive: boolean,\n ) => void;\n nextDomain: () => boolean;\n prevDomain: () => boolean;\n setFocus: (row: number, col: number) => void;\n toggleShowDescriptions: () => void;\n toggleExpertMode: () => void;\n toggleInstallMode: () => void;\n setSourceSelection: (skillId: SkillId, sourceId: string) => void;\n setCustomizeSources: (customize: boolean) => void;\n toggleSettings: () => void;\n setEnabledSources: (sources: Record<string, boolean>) => void;\n bindSkill: (skill: BoundSkill) => void;\n goBack: () => void;\n reset: () => void;\n\n getAllSelectedTechnologies: () => SkillId[];\n getCurrentDomain: () => Domain | null;\n getSelectedSkills: () => SkillId[];\n};\n\nconst createInitialState = () => ({\n step: \"approach\" as WizardStep,\n approach: null as \"stack\" | \"scratch\" | null,\n selectedStackId: null as string | null,\n stackAction: null as \"defaults\" | \"customize\" | null,\n selectedDomains: [] as Domain[],\n currentDomainIndex: 0,\n domainSelections: {} as DomainSelections,\n focusedRow: 0,\n focusedCol: 0,\n showDescriptions: false,\n expertMode: false,\n installMode: \"local\" as \"plugin\" | \"local\",\n sourceSelections: {} as Partial<Record<SkillId, string>>,\n customizeSources: false,\n showSettings: false,\n enabledSources: {} as Record<string, boolean>,\n boundSkills: [] as BoundSkill[],\n history: [] as WizardStep[],\n});\n\nexport const useWizardStore = create<WizardState>((set, get) => ({\n ...createInitialState(),\n\n setStep: (step) =>\n set((state) => ({\n step,\n history: [...state.history, state.step],\n focusedRow: 0,\n focusedCol: 0,\n })),\n\n setApproach: (approach) => set({ approach }),\n\n selectStack: (stackId) => set({ selectedStackId: stackId }),\n\n setStackAction: (action) => set({ stackAction: action }),\n\n populateFromStack: (stack, categories) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const domains = new Set<Domain>();\n\n for (const agentConfig of Object.values(stack.agents)) {\n for (const [subcategoryId, technologyAlias] of Object.entries(agentConfig)) {\n // Boundary cast: Object.entries returns string keys, but agentConfig is Record<Subcategory, ...>\n const subcat = subcategoryId as Subcategory;\n const category = categories[subcat];\n const domain = category?.domain;\n const tech = technologyAlias;\n\n if (!domain) {\n continue;\n }\n\n domains.add(domain);\n\n if (!domainSelections[domain]) {\n domainSelections[domain] = {};\n }\n\n if (!domainSelections[domain][subcat]) {\n domainSelections[domain][subcat] = [];\n }\n\n // Boundary cast: display names from stack are resolved to SkillId downstream by resolveAlias\n const techAsId = tech as unknown as SkillId;\n if (!domainSelections[domain][subcat].includes(techAsId)) {\n domainSelections[domain][subcat].push(techAsId);\n }\n }\n }\n\n return {\n domainSelections,\n selectedDomains: ALL_DOMAINS,\n };\n }),\n\n populateFromSkillIds: (skillIds, skills, categories) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const domains = new Set<Domain>();\n\n for (const skillId of skillIds) {\n const skill = skills[skillId];\n if (!skill?.category || !skill.displayName) {\n console.warn(\n `Installed skill '${skillId}' is missing from the marketplace — it may have been removed or renamed`,\n );\n continue;\n }\n\n // Boundary cast: category is a Subcategory at the data boundary\n const subcat = skill.category as Subcategory;\n const domain = categories[subcat]?.domain;\n if (!domain) {\n console.warn(\n `Installed skill '${skillId}' has unknown category '${skill.category}' — skipping`,\n );\n continue;\n }\n\n domains.add(domain);\n if (!domainSelections[domain]) domainSelections[domain] = {};\n if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];\n\n // Boundary cast: display name resolved to SkillId downstream by resolveAlias\n const techAsId = skill.displayName as SkillId;\n if (!domainSelections[domain][subcat].includes(techAsId)) {\n domainSelections[domain][subcat].push(techAsId);\n }\n }\n\n return { domainSelections, selectedDomains: ALL_DOMAINS };\n }),\n\n toggleDomain: (domain) =>\n set((state) => {\n const isSelected = state.selectedDomains.includes(domain);\n return {\n selectedDomains: isSelected\n ? state.selectedDomains.filter((d) => d !== domain)\n : [...state.selectedDomains, domain],\n };\n }),\n\n toggleTechnology: (domain, subcategory, technology, exclusive) =>\n set((state) => {\n const currentSelections = state.domainSelections[domain]?.[subcategory] || [];\n const isSelected = currentSelections.includes(technology);\n\n let newSelections: SkillId[];\n if (exclusive) {\n newSelections = isSelected ? [] : [technology];\n } else {\n newSelections = isSelected\n ? currentSelections.filter((t) => t !== technology)\n : [...currentSelections, technology];\n }\n\n return {\n domainSelections: {\n ...state.domainSelections,\n [domain]: {\n ...state.domainSelections[domain],\n [subcategory]: newSelections,\n },\n },\n };\n }),\n\n nextDomain: () => {\n const state = get();\n if (state.currentDomainIndex < state.selectedDomains.length - 1) {\n set({\n currentDomainIndex: state.currentDomainIndex + 1,\n focusedRow: 0,\n focusedCol: 0,\n });\n return true;\n }\n return false;\n },\n\n prevDomain: () => {\n const state = get();\n if (state.currentDomainIndex > 0) {\n set({\n currentDomainIndex: state.currentDomainIndex - 1,\n focusedRow: 0,\n focusedCol: 0,\n });\n return true;\n }\n return false;\n },\n\n setFocus: (row, col) => set({ focusedRow: row, focusedCol: col }),\n\n toggleShowDescriptions: () => set((state) => ({ showDescriptions: !state.showDescriptions })),\n\n toggleExpertMode: () => set((state) => ({ expertMode: !state.expertMode })),\n\n toggleInstallMode: () =>\n set((state) => ({\n installMode: state.installMode === \"plugin\" ? \"local\" : \"plugin\",\n })),\n\n setSourceSelection: (skillId, sourceId) =>\n set((state) => ({\n sourceSelections: { ...state.sourceSelections, [skillId]: sourceId },\n })),\n\n setCustomizeSources: (customize) => set({ customizeSources: customize }),\n\n toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),\n\n setEnabledSources: (sources) => set({ enabledSources: sources }),\n\n bindSkill: (skill) =>\n set((state) => {\n const exists = state.boundSkills.some(\n (b) => b.id === skill.id && b.sourceUrl === skill.sourceUrl,\n );\n if (exists) return state;\n return { boundSkills: [...state.boundSkills, skill] };\n }),\n\n goBack: () =>\n set((state) => {\n const history = [...state.history];\n const previousStep = history.pop();\n return {\n step: previousStep || \"approach\",\n history,\n focusedRow: 0,\n focusedCol: 0,\n };\n }),\n\n reset: () => set(createInitialState()),\n\n getAllSelectedTechnologies: () => {\n const state = get();\n const technologies: SkillId[] = [];\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n for (const subcategory of typedKeys<Subcategory>(domainSel)) {\n const techs = domainSel[subcategory];\n if (techs) technologies.push(...techs);\n }\n }\n return technologies;\n },\n\n getCurrentDomain: () => {\n const state = get();\n return state.selectedDomains[state.currentDomainIndex] || null;\n },\n\n getSelectedSkills: () => {\n return [...DEFAULT_PRESELECTED_SKILLS];\n },\n}));\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
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/wizard/view-title.tsx
|
|
7
7
|
init_esm_shims();
|
|
@@ -18,4 +18,4 @@ var ViewTitle = ({ children }) => {
|
|
|
18
18
|
export {
|
|
19
19
|
ViewTitle
|
|
20
20
|
};
|
|
21
|
-
//# sourceMappingURL=chunk-
|
|
21
|
+
//# sourceMappingURL=chunk-U7HFKR74.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/view-title.tsx"],"sourcesContent":["import React from \"react\";\nimport { Text } from \"ink\";\n\nexport type ViewTitleProps = {\n children: React.ReactNode;\n};\n\nexport const ViewTitle: React.FC<ViewTitleProps> = ({ children }) => {\n return (\n <Text backgroundColor=\"yellow\" bold color=\"#000\">\n {\" \"}\n {children}{\" \"}\n </Text>\n );\n};\n"],"mappings":";;;;;;AAAA;AACA,SAAS,YAAY;AAQjB;AAFG,IAAM,YAAsC,CAAC,EAAE,SAAS,MAAM;AACnE,SACE,qBAAC,QAAK,iBAAgB,UAAS,MAAI,MAAC,OAAM,QACvC;AAAA;AAAA,IACA;AAAA,IAAU;AAAA,KACb;AAEJ;","names":[]}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import {
|
|
3
3
|
WIZARD_STEPS,
|
|
4
4
|
WizardTabs
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-3X5D7RM5.js";
|
|
6
6
|
import {
|
|
7
7
|
useWizardStore
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-TMED5DQ2.js";
|
|
9
9
|
import {
|
|
10
10
|
init_esm_shims
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-AWKZ5BDL.js";
|
|
12
12
|
|
|
13
13
|
// src/cli/components/wizard/wizard-layout.tsx
|
|
14
14
|
init_esm_shims();
|
|
@@ -84,8 +84,12 @@ var WizardLayout = ({ version, children }) => {
|
|
|
84
84
|
}
|
|
85
85
|
if (store.approach === "stack" && store.selectedStackId && store.stackAction === "defaults") {
|
|
86
86
|
skipped.push("build");
|
|
87
|
+
skipped.push("sources");
|
|
87
88
|
} else if (store.step === "confirm") {
|
|
88
89
|
completed.push("build");
|
|
90
|
+
completed.push("sources");
|
|
91
|
+
} else if (store.step === "sources") {
|
|
92
|
+
completed.push("build");
|
|
89
93
|
}
|
|
90
94
|
return { completedSteps: completed, skippedSteps: skipped };
|
|
91
95
|
}, [store.step, store.approach, store.selectedStackId, store.stackAction]);
|
|
@@ -119,6 +123,15 @@ var WizardLayout = ({ version, children }) => {
|
|
|
119
123
|
values: ["P"],
|
|
120
124
|
isActive: store.installMode === "plugin"
|
|
121
125
|
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
DefinitionItem,
|
|
129
|
+
{
|
|
130
|
+
label: "Settings",
|
|
131
|
+
values: ["G"],
|
|
132
|
+
isVisible: store.step === "sources",
|
|
133
|
+
isActive: store.showSettings
|
|
134
|
+
}
|
|
122
135
|
)
|
|
123
136
|
] }),
|
|
124
137
|
/* @__PURE__ */ jsx(WizardFooter, {})
|
|
@@ -130,4 +143,4 @@ export {
|
|
|
130
143
|
WizardFooter,
|
|
131
144
|
WizardLayout
|
|
132
145
|
};
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-UEMRJI2K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/wizard-layout.tsx"],"sourcesContent":["import React, { Fragment, useMemo } from \"react\";\nimport { Box, Text } from \"ink\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { WizardTabs, WIZARD_STEPS } from \"./wizard-tabs.js\";\n\ntype KeyHintProps = {\n isVisible?: boolean;\n isActive?: boolean;\n label: string;\n values: string[];\n};\n\nexport const DefinitionItem: React.FC<KeyHintProps> = ({\n isVisible = true,\n isActive = false,\n label,\n values,\n}) => {\n if (!isVisible) {\n return null;\n }\n\n return (\n <Text>\n {values.map((value) => (\n <Fragment key={value}>\n <Text backgroundColor=\"black\" color=\"white\">\n {\" \"}\n {value}{\" \"}\n </Text>{\" \"}\n </Fragment>\n ))}\n <Text color={isActive ? \"cyan\" : undefined}>{label}</Text>\n </Text>\n );\n};\n\nconst HOT_KEYS: { label: string; values: string[] }[] = [\n { label: \"navigate\", values: [\"\\u2190/\\u2192\", \"\\u2191/\\u2193\"] },\n { label: \"select\", values: [\"SPACE\"] },\n { label: \"continue\", values: [\"ENTER\"] },\n { label: \"back\", values: [\"ESC\"] },\n];\n\nexport const WizardFooter = () => {\n const store = useWizardStore();\n\n return (\n <Box\n columnGap={2}\n borderTop\n borderRight={false}\n borderBottom\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingLeft={1}\n paddingRight={1}\n >\n <DefinitionItem\n label=\"Accept defaults\"\n values={[\"A\"]}\n isVisible={store.step === \"build\" && !!store.selectedStackId}\n />\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string;\n children: React.ReactNode;\n};\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({ version, children }) => {\n const store = useWizardStore();\n\n const { completedSteps, skippedSteps } = useMemo(() => {\n const completed: string[] = [];\n const skipped: string[] = [];\n\n if (store.step !== \"approach\") {\n completed.push(\"approach\");\n }\n\n if (store.step !== \"approach\" && store.step !== \"stack\") {\n completed.push(\"stack\");\n }\n\n // Stack path with defaults skips build and sources\n if (store.approach === \"stack\" && store.selectedStackId && store.stackAction === \"defaults\") {\n skipped.push(\"build\");\n skipped.push(\"sources\");\n } else if (store.step === \"confirm\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n } else if (store.step === \"sources\") {\n completed.push(\"build\");\n }\n\n return { completedSteps: completed, skippedSteps: skipped };\n }, [store.step, store.approach, store.selectedStackId, store.stackAction]);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <WizardTabs\n steps={WIZARD_STEPS}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n version={version}\n />\n <Box marginTop={1}>{children}</Box>\n <Box paddingX={1} columnGap={2} marginTop={2}>\n <DefinitionItem label=\"Expert mode\" values={[\"E\"]} isActive={store.expertMode} />\n <DefinitionItem\n label=\"Descriptions\"\n values={[\"D\"]}\n isVisible={store.step === \"build\"}\n isActive={store.showDescriptions}\n />\n <DefinitionItem\n label=\"Plugin mode\"\n values={[\"P\"]}\n isActive={store.installMode === \"plugin\"}\n />\n <DefinitionItem\n label=\"Settings\"\n values={[\"G\"]}\n isVisible={store.step === \"sources\"}\n isActive={store.showSettings}\n />\n </Box>\n <WizardFooter />\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
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/themes/default.ts
|
|
7
7
|
init_esm_shims();
|
|
@@ -75,4 +75,4 @@ var cliTheme = extendTheme(defaultTheme, {
|
|
|
75
75
|
export {
|
|
76
76
|
cliTheme
|
|
77
77
|
};
|
|
78
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-UNN7523L.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
init_esm_shims
|
|
4
|
+
} from "./chunk-AWKZ5BDL.js";
|
|
5
|
+
|
|
6
|
+
// src/cli/components/wizard/utils.ts
|
|
7
|
+
init_esm_shims();
|
|
8
|
+
function getDomainDisplayName(domain) {
|
|
9
|
+
const displayNames = {
|
|
10
|
+
web: "Web",
|
|
11
|
+
"web-extras": "Web Extras",
|
|
12
|
+
api: "API",
|
|
13
|
+
cli: "CLI",
|
|
14
|
+
mobile: "Mobile",
|
|
15
|
+
shared: "Shared"
|
|
16
|
+
};
|
|
17
|
+
return displayNames[domain] || domain.charAt(0).toUpperCase() + domain.slice(1);
|
|
18
|
+
}
|
|
19
|
+
function getStackName(stackId, matrix) {
|
|
20
|
+
if (!stackId) return void 0;
|
|
21
|
+
const stack = matrix.suggestedStacks.find((s) => s.id === stackId);
|
|
22
|
+
return stack?.name;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
getDomainDisplayName,
|
|
27
|
+
getStackName
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=chunk-V2ZIH7HV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/utils.ts"],"sourcesContent":["import type { Domain, MergedSkillsMatrix } from \"../../types/index.js\";\n\nexport function getDomainDisplayName(domain: Domain): string {\n const displayNames: Record<Domain, string> = {\n web: \"Web\",\n \"web-extras\": \"Web Extras\",\n api: \"API\",\n cli: \"CLI\",\n mobile: \"Mobile\",\n shared: \"Shared\",\n };\n return displayNames[domain] || domain.charAt(0).toUpperCase() + domain.slice(1);\n}\n\nexport function getStackName(\n stackId: string | null,\n matrix: MergedSkillsMatrix,\n): string | undefined {\n if (!stackId) return undefined;\n const stack = matrix.suggestedStacks.find((s) => s.id === stackId);\n return stack?.name;\n}\n"],"mappings":";;;;;;AAAA;AAEO,SAAS,qBAAqB,QAAwB;AAC3D,QAAM,eAAuC;AAAA,IAC3C,KAAK;AAAA,IACL,cAAc;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,SAAO,aAAa,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAChF;AAEO,SAAS,aACd,SACA,QACoB;AACpB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,OAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACjE,SAAO,OAAO;AAChB;","names":[]}
|
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getDomainDisplayName
|
|
4
|
+
} from "./chunk-V2ZIH7HV.js";
|
|
2
5
|
import {
|
|
3
6
|
init_esm_shims
|
|
4
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-AWKZ5BDL.js";
|
|
5
8
|
|
|
6
9
|
// src/cli/components/wizard/step-confirm.tsx
|
|
7
10
|
init_esm_shims();
|
|
8
11
|
import { Box, Text, useInput } from "ink";
|
|
9
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
-
var formatDomainName = (domain) => {
|
|
11
|
-
const names = {
|
|
12
|
-
web: "Web",
|
|
13
|
-
"web-extras": "Web Extras",
|
|
14
|
-
api: "API",
|
|
15
|
-
cli: "CLI",
|
|
16
|
-
mobile: "Mobile"
|
|
17
|
-
};
|
|
18
|
-
return names[domain] || domain.charAt(0).toUpperCase() + domain.slice(1);
|
|
19
|
-
};
|
|
20
13
|
var StepConfirm = ({
|
|
21
|
-
matrix,
|
|
22
14
|
onComplete,
|
|
23
15
|
stackName,
|
|
24
16
|
selectedDomains,
|
|
@@ -36,7 +28,7 @@ var StepConfirm = ({
|
|
|
36
28
|
onBack();
|
|
37
29
|
}
|
|
38
30
|
});
|
|
39
|
-
const domainsText = selectedDomains?.map(
|
|
31
|
+
const domainsText = selectedDomains?.map(getDomainDisplayName).join(" + ") || "";
|
|
40
32
|
const title = stackName ? `Ready to install ${stackName}` : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : ""}`;
|
|
41
33
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 2, children: [
|
|
42
34
|
/* @__PURE__ */ jsx(Text, { bold: true, color: "green", children: title }),
|
|
@@ -47,7 +39,7 @@ var StepConfirm = ({
|
|
|
47
39
|
if (techs.length === 0) return null;
|
|
48
40
|
return /* @__PURE__ */ jsxs(Text, { children: [
|
|
49
41
|
/* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
50
|
-
|
|
42
|
+
getDomainDisplayName(domain),
|
|
51
43
|
":"
|
|
52
44
|
] }),
|
|
53
45
|
" ",
|
|
@@ -79,4 +71,4 @@ var StepConfirm = ({
|
|
|
79
71
|
export {
|
|
80
72
|
StepConfirm
|
|
81
73
|
};
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-VVYNZZUX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { DomainSelections, Domain } from \"../../types/index.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\n\nexport type StepConfirmProps = {\n onComplete: () => void;\n stackName?: string;\n selectedDomains?: Domain[];\n domainSelections?: DomainSelections;\n technologyCount?: number;\n skillCount?: number;\n installMode?: \"plugin\" | \"local\";\n onBack?: () => void;\n};\n\nexport const StepConfirm: React.FC<StepConfirmProps> = ({\n onComplete,\n stackName,\n selectedDomains,\n domainSelections,\n technologyCount,\n skillCount,\n installMode,\n onBack,\n}) => {\n useInput((input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape && onBack) {\n onBack();\n }\n });\n\n const domainsText = selectedDomains?.map(getDomainDisplayName).join(\" + \") || \"\";\n const title = stackName\n ? `Ready to install ${stackName}`\n : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : \"\"}`;\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <Text bold color=\"green\">\n {title}\n </Text>\n <Text> </Text>\n\n {domainSelections && selectedDomains && !stackName && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {selectedDomains.map((domain) => {\n const selections = domainSelections[domain] || {};\n const techs = Object.values(selections).flat();\n if (techs.length === 0) return null;\n return (\n <Text key={domain}>\n <Text bold>{getDomainDisplayName(domain)}:</Text> <Text>{techs.join(\", \")}</Text>\n </Text>\n );\n })}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginY={1}>\n {technologyCount !== undefined && (\n <Text>\n <Text dimColor>Technologies:</Text> <Text bold>{technologyCount}</Text>\n </Text>\n )}\n {skillCount !== undefined && (\n <Text>\n <Text dimColor>Skills:</Text> <Text bold>{skillCount}</Text>{\" \"}\n <Text color=\"green\">(all verified)</Text>\n </Text>\n )}\n {installMode && (\n <Text>\n <Text dimColor>Install mode:</Text>{\" \"}\n <Text bold>{installMode === \"plugin\" ? \"Plugin\" : \"Local\"}</Text>\n </Text>\n )}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;AAAA;AACA,SAAS,KAAK,MAAM,gBAAgB;AAyC9B,cAaU,YAbV;AA1BC,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,iBAAW;AAAA,IACb;AACA,QAAI,IAAI,UAAU,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,cAAc,iBAAiB,IAAI,oBAAoB,EAAE,KAAK,KAAK,KAAK;AAC9E,QAAM,QAAQ,YACV,oBAAoB,SAAS,KAC7B,qCAAqC,cAAc,KAAK,WAAW,MAAM,EAAE;AAE/E,SACE,qBAAC,OAAI,eAAc,UAAS,UAAU,GACpC;AAAA,wBAAC,QAAK,MAAI,MAAC,OAAM,SACd,iBACH;AAAA,IACA,oBAAC,QAAK,eAAC;AAAA,IAEN,oBAAoB,mBAAmB,CAAC,aACvC,oBAAC,OAAI,eAAc,UAAS,cAAc,GACvC,0BAAgB,IAAI,CAAC,WAAW;AAC/B,YAAM,aAAa,iBAAiB,MAAM,KAAK,CAAC;AAChD,YAAM,QAAQ,OAAO,OAAO,UAAU,EAAE,KAAK;AAC7C,UAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,aACE,qBAAC,QACC;AAAA,6BAAC,QAAK,MAAI,MAAE;AAAA,+BAAqB,MAAM;AAAA,UAAE;AAAA,WAAC;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAM,gBAAM,KAAK,IAAI,GAAE;AAAA,WADjE,MAEX;AAAA,IAEJ,CAAC,GACH;AAAA,IAGF,qBAAC,OAAI,eAAc,UAAS,SAAS,GAClC;AAAA,0BAAoB,UACnB,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,2BAAa;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAK,MAAI,MAAE,2BAAgB;AAAA,SAClE;AAAA,MAED,eAAe,UACd,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,qBAAO;AAAA,QAAO;AAAA,QAAC,oBAAC,QAAK,MAAI,MAAE,sBAAW;AAAA,QAAQ;AAAA,QAC7D,oBAAC,QAAK,OAAM,SAAQ,4BAAc;AAAA,SACpC;AAAA,MAED,eACC,qBAAC,QACC;AAAA,4BAAC,QAAK,UAAQ,MAAC,2BAAa;AAAA,QAAQ;AAAA,QACpC,oBAAC,QAAK,MAAI,MAAE,0BAAgB,WAAW,WAAW,SAAQ;AAAA,SAC5D;AAAA,OAEJ;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getDomainDisplayName
|
|
4
|
+
} from "./chunk-V2ZIH7HV.js";
|
|
5
|
+
import {
|
|
6
|
+
ViewTitle
|
|
7
|
+
} from "./chunk-U7HFKR74.js";
|
|
8
|
+
import {
|
|
9
|
+
CategoryGrid
|
|
10
|
+
} from "./chunk-ETCVEV3S.js";
|
|
11
|
+
import {
|
|
12
|
+
getAvailableSkills,
|
|
13
|
+
resolveAlias
|
|
14
|
+
} from "./chunk-YDBSSAJ6.js";
|
|
15
|
+
import {
|
|
16
|
+
init_esm_shims
|
|
17
|
+
} from "./chunk-AWKZ5BDL.js";
|
|
18
|
+
|
|
19
|
+
// src/cli/components/wizard/step-build.tsx
|
|
20
|
+
init_esm_shims();
|
|
21
|
+
import { useState } from "react";
|
|
22
|
+
import { Box, Text, useInput } from "ink";
|
|
23
|
+
import { sortBy } from "remeda";
|
|
24
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
25
|
+
var FRAMEWORK_SUBCATEGORY_ID = "framework";
|
|
26
|
+
var WEB_DOMAIN_ID = "web";
|
|
27
|
+
function validateBuildStep(categories, selections) {
|
|
28
|
+
for (const category of categories) {
|
|
29
|
+
if (category.required) {
|
|
30
|
+
const categorySelections = selections[category.id] || [];
|
|
31
|
+
if (categorySelections.length === 0) {
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
message: `Please select a ${category.displayName}`
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { valid: true };
|
|
40
|
+
}
|
|
41
|
+
function computeOptionState(skill) {
|
|
42
|
+
if (skill.disabled) {
|
|
43
|
+
return "disabled";
|
|
44
|
+
}
|
|
45
|
+
if (skill.discouraged) {
|
|
46
|
+
return "discouraged";
|
|
47
|
+
}
|
|
48
|
+
if (skill.recommended) {
|
|
49
|
+
return "recommended";
|
|
50
|
+
}
|
|
51
|
+
return "normal";
|
|
52
|
+
}
|
|
53
|
+
function getDisplayLabel(skill) {
|
|
54
|
+
return skill.displayName || skill.id;
|
|
55
|
+
}
|
|
56
|
+
function getStateReason(skill) {
|
|
57
|
+
if (skill.disabled && skill.disabledReason) {
|
|
58
|
+
return skill.disabledReason;
|
|
59
|
+
}
|
|
60
|
+
if (skill.discouraged && skill.discouragedReason) {
|
|
61
|
+
return skill.discouragedReason;
|
|
62
|
+
}
|
|
63
|
+
if (skill.recommended && skill.recommendedReason) {
|
|
64
|
+
return skill.recommendedReason;
|
|
65
|
+
}
|
|
66
|
+
return void 0;
|
|
67
|
+
}
|
|
68
|
+
function isFrameworkSelected(selections) {
|
|
69
|
+
const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];
|
|
70
|
+
return frameworkSelections.length > 0;
|
|
71
|
+
}
|
|
72
|
+
function getSelectedFrameworks(selections, matrix) {
|
|
73
|
+
const frameworkSelections = selections[FRAMEWORK_SUBCATEGORY_ID] ?? [];
|
|
74
|
+
return frameworkSelections.map((alias) => resolveAlias(alias, matrix));
|
|
75
|
+
}
|
|
76
|
+
function isCompatibleWithSelectedFrameworks(skillId, selectedFrameworkIds, matrix) {
|
|
77
|
+
const skill = matrix.skills[skillId];
|
|
78
|
+
if (!skill) return false;
|
|
79
|
+
if (skill.compatibleWith.length === 0) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));
|
|
83
|
+
}
|
|
84
|
+
function buildCategoriesForDomain(domain, allSelections, matrix, expertMode, selections, parentDomainSelections, installedSkillIds) {
|
|
85
|
+
const frameworkSource = parentDomainSelections ?? selections;
|
|
86
|
+
const frameworkSelected = isFrameworkSelected(frameworkSource);
|
|
87
|
+
const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource, matrix) : [];
|
|
88
|
+
const subcategories = sortBy(
|
|
89
|
+
Object.values(matrix.categories).filter((cat) => cat.domain === domain),
|
|
90
|
+
(cat) => cat.order ?? 0
|
|
91
|
+
);
|
|
92
|
+
const categoryRows = subcategories.map((cat) => {
|
|
93
|
+
const skillOptions = getAvailableSkills(cat.id, allSelections, matrix, {
|
|
94
|
+
expertMode
|
|
95
|
+
});
|
|
96
|
+
const useFrameworkFilter = (domain === WEB_DOMAIN_ID || parentDomainSelections !== void 0) && cat.id !== FRAMEWORK_SUBCATEGORY_ID && frameworkSelected;
|
|
97
|
+
const filteredSkillOptions = useFrameworkFilter ? skillOptions.filter(
|
|
98
|
+
(skill) => isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds, matrix)
|
|
99
|
+
) : skillOptions;
|
|
100
|
+
const options = filteredSkillOptions.map((skill) => ({
|
|
101
|
+
id: skill.id,
|
|
102
|
+
label: getDisplayLabel(skill),
|
|
103
|
+
state: computeOptionState(skill),
|
|
104
|
+
stateReason: getStateReason(skill),
|
|
105
|
+
selected: skill.selected,
|
|
106
|
+
local: matrix.skills[skill.id]?.local,
|
|
107
|
+
installed: installedSkillIds?.includes(skill.id) || false
|
|
108
|
+
}));
|
|
109
|
+
return {
|
|
110
|
+
id: cat.id,
|
|
111
|
+
displayName: cat.displayName,
|
|
112
|
+
required: cat.required ?? false,
|
|
113
|
+
exclusive: cat.exclusive ?? true,
|
|
114
|
+
options
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
return categoryRows.filter((row) => row.options.length > 0);
|
|
118
|
+
}
|
|
119
|
+
var Footer = ({ validationError }) => {
|
|
120
|
+
return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: 1, children: validationError && /* @__PURE__ */ jsx(Box, { marginBottom: 1, children: /* @__PURE__ */ jsx(Text, { color: "yellow", children: validationError }) }) });
|
|
121
|
+
};
|
|
122
|
+
var LegendRow = () => {
|
|
123
|
+
return /* @__PURE__ */ jsxs(Box, { paddingLeft: 1, columnGap: 2, children: [
|
|
124
|
+
/* @__PURE__ */ jsx(Text, { color: "cyan", children: "active" }),
|
|
125
|
+
/* @__PURE__ */ jsx(Text, { color: "#fff", children: "recommended" }),
|
|
126
|
+
/* @__PURE__ */ jsx(Text, { color: "yellow", children: "discouraged" }),
|
|
127
|
+
/* @__PURE__ */ jsx(Text, { color: "gray", children: "disabled" })
|
|
128
|
+
] });
|
|
129
|
+
};
|
|
130
|
+
var StepBuild = ({
|
|
131
|
+
matrix,
|
|
132
|
+
domain: activeDomain,
|
|
133
|
+
selectedDomains,
|
|
134
|
+
selections,
|
|
135
|
+
allSelections,
|
|
136
|
+
focusedRow,
|
|
137
|
+
focusedCol,
|
|
138
|
+
showDescriptions,
|
|
139
|
+
expertMode,
|
|
140
|
+
parentDomainSelections,
|
|
141
|
+
installedSkillIds,
|
|
142
|
+
onToggle,
|
|
143
|
+
onFocusChange,
|
|
144
|
+
onToggleDescriptions,
|
|
145
|
+
onContinue,
|
|
146
|
+
onBack
|
|
147
|
+
}) => {
|
|
148
|
+
const [validationError, setValidationError] = useState(void 0);
|
|
149
|
+
const categories = buildCategoriesForDomain(
|
|
150
|
+
activeDomain,
|
|
151
|
+
allSelections,
|
|
152
|
+
matrix,
|
|
153
|
+
expertMode,
|
|
154
|
+
selections,
|
|
155
|
+
parentDomainSelections,
|
|
156
|
+
installedSkillIds
|
|
157
|
+
);
|
|
158
|
+
useInput((_input, key) => {
|
|
159
|
+
if (key.return) {
|
|
160
|
+
const validation = validateBuildStep(categories, selections);
|
|
161
|
+
if (validation.valid) {
|
|
162
|
+
setValidationError(void 0);
|
|
163
|
+
onContinue();
|
|
164
|
+
} else {
|
|
165
|
+
setValidationError(validation.message);
|
|
166
|
+
}
|
|
167
|
+
} else if (key.escape) {
|
|
168
|
+
setValidationError(void 0);
|
|
169
|
+
onBack();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: "100%", children: [
|
|
173
|
+
/* @__PURE__ */ jsxs(
|
|
174
|
+
Box,
|
|
175
|
+
{
|
|
176
|
+
columnGap: 2,
|
|
177
|
+
flexDirection: "row",
|
|
178
|
+
justifyContent: "space-between",
|
|
179
|
+
marginBottom: 1,
|
|
180
|
+
paddingRight: 1,
|
|
181
|
+
marginTop: -1,
|
|
182
|
+
borderTop: false,
|
|
183
|
+
borderRight: false,
|
|
184
|
+
borderLeft: false,
|
|
185
|
+
borderColor: "gray",
|
|
186
|
+
borderStyle: "single",
|
|
187
|
+
children: [
|
|
188
|
+
/* @__PURE__ */ jsx(Box, { columnGap: 2, flexDirection: "row", children: selectedDomains.map((domain) => /* @__PURE__ */ jsx(Text, { color: domain === activeDomain ? "cyan" : void 0, children: getDomainDisplayName(domain) }, domain)) }),
|
|
189
|
+
/* @__PURE__ */ jsx(LegendRow, {})
|
|
190
|
+
]
|
|
191
|
+
}
|
|
192
|
+
),
|
|
193
|
+
/* @__PURE__ */ jsxs(ViewTitle, { children: [
|
|
194
|
+
"Customise your ",
|
|
195
|
+
getDomainDisplayName(activeDomain),
|
|
196
|
+
" stack"
|
|
197
|
+
] }),
|
|
198
|
+
/* @__PURE__ */ jsx(
|
|
199
|
+
CategoryGrid,
|
|
200
|
+
{
|
|
201
|
+
categories,
|
|
202
|
+
focusedRow,
|
|
203
|
+
focusedCol,
|
|
204
|
+
expertMode,
|
|
205
|
+
showDescriptions,
|
|
206
|
+
onToggle,
|
|
207
|
+
onFocusChange,
|
|
208
|
+
onToggleDescriptions
|
|
209
|
+
}
|
|
210
|
+
),
|
|
211
|
+
/* @__PURE__ */ jsx(Footer, { validationError })
|
|
212
|
+
] });
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
export {
|
|
216
|
+
validateBuildStep,
|
|
217
|
+
getDisplayLabel,
|
|
218
|
+
StepBuild
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=chunk-WXS4S3MA.js.map
|