@agents-inc/cli 0.61.0 → 0.64.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 +36 -0
- package/README.md +23 -172
- package/dist/{chunk-YHOHLNHM.js → chunk-3YNT3NX3.js} +13 -11
- package/dist/chunk-3YNT3NX3.js.map +1 -0
- package/dist/{chunk-IGM6HA3S.js → chunk-4C7CSZC5.js} +27 -149
- package/dist/chunk-4C7CSZC5.js.map +1 -0
- package/dist/{chunk-WHISPMAQ.js → chunk-4KVBH2X4.js} +33 -14
- package/dist/chunk-4KVBH2X4.js.map +1 -0
- package/dist/{chunk-KIWFEBKH.js → chunk-52THXN5G.js} +14 -5
- package/dist/chunk-52THXN5G.js.map +1 -0
- package/dist/{chunk-FWMWWE3X.js → chunk-53URJ5XK.js} +448 -152
- package/dist/chunk-53URJ5XK.js.map +1 -0
- package/dist/{chunk-H5DASUX5.js → chunk-6DEK3TDF.js} +10 -10
- package/dist/chunk-6DEK3TDF.js.map +1 -0
- package/dist/{chunk-SDKCQXWE.js → chunk-6IK2TCK7.js} +13 -6
- package/dist/chunk-6IK2TCK7.js.map +1 -0
- package/dist/chunk-6VIOO74O.js +51 -0
- package/dist/chunk-6VIOO74O.js.map +1 -0
- package/dist/{chunk-52XO4ULK.js → chunk-7DI3HGKL.js} +32 -14
- package/dist/chunk-7DI3HGKL.js.map +1 -0
- package/dist/{chunk-MGNYPVOJ.js → chunk-AQYAVLZK.js} +2 -2
- package/dist/{chunk-BNQ5O6LE.js → chunk-AUNBGZS4.js} +2 -2
- package/dist/chunk-BGPGQF35.js +248 -0
- package/dist/chunk-BGPGQF35.js.map +1 -0
- package/dist/chunk-BKL3DF2Q.js +45 -0
- package/dist/chunk-BKL3DF2Q.js.map +1 -0
- package/dist/{chunk-AX3SZZWA.js → chunk-BKTPEATV.js} +13 -6
- package/dist/chunk-BKTPEATV.js.map +1 -0
- package/dist/{chunk-H7WJK7NJ.js → chunk-CKPJTMNC.js} +13 -6
- package/dist/chunk-CKPJTMNC.js.map +1 -0
- package/dist/{chunk-MR6OBL3B.js → chunk-CXRVM7BA.js} +2 -4
- package/dist/chunk-CXRVM7BA.js.map +1 -0
- package/dist/{chunk-VR3CDXDT.js → chunk-EE5EPS32.js} +2 -2
- package/dist/{chunk-6OWHQ7HM.js → chunk-EGMQ3SXN.js} +2 -11
- package/dist/{chunk-6OWHQ7HM.js.map → chunk-EGMQ3SXN.js.map} +1 -1
- package/dist/{chunk-6DAZG54T.js → chunk-EZ35IPXZ.js} +10 -7
- package/dist/chunk-EZ35IPXZ.js.map +1 -0
- package/dist/{chunk-OCEFD7V6.js → chunk-F3REOP7N.js} +3 -3
- package/dist/{chunk-C577AJE7.js → chunk-FGLUQSVU.js} +3 -3
- package/dist/{chunk-Z3TM4N37.js → chunk-J4POGAJF.js} +24 -24
- package/dist/chunk-J4POGAJF.js.map +1 -0
- package/dist/{chunk-O6BA7Q2B.js → chunk-KFDTVSIC.js} +18 -8
- package/dist/chunk-KFDTVSIC.js.map +1 -0
- package/dist/{chunk-LWXRUR6B.js → chunk-LMZXL5RQ.js} +2 -2
- package/dist/{chunk-LWXRUR6B.js.map → chunk-LMZXL5RQ.js.map} +1 -1
- package/dist/{chunk-7FMEMXJ4.js → chunk-MOMI77PL.js} +100 -59
- package/dist/chunk-MOMI77PL.js.map +1 -0
- package/dist/{chunk-BFD5NZQ4.js → chunk-MVYJVKVT.js} +19 -11
- package/dist/chunk-MVYJVKVT.js.map +1 -0
- package/dist/{chunk-X5EG4EFP.js → chunk-MWGDG4QN.js} +2 -2
- package/dist/{chunk-KDO6WU76.js → chunk-O2HK3NTG.js} +10 -6
- package/dist/chunk-O2HK3NTG.js.map +1 -0
- package/dist/{chunk-46DQG2N7.js → chunk-OORWBS6F.js} +45 -52
- package/dist/chunk-OORWBS6F.js.map +1 -0
- package/dist/{chunk-CIG7IKX3.js → chunk-OV5UJWS5.js} +4 -4
- package/dist/{chunk-IEEVXLJB.js → chunk-R46CB36B.js} +5 -5
- package/dist/{chunk-GH2RQ4MI.js → chunk-RG3KDXMR.js} +16 -8
- package/dist/chunk-RG3KDXMR.js.map +1 -0
- package/dist/{chunk-MMFQNJPE.js → chunk-SXGBPQY6.js} +3 -3
- package/dist/chunk-SXGBPQY6.js.map +1 -0
- package/dist/{chunk-XUDTFI4M.js → chunk-T5DJCIUP.js} +2 -2
- package/dist/{chunk-AJJJE7F7.js → chunk-TQLDQ3XZ.js} +2 -2
- package/dist/{chunk-M6YWRMXH.js → chunk-WSMQ5GAP.js} +33 -21
- package/dist/chunk-WSMQ5GAP.js.map +1 -0
- package/dist/{chunk-WYVDNGJB.js → chunk-XMLCXRTS.js} +3 -3
- package/dist/{chunk-SDLDPFNV.js → chunk-YEGPTBX5.js} +4 -4
- package/dist/{chunk-SRBN6RRD.js → chunk-ZFY5EMDV.js} +5 -5
- package/dist/{chunk-BKJHAJQW.js → chunk-ZYUASJUN.js} +7 -4
- package/dist/chunk-ZYUASJUN.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +7 -6
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +7 -6
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +11 -80
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +7 -6
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +6 -5
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/show.js +7 -6
- package/dist/commands/diff.js +6 -5
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +11 -15
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +63 -69
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +13 -13
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +7 -6
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +14 -16
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +32 -30
- package/dist/commands/list.js +6 -5
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +7 -6
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +28 -11
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +7 -6
- package/dist/commands/outdated.js +6 -5
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +13 -11
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +9 -10
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +12 -8
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +20 -42
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/skill-search/skill-search.js +4 -3
- package/dist/components/wizard/category-grid.js +5 -3
- package/dist/components/wizard/category-grid.test.js +242 -194
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +5 -5
- package/dist/components/wizard/checkbox-grid.test.js +5 -5
- package/dist/components/wizard/domain-selection.js +12 -11
- package/dist/components/wizard/help-modal.js +3 -2
- package/dist/components/wizard/menu-item.js +1 -1
- package/dist/components/wizard/search-modal.js +3 -2
- package/dist/components/wizard/search-modal.test.js +3 -2
- package/dist/components/wizard/search-modal.test.js.map +1 -1
- package/dist/components/wizard/section-progress.js +2 -2
- package/dist/components/wizard/section-progress.test.js +3 -3
- package/dist/components/wizard/section-progress.test.js.map +1 -1
- package/dist/components/wizard/selection-card.js +2 -2
- package/dist/components/wizard/source-grid.js +6 -4
- package/dist/components/wizard/source-grid.test.js +65 -40
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +9 -8
- package/dist/components/wizard/step-agents.js +11 -10
- package/dist/components/wizard/step-agents.test.js +28 -25
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +12 -10
- package/dist/components/wizard/step-build.test.js +28 -34
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +6 -4
- package/dist/components/wizard/step-confirm.test.js +11 -15
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +3 -2
- package/dist/components/wizard/step-refine.test.js +3 -2
- package/dist/components/wizard/step-refine.test.js.map +1 -1
- package/dist/components/wizard/step-settings.js +10 -8
- package/dist/components/wizard/step-settings.test.js +17 -13
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +13 -11
- package/dist/components/wizard/step-sources.test.js +17 -14
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +15 -14
- package/dist/components/wizard/step-stack.test.js +42 -38
- 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 +10 -8
- package/dist/components/wizard/wizard-tabs.js +2 -2
- package/dist/components/wizard/wizard-tabs.test.js +2 -2
- package/dist/components/wizard/wizard.js +29 -27
- package/dist/hooks/init.js +32 -30
- package/dist/hooks/init.js.map +1 -1
- package/dist/{loader-2O32KKAQ.js → loader-4YOZCFIP.js} +4 -4
- package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
- package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
- package/dist/{source-loader-KMEBBZCQ.js → source-loader-O5RMYUBW.js} +6 -5
- package/dist/{source-manager-5XBSPJNR.js → source-manager-NKLL6HCL.js} +6 -5
- package/dist/stores/matrix-store.js +15 -0
- package/dist/stores/matrix-store.js.map +1 -0
- package/dist/stores/matrix-store.test.js +146 -0
- package/dist/stores/matrix-store.test.js.map +1 -0
- package/dist/stores/wizard-store.js +6 -5
- package/dist/stores/wizard-store.test.js +159 -107
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-46DQG2N7.js.map +0 -1
- package/dist/chunk-52XO4ULK.js.map +0 -1
- package/dist/chunk-6DAZG54T.js.map +0 -1
- package/dist/chunk-7FMEMXJ4.js.map +0 -1
- package/dist/chunk-AX3SZZWA.js.map +0 -1
- package/dist/chunk-BFD5NZQ4.js.map +0 -1
- package/dist/chunk-BKJHAJQW.js.map +0 -1
- package/dist/chunk-FWMWWE3X.js.map +0 -1
- package/dist/chunk-GH2RQ4MI.js.map +0 -1
- package/dist/chunk-H5DASUX5.js.map +0 -1
- package/dist/chunk-H7WJK7NJ.js.map +0 -1
- package/dist/chunk-IGM6HA3S.js.map +0 -1
- package/dist/chunk-KD2YS76O.js +0 -151
- package/dist/chunk-KD2YS76O.js.map +0 -1
- package/dist/chunk-KDO6WU76.js.map +0 -1
- package/dist/chunk-KIWFEBKH.js.map +0 -1
- package/dist/chunk-M6YWRMXH.js.map +0 -1
- package/dist/chunk-MMFQNJPE.js.map +0 -1
- package/dist/chunk-MR6OBL3B.js.map +0 -1
- package/dist/chunk-O6BA7Q2B.js.map +0 -1
- package/dist/chunk-SDKCQXWE.js.map +0 -1
- package/dist/chunk-WHISPMAQ.js.map +0 -1
- package/dist/chunk-YHOHLNHM.js.map +0 -1
- package/dist/chunk-Z3TM4N37.js.map +0 -1
- /package/dist/{chunk-MGNYPVOJ.js.map → chunk-AQYAVLZK.js.map} +0 -0
- /package/dist/{chunk-BNQ5O6LE.js.map → chunk-AUNBGZS4.js.map} +0 -0
- /package/dist/{chunk-VR3CDXDT.js.map → chunk-EE5EPS32.js.map} +0 -0
- /package/dist/{chunk-OCEFD7V6.js.map → chunk-F3REOP7N.js.map} +0 -0
- /package/dist/{chunk-C577AJE7.js.map → chunk-FGLUQSVU.js.map} +0 -0
- /package/dist/{chunk-X5EG4EFP.js.map → chunk-MWGDG4QN.js.map} +0 -0
- /package/dist/{chunk-CIG7IKX3.js.map → chunk-OV5UJWS5.js.map} +0 -0
- /package/dist/{chunk-IEEVXLJB.js.map → chunk-R46CB36B.js.map} +0 -0
- /package/dist/{chunk-XUDTFI4M.js.map → chunk-T5DJCIUP.js.map} +0 -0
- /package/dist/{chunk-AJJJE7F7.js.map → chunk-TQLDQ3XZ.js.map} +0 -0
- /package/dist/{chunk-WYVDNGJB.js.map → chunk-XMLCXRTS.js.map} +0 -0
- /package/dist/{chunk-SDLDPFNV.js.map → chunk-YEGPTBX5.js.map} +0 -0
- /package/dist/{chunk-SRBN6RRD.js.map → chunk-ZFY5EMDV.js.map} +0 -0
- /package/dist/{loader-2O32KKAQ.js.map → loader-4YOZCFIP.js.map} +0 -0
- /package/dist/{source-loader-KMEBBZCQ.js.map → source-loader-O5RMYUBW.js.map} +0 -0
- /package/dist/{source-manager-5XBSPJNR.js.map → source-manager-NKLL6HCL.js.map} +0 -0
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
StackSelection
|
|
4
|
+
} from "./chunk-EZ35IPXZ.js";
|
|
2
5
|
import {
|
|
3
6
|
useMeasuredHeight
|
|
4
7
|
} from "./chunk-K77I4XGL.js";
|
|
5
|
-
import {
|
|
6
|
-
StackSelection
|
|
7
|
-
} from "./chunk-6DAZG54T.js";
|
|
8
8
|
import {
|
|
9
9
|
DomainSelection
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-O2HK3NTG.js";
|
|
11
11
|
import {
|
|
12
12
|
ViewTitle
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-AQYAVLZK.js";
|
|
14
14
|
import {
|
|
15
15
|
useWizardStore
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-4C7CSZC5.js";
|
|
17
17
|
import {
|
|
18
18
|
init_esm_shims
|
|
19
19
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -22,19 +22,19 @@ import {
|
|
|
22
22
|
init_esm_shims();
|
|
23
23
|
import { Box } from "ink";
|
|
24
24
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
25
|
-
var StepStack = ({
|
|
25
|
+
var StepStack = ({ onCancel }) => {
|
|
26
26
|
const { approach } = useWizardStore();
|
|
27
27
|
const { ref: containerRef, measuredHeight } = useMeasuredHeight();
|
|
28
28
|
if (approach !== null) {
|
|
29
|
-
return /* @__PURE__ */ jsx(DomainSelection, {
|
|
29
|
+
return /* @__PURE__ */ jsx(DomainSelection, {});
|
|
30
30
|
}
|
|
31
31
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: "100%", flexGrow: 1, flexBasis: 0, children: [
|
|
32
32
|
/* @__PURE__ */ jsx(ViewTitle, { children: "Choose a stack" }),
|
|
33
|
-
/* @__PURE__ */ jsx(Box, { ref: containerRef, flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(StackSelection, {
|
|
33
|
+
/* @__PURE__ */ jsx(Box, { ref: containerRef, flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(StackSelection, { availableHeight: measuredHeight, onCancel }) })
|
|
34
34
|
] });
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
export {
|
|
38
38
|
StepStack
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-6DEK3TDF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/step-stack.tsx"],"sourcesContent":["import { Box } from \"ink\";\nimport React from \"react\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { StackSelection } from \"./stack-selection.js\";\nimport { DomainSelection } from \"./domain-selection.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\ntype StepStackProps = {\n onCancel?: () => void;\n};\n\n/**\n * Unified first step of the wizard.\n *\n * Sub-step 1 (approach is null): Shows stacks + \"Start from scratch\" in a single list.\n * Sub-step 2 (approach is set): Shows domain selection with pre-selected domains.\n *\n * After domain selection, proceeds to the \"build\" step.\n */\nexport const StepStack: React.FC<StepStackProps> = ({ onCancel }) => {\n const { approach } = useWizardStore();\n const { ref: containerRef, measuredHeight } = useMeasuredHeight();\n\n if (approach !== null) {\n return <DomainSelection />;\n }\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" flexGrow={1} flexBasis={0}>\n <ViewTitle>Choose a stack</ViewTitle>\n <Box ref={containerRef} flexGrow={1} flexBasis={0}>\n <StackSelection availableHeight={measuredHeight} onCancel={onCancel} />\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,WAAW;AAyBT,cAIP,YAJO;AALJ,IAAM,YAAsC,CAAC,EAAE,SAAS,MAAM;AACnE,QAAM,EAAE,SAAS,IAAI,eAAe;AACpC,QAAM,EAAE,KAAK,cAAc,eAAe,IAAI,kBAAkB;AAEhE,MAAI,aAAa,MAAM;AACrB,WAAO,oBAAC,mBAAgB;AAAA,EAC1B;AAEA,SACE,qBAAC,OAAI,eAAc,UAAS,OAAM,QAAO,UAAU,GAAG,WAAW,GAC/D;AAAA,wBAAC,aAAU,4BAAc;AAAA,IACzB,oBAAC,OAAI,KAAK,cAAc,UAAU,GAAG,WAAW,GAC9C,8BAAC,kBAAe,iBAAiB,gBAAgB,UAAoB,GACvE;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
useKeyboardNavigation
|
|
4
4
|
} from "./chunk-KUV24B5M.js";
|
|
5
|
+
import {
|
|
6
|
+
KEY_LABEL_ARROWS_VERT,
|
|
7
|
+
KEY_LABEL_ENTER,
|
|
8
|
+
KEY_LABEL_ESC
|
|
9
|
+
} from "./chunk-6VIOO74O.js";
|
|
5
10
|
import {
|
|
6
11
|
CLI_COLORS
|
|
7
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-EGMQ3SXN.js";
|
|
8
13
|
import {
|
|
9
14
|
init_esm_shims
|
|
10
15
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -74,10 +79,12 @@ var SearchModal = ({ results, alias, onBind, onClose }) => {
|
|
|
74
79
|
)),
|
|
75
80
|
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
76
81
|
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
77
|
-
|
|
78
|
-
"
|
|
79
|
-
|
|
80
|
-
"
|
|
82
|
+
KEY_LABEL_ARROWS_VERT,
|
|
83
|
+
" navigate ",
|
|
84
|
+
KEY_LABEL_ENTER,
|
|
85
|
+
" bind ",
|
|
86
|
+
KEY_LABEL_ESC,
|
|
87
|
+
" close"
|
|
81
88
|
] })
|
|
82
89
|
]
|
|
83
90
|
}
|
|
@@ -87,4 +94,4 @@ var SearchModal = ({ results, alias, onBind, onClose }) => {
|
|
|
87
94
|
export {
|
|
88
95
|
SearchModal
|
|
89
96
|
};
|
|
90
|
-
//# sourceMappingURL=chunk-
|
|
97
|
+
//# sourceMappingURL=chunk-6IK2TCK7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/search-modal.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { BoundSkillCandidate } from \"../../types/index.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { useKeyboardNavigation } from \"../hooks/use-keyboard-navigation.js\";\nimport { KEY_LABEL_ARROWS_VERT, KEY_LABEL_ENTER, KEY_LABEL_ESC } from \"./hotkeys.js\";\n\nexport type SearchModalProps = {\n results: BoundSkillCandidate[];\n alias: string;\n onBind: (candidate: BoundSkillCandidate) => void;\n onClose: () => void;\n};\n\nconst MARKER_FOCUSED = \"\\u25B8\";\nconst MARKER_SPACER = \" \";\n\ntype ResultRowProps = {\n candidate: BoundSkillCandidate;\n isFocused: boolean;\n};\n\nconst ResultRow: React.FC<ResultRowProps> = ({ candidate, isFocused }) => {\n const marker = isFocused ? MARKER_FOCUSED : MARKER_SPACER;\n const sourceLabel = `${candidate.sourceName}/${candidate.id}`;\n\n return (\n <Box>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {marker}{\" \"}\n </Text>\n <Text bold={isFocused} color={isFocused ? CLI_COLORS.PRIMARY : undefined}>\n {sourceLabel}\n </Text>\n {candidate.description && (\n <Text dimColor>\n {\" \"}\n {candidate.description}\n </Text>\n )}\n </Box>\n );\n};\n\nexport const SearchModal: React.FC<SearchModalProps> = ({ results, alias, onBind, onClose }) => {\n const handleEnter = useCallback(\n (index: number) => {\n if (results.length > 0) {\n const selected = results[index];\n if (selected) {\n onBind(selected);\n }\n }\n },\n [results, onBind],\n );\n\n const { focusedIndex } = useKeyboardNavigation(\n results.length,\n { onEnter: handleEnter, onEscape: onClose },\n { vimKeys: false },\n );\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={CLI_COLORS.NEUTRAL}\n paddingX={1}\n paddingY={0}\n marginTop={1}\n >\n <Text bold>Search results for "{alias}"</Text>\n <Text> </Text>\n\n {results.length === 0 ? (\n <Text dimColor>No results found</Text>\n ) : (\n results.map((candidate, index) => (\n <ResultRow\n key={`${candidate.sourceName}-${candidate.id}`}\n candidate={candidate}\n isFocused={index === focusedIndex}\n />\n ))\n )}\n\n <Text> </Text>\n <Text dimColor>\n {KEY_LABEL_ARROWS_VERT} navigate {KEY_LABEL_ENTER} bind {KEY_LABEL_ESC} close\n </Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA,SAAgB,mBAAmB;AACnC,SAAS,KAAK,YAAY;AA2BpB,SAGA,KAHA;AAdN,IAAM,iBAAiB;AACvB,IAAM,gBAAgB;AAOtB,IAAM,YAAsC,CAAC,EAAE,WAAW,UAAU,MAAM;AACxE,QAAM,SAAS,YAAY,iBAAiB;AAC5C,QAAM,cAAc,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE;AAE3D,SACE,qBAAC,OACC;AAAA,yBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D;AAAA;AAAA,MAAQ;AAAA,OACX;AAAA,IACA,oBAAC,QAAK,MAAM,WAAW,OAAO,YAAY,WAAW,UAAU,QAC5D,uBACH;AAAA,IACC,UAAU,eACT,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,MACA,UAAU;AAAA,OACb;AAAA,KAEJ;AAEJ;AAEO,IAAM,cAA0C,CAAC,EAAE,SAAS,OAAO,QAAQ,QAAQ,MAAM;AAC9F,QAAM,cAAc;AAAA,IAClB,CAAC,UAAkB;AACjB,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,WAAW,QAAQ,KAAK;AAC9B,YAAI,UAAU;AACZ,iBAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,SAAS,MAAM;AAAA,EAClB;AAEA,QAAM,EAAE,aAAa,IAAI;AAAA,IACvB,QAAQ;AAAA,IACR,EAAE,SAAS,aAAa,UAAU,QAAQ;AAAA,IAC1C,EAAE,SAAS,MAAM;AAAA,EACnB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,WAAW;AAAA,MACxB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,6BAAC,QAAK,MAAI,MAAC;AAAA;AAAA,UAA0B;AAAA,UAAM;AAAA,WAAM;AAAA,QACjD,oBAAC,QAAK,eAAC;AAAA,QAEN,QAAQ,WAAW,IAClB,oBAAC,QAAK,UAAQ,MAAC,8BAAgB,IAE/B,QAAQ,IAAI,CAAC,WAAW,UACtB;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,WAAW,UAAU;AAAA;AAAA,UAFhB,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE;AAAA,QAG9C,CACD;AAAA,QAGH,oBAAC,QAAK,eAAC;AAAA,QACP,qBAAC,QAAK,UAAQ,MACX;AAAA;AAAA,UAAsB;AAAA,UAAW;AAAA,UAAgB;AAAA,UAAO;AAAA,UAAc;AAAA,WACzE;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
init_esm_shims
|
|
4
|
+
} from "./chunk-DHET7RCE.js";
|
|
5
|
+
|
|
6
|
+
// src/cli/components/wizard/hotkeys.ts
|
|
7
|
+
init_esm_shims();
|
|
8
|
+
var HOTKEY_HELP = { key: "?", label: "?" };
|
|
9
|
+
var HOTKEY_ACCEPT_DEFAULTS = { key: "a", label: "A" };
|
|
10
|
+
var HOTKEY_SCOPE = { key: "s", label: "S" };
|
|
11
|
+
var HOTKEY_SETTINGS = { key: "s", label: "S" };
|
|
12
|
+
var HOTKEY_TOGGLE_LABELS = { key: "d", label: "D" };
|
|
13
|
+
var HOTKEY_SET_ALL_LOCAL = { key: "l", label: "L" };
|
|
14
|
+
var HOTKEY_SET_ALL_PLUGIN = { key: "p", label: "P" };
|
|
15
|
+
var HOTKEY_ADD_SOURCE = { key: "a", label: "A" };
|
|
16
|
+
var HOTKEY_COPY_LINK = { key: "c", label: "C" };
|
|
17
|
+
var KEY_LABEL_ENTER = "ENTER";
|
|
18
|
+
var KEY_LABEL_ESC = "ESC";
|
|
19
|
+
var KEY_LABEL_SPACE = "SPACE";
|
|
20
|
+
var KEY_LABEL_TAB = "TAB";
|
|
21
|
+
var KEY_LABEL_DEL = "DEL";
|
|
22
|
+
var KEY_LABEL_ARROWS = "\u2190/\u2192";
|
|
23
|
+
var KEY_LABEL_ARROWS_VERT = "\u2191/\u2193";
|
|
24
|
+
var KEY_LABEL_VIM = "h/j/k/l";
|
|
25
|
+
var KEY_LABEL_VIM_VERT = "j/k";
|
|
26
|
+
function isHotkey(input, hotkey) {
|
|
27
|
+
return input.toLowerCase() === hotkey.key.toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
HOTKEY_HELP,
|
|
32
|
+
HOTKEY_ACCEPT_DEFAULTS,
|
|
33
|
+
HOTKEY_SCOPE,
|
|
34
|
+
HOTKEY_SETTINGS,
|
|
35
|
+
HOTKEY_TOGGLE_LABELS,
|
|
36
|
+
HOTKEY_SET_ALL_LOCAL,
|
|
37
|
+
HOTKEY_SET_ALL_PLUGIN,
|
|
38
|
+
HOTKEY_ADD_SOURCE,
|
|
39
|
+
HOTKEY_COPY_LINK,
|
|
40
|
+
KEY_LABEL_ENTER,
|
|
41
|
+
KEY_LABEL_ESC,
|
|
42
|
+
KEY_LABEL_SPACE,
|
|
43
|
+
KEY_LABEL_TAB,
|
|
44
|
+
KEY_LABEL_DEL,
|
|
45
|
+
KEY_LABEL_ARROWS,
|
|
46
|
+
KEY_LABEL_ARROWS_VERT,
|
|
47
|
+
KEY_LABEL_VIM,
|
|
48
|
+
KEY_LABEL_VIM_VERT,
|
|
49
|
+
isHotkey
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=chunk-6VIOO74O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/hotkeys.ts"],"sourcesContent":["/**\n * Centralized hotkey registry for wizard components.\n *\n * Every character-based hotkey and its display label lives here so that\n * changing a binding updates the key check, the footer hint, and the\n * help modal in one place.\n */\n\n// ---------------------------------------------------------------------------\n// Global hotkeys (active across multiple wizard steps)\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_HELP = { key: \"?\", label: \"?\" } as const;\nexport const HOTKEY_ACCEPT_DEFAULTS = { key: \"a\", label: \"A\" } as const;\nexport const HOTKEY_SCOPE = { key: \"s\", label: \"S\" } as const;\nexport const HOTKEY_SETTINGS = { key: \"s\", label: \"S\" } as const;\n\n// ---------------------------------------------------------------------------\n// Build step hotkeys\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_TOGGLE_LABELS = { key: \"d\", label: \"D\" } as const;\n\n// ---------------------------------------------------------------------------\n// Sources step hotkeys (customize view)\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_SET_ALL_LOCAL = { key: \"l\", label: \"L\" } as const;\nexport const HOTKEY_SET_ALL_PLUGIN = { key: \"p\", label: \"P\" } as const;\n\n// ---------------------------------------------------------------------------\n// Settings step hotkeys\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_ADD_SOURCE = { key: \"a\", label: \"A\" } as const;\n\n// ---------------------------------------------------------------------------\n// Skill search hotkey\n// ---------------------------------------------------------------------------\n\nexport const HOTKEY_COPY_LINK = { key: \"c\", label: \"C\" } as const;\n\n// ---------------------------------------------------------------------------\n// Common key labels (for structural keys handled via Ink key objects)\n// ---------------------------------------------------------------------------\n\nexport const KEY_LABEL_ENTER = \"ENTER\" as const;\nexport const KEY_LABEL_ESC = \"ESC\" as const;\nexport const KEY_LABEL_SPACE = \"SPACE\" as const;\nexport const KEY_LABEL_TAB = \"TAB\" as const;\nexport const KEY_LABEL_DEL = \"DEL\" as const;\nexport const KEY_LABEL_ARROWS = \"\\u2190/\\u2192\" as const;\nexport const KEY_LABEL_ARROWS_VERT = \"\\u2191/\\u2193\" as const;\nexport const KEY_LABEL_VIM = \"h/j/k/l\" as const;\nexport const KEY_LABEL_VIM_VERT = \"j/k\" as const;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Case-insensitive check for a character hotkey. */\nexport function isHotkey(input: string, hotkey: { key: string }): boolean {\n return input.toLowerCase() === hotkey.key.toLowerCase();\n}\n"],"mappings":";;;;;;AAAA;AAYO,IAAM,cAAc,EAAE,KAAK,KAAK,OAAO,IAAI;AAC3C,IAAM,yBAAyB,EAAE,KAAK,KAAK,OAAO,IAAI;AACtD,IAAM,eAAe,EAAE,KAAK,KAAK,OAAO,IAAI;AAC5C,IAAM,kBAAkB,EAAE,KAAK,KAAK,OAAO,IAAI;AAM/C,IAAM,uBAAuB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMpD,IAAM,uBAAuB,EAAE,KAAK,KAAK,OAAO,IAAI;AACpD,IAAM,wBAAwB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMrD,IAAM,oBAAoB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMjD,IAAM,mBAAmB,EAAE,KAAK,KAAK,OAAO,IAAI;AAMhD,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAM,wBAAwB;AAC9B,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAO3B,SAAS,SAAS,OAAe,QAAkC;AACxE,SAAO,MAAM,YAAY,MAAM,OAAO,IAAI,YAAY;AACxD;","names":[]}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
HOTKEY_ACCEPT_DEFAULTS,
|
|
4
|
+
HOTKEY_HELP,
|
|
5
|
+
HOTKEY_SCOPE,
|
|
6
|
+
HOTKEY_SETTINGS,
|
|
7
|
+
HOTKEY_TOGGLE_LABELS,
|
|
8
|
+
KEY_LABEL_ENTER,
|
|
9
|
+
KEY_LABEL_ESC,
|
|
10
|
+
KEY_LABEL_SPACE,
|
|
11
|
+
KEY_LABEL_TAB,
|
|
12
|
+
KEY_LABEL_VIM
|
|
13
|
+
} from "./chunk-6VIOO74O.js";
|
|
2
14
|
import {
|
|
3
15
|
CLI_COLORS
|
|
4
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-EGMQ3SXN.js";
|
|
5
17
|
import {
|
|
6
18
|
init_esm_shims
|
|
7
19
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -14,28 +26,28 @@ var GLOBAL_KEYS = {
|
|
|
14
26
|
title: "Navigation",
|
|
15
27
|
keys: [
|
|
16
28
|
{ key: "Arrow keys", description: "Move focus" },
|
|
17
|
-
{ key:
|
|
18
|
-
{ key:
|
|
19
|
-
{ key:
|
|
20
|
-
{ key:
|
|
29
|
+
{ key: KEY_LABEL_SPACE, description: "Toggle selection" },
|
|
30
|
+
{ key: KEY_LABEL_ENTER, description: "Confirm / continue" },
|
|
31
|
+
{ key: KEY_LABEL_ESC, description: "Go back" },
|
|
32
|
+
{ key: KEY_LABEL_TAB, description: "Jump to next section" }
|
|
21
33
|
]
|
|
22
34
|
};
|
|
23
35
|
var GLOBAL_TOGGLES = {
|
|
24
36
|
title: "Toggles",
|
|
25
|
-
keys: [{ key:
|
|
37
|
+
keys: [{ key: HOTKEY_HELP.label, description: "Toggle this help" }]
|
|
26
38
|
};
|
|
27
39
|
var BUILD_KEYS = {
|
|
28
|
-
title: "
|
|
40
|
+
title: "Skills Step",
|
|
29
41
|
keys: [
|
|
30
|
-
{ key:
|
|
31
|
-
{ key:
|
|
32
|
-
{ key:
|
|
33
|
-
{ key:
|
|
42
|
+
{ key: HOTKEY_TOGGLE_LABELS.label, description: "Toggle compatibility labels" },
|
|
43
|
+
{ key: HOTKEY_SCOPE.label, description: "Toggle skill scope (project/global)" },
|
|
44
|
+
{ key: HOTKEY_ACCEPT_DEFAULTS.label, description: "Accept stack defaults (stack path only)" },
|
|
45
|
+
{ key: KEY_LABEL_VIM, description: "Vim-style navigation" }
|
|
34
46
|
]
|
|
35
47
|
};
|
|
36
48
|
var SOURCES_KEYS = {
|
|
37
49
|
title: "Sources Step",
|
|
38
|
-
keys: [{ key:
|
|
50
|
+
keys: [{ key: HOTKEY_SETTINGS.label, description: "Toggle source settings" }]
|
|
39
51
|
};
|
|
40
52
|
var AGENTS_KEYS = {
|
|
41
53
|
title: "Agents Step",
|
|
@@ -75,7 +87,13 @@ var HelpModal = ({ currentStep }) => {
|
|
|
75
87
|
/* @__PURE__ */ jsx(HelpSectionView, { section: GLOBAL_KEYS }),
|
|
76
88
|
/* @__PURE__ */ jsx(HelpSectionView, { section: GLOBAL_TOGGLES }),
|
|
77
89
|
stepSection && /* @__PURE__ */ jsx(HelpSectionView, { section: stepSection }),
|
|
78
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
91
|
+
"Press ",
|
|
92
|
+
KEY_LABEL_ESC,
|
|
93
|
+
" or ",
|
|
94
|
+
HOTKEY_HELP.label,
|
|
95
|
+
" to close"
|
|
96
|
+
] })
|
|
79
97
|
]
|
|
80
98
|
}
|
|
81
99
|
);
|
|
@@ -84,4 +102,4 @@ var HelpModal = ({ currentStep }) => {
|
|
|
84
102
|
export {
|
|
85
103
|
HelpModal
|
|
86
104
|
};
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
105
|
+
//# sourceMappingURL=chunk-7DI3HGKL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/help-modal.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { WizardStep } from \"../../stores/wizard-store.js\";\nimport {\n HOTKEY_ACCEPT_DEFAULTS,\n HOTKEY_HELP,\n HOTKEY_SCOPE,\n HOTKEY_SETTINGS,\n HOTKEY_TOGGLE_LABELS,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n KEY_LABEL_SPACE,\n KEY_LABEL_TAB,\n KEY_LABEL_VIM,\n} from \"./hotkeys.js\";\n\ntype HelpSection = {\n title: string;\n keys: { key: string; description: string }[];\n};\n\nconst GLOBAL_KEYS: HelpSection = {\n title: \"Navigation\",\n keys: [\n { key: \"Arrow keys\", description: \"Move focus\" },\n { key: KEY_LABEL_SPACE, description: \"Toggle selection\" },\n { key: KEY_LABEL_ENTER, description: \"Confirm / continue\" },\n { key: KEY_LABEL_ESC, description: \"Go back\" },\n { key: KEY_LABEL_TAB, description: \"Jump to next section\" },\n ],\n};\n\nconst GLOBAL_TOGGLES: HelpSection = {\n title: \"Toggles\",\n keys: [{ key: HOTKEY_HELP.label, description: \"Toggle this help\" }],\n};\n\nconst BUILD_KEYS: HelpSection = {\n title: \"Skills Step\",\n keys: [\n { key: HOTKEY_TOGGLE_LABELS.label, description: \"Toggle compatibility labels\" },\n { key: HOTKEY_SCOPE.label, description: \"Toggle skill scope (project/global)\" },\n { key: HOTKEY_ACCEPT_DEFAULTS.label, description: \"Accept stack defaults (stack path only)\" },\n { key: KEY_LABEL_VIM, description: \"Vim-style navigation\" },\n ],\n};\n\nconst SOURCES_KEYS: HelpSection = {\n title: \"Sources Step\",\n keys: [{ key: HOTKEY_SETTINGS.label, description: \"Toggle source settings\" }],\n};\n\nconst AGENTS_KEYS: HelpSection = {\n title: \"Agents Step\",\n keys: [],\n};\n\nconst STEP_SECTIONS: Partial<Record<WizardStep, HelpSection>> = {\n build: BUILD_KEYS,\n sources: SOURCES_KEYS,\n agents: AGENTS_KEYS,\n};\n\nconst KEY_COLUMN_WIDTH = 14;\n\ntype HelpSectionViewProps = {\n section: HelpSection;\n};\n\nconst HelpSectionView: React.FC<HelpSectionViewProps> = ({ section }) => (\n <Box flexDirection=\"column\" marginTop={1} marginBottom={1}>\n <Text bold>{section.title}</Text>\n {section.keys.map(({ key, description }) => (\n <Box key={key} marginTop={1}>\n <Box width={KEY_COLUMN_WIDTH}>\n <Text backgroundColor=\"black\" color={CLI_COLORS.UNFOCUSED}>\n {\" \"}\n {key}{\" \"}\n </Text>\n </Box>\n <Text>{description}</Text>\n </Box>\n ))}\n </Box>\n);\n\nexport type HelpModalProps = {\n currentStep: WizardStep;\n};\n\nexport const HelpModal: React.FC<HelpModalProps> = ({ currentStep }) => {\n const stepSection = STEP_SECTIONS[currentStep];\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={CLI_COLORS.PRIMARY}\n paddingX={2}\n paddingY={1}\n marginTop={1}\n >\n <Text bold color={CLI_COLORS.PRIMARY}>\n Keyboard Shortcuts\n </Text>\n <Text> </Text>\n\n <HelpSectionView section={GLOBAL_KEYS} />\n <HelpSectionView section={GLOBAL_TOGGLES} />\n {stepSection && <HelpSectionView section={stepSection} />}\n\n <Text dimColor>\n Press {KEY_LABEL_ESC} or {HOTKEY_HELP.label} to close\n </Text>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,YAAY;AAwEtB,cAIM,YAJN;AAlDJ,IAAM,cAA2B;AAAA,EAC/B,OAAO;AAAA,EACP,MAAM;AAAA,IACJ,EAAE,KAAK,cAAc,aAAa,aAAa;AAAA,IAC/C,EAAE,KAAK,iBAAiB,aAAa,mBAAmB;AAAA,IACxD,EAAE,KAAK,iBAAiB,aAAa,qBAAqB;AAAA,IAC1D,EAAE,KAAK,eAAe,aAAa,UAAU;AAAA,IAC7C,EAAE,KAAK,eAAe,aAAa,uBAAuB;AAAA,EAC5D;AACF;AAEA,IAAM,iBAA8B;AAAA,EAClC,OAAO;AAAA,EACP,MAAM,CAAC,EAAE,KAAK,YAAY,OAAO,aAAa,mBAAmB,CAAC;AACpE;AAEA,IAAM,aAA0B;AAAA,EAC9B,OAAO;AAAA,EACP,MAAM;AAAA,IACJ,EAAE,KAAK,qBAAqB,OAAO,aAAa,8BAA8B;AAAA,IAC9E,EAAE,KAAK,aAAa,OAAO,aAAa,sCAAsC;AAAA,IAC9E,EAAE,KAAK,uBAAuB,OAAO,aAAa,0CAA0C;AAAA,IAC5F,EAAE,KAAK,eAAe,aAAa,uBAAuB;AAAA,EAC5D;AACF;AAEA,IAAM,eAA4B;AAAA,EAChC,OAAO;AAAA,EACP,MAAM,CAAC,EAAE,KAAK,gBAAgB,OAAO,aAAa,yBAAyB,CAAC;AAC9E;AAEA,IAAM,cAA2B;AAAA,EAC/B,OAAO;AAAA,EACP,MAAM,CAAC;AACT;AAEA,IAAM,gBAA0D;AAAA,EAC9D,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,IAAM,mBAAmB;AAMzB,IAAM,kBAAkD,CAAC,EAAE,QAAQ,MACjE,qBAAC,OAAI,eAAc,UAAS,WAAW,GAAG,cAAc,GACtD;AAAA,sBAAC,QAAK,MAAI,MAAE,kBAAQ,OAAM;AAAA,EACzB,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,YAAY,MACpC,qBAAC,OAAc,WAAW,GACxB;AAAA,wBAAC,OAAI,OAAO,kBACV,+BAAC,QAAK,iBAAgB,SAAQ,OAAO,WAAW,WAC7C;AAAA;AAAA,MACA;AAAA,MAAK;AAAA,OACR,GACF;AAAA,IACA,oBAAC,QAAM,uBAAY;AAAA,OAPX,GAQV,CACD;AAAA,GACH;AAOK,IAAM,YAAsC,CAAC,EAAE,YAAY,MAAM;AACtE,QAAM,cAAc,cAAc,WAAW;AAE7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,WAAW;AAAA,MACxB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,4BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,gCAEtC;AAAA,QACA,oBAAC,QAAK,eAAC;AAAA,QAEP,oBAAC,mBAAgB,SAAS,aAAa;AAAA,QACvC,oBAAC,mBAAgB,SAAS,gBAAgB;AAAA,QACzC,eAAe,oBAAC,mBAAgB,SAAS,aAAa;AAAA,QAEvD,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,UACN;AAAA,UAAc;AAAA,UAAK,YAAY;AAAA,UAAM;AAAA,WAC9C;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
CLI_COLORS
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-EGMQ3SXN.js";
|
|
5
5
|
import {
|
|
6
6
|
init_esm_shims
|
|
7
7
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -17,4 +17,4 @@ var ViewTitle = ({ children }) => {
|
|
|
17
17
|
export {
|
|
18
18
|
ViewTitle
|
|
19
19
|
};
|
|
20
|
-
//# sourceMappingURL=chunk-
|
|
20
|
+
//# sourceMappingURL=chunk-AQYAVLZK.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SCROLL_VIEWPORT
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-EGMQ3SXN.js";
|
|
5
5
|
import {
|
|
6
6
|
init_esm_shims
|
|
7
7
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -71,4 +71,4 @@ export {
|
|
|
71
71
|
useSectionScroll,
|
|
72
72
|
computeRowScrollTop
|
|
73
73
|
};
|
|
74
|
-
//# sourceMappingURL=chunk-
|
|
74
|
+
//# sourceMappingURL=chunk-AUNBGZS4.js.map
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
useMeasuredHeight
|
|
4
|
+
} from "./chunk-K77I4XGL.js";
|
|
5
|
+
import {
|
|
6
|
+
CategoryGrid
|
|
7
|
+
} from "./chunk-CKPJTMNC.js";
|
|
8
|
+
import {
|
|
9
|
+
getDomainDisplayName,
|
|
10
|
+
orderDomains
|
|
11
|
+
} from "./chunk-ZYUASJUN.js";
|
|
12
|
+
import {
|
|
13
|
+
ViewTitle
|
|
14
|
+
} from "./chunk-AQYAVLZK.js";
|
|
15
|
+
import {
|
|
16
|
+
useWizardStore
|
|
17
|
+
} from "./chunk-4C7CSZC5.js";
|
|
18
|
+
import {
|
|
19
|
+
KEY_LABEL_ENTER,
|
|
20
|
+
KEY_LABEL_ESC
|
|
21
|
+
} from "./chunk-6VIOO74O.js";
|
|
22
|
+
import {
|
|
23
|
+
getAvailableSkills,
|
|
24
|
+
resolveAlias
|
|
25
|
+
} from "./chunk-53URJ5XK.js";
|
|
26
|
+
import {
|
|
27
|
+
findSkill,
|
|
28
|
+
getMatrix
|
|
29
|
+
} from "./chunk-BKL3DF2Q.js";
|
|
30
|
+
import {
|
|
31
|
+
CLI_COLORS
|
|
32
|
+
} from "./chunk-EGMQ3SXN.js";
|
|
33
|
+
import {
|
|
34
|
+
init_esm_shims
|
|
35
|
+
} from "./chunk-DHET7RCE.js";
|
|
36
|
+
|
|
37
|
+
// src/cli/components/wizard/step-build.tsx
|
|
38
|
+
init_esm_shims();
|
|
39
|
+
import { Box, Text, useInput } from "ink";
|
|
40
|
+
import { useCallback, useMemo as useMemo2, useState } from "react";
|
|
41
|
+
|
|
42
|
+
// src/cli/lib/wizard/index.ts
|
|
43
|
+
init_esm_shims();
|
|
44
|
+
|
|
45
|
+
// src/cli/lib/wizard/build-step-logic.ts
|
|
46
|
+
init_esm_shims();
|
|
47
|
+
import { sortBy } from "remeda";
|
|
48
|
+
var FRAMEWORK_CATEGORY_ID = "web-framework";
|
|
49
|
+
var WEB_DOMAIN_ID = "web";
|
|
50
|
+
function validateBuildStep(categories, selections) {
|
|
51
|
+
for (const category of categories) {
|
|
52
|
+
if (category.required) {
|
|
53
|
+
const categorySelections = selections[category.id] || [];
|
|
54
|
+
if (categorySelections.length === 0) {
|
|
55
|
+
return {
|
|
56
|
+
valid: false,
|
|
57
|
+
message: `Select at least one skill from the ${category.displayName} category. Use arrow keys to navigate, then SPACE to select.`
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { valid: true };
|
|
63
|
+
}
|
|
64
|
+
function computeOptionState(skill) {
|
|
65
|
+
if (skill.discouraged) {
|
|
66
|
+
return "discouraged";
|
|
67
|
+
}
|
|
68
|
+
if (skill.recommended) {
|
|
69
|
+
return "recommended";
|
|
70
|
+
}
|
|
71
|
+
return "normal";
|
|
72
|
+
}
|
|
73
|
+
function getStateReason(skill) {
|
|
74
|
+
if (skill.discouraged && skill.discouragedReason) {
|
|
75
|
+
return skill.discouragedReason;
|
|
76
|
+
}
|
|
77
|
+
if (skill.recommended && skill.recommendedReason) {
|
|
78
|
+
return skill.recommendedReason;
|
|
79
|
+
}
|
|
80
|
+
return void 0;
|
|
81
|
+
}
|
|
82
|
+
function isFrameworkSelected(selections) {
|
|
83
|
+
const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];
|
|
84
|
+
return frameworkSelections.length > 0;
|
|
85
|
+
}
|
|
86
|
+
function getSelectedFrameworks(selections) {
|
|
87
|
+
const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];
|
|
88
|
+
return frameworkSelections.map((alias) => resolveAlias(alias));
|
|
89
|
+
}
|
|
90
|
+
function isCompatibleWithSelectedFrameworks(skillId, selectedFrameworkIds) {
|
|
91
|
+
const skill = findSkill(skillId);
|
|
92
|
+
if (!skill) return false;
|
|
93
|
+
if (skill.compatibleWith.length === 0) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));
|
|
97
|
+
}
|
|
98
|
+
function buildCategoriesForDomain(domain, allSelections, selections, installedSkillIds, skillConfigs) {
|
|
99
|
+
const matrix = getMatrix();
|
|
100
|
+
const frameworkSource = selections;
|
|
101
|
+
const frameworkSelected = isFrameworkSelected(frameworkSource);
|
|
102
|
+
const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource) : [];
|
|
103
|
+
const categories = sortBy(
|
|
104
|
+
Object.values(matrix.categories).filter(
|
|
105
|
+
(cat) => cat.domain === domain
|
|
106
|
+
),
|
|
107
|
+
(cat) => cat.order ?? 0
|
|
108
|
+
);
|
|
109
|
+
const categoryRows = categories.map((cat) => {
|
|
110
|
+
const skillOptions = getAvailableSkills(cat.id, allSelections);
|
|
111
|
+
const useFrameworkFilter = domain === WEB_DOMAIN_ID && cat.id !== FRAMEWORK_CATEGORY_ID && frameworkSelected;
|
|
112
|
+
const filteredSkillOptions = useFrameworkFilter ? skillOptions.filter(
|
|
113
|
+
(skill) => isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds)
|
|
114
|
+
) : skillOptions;
|
|
115
|
+
const options = filteredSkillOptions.map((skill) => ({
|
|
116
|
+
id: skill.id,
|
|
117
|
+
state: computeOptionState(skill),
|
|
118
|
+
stateReason: getStateReason(skill),
|
|
119
|
+
selected: skill.selected,
|
|
120
|
+
local: findSkill(skill.id)?.local,
|
|
121
|
+
installed: installedSkillIds?.includes(skill.id) || false,
|
|
122
|
+
scope: skillConfigs?.find((sc) => sc.id === skill.id)?.scope
|
|
123
|
+
}));
|
|
124
|
+
return {
|
|
125
|
+
id: cat.id,
|
|
126
|
+
displayName: cat.displayName,
|
|
127
|
+
required: cat.required ?? false,
|
|
128
|
+
exclusive: cat.exclusive ?? true,
|
|
129
|
+
options
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
return categoryRows.filter((row) => row.options.length > 0);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/cli/components/hooks/use-framework-filtering.ts
|
|
136
|
+
init_esm_shims();
|
|
137
|
+
import { useMemo } from "react";
|
|
138
|
+
function useFrameworkFiltering({
|
|
139
|
+
domain,
|
|
140
|
+
allSelections,
|
|
141
|
+
selections,
|
|
142
|
+
installedSkillIds,
|
|
143
|
+
skillConfigs
|
|
144
|
+
}) {
|
|
145
|
+
return useMemo(
|
|
146
|
+
() => buildCategoriesForDomain(domain, allSelections, selections, installedSkillIds, skillConfigs),
|
|
147
|
+
[domain, allSelections, selections, installedSkillIds, skillConfigs]
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/cli/components/wizard/step-build.tsx
|
|
152
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
153
|
+
var Footer = ({ validationError }) => {
|
|
154
|
+
return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: 1, children: validationError && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [
|
|
155
|
+
/* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WARNING, children: validationError }),
|
|
156
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
157
|
+
"Press ",
|
|
158
|
+
KEY_LABEL_ESC,
|
|
159
|
+
" to go back, or select a skill and press ",
|
|
160
|
+
KEY_LABEL_ENTER,
|
|
161
|
+
" to continue."
|
|
162
|
+
] })
|
|
163
|
+
] }) });
|
|
164
|
+
};
|
|
165
|
+
var StepBuild = ({
|
|
166
|
+
domain: activeDomain,
|
|
167
|
+
selectedDomains,
|
|
168
|
+
selections,
|
|
169
|
+
allSelections,
|
|
170
|
+
showLabels,
|
|
171
|
+
installedSkillIds,
|
|
172
|
+
onToggle,
|
|
173
|
+
onToggleLabels,
|
|
174
|
+
onContinue,
|
|
175
|
+
onBack
|
|
176
|
+
}) => {
|
|
177
|
+
const [validationError, setValidationError] = useState(void 0);
|
|
178
|
+
const { ref: gridRef, measuredHeight: gridHeight } = useMeasuredHeight();
|
|
179
|
+
const skillConfigs = useWizardStore((s) => s.skillConfigs);
|
|
180
|
+
const handleFocusedSkillChange = useCallback(
|
|
181
|
+
(id) => useWizardStore.getState().setFocusedSkillId(id),
|
|
182
|
+
[]
|
|
183
|
+
);
|
|
184
|
+
const orderedDomains = useMemo2(() => orderDomains(selectedDomains), [selectedDomains]);
|
|
185
|
+
const categories = useFrameworkFiltering({
|
|
186
|
+
domain: activeDomain,
|
|
187
|
+
allSelections,
|
|
188
|
+
selections,
|
|
189
|
+
installedSkillIds,
|
|
190
|
+
skillConfigs
|
|
191
|
+
});
|
|
192
|
+
useInput((_input, key) => {
|
|
193
|
+
if (key.return) {
|
|
194
|
+
const validation = validateBuildStep(categories, selections);
|
|
195
|
+
if (validation.valid) {
|
|
196
|
+
setValidationError(void 0);
|
|
197
|
+
onContinue();
|
|
198
|
+
} else {
|
|
199
|
+
setValidationError(validation.message);
|
|
200
|
+
}
|
|
201
|
+
} else if (key.escape) {
|
|
202
|
+
setValidationError(void 0);
|
|
203
|
+
onBack();
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", width: "100%", flexGrow: 1, flexBasis: 0, children: [
|
|
207
|
+
/* @__PURE__ */ jsx(
|
|
208
|
+
Box,
|
|
209
|
+
{
|
|
210
|
+
columnGap: 2,
|
|
211
|
+
flexDirection: "row",
|
|
212
|
+
justifyContent: "space-between",
|
|
213
|
+
marginBottom: 1,
|
|
214
|
+
paddingRight: 1,
|
|
215
|
+
marginTop: -1,
|
|
216
|
+
borderTop: false,
|
|
217
|
+
borderRight: false,
|
|
218
|
+
borderLeft: false,
|
|
219
|
+
borderColor: CLI_COLORS.NEUTRAL,
|
|
220
|
+
borderStyle: "single",
|
|
221
|
+
children: /* @__PURE__ */ jsx(Box, { columnGap: 2, flexDirection: "row", children: orderedDomains.map((domain) => {
|
|
222
|
+
const isActive = domain === activeDomain;
|
|
223
|
+
return /* @__PURE__ */ jsx(Text, { color: isActive ? CLI_COLORS.WARNING : void 0, bold: isActive, children: getDomainDisplayName(domain) }, domain);
|
|
224
|
+
}) })
|
|
225
|
+
}
|
|
226
|
+
),
|
|
227
|
+
/* @__PURE__ */ jsx(ViewTitle, { children: `Customize your ${getDomainDisplayName(activeDomain)} stack` }),
|
|
228
|
+
/* @__PURE__ */ jsx(Box, { ref: gridRef, flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx(
|
|
229
|
+
CategoryGrid,
|
|
230
|
+
{
|
|
231
|
+
categories,
|
|
232
|
+
availableHeight: gridHeight,
|
|
233
|
+
showLabels,
|
|
234
|
+
onToggle,
|
|
235
|
+
onToggleLabels,
|
|
236
|
+
onFocusedSkillChange: handleFocusedSkillChange
|
|
237
|
+
},
|
|
238
|
+
activeDomain
|
|
239
|
+
) }),
|
|
240
|
+
/* @__PURE__ */ jsx(Footer, { validationError })
|
|
241
|
+
] });
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
export {
|
|
245
|
+
validateBuildStep,
|
|
246
|
+
StepBuild
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=chunk-BGPGQF35.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/step-build.tsx","../src/cli/lib/wizard/index.ts","../src/cli/lib/wizard/build-step-logic.ts","../src/cli/components/hooks/use-framework-filtering.ts"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { validateBuildStep } from \"../../lib/wizard/index.js\";\nimport type { Domain, SkillId, Category, CategorySelections } from \"../../types/index.js\";\nimport { useFrameworkFiltering } from \"../hooks/use-framework-filtering.js\";\nimport { useMeasuredHeight } from \"../hooks/use-measured-height.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { CategoryGrid } from \"./category-grid.js\";\nimport { KEY_LABEL_ENTER, KEY_LABEL_ESC } from \"./hotkeys.js\";\nimport { getDomainDisplayName, orderDomains } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\nexport type StepBuildProps = {\n domain: Domain;\n selectedDomains: Domain[];\n selections: CategorySelections;\n allSelections: SkillId[];\n showLabels: boolean;\n /** Skill IDs already installed on disk, shown with a dimmed checkmark */\n installedSkillIds?: SkillId[];\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n onContinue: () => void;\n onBack: () => void;\n};\n\ntype FooterProps = {\n validationError?: string;\n};\n\nconst Footer: React.FC<FooterProps> = ({ validationError }) => {\n return (\n <Box flexDirection=\"column\" marginTop={1}>\n {validationError && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text color={CLI_COLORS.WARNING}>{validationError}</Text>\n <Text dimColor>\n Press {KEY_LABEL_ESC} to go back, or select a skill and press {KEY_LABEL_ENTER} to\n continue.\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n\nexport const StepBuild: React.FC<StepBuildProps> = ({\n domain: activeDomain,\n selectedDomains,\n selections,\n allSelections,\n showLabels,\n installedSkillIds,\n onToggle,\n onToggleLabels,\n onContinue,\n onBack,\n}) => {\n const [validationError, setValidationError] = useState<string | undefined>(undefined);\n const { ref: gridRef, measuredHeight: gridHeight } = useMeasuredHeight();\n const skillConfigs = useWizardStore((s) => s.skillConfigs);\n\n const handleFocusedSkillChange = useCallback(\n (id: SkillId | null) => useWizardStore.getState().setFocusedSkillId(id),\n [],\n );\n\n const orderedDomains = useMemo(() => orderDomains(selectedDomains), [selectedDomains]);\n\n const categories = useFrameworkFiltering({\n domain: activeDomain,\n allSelections,\n selections,\n installedSkillIds,\n skillConfigs,\n });\n\n useInput((_input, key) => {\n if (key.return) {\n const validation = validateBuildStep(categories, selections);\n if (validation.valid) {\n setValidationError(undefined);\n onContinue();\n } else {\n setValidationError(validation.message);\n }\n } else if (key.escape) {\n setValidationError(undefined);\n onBack();\n }\n });\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" flexGrow={1} flexBasis={0}>\n <Box\n columnGap={2}\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n marginBottom={1}\n paddingRight={1}\n marginTop={-1}\n borderTop={false}\n borderRight={false}\n borderLeft={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderStyle=\"single\"\n >\n <Box columnGap={2} flexDirection=\"row\">\n {orderedDomains.map((domain) => {\n const isActive = domain === activeDomain;\n return (\n <Text key={domain} color={isActive ? CLI_COLORS.WARNING : undefined} bold={isActive}>\n {getDomainDisplayName(domain)}\n </Text>\n );\n })}\n </Box>\n </Box>\n <ViewTitle>{`Customize your ${getDomainDisplayName(activeDomain)} stack`}</ViewTitle>\n\n <Box ref={gridRef} flexGrow={1} flexBasis={0}>\n <CategoryGrid\n key={activeDomain}\n categories={categories}\n availableHeight={gridHeight}\n showLabels={showLabels}\n onToggle={onToggle}\n onToggleLabels={onToggleLabels}\n onFocusedSkillChange={handleFocusedSkillChange}\n />\n </Box>\n\n <Footer validationError={validationError} />\n </Box>\n );\n};\n","export {\n type BuildStepValidation,\n validateBuildStep,\n computeOptionState,\n buildCategoriesForDomain,\n} from \"./build-step-logic\";\n","import { sortBy } from \"remeda\";\nimport type {\n CategoryDefinition,\n Domain,\n SkillId,\n SkillOption,\n CategorySelections,\n} from \"../../types/index.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { getAvailableSkills, resolveAlias } from \"../matrix/index.js\";\nimport { findSkill, getMatrix } from \"../../stores/matrix-store.js\";\nimport type {\n CategoryRow,\n CategoryOption,\n OptionState,\n} from \"../../components/wizard/category-grid.js\";\n\nconst FRAMEWORK_CATEGORY_ID = \"web-framework\";\nconst WEB_DOMAIN_ID = \"web\";\n\nexport type BuildStepValidation = {\n valid: boolean;\n message?: string;\n};\n\nexport function validateBuildStep(\n categories: CategoryRow[],\n selections: CategorySelections,\n): BuildStepValidation {\n for (const category of categories) {\n if (category.required) {\n const categorySelections = selections[category.id] || [];\n if (categorySelections.length === 0) {\n return {\n valid: false,\n message: `Select at least one skill from the ${category.displayName} category. Use arrow keys to navigate, then SPACE to select.`,\n };\n }\n }\n }\n return { valid: true };\n}\n\nexport function computeOptionState(\n skill: Pick<SkillOption, \"discouraged\" | \"recommended\">,\n): OptionState {\n if (skill.discouraged) {\n return \"discouraged\";\n }\n if (skill.recommended) {\n return \"recommended\";\n }\n return \"normal\";\n}\n\nfunction getStateReason(\n skill: Pick<\n SkillOption,\n \"discouraged\" | \"discouragedReason\" | \"recommended\" | \"recommendedReason\"\n >,\n): string | undefined {\n if (skill.discouraged && skill.discouragedReason) {\n return skill.discouragedReason;\n }\n if (skill.recommended && skill.recommendedReason) {\n return skill.recommendedReason;\n }\n return undefined;\n}\n\nfunction isFrameworkSelected(selections: CategorySelections): boolean {\n const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];\n return frameworkSelections.length > 0;\n}\n\nfunction getSelectedFrameworks(selections: CategorySelections): SkillId[] {\n const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];\n return frameworkSelections.map((alias) => resolveAlias(alias));\n}\n\nfunction isCompatibleWithSelectedFrameworks(\n skillId: SkillId,\n selectedFrameworkIds: SkillId[],\n): boolean {\n const skill = findSkill(skillId);\n if (!skill) return false;\n\n // No compatibleWith = compatible with all (allows legacy skills to appear)\n if (skill.compatibleWith.length === 0) {\n return true;\n }\n\n return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));\n}\n\n// Build CategoryRow[] from matrix for a domain, with framework-first filtering for web\nexport function buildCategoriesForDomain(\n domain: Domain,\n allSelections: SkillId[],\n selections: CategorySelections,\n installedSkillIds?: SkillId[],\n skillConfigs?: SkillConfig[],\n): CategoryRow[] {\n const matrix = getMatrix();\n const frameworkSource = selections;\n const frameworkSelected = isFrameworkSelected(frameworkSource);\n const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource) : [];\n\n // Object.values() on a Partial record only yields values that exist — all are CategoryDefinition\n const categories = sortBy(\n (Object.values(matrix.categories) as CategoryDefinition[]).filter(\n (cat) => cat.domain === domain,\n ),\n (cat) => cat.order ?? 0,\n );\n\n const categoryRows: CategoryRow[] = categories.map((cat) => {\n const skillOptions = getAvailableSkills(cat.id, allSelections);\n\n const useFrameworkFilter =\n domain === WEB_DOMAIN_ID && cat.id !== FRAMEWORK_CATEGORY_ID && frameworkSelected;\n const filteredSkillOptions = useFrameworkFilter\n ? skillOptions.filter((skill) =>\n isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds),\n )\n : skillOptions;\n\n const options: CategoryOption[] = filteredSkillOptions.map((skill) => ({\n id: skill.id,\n state: computeOptionState(skill),\n stateReason: getStateReason(skill),\n selected: skill.selected,\n local: findSkill(skill.id)?.local,\n installed: installedSkillIds?.includes(skill.id) || false,\n scope: skillConfigs?.find((sc) => sc.id === skill.id)?.scope,\n }));\n\n return {\n id: cat.id,\n displayName: cat.displayName,\n required: cat.required ?? false,\n exclusive: cat.exclusive ?? true,\n options,\n };\n });\n\n return categoryRows.filter((row) => row.options.length > 0);\n}\n","import { useMemo } from \"react\";\nimport type { Domain, SkillId, CategorySelections } from \"../../types/index.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { buildCategoriesForDomain } from \"../../lib/wizard/index.js\";\nimport type { CategoryRow } from \"../wizard/category-grid.js\";\n\ntype UseFrameworkFilteringOptions = {\n domain: Domain;\n allSelections: SkillId[];\n selections: CategorySelections;\n installedSkillIds?: SkillId[];\n skillConfigs?: SkillConfig[];\n};\n\nexport function useFrameworkFiltering({\n domain,\n allSelections,\n selections,\n installedSkillIds,\n skillConfigs,\n}: UseFrameworkFilteringOptions): CategoryRow[] {\n return useMemo(\n () =>\n buildCategoriesForDomain(domain, allSelections, selections, installedSkillIds, skillConfigs),\n [domain, allSelections, selections, installedSkillIds, skillConfigs],\n );\n}\n"],"mappings":"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","names":["useMemo","useMemo"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
init_esm_shims
|
|
4
|
+
} from "./chunk-DHET7RCE.js";
|
|
5
|
+
|
|
6
|
+
// src/cli/stores/matrix-store.ts
|
|
7
|
+
init_esm_shims();
|
|
8
|
+
import { create } from "zustand";
|
|
9
|
+
var useMatrixStore = create((set, get) => ({
|
|
10
|
+
matrix: null,
|
|
11
|
+
setMatrix: (matrix) => set({ matrix }),
|
|
12
|
+
reset: () => set({ matrix: null }),
|
|
13
|
+
getMatrix: () => {
|
|
14
|
+
const { matrix } = get();
|
|
15
|
+
if (!matrix) {
|
|
16
|
+
throw new Error("Matrix store not initialized \u2014 call setMatrix() after loading the matrix");
|
|
17
|
+
}
|
|
18
|
+
return matrix;
|
|
19
|
+
},
|
|
20
|
+
getSkill: (idOrSlug) => {
|
|
21
|
+
const { matrix } = get();
|
|
22
|
+
if (!matrix) return void 0;
|
|
23
|
+
const direct = matrix.skills[idOrSlug];
|
|
24
|
+
if (direct) return direct;
|
|
25
|
+
const id = matrix.slugMap.slugToId[idOrSlug];
|
|
26
|
+
return id ? matrix.skills[id] : void 0;
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
var findSkill = (idOrSlug) => useMatrixStore.getState().getSkill(idOrSlug);
|
|
30
|
+
var getSkill = (idOrSlug) => {
|
|
31
|
+
const skill = useMatrixStore.getState().getSkill(idOrSlug);
|
|
32
|
+
if (!skill) {
|
|
33
|
+
throw new Error(`Skill '${idOrSlug}' not found in matrix store`);
|
|
34
|
+
}
|
|
35
|
+
return skill;
|
|
36
|
+
};
|
|
37
|
+
var getMatrix = () => useMatrixStore.getState().getMatrix();
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
useMatrixStore,
|
|
41
|
+
findSkill,
|
|
42
|
+
getSkill,
|
|
43
|
+
getMatrix
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=chunk-BKL3DF2Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/stores/matrix-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type { MergedSkillsMatrix, ResolvedSkill, SkillId, SkillSlug } from \"../types/index.js\";\n\ntype MatrixState = {\n matrix: MergedSkillsMatrix | null;\n\n setMatrix: (matrix: MergedSkillsMatrix) => void;\n reset: () => void;\n\n getMatrix: () => MergedSkillsMatrix;\n getSkill: (idOrSlug: SkillId | SkillSlug) => ResolvedSkill | undefined;\n};\n\nexport const useMatrixStore = create<MatrixState>((set, get) => ({\n matrix: null,\n\n setMatrix: (matrix) => set({ matrix }),\n reset: () => set({ matrix: null }),\n\n getMatrix: () => {\n const { matrix } = get();\n if (!matrix) {\n throw new Error(\"Matrix store not initialized — call setMatrix() after loading the matrix\");\n }\n return matrix;\n },\n\n getSkill: (idOrSlug) => {\n const { matrix } = get();\n if (!matrix) return undefined;\n const direct = matrix.skills[idOrSlug as SkillId];\n if (direct) return direct;\n const id = matrix.slugMap.slugToId[idOrSlug as SkillSlug];\n return id ? matrix.skills[id] : undefined;\n },\n}));\n\n/** Look up a skill — returns undefined if not found. Use for user input or optional lookups. */\nexport const findSkill = (idOrSlug: SkillId | SkillSlug): ResolvedSkill | undefined =>\n useMatrixStore.getState().getSkill(idOrSlug);\n\n/** Look up a skill — throws if not found. Use when the skill must exist. */\nexport const getSkill = (idOrSlug: SkillId | SkillSlug): ResolvedSkill => {\n const skill = useMatrixStore.getState().getSkill(idOrSlug);\n if (!skill) {\n throw new Error(`Skill '${idOrSlug}' not found in matrix store`);\n }\n return skill;\n};\n\nexport const getMatrix = () => useMatrixStore.getState().getMatrix();\n"],"mappings":";;;;;;AAAA;AAAA,SAAS,cAAc;AAahB,IAAM,iBAAiB,OAAoB,CAAC,KAAK,SAAS;AAAA,EAC/D,QAAQ;AAAA,EAER,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,EACrC,OAAO,MAAM,IAAI,EAAE,QAAQ,KAAK,CAAC;AAAA,EAEjC,WAAW,MAAM;AACf,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,+EAA0E;AAAA,IAC5F;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,CAAC,aAAa;AACtB,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,SAAS,OAAO,OAAO,QAAmB;AAChD,QAAI,OAAQ,QAAO;AACnB,UAAM,KAAK,OAAO,QAAQ,SAAS,QAAqB;AACxD,WAAO,KAAK,OAAO,OAAO,EAAE,IAAI;AAAA,EAClC;AACF,EAAE;AAGK,IAAM,YAAY,CAAC,aACxB,eAAe,SAAS,EAAE,SAAS,QAAQ;AAGtC,IAAM,WAAW,CAAC,aAAiD;AACxE,QAAM,QAAQ,eAAe,SAAS,EAAE,SAAS,QAAQ;AACzD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,UAAU,QAAQ,6BAA6B;AAAA,EACjE;AACA,SAAO;AACT;AAEO,IAAM,YAAY,MAAM,eAAe,SAAS,EAAE,UAAU;","names":[]}
|