@agents-inc/cli 0.74.11 → 0.74.12
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 +12 -0
- package/README.md +3 -3
- package/dist/{chunk-FW5C245M.js → chunk-2DKJM7RO.js} +6 -24
- package/dist/chunk-2DKJM7RO.js.map +1 -0
- package/dist/{chunk-NA6I5P5P.js → chunk-2PZ7LBFT.js} +1 -3
- package/dist/chunk-2PZ7LBFT.js.map +1 -0
- package/dist/{chunk-VILTRTBT.js → chunk-2YFC7IJ6.js} +4 -4
- package/dist/chunk-2YFC7IJ6.js.map +1 -0
- package/dist/{chunk-OV5UJWS5.js → chunk-62FBXUNR.js} +2 -2
- package/dist/{chunk-VYHRCFMD.js → chunk-6RGNXTTG.js} +5 -5
- package/dist/{chunk-2EXAK22V.js → chunk-6W4H2K3Z.js} +86 -55
- package/dist/chunk-6W4H2K3Z.js.map +1 -0
- package/dist/chunk-7M4INWUR.js +31 -0
- package/dist/chunk-7M4INWUR.js.map +1 -0
- package/dist/{chunk-EWKUUWYY.js → chunk-AKW425U6.js} +2 -2
- package/dist/{chunk-54AECXSH.js → chunk-ARGCINJC.js} +2 -2
- package/dist/{chunk-YZUAXX7F.js → chunk-DG2T7KYG.js} +3 -6
- package/dist/chunk-DG2T7KYG.js.map +1 -0
- package/dist/{chunk-M5IAGR5Z.js → chunk-DZUZVT5X.js} +3 -3
- package/dist/{chunk-PUZLP4SL.js → chunk-EWGFIBBU.js} +2 -2
- package/dist/{chunk-C6YLN4AW.js → chunk-GJWHA6P4.js} +18 -58
- package/dist/chunk-GJWHA6P4.js.map +1 -0
- package/dist/{chunk-PN65K3LH.js → chunk-I7WXUAWA.js} +2 -2
- package/dist/{chunk-YDBVG6RF.js → chunk-JBQRRJRY.js} +11 -21
- package/dist/chunk-JBQRRJRY.js.map +1 -0
- package/dist/{chunk-NDKIFVR4.js → chunk-MZQKSK3J.js} +3 -3
- package/dist/{chunk-IYA5PSXU.js → chunk-NO2XIAJC.js} +3 -3
- package/dist/{chunk-OINQ6OWM.js → chunk-NPMGVQM4.js} +2 -2
- package/dist/{chunk-GG4BSB6S.js → chunk-P2FHS5IS.js} +2 -3
- package/dist/{chunk-GG4BSB6S.js.map → chunk-P2FHS5IS.js.map} +1 -1
- package/dist/{chunk-X6LXHVA6.js → chunk-PJUC2WCA.js} +26 -21
- package/dist/chunk-PJUC2WCA.js.map +1 -0
- package/dist/{chunk-TPXDHJDB.js → chunk-TDHEAHXD.js} +2 -2
- package/dist/{chunk-XPRDNALD.js → chunk-W6NWOYMS.js} +2 -2
- package/dist/{chunk-VIVOJASC.js → chunk-YUSLPHXO.js} +5 -5
- package/dist/commands/build/plugins.js +2 -2
- package/dist/commands/build/stack.js +2 -2
- package/dist/commands/compile.js +2 -2
- package/dist/commands/config/index.js +2 -2
- package/dist/commands/config/path.js +1 -1
- package/dist/commands/config/show.js +2 -2
- package/dist/commands/diff.js +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/edit.js +23 -28
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +1 -1
- package/dist/commands/import/skill.js +1 -1
- package/dist/commands/info.js +1 -1
- package/dist/commands/init.js +19 -19
- package/dist/commands/list.js +1 -1
- package/dist/commands/new/agent.js +2 -2
- package/dist/commands/new/marketplace.js +2 -2
- package/dist/commands/new/skill.js +2 -2
- package/dist/commands/outdated.js +1 -1
- package/dist/commands/search.js +1 -1
- package/dist/commands/uninstall.js +1 -1
- package/dist/commands/update.js +2 -2
- package/dist/commands/validate.js +1 -1
- package/dist/components/wizard/category-grid.js +2 -2
- package/dist/components/wizard/category-grid.test.js +78 -77
- package/dist/components/wizard/category-grid.test.js.map +1 -1
- package/dist/components/wizard/checkbox-grid.js +2 -2
- package/dist/components/wizard/checkbox-grid.test.js +2 -2
- package/dist/components/wizard/domain-selection.js +5 -5
- package/dist/components/wizard/help-modal.js +1 -1
- package/dist/components/wizard/source-grid.js +2 -2
- package/dist/components/wizard/source-grid.test.js +5 -5
- package/dist/components/wizard/source-grid.test.js.map +1 -1
- package/dist/components/wizard/stack-selection.js +3 -3
- package/dist/components/wizard/step-agents.js +4 -4
- package/dist/components/wizard/step-agents.test.js +4 -4
- package/dist/components/wizard/step-build.js +6 -6
- package/dist/components/wizard/step-build.test.js +16 -18
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +2 -2
- package/dist/components/wizard/step-confirm.test.js +4 -4
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +2 -2
- package/dist/components/wizard/step-settings.js +3 -3
- package/dist/components/wizard/step-settings.test.js +6 -6
- package/dist/components/wizard/step-sources.js +6 -6
- package/dist/components/wizard/step-sources.test.js +6 -6
- package/dist/components/wizard/step-stack.js +7 -7
- package/dist/components/wizard/step-stack.test.js +12 -12
- package/dist/components/wizard/step-stack.test.js.map +1 -1
- package/dist/components/wizard/view-title.js +1 -1
- package/dist/components/wizard/wizard-layout.js +4 -4
- package/dist/components/wizard/wizard.js +18 -18
- package/dist/hooks/init.js +19 -19
- package/dist/{source-loader-WBDPZJEW.js → source-loader-42GVUFZA.js} +2 -4
- package/dist/{source-manager-RRGK4SBP.js → source-manager-WRZBOTEH.js} +2 -2
- package/dist/stores/wizard-store.js +2 -2
- package/dist/stores/wizard-store.test.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-2EXAK22V.js.map +0 -1
- package/dist/chunk-AQYAVLZK.js +0 -20
- package/dist/chunk-AQYAVLZK.js.map +0 -1
- package/dist/chunk-C6YLN4AW.js.map +0 -1
- package/dist/chunk-FW5C245M.js.map +0 -1
- package/dist/chunk-NA6I5P5P.js.map +0 -1
- package/dist/chunk-VILTRTBT.js.map +0 -1
- package/dist/chunk-X6LXHVA6.js.map +0 -1
- package/dist/chunk-YDBVG6RF.js.map +0 -1
- package/dist/chunk-YZUAXX7F.js.map +0 -1
- package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +0 -1
- package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +0 -13
- /package/dist/{chunk-OV5UJWS5.js.map → chunk-62FBXUNR.js.map} +0 -0
- /package/dist/{chunk-VYHRCFMD.js.map → chunk-6RGNXTTG.js.map} +0 -0
- /package/dist/{chunk-EWKUUWYY.js.map → chunk-AKW425U6.js.map} +0 -0
- /package/dist/{chunk-54AECXSH.js.map → chunk-ARGCINJC.js.map} +0 -0
- /package/dist/{chunk-M5IAGR5Z.js.map → chunk-DZUZVT5X.js.map} +0 -0
- /package/dist/{chunk-PUZLP4SL.js.map → chunk-EWGFIBBU.js.map} +0 -0
- /package/dist/{chunk-PN65K3LH.js.map → chunk-I7WXUAWA.js.map} +0 -0
- /package/dist/{chunk-NDKIFVR4.js.map → chunk-MZQKSK3J.js.map} +0 -0
- /package/dist/{chunk-IYA5PSXU.js.map → chunk-NO2XIAJC.js.map} +0 -0
- /package/dist/{chunk-OINQ6OWM.js.map → chunk-NPMGVQM4.js.map} +0 -0
- /package/dist/{chunk-TPXDHJDB.js.map → chunk-TDHEAHXD.js.map} +0 -0
- /package/dist/{chunk-XPRDNALD.js.map → chunk-W6NWOYMS.js.map} +0 -0
- /package/dist/{chunk-VIVOJASC.js.map → chunk-YUSLPHXO.js.map} +0 -0
- /package/dist/{source-loader-WBDPZJEW.js.map → source-loader-42GVUFZA.js.map} +0 -0
- /package/dist/{source-manager-RRGK4SBP.js.map → source-manager-WRZBOTEH.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,18 @@ Each release has detailed notes in its own file under [`changelogs/`](./changelo
|
|
|
7
7
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
8
8
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
9
|
|
|
10
|
+
## [0.74.12] - 2026-03-15
|
|
11
|
+
|
|
12
|
+
**Matrix refactor, wizard polish, symlink fix**
|
|
13
|
+
|
|
14
|
+
- Matrix resolver: split `isDiscouraged` into `isDiscouraged`, `isIncompatible`, `hasUnmetRequirements`
|
|
15
|
+
- Wizard: per-skill labels, remove marketplace display, simplify build step
|
|
16
|
+
- Fix macOS `/var` symlink bug in local-installer with `fs.realpathSync`
|
|
17
|
+
|
|
18
|
+
See [changelogs/0.74.12.md](./changelogs/0.74.12.md) for full details.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
10
22
|
## [0.74.11] - 2026-03-14
|
|
11
23
|
|
|
12
24
|
**Documentation overhaul — README, standards, .ai-docs**
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ npx @agents-inc/cli init
|
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
<p align="center">
|
|
27
|
-
<img src="screenshots/stack-selection.png" alt="Stack selection" width="
|
|
27
|
+
<img src="screenshots/stack-selection.png" alt="Stack selection" width="500">
|
|
28
28
|
</p>
|
|
29
29
|
|
|
30
30
|
Choose a pre-built stack or start from scratch. Stacks pre-select skills and agents for common tech combinations.
|
|
@@ -39,13 +39,13 @@ Choose a pre-built stack or start from scratch. Stacks pre-select skills and age
|
|
|
39
39
|
| `solidjs-stack` | SolidJS + Hono + Drizzle |
|
|
40
40
|
|
|
41
41
|
<p align="center">
|
|
42
|
-
<img src="screenshots/skill-selection.png" alt="Skill selection" width="
|
|
42
|
+
<img src="screenshots/skill-selection.png" alt="Skill selection" width="500">
|
|
43
43
|
</p>
|
|
44
44
|
|
|
45
45
|
Add or remove skills from the interactive grid. Skills are organized by domain with framework-aware filtering.
|
|
46
46
|
|
|
47
47
|
<p align="center">
|
|
48
|
-
<img src="screenshots/agent-selection.png" alt="Agent selection" width="
|
|
48
|
+
<img src="screenshots/agent-selection.png" alt="Agent selection" width="500">
|
|
49
49
|
</p>
|
|
50
50
|
|
|
51
51
|
Choose which subagents to compile. Each agent is composed from the skills you selected.
|
|
@@ -8,12 +8,11 @@ import {
|
|
|
8
8
|
} from "./chunk-HGTC76BX.js";
|
|
9
9
|
import {
|
|
10
10
|
HelpModal
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-2PZ7LBFT.js";
|
|
12
12
|
import {
|
|
13
13
|
useWizardStore
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-EWGFIBBU.js";
|
|
15
15
|
import {
|
|
16
|
-
HOTKEY_ACCEPT_DEFAULTS,
|
|
17
16
|
HOTKEY_HELP,
|
|
18
17
|
HOTKEY_SCOPE,
|
|
19
18
|
HOTKEY_SETTINGS,
|
|
@@ -24,8 +23,7 @@ import {
|
|
|
24
23
|
KEY_LABEL_SPACE
|
|
25
24
|
} from "./chunk-CBYRFAUN.js";
|
|
26
25
|
import {
|
|
27
|
-
CLI_COLORS
|
|
28
|
-
DEFAULT_PLUGIN_NAME
|
|
26
|
+
CLI_COLORS
|
|
29
27
|
} from "./chunk-EGMQ3SXN.js";
|
|
30
28
|
import {
|
|
31
29
|
init_esm_shims
|
|
@@ -101,8 +99,7 @@ var HOT_KEYS = [
|
|
|
101
99
|
{ label: "back", values: [KEY_LABEL_ESC] }
|
|
102
100
|
];
|
|
103
101
|
var WizardFooter = () => {
|
|
104
|
-
|
|
105
|
-
return /* @__PURE__ */ jsxs(
|
|
102
|
+
return /* @__PURE__ */ jsx(
|
|
106
103
|
Box,
|
|
107
104
|
{
|
|
108
105
|
columnGap: 2,
|
|
@@ -114,23 +111,12 @@ var WizardFooter = () => {
|
|
|
114
111
|
borderStyle: "single",
|
|
115
112
|
paddingLeft: 1,
|
|
116
113
|
paddingRight: 1,
|
|
117
|
-
children:
|
|
118
|
-
/* @__PURE__ */ jsx(
|
|
119
|
-
DefinitionItem,
|
|
120
|
-
{
|
|
121
|
-
label: "Accept defaults",
|
|
122
|
-
values: [HOTKEY_ACCEPT_DEFAULTS.label],
|
|
123
|
-
isVisible: store.step === "build" && !!store.selectedStackId
|
|
124
|
-
}
|
|
125
|
-
),
|
|
126
|
-
HOT_KEYS.map((hotkey) => /* @__PURE__ */ createElement(DefinitionItem, { ...hotkey, key: hotkey.label }))
|
|
127
|
-
]
|
|
114
|
+
children: HOT_KEYS.map((hotkey) => /* @__PURE__ */ createElement(DefinitionItem, { ...hotkey, key: hotkey.label }))
|
|
128
115
|
}
|
|
129
116
|
);
|
|
130
117
|
};
|
|
131
118
|
var WizardLayout = ({
|
|
132
119
|
version,
|
|
133
|
-
marketplaceLabel,
|
|
134
120
|
logo,
|
|
135
121
|
startupMessages,
|
|
136
122
|
children
|
|
@@ -148,10 +134,6 @@ var WizardLayout = ({
|
|
|
148
134
|
) }, index) }),
|
|
149
135
|
/* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, height: terminalHeight, children: [
|
|
150
136
|
logo && store.step === "stack" && /* @__PURE__ */ jsx(Box, { flexDirection: "row", marginTop: 1, columnGap: 1, children: /* @__PURE__ */ jsx(Text, { children: logo }) }),
|
|
151
|
-
/* @__PURE__ */ jsxs(Box, { children: [
|
|
152
|
-
/* @__PURE__ */ jsx(Text, { dimColor: true, children: "Marketplace: " }),
|
|
153
|
-
/* @__PURE__ */ jsx(Text, { bold: true, children: marketplaceLabel || `${DEFAULT_PLUGIN_NAME} (public)` })
|
|
154
|
-
] }),
|
|
155
137
|
/* @__PURE__ */ jsx(
|
|
156
138
|
WizardTabs,
|
|
157
139
|
{
|
|
@@ -202,4 +184,4 @@ var WizardLayout = ({
|
|
|
202
184
|
export {
|
|
203
185
|
WizardLayout
|
|
204
186
|
};
|
|
205
|
-
//# sourceMappingURL=chunk-
|
|
187
|
+
//# sourceMappingURL=chunk-2DKJM7RO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/wizard-layout.tsx","../src/cli/components/hooks/use-terminal-dimensions.ts"],"sourcesContent":["import { Box, Static, Text } from \"ink\";\nimport React, { Fragment } from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport type { StartupMessage } from \"../../utils/logger.js\";\nimport { FEATURE_FLAGS } from \"../../lib/feature-flags.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { useTerminalDimensions } from \"../hooks/use-terminal-dimensions.js\";\nimport { HelpModal } from \"./help-modal.js\";\nimport {\n HOTKEY_HELP,\n HOTKEY_SCOPE,\n HOTKEY_SETTINGS,\n HOTKEY_TOGGLE_LABELS,\n KEY_LABEL_ARROWS_VERT,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n KEY_LABEL_SPACE,\n} from \"./hotkeys.js\";\nimport { WIZARD_STEPS, WizardTabs } from \"./wizard-tabs.js\";\n\ntype KeyHintProps = {\n isVisible?: boolean;\n isActive?: boolean;\n label: string;\n values: string[];\n};\n\nconst DefinitionItem: React.FC<KeyHintProps> = ({\n isVisible = true,\n isActive = false,\n label,\n values,\n}) => {\n if (!isVisible) {\n return null;\n }\n\n return (\n <Text>\n {values.map((value) => (\n <Fragment key={value}>\n <Text\n backgroundColor=\"black\"\n color={isActive ? CLI_COLORS.PRIMARY : CLI_COLORS.UNFOCUSED}\n >\n {\" \"}\n {value}{\" \"}\n </Text>{\" \"}\n </Fragment>\n ))}\n <Text color={isActive ? CLI_COLORS.PRIMARY : undefined}>{label}</Text>\n </Text>\n );\n};\n\nconst HOT_KEYS: { label: string; values: string[] }[] = [\n { label: \"navigate\", values: [KEY_LABEL_ARROWS_VERT] },\n { label: \"select\", values: [KEY_LABEL_SPACE] },\n { label: \"continue\", values: [KEY_LABEL_ENTER] },\n { label: \"back\", values: [KEY_LABEL_ESC] },\n];\n\nconst WizardFooter = () => {\n return (\n <Box\n columnGap={2}\n borderTop\n borderRight={false}\n borderBottom\n borderLeft={false}\n borderColor=\"blackBright\"\n borderStyle=\"single\"\n paddingLeft={1}\n paddingRight={1}\n >\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string;\n logo?: string;\n startupMessages?: StartupMessage[];\n children: React.ReactNode;\n};\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({\n version,\n logo,\n startupMessages,\n children,\n}) => {\n const store = useWizardStore();\n const { completedSteps, skippedSteps } = store.getStepProgress();\n const { rows: terminalHeight } = useTerminalDimensions();\n\n return (\n <>\n {startupMessages && startupMessages.length > 0 && (\n <Static items={startupMessages}>\n {(msg, index) => (\n <Box key={index}>\n <Text\n color={msg.level === \"warn\" ? \"yellow\" : msg.level === \"error\" ? \"red\" : undefined}\n >\n {msg.level === \"warn\" ? ` Warning: ${msg.text}` : msg.text}\n </Text>\n </Box>\n )}\n </Static>\n )}\n <Box flexDirection=\"column\" paddingX={1} height={terminalHeight}>\n {logo && store.step === \"stack\" && (\n <Box flexDirection=\"row\" marginTop={1} columnGap={1}>\n <Text>{logo}</Text>\n </Box>\n )}\n <WizardTabs\n steps={WIZARD_STEPS}\n currentStep={store.step}\n completedSteps={completedSteps}\n skippedSteps={skippedSteps}\n version={version}\n />\n {store.showHelp ? (\n <HelpModal currentStep={store.step} />\n ) : (\n <>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginTop={1}>\n {children}\n </Box>\n <Box paddingX={1} columnGap={2} marginTop={2}>\n <DefinitionItem\n label=\"Labels\"\n values={[HOTKEY_TOGGLE_LABELS.label]}\n isVisible={store.step === \"build\"}\n isActive={store.showLabels}\n />\n <DefinitionItem\n label=\"Scope\"\n values={[HOTKEY_SCOPE.label]}\n isVisible={store.step === \"build\"}\n />\n <DefinitionItem\n label=\"Settings\"\n values={[HOTKEY_SETTINGS.label]}\n isVisible={store.step === \"sources\" && FEATURE_FLAGS.SOURCE_SEARCH}\n isActive={store.showSettings}\n />\n <DefinitionItem label=\"Help\" values={[HOTKEY_HELP.label]} />\n </Box>\n <WizardFooter />\n </>\n )}\n </Box>\n </>\n );\n};\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport type TerminalDimensions = {\n /** Terminal width in columns */\n columns: number;\n /** Terminal height in rows */\n rows: number;\n};\n\n/**\n * Tracks terminal dimensions reactively. Re-renders on resize.\n *\n * Falls back to DEFAULT_COLUMNS x DEFAULT_ROWS when stdout is not a TTY\n * (e.g., piped output, CI environments, tests).\n */\nexport function useTerminalDimensions(): TerminalDimensions {\n const { stdout } = useStdout();\n\n const [dimensions, setDimensions] = useState<TerminalDimensions>(() => ({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n }));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n });\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return dimensions;\n}\n"],"mappings":"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","names":["Fragment"]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
HOTKEY_ACCEPT_DEFAULTS,
|
|
4
3
|
HOTKEY_HELP,
|
|
5
4
|
HOTKEY_SCOPE,
|
|
6
5
|
HOTKEY_SETTINGS,
|
|
@@ -41,7 +40,6 @@ var BUILD_KEYS = {
|
|
|
41
40
|
keys: [
|
|
42
41
|
{ key: HOTKEY_TOGGLE_LABELS.label, description: "Toggle compatibility labels" },
|
|
43
42
|
{ key: HOTKEY_SCOPE.label, description: "Toggle skill scope (project/global)" },
|
|
44
|
-
{ key: HOTKEY_ACCEPT_DEFAULTS.label, description: "Accept stack defaults (stack path only)" },
|
|
45
43
|
{ key: KEY_LABEL_VIM, description: "Vim-style navigation" }
|
|
46
44
|
]
|
|
47
45
|
};
|
|
@@ -102,4 +100,4 @@ var HelpModal = ({ currentStep }) => {
|
|
|
102
100
|
export {
|
|
103
101
|
HelpModal
|
|
104
102
|
};
|
|
105
|
-
//# sourceMappingURL=chunk-
|
|
103
|
+
//# sourceMappingURL=chunk-2PZ7LBFT.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_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: 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: [{ key: HOTKEY_SCOPE.label, description: \"Toggle agent scope (project/global)\" }],\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;AAsEtB,cAIM,YAJN;AAjDJ,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,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,EAAE,KAAK,aAAa,OAAO,aAAa,sCAAsC,CAAC;AACxF;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":[]}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "./chunk-AUNBGZS4.js";
|
|
8
8
|
import {
|
|
9
9
|
useWizardStore
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-EWGFIBBU.js";
|
|
11
11
|
import {
|
|
12
12
|
matrix
|
|
13
13
|
} from "./chunk-NG2GGK6P.js";
|
|
@@ -68,11 +68,11 @@ var StackSelection = ({
|
|
|
68
68
|
return;
|
|
69
69
|
}
|
|
70
70
|
if (key.upArrow || input === "k") {
|
|
71
|
-
setFocusedIndex((prev) =>
|
|
71
|
+
setFocusedIndex((prev) => prev <= 0 ? totalItems - 1 : prev - 1);
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
74
|
if (key.downArrow || input === "j") {
|
|
75
|
-
setFocusedIndex((prev) =>
|
|
75
|
+
setFocusedIndex((prev) => prev >= totalItems - 1 ? 0 : prev + 1);
|
|
76
76
|
}
|
|
77
77
|
});
|
|
78
78
|
const noShrink = scrollEnabled ? { flexShrink: 0 } : {};
|
|
@@ -110,4 +110,4 @@ var StackSelection = ({
|
|
|
110
110
|
export {
|
|
111
111
|
StackSelection
|
|
112
112
|
};
|
|
113
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-2YFC7IJ6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/stack-selection.tsx"],"sourcesContent":["import { Box, useInput } from \"ink\";\nimport React, { useState } from \"react\";\nimport { DEFAULT_SCRATCH_DOMAINS } from \"../../consts.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useSectionScroll } from \"../hooks/use-section-scroll.js\";\nimport { SelectionCard } from \"./selection-card.js\";\n\nconst INITIAL_FOCUSED_INDEX = 0;\nconst SCRATCH_LABEL = \"Start from scratch\";\nconst SCRATCH_DESCRIPTION = \"Select domains and skills manually\";\n\n/** Number of extra items after the stack list (scratch option) */\nconst EXTRA_ITEMS_COUNT = 1;\n\nexport type StackSelectionProps = {\n /** Available height in terminal lines for the scrollable viewport. 0 = no constraint. */\n availableHeight?: number;\n onCancel?: () => void;\n};\n\nexport const StackSelection: React.FC<StackSelectionProps> = ({\n availableHeight = 0,\n onCancel,\n}) => {\n const { selectStack, setApproach, setStackAction, populateFromSkillIds, toggleDomain } =\n useWizardStore();\n\n const [focusedIndex, setFocusedIndex] = useState(INITIAL_FOCUSED_INDEX);\n\n const stacks = matrix.suggestedStacks;\n const stackCount = stacks.length;\n const scratchIndex = stackCount;\n const totalItems = stackCount + EXTRA_ITEMS_COUNT;\n\n const { setSectionRef, scrollEnabled, scrollTopPx } = useSectionScroll({\n sectionCount: totalItems,\n focusedIndex,\n availableHeight,\n });\n\n useInput((input, key) => {\n if (key.escape) {\n if (onCancel) {\n onCancel();\n }\n return;\n }\n\n if (key.return) {\n if (focusedIndex === scratchIndex) {\n selectStack(null);\n setApproach(\"scratch\");\n\n for (const domain of DEFAULT_SCRATCH_DOMAINS) {\n toggleDomain(domain);\n }\n return;\n }\n\n const focusedStack = stacks[focusedIndex];\n if (focusedStack) {\n selectStack(focusedStack.id);\n setStackAction(\"customize\");\n populateFromSkillIds(focusedStack.allSkillIds);\n setApproach(\"stack\");\n }\n return;\n }\n\n if (key.upArrow || input === \"k\") {\n setFocusedIndex((prev) => (prev <= 0 ? totalItems - 1 : prev - 1));\n return;\n }\n if (key.downArrow || input === \"j\") {\n setFocusedIndex((prev) => (prev >= totalItems - 1 ? 0 : prev + 1));\n }\n });\n\n const noShrink = scrollEnabled ? { flexShrink: 0 } : {};\n\n const sectionElements = stacks.map((stack, index) => (\n <Box key={stack.id} ref={(el) => setSectionRef(index, el)} width=\"100%\" {...noShrink}>\n <SelectionCard\n label={stack.name}\n description={stack.description}\n isFocused={index === focusedIndex}\n marginBottom={1}\n />\n </Box>\n ));\n\n const scratchElement = (\n <Box ref={(el) => setSectionRef(scratchIndex, el)} width=\"100%\" {...noShrink}>\n <SelectionCard\n label={SCRATCH_LABEL}\n description={SCRATCH_DESCRIPTION}\n isFocused={focusedIndex === scratchIndex}\n />\n </Box>\n );\n\n return (\n <Box\n flexDirection=\"column\"\n width=\"100%\"\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 {scratchElement}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,gBAAgB;AAC9B,SAAgB,gBAAgB;AAkF1B,cA2BA,YA3BA;AA3EN,IAAM,wBAAwB;AAC9B,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAG5B,IAAM,oBAAoB;AAQnB,IAAM,iBAAgD,CAAC;AAAA,EAC5D,kBAAkB;AAAA,EAClB;AACF,MAAM;AACJ,QAAM,EAAE,aAAa,aAAa,gBAAgB,sBAAsB,aAAa,IACnF,eAAe;AAEjB,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,qBAAqB;AAEtE,QAAM,SAAS,OAAO;AACtB,QAAM,aAAa,OAAO;AAC1B,QAAM,eAAe;AACrB,QAAM,aAAa,aAAa;AAEhC,QAAM,EAAE,eAAe,eAAe,YAAY,IAAI,iBAAiB;AAAA,IACrE,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF,CAAC;AAED,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,UAAI,iBAAiB,cAAc;AACjC,oBAAY,IAAI;AAChB,oBAAY,SAAS;AAErB,mBAAW,UAAU,yBAAyB;AAC5C,uBAAa,MAAM;AAAA,QACrB;AACA;AAAA,MACF;AAEA,YAAM,eAAe,OAAO,YAAY;AACxC,UAAI,cAAc;AAChB,oBAAY,aAAa,EAAE;AAC3B,uBAAe,WAAW;AAC1B,6BAAqB,aAAa,WAAW;AAC7C,oBAAY,OAAO;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,UAAU,KAAK;AAChC,sBAAgB,CAAC,SAAU,QAAQ,IAAI,aAAa,IAAI,OAAO,CAAE;AACjE;AAAA,IACF;AACA,QAAI,IAAI,aAAa,UAAU,KAAK;AAClC,sBAAgB,CAAC,SAAU,QAAQ,aAAa,IAAI,IAAI,OAAO,CAAE;AAAA,IACnE;AAAA,EACF,CAAC;AAED,QAAM,WAAW,gBAAgB,EAAE,YAAY,EAAE,IAAI,CAAC;AAEtD,QAAM,kBAAkB,OAAO,IAAI,CAAC,OAAO,UACzC,oBAAC,OAAmB,KAAK,CAAC,OAAO,cAAc,OAAO,EAAE,GAAG,OAAM,QAAQ,GAAG,UAC1E;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,WAAW,UAAU;AAAA,MACrB,cAAc;AAAA;AAAA,EAChB,KANQ,MAAM,EAOhB,CACD;AAED,QAAM,iBACJ,oBAAC,OAAI,KAAK,CAAC,OAAO,cAAc,cAAc,EAAE,GAAG,OAAM,QAAQ,GAAG,UAClE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW,iBAAiB;AAAA;AAAA,EAC9B,GACF;AAGF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,OAAM;AAAA,MACL,GAAI,gBACD,EAAE,QAAQ,iBAAiB,UAAU,SAAkB,IACvD,EAAE,UAAU,EAAE;AAAA,MAElB,+BAAC,OAAI,eAAc,UAAS,WAAW,cAAc,IAAI,CAAC,cAAc,GAAI,GAAG,UAC5E;AAAA;AAAA,QACA;AAAA,SACH;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-XMLCXRTS.js";
|
|
5
5
|
import {
|
|
6
6
|
ViewTitle
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7M4INWUR.js";
|
|
8
8
|
import {
|
|
9
9
|
CLI_COLORS,
|
|
10
10
|
UI_SYMBOLS
|
|
@@ -115,4 +115,4 @@ var CheckboxGrid = ({
|
|
|
115
115
|
export {
|
|
116
116
|
CheckboxGrid
|
|
117
117
|
};
|
|
118
|
-
//# sourceMappingURL=chunk-
|
|
118
|
+
//# sourceMappingURL=chunk-62FBXUNR.js.map
|
|
@@ -10,13 +10,13 @@ import {
|
|
|
10
10
|
} from "./chunk-MWGDG4QN.js";
|
|
11
11
|
import {
|
|
12
12
|
SourceGrid
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-TDHEAHXD.js";
|
|
14
14
|
import {
|
|
15
15
|
ViewTitle
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-7M4INWUR.js";
|
|
17
17
|
import {
|
|
18
18
|
useWizardStore
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-EWGFIBBU.js";
|
|
20
20
|
import {
|
|
21
21
|
HOTKEY_SET_ALL_LOCAL,
|
|
22
22
|
HOTKEY_SET_ALL_PLUGIN,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
resolveAllSources,
|
|
29
29
|
searchExtraSources
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-6W4H2K3Z.js";
|
|
31
31
|
import {
|
|
32
32
|
CLI_COLORS,
|
|
33
33
|
DEFAULT_BRANDING
|
|
@@ -181,4 +181,4 @@ var StepSources = ({ projectDir, onContinue, onBack }) => {
|
|
|
181
181
|
export {
|
|
182
182
|
StepSources
|
|
183
183
|
};
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-6RGNXTTG.js.map
|
|
@@ -984,7 +984,7 @@ function loadConfigTypesDataInBackground(sourceFlag, projectDir) {
|
|
|
984
984
|
if (!await directoryExists(claudeSrcDir)) {
|
|
985
985
|
throw new Error(`${CLAUDE_SRC_DIR}/ not found \u2014 run '${CLI_BIN_NAME} init' first`);
|
|
986
986
|
}
|
|
987
|
-
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-
|
|
987
|
+
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-42GVUFZA.js");
|
|
988
988
|
const { loadAllAgents: loadAllAgents2 } = await import("./loader-NHUCFMFQ.js");
|
|
989
989
|
const sourceResult = await loadSkillsMatrixFromSource2({
|
|
990
990
|
sourceFlag,
|
|
@@ -1930,6 +1930,16 @@ import { groupBy } from "remeda";
|
|
|
1930
1930
|
function getLabel(skill) {
|
|
1931
1931
|
return skill.displayName;
|
|
1932
1932
|
}
|
|
1933
|
+
function joinWithOr(items) {
|
|
1934
|
+
if (items.length <= 1) return items[0] ?? "";
|
|
1935
|
+
if (items.length === 2) return `${items[0]} or ${items[1]}`;
|
|
1936
|
+
return `${items.slice(0, -1).join(", ")} or ${items[items.length - 1]}`;
|
|
1937
|
+
}
|
|
1938
|
+
function joinWithAnd(items) {
|
|
1939
|
+
if (items.length <= 1) return items[0] ?? "";
|
|
1940
|
+
if (items.length === 2) return `${items[0]} and ${items[1]}`;
|
|
1941
|
+
return `${items.slice(0, -1).join(", ")} and ${items[items.length - 1]}`;
|
|
1942
|
+
}
|
|
1933
1943
|
function resolveAlias(skillId) {
|
|
1934
1944
|
if (matrix.skills[skillId]) return skillId;
|
|
1935
1945
|
throw new Error(`Unknown skill ID: '${skillId}' \u2014 not found in the matrix`);
|
|
@@ -1943,7 +1953,7 @@ function isDiscouraged(skillId, currentSelections) {
|
|
|
1943
1953
|
const fullId = resolveAlias(skillId);
|
|
1944
1954
|
const skill = matrix.skills[fullId];
|
|
1945
1955
|
if (!skill) return false;
|
|
1946
|
-
const { resolvedSelections
|
|
1956
|
+
const { resolvedSelections } = initializeSelectionContext(currentSelections);
|
|
1947
1957
|
for (const selectedId of resolvedSelections) {
|
|
1948
1958
|
const selectedSkill = matrix.skills[selectedId];
|
|
1949
1959
|
if (selectedSkill?.discourages.some((d) => d.skillId === fullId)) {
|
|
@@ -1953,26 +1963,30 @@ function isDiscouraged(skillId, currentSelections) {
|
|
|
1953
1963
|
return true;
|
|
1954
1964
|
}
|
|
1955
1965
|
}
|
|
1966
|
+
return false;
|
|
1967
|
+
}
|
|
1968
|
+
function isIncompatible(skillId, currentSelections) {
|
|
1969
|
+
const fullId = resolveAlias(skillId);
|
|
1970
|
+
const skill = matrix.skills[fullId];
|
|
1971
|
+
if (!skill) return false;
|
|
1972
|
+
const { resolvedSelections } = initializeSelectionContext(currentSelections);
|
|
1956
1973
|
for (const selectedId of resolvedSelections) {
|
|
1957
|
-
if (skill.conflictsWith.some((c) => c.skillId === selectedId))
|
|
1958
|
-
return true;
|
|
1959
|
-
}
|
|
1974
|
+
if (skill.conflictsWith.some((c) => c.skillId === selectedId)) return true;
|
|
1960
1975
|
const selectedSkill = matrix.skills[selectedId];
|
|
1961
|
-
if (selectedSkill?.conflictsWith.some((c) => c.skillId === fullId))
|
|
1962
|
-
return true;
|
|
1963
|
-
}
|
|
1976
|
+
if (selectedSkill?.conflictsWith.some((c) => c.skillId === fullId)) return true;
|
|
1964
1977
|
}
|
|
1978
|
+
return false;
|
|
1979
|
+
}
|
|
1980
|
+
function hasUnmetRequirements(skillId, currentSelections) {
|
|
1981
|
+
const fullId = resolveAlias(skillId);
|
|
1982
|
+
const skill = matrix.skills[fullId];
|
|
1983
|
+
if (!skill) return false;
|
|
1984
|
+
const { selectedSet } = initializeSelectionContext(currentSelections);
|
|
1965
1985
|
for (const requirement of skill.requires) {
|
|
1966
1986
|
if (requirement.needsAny) {
|
|
1967
|
-
|
|
1968
|
-
if (!hasAny) {
|
|
1969
|
-
return true;
|
|
1970
|
-
}
|
|
1987
|
+
if (!requirement.skillIds.some((reqId) => selectedSet.has(reqId))) return true;
|
|
1971
1988
|
} else {
|
|
1972
|
-
|
|
1973
|
-
if (!hasAll) {
|
|
1974
|
-
return true;
|
|
1975
|
-
}
|
|
1989
|
+
if (!requirement.skillIds.every((reqId) => selectedSet.has(reqId))) return true;
|
|
1976
1990
|
}
|
|
1977
1991
|
}
|
|
1978
1992
|
return false;
|
|
@@ -1981,7 +1995,7 @@ function getDiscourageReason(skillId, currentSelections) {
|
|
|
1981
1995
|
const fullId = resolveAlias(skillId);
|
|
1982
1996
|
const skill = matrix.skills[fullId];
|
|
1983
1997
|
if (!skill) return void 0;
|
|
1984
|
-
const { resolvedSelections
|
|
1998
|
+
const { resolvedSelections } = initializeSelectionContext(currentSelections);
|
|
1985
1999
|
for (const selectedId of resolvedSelections) {
|
|
1986
2000
|
const selectedSkill = matrix.skills[selectedId];
|
|
1987
2001
|
if (selectedSkill) {
|
|
@@ -1995,19 +2009,33 @@ function getDiscourageReason(skillId, currentSelections) {
|
|
|
1995
2009
|
return reverseDiscourage.reason;
|
|
1996
2010
|
}
|
|
1997
2011
|
}
|
|
2012
|
+
return void 0;
|
|
2013
|
+
}
|
|
2014
|
+
function getIncompatibleReason(skillId, currentSelections) {
|
|
2015
|
+
const fullId = resolveAlias(skillId);
|
|
2016
|
+
const skill = matrix.skills[fullId];
|
|
2017
|
+
if (!skill) return void 0;
|
|
2018
|
+
const { resolvedSelections } = initializeSelectionContext(currentSelections);
|
|
1998
2019
|
for (const selectedId of resolvedSelections) {
|
|
1999
2020
|
const conflict = skill.conflictsWith.find((c) => c.skillId === selectedId);
|
|
2000
2021
|
if (conflict) {
|
|
2001
|
-
return
|
|
2022
|
+
return `conflicts with ${getLabel(getSkillById(selectedId))}`;
|
|
2002
2023
|
}
|
|
2003
2024
|
const selectedSkill = matrix.skills[selectedId];
|
|
2004
2025
|
if (selectedSkill) {
|
|
2005
2026
|
const reverseConflict = selectedSkill.conflictsWith.find((c) => c.skillId === fullId);
|
|
2006
2027
|
if (reverseConflict) {
|
|
2007
|
-
return
|
|
2028
|
+
return `conflicts with ${getLabel(selectedSkill)}`;
|
|
2008
2029
|
}
|
|
2009
2030
|
}
|
|
2010
2031
|
}
|
|
2032
|
+
return void 0;
|
|
2033
|
+
}
|
|
2034
|
+
function getUnmetRequirementsReason(skillId, currentSelections) {
|
|
2035
|
+
const fullId = resolveAlias(skillId);
|
|
2036
|
+
const skill = matrix.skills[fullId];
|
|
2037
|
+
if (!skill) return void 0;
|
|
2038
|
+
const { selectedSet } = initializeSelectionContext(currentSelections);
|
|
2011
2039
|
for (const requirement of skill.requires) {
|
|
2012
2040
|
if (requirement.needsAny) {
|
|
2013
2041
|
const hasAny = requirement.skillIds.some((reqId) => selectedSet.has(reqId));
|
|
@@ -2015,8 +2043,8 @@ function getDiscourageReason(skillId, currentSelections) {
|
|
|
2015
2043
|
const requiredNames = requirement.skillIds.map((id) => {
|
|
2016
2044
|
const s = matrix.skills[id];
|
|
2017
2045
|
return s ? getLabel(s) : id;
|
|
2018
|
-
})
|
|
2019
|
-
return
|
|
2046
|
+
});
|
|
2047
|
+
return `requires ${joinWithOr(requiredNames)}`;
|
|
2020
2048
|
}
|
|
2021
2049
|
} else {
|
|
2022
2050
|
const missingIds = requirement.skillIds.filter((reqId) => !selectedSet.has(reqId));
|
|
@@ -2024,8 +2052,8 @@ function getDiscourageReason(skillId, currentSelections) {
|
|
|
2024
2052
|
const missingNames = missingIds.map((id) => {
|
|
2025
2053
|
const s = matrix.skills[id];
|
|
2026
2054
|
return s ? getLabel(s) : id;
|
|
2027
|
-
})
|
|
2028
|
-
return
|
|
2055
|
+
});
|
|
2056
|
+
return `requires ${joinWithAnd(missingNames)}`;
|
|
2029
2057
|
}
|
|
2030
2058
|
}
|
|
2031
2059
|
}
|
|
@@ -2159,28 +2187,45 @@ function validateSelection(selections) {
|
|
|
2159
2187
|
validateRecommendations(resolvedSelections, selectedSet)
|
|
2160
2188
|
]);
|
|
2161
2189
|
return {
|
|
2162
|
-
valid:
|
|
2190
|
+
valid: true,
|
|
2163
2191
|
errors,
|
|
2164
2192
|
warnings
|
|
2165
2193
|
};
|
|
2166
2194
|
}
|
|
2195
|
+
function computeAdvisoryState(skillId, currentSelections) {
|
|
2196
|
+
if (isIncompatible(skillId, currentSelections)) {
|
|
2197
|
+
return {
|
|
2198
|
+
status: "incompatible",
|
|
2199
|
+
reason: getIncompatibleReason(skillId, currentSelections) ?? "Incompatible"
|
|
2200
|
+
};
|
|
2201
|
+
}
|
|
2202
|
+
if (isDiscouraged(skillId, currentSelections)) {
|
|
2203
|
+
return {
|
|
2204
|
+
status: "discouraged",
|
|
2205
|
+
reason: getDiscourageReason(skillId, currentSelections) ?? "Not recommended"
|
|
2206
|
+
};
|
|
2207
|
+
}
|
|
2208
|
+
if (isRecommended(skillId, currentSelections)) {
|
|
2209
|
+
return {
|
|
2210
|
+
status: "recommended",
|
|
2211
|
+
reason: getRecommendReason(skillId, currentSelections) ?? "Recommended"
|
|
2212
|
+
};
|
|
2213
|
+
}
|
|
2214
|
+
return { status: "normal" };
|
|
2215
|
+
}
|
|
2167
2216
|
function getAvailableSkills(categoryId, currentSelections) {
|
|
2168
2217
|
const skillOptions = [];
|
|
2169
2218
|
const { selectedSet } = initializeSelectionContext(currentSelections);
|
|
2170
2219
|
for (const skill of Object.values(matrix.skills)) {
|
|
2171
2220
|
if (!skill) continue;
|
|
2172
|
-
if (skill.category !== categoryId)
|
|
2173
|
-
|
|
2174
|
-
}
|
|
2175
|
-
const discouraged = isDiscouraged(skill.id, currentSelections);
|
|
2176
|
-
const recommended = !discouraged && isRecommended(skill.id, currentSelections);
|
|
2221
|
+
if (skill.category !== categoryId) continue;
|
|
2222
|
+
const isSelected = selectedSet.has(skill.id);
|
|
2177
2223
|
skillOptions.push({
|
|
2178
2224
|
id: skill.id,
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
selected: selectedSet.has(skill.id),
|
|
2225
|
+
advisoryState: computeAdvisoryState(skill.id, currentSelections),
|
|
2226
|
+
selected: isSelected,
|
|
2227
|
+
hasUnmetRequirements: isSelected && hasUnmetRequirements(skill.id, currentSelections),
|
|
2228
|
+
unmetRequirementsReason: isSelected ? getUnmetRequirementsReason(skill.id, currentSelections) : void 0,
|
|
2184
2229
|
alternatives: skill.alternatives.map((a) => a.skillId)
|
|
2185
2230
|
});
|
|
2186
2231
|
}
|
|
@@ -2434,6 +2479,7 @@ async function detectInstallation(projectDir = process.cwd()) {
|
|
|
2434
2479
|
|
|
2435
2480
|
// src/cli/lib/installation/local-installer.ts
|
|
2436
2481
|
init_esm_shims();
|
|
2482
|
+
import fs from "fs";
|
|
2437
2483
|
import os8 from "os";
|
|
2438
2484
|
import path20 from "path";
|
|
2439
2485
|
|
|
@@ -3779,7 +3825,7 @@ async function writeProjectConfigTypes(projectConfigPath, projectDir, projectCon
|
|
|
3779
3825
|
}
|
|
3780
3826
|
async function writeScopedConfigs(finalConfig, matrix2, agents, projectDir, projectConfigPath, projectInstallationExists) {
|
|
3781
3827
|
const homeDir = os8.homedir();
|
|
3782
|
-
const isProjectContext =
|
|
3828
|
+
const isProjectContext = fs.realpathSync(projectDir) !== fs.realpathSync(homeDir);
|
|
3783
3829
|
if (!isProjectContext) {
|
|
3784
3830
|
await writeConfigFile(finalConfig, projectConfigPath);
|
|
3785
3831
|
await writeStandaloneConfigTypes(projectConfigPath, matrix2, agents, finalConfig);
|
|
@@ -3833,7 +3879,7 @@ async function compileAndWriteAgents(compileConfig, agents, localSkills, sourceR
|
|
|
3833
3879
|
async function installPluginConfig(options) {
|
|
3834
3880
|
const { wizardResult, sourceResult, projectDir, sourceFlag } = options;
|
|
3835
3881
|
const projectPaths = resolveInstallPaths(projectDir, "project");
|
|
3836
|
-
const isProjectInstall =
|
|
3882
|
+
const isProjectInstall = fs.realpathSync(projectDir) !== fs.realpathSync(os8.homedir());
|
|
3837
3883
|
if (isProjectInstall) {
|
|
3838
3884
|
await ensureDir(projectPaths.agentsDir);
|
|
3839
3885
|
}
|
|
@@ -3841,7 +3887,7 @@ async function installPluginConfig(options) {
|
|
|
3841
3887
|
const agents = await loadMergedAgents(sourceResult.sourcePath);
|
|
3842
3888
|
const mergeResult = await buildAndMergeConfig(wizardResult, sourceResult, projectDir, sourceFlag);
|
|
3843
3889
|
const finalConfig = mergeResult.config;
|
|
3844
|
-
const projectInstallationExists =
|
|
3890
|
+
const projectInstallationExists = fs.realpathSync(projectDir) !== fs.realpathSync(os8.homedir());
|
|
3845
3891
|
await writeScopedConfigs(
|
|
3846
3892
|
finalConfig,
|
|
3847
3893
|
sourceResult.matrix,
|
|
@@ -3887,7 +3933,7 @@ async function installLocal(options) {
|
|
|
3887
3933
|
const projectSkills = wizardResult.skills.filter((s) => s.scope !== "global");
|
|
3888
3934
|
const globalSkills = wizardResult.skills.filter((s) => s.scope === "global");
|
|
3889
3935
|
const homeDir = os8.homedir();
|
|
3890
|
-
const isProjectInstall =
|
|
3936
|
+
const isProjectInstall = fs.realpathSync(projectDir) !== fs.realpathSync(homeDir);
|
|
3891
3937
|
if (isProjectInstall) {
|
|
3892
3938
|
await prepareDirectories(projectPaths);
|
|
3893
3939
|
} else {
|
|
@@ -3901,7 +3947,7 @@ async function installLocal(options) {
|
|
|
3901
3947
|
const agents = await loadMergedAgents(sourceResult.sourcePath);
|
|
3902
3948
|
const mergeResult = await buildAndMergeConfig(wizardResult, sourceResult, projectDir, sourceFlag);
|
|
3903
3949
|
const finalConfig = mergeResult.config;
|
|
3904
|
-
const isProjectContext =
|
|
3950
|
+
const isProjectContext = fs.realpathSync(projectDir) !== fs.realpathSync(os8.homedir());
|
|
3905
3951
|
await writeScopedConfigs(
|
|
3906
3952
|
finalConfig,
|
|
3907
3953
|
sourceResult.matrix,
|
|
@@ -5347,20 +5393,6 @@ function extractSourceName(source) {
|
|
|
5347
5393
|
const firstSegment = withoutUrl.split("/")[0];
|
|
5348
5394
|
return firstSegment || source;
|
|
5349
5395
|
}
|
|
5350
|
-
function getMarketplaceLabel(sourceResult) {
|
|
5351
|
-
if (sourceResult.isLocal) return void 0;
|
|
5352
|
-
const { marketplace } = sourceResult;
|
|
5353
|
-
if (!marketplace) {
|
|
5354
|
-
const name = extractSourceName(sourceResult.sourceConfig.source);
|
|
5355
|
-
return `${name} (public)`;
|
|
5356
|
-
}
|
|
5357
|
-
const PUBLIC_MARKETPLACE_COUNT = 1;
|
|
5358
|
-
const isDefaultSource = sourceResult.sourceConfig.source === DEFAULT_SOURCE;
|
|
5359
|
-
if (!isDefaultSource) {
|
|
5360
|
-
return `${marketplace} + ${PUBLIC_MARKETPLACE_COUNT} public`;
|
|
5361
|
-
}
|
|
5362
|
-
return marketplace;
|
|
5363
|
-
}
|
|
5364
5396
|
function mergeLocalSkillsIntoMatrix(matrix2, localResult) {
|
|
5365
5397
|
for (const metadata of localResult.skills) {
|
|
5366
5398
|
const existingSkill = matrix2.skills[metadata.id];
|
|
@@ -5466,7 +5498,6 @@ export {
|
|
|
5466
5498
|
loadSkillsMatrixFromSource,
|
|
5467
5499
|
convertStackToResolvedStack,
|
|
5468
5500
|
extractSourceName,
|
|
5469
|
-
getMarketplaceLabel,
|
|
5470
5501
|
mergeLocalSkillsIntoMatrix,
|
|
5471
5502
|
loadConfigTypesDataInBackground,
|
|
5472
5503
|
regenerateConfigTypes,
|
|
@@ -5496,4 +5527,4 @@ export {
|
|
|
5496
5527
|
validateAllPlugins,
|
|
5497
5528
|
printPluginValidationResult
|
|
5498
5529
|
};
|
|
5499
|
-
//# sourceMappingURL=chunk-
|
|
5530
|
+
//# sourceMappingURL=chunk-6W4H2K3Z.js.map
|