@agents-inc/cli 0.74.10 → 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.
Files changed (121) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +11 -5
  3. package/dist/{chunk-FW5C245M.js → chunk-2DKJM7RO.js} +6 -24
  4. package/dist/chunk-2DKJM7RO.js.map +1 -0
  5. package/dist/{chunk-NA6I5P5P.js → chunk-2PZ7LBFT.js} +1 -3
  6. package/dist/chunk-2PZ7LBFT.js.map +1 -0
  7. package/dist/{chunk-VILTRTBT.js → chunk-2YFC7IJ6.js} +4 -4
  8. package/dist/chunk-2YFC7IJ6.js.map +1 -0
  9. package/dist/{chunk-OV5UJWS5.js → chunk-62FBXUNR.js} +2 -2
  10. package/dist/{chunk-VYHRCFMD.js → chunk-6RGNXTTG.js} +5 -5
  11. package/dist/{chunk-2EXAK22V.js → chunk-6W4H2K3Z.js} +86 -55
  12. package/dist/chunk-6W4H2K3Z.js.map +1 -0
  13. package/dist/chunk-7M4INWUR.js +31 -0
  14. package/dist/chunk-7M4INWUR.js.map +1 -0
  15. package/dist/{chunk-EWKUUWYY.js → chunk-AKW425U6.js} +2 -2
  16. package/dist/{chunk-54AECXSH.js → chunk-ARGCINJC.js} +2 -2
  17. package/dist/{chunk-YZUAXX7F.js → chunk-DG2T7KYG.js} +3 -6
  18. package/dist/chunk-DG2T7KYG.js.map +1 -0
  19. package/dist/{chunk-M5IAGR5Z.js → chunk-DZUZVT5X.js} +3 -3
  20. package/dist/{chunk-PUZLP4SL.js → chunk-EWGFIBBU.js} +2 -2
  21. package/dist/{chunk-C6YLN4AW.js → chunk-GJWHA6P4.js} +18 -58
  22. package/dist/chunk-GJWHA6P4.js.map +1 -0
  23. package/dist/{chunk-PN65K3LH.js → chunk-I7WXUAWA.js} +2 -2
  24. package/dist/{chunk-YDBVG6RF.js → chunk-JBQRRJRY.js} +11 -21
  25. package/dist/chunk-JBQRRJRY.js.map +1 -0
  26. package/dist/{chunk-NDKIFVR4.js → chunk-MZQKSK3J.js} +3 -3
  27. package/dist/{chunk-IYA5PSXU.js → chunk-NO2XIAJC.js} +3 -3
  28. package/dist/{chunk-OINQ6OWM.js → chunk-NPMGVQM4.js} +2 -2
  29. package/dist/{chunk-GG4BSB6S.js → chunk-P2FHS5IS.js} +2 -3
  30. package/dist/{chunk-GG4BSB6S.js.map → chunk-P2FHS5IS.js.map} +1 -1
  31. package/dist/{chunk-X6LXHVA6.js → chunk-PJUC2WCA.js} +26 -21
  32. package/dist/chunk-PJUC2WCA.js.map +1 -0
  33. package/dist/{chunk-TPXDHJDB.js → chunk-TDHEAHXD.js} +2 -2
  34. package/dist/{chunk-XPRDNALD.js → chunk-W6NWOYMS.js} +2 -2
  35. package/dist/{chunk-VIVOJASC.js → chunk-YUSLPHXO.js} +5 -5
  36. package/dist/commands/build/plugins.js +2 -2
  37. package/dist/commands/build/stack.js +2 -2
  38. package/dist/commands/compile.js +2 -2
  39. package/dist/commands/config/index.js +2 -2
  40. package/dist/commands/config/path.js +1 -1
  41. package/dist/commands/config/show.js +2 -2
  42. package/dist/commands/diff.js +1 -1
  43. package/dist/commands/doctor.js +1 -1
  44. package/dist/commands/edit.js +23 -28
  45. package/dist/commands/edit.js.map +1 -1
  46. package/dist/commands/eject.js +1 -1
  47. package/dist/commands/import/skill.js +1 -1
  48. package/dist/commands/info.js +1 -1
  49. package/dist/commands/init.js +19 -19
  50. package/dist/commands/list.js +1 -1
  51. package/dist/commands/new/agent.js +2 -2
  52. package/dist/commands/new/marketplace.js +2 -2
  53. package/dist/commands/new/skill.js +2 -2
  54. package/dist/commands/outdated.js +1 -1
  55. package/dist/commands/search.js +1 -1
  56. package/dist/commands/uninstall.js +1 -1
  57. package/dist/commands/update.js +2 -2
  58. package/dist/commands/validate.js +1 -1
  59. package/dist/components/wizard/category-grid.js +2 -2
  60. package/dist/components/wizard/category-grid.test.js +78 -77
  61. package/dist/components/wizard/category-grid.test.js.map +1 -1
  62. package/dist/components/wizard/checkbox-grid.js +2 -2
  63. package/dist/components/wizard/checkbox-grid.test.js +2 -2
  64. package/dist/components/wizard/domain-selection.js +5 -5
  65. package/dist/components/wizard/help-modal.js +1 -1
  66. package/dist/components/wizard/source-grid.js +2 -2
  67. package/dist/components/wizard/source-grid.test.js +5 -5
  68. package/dist/components/wizard/source-grid.test.js.map +1 -1
  69. package/dist/components/wizard/stack-selection.js +3 -3
  70. package/dist/components/wizard/step-agents.js +4 -4
  71. package/dist/components/wizard/step-agents.test.js +4 -4
  72. package/dist/components/wizard/step-build.js +6 -6
  73. package/dist/components/wizard/step-build.test.js +16 -18
  74. package/dist/components/wizard/step-build.test.js.map +1 -1
  75. package/dist/components/wizard/step-confirm.js +2 -2
  76. package/dist/components/wizard/step-confirm.test.js +4 -4
  77. package/dist/components/wizard/step-refine.js +2 -2
  78. package/dist/components/wizard/step-refine.test.js +2 -2
  79. package/dist/components/wizard/step-settings.js +3 -3
  80. package/dist/components/wizard/step-settings.test.js +6 -6
  81. package/dist/components/wizard/step-sources.js +6 -6
  82. package/dist/components/wizard/step-sources.test.js +6 -6
  83. package/dist/components/wizard/step-stack.js +7 -7
  84. package/dist/components/wizard/step-stack.test.js +12 -12
  85. package/dist/components/wizard/step-stack.test.js.map +1 -1
  86. package/dist/components/wizard/view-title.js +1 -1
  87. package/dist/components/wizard/wizard-layout.js +4 -4
  88. package/dist/components/wizard/wizard.js +18 -18
  89. package/dist/hooks/init.js +19 -19
  90. package/dist/{source-loader-WBDPZJEW.js → source-loader-42GVUFZA.js} +2 -4
  91. package/dist/{source-manager-RRGK4SBP.js → source-manager-WRZBOTEH.js} +2 -2
  92. package/dist/stores/wizard-store.js +2 -2
  93. package/dist/stores/wizard-store.test.js +2 -2
  94. package/package.json +1 -1
  95. package/dist/chunk-2EXAK22V.js.map +0 -1
  96. package/dist/chunk-AQYAVLZK.js +0 -20
  97. package/dist/chunk-AQYAVLZK.js.map +0 -1
  98. package/dist/chunk-C6YLN4AW.js.map +0 -1
  99. package/dist/chunk-FW5C245M.js.map +0 -1
  100. package/dist/chunk-NA6I5P5P.js.map +0 -1
  101. package/dist/chunk-VILTRTBT.js.map +0 -1
  102. package/dist/chunk-X6LXHVA6.js.map +0 -1
  103. package/dist/chunk-YDBVG6RF.js.map +0 -1
  104. package/dist/chunk-YZUAXX7F.js.map +0 -1
  105. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +0 -1
  106. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +0 -13
  107. /package/dist/{chunk-OV5UJWS5.js.map → chunk-62FBXUNR.js.map} +0 -0
  108. /package/dist/{chunk-VYHRCFMD.js.map → chunk-6RGNXTTG.js.map} +0 -0
  109. /package/dist/{chunk-EWKUUWYY.js.map → chunk-AKW425U6.js.map} +0 -0
  110. /package/dist/{chunk-54AECXSH.js.map → chunk-ARGCINJC.js.map} +0 -0
  111. /package/dist/{chunk-M5IAGR5Z.js.map → chunk-DZUZVT5X.js.map} +0 -0
  112. /package/dist/{chunk-PUZLP4SL.js.map → chunk-EWGFIBBU.js.map} +0 -0
  113. /package/dist/{chunk-PN65K3LH.js.map → chunk-I7WXUAWA.js.map} +0 -0
  114. /package/dist/{chunk-NDKIFVR4.js.map → chunk-MZQKSK3J.js.map} +0 -0
  115. /package/dist/{chunk-IYA5PSXU.js.map → chunk-NO2XIAJC.js.map} +0 -0
  116. /package/dist/{chunk-OINQ6OWM.js.map → chunk-NPMGVQM4.js.map} +0 -0
  117. /package/dist/{chunk-TPXDHJDB.js.map → chunk-TDHEAHXD.js.map} +0 -0
  118. /package/dist/{chunk-XPRDNALD.js.map → chunk-W6NWOYMS.js.map} +0 -0
  119. /package/dist/{chunk-VIVOJASC.js.map → chunk-YUSLPHXO.js.map} +0 -0
  120. /package/dist/{source-loader-WBDPZJEW.js.map → source-loader-42GVUFZA.js.map} +0 -0
  121. /package/dist/{source-manager-RRGK4SBP.js.map → source-manager-WRZBOTEH.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,31 @@ 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
+
22
+ ## [0.74.11] - 2026-03-14
23
+
24
+ **Documentation overhaul — README, standards, .ai-docs**
25
+
26
+ - README rewritten with screenshots and visual wizard walkthrough
27
+ - Standards consolidated: E2E testing bible, TypeScript types bible
28
+ - .ai-docs validated against current source (12 files updated)
29
+ - 39 redundant/completed docs removed
30
+
31
+ See [changelogs/0.74.11.md](./changelogs/0.74.11.md) for full details.
32
+
33
+ ---
34
+
10
35
  ## [0.74.10] - 2026-03-14
11
36
 
12
37
  **E2E test file splits for parallel execution**
package/README.md CHANGED
@@ -23,7 +23,10 @@ Compose specialized [Claude Code](https://docs.anthropic.com/en/docs/claude-code
23
23
  npx @agents-inc/cli init
24
24
  ```
25
25
 
26
- ![Stack selection](screenshots/step-stack.png)
26
+ <p align="center">
27
+ <img src="screenshots/stack-selection.png" alt="Stack selection" width="500">
28
+ </p>
29
+
27
30
  Choose a pre-built stack or start from scratch. Stacks pre-select skills and agents for common tech combinations.
28
31
 
29
32
  | Stack | Technologies |
@@ -35,13 +38,16 @@ Choose a pre-built stack or start from scratch. Stacks pre-select skills and age
35
38
  | `remix-stack` | Remix + React + Hono + Drizzle |
36
39
  | `solidjs-stack` | SolidJS + Hono + Drizzle |
37
40
 
38
- ![Skill selection grid](screenshots/step-skills.png)
41
+ <p align="center">
42
+ <img src="screenshots/skill-selection.png" alt="Skill selection" width="500">
43
+ </p>
44
+
39
45
  Add or remove skills from the interactive grid. Skills are organized by domain with framework-aware filtering.
40
46
 
41
- ![Source selection](screenshots/step-sources.png)
42
- Select where each skill comes from: the public marketplace, a custom marketplace, or a local directory.
47
+ <p align="center">
48
+ <img src="screenshots/agent-selection.png" alt="Agent selection" width="500">
49
+ </p>
43
50
 
44
- ![Agent selection](screenshots/step-agents.png)
45
51
  Choose which subagents to compile. Each agent is composed from the skills you selected.
46
52
 
47
53
  After init, use `agentsinc edit` to change selections and `agentsinc compile` to rebuild.
@@ -8,12 +8,11 @@ import {
8
8
  } from "./chunk-HGTC76BX.js";
9
9
  import {
10
10
  HelpModal
11
- } from "./chunk-NA6I5P5P.js";
11
+ } from "./chunk-2PZ7LBFT.js";
12
12
  import {
13
13
  useWizardStore
14
- } from "./chunk-PUZLP4SL.js";
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
- const store = useWizardStore();
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-FW5C245M.js.map
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-NA6I5P5P.js.map
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-PUZLP4SL.js";
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) => Math.max(0, prev - 1));
71
+ setFocusedIndex((prev) => prev <= 0 ? totalItems - 1 : prev - 1);
72
72
  return;
73
73
  }
74
74
  if (key.downArrow || input === "j") {
75
- setFocusedIndex((prev) => Math.min(totalItems - 1, prev + 1));
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-VILTRTBT.js.map
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-AQYAVLZK.js";
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-OV5UJWS5.js.map
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-TPXDHJDB.js";
13
+ } from "./chunk-TDHEAHXD.js";
14
14
  import {
15
15
  ViewTitle
16
- } from "./chunk-AQYAVLZK.js";
16
+ } from "./chunk-7M4INWUR.js";
17
17
  import {
18
18
  useWizardStore
19
- } from "./chunk-PUZLP4SL.js";
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-2EXAK22V.js";
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-VYHRCFMD.js.map
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-WBDPZJEW.js");
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, selectedSet } = initializeSelectionContext(currentSelections);
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
- const hasAny = requirement.skillIds.some((reqId) => selectedSet.has(reqId));
1968
- if (!hasAny) {
1969
- return true;
1970
- }
1987
+ if (!requirement.skillIds.some((reqId) => selectedSet.has(reqId))) return true;
1971
1988
  } else {
1972
- const hasAll = requirement.skillIds.every((reqId) => selectedSet.has(reqId));
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, selectedSet } = initializeSelectionContext(currentSelections);
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 `${conflict.reason} (conflicts with ${getLabel(getSkillById(selectedId))})`;
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 `${reverseConflict.reason} (conflicts with ${getLabel(selectedSkill)})`;
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
- }).join(" or ");
2019
- return `${requirement.reason} (requires ${requiredNames})`;
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
- }).join(", ");
2028
- return `${requirement.reason} (requires ${missingNames})`;
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: errors.length === 0,
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
- continue;
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
- discouraged,
2180
- discouragedReason: discouraged ? getDiscourageReason(skill.id, currentSelections) : void 0,
2181
- recommended,
2182
- recommendedReason: recommended ? getRecommendReason(skill.id, currentSelections) : void 0,
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 = path20.resolve(projectDir) !== path20.resolve(homeDir);
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 = path20.resolve(projectDir) !== path20.resolve(os8.homedir());
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 = path20.resolve(projectDir) !== path20.resolve(os8.homedir());
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 = path20.resolve(projectDir) !== path20.resolve(homeDir);
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 = path20.resolve(projectDir) !== path20.resolve(os8.homedir());
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-2EXAK22V.js.map
5530
+ //# sourceMappingURL=chunk-6W4H2K3Z.js.map