@agents-inc/cli 0.48.0 → 0.60.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +181 -5
- package/README.md +1 -2
- package/dist/{chunk-2DNDAXF6.js → chunk-52M2XF3W.js} +57 -27
- package/dist/chunk-52M2XF3W.js.map +1 -0
- package/dist/{chunk-WSGKCBY5.js → chunk-52XO4ULK.js} +6 -9
- package/dist/chunk-52XO4ULK.js.map +1 -0
- package/dist/{chunk-AMNCCZSG.js → chunk-6G3KZSO4.js} +82 -63
- package/dist/chunk-6G3KZSO4.js.map +1 -0
- package/dist/{chunk-LESHL6SM.js → chunk-6OWHQ7HM.js} +21 -13
- package/dist/chunk-6OWHQ7HM.js.map +1 -0
- package/dist/{chunk-X3SZIBVW.js → chunk-7FMEMXJ4.js} +71 -71
- package/dist/chunk-7FMEMXJ4.js.map +1 -0
- package/dist/{chunk-I52THVF6.js → chunk-AJJJE7F7.js} +2 -2
- package/dist/{chunk-ZML3OCYA.js → chunk-AX3SZZWA.js} +2 -2
- package/dist/{chunk-NJVJ7VO5.js → chunk-BFD5NZQ4.js} +5 -4
- package/dist/chunk-BFD5NZQ4.js.map +1 -0
- package/dist/{chunk-GSPPOXMG.js → chunk-BKJHAJQW.js} +2 -2
- package/dist/{chunk-GSPPOXMG.js.map → chunk-BKJHAJQW.js.map} +1 -1
- package/dist/{chunk-FPTUCWBY.js → chunk-BMJZBLP7.js} +46 -30
- package/dist/chunk-BMJZBLP7.js.map +1 -0
- package/dist/chunk-BNQ5O6LE.js +74 -0
- package/dist/chunk-BNQ5O6LE.js.map +1 -0
- package/dist/{chunk-W62XVWXB.js → chunk-C577AJE7.js} +3 -3
- package/dist/chunk-CIG7IKX3.js +118 -0
- package/dist/chunk-CIG7IKX3.js.map +1 -0
- package/dist/chunk-EC3UJRKZ.js +1534 -0
- package/dist/chunk-EC3UJRKZ.js.map +1 -0
- package/dist/{chunk-IS7GP6XC.js → chunk-EMIUPGPL.js} +57 -52
- package/dist/chunk-EMIUPGPL.js.map +1 -0
- package/dist/chunk-G6WHCALR.js +593 -0
- package/dist/chunk-G6WHCALR.js.map +1 -0
- package/dist/{chunk-OTTITQ7C.js → chunk-H7WJK7NJ.js} +48 -95
- package/dist/chunk-H7WJK7NJ.js.map +1 -0
- package/dist/chunk-HGTC76BX.js +16 -0
- package/dist/chunk-HGTC76BX.js.map +1 -0
- package/dist/{chunk-G5OZQ376.js → chunk-K6OLORQL.js} +6 -6
- package/dist/{chunk-OHDEJEYB.js → chunk-KIWFEBKH.js} +41 -11
- package/dist/chunk-KIWFEBKH.js.map +1 -0
- package/dist/{chunk-YMUWTPOM.js → chunk-LWXRUR6B.js} +92 -100
- package/dist/chunk-LWXRUR6B.js.map +1 -0
- package/dist/{chunk-U2AEK4ZL.js → chunk-MGNYPVOJ.js} +2 -2
- package/dist/chunk-MKCHLXMY.js +40 -0
- package/dist/chunk-MKCHLXMY.js.map +1 -0
- package/dist/{chunk-37QYD33C.js → chunk-MMFQNJPE.js} +2 -2
- package/dist/{chunk-DG2U2WY3.js → chunk-MR6OBL3B.js} +3 -11
- package/dist/{chunk-DG2U2WY3.js.map → chunk-MR6OBL3B.js.map} +1 -1
- package/dist/{chunk-7IAKVZL5.js → chunk-O6BA7Q2B.js} +28 -59
- package/dist/chunk-O6BA7Q2B.js.map +1 -0
- package/dist/chunk-OCEFD7V6.js +201 -0
- package/dist/chunk-OCEFD7V6.js.map +1 -0
- package/dist/{chunk-YZTWZVGX.js → chunk-PUT7X3GA.js} +1 -1
- package/dist/chunk-PUT7X3GA.js.map +1 -0
- package/dist/chunk-RO6LX3UV.js +342 -0
- package/dist/chunk-RO6LX3UV.js.map +1 -0
- package/dist/{chunk-34BP5BC4.js → chunk-SDKCQXWE.js} +2 -2
- package/dist/{chunk-VBAAATPU.js → chunk-SEJF7CGJ.js} +41 -28
- package/dist/chunk-SEJF7CGJ.js.map +1 -0
- package/dist/{chunk-5O6GKXAN.js → chunk-SZRK3VOR.js} +24 -14
- package/dist/chunk-SZRK3VOR.js.map +1 -0
- package/dist/{chunk-5MN5S3DV.js → chunk-TC3NHO34.js} +22 -17
- package/dist/chunk-TC3NHO34.js.map +1 -0
- package/dist/{chunk-SPVSWDFM.js → chunk-TGLRDEEL.js} +8 -14
- package/dist/chunk-TGLRDEEL.js.map +1 -0
- package/dist/{chunk-P2SFRDWI.js → chunk-TZXYBG3R.js} +3634 -2875
- package/dist/chunk-TZXYBG3R.js.map +1 -0
- package/dist/{chunk-2BVZOYJP.js → chunk-VR3CDXDT.js} +2 -6
- package/dist/chunk-VR3CDXDT.js.map +1 -0
- package/dist/{chunk-KPJJOLAQ.js → chunk-WF6RM73R.js} +272 -40
- package/dist/chunk-WF6RM73R.js.map +1 -0
- package/dist/chunk-WYVDNGJB.js +31 -0
- package/dist/chunk-WYVDNGJB.js.map +1 -0
- package/dist/{chunk-F7KTUFGU.js → chunk-X5EG4EFP.js} +3 -2
- package/dist/chunk-X5EG4EFP.js.map +1 -0
- package/dist/{chunk-FHKNG3UA.js → chunk-XUDTFI4M.js} +2 -2
- package/dist/{chunk-AXV7NFFJ.js → chunk-YHCYKUA3.js} +14 -10
- package/dist/chunk-YHCYKUA3.js.map +1 -0
- package/dist/commands/build/marketplace.js +4 -4
- package/dist/commands/build/plugins.js +9 -7
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +13 -10
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +45 -72
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +7 -5
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/path.js +8 -6
- package/dist/commands/config/path.js.map +1 -1
- package/dist/commands/config/show.js +7 -5
- package/dist/commands/diff.js +9 -7
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +20 -16
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +196 -94
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +20 -41
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +10 -18
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +21 -20
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +41 -435
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.js +8 -6
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/agent.js +28 -15
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +67 -31
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +17 -208
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +16 -10
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +45 -35
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +93 -123
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +11 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +42 -267
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/common/confirm.test.js +4 -4
- package/dist/components/skill-search/skill-search.js +3 -3
- package/dist/components/wizard/category-grid.js +3 -2
- package/dist/components/wizard/category-grid.test.js +113 -59
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +5 -3
- package/dist/components/wizard/checkbox-grid.test.js +6 -5
- package/dist/components/wizard/checkbox-grid.test.js.map +1 -1
- package/dist/components/wizard/domain-selection.js +12 -9
- package/dist/components/wizard/help-modal.js +2 -2
- package/dist/components/wizard/menu-item.js +1 -1
- package/dist/components/wizard/search-modal.js +2 -2
- package/dist/components/wizard/search-modal.test.js +3 -3
- 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 +4 -4
- 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 +4 -3
- package/dist/components/wizard/source-grid.test.js +5 -4
- 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 -8
- package/dist/components/wizard/step-agents.test.js +20 -18
- package/dist/components/wizard/step-agents.test.js.map +1 -1
- package/dist/components/wizard/step-build.js +11 -8
- package/dist/components/wizard/step-build.test.js +18 -36
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +4 -4
- package/dist/components/wizard/step-confirm.test.js +83 -23
- package/dist/components/wizard/step-confirm.test.js.map +1 -1
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +3 -3
- package/dist/components/wizard/step-settings.js +9 -5
- package/dist/components/wizard/step-settings.test.js +13 -9
- package/dist/components/wizard/step-settings.test.js.map +1 -1
- package/dist/components/wizard/step-sources.js +13 -10
- package/dist/components/wizard/step-sources.test.js +19 -16
- package/dist/components/wizard/step-sources.test.js.map +1 -1
- package/dist/components/wizard/step-stack.js +16 -12
- package/dist/components/wizard/step-stack.test.js +18 -14
- 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 -25
- package/dist/config-exports.js +20 -0
- package/dist/config-exports.js.map +1 -0
- package/dist/hooks/init.js +56 -3
- package/dist/hooks/init.js.map +1 -1
- package/dist/loader-2O32KKAQ.js +19 -0
- package/dist/source-loader-A6B3NDI4.js +16 -0
- package/dist/source-loader-A6B3NDI4.js.map +1 -0
- package/dist/source-manager-Q7IQSGIX.js +18 -0
- package/dist/source-manager-Q7IQSGIX.js.map +1 -0
- 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/output-format.md +1 -1
- package/dist/src/agents/meta/agent-summoner/workflow.md +8 -10
- package/{src/agents/meta/documentor/agent.yaml → dist/src/agents/meta/documentor/metadata.yaml} +1 -0
- package/dist/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
- package/dist/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
- package/dist/src/agents/meta/skill-summoner/intro.md +1 -1
- package/dist/src/agents/meta/skill-summoner/output-format.md +3 -3
- package/dist/src/agents/meta/skill-summoner/workflow.md +8 -8
- package/dist/stores/wizard-store.js +6 -5
- package/dist/stores/wizard-store.test.js +367 -75
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +5 -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/output-format.md +1 -1
- package/src/agents/meta/agent-summoner/workflow.md +8 -10
- package/{dist/src/agents/meta/documentor/agent.yaml → src/agents/meta/documentor/metadata.yaml} +1 -0
- package/src/agents/meta/skill-summoner/critical-reminders.md +2 -2
- package/src/agents/meta/skill-summoner/critical-requirements.md +1 -1
- package/src/agents/meta/skill-summoner/intro.md +1 -1
- package/src/agents/meta/skill-summoner/output-format.md +3 -3
- package/src/agents/meta/skill-summoner/workflow.md +8 -8
- package/src/schemas/agent.schema.json +1 -1
- package/src/schemas/metadata.schema.json +6 -0
- package/src/schemas/project-config.schema.json +0 -3
- package/src/schemas/stacks.schema.json +1 -1
- package/config/skill-categories.yaml +0 -344
- package/config/skill-rules.yaml +0 -740
- package/config/stacks.yaml +0 -1865
- package/dist/chunk-2BVZOYJP.js.map +0 -1
- package/dist/chunk-2DNDAXF6.js.map +0 -1
- package/dist/chunk-5MN5S3DV.js.map +0 -1
- package/dist/chunk-5O6GKXAN.js.map +0 -1
- package/dist/chunk-7IAKVZL5.js.map +0 -1
- package/dist/chunk-AMNCCZSG.js.map +0 -1
- package/dist/chunk-AXV7NFFJ.js.map +0 -1
- package/dist/chunk-AXZNJ5PN.js +0 -99
- package/dist/chunk-AXZNJ5PN.js.map +0 -1
- package/dist/chunk-C7DLY64D.js +0 -115
- package/dist/chunk-C7DLY64D.js.map +0 -1
- package/dist/chunk-F7KTUFGU.js.map +0 -1
- package/dist/chunk-FPTUCWBY.js.map +0 -1
- package/dist/chunk-IS7GP6XC.js.map +0 -1
- package/dist/chunk-KPJJOLAQ.js.map +0 -1
- package/dist/chunk-LESHL6SM.js.map +0 -1
- package/dist/chunk-NJVJ7VO5.js.map +0 -1
- package/dist/chunk-OHDEJEYB.js.map +0 -1
- package/dist/chunk-OTTITQ7C.js.map +0 -1
- package/dist/chunk-P2SFRDWI.js.map +0 -1
- package/dist/chunk-PY2XZUBF.js +0 -29
- package/dist/chunk-PY2XZUBF.js.map +0 -1
- package/dist/chunk-SPVSWDFM.js.map +0 -1
- package/dist/chunk-VBAAATPU.js.map +0 -1
- package/dist/chunk-WSGKCBY5.js.map +0 -1
- package/dist/chunk-X3SZIBVW.js.map +0 -1
- package/dist/chunk-YDASDMTH.js +0 -183
- package/dist/chunk-YDASDMTH.js.map +0 -1
- package/dist/chunk-YMUWTPOM.js.map +0 -1
- package/dist/chunk-YZTWZVGX.js.map +0 -1
- package/dist/commands/config/get.js +0 -61
- package/dist/commands/config/get.js.map +0 -1
- package/dist/commands/config/set-project.js +0 -61
- package/dist/commands/config/set-project.js.map +0 -1
- package/dist/commands/config/unset-project.js +0 -57
- package/dist/commands/config/unset-project.js.map +0 -1
- package/dist/config/skill-categories.yaml +0 -344
- package/dist/config/skill-rules.yaml +0 -740
- package/dist/config/stacks.yaml +0 -1865
- package/dist/source-manager-Y7R6WPOW.js +0 -16
- package/dist/src/agents/migration/cli-migrator/agent.yaml +0 -12
- package/dist/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
- package/dist/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
- package/dist/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
- package/dist/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
- package/dist/src/agents/migration/cli-migrator/intro.md +0 -15
- package/dist/src/agents/migration/cli-migrator/output-format.md +0 -164
- package/dist/src/agents/migration/cli-migrator/workflow.md +0 -230
- package/src/agents/migration/cli-migrator/agent.yaml +0 -12
- package/src/agents/migration/cli-migrator/anti-patterns.md +0 -158
- package/src/agents/migration/cli-migrator/conversion-mappings.md +0 -63
- package/src/agents/migration/cli-migrator/critical-reminders.md +0 -17
- package/src/agents/migration/cli-migrator/critical-requirements.md +0 -13
- package/src/agents/migration/cli-migrator/intro.md +0 -15
- package/src/agents/migration/cli-migrator/output-format.md +0 -164
- package/src/agents/migration/cli-migrator/workflow.md +0 -230
- /package/dist/{chunk-I52THVF6.js.map → chunk-AJJJE7F7.js.map} +0 -0
- /package/dist/{chunk-ZML3OCYA.js.map → chunk-AX3SZZWA.js.map} +0 -0
- /package/dist/{chunk-W62XVWXB.js.map → chunk-C577AJE7.js.map} +0 -0
- /package/dist/{chunk-G5OZQ376.js.map → chunk-K6OLORQL.js.map} +0 -0
- /package/dist/{chunk-U2AEK4ZL.js.map → chunk-MGNYPVOJ.js.map} +0 -0
- /package/dist/{chunk-37QYD33C.js.map → chunk-MMFQNJPE.js.map} +0 -0
- /package/dist/{chunk-34BP5BC4.js.map → chunk-SDKCQXWE.js.map} +0 -0
- /package/dist/{chunk-FHKNG3UA.js.map → chunk-XUDTFI4M.js.map} +0 -0
- /package/dist/{source-manager-Y7R6WPOW.js.map → loader-2O32KKAQ.js.map} +0 -0
- /package/dist/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/dist/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/api-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/cli-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/web-architecture/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/developer/web-developer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/meta/agent-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/meta/skill-summoner/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/pattern/pattern-scout/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/pattern/web-pattern-critique/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/planning/web-pm/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/researcher/api-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/researcher/web-researcher/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/api-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/cli-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/reviewer/web-reviewer/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/tester/cli-tester/{agent.yaml → metadata.yaml} +0 -0
- /package/src/agents/tester/web-tester/{agent.yaml → metadata.yaml} +0 -0
|
@@ -3,17 +3,19 @@ import {
|
|
|
3
3
|
useFocusedListItem
|
|
4
4
|
} from "./chunk-GG4BSB6S.js";
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
useSectionScroll
|
|
7
|
+
} from "./chunk-BNQ5O6LE.js";
|
|
8
|
+
import {
|
|
9
|
+
CLI_COLORS
|
|
10
|
+
} from "./chunk-6OWHQ7HM.js";
|
|
9
11
|
import {
|
|
10
12
|
init_esm_shims
|
|
11
13
|
} from "./chunk-DHET7RCE.js";
|
|
12
14
|
|
|
13
15
|
// src/cli/components/wizard/category-grid.tsx
|
|
14
16
|
init_esm_shims();
|
|
15
|
-
import { useCallback as useCallback2,
|
|
16
|
-
import { Box, Text
|
|
17
|
+
import { useCallback as useCallback2, useMemo, useRef as useRef2 } from "react";
|
|
18
|
+
import { Box, Text } from "ink";
|
|
17
19
|
|
|
18
20
|
// src/cli/components/hooks/use-category-grid-input.ts
|
|
19
21
|
init_esm_shims();
|
|
@@ -100,7 +102,7 @@ function useCategoryGridInput({
|
|
|
100
102
|
if (input === " ") {
|
|
101
103
|
if (currentLocked) return;
|
|
102
104
|
const currentOption = currentOptions[focusedCol];
|
|
103
|
-
if (currentOption
|
|
105
|
+
if (currentOption) {
|
|
104
106
|
onToggle(currentRow.id, currentOption.id);
|
|
105
107
|
}
|
|
106
108
|
return;
|
|
@@ -130,18 +132,6 @@ function useCategoryGridInput({
|
|
|
130
132
|
// src/cli/components/wizard/category-grid.tsx
|
|
131
133
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
132
134
|
var SYMBOL_REQUIRED = "*";
|
|
133
|
-
var STATE_PRIORITY = {
|
|
134
|
-
recommended: 0,
|
|
135
|
-
normal: 1,
|
|
136
|
-
discouraged: 2,
|
|
137
|
-
disabled: 3
|
|
138
|
-
};
|
|
139
|
-
var stableSortByState = (options) => {
|
|
140
|
-
return [...options].sort((a, b) => {
|
|
141
|
-
if (a.selected !== b.selected) return a.selected ? -1 : 1;
|
|
142
|
-
return STATE_PRIORITY[a.state] - STATE_PRIORITY[b.state];
|
|
143
|
-
});
|
|
144
|
-
};
|
|
145
135
|
var findNextValidOption = (options, currentIndex, direction, wrap = true) => {
|
|
146
136
|
const length = options.length;
|
|
147
137
|
if (length === 0) return currentIndex;
|
|
@@ -157,23 +147,21 @@ var findNextValidOption = (options, currentIndex, direction, wrap = true) => {
|
|
|
157
147
|
};
|
|
158
148
|
var getCompatibilityLabel = (option, isLocked) => {
|
|
159
149
|
if (option.selected) return "(selected)";
|
|
160
|
-
if (isLocked
|
|
150
|
+
if (isLocked) return "(disabled)";
|
|
161
151
|
if (option.state === "recommended") return "(recommended)";
|
|
162
152
|
if (option.state === "discouraged") return "(discouraged)";
|
|
163
153
|
return null;
|
|
164
154
|
};
|
|
165
155
|
var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
|
|
166
156
|
const getTextColor = () => {
|
|
167
|
-
if (
|
|
168
|
-
if (isLocked || option.state === "disabled") return CLI_COLORS.NEUTRAL;
|
|
157
|
+
if (isLocked) return CLI_COLORS.NEUTRAL;
|
|
169
158
|
if (option.selected) return CLI_COLORS.PRIMARY;
|
|
170
159
|
if (option.state === "recommended") return CLI_COLORS.UNFOCUSED;
|
|
171
160
|
if (option.state === "discouraged") return CLI_COLORS.WARNING;
|
|
172
161
|
return CLI_COLORS.NEUTRAL;
|
|
173
162
|
};
|
|
174
163
|
const getStateBorderColor = () => {
|
|
175
|
-
if (
|
|
176
|
-
if (isLocked || option.state === "disabled") return CLI_COLORS.NEUTRAL;
|
|
164
|
+
if (isLocked) return CLI_COLORS.NEUTRAL;
|
|
177
165
|
if (option.selected) return CLI_COLORS.PRIMARY;
|
|
178
166
|
if (option.state === "recommended") return CLI_COLORS.UNFOCUSED;
|
|
179
167
|
if (option.state === "discouraged") return CLI_COLORS.WARNING;
|
|
@@ -189,11 +177,12 @@ var SkillTag = ({ option, isFocused, isLocked, showLabels }) => {
|
|
|
189
177
|
borderStyle: "single",
|
|
190
178
|
flexShrink: 0,
|
|
191
179
|
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
192
|
-
/* @__PURE__ */ jsxs(Text, { color: textColor, bold: true,
|
|
180
|
+
/* @__PURE__ */ jsxs(Text, { color: textColor, bold: true, children: [
|
|
193
181
|
" ",
|
|
194
182
|
option.label,
|
|
195
183
|
" "
|
|
196
184
|
] }),
|
|
185
|
+
option.scope === "global" && /* @__PURE__ */ jsx(Text, { color: CLI_COLORS.WARNING, children: "G " }),
|
|
197
186
|
compatibilityLabel && /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
198
187
|
compatibilityLabel,
|
|
199
188
|
" "
|
|
@@ -209,11 +198,10 @@ var CategorySection = ({
|
|
|
209
198
|
isLocked,
|
|
210
199
|
isFocused,
|
|
211
200
|
focusedOptionIndex,
|
|
212
|
-
showLabels
|
|
213
|
-
expertMode
|
|
201
|
+
showLabels
|
|
214
202
|
}) => {
|
|
215
203
|
const selectedCount = options.filter((o) => o.selected).length;
|
|
216
|
-
const selectionCounter =
|
|
204
|
+
const selectionCounter = category.exclusive ? `(${selectedCount} of 1)` : `(${selectedCount} selected)`;
|
|
217
205
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", marginTop: isFirst ? 0 : 1, children: [
|
|
218
206
|
/* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
|
|
219
207
|
/* @__PURE__ */ jsx(Text, { dimColor: isLocked, color: isFocused ? "#fff" : "gray", children: category.displayName }),
|
|
@@ -242,33 +230,15 @@ var CategoryGrid = ({
|
|
|
242
230
|
categories,
|
|
243
231
|
availableHeight = 0,
|
|
244
232
|
showLabels,
|
|
245
|
-
expertMode,
|
|
246
233
|
onToggle,
|
|
247
234
|
onToggleLabels,
|
|
248
235
|
defaultFocusedRow = 0,
|
|
249
236
|
defaultFocusedCol = 0,
|
|
250
|
-
onFocusChange
|
|
237
|
+
onFocusChange,
|
|
238
|
+
onFocusedSkillChange
|
|
251
239
|
}) => {
|
|
252
|
-
const initialOrderRef = useRef2(/* @__PURE__ */ new Map());
|
|
253
240
|
const processedCategories = useMemo(
|
|
254
|
-
() => categories.map((category) => {
|
|
255
|
-
const cached = initialOrderRef.current.get(category.id);
|
|
256
|
-
if (cached) {
|
|
257
|
-
const orderMap = new Map(cached.map((id, idx) => [id, idx]));
|
|
258
|
-
const sorted2 = [...category.options].sort((a, b) => {
|
|
259
|
-
const aIdx = orderMap.get(a.id) ?? Infinity;
|
|
260
|
-
const bIdx = orderMap.get(b.id) ?? Infinity;
|
|
261
|
-
return aIdx - bIdx;
|
|
262
|
-
});
|
|
263
|
-
return { ...category, sortedOptions: sorted2 };
|
|
264
|
-
}
|
|
265
|
-
const sorted = stableSortByState(category.options);
|
|
266
|
-
initialOrderRef.current.set(
|
|
267
|
-
category.id,
|
|
268
|
-
sorted.map((o) => o.id)
|
|
269
|
-
);
|
|
270
|
-
return { ...category, sortedOptions: sorted };
|
|
271
|
-
}),
|
|
241
|
+
() => categories.map((category) => ({ ...category, sortedOptions: category.options })),
|
|
272
242
|
[categories]
|
|
273
243
|
);
|
|
274
244
|
const getColCount = useCallback2(
|
|
@@ -291,6 +261,14 @@ var CategoryGrid = ({
|
|
|
291
261
|
},
|
|
292
262
|
[processedCategories, categories]
|
|
293
263
|
);
|
|
264
|
+
const handleFocusChange = useCallback2(
|
|
265
|
+
(row, col) => {
|
|
266
|
+
onFocusChange?.(row, col);
|
|
267
|
+
const skill = processedCategories[row]?.sortedOptions[col];
|
|
268
|
+
onFocusedSkillChange?.(skill?.id ?? null);
|
|
269
|
+
},
|
|
270
|
+
[onFocusChange, processedCategories, onFocusedSkillChange]
|
|
271
|
+
);
|
|
294
272
|
const { focusedRow, focusedCol, setFocused, moveFocus } = useFocusedListItem(
|
|
295
273
|
processedCategories.length,
|
|
296
274
|
getColCount,
|
|
@@ -298,11 +276,17 @@ var CategoryGrid = ({
|
|
|
298
276
|
wrap: true,
|
|
299
277
|
isRowLocked,
|
|
300
278
|
findValidCol,
|
|
301
|
-
onChange:
|
|
279
|
+
onChange: handleFocusChange,
|
|
302
280
|
initialRow: defaultFocusedRow,
|
|
303
281
|
initialCol: defaultFocusedCol
|
|
304
282
|
}
|
|
305
283
|
);
|
|
284
|
+
const mountedRef = useRef2(false);
|
|
285
|
+
if (!mountedRef.current) {
|
|
286
|
+
mountedRef.current = true;
|
|
287
|
+
const skill = processedCategories[defaultFocusedRow]?.sortedOptions[defaultFocusedCol];
|
|
288
|
+
onFocusedSkillChange?.(skill?.id ?? null);
|
|
289
|
+
}
|
|
306
290
|
useCategoryGridInput({
|
|
307
291
|
processedCategories,
|
|
308
292
|
categories,
|
|
@@ -313,52 +297,18 @@ var CategoryGrid = ({
|
|
|
313
297
|
onToggle,
|
|
314
298
|
onToggleLabels
|
|
315
299
|
});
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
sectionRefs.current[index] = el;
|
|
321
|
-
}, []);
|
|
322
|
-
useEffect2(() => {
|
|
323
|
-
const heights = sectionRefs.current.map((el) => {
|
|
324
|
-
if (el) {
|
|
325
|
-
const { height } = measureElement(el);
|
|
326
|
-
return height;
|
|
327
|
-
}
|
|
328
|
-
return 0;
|
|
329
|
-
});
|
|
330
|
-
setSectionHeights((prev) => {
|
|
331
|
-
if (prev.length === heights.length && prev.every((h, i) => h === heights[i])) {
|
|
332
|
-
return prev;
|
|
333
|
-
}
|
|
334
|
-
return heights;
|
|
335
|
-
});
|
|
300
|
+
const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({
|
|
301
|
+
sectionCount: processedCategories.length,
|
|
302
|
+
focusedIndex: focusedRow,
|
|
303
|
+
availableHeight
|
|
336
304
|
});
|
|
337
|
-
const scrollEnabled = availableHeight > 0 && availableHeight >= SCROLL_VIEWPORT.MIN_VIEWPORT_ROWS;
|
|
338
|
-
useEffect2(() => {
|
|
339
|
-
if (!scrollEnabled || sectionHeights.length === 0) return;
|
|
340
|
-
let topOfFocused = 0;
|
|
341
|
-
for (let i = 0; i < focusedRow; i++) {
|
|
342
|
-
topOfFocused += sectionHeights[i] ?? 0;
|
|
343
|
-
}
|
|
344
|
-
const focusedHeight = sectionHeights[focusedRow] ?? 0;
|
|
345
|
-
const bottomOfFocused = topOfFocused + focusedHeight;
|
|
346
|
-
setScrollTopPx((prev) => {
|
|
347
|
-
if (topOfFocused < prev) {
|
|
348
|
-
return topOfFocused;
|
|
349
|
-
}
|
|
350
|
-
if (bottomOfFocused > prev + availableHeight) {
|
|
351
|
-
return bottomOfFocused - availableHeight;
|
|
352
|
-
}
|
|
353
|
-
return prev;
|
|
354
|
-
});
|
|
355
|
-
}, [focusedRow, sectionHeights, scrollEnabled, availableHeight]);
|
|
356
305
|
if (categories.length === 0) {
|
|
357
306
|
return /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No categories to display." }) });
|
|
358
307
|
}
|
|
308
|
+
const noShrink = scrollEnabled ? { flexShrink: 0 } : {};
|
|
359
309
|
const sectionElements = processedCategories.map((category, index) => {
|
|
360
310
|
const isLocked = isSectionLocked(category.id, categories);
|
|
361
|
-
return /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(index, el),
|
|
311
|
+
return /* @__PURE__ */ jsx(Box, { ref: (el) => setSectionRef(index, el), ...noShrink, children: /* @__PURE__ */ jsx(
|
|
362
312
|
CategorySection,
|
|
363
313
|
{
|
|
364
314
|
category,
|
|
@@ -367,18 +317,21 @@ var CategoryGrid = ({
|
|
|
367
317
|
isFocused: index === focusedRow,
|
|
368
318
|
focusedOptionIndex: focusedCol,
|
|
369
319
|
showLabels,
|
|
370
|
-
expertMode,
|
|
371
320
|
isFirst: index === 0
|
|
372
321
|
}
|
|
373
322
|
) }, category.id);
|
|
374
323
|
});
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
324
|
+
return /* @__PURE__ */ jsx(
|
|
325
|
+
Box,
|
|
326
|
+
{
|
|
327
|
+
flexDirection: "column",
|
|
328
|
+
...scrollEnabled ? { height: availableHeight, overflow: "hidden" } : { flexGrow: 1 },
|
|
329
|
+
children: /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginTop: scrollTopPx > 0 ? -scrollTopPx : 0, ...noShrink, children: sectionElements })
|
|
330
|
+
}
|
|
331
|
+
);
|
|
379
332
|
};
|
|
380
333
|
|
|
381
334
|
export {
|
|
382
335
|
CategoryGrid
|
|
383
336
|
};
|
|
384
|
-
//# sourceMappingURL=chunk-
|
|
337
|
+
//# sourceMappingURL=chunk-H7WJK7NJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/category-grid.tsx","../src/cli/components/hooks/use-category-grid-input.ts"],"sourcesContent":["import React, { useCallback, useMemo, useRef } from \"react\";\n\nimport { Box, Text } from \"ink\";\n\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { SkillId, Category } from \"../../types/index.js\";\nimport { isSectionLocked, useCategoryGridInput } from \"../hooks/use-category-grid-input.js\";\nimport { useFocusedListItem } from \"../hooks/use-focused-list-item.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\n\nexport type OptionState = \"normal\" | \"recommended\" | \"discouraged\";\n\nexport type CategoryOption = {\n id: SkillId;\n label: string;\n state: OptionState;\n stateReason?: string;\n selected: boolean;\n local?: boolean;\n installed?: boolean;\n scope?: \"project\" | \"global\";\n};\n\nexport type CategoryRow = {\n id: Category;\n displayName: string;\n required: boolean;\n exclusive: boolean;\n options: CategoryOption[];\n};\n\nexport type CategoryGridProps = {\n categories: CategoryRow[];\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n showLabels: boolean;\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n /** Optional initial focus row (default: 0). Use with React `key` to reset. */\n defaultFocusedRow?: number;\n /** Optional initial focus col (default: 0). Use with React `key` to reset. */\n defaultFocusedCol?: number;\n /** Optional callback fired whenever the focused position changes */\n onFocusChange?: (row: number, col: number) => void;\n /** Optional callback fired with the resolved SkillId of the focused cell */\n onFocusedSkillChange?: (skillId: SkillId | null) => void;\n};\n\nconst SYMBOL_REQUIRED = \"*\";\n\nconst findNextValidOption = (\n options: CategoryOption[],\n currentIndex: number,\n direction: 1 | -1,\n wrap = true,\n): number => {\n const length = options.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex + direction;\n\n if (wrap) {\n if (index < 0) index = length - 1;\n if (index >= length) index = 0;\n } else {\n if (index < 0) index = 0;\n if (index >= length) index = length - 1;\n }\n\n return index;\n};\n\ntype SkillTagProps = {\n option: CategoryOption;\n isFocused: boolean;\n isLocked: boolean;\n showLabels: boolean;\n};\n\nconst getCompatibilityLabel = (option: CategoryOption, isLocked: boolean): string | null => {\n if (option.selected) return \"(selected)\";\n if (isLocked) return \"(disabled)\";\n if (option.state === \"recommended\") return \"(recommended)\";\n if (option.state === \"discouraged\") return \"(discouraged)\";\n return null;\n};\n\nconst SkillTag: React.FC<SkillTagProps> = ({ option, isFocused, isLocked, showLabels }) => {\n const getTextColor = (): string => {\n if (isLocked) return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n\n return CLI_COLORS.NEUTRAL;\n };\n\n const getStateBorderColor = (): string => {\n if (isLocked) return CLI_COLORS.NEUTRAL;\n if (option.selected) return CLI_COLORS.PRIMARY;\n if (option.state === \"recommended\") return CLI_COLORS.UNFOCUSED;\n if (option.state === \"discouraged\") return CLI_COLORS.WARNING;\n return CLI_COLORS.UNFOCUSED;\n };\n\n const textColor = getTextColor();\n const compatibilityLabel = showLabels ? getCompatibilityLabel(option, isLocked) : null;\n\n return (\n <Box\n marginRight={1}\n borderColor={isFocused ? getStateBorderColor() : CLI_COLORS.NEUTRAL}\n borderStyle=\"single\"\n flexShrink={0}\n >\n <>\n <Text color={textColor} bold>\n {\" \"}\n {option.label}{\" \"}\n </Text>\n {option.scope === \"global\" && <Text color={CLI_COLORS.WARNING}>G </Text>}\n {compatibilityLabel && <Text dimColor>{compatibilityLabel} </Text>}\n </>\n </Box>\n );\n};\n\ntype CategorySectionProps = {\n isFirst: boolean;\n category: CategoryRow;\n options: CategoryOption[];\n isLocked: boolean;\n isFocused: boolean;\n focusedOptionIndex: number;\n showLabels: boolean;\n};\n\nconst CategorySection: React.FC<CategorySectionProps> = ({\n isFirst,\n category,\n options,\n isLocked,\n isFocused,\n focusedOptionIndex,\n showLabels,\n}) => {\n const selectedCount = options.filter((o) => o.selected).length;\n\n const selectionCounter = category.exclusive\n ? `(${selectedCount} of 1)`\n : `(${selectedCount} selected)`;\n\n return (\n <Box flexDirection=\"column\" marginTop={isFirst ? 0 : 1}>\n <Box flexDirection=\"row\">\n <Text dimColor={isLocked} color={isFocused ? \"#fff\" : \"gray\"}>\n {category.displayName}\n </Text>\n {category.required && (\n <Text color={isLocked ? CLI_COLORS.NEUTRAL : CLI_COLORS.ERROR} dimColor={isLocked}>\n {\" \"}\n {SYMBOL_REQUIRED}\n </Text>\n )}\n {selectionCounter && <Text dimColor> {selectionCounter}</Text>}\n </Box>\n\n <Box flexDirection=\"row\" flexWrap=\"wrap\" marginTop={0}>\n {options.map((option, index) => (\n <SkillTag\n key={option.id}\n option={option}\n isFocused={isFocused && index === focusedOptionIndex && !isLocked}\n isLocked={isLocked}\n showLabels={showLabels}\n />\n ))}\n </Box>\n </Box>\n );\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\nexport const CategoryGrid: React.FC<CategoryGridProps> = ({\n categories,\n availableHeight = 0,\n showLabels,\n onToggle,\n onToggleLabels,\n defaultFocusedRow = 0,\n defaultFocusedCol = 0,\n onFocusChange,\n onFocusedSkillChange,\n}) => {\n const processedCategories = useMemo(\n () => categories.map((category) => ({ ...category, sortedOptions: category.options })),\n [categories],\n );\n\n const getColCount = useCallback(\n (row: number): number => processedCategories[row]?.sortedOptions.length ?? 0,\n [processedCategories],\n );\n\n const isRowLocked = useCallback(\n (row: number): boolean => {\n const cat = processedCategories[row];\n return cat ? isSectionLocked(cat.id, categories) : false;\n },\n [processedCategories, categories],\n );\n\n const findValidCol = useCallback(\n (row: number, currentCol: number, direction: 1 | -1): number => {\n const options = processedCategories[row]?.sortedOptions || [];\n const catId = processedCategories[row]?.id;\n if (catId && isSectionLocked(catId, categories)) return currentCol;\n return findNextValidOption(options, currentCol, direction, true);\n },\n [processedCategories, categories],\n );\n\n const handleFocusChange = useCallback(\n (row: number, col: number) => {\n onFocusChange?.(row, col);\n const skill = processedCategories[row]?.sortedOptions[col];\n onFocusedSkillChange?.(skill?.id ?? null);\n },\n [onFocusChange, processedCategories, onFocusedSkillChange],\n );\n\n const { focusedRow, focusedCol, setFocused, moveFocus } = useFocusedListItem(\n processedCategories.length,\n getColCount,\n {\n wrap: true,\n isRowLocked,\n findValidCol,\n onChange: handleFocusChange,\n initialRow: defaultFocusedRow,\n initialCol: defaultFocusedCol,\n },\n );\n\n const mountedRef = useRef(false);\n if (!mountedRef.current) {\n mountedRef.current = true;\n const skill = processedCategories[defaultFocusedRow]?.sortedOptions[defaultFocusedCol];\n onFocusedSkillChange?.(skill?.id ?? null);\n }\n\n useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n });\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: processedCategories.length,\n focusedIndex: focusedRow,\n availableHeight,\n });\n\n if (categories.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text dimColor>No categories to display.</Text>\n </Box>\n );\n }\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = processedCategories.map((category, index) => {\n const isLocked = isSectionLocked(category.id, categories);\n\n return (\n <Box key={category.id} ref={(el) => setSectionRef(index, el)} {...noShrink}>\n <CategorySection\n category={category}\n options={category.sortedOptions}\n isLocked={isLocked}\n isFocused={index === focusedRow}\n focusedOptionIndex={focusedCol}\n showLabels={showLabels}\n isFirst={index === 0}\n />\n </Box>\n );\n });\n\n return (\n <Box\n flexDirection=\"column\"\n {...(scrollEnabled\n ? { height: availableHeight, overflow: \"hidden\" as const }\n : { flexGrow: 1 })}\n >\n <Box flexDirection=\"column\" marginTop={scrollTopPx > 0 ? -scrollTopPx : 0} {...noShrink}>\n {sectionElements}\n </Box>\n </Box>\n );\n};\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { useInput } from \"ink\";\n\nimport type { Category, SkillId } from \"../../types/index.js\";\nimport type { CategoryOption, CategoryRow } from \"../wizard/category-grid.js\";\n\nconst FRAMEWORK_CATEGORY_ID = \"web-framework\";\n\n// Locked = non-framework section when no framework is selected\nexport const isSectionLocked = (categoryId: Category, categories: CategoryRow[]): boolean => {\n if (categoryId === FRAMEWORK_CATEGORY_ID) {\n return false;\n }\n\n const frameworkCategory = categories.find((cat) => cat.id === FRAMEWORK_CATEGORY_ID);\n if (!frameworkCategory) return false;\n\n return !frameworkCategory.options.some((opt) => opt.selected);\n};\n\nexport const findValidStartColumn = (_options: CategoryOption[]): number => {\n return 0;\n};\n\n/** Find next unlocked section index (wrapping, direction: forward) */\nexport const findNextUnlockedIndex = (\n processed: { id: Category; sortedOptions: CategoryOption[] }[],\n currentIndex: number,\n allCategories: CategoryRow[],\n): number => {\n const length = processed.length;\n if (length === 0) return currentIndex;\n\n let index = currentIndex;\n let attempts = 0;\n\n while (attempts < length) {\n index += 1;\n if (index >= length) index = 0;\n\n const category = processed[index];\n if (category && !isSectionLocked(category.id, allCategories)) {\n return index;\n }\n\n attempts++;\n }\n\n return currentIndex;\n};\n\ntype ProcessedCategory = CategoryRow & { sortedOptions: CategoryOption[] };\n\ntype UseCategoryGridInputOptions = {\n processedCategories: ProcessedCategory[];\n categories: CategoryRow[];\n focusedRow: number;\n focusedCol: number;\n setFocused: (row: number, col: number) => void;\n moveFocus: (direction: \"up\" | \"down\" | \"left\" | \"right\") => void;\n onToggle: (categoryId: Category, technologyId: SkillId) => void;\n onToggleLabels: () => void;\n};\n\nexport function useCategoryGridInput({\n processedCategories,\n categories,\n focusedRow,\n focusedCol,\n setFocused,\n moveFocus,\n onToggle,\n onToggleLabels,\n}: UseCategoryGridInputOptions): void {\n const currentRow = processedCategories[focusedRow];\n const currentOptions = currentRow?.sortedOptions || [];\n const currentLocked = currentRow ? isSectionLocked(currentRow.id, categories) : false;\n\n // Adjust column when current row's options change externally (e.g. option becomes disabled)\n useEffect(() => {\n if (!currentRow) return;\n\n const maxCol = currentOptions.length - 1;\n if (focusedCol > maxCol) {\n const newCol = Math.max(0, maxCol);\n setFocused(focusedRow, newCol);\n }\n }, [focusedRow, currentOptions, focusedCol, setFocused, currentRow]);\n\n // Bounce off locked sections when a section becomes locked (e.g. framework deselected)\n useEffect(() => {\n if (currentRow && currentLocked) {\n const nextUnlocked = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextUnlocked !== focusedRow) {\n const newRowOptions = processedCategories[nextUnlocked]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextUnlocked, newCol);\n }\n }\n }, [currentRow, currentLocked, focusedRow, processedCategories, categories, setFocused]);\n\n // Store the latest handler in a ref so that the useInput effect never needs to\n // re-register on the event emitter. This avoids a stale-closure race condition\n // where, after a domain switch (CategoryGrid remount via key={activeDomain}),\n // the useInput effect may not yet have re-registered the updated handler when\n // the first keypress arrives — causing the first space press to be silently lost.\n type InputKey = {\n leftArrow: boolean;\n rightArrow: boolean;\n upArrow: boolean;\n downArrow: boolean;\n tab: boolean;\n shift: boolean;\n };\n\n const handlerRef = useRef<((input: string, key: InputKey) => void) | null>(null);\n handlerRef.current = (input: string, key: InputKey) => {\n if (key.tab && key.shift) {\n onToggleLabels();\n return;\n }\n\n if (key.tab && !key.shift) {\n const nextSection = findNextUnlockedIndex(processedCategories, focusedRow, categories);\n if (nextSection !== focusedRow) {\n const newRowOptions = processedCategories[nextSection]?.sortedOptions || [];\n const newCol = findValidStartColumn(newRowOptions);\n setFocused(nextSection, newCol);\n }\n return;\n }\n\n if (input === \"d\" || input === \"D\") {\n onToggleLabels();\n return;\n }\n\n if (input === \" \") {\n if (currentLocked) return;\n const currentOption = currentOptions[focusedCol];\n if (currentOption) {\n onToggle(currentRow.id, currentOption.id);\n }\n return;\n }\n\n const isLeft = key.leftArrow || input === \"h\";\n const isRight = key.rightArrow || input === \"l\";\n const isUp = key.upArrow || input === \"k\";\n const isDown = key.downArrow || input === \"j\";\n\n if (isLeft) {\n if (currentLocked) return;\n moveFocus(\"left\");\n } else if (isRight) {\n if (currentLocked) return;\n moveFocus(\"right\");\n } else if (isUp) {\n moveFocus(\"up\");\n } else if (isDown) {\n moveFocus(\"down\");\n }\n };\n\n // Stable handler reference — never changes, so useInput's effect registers once\n const stableHandler = useCallback((input: string, key: InputKey) => {\n handlerRef.current?.(input, key);\n }, []);\n\n useInput(stableHandler);\n}\n"],"mappings":"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","names":["useCallback","useRef","useCallback","useRef"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
init_esm_shims
|
|
4
|
+
} from "./chunk-DHET7RCE.js";
|
|
5
|
+
|
|
6
|
+
// src/cli/lib/feature-flags.ts
|
|
7
|
+
init_esm_shims();
|
|
8
|
+
var FEATURE_FLAGS = {
|
|
9
|
+
// Controls whether the search pill appears in the source grid (step-sources)
|
|
10
|
+
SOURCE_SEARCH: false
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
FEATURE_FLAGS
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=chunk-HGTC76BX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/feature-flags.ts"],"sourcesContent":["export const FEATURE_FLAGS = {\n // Controls whether the search pill appears in the source grid (step-sources)\n SOURCE_SEARCH: false,\n} as const;\n"],"mappings":";;;;;;AAAA;AAAO,IAAM,gBAAgB;AAAA;AAAA,EAE3B,eAAe;AACjB;","names":[]}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
BaseCommand
|
|
4
|
-
} from "./chunk-2BVZOYJP.js";
|
|
5
2
|
import {
|
|
6
3
|
DEFAULT_SOURCE,
|
|
7
4
|
SOURCE_ENV_VAR,
|
|
@@ -10,10 +7,13 @@ import {
|
|
|
10
7
|
loadProjectSourceConfig,
|
|
11
8
|
resolveAgentsSource,
|
|
12
9
|
resolveSource
|
|
13
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-TZXYBG3R.js";
|
|
11
|
+
import {
|
|
12
|
+
BaseCommand
|
|
13
|
+
} from "./chunk-VR3CDXDT.js";
|
|
14
14
|
import {
|
|
15
15
|
DEFAULT_BRANDING
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-6OWHQ7HM.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-K6OLORQL.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getDomainDisplayName
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BKJHAJQW.js";
|
|
5
5
|
import {
|
|
6
6
|
ViewTitle
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-MGNYPVOJ.js";
|
|
8
8
|
import {
|
|
9
9
|
CLI_COLORS
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-6OWHQ7HM.js";
|
|
11
11
|
import {
|
|
12
12
|
init_esm_shims
|
|
13
13
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -15,7 +15,15 @@ import {
|
|
|
15
15
|
// src/cli/components/wizard/step-confirm.tsx
|
|
16
16
|
init_esm_shims();
|
|
17
17
|
import { Box, Text, useInput } from "ink";
|
|
18
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
19
|
+
var getInstallModeLabel = (skillConfigs) => {
|
|
20
|
+
if (skillConfigs.length === 0) return "Local (editable copies)";
|
|
21
|
+
const localCount = skillConfigs.filter((s) => s.source === "local").length;
|
|
22
|
+
const pluginCount = skillConfigs.length - localCount;
|
|
23
|
+
if (localCount === 0) return "Plugin";
|
|
24
|
+
if (pluginCount === 0) return "Local (editable copies)";
|
|
25
|
+
return `Mixed (${localCount} local, ${pluginCount} plugin)`;
|
|
26
|
+
};
|
|
19
27
|
var StepConfirm = ({
|
|
20
28
|
onComplete,
|
|
21
29
|
stackName,
|
|
@@ -24,7 +32,8 @@ var StepConfirm = ({
|
|
|
24
32
|
technologyCount,
|
|
25
33
|
skillCount,
|
|
26
34
|
agentCount,
|
|
27
|
-
|
|
35
|
+
skillConfigs,
|
|
36
|
+
agentConfigs,
|
|
28
37
|
onBack
|
|
29
38
|
}) => {
|
|
30
39
|
useInput((_input, key) => {
|
|
@@ -69,12 +78,33 @@ var StepConfirm = ({
|
|
|
69
78
|
agentCount !== void 0 && /* @__PURE__ */ jsxs(Text, { children: [
|
|
70
79
|
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Agents:" }),
|
|
71
80
|
" ",
|
|
72
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: agentCount })
|
|
81
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: agentCount }),
|
|
82
|
+
agentConfigs && agentConfigs.length > 0 && /* @__PURE__ */ jsxs(Text, { children: [
|
|
83
|
+
" ",
|
|
84
|
+
/* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
85
|
+
"(",
|
|
86
|
+
agentConfigs.filter((a) => a.scope === "project").length,
|
|
87
|
+
" project",
|
|
88
|
+
agentConfigs.some((a) => a.scope === "global") && `, ${agentConfigs.filter((a) => a.scope === "global").length} global`,
|
|
89
|
+
")"
|
|
90
|
+
] })
|
|
91
|
+
] })
|
|
73
92
|
] }),
|
|
74
|
-
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
-
|
|
77
|
-
|
|
93
|
+
skillConfigs && skillConfigs.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
94
|
+
/* @__PURE__ */ jsxs(Text, { children: [
|
|
95
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Install mode:" }),
|
|
96
|
+
" ",
|
|
97
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: getInstallModeLabel(skillConfigs) })
|
|
98
|
+
] }),
|
|
99
|
+
/* @__PURE__ */ jsxs(Text, { children: [
|
|
100
|
+
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Scope:" }),
|
|
101
|
+
" ",
|
|
102
|
+
/* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
103
|
+
skillConfigs.filter((s) => s.scope === "project").length,
|
|
104
|
+
" project",
|
|
105
|
+
skillConfigs.some((s) => s.scope === "global") && `, ${skillConfigs.filter((s) => s.scope === "global").length} global`
|
|
106
|
+
] })
|
|
107
|
+
] })
|
|
78
108
|
] })
|
|
79
109
|
] }),
|
|
80
110
|
/* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "ENTER install ESC go back" }) })
|
|
@@ -84,4 +114,4 @@ var StepConfirm = ({
|
|
|
84
114
|
export {
|
|
85
115
|
StepConfirm
|
|
86
116
|
};
|
|
87
|
-
//# sourceMappingURL=chunk-
|
|
117
|
+
//# sourceMappingURL=chunk-KIWFEBKH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/step-confirm.tsx"],"sourcesContent":["import { Box, Text, useInput } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport type { Domain, DomainSelections } from \"../../types/index.js\";\nimport { getDomainDisplayName } from \"./utils.js\";\nimport { ViewTitle } from \"./view-title.js\";\n\ntype StepConfirmProps = {\n onComplete: () => void;\n stackName?: string;\n selectedDomains?: Domain[];\n domainSelections?: DomainSelections;\n technologyCount?: number;\n skillCount?: number;\n agentCount?: number;\n skillConfigs?: SkillConfig[];\n agentConfigs?: AgentScopeConfig[];\n onBack?: () => void;\n};\n\nconst getInstallModeLabel = (skillConfigs: SkillConfig[]): string => {\n if (skillConfigs.length === 0) return \"Local (editable copies)\";\n\n const localCount = skillConfigs.filter((s) => s.source === \"local\").length;\n const pluginCount = skillConfigs.length - localCount;\n\n if (localCount === 0) return \"Plugin\";\n if (pluginCount === 0) return \"Local (editable copies)\";\n return `Mixed (${localCount} local, ${pluginCount} plugin)`;\n};\n\nexport const StepConfirm: React.FC<StepConfirmProps> = ({\n onComplete,\n stackName,\n selectedDomains,\n domainSelections,\n technologyCount,\n skillCount,\n agentCount,\n skillConfigs,\n agentConfigs,\n onBack,\n}) => {\n useInput((_input, key) => {\n if (key.return) {\n onComplete();\n }\n if (key.escape && onBack) {\n onBack();\n }\n });\n\n const domainsText = selectedDomains?.map(getDomainDisplayName).join(\" + \") || \"\";\n const title = stackName\n ? `Ready to install ${stackName}`\n : `Ready to install your custom stack${domainsText ? ` (${domainsText})` : \"\"}`;\n\n return (\n <Box flexDirection=\"column\" paddingX={2}>\n <ViewTitle>{title}</ViewTitle>\n <Text> </Text>\n\n {domainSelections && selectedDomains && !stackName && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {selectedDomains.map((domain) => {\n const selections = domainSelections[domain] || {};\n const techs = Object.values(selections).flat();\n if (techs.length === 0) return null;\n return (\n <Text key={domain}>\n <Text bold>{getDomainDisplayName(domain)}:</Text> <Text>{techs.join(\", \")}</Text>\n </Text>\n );\n })}\n </Box>\n )}\n\n <Box flexDirection=\"column\" marginY={1}>\n {technologyCount !== undefined && (\n <Text>\n <Text dimColor>Technologies:</Text> <Text bold>{technologyCount}</Text>\n </Text>\n )}\n {skillCount !== undefined && (\n <Text>\n <Text dimColor>Skills:</Text> <Text bold>{skillCount}</Text>{\" \"}\n <Text color={CLI_COLORS.PRIMARY}>(all verified)</Text>\n </Text>\n )}\n {agentCount !== undefined && (\n <Text>\n <Text dimColor>Agents:</Text> <Text bold>{agentCount}</Text>\n {agentConfigs && agentConfigs.length > 0 && (\n <Text>\n {\" \"}\n <Text dimColor>\n ({agentConfigs.filter((a) => a.scope === \"project\").length} project\n {agentConfigs.some((a) => a.scope === \"global\") &&\n `, ${agentConfigs.filter((a) => a.scope === \"global\").length} global`}\n )\n </Text>\n </Text>\n )}\n </Text>\n )}\n {skillConfigs && skillConfigs.length > 0 && (\n <>\n <Text>\n <Text dimColor>Install mode:</Text>{\" \"}\n <Text bold>{getInstallModeLabel(skillConfigs)}</Text>\n </Text>\n <Text>\n <Text dimColor>Scope:</Text>{\" \"}\n <Text bold>\n {skillConfigs.filter((s) => s.scope === \"project\").length} project\n {skillConfigs.some((s) => s.scope === \"global\") &&\n `, ${skillConfigs.filter((s) => s.scope === \"global\").length} global`}\n </Text>\n </Text>\n </>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>ENTER install ESC go back</Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
|