@agents-inc/cli 0.32.1 → 0.35.0
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 +24 -0
- package/README.md +7 -7
- package/config/skills-matrix.yaml +10 -10
- package/config/stacks.yaml +9 -9
- package/dist/{chunk-IZZ4IIEG.js → chunk-5LPPIT6H.js} +4 -4
- package/dist/{chunk-Z4TWOP3H.js → chunk-5YNZJ5TP.js} +2 -2
- package/dist/chunk-AQQVSNUX.js +33 -0
- package/dist/chunk-AQQVSNUX.js.map +1 -0
- package/dist/{chunk-ODUOU55D.js → chunk-BLLXNFWP.js} +2 -2
- package/dist/{chunk-YND42IXK.js → chunk-BPD4VUAU.js} +12 -10
- package/dist/chunk-BPD4VUAU.js.map +1 -0
- package/dist/{chunk-4RAY5AOI.js → chunk-CEWNZQMH.js} +3 -3
- package/dist/{chunk-WEUVWHMA.js → chunk-CXWPUVA7.js} +16 -11
- package/dist/chunk-CXWPUVA7.js.map +1 -0
- package/dist/{chunk-R74PZWQS.js → chunk-GGHH3KR2.js} +5 -5
- package/dist/chunk-GGHH3KR2.js.map +1 -0
- package/dist/chunk-HTTPKSL6.js +31 -0
- package/dist/chunk-HTTPKSL6.js.map +1 -0
- package/dist/{chunk-A27LOC4Z.js → chunk-IG7CUREJ.js} +3 -3
- package/dist/{chunk-FJQRVFMB.js → chunk-JXMRTHDT.js} +2 -2
- package/dist/{chunk-JMVWYAHT.js → chunk-KUV24B5M.js} +4 -4
- package/dist/chunk-KUV24B5M.js.map +1 -0
- package/dist/{chunk-B2UBHA66.js → chunk-KWF6D7ZP.js} +38 -36
- package/dist/chunk-KWF6D7ZP.js.map +1 -0
- package/dist/{chunk-IYG2LAIM.js → chunk-LFHZBF6N.js} +5 -17
- package/dist/chunk-LFHZBF6N.js.map +1 -0
- package/dist/{chunk-SO22IQPY.js → chunk-MZB3GGOH.js} +2 -2
- package/dist/chunk-MZB3GGOH.js.map +1 -0
- package/dist/{chunk-W2ZSCZ2U.js → chunk-NJ775OJ4.js} +4 -4
- package/dist/chunk-NVQEHRJY.js +120 -0
- package/dist/chunk-NVQEHRJY.js.map +1 -0
- package/dist/{chunk-LGUI3PMO.js → chunk-OGJ7DFCL.js} +9 -9
- package/dist/chunk-OGJ7DFCL.js.map +1 -0
- package/dist/{chunk-3ZOIOVKT.js → chunk-OGXSTJP2.js} +4 -4
- package/dist/chunk-OGXSTJP2.js.map +1 -0
- package/dist/{chunk-BZN2Z5P7.js → chunk-OI4WBRC7.js} +12 -3
- package/dist/chunk-OI4WBRC7.js.map +1 -0
- package/dist/{chunk-OGJIZ6QH.js → chunk-OKILA27U.js} +122 -232
- package/dist/chunk-OKILA27U.js.map +1 -0
- package/dist/{chunk-PBEHPQLK.js → chunk-PKUIO2Z7.js} +57 -21
- package/dist/chunk-PKUIO2Z7.js.map +1 -0
- package/dist/{chunk-5PIKNCZX.js → chunk-U36YCEBK.js} +79 -39
- package/dist/chunk-U36YCEBK.js.map +1 -0
- package/dist/{chunk-OMV7TLWD.js → chunk-UFUQUFV6.js} +23 -107
- package/dist/chunk-UFUQUFV6.js.map +1 -0
- package/dist/{chunk-R3XFQKPG.js → chunk-VEZ2GZEK.js} +2 -2
- package/dist/{chunk-MM7NK5N2.js → chunk-WMVGRAFB.js} +2896 -2945
- package/dist/chunk-WMVGRAFB.js.map +1 -0
- package/dist/{chunk-UX2H2K2G.js → chunk-XNQJBQ5X.js} +2 -2
- package/dist/{chunk-EMJ2ZKS7.js → chunk-XYCN2GCV.js} +3 -3
- package/dist/{chunk-LAPCUV4D.js → chunk-YCS7GF6Y.js} +2 -4
- package/dist/chunk-YCS7GF6Y.js.map +1 -0
- package/dist/{chunk-UICL22RT.js → chunk-YIKBNGE3.js} +4 -4
- package/dist/{chunk-BZQBJP34.js → chunk-YN35L5NE.js} +2 -2
- package/dist/chunk-YN35L5NE.js.map +1 -0
- package/dist/{chunk-QPTOIZAT.js → chunk-YPJKOM42.js} +2 -2
- package/dist/{chunk-FZGYSLJL.js → chunk-ZE355C6C.js} +2 -2
- package/dist/commands/build/marketplace.js +3 -3
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +20 -9
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/get.js +4 -4
- package/dist/commands/config/index.js +5 -5
- package/dist/commands/config/path.js +4 -4
- package/dist/commands/config/set-project.js +4 -4
- package/dist/commands/config/show.js +5 -5
- package/dist/commands/config/unset-project.js +4 -4
- package/dist/commands/diff.js +5 -5
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +7 -7
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +35 -32
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +5 -5
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +5 -5
- package/dist/commands/info.js +6 -6
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +37 -41
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +5 -5
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +5 -5
- package/dist/commands/new/skill.js +5 -5
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +5 -5
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +7 -7
- package/dist/commands/uninstall.js +105 -28
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +7 -7
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +5 -5
- package/dist/commands/version/bump.js +4 -4
- package/dist/commands/version/index.js +4 -4
- package/dist/commands/version/set.js +4 -4
- package/dist/commands/version/show.js +4 -4
- 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 +34 -66
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +5 -5
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/menu-item.js +2 -2
- package/dist/components/wizard/search-modal.js +3 -3
- package/dist/components/wizard/search-modal.test.js +3 -3
- package/dist/components/wizard/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +2 -2
- package/dist/components/wizard/source-grid.js +4 -4
- package/dist/components/wizard/source-grid.test.js +4 -4
- package/dist/components/wizard/stack-selection.js +8 -8
- package/dist/components/wizard/step-build.js +8 -7
- package/dist/components/wizard/step-build.test.js +18 -17
- 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 +6 -6
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +2 -2
- package/dist/components/wizard/step-settings.js +6 -6
- package/dist/components/wizard/step-settings.test.js +13 -13
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +10 -9
- package/dist/components/wizard/step-sources.test.js +11 -10
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +10 -10
- package/dist/components/wizard/step-stack.test.js +19 -23
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +2 -2
- package/dist/components/wizard/wizard-layout.js +7 -7
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard-tabs.test.js +7 -8
- package/dist/components/wizard/wizard-tabs.test.js.map +1 -1
- package/dist/components/wizard/wizard.js +24 -23
- package/dist/config/skills-matrix.yaml +10 -10
- package/dist/config/stacks.yaml +9 -9
- package/dist/hooks/init.js +5 -3
- package/dist/hooks/init.js.map +1 -1
- package/dist/{source-manager-SBPPLOQQ.js → source-manager-PTK4P6BF.js} +4 -4
- 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/agent-summoner/critical-reminders.md +1 -1
- package/dist/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
- package/dist/src/agents/meta/agent-summoner/examples.md +2 -2
- package/dist/src/agents/meta/agent-summoner/workflow.md +3 -3
- 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/meta/skill-summoner/output-format.md +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 -4
- package/dist/stores/wizard-store.test.js +5 -5
- package/package.json +8 -8
- 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/agent-summoner/critical-reminders.md +1 -1
- package/src/agents/meta/agent-summoner/critical-requirements.md +1 -1
- package/src/agents/meta/agent-summoner/examples.md +2 -2
- package/src/agents/meta/agent-summoner/workflow.md +3 -3
- package/src/agents/meta/documentor/agent.yaml +1 -1
- package/src/agents/meta/skill-summoner/agent.yaml +1 -1
- package/src/agents/meta/skill-summoner/output-format.md +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/src/schemas/project-config.schema.json +3 -0
- package/src/schemas/project-source-config.schema.json +12 -0
- package/dist/chunk-3ZOIOVKT.js.map +0 -1
- package/dist/chunk-5PIKNCZX.js.map +0 -1
- package/dist/chunk-B2UBHA66.js.map +0 -1
- package/dist/chunk-BZN2Z5P7.js.map +0 -1
- package/dist/chunk-BZQBJP34.js.map +0 -1
- package/dist/chunk-H566H3MQ.js +0 -87
- package/dist/chunk-H566H3MQ.js.map +0 -1
- package/dist/chunk-IYG2LAIM.js.map +0 -1
- package/dist/chunk-JMVWYAHT.js.map +0 -1
- package/dist/chunk-LAPCUV4D.js.map +0 -1
- package/dist/chunk-LGUI3PMO.js.map +0 -1
- package/dist/chunk-MM7NK5N2.js.map +0 -1
- package/dist/chunk-O4D67NN7.js +0 -24
- package/dist/chunk-O4D67NN7.js.map +0 -1
- package/dist/chunk-OGJIZ6QH.js.map +0 -1
- package/dist/chunk-OMV7TLWD.js.map +0 -1
- package/dist/chunk-PBEHPQLK.js.map +0 -1
- package/dist/chunk-R74PZWQS.js.map +0 -1
- package/dist/chunk-SO22IQPY.js.map +0 -1
- package/dist/chunk-WEUVWHMA.js.map +0 -1
- package/dist/chunk-YND42IXK.js.map +0 -1
- /package/dist/{chunk-IZZ4IIEG.js.map → chunk-5LPPIT6H.js.map} +0 -0
- /package/dist/{chunk-Z4TWOP3H.js.map → chunk-5YNZJ5TP.js.map} +0 -0
- /package/dist/{chunk-ODUOU55D.js.map → chunk-BLLXNFWP.js.map} +0 -0
- /package/dist/{chunk-4RAY5AOI.js.map → chunk-CEWNZQMH.js.map} +0 -0
- /package/dist/{chunk-A27LOC4Z.js.map → chunk-IG7CUREJ.js.map} +0 -0
- /package/dist/{chunk-FJQRVFMB.js.map → chunk-JXMRTHDT.js.map} +0 -0
- /package/dist/{chunk-W2ZSCZ2U.js.map → chunk-NJ775OJ4.js.map} +0 -0
- /package/dist/{chunk-R3XFQKPG.js.map → chunk-VEZ2GZEK.js.map} +0 -0
- /package/dist/{chunk-UX2H2K2G.js.map → chunk-XNQJBQ5X.js.map} +0 -0
- /package/dist/{chunk-EMJ2ZKS7.js.map → chunk-XYCN2GCV.js.map} +0 -0
- /package/dist/{chunk-UICL22RT.js.map → chunk-YIKBNGE3.js.map} +0 -0
- /package/dist/{chunk-QPTOIZAT.js.map → chunk-YPJKOM42.js.map} +0 -0
- /package/dist/{chunk-FZGYSLJL.js.map → chunk-ZE355C6C.js.map} +0 -0
- /package/dist/{source-manager-SBPPLOQQ.js.map → source-manager-PTK4P6BF.js.map} +0 -0
|
@@ -1,42 +1,41 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
StepSettings
|
|
4
|
-
} from "./chunk-YND42IXK.js";
|
|
5
|
-
import {
|
|
6
|
-
StepSources
|
|
7
|
-
} from "./chunk-WEUVWHMA.js";
|
|
8
2
|
import {
|
|
9
3
|
StepStack
|
|
10
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5LPPIT6H.js";
|
|
11
5
|
import {
|
|
12
6
|
WizardLayout
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import {
|
|
15
|
-
StepBuild
|
|
16
|
-
} from "./chunk-OMV7TLWD.js";
|
|
7
|
+
} from "./chunk-PKUIO2Z7.js";
|
|
17
8
|
import {
|
|
18
9
|
StepConfirm
|
|
19
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-CEWNZQMH.js";
|
|
11
|
+
import {
|
|
12
|
+
StepSettings
|
|
13
|
+
} from "./chunk-BPD4VUAU.js";
|
|
14
|
+
import {
|
|
15
|
+
StepSources
|
|
16
|
+
} from "./chunk-CXWPUVA7.js";
|
|
17
|
+
import {
|
|
18
|
+
StepBuild
|
|
19
|
+
} from "./chunk-UFUQUFV6.js";
|
|
20
20
|
import {
|
|
21
21
|
getStackName
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-MZB3GGOH.js";
|
|
23
23
|
import {
|
|
24
24
|
cliTheme
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-5YNZJ5TP.js";
|
|
26
26
|
import {
|
|
27
27
|
useWizardStore
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-OGXSTJP2.js";
|
|
29
29
|
import {
|
|
30
30
|
resolveAlias,
|
|
31
31
|
validateSelection
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-WMVGRAFB.js";
|
|
33
33
|
import {
|
|
34
34
|
warn
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-OI4WBRC7.js";
|
|
36
36
|
import {
|
|
37
|
-
CLI_COLORS
|
|
38
|
-
|
|
39
|
-
} from "./chunk-LAPCUV4D.js";
|
|
37
|
+
CLI_COLORS
|
|
38
|
+
} from "./chunk-YCS7GF6Y.js";
|
|
40
39
|
import {
|
|
41
40
|
init_esm_shims
|
|
42
41
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -54,6 +53,7 @@ function useWizardInitialization({
|
|
|
54
53
|
matrix,
|
|
55
54
|
initialStep,
|
|
56
55
|
initialInstallMode,
|
|
56
|
+
initialExpertMode,
|
|
57
57
|
installedSkillIds
|
|
58
58
|
}) {
|
|
59
59
|
const initialized = useRef(false);
|
|
@@ -68,6 +68,9 @@ function useWizardInitialization({
|
|
|
68
68
|
if (initialInstallMode) {
|
|
69
69
|
useWizardStore.setState({ installMode: initialInstallMode });
|
|
70
70
|
}
|
|
71
|
+
if (initialExpertMode) {
|
|
72
|
+
useWizardStore.setState({ expertMode: initialExpertMode });
|
|
73
|
+
}
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
76
|
|
|
@@ -123,15 +126,17 @@ function useBuildStepProps({
|
|
|
123
126
|
// src/cli/components/wizard/wizard.tsx
|
|
124
127
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
125
128
|
var MIN_TERMINAL_WIDTH = 80;
|
|
129
|
+
var MIN_TERMINAL_HEIGHT = 15;
|
|
126
130
|
var Wizard = ({
|
|
127
131
|
matrix,
|
|
128
132
|
onComplete,
|
|
129
133
|
onCancel,
|
|
130
134
|
version,
|
|
131
135
|
marketplaceLabel,
|
|
132
|
-
|
|
136
|
+
logo,
|
|
133
137
|
initialStep,
|
|
134
138
|
initialInstallMode,
|
|
139
|
+
initialExpertMode,
|
|
135
140
|
installedSkillIds,
|
|
136
141
|
projectDir
|
|
137
142
|
}) => {
|
|
@@ -139,10 +144,16 @@ var Wizard = ({
|
|
|
139
144
|
const { exit } = useApp();
|
|
140
145
|
const { stdout } = useStdout();
|
|
141
146
|
const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;
|
|
142
|
-
const terminalHeight = stdout.rows ||
|
|
147
|
+
const terminalHeight = stdout.rows || MIN_TERMINAL_HEIGHT;
|
|
143
148
|
const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;
|
|
144
|
-
const isShortTerminal = terminalHeight <
|
|
145
|
-
useWizardInitialization({
|
|
149
|
+
const isShortTerminal = terminalHeight < MIN_TERMINAL_HEIGHT;
|
|
150
|
+
useWizardInitialization({
|
|
151
|
+
matrix,
|
|
152
|
+
initialStep,
|
|
153
|
+
initialInstallMode,
|
|
154
|
+
initialExpertMode,
|
|
155
|
+
installedSkillIds
|
|
156
|
+
});
|
|
146
157
|
const buildStepProps = useBuildStepProps({ store, matrix, installedSkillIds });
|
|
147
158
|
useInput((input, key) => {
|
|
148
159
|
if (store.showSettings) {
|
|
@@ -276,26 +287,17 @@ var Wizard = ({
|
|
|
276
287
|
}
|
|
277
288
|
};
|
|
278
289
|
if (isNarrowTerminal || isShortTerminal) {
|
|
279
|
-
const issue = isNarrowTerminal ? `too narrow (${terminalWidth} columns, need ${MIN_TERMINAL_WIDTH})` : `too short (${terminalHeight} rows, need ${
|
|
290
|
+
const issue = isNarrowTerminal ? `too narrow (${terminalWidth} columns, need ${MIN_TERMINAL_WIDTH})` : `too short (${terminalHeight} rows, need ${MIN_TERMINAL_HEIGHT})`;
|
|
280
291
|
return /* @__PURE__ */ jsx(ThemeProvider, { theme: cliTheme, children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", padding: 1, children: /* @__PURE__ */ jsxs(Text, { color: CLI_COLORS.WARNING, children: [
|
|
281
292
|
"Terminal ",
|
|
282
293
|
issue,
|
|
283
294
|
". Please resize your terminal."
|
|
284
295
|
] }) }) });
|
|
285
296
|
}
|
|
286
|
-
return /* @__PURE__ */ jsx(ThemeProvider, { theme: cliTheme, children: /* @__PURE__ */ jsx(
|
|
287
|
-
WizardLayout,
|
|
288
|
-
{
|
|
289
|
-
version,
|
|
290
|
-
marketplaceLabel,
|
|
291
|
-
brandingName,
|
|
292
|
-
terminalHeight,
|
|
293
|
-
children: renderStep()
|
|
294
|
-
}
|
|
295
|
-
) });
|
|
297
|
+
return /* @__PURE__ */ jsx(ThemeProvider, { theme: cliTheme, children: /* @__PURE__ */ jsx(WizardLayout, { version, marketplaceLabel, logo, children: renderStep() }) });
|
|
296
298
|
};
|
|
297
299
|
|
|
298
300
|
export {
|
|
299
301
|
Wizard
|
|
300
302
|
};
|
|
301
|
-
//# sourceMappingURL=chunk-
|
|
303
|
+
//# sourceMappingURL=chunk-KWF6D7ZP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/wizard.tsx","../src/cli/components/hooks/use-wizard-initialization.ts","../src/cli/components/hooks/use-build-step-props.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useApp, useInput, useStdout } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardLayout } from \"./wizard-layout.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { StepSources } from \"./step-sources.js\";\nimport { StepSettings } from \"./step-settings.js\";\nimport { resolveAlias, validateSelection } from \"../../lib/matrix/index.js\";\nimport type { DomainSelections, MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\nimport { getStackName } from \"./utils.js\";\nimport { warn } from \"../../utils/logger.js\";\nimport { useWizardInitialization } from \"../hooks/use-wizard-initialization.js\";\nimport { useBuildStepProps } from \"../hooks/use-build-step-props.js\";\n\nexport type WizardResultV2 = {\n selectedSkills: SkillId[];\n selectedStackId: string | null;\n domainSelections: DomainSelections;\n sourceSelections: Partial<Record<SkillId, string>>;\n expertMode: boolean;\n installMode: \"plugin\" | \"local\";\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n};\n\ntype WizardProps = {\n matrix: MergedSkillsMatrix;\n onComplete: (result: WizardResultV2) => void;\n onCancel: () => void;\n version?: string;\n marketplaceLabel?: string;\n logo?: string;\n initialStep?: WizardStep;\n initialInstallMode?: \"plugin\" | \"local\";\n initialExpertMode?: boolean;\n installedSkillIds?: SkillId[];\n projectDir?: string;\n};\n\nconst MIN_TERMINAL_WIDTH = 80;\nconst MIN_TERMINAL_HEIGHT = 15;\n\nexport const Wizard: React.FC<WizardProps> = ({\n matrix,\n onComplete,\n onCancel,\n version,\n marketplaceLabel,\n logo,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n installedSkillIds,\n projectDir,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;\n const terminalHeight = stdout.rows || MIN_TERMINAL_HEIGHT;\n const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;\n const isShortTerminal = terminalHeight < MIN_TERMINAL_HEIGHT;\n\n useWizardInitialization({\n matrix,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n installedSkillIds,\n });\n\n const buildStepProps = useBuildStepProps({ store, matrix, installedSkillIds });\n\n useInput((input, key) => {\n // ESC is handled by step-settings.tsx's own useKeyboardNavigation hook\n if (store.showSettings) {\n if (input === \"g\" || input === \"G\") {\n store.toggleSettings();\n }\n return;\n }\n\n if (store.showHelp) {\n if (key.escape || input === \"?\") {\n store.toggleHelp();\n }\n return;\n }\n\n if (input === \"?\") {\n store.toggleHelp();\n return;\n }\n\n if (key.escape) {\n // At the initial stack/scratch selection (approach not yet set), ESC cancels the wizard.\n // StackSelection handles its own ESC via the onCancel prop.\n // Other steps that don't have their own escape handler use goBack.\n if (\n store.step !== \"build\" &&\n store.step !== \"confirm\" &&\n store.step !== \"sources\" &&\n store.step !== \"stack\"\n ) {\n store.goBack();\n }\n return;\n }\n\n if ((input === \"a\" || input === \"A\") && store.step === \"build\" && store.selectedStackId) {\n store.setStackAction(\"defaults\");\n store.setStep(\"confirm\");\n return;\n }\n\n if ((input === \"g\" || input === \"G\") && store.step === \"sources\") {\n store.toggleSettings();\n return;\n }\n\n if (input === \"e\" || input === \"E\") {\n store.toggleExpertMode();\n return;\n }\n if (input === \"p\" || input === \"P\") {\n store.toggleInstallMode();\n }\n });\n\n const handleComplete = useCallback(() => {\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = matrix.suggestedStacks.find((s) => s.id === store.selectedStackId);\n if (!stack) {\n warn(`Stack not found in matrix: '${store.selectedStackId}'`);\n }\n allSkills = [...(stack?.allSkillIds || [])];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => {\n const resolved = resolveAlias(tech, matrix);\n if (!matrix.skills[resolved]) {\n warn(\n `Technology '${tech}' could not be resolved to a skill ID - it may be missing from skill_aliases`,\n );\n }\n return resolved;\n });\n }\n\n const methodologySkills = store.getDefaultMethodologySkills();\n for (const skill of methodologySkills) {\n if (!allSkills.includes(skill)) {\n allSkills.push(skill);\n }\n }\n\n const validation = validateSelection(allSkills, matrix);\n\n const result: WizardResultV2 = {\n selectedSkills: allSkills,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n sourceSelections: store.sourceSelections,\n expertMode: store.expertMode,\n installMode: store.installMode,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, matrix, onComplete, exit]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n exit();\n }, [onCancel, exit]);\n\n const renderStep = () => {\n switch (store.step) {\n case \"stack\":\n return <StepStack matrix={matrix} onCancel={handleCancel} />;\n\n case \"build\":\n return <StepBuild {...buildStepProps} />;\n\n case \"sources\": {\n if (store.showSettings) {\n return (\n <StepSettings\n projectDir={projectDir || process.cwd()}\n onClose={() => store.toggleSettings()}\n />\n );\n }\n return (\n <StepSources\n matrix={matrix}\n projectDir={projectDir}\n onContinue={() => store.setStep(\"confirm\")}\n onBack={store.goBack}\n />\n );\n }\n\n case \"confirm\": {\n const stackName = getStackName(store.selectedStackId, matrix);\n const technologyCount = store.getTechnologyCount();\n return (\n <StepConfirm\n onComplete={handleComplete}\n stackName={stackName}\n selectedDomains={store.selectedDomains}\n domainSelections={store.domainSelections}\n technologyCount={technologyCount}\n skillCount={technologyCount}\n installMode={store.installMode}\n onBack={store.goBack}\n />\n );\n }\n\n default:\n return null;\n }\n };\n\n if (isNarrowTerminal || isShortTerminal) {\n const issue = isNarrowTerminal\n ? `too narrow (${terminalWidth} columns, need ${MIN_TERMINAL_WIDTH})`\n : `too short (${terminalHeight} rows, need ${MIN_TERMINAL_HEIGHT})`;\n\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <Text color={CLI_COLORS.WARNING}>Terminal {issue}. Please resize your terminal.</Text>\n </Box>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={cliTheme}>\n <WizardLayout version={version} marketplaceLabel={marketplaceLabel} logo={logo}>\n {renderStep()}\n </WizardLayout>\n </ThemeProvider>\n );\n};\n","import { useRef } from \"react\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport type { MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\n\ntype UseWizardInitializationOptions = {\n matrix: MergedSkillsMatrix;\n initialStep?: WizardStep;\n initialInstallMode?: \"plugin\" | \"local\";\n initialExpertMode?: boolean;\n installedSkillIds?: SkillId[];\n};\n\n/**\n * Runs one-time wizard store initialization before the first render.\n * Populates step, approach, install mode, and skill selections from props.\n */\nexport function useWizardInitialization({\n matrix,\n initialStep,\n initialInstallMode,\n initialExpertMode,\n installedSkillIds,\n}: UseWizardInitializationOptions): void {\n const initialized = useRef(false);\n\n if (!initialized.current) {\n initialized.current = true;\n\n if (initialStep) {\n if (installedSkillIds?.length) {\n useWizardStore\n .getState()\n .populateFromSkillIds(installedSkillIds, matrix.skills, matrix.categories);\n }\n useWizardStore.setState({ step: initialStep, approach: \"scratch\" });\n }\n if (initialInstallMode) {\n useWizardStore.setState({ installMode: initialInstallMode });\n }\n if (initialExpertMode) {\n useWizardStore.setState({ expertMode: initialExpertMode });\n }\n }\n}\n","import { useCallback } from \"react\";\nimport type { Domain, MergedSkillsMatrix, SkillId } from \"../../types/index.js\";\nimport type { WizardState } from \"../../stores/wizard-store.js\";\nimport type { StepBuildProps } from \"../wizard/step-build.js\";\n\ntype UseBuildStepPropsOptions = {\n store: WizardState;\n matrix: MergedSkillsMatrix;\n installedSkillIds?: SkillId[];\n};\n\nexport function useBuildStepProps({\n store,\n matrix,\n installedSkillIds,\n}: UseBuildStepPropsOptions): StepBuildProps {\n const currentDomain = store.getCurrentDomain();\n const defaultDomains: Domain[] = [\"web\"];\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;\n\n const allSelections = store.getAllSelectedTechnologies();\n\n const activeDomain: Domain = currentDomain || effectiveDomains[0] || \"web\";\n const parentDomainSelections = store.getParentDomainSelections(activeDomain, matrix);\n\n const onToggle = useCallback(\n (subcategoryId: Parameters<StepBuildProps[\"onToggle\"]>[0], techId: SkillId) => {\n const domain: Domain = store.getCurrentDomain() || \"web\";\n const cat = matrix.categories[subcategoryId];\n store.toggleTechnology(domain, subcategoryId, techId, cat?.exclusive ?? true);\n },\n [store, matrix],\n );\n\n const onContinue = useCallback(() => {\n if (!store.nextDomain()) {\n store.setStep(\"sources\");\n }\n }, [store]);\n\n const onBack = useCallback(() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }, [store]);\n\n return {\n matrix,\n domain: activeDomain,\n selectedDomains: effectiveDomains,\n selections: store.domainSelections[activeDomain] || {},\n allSelections,\n showDescriptions: store.showDescriptions,\n expertMode: store.expertMode,\n parentDomainSelections,\n installedSkillIds,\n onToggle,\n onToggleDescriptions: store.toggleShowDescriptions,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
CLI_COLORS
|
|
4
|
-
|
|
5
|
-
UI_SYMBOLS
|
|
6
|
-
} from "./chunk-LAPCUV4D.js";
|
|
3
|
+
CLI_COLORS
|
|
4
|
+
} from "./chunk-YCS7GF6Y.js";
|
|
7
5
|
import {
|
|
8
6
|
init_esm_shims
|
|
9
7
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -30,15 +28,8 @@ var getStepState = (stepId, currentStep, completedSteps, skippedSteps) => {
|
|
|
30
28
|
if (skippedSteps.includes(stepId)) return "skipped";
|
|
31
29
|
return "pending";
|
|
32
30
|
};
|
|
33
|
-
var STEP_STATE_SYMBOLS = {
|
|
34
|
-
completed: UI_SYMBOLS.SELECTED,
|
|
35
|
-
current: UI_SYMBOLS.CURRENT,
|
|
36
|
-
pending: UI_SYMBOLS.UNSELECTED,
|
|
37
|
-
skipped: UI_SYMBOLS.SKIPPED
|
|
38
|
-
};
|
|
39
31
|
var Tab = ({ step, state }) => {
|
|
40
|
-
const
|
|
41
|
-
const label = `${symbol} [${step.number}] ${step.label}`;
|
|
32
|
+
const label = `[${step.number}] ${step.label}`;
|
|
42
33
|
switch (state) {
|
|
43
34
|
case "current":
|
|
44
35
|
return /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.PRIMARY, children: label });
|
|
@@ -56,10 +47,8 @@ var WizardTabs = ({
|
|
|
56
47
|
currentStep,
|
|
57
48
|
completedSteps,
|
|
58
49
|
skippedSteps = [],
|
|
59
|
-
version
|
|
60
|
-
brandingName
|
|
50
|
+
version
|
|
61
51
|
}) => {
|
|
62
|
-
const displayName = brandingName ?? DEFAULT_BRANDING.NAME;
|
|
63
52
|
return /* @__PURE__ */ jsxs(
|
|
64
53
|
Box,
|
|
65
54
|
{
|
|
@@ -71,7 +60,6 @@ var WizardTabs = ({
|
|
|
71
60
|
borderStyle: "single",
|
|
72
61
|
paddingRight: 1,
|
|
73
62
|
children: [
|
|
74
|
-
/* @__PURE__ */ jsx(Text, { bold: true, color: CLI_COLORS.PRIMARY, children: displayName }),
|
|
75
63
|
steps.map((step) => {
|
|
76
64
|
const state = getStepState(step.id, currentStep, completedSteps, skippedSteps);
|
|
77
65
|
return /* @__PURE__ */ jsx(Tab, { step, state }, step.id);
|
|
@@ -87,4 +75,4 @@ export {
|
|
|
87
75
|
formatStepLabel,
|
|
88
76
|
WizardTabs
|
|
89
77
|
};
|
|
90
|
-
//# sourceMappingURL=chunk-
|
|
78
|
+
//# sourceMappingURL=chunk-LFHZBF6N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/wizard-tabs.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text } from \"ink\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { WizardStep } from \"../../stores/wizard-store.js\";\n\ntype WizardTabStep = {\n id: WizardStep;\n label: string;\n number: number;\n};\n\nexport type WizardTabsProps = {\n steps: WizardTabStep[];\n currentStep: WizardStep;\n completedSteps: WizardStep[];\n skippedSteps?: WizardStep[];\n version?: string;\n};\n\nexport const WIZARD_STEPS: WizardTabStep[] = [\n { id: \"stack\", label: \"Stack\", number: 1 },\n { id: \"build\", label: \"Build\", number: 2 },\n { id: \"sources\", label: \"Sources\", number: 3 },\n { id: \"confirm\", label: \"Confirm\", number: 4 },\n];\n\ntype FormattedStepLabel = {\n /** The step number indicator, e.g. \"[1]\" */\n prefix: string;\n /** The step label text, e.g. \"Stack\" */\n label: string;\n /** The complete formatted string, e.g. \"[1] Stack\" */\n full: string;\n};\n\n/** Format a wizard step as its tab label parts and full string, e.g. \"[1] Stack\" */\nexport function formatStepLabel(stepId: WizardStep): FormattedStepLabel {\n const step = WIZARD_STEPS.find((s) => s.id === stepId);\n if (!step) return { prefix: \"\", label: stepId, full: stepId };\n const prefix = `[${step.number}]`;\n return { prefix, label: step.label, full: `${prefix} ${step.label}` };\n}\n\ntype StepState = \"completed\" | \"current\" | \"pending\" | \"skipped\";\n\nconst getStepState = (\n stepId: WizardStep,\n currentStep: WizardStep,\n completedSteps: WizardStep[],\n skippedSteps: WizardStep[],\n): StepState => {\n if (completedSteps.includes(stepId)) return \"completed\";\n if (stepId === currentStep) return \"current\";\n if (skippedSteps.includes(stepId)) return \"skipped\";\n return \"pending\";\n};\n\ntype TabProps = {\n step: WizardTabStep;\n state: StepState;\n};\n\nconst Tab: React.FC<TabProps> = ({ step, state }) => {\n const label = `[${step.number}] ${step.label}`;\n\n switch (state) {\n case \"current\":\n return <Text color={CLI_COLORS.PRIMARY}>{label}</Text>;\n case \"completed\":\n return <Text>{label}</Text>;\n case \"skipped\":\n return <Text dimColor>{label}</Text>;\n case \"pending\":\n default:\n return <Text color={CLI_COLORS.UNFOCUSED}>{label}</Text>;\n }\n};\n\nexport const WizardTabs: React.FC<WizardTabsProps> = ({\n steps,\n currentStep,\n completedSteps,\n skippedSteps = [],\n version,\n}) => {\n return (\n <Box\n flexDirection=\"row\"\n columnGap={2}\n borderRight={false}\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingRight={1}\n >\n {steps.map((step) => {\n const state = getStepState(step.id, currentStep, completedSteps, skippedSteps);\n\n return <Tab key={step.id} step={step} state={state} />;\n })}\n <Box flexGrow={1} justifyContent=\"flex-end\">\n <Text dimColor>{`v${version}`}</Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;AAAA;AACA,SAAS,KAAK,YAAY;AAkEb,cAmBT,YAnBS;AAhDN,IAAM,eAAgC;AAAA,EAC3C,EAAE,IAAI,SAAS,OAAO,SAAS,QAAQ,EAAE;AAAA,EACzC,EAAE,IAAI,SAAS,OAAO,SAAS,QAAQ,EAAE;AAAA,EACzC,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,EAAE;AAAA,EAC7C,EAAE,IAAI,WAAW,OAAO,WAAW,QAAQ,EAAE;AAC/C;AAYO,SAAS,gBAAgB,QAAwC;AACtE,QAAM,OAAO,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACrD,MAAI,CAAC,KAAM,QAAO,EAAE,QAAQ,IAAI,OAAO,QAAQ,MAAM,OAAO;AAC5D,QAAM,SAAS,IAAI,KAAK,MAAM;AAC9B,SAAO,EAAE,QAAQ,OAAO,KAAK,OAAO,MAAM,GAAG,MAAM,IAAI,KAAK,KAAK,GAAG;AACtE;AAIA,IAAM,eAAe,CACnB,QACA,aACA,gBACA,iBACc;AACd,MAAI,eAAe,SAAS,MAAM,EAAG,QAAO;AAC5C,MAAI,WAAW,YAAa,QAAO;AACnC,MAAI,aAAa,SAAS,MAAM,EAAG,QAAO;AAC1C,SAAO;AACT;AAOA,IAAM,MAA0B,CAAC,EAAE,MAAM,MAAM,MAAM;AACnD,QAAM,QAAQ,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK;AAE5C,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,oBAAC,QAAK,OAAO,WAAW,SAAU,iBAAM;AAAA,IACjD,KAAK;AACH,aAAO,oBAAC,QAAM,iBAAM;AAAA,IACtB,KAAK;AACH,aAAO,oBAAC,QAAK,UAAQ,MAAE,iBAAM;AAAA,IAC/B,KAAK;AAAA,IACL;AACE,aAAO,oBAAC,QAAK,OAAO,WAAW,WAAY,iBAAM;AAAA,EACrD;AACF;AAEO,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC;AAAA,EAChB;AACF,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,WAAW;AAAA,MACX,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,cAAc;AAAA,MAEb;AAAA,cAAM,IAAI,CAAC,SAAS;AACnB,gBAAM,QAAQ,aAAa,KAAK,IAAI,aAAa,gBAAgB,YAAY;AAE7E,iBAAO,oBAAC,OAAkB,MAAY,SAArB,KAAK,EAA8B;AAAA,QACtD,CAAC;AAAA,QACD,oBAAC,OAAI,UAAU,GAAG,gBAAe,YAC/B,8BAAC,QAAK,UAAQ,MAAE,cAAI,OAAO,IAAG,GAChC;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -18,7 +18,7 @@ function getDomainDisplayName(domain) {
|
|
|
18
18
|
mobile: "Mobile",
|
|
19
19
|
shared: "Shared"
|
|
20
20
|
};
|
|
21
|
-
return displayNames[domain]
|
|
21
|
+
return displayNames[domain];
|
|
22
22
|
}
|
|
23
23
|
function getStackName(stackId, matrix) {
|
|
24
24
|
if (!stackId) return void 0;
|
|
@@ -42,4 +42,4 @@ export {
|
|
|
42
42
|
getStackName,
|
|
43
43
|
getDomainsFromStack
|
|
44
44
|
};
|
|
45
|
-
//# sourceMappingURL=chunk-
|
|
45
|
+
//# sourceMappingURL=chunk-MZB3GGOH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/utils.ts"],"sourcesContent":["import { unique } from \"remeda\";\nimport type { CategoryMap, Domain, MergedSkillsMatrix, ResolvedStack } from \"../../types/index.js\";\nimport { typedKeys } from \"../../utils/typed-object.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];\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\n/** Extract unique domains from a stack's agent-to-skill mappings. */\nexport function getDomainsFromStack(stack: ResolvedStack, categories: CategoryMap): Domain[] {\n const subcategories = Object.values(stack.skills).flatMap((config) =>\n config ? typedKeys(config) : [],\n );\n return unique(\n subcategories.flatMap((sub) => {\n const d = categories[sub]?.domain;\n return d ? [d] : [];\n }),\n ).sort();\n}\n"],"mappings":";;;;;;;;;AAAA;AAAA,SAAS,cAAc;AAIhB,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;AAC5B;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;AAGO,SAAS,oBAAoB,OAAsB,YAAmC;AAC3F,QAAM,gBAAgB,OAAO,OAAO,MAAM,MAAM,EAAE;AAAA,IAAQ,CAAC,WACzD,SAAS,UAAU,MAAM,IAAI,CAAC;AAAA,EAChC;AACA,SAAO;AAAA,IACL,cAAc,QAAQ,CAAC,QAAQ;AAC7B,YAAM,IAAI,WAAW,GAAG,GAAG;AAC3B,aAAO,IAAI,CAAC,CAAC,IAAI,CAAC;AAAA,IACpB,CAAC;AAAA,EACH,EAAE,KAAK;AACT;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
BaseCommand
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BLLXNFWP.js";
|
|
5
5
|
import {
|
|
6
6
|
DEFAULT_SOURCE,
|
|
7
7
|
SOURCE_ENV_VAR,
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
loadProjectSourceConfig,
|
|
11
11
|
resolveAgentsSource,
|
|
12
12
|
resolveSource
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-WMVGRAFB.js";
|
|
14
14
|
import {
|
|
15
15
|
DEFAULT_BRANDING
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-YCS7GF6Y.js";
|
|
17
17
|
import {
|
|
18
18
|
init_esm_shims
|
|
19
19
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -90,4 +90,4 @@ ${DEFAULT_BRANDING.NAME} Configuration
|
|
|
90
90
|
export {
|
|
91
91
|
ConfigShow
|
|
92
92
|
};
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
93
|
+
//# sourceMappingURL=chunk-NJ775OJ4.js.map
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
useWizardStore
|
|
4
|
+
} from "./chunk-OGXSTJP2.js";
|
|
5
|
+
import {
|
|
6
|
+
CLI_COLORS,
|
|
7
|
+
UI_SYMBOLS
|
|
8
|
+
} from "./chunk-YCS7GF6Y.js";
|
|
9
|
+
import {
|
|
10
|
+
init_esm_shims
|
|
11
|
+
} from "./chunk-DHET7RCE.js";
|
|
12
|
+
|
|
13
|
+
// src/cli/components/wizard/domain-selection.tsx
|
|
14
|
+
init_esm_shims();
|
|
15
|
+
import { useState } from "react";
|
|
16
|
+
import { Box, Text, useInput } from "ink";
|
|
17
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
var CONTINUE_VALUE = "_continue";
|
|
19
|
+
var AVAILABLE_DOMAINS = [
|
|
20
|
+
{ id: "web", label: "Web", description: "Frontend web applications" },
|
|
21
|
+
{
|
|
22
|
+
id: "web-extras",
|
|
23
|
+
label: "Web Extras",
|
|
24
|
+
description: "Animation, files, realtime, PWA, accessibility"
|
|
25
|
+
},
|
|
26
|
+
{ id: "api", label: "API", description: "Backend APIs and services" },
|
|
27
|
+
{ id: "cli", label: "CLI", description: "Command-line tools" },
|
|
28
|
+
{ id: "mobile", label: "Mobile", description: "Mobile applications" }
|
|
29
|
+
];
|
|
30
|
+
var DomainSelection = () => {
|
|
31
|
+
const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();
|
|
32
|
+
const [focusedIndex, setFocusedIndex] = useState(0);
|
|
33
|
+
const handleBack = () => {
|
|
34
|
+
setApproach(null);
|
|
35
|
+
selectStack(null);
|
|
36
|
+
};
|
|
37
|
+
const items = [
|
|
38
|
+
...AVAILABLE_DOMAINS.map((domain) => ({ type: "domain", domain })),
|
|
39
|
+
...selectedDomains.length > 0 ? [{ type: "continue" }] : []
|
|
40
|
+
];
|
|
41
|
+
const totalItems = items.length;
|
|
42
|
+
useInput((input, key) => {
|
|
43
|
+
if (key.escape) {
|
|
44
|
+
handleBack();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (key.upArrow || input === "k") {
|
|
48
|
+
setFocusedIndex((prev) => prev <= 0 ? totalItems - 1 : prev - 1);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (key.downArrow || input === "j") {
|
|
52
|
+
setFocusedIndex((prev) => prev >= totalItems - 1 ? 0 : prev + 1);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (key.return) {
|
|
56
|
+
if (selectedDomains.length > 0) {
|
|
57
|
+
setStep("build");
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (input === " ") {
|
|
62
|
+
const focusedItem = items[focusedIndex];
|
|
63
|
+
if (!focusedItem) return;
|
|
64
|
+
if (focusedItem.type === "domain") {
|
|
65
|
+
toggleDomain(focusedItem.domain.id);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
70
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: "Select domains to configure:" }),
|
|
71
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Select one or more domains, then continue" }),
|
|
72
|
+
/* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: 1, children: items.map((item, index) => {
|
|
73
|
+
const isFocused = index === focusedIndex;
|
|
74
|
+
if (item.type === "continue") {
|
|
75
|
+
return /* @__PURE__ */ jsxs(Box, { columnGap: 1, children: [
|
|
76
|
+
/* @__PURE__ */ jsx(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: isFocused ? UI_SYMBOLS.CURRENT : " " }),
|
|
77
|
+
/* @__PURE__ */ jsxs(Text, { bold: isFocused, color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: [
|
|
78
|
+
"\u2192",
|
|
79
|
+
" Continue with ",
|
|
80
|
+
selectedDomains.length,
|
|
81
|
+
" domain(s)"
|
|
82
|
+
] })
|
|
83
|
+
] }, CONTINUE_VALUE);
|
|
84
|
+
}
|
|
85
|
+
const isSelected = selectedDomains.includes(item.domain.id);
|
|
86
|
+
const checkbox = isSelected ? "[\u2713]" : "[ ]";
|
|
87
|
+
return /* @__PURE__ */ jsxs(Box, { columnGap: 1, children: [
|
|
88
|
+
/* @__PURE__ */ jsx(Text, { color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: isFocused ? UI_SYMBOLS.CURRENT : " " }),
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
Text,
|
|
91
|
+
{
|
|
92
|
+
bold: isFocused,
|
|
93
|
+
color: isSelected || isFocused ? CLI_COLORS.PRIMARY : void 0,
|
|
94
|
+
children: checkbox
|
|
95
|
+
}
|
|
96
|
+
),
|
|
97
|
+
/* @__PURE__ */ jsx(Text, { bold: isFocused, color: isFocused ? CLI_COLORS.PRIMARY : void 0, children: item.domain.label }),
|
|
98
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
99
|
+
"- ",
|
|
100
|
+
item.domain.description
|
|
101
|
+
] })
|
|
102
|
+
] }, item.domain.id);
|
|
103
|
+
}) }),
|
|
104
|
+
selectedDomains.length > 0 ? /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsxs(Text, { children: [
|
|
105
|
+
"Selected: ",
|
|
106
|
+
/* @__PURE__ */ jsx(Text, { color: CLI_COLORS.PRIMARY, children: selectedDomains.join(", ") })
|
|
107
|
+
] }) }) : /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WARNING, children: "Please select at least one domain" }) }),
|
|
108
|
+
/* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
109
|
+
"\u2191",
|
|
110
|
+
"/",
|
|
111
|
+
"\u2193",
|
|
112
|
+
" navigate SPACE toggle ENTER continue ESC back"
|
|
113
|
+
] }) })
|
|
114
|
+
] });
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export {
|
|
118
|
+
DomainSelection
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=chunk-NVQEHRJY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/domain-selection.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { Domain } from \"../../types/index.js\";\nimport { CLI_COLORS, UI_SYMBOLS } from \"../../consts.js\";\n\nconst CONTINUE_VALUE = \"_continue\";\n\nconst AVAILABLE_DOMAINS: Array<{ id: Domain; label: string; description: string }> = [\n { id: \"web\", label: \"Web\", description: \"Frontend web applications\" },\n {\n id: \"web-extras\",\n label: \"Web Extras\",\n description: \"Animation, files, realtime, PWA, accessibility\",\n },\n { id: \"api\", label: \"API\", description: \"Backend APIs and services\" },\n { id: \"cli\", label: \"CLI\", description: \"Command-line tools\" },\n { id: \"mobile\", label: \"Mobile\", description: \"Mobile applications\" },\n];\n\ntype ListItem =\n | { type: \"domain\"; domain: (typeof AVAILABLE_DOMAINS)[number] }\n | { type: \"continue\" };\n\nexport const DomainSelection: React.FC = () => {\n const { selectedDomains, toggleDomain, setStep, setApproach, selectStack } = useWizardStore();\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n const handleBack = () => {\n setApproach(null);\n selectStack(null);\n };\n\n const items: ListItem[] = [\n ...AVAILABLE_DOMAINS.map((domain) => ({ type: \"domain\" as const, domain })),\n ...(selectedDomains.length > 0 ? [{ type: \"continue\" as const }] : []),\n ];\n\n const totalItems = items.length;\n\n useInput((input, key) => {\n if (key.escape) {\n handleBack();\n return;\n }\n\n if (key.upArrow || input === \"k\") {\n setFocusedIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1));\n return;\n }\n\n if (key.downArrow || input === \"j\") {\n setFocusedIndex((prev) => (prev >= totalItems - 1 ? 0 : prev + 1));\n return;\n }\n\n // ENTER: continue if domains selected\n if (key.return) {\n if (selectedDomains.length > 0) {\n setStep(\"build\");\n }\n return;\n }\n\n // SPACE: toggle domain selection\n if (input === \" \") {\n const focusedItem = items[focusedIndex];\n if (!focusedItem) return;\n\n if (focusedItem.type === \"domain\") {\n toggleDomain(focusedItem.domain.id);\n }\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>Select domains to configure:</Text>\n <Text dimColor>Select one or more domains, then continue</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {items.map((item, index) => {\n const isFocused = index === focusedIndex;\n\n if (item.type === \"continue\") {\n return (\n <Box key={CONTINUE_VALUE} columnGap={1}>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {isFocused ? UI_SYMBOLS.CURRENT : \" \"}\n </Text>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {\"\\u2192\"} Continue with {selectedDomains.length} domain(s)\n </Text>\n </Box>\n );\n }\n\n const isSelected = selectedDomains.includes(item.domain.id);\n const checkbox = isSelected ? \"[\\u2713]\" : \"[ ]\";\n\n return (\n <Box key={item.domain.id} columnGap={1}>\n <Text color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {isFocused ? UI_SYMBOLS.CURRENT : \" \"}\n </Text>\n <Text\n bold={isFocused}\n color={isSelected || isFocused ? CLI_COLORS.PRIMARY : undefined}\n >\n {checkbox}\n </Text>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {item.domain.label}\n </Text>\n <Text dimColor>- {item.domain.description}</Text>\n </Box>\n );\n })}\n </Box>\n {selectedDomains.length > 0 ? (\n <Box marginTop={1}>\n <Text>\n Selected: <Text color={CLI_COLORS.PRIMARY}>{selectedDomains.join(\", \")}</Text>\n </Text>\n </Box>\n ) : (\n <Box marginTop={1}>\n <Text color={CLI_COLORS.WARNING}>Please select at least one domain</Text>\n </Box>\n )}\n <Box marginTop={1}>\n <Text dimColor>\n {\"\\u2191\"}/{\"\\u2193\"} navigate SPACE toggle ENTER continue ESC back\n </Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;AAAA;AAAA,SAAgB,gBAAgB;AAChC,SAAS,KAAK,MAAM,gBAAgB;AA4E9B,cAYU,YAZV;AAvEN,IAAM,iBAAiB;AAEvB,IAAM,oBAA+E;AAAA,EACnF,EAAE,IAAI,OAAO,OAAO,OAAO,aAAa,4BAA4B;AAAA,EACpE;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,EAAE,IAAI,OAAO,OAAO,OAAO,aAAa,4BAA4B;AAAA,EACpE,EAAE,IAAI,OAAO,OAAO,OAAO,aAAa,qBAAqB;AAAA,EAC7D,EAAE,IAAI,UAAU,OAAO,UAAU,aAAa,sBAAsB;AACtE;AAMO,IAAM,kBAA4B,MAAM;AAC7C,QAAM,EAAE,iBAAiB,cAAc,SAAS,aAAa,YAAY,IAAI,eAAe;AAC5F,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAElD,QAAM,aAAa,MAAM;AACvB,gBAAY,IAAI;AAChB,gBAAY,IAAI;AAAA,EAClB;AAEA,QAAM,QAAoB;AAAA,IACxB,GAAG,kBAAkB,IAAI,CAAC,YAAY,EAAE,MAAM,UAAmB,OAAO,EAAE;AAAA,IAC1E,GAAI,gBAAgB,SAAS,IAAI,CAAC,EAAE,MAAM,WAAoB,CAAC,IAAI,CAAC;AAAA,EACtE;AAEA,QAAM,aAAa,MAAM;AAEzB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,iBAAW;AACX;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,sBAAgB,CAAC,SAAU,QAAQ,IAAI,aAAa,IAAI,OAAO,CAAE;AACjE;AAAA,IACF;AAEA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,sBAAgB,CAAC,SAAU,QAAQ,aAAa,IAAI,IAAI,OAAO,CAAE;AACjE;AAAA,IACF;AAGA,QAAI,IAAI,QAAQ;AACd,UAAI,gBAAgB,SAAS,GAAG;AAC9B,gBAAQ,OAAO;AAAA,MACjB;AACA;AAAA,IACF;AAGA,QAAI,UAAU,KAAK;AACjB,YAAM,cAAc,MAAM,YAAY;AACtC,UAAI,CAAC,YAAa;AAElB,UAAI,YAAY,SAAS,UAAU;AACjC,qBAAa,YAAY,OAAO,EAAE;AAAA,MACpC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,wBAAC,QAAK,MAAI,MAAC,0CAA4B;AAAA,IACvC,oBAAC,QAAK,UAAQ,MAAC,uDAAyC;AAAA,IACxD,oBAAC,OAAI,eAAc,UAAS,WAAW,GACpC,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,YAAM,YAAY,UAAU;AAE5B,UAAI,KAAK,SAAS,YAAY;AAC5B,eACE,qBAAC,OAAyB,WAAW,GACnC;AAAA,8BAAC,QAAK,OAAO,YAAY,WAAW,UAAU,QAC3C,sBAAY,WAAW,UAAU,KACpC;AAAA,UACA,qBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D;AAAA;AAAA,YAAS;AAAA,YAAgB,gBAAgB;AAAA,YAAO;AAAA,aACnD;AAAA,aANQ,cAOV;AAAA,MAEJ;AAEA,YAAM,aAAa,gBAAgB,SAAS,KAAK,OAAO,EAAE;AAC1D,YAAM,WAAW,aAAa,aAAa;AAE3C,aACE,qBAAC,OAAyB,WAAW,GACnC;AAAA,4BAAC,QAAK,OAAO,YAAY,WAAW,UAAU,QAC3C,sBAAY,WAAW,UAAU,KACpC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,OAAO,cAAc,YAAY,WAAW,UAAU;AAAA,YAErD;AAAA;AAAA,QACH;AAAA,QACA,oBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D,eAAK,OAAO,OACf;AAAA,QACA,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,UAAG,KAAK,OAAO;AAAA,WAAY;AAAA,WAblC,KAAK,OAAO,EActB;AAAA,IAEJ,CAAC,GACH;AAAA,IACC,gBAAgB,SAAS,IACxB,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK;AAAA;AAAA,MACM,oBAAC,QAAK,OAAO,WAAW,SAAU,0BAAgB,KAAK,IAAI,GAAE;AAAA,OACzE,GACF,IAEA,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,OAAO,WAAW,SAAS,+CAAiC,GACpE;AAAA,IAEF,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK,UAAQ,MACX;AAAA;AAAA,MAAS;AAAA,MAAE;AAAA,MAAS;AAAA,OACvB,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
ViewTitle
|
|
4
|
-
} from "./chunk-O4D67NN7.js";
|
|
5
2
|
import {
|
|
6
3
|
getDomainsFromStack
|
|
7
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-MZB3GGOH.js";
|
|
5
|
+
import {
|
|
6
|
+
ViewTitle
|
|
7
|
+
} from "./chunk-HTTPKSL6.js";
|
|
8
8
|
import {
|
|
9
9
|
MenuItem
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-YPJKOM42.js";
|
|
11
11
|
import {
|
|
12
12
|
useWizardStore
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-OGXSTJP2.js";
|
|
14
14
|
import {
|
|
15
15
|
DEFAULT_SCRATCH_DOMAINS
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-YCS7GF6Y.js";
|
|
17
17
|
import {
|
|
18
18
|
init_esm_shims
|
|
19
19
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -73,7 +73,7 @@ var StackSelection = ({ matrix, onCancel }) => {
|
|
|
73
73
|
}
|
|
74
74
|
});
|
|
75
75
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
76
|
-
/* @__PURE__ */ jsx(ViewTitle, { children: "Choose a stack" }),
|
|
76
|
+
/* @__PURE__ */ jsx(ViewTitle, { children: "[1] Choose a stack" }),
|
|
77
77
|
/* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: 1, children: [
|
|
78
78
|
stacks.map((stack, index) => /* @__PURE__ */ jsx(
|
|
79
79
|
MenuItem,
|
|
@@ -106,4 +106,4 @@ var StackSelection = ({ matrix, onCancel }) => {
|
|
|
106
106
|
export {
|
|
107
107
|
StackSelection
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-OGJ7DFCL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport { DEFAULT_SCRATCH_DOMAINS } from \"../../consts.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { MergedSkillsMatrix } from \"../../types/index.js\";\nimport { getDomainsFromStack } from \"./utils.js\";\nimport { MenuItem } from \"./menu-item.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\nconst INITIAL_FOCUSED_INDEX = 0;\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\n/** Number of extra items after the stack list (scratch option) */\nconst EXTRA_ITEMS_COUNT = 1;\n\n/** Width of the horizontal divider between stack list and scratch option */\nconst DIVIDER_WIDTH = 30;\n\nexport type StackSelectionProps = {\n matrix: MergedSkillsMatrix;\n onCancel?: () => void;\n};\n\nexport const StackSelection: React.FC<StackSelectionProps> = ({ matrix, onCancel }) => {\n const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } =\n useWizardStore();\n const [focusedIndex, setFocusedIndex] = useState(INITIAL_FOCUSED_INDEX);\n\n const stacks = matrix.suggestedStacks;\n const stackCount = stacks.length;\n const scratchIndex = stackCount;\n const totalItems = stackCount + EXTRA_ITEMS_COUNT;\n\n useInput((input, key) => {\n if (key.escape) {\n if (onCancel) {\n onCancel();\n }\n return;\n }\n\n if (key.return) {\n if (focusedIndex === scratchIndex) {\n selectStack(null);\n setApproach(\"scratch\");\n\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n toggleDomain(domain);\n }\n return;\n }\n\n const focusedStack = stacks[focusedIndex];\n if (focusedStack) {\n selectStack(focusedStack.id);\n setStackAction(\"customize\");\n populateFromSkillIds(focusedStack.allSkillIds, matrix.skills, matrix.categories);\n\n const stackDomains = getDomainsFromStack(focusedStack, matrix.categories);\n for (const domain of stackDomains) {\n toggleDomain(domain);\n }\n\n setApproach(\"stack\");\n }\n return;\n }\n\n if (key.upArrow || input === \"k\") {\n setFocusedIndex((prev) => Math.max(0, prev - 1));\n return;\n }\n if (key.downArrow || input === \"j\") {\n setFocusedIndex((prev) => Math.min(totalItems - 1, prev + 1));\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <ViewTitle>[1] Choose a stack</ViewTitle>\n <Box flexDirection=\"column\" marginTop={1}>\n {stacks.map((stack, index) => (\n <MenuItem\n key={stack.id}\n label={stack.name}\n description={stack.description}\n isFocused={index === focusedIndex}\n />\n ))}\n {stackCount > 0 && (\n <Box marginTop={1}>\n <Text dimColor>{\"\\u2500\".repeat(DIVIDER_WIDTH)}</Text>\n </Box>\n )}\n <Box marginTop={stackCount > 0 ? 0 : undefined}>\n <MenuItem\n label={SCRATCH_LABEL}\n description={SCRATCH_DESCRIPTION}\n isFocused={focusedIndex === scratchIndex}\n />\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>\n {\"\\u2191\"}/{\"\\u2193\"} navigate ENTER select ESC quit\n </Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,gBAAgB;AAChC,SAAS,KAAK,MAAM,gBAAgB;AA+E9B,cACA,YADA;AAvEN,IAAM,wBAAwB;AAC9B,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAG5B,IAAM,oBAAoB;AAG1B,IAAM,gBAAgB;AAOf,IAAM,iBAAgD,CAAC,EAAE,QAAQ,SAAS,MAAM;AACrF,QAAM,EAAE,aAAa,aAAa,gBAAgB,sBAAsB,aAAa,IACnF,eAAe;AACjB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,qBAAqB;AAEtE,QAAM,SAAS,OAAO;AACtB,QAAM,aAAa,OAAO;AAC1B,QAAM,eAAe;AACrB,QAAM,aAAa,aAAa;AAEhC,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,UAAI,iBAAiB,cAAc;AACjC,oBAAY,IAAI;AAChB,oBAAY,SAAS;AAErB,mBAAW,UAAU,yBAAyB;AAC5C,uBAAa,MAAM;AAAA,QACrB;AACA;AAAA,MACF;AAEA,YAAM,eAAe,OAAO,YAAY;AACxC,UAAI,cAAc;AAChB,oBAAY,aAAa,EAAE;AAC3B,uBAAe,WAAW;AAC1B,6BAAqB,aAAa,aAAa,OAAO,QAAQ,OAAO,UAAU;AAE/E,cAAM,eAAe,oBAAoB,cAAc,OAAO,UAAU;AACxE,mBAAW,UAAU,cAAc;AACjC,uBAAa,MAAM;AAAA,QACrB;AAEA,oBAAY,OAAO;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,sBAAgB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAC/C;AAAA,IACF;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,sBAAgB,CAAC,SAAS,KAAK,IAAI,aAAa,GAAG,OAAO,CAAC,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,wBAAC,aAAU,gCAAkB;AAAA,IAC7B,qBAAC,OAAI,eAAc,UAAS,WAAW,GACpC;AAAA,aAAO,IAAI,CAAC,OAAO,UAClB;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,MAAM;AAAA,UACb,aAAa,MAAM;AAAA,UACnB,WAAW,UAAU;AAAA;AAAA,QAHhB,MAAM;AAAA,MAIb,CACD;AAAA,MACA,aAAa,KACZ,oBAAC,OAAI,WAAW,GACd,8BAAC,QAAK,UAAQ,MAAE,mBAAS,OAAO,aAAa,GAAE,GACjD;AAAA,MAEF,oBAAC,OAAI,WAAW,aAAa,IAAI,IAAI,QACnC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP,aAAa;AAAA,UACb,WAAW,iBAAiB;AAAA;AAAA,MAC9B,GACF;AAAA,OACF;AAAA,IACA,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK,UAAQ,MACX;AAAA;AAAA,MAAS;AAAA,MAAE;AAAA,MAAS;AAAA,OACvB,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveAlias
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-WMVGRAFB.js";
|
|
5
5
|
import {
|
|
6
6
|
typedEntries,
|
|
7
7
|
typedKeys
|
|
8
8
|
} from "./chunk-T4EXUIBY.js";
|
|
9
9
|
import {
|
|
10
10
|
warn
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-OI4WBRC7.js";
|
|
12
12
|
import {
|
|
13
13
|
DEFAULT_PRESELECTED_SKILLS
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-YCS7GF6Y.js";
|
|
15
15
|
import {
|
|
16
16
|
init_esm_shims
|
|
17
17
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -362,4 +362,4 @@ var useWizardStore = create((set, get) => ({
|
|
|
362
362
|
export {
|
|
363
363
|
useWizardStore
|
|
364
364
|
};
|
|
365
|
-
//# sourceMappingURL=chunk-
|
|
365
|
+
//# sourceMappingURL=chunk-OGXSTJP2.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.js\";\nimport { resolveAlias } from \"../lib/matrix/index.js\";\nimport type {\n BoundSkill,\n Domain,\n DomainSelections,\n MergedSkillsMatrix,\n SkillAlias,\n SkillAssignment,\n SkillId,\n Subcategory,\n SubcategorySelections,\n} from \"../types/index.js\";\nimport { warn } from \"../utils/logger.js\";\nimport { typedEntries, typedKeys } from \"../utils/typed-object.js\";\n\nconst ALL_DOMAINS: Domain[] = [\"web\", \"web-extras\", \"api\", \"cli\", \"mobile\", \"shared\"];\n\nconst DEFAULT_SOURCE_ID = \"public\";\nconst DEFAULT_SOURCE_LABEL = \"Public\";\n\n/** Sort priority: local first, then public, then private/other */\nconst SOURCE_SORT_ORDER: Record<string, number> = {\n local: 0,\n public: 1,\n private: 2,\n};\n\nconst SOURCE_DISPLAY_NAMES: Record<string, string> = {\n public: \"Public\",\n local: \"Local\",\n};\n\nconst DEFAULT_SORT_PRIORITY = 3;\n\nfunction formatSourceLabel(source: {\n name: string;\n version?: string;\n installed?: boolean;\n}): string {\n const displayName = SOURCE_DISPLAY_NAMES[source.name] ?? source.name;\n const prefix = source.installed ? \"\\u2713 \" : \"\";\n const versionSuffix = source.version ? ` \\u00B7 v${source.version}` : \"\";\n return `${prefix}${displayName}${versionSuffix}`;\n}\n\ntype SkillLookupEntry = { category: string; displayName?: string };\n\nfunction resolveSkillForPopulation(\n skillId: SkillId,\n skills: Partial<Record<SkillId, SkillLookupEntry>>,\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n): { domain: Domain; subcat: Subcategory; techId: SkillId } | null {\n const skill = skills[skillId];\n if (!skill?.category || !skill.displayName) {\n warn(\n `Installed skill '${skillId}' is missing from the marketplace — it may have been removed or renamed`,\n );\n return null;\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 warn(`Installed skill '${skillId}' has unknown category '${skill.category}' — skipping`);\n return null;\n }\n\n // Boundary cast: display name resolved to SkillId downstream by resolveAlias\n return { domain, subcat, techId: skill.displayName as SkillId };\n}\n\nfunction buildBoundSkillOptions(\n boundSkills: BoundSkill[],\n alias: SkillAlias,\n selectedSource: string,\n): { id: string; label: string; selected: boolean; installed: boolean }[] {\n return boundSkills\n .filter((b) => b.boundTo === alias)\n .map((bound) => ({\n id: bound.sourceName,\n label: formatSourceLabel({\n name: bound.sourceName,\n installed: false,\n }),\n selected: selectedSource === bound.sourceName,\n installed: false,\n }));\n}\n\n/** Extract the alias from a skill ID or use displayName from the matrix */\nfunction getSkillAlias(skillId: SkillId, matrix: MergedSkillsMatrix): SkillAlias {\n const displayName = matrix.displayNames?.[skillId];\n if (displayName) return displayName;\n // Fallback: use the last segment of the skill ID (e.g., \"web-framework-react\" -> \"react\")\n const segments = skillId.split(\"-\");\n const fallback = segments[segments.length - 1] || skillId;\n warn(`No display name found for skill '${skillId}', using fallback alias '${fallback}'`);\n return fallback;\n}\n\n/**\n * Wizard step identifiers for the multi-step init/edit flow.\n *\n * Progression: stack -> build -> sources -> confirm\n * The \"stack\" step shows all stacks + \"Start from scratch\" in a unified list.\n * Navigation is tracked via the `history` stack for goBack() support.\n */\nexport type WizardStep =\n | \"stack\" // Unified first step: select stack or \"Start from scratch\", then domain selection\n | \"build\" // CategoryGrid for technology selection\n | \"sources\" // Choose skill sources (recommended vs custom)\n | \"confirm\"; // Final confirmation\n\n/**\n * Wizard store state and actions.\n *\n * The store uses a composition pattern: small, focused actions that each mutate\n * one or two state fields. Wizard step components compose these actions to build\n * up the full selection state incrementally (domains -> subcategories -> skills -> sources).\n *\n * State flow: unified stack/scratch selection -> domain selection -> per-domain skill\n * selection (build step) -> source customization -> 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 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 showHelp: boolean;\n enabledSources: Record<string, boolean>;\n\n boundSkills: BoundSkill[];\n\n history: WizardStep[];\n\n /**\n * Navigate to a wizard step, pushing the current step onto history.\n * @param step - Target step to navigate to\n *\n * Side effects: sets `step`, appends previous step to `history`\n */\n setStep: (step: WizardStep) => void;\n /**\n * Set the wizard approach (stack-based or build-from-scratch).\n * @param approach - \"stack\" to use a pre-built template, \"scratch\" to select skills manually, null to reset\n *\n * Side effects: sets `approach`\n */\n setApproach: (approach: \"stack\" | \"scratch\" | null) => void;\n /**\n * Select a stack by ID, or null to deselect.\n * @param stackId - Stack identifier from suggestedStacks, or null to clear\n *\n * Side effects: sets `selectedStackId`\n */\n selectStack: (stackId: string | null) => void;\n /**\n * Set how to apply the selected stack.\n * @param action - \"defaults\" to use stack as-is, \"customize\" to enter the build step\n *\n * Side effects: sets `stackAction`\n */\n setStackAction: (action: \"defaults\" | \"customize\") => void;\n /**\n * Pre-populate domainSelections from a stack's agent-to-skill mappings.\n *\n * Iterates all agents in the stack, resolving each subcategory's skill assignments\n * to the appropriate domain. Enables all domains and deduplicates skill IDs.\n *\n * @param stack - Stack definition with agent-level skill assignments\n * @param stack.agents - Record of agent name to `{ subcategory: SkillAssignment[] }` mappings\n * @param categories - Category definitions used to resolve subcategory -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to ALL_DOMAINS\n */\n populateFromStack: (\n stack: { agents: Record<string, Partial<Record<Subcategory, SkillAssignment[]>>> },\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n /**\n * Pre-populate domainSelections from a flat list of installed skill IDs.\n *\n * Used by `agentsinc edit` to restore wizard state from existing project config.\n * Looks up each skill's category and domain, warns for unresolvable skills.\n *\n * @param skillIds - Flat array of currently installed skill IDs\n * @param skills - Skill lookup providing category and displayName per skill ID\n * @param categories - Category definitions used to resolve subcategory -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to ALL_DOMAINS\n */\n populateFromSkillIds: (\n skillIds: SkillId[],\n skills: Partial<Record<SkillId, { category: string; displayName?: string }>>,\n categories: Partial<Record<Subcategory, { domain?: Domain }>>,\n ) => void;\n /**\n * Toggle a domain on or off in the selectedDomains list.\n * @param domain - Domain to toggle\n *\n * Side effects: adds or removes from `selectedDomains`\n */\n toggleDomain: (domain: Domain) => void;\n /**\n * Toggle a skill selection within a domain's subcategory.\n *\n * When exclusive is true (radio behavior), selecting a new skill replaces any\n * existing selection in that subcategory. When false (checkbox behavior),\n * the skill is added to or removed from the selection array.\n *\n * @param domain - Domain containing the subcategory\n * @param subcategory - Subcategory within the domain\n * @param technology - Skill ID to toggle\n * @param exclusive - If true, only one skill can be selected per subcategory (radio)\n *\n * Side effects: updates `domainSelections[domain][subcategory]`\n */\n toggleTechnology: (\n domain: Domain,\n subcategory: Subcategory,\n technology: SkillId,\n exclusive: boolean,\n ) => void;\n /**\n * Advance to the next domain in the build step.\n * @returns true if advanced, false if already at the last domain\n *\n * Side effects: increments `currentDomainIndex`\n */\n nextDomain: () => boolean;\n /**\n * Go back to the previous domain in the build step.\n * @returns true if moved back, false if already at the first domain\n *\n * Side effects: decrements `currentDomainIndex`\n */\n prevDomain: () => boolean;\n /** Toggle skill description visibility in the build step grid. */\n toggleShowDescriptions: () => void;\n /** Toggle expert mode (shows advanced/niche skills in the build step). */\n toggleExpertMode: () => void;\n /** Toggle between \"plugin\" and \"local\" install modes. */\n toggleInstallMode: () => void;\n /**\n * Set which source provides a specific skill.\n * @param skillId - Skill to configure the source for\n * @param sourceId - Source identifier (e.g., \"public\", \"local\", marketplace name)\n *\n * Side effects: updates `sourceSelections[skillId]`. No-op with warning if either param is empty.\n */\n setSourceSelection: (skillId: SkillId, sourceId: string) => void;\n /**\n * Enable or disable source customization on the sources step.\n * @param customize - true to show per-skill source pickers\n *\n * Side effects: sets `customizeSources`\n */\n setCustomizeSources: (customize: boolean) => void;\n /** Toggle the settings overlay (source management). */\n toggleSettings: () => void;\n /** Toggle the help overlay (hotkey reference). */\n toggleHelp: () => void;\n /**\n * Replace the full set of enabled/disabled sources.\n * @param sources - Record of source name to enabled boolean. Empty-string keys are filtered out.\n *\n * Side effects: sets `enabledSources`\n */\n setEnabledSources: (sources: Record<string, boolean>) => void;\n /**\n * Add a bound skill from search to the wizard's bound skills list.\n * Duplicates (same id + sourceUrl) are silently skipped with a warning.\n *\n * @param skill - Bound skill to add (foreign skill tied to a subcategory alias)\n *\n * Side effects: appends to `boundSkills`\n */\n bindSkill: (skill: BoundSkill) => void;\n /**\n * Navigate to the previous wizard step using the history stack.\n * Falls back to \"stack\" if history is empty.\n *\n * Side effects: pops from `history`, sets `step` to the popped value\n */\n goBack: () => void;\n /** Reset all wizard state to initial values. */\n reset: () => void;\n\n /**\n * Collect all selected skill IDs across all domains and subcategories.\n * @returns Flat array of every selected SkillId (may contain duplicates if shared across domains)\n */\n getAllSelectedTechnologies: () => SkillId[];\n /**\n * Group selected skill IDs by domain.\n * @returns Partial record mapping each domain with selections to its skill ID array\n */\n getSelectedTechnologiesPerDomain: () => Partial<Record<Domain, SkillId[]>>;\n /**\n * Get the domain currently visible in the build step.\n * @returns The domain at currentDomainIndex, or null if no domains are selected\n */\n getCurrentDomain: () => Domain | null;\n /** Returns the foundational methodology skills that are always preselected (DEFAULT_PRESELECTED_SKILLS). */\n getDefaultMethodologySkills: () => SkillId[];\n /**\n * Count total selected technologies across all domains.\n * @returns Number of selected skill IDs\n */\n getTechnologyCount: () => number;\n /**\n * Compute which wizard steps are completed and which are skipped.\n * Used by WizardTabs to render step progress indicators.\n * @returns Object with completedSteps and skippedSteps string arrays\n */\n getStepProgress: () => { completedSteps: WizardStep[]; skippedSteps: WizardStep[] };\n /** @returns true if there is a next domain after the current one */\n canGoToNextDomain: () => boolean;\n /** @returns true if there is a previous domain before the current one */\n canGoToPreviousDomain: () => boolean;\n /**\n * Find the parent domain for a sub-domain (e.g., web-extras -> web).\n * @param domain - Domain to look up\n * @param matrix - Merged skills matrix containing category definitions with parent_domain\n * @returns The parent domain, or undefined if the domain has no parent\n */\n getParentDomain: (domain: Domain, matrix: MergedSkillsMatrix) => Domain | undefined;\n /**\n * Get the current selections of a domain's parent domain.\n * Used for framework-first filtering: web-extras inherits web's framework selections.\n *\n * @param domain - Sub-domain to find parent selections for\n * @param matrix - Merged skills matrix containing category definitions\n * @returns The parent domain's SubcategorySelections, or undefined if no parent\n */\n getParentDomainSelections: (\n domain: Domain,\n matrix: MergedSkillsMatrix,\n ) => SubcategorySelections | undefined;\n /**\n * Build the source selection rows for the sources step UI.\n *\n * For each selected technology, resolves the canonical skill ID, looks up available\n * sources from the matrix, merges in any bound skills from search, and determines\n * which source is currently selected. Sources are sorted: local first, then public,\n * then private/other.\n *\n * @param matrix - Merged skills matrix with resolved skills and their available sources\n * @returns Array of row objects, one per selected technology, each containing:\n * - `skillId` - Canonical resolved skill ID\n * - `displayName` - Human-readable skill alias\n * - `alias` - Same as displayName (for backward compatibility)\n * - `options` - Available sources with selection state and install status\n */\n buildSourceRows: (matrix: MergedSkillsMatrix) => {\n skillId: SkillId;\n displayName: SkillAlias;\n alias: SkillAlias;\n options: { id: string; label: string; selected: boolean; installed: boolean }[];\n }[];\n};\n\nconst createInitialState = () => ({\n step: \"stack\" 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 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 showHelp: 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 })),\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 [subcat, assignments] of typedEntries<Subcategory, SkillAssignment[]>(\n agentConfig,\n )) {\n const category = categories[subcat];\n const domain = category?.domain;\n\n if (!domain || !assignments) {\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 for (const assignment of assignments) {\n if (!domainSelections[domain][subcat].includes(assignment.id)) {\n domainSelections[domain][subcat].push(assignment.id);\n }\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 let skippedCount = 0;\n\n for (const skillId of skillIds) {\n const resolved = resolveSkillForPopulation(skillId, skills, categories);\n if (!resolved) {\n skippedCount++;\n continue;\n }\n\n const { domain, subcat, techId } = resolved;\n if (!domainSelections[domain]) domainSelections[domain] = {};\n if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];\n\n if (!domainSelections[domain][subcat].includes(techId)) {\n domainSelections[domain][subcat].push(techId);\n }\n }\n\n if (skippedCount > 0) {\n warn(`${skippedCount} installed skill(s) could not be resolved and were skipped`);\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 });\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 });\n return true;\n }\n return false;\n },\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 if (!skillId) {\n warn(\"Ignoring setSourceSelection call with empty skillId\");\n return state;\n }\n if (!sourceId) {\n warn(`Ignoring setSourceSelection call with empty sourceId for skill '${skillId}'`);\n return state;\n }\n return {\n sourceSelections: { ...state.sourceSelections, [skillId]: sourceId },\n };\n }),\n\n setCustomizeSources: (customize) => set({ customizeSources: customize }),\n\n toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),\n\n toggleHelp: () => set((state) => ({ showHelp: !state.showHelp })),\n\n setEnabledSources: (sources) => {\n const invalidKeys = Object.keys(sources).filter((key) => !key.trim());\n if (invalidKeys.length > 0) {\n warn(\"Ignoring setEnabledSources call with empty source name(s)\");\n }\n const validSources = Object.fromEntries(Object.entries(sources).filter(([key]) => key.trim()));\n return set({ enabledSources: validSources });\n },\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) {\n warn(`Skill '${skill.id}' from '${skill.sourceUrl}' is already bound — skipping duplicate`);\n return state;\n }\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 || \"stack\",\n history,\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 getSelectedTechnologiesPerDomain: () => {\n const state = get();\n const result: Partial<Record<Domain, SkillId[]>> = {};\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n const techs: SkillId[] = [];\n for (const subcategory of typedKeys<Subcategory>(domainSel)) {\n const subTechs = domainSel[subcategory];\n if (subTechs) techs.push(...subTechs);\n }\n if (techs.length > 0) {\n result[domain] = techs;\n }\n }\n return result;\n },\n\n getCurrentDomain: () => {\n const state = get();\n return state.selectedDomains[state.currentDomainIndex] || null;\n },\n\n getDefaultMethodologySkills: () => {\n return [...DEFAULT_PRESELECTED_SKILLS];\n },\n\n getTechnologyCount: () => {\n return get().getAllSelectedTechnologies().length;\n },\n\n getStepProgress: () => {\n const state = get();\n const completed: WizardStep[] = [];\n const skipped: WizardStep[] = [];\n\n if (state.step !== \"stack\") {\n completed.push(\"stack\");\n }\n\n if (state.approach === \"stack\" && state.selectedStackId && state.stackAction === \"defaults\") {\n skipped.push(\"build\");\n skipped.push(\"sources\");\n } else if (state.step === \"confirm\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n } else if (state.step === \"sources\") {\n completed.push(\"build\");\n }\n\n return { completedSteps: completed, skippedSteps: skipped };\n },\n\n canGoToNextDomain: () => {\n const state = get();\n return state.currentDomainIndex < state.selectedDomains.length - 1;\n },\n\n canGoToPreviousDomain: () => {\n const state = get();\n return state.currentDomainIndex > 0;\n },\n\n getParentDomain: (domain, matrix) => {\n const cat = Object.values(matrix.categories).find(\n (c) => c.domain === domain && c.parent_domain,\n );\n return cat?.parent_domain;\n },\n\n getParentDomainSelections: (domain, matrix) => {\n const state = get();\n const parentDomain = state.getParentDomain(domain, matrix);\n if (!parentDomain) return undefined;\n return state.domainSelections[parentDomain];\n },\n\n buildSourceRows: (matrix) => {\n const state = get();\n const selectedTechnologies = get().getAllSelectedTechnologies();\n const { sourceSelections, boundSkills } = state;\n\n return selectedTechnologies.map((tech) => {\n const skillId = resolveAlias(tech, matrix);\n const skill = matrix.skills[skillId];\n const selectedSource =\n sourceSelections[skillId] || skill?.activeSource?.name || DEFAULT_SOURCE_ID;\n const alias = getSkillAlias(skillId, matrix);\n\n const sortedSources = [...(skill?.availableSources || [])].sort(\n (a, b) =>\n (SOURCE_SORT_ORDER[a.type] ?? DEFAULT_SORT_PRIORITY) -\n (SOURCE_SORT_ORDER[b.type] ?? DEFAULT_SORT_PRIORITY),\n );\n\n const options =\n sortedSources.length > 0\n ? sortedSources.map((source) => ({\n id: source.name,\n label: formatSourceLabel({\n name: source.name,\n version: source.version,\n installed: source.installed,\n }),\n selected: selectedSource === source.name,\n installed: source.installed,\n }))\n : [\n {\n id: DEFAULT_SOURCE_ID,\n label: DEFAULT_SOURCE_LABEL,\n selected: selectedSource === DEFAULT_SOURCE_ID,\n installed: false,\n },\n ];\n\n options.push(...buildBoundSkillOptions(boundSkills, alias, selectedSource));\n\n return { skillId, displayName: alias, alias, options };\n });\n },\n}));\n"],"mappings":"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","names":[]}
|