@agents-inc/cli 0.61.0 → 0.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +23 -172
  3. package/dist/{chunk-YHOHLNHM.js → chunk-3YNT3NX3.js} +13 -11
  4. package/dist/chunk-3YNT3NX3.js.map +1 -0
  5. package/dist/{chunk-IGM6HA3S.js → chunk-4C7CSZC5.js} +27 -149
  6. package/dist/chunk-4C7CSZC5.js.map +1 -0
  7. package/dist/{chunk-WHISPMAQ.js → chunk-4KVBH2X4.js} +33 -14
  8. package/dist/chunk-4KVBH2X4.js.map +1 -0
  9. package/dist/{chunk-KIWFEBKH.js → chunk-52THXN5G.js} +14 -5
  10. package/dist/chunk-52THXN5G.js.map +1 -0
  11. package/dist/{chunk-FWMWWE3X.js → chunk-53URJ5XK.js} +448 -152
  12. package/dist/chunk-53URJ5XK.js.map +1 -0
  13. package/dist/{chunk-H5DASUX5.js → chunk-6DEK3TDF.js} +10 -10
  14. package/dist/chunk-6DEK3TDF.js.map +1 -0
  15. package/dist/{chunk-SDKCQXWE.js → chunk-6IK2TCK7.js} +13 -6
  16. package/dist/chunk-6IK2TCK7.js.map +1 -0
  17. package/dist/chunk-6VIOO74O.js +51 -0
  18. package/dist/chunk-6VIOO74O.js.map +1 -0
  19. package/dist/{chunk-52XO4ULK.js → chunk-7DI3HGKL.js} +32 -14
  20. package/dist/chunk-7DI3HGKL.js.map +1 -0
  21. package/dist/{chunk-MGNYPVOJ.js → chunk-AQYAVLZK.js} +2 -2
  22. package/dist/{chunk-BNQ5O6LE.js → chunk-AUNBGZS4.js} +2 -2
  23. package/dist/chunk-BGPGQF35.js +248 -0
  24. package/dist/chunk-BGPGQF35.js.map +1 -0
  25. package/dist/chunk-BKL3DF2Q.js +45 -0
  26. package/dist/chunk-BKL3DF2Q.js.map +1 -0
  27. package/dist/{chunk-AX3SZZWA.js → chunk-BKTPEATV.js} +13 -6
  28. package/dist/chunk-BKTPEATV.js.map +1 -0
  29. package/dist/{chunk-H7WJK7NJ.js → chunk-CKPJTMNC.js} +13 -6
  30. package/dist/chunk-CKPJTMNC.js.map +1 -0
  31. package/dist/{chunk-MR6OBL3B.js → chunk-CXRVM7BA.js} +2 -4
  32. package/dist/chunk-CXRVM7BA.js.map +1 -0
  33. package/dist/{chunk-VR3CDXDT.js → chunk-EE5EPS32.js} +2 -2
  34. package/dist/{chunk-6OWHQ7HM.js → chunk-EGMQ3SXN.js} +2 -11
  35. package/dist/{chunk-6OWHQ7HM.js.map → chunk-EGMQ3SXN.js.map} +1 -1
  36. package/dist/{chunk-6DAZG54T.js → chunk-EZ35IPXZ.js} +10 -7
  37. package/dist/chunk-EZ35IPXZ.js.map +1 -0
  38. package/dist/{chunk-OCEFD7V6.js → chunk-F3REOP7N.js} +3 -3
  39. package/dist/{chunk-C577AJE7.js → chunk-FGLUQSVU.js} +3 -3
  40. package/dist/{chunk-Z3TM4N37.js → chunk-J4POGAJF.js} +24 -24
  41. package/dist/chunk-J4POGAJF.js.map +1 -0
  42. package/dist/{chunk-O6BA7Q2B.js → chunk-KFDTVSIC.js} +18 -8
  43. package/dist/chunk-KFDTVSIC.js.map +1 -0
  44. package/dist/{chunk-LWXRUR6B.js → chunk-LMZXL5RQ.js} +2 -2
  45. package/dist/{chunk-LWXRUR6B.js.map → chunk-LMZXL5RQ.js.map} +1 -1
  46. package/dist/{chunk-BFD5NZQ4.js → chunk-MVYJVKVT.js} +19 -11
  47. package/dist/chunk-MVYJVKVT.js.map +1 -0
  48. package/dist/{chunk-X5EG4EFP.js → chunk-MWGDG4QN.js} +2 -2
  49. package/dist/chunk-N4D43IOO.js +238 -0
  50. package/dist/chunk-N4D43IOO.js.map +1 -0
  51. package/dist/{chunk-KDO6WU76.js → chunk-O2HK3NTG.js} +10 -6
  52. package/dist/chunk-O2HK3NTG.js.map +1 -0
  53. package/dist/{chunk-46DQG2N7.js → chunk-OORWBS6F.js} +45 -52
  54. package/dist/chunk-OORWBS6F.js.map +1 -0
  55. package/dist/{chunk-CIG7IKX3.js → chunk-OV5UJWS5.js} +4 -4
  56. package/dist/{chunk-IEEVXLJB.js → chunk-R46CB36B.js} +5 -5
  57. package/dist/{chunk-GH2RQ4MI.js → chunk-RG3KDXMR.js} +16 -8
  58. package/dist/chunk-RG3KDXMR.js.map +1 -0
  59. package/dist/{chunk-MMFQNJPE.js → chunk-SXGBPQY6.js} +3 -3
  60. package/dist/chunk-SXGBPQY6.js.map +1 -0
  61. package/dist/{chunk-XUDTFI4M.js → chunk-T5DJCIUP.js} +2 -2
  62. package/dist/{chunk-AJJJE7F7.js → chunk-TQLDQ3XZ.js} +2 -2
  63. package/dist/{chunk-M6YWRMXH.js → chunk-WSMQ5GAP.js} +33 -21
  64. package/dist/chunk-WSMQ5GAP.js.map +1 -0
  65. package/dist/{chunk-WYVDNGJB.js → chunk-XMLCXRTS.js} +3 -3
  66. package/dist/{chunk-SDLDPFNV.js → chunk-YEGPTBX5.js} +4 -4
  67. package/dist/{chunk-SRBN6RRD.js → chunk-ZFY5EMDV.js} +5 -5
  68. package/dist/{chunk-BKJHAJQW.js → chunk-ZYUASJUN.js} +7 -4
  69. package/dist/chunk-ZYUASJUN.js.map +1 -0
  70. package/dist/commands/build/marketplace.js +4 -4
  71. package/dist/commands/build/plugins.js +7 -6
  72. package/dist/commands/build/plugins.js.map +1 -1
  73. package/dist/commands/build/stack.js +7 -6
  74. package/dist/commands/build/stack.js.map +1 -1
  75. package/dist/commands/compile.js +11 -80
  76. package/dist/commands/compile.js.map +1 -1
  77. package/dist/commands/config/index.js +7 -6
  78. package/dist/commands/config/index.js.map +1 -1
  79. package/dist/commands/config/path.js +6 -5
  80. package/dist/commands/config/path.js.map +1 -1
  81. package/dist/commands/config/show.js +7 -6
  82. package/dist/commands/diff.js +6 -5
  83. package/dist/commands/diff.js.map +1 -1
  84. package/dist/commands/doctor.js +11 -15
  85. package/dist/commands/doctor.js.map +1 -1
  86. package/dist/commands/edit.js +63 -69
  87. package/dist/commands/edit.js.map +1 -1
  88. package/dist/commands/eject.js +13 -13
  89. package/dist/commands/eject.js.map +1 -1
  90. package/dist/commands/import/skill.js +7 -6
  91. package/dist/commands/import/skill.js.map +1 -1
  92. package/dist/commands/info.js +14 -16
  93. package/dist/commands/info.js.map +1 -1
  94. package/dist/commands/init.js +32 -30
  95. package/dist/commands/list.js +6 -5
  96. package/dist/commands/list.js.map +1 -1
  97. package/dist/commands/new/agent.js +7 -6
  98. package/dist/commands/new/agent.js.map +1 -1
  99. package/dist/commands/new/marketplace.js +28 -11
  100. package/dist/commands/new/marketplace.js.map +1 -1
  101. package/dist/commands/new/skill.js +7 -6
  102. package/dist/commands/outdated.js +6 -5
  103. package/dist/commands/outdated.js.map +1 -1
  104. package/dist/commands/search.js +13 -11
  105. package/dist/commands/search.js.map +1 -1
  106. package/dist/commands/uninstall.js +9 -10
  107. package/dist/commands/uninstall.js.map +1 -1
  108. package/dist/commands/update.js +12 -8
  109. package/dist/commands/update.js.map +1 -1
  110. package/dist/commands/validate.js +20 -42
  111. package/dist/commands/validate.js.map +1 -1
  112. package/dist/components/skill-search/skill-search.js +4 -3
  113. package/dist/components/wizard/category-grid.js +5 -3
  114. package/dist/components/wizard/category-grid.test.js +242 -194
  115. package/dist/components/wizard/category-grid.test.js.map +1 -1
  116. package/dist/components/wizard/checkbox-grid.js +5 -5
  117. package/dist/components/wizard/checkbox-grid.test.js +5 -5
  118. package/dist/components/wizard/domain-selection.js +12 -11
  119. package/dist/components/wizard/help-modal.js +3 -2
  120. package/dist/components/wizard/menu-item.js +1 -1
  121. package/dist/components/wizard/search-modal.js +3 -2
  122. package/dist/components/wizard/search-modal.test.js +3 -2
  123. package/dist/components/wizard/search-modal.test.js.map +1 -1
  124. package/dist/components/wizard/section-progress.js +2 -2
  125. package/dist/components/wizard/section-progress.test.js +3 -3
  126. package/dist/components/wizard/section-progress.test.js.map +1 -1
  127. package/dist/components/wizard/selection-card.js +2 -2
  128. package/dist/components/wizard/source-grid.js +6 -4
  129. package/dist/components/wizard/source-grid.test.js +60 -40
  130. package/dist/components/wizard/source-grid.test.js.map +1 -1
  131. package/dist/components/wizard/stack-selection.js +9 -8
  132. package/dist/components/wizard/step-agents.js +11 -10
  133. package/dist/components/wizard/step-agents.test.js +29 -26
  134. package/dist/components/wizard/step-agents.test.js.map +1 -1
  135. package/dist/components/wizard/step-build.js +12 -10
  136. package/dist/components/wizard/step-build.test.js +79 -99
  137. package/dist/components/wizard/step-build.test.js.map +1 -1
  138. package/dist/components/wizard/step-confirm.js +6 -4
  139. package/dist/components/wizard/step-confirm.test.js +11 -15
  140. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  141. package/dist/components/wizard/step-refine.js +3 -2
  142. package/dist/components/wizard/step-refine.test.js +3 -2
  143. package/dist/components/wizard/step-refine.test.js.map +1 -1
  144. package/dist/components/wizard/step-settings.js +10 -8
  145. package/dist/components/wizard/step-settings.test.js +17 -13
  146. package/dist/components/wizard/step-settings.test.js.map +1 -1
  147. package/dist/components/wizard/step-sources.js +13 -11
  148. package/dist/components/wizard/step-sources.test.js +20 -16
  149. package/dist/components/wizard/step-sources.test.js.map +1 -1
  150. package/dist/components/wizard/step-stack.js +15 -14
  151. package/dist/components/wizard/step-stack.test.js +53 -59
  152. package/dist/components/wizard/step-stack.test.js.map +1 -1
  153. package/dist/components/wizard/view-title.js +2 -2
  154. package/dist/components/wizard/wizard-layout.js +10 -8
  155. package/dist/components/wizard/wizard-tabs.js +2 -2
  156. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  157. package/dist/components/wizard/wizard.js +29 -27
  158. package/dist/hooks/init.js +32 -30
  159. package/dist/hooks/init.js.map +1 -1
  160. package/dist/{loader-2O32KKAQ.js → loader-4YOZCFIP.js} +4 -4
  161. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
  162. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
  163. package/dist/{source-loader-KMEBBZCQ.js → source-loader-O5RMYUBW.js} +6 -5
  164. package/dist/{source-manager-5XBSPJNR.js → source-manager-NKLL6HCL.js} +6 -5
  165. package/dist/stores/matrix-store.js +15 -0
  166. package/dist/stores/matrix-store.js.map +1 -0
  167. package/dist/stores/matrix-store.test.js +123 -0
  168. package/dist/stores/matrix-store.test.js.map +1 -0
  169. package/dist/stores/wizard-store.js +6 -5
  170. package/dist/stores/wizard-store.test.js +150 -113
  171. package/dist/stores/wizard-store.test.js.map +1 -1
  172. package/package.json +1 -1
  173. package/dist/chunk-46DQG2N7.js.map +0 -1
  174. package/dist/chunk-52XO4ULK.js.map +0 -1
  175. package/dist/chunk-6DAZG54T.js.map +0 -1
  176. package/dist/chunk-7FMEMXJ4.js +0 -277
  177. package/dist/chunk-7FMEMXJ4.js.map +0 -1
  178. package/dist/chunk-AX3SZZWA.js.map +0 -1
  179. package/dist/chunk-BFD5NZQ4.js.map +0 -1
  180. package/dist/chunk-BKJHAJQW.js.map +0 -1
  181. package/dist/chunk-FWMWWE3X.js.map +0 -1
  182. package/dist/chunk-GH2RQ4MI.js.map +0 -1
  183. package/dist/chunk-H5DASUX5.js.map +0 -1
  184. package/dist/chunk-H7WJK7NJ.js.map +0 -1
  185. package/dist/chunk-IGM6HA3S.js.map +0 -1
  186. package/dist/chunk-KD2YS76O.js +0 -151
  187. package/dist/chunk-KD2YS76O.js.map +0 -1
  188. package/dist/chunk-KDO6WU76.js.map +0 -1
  189. package/dist/chunk-KIWFEBKH.js.map +0 -1
  190. package/dist/chunk-M6YWRMXH.js.map +0 -1
  191. package/dist/chunk-MMFQNJPE.js.map +0 -1
  192. package/dist/chunk-MR6OBL3B.js.map +0 -1
  193. package/dist/chunk-O6BA7Q2B.js.map +0 -1
  194. package/dist/chunk-SDKCQXWE.js.map +0 -1
  195. package/dist/chunk-WHISPMAQ.js.map +0 -1
  196. package/dist/chunk-YHOHLNHM.js.map +0 -1
  197. package/dist/chunk-Z3TM4N37.js.map +0 -1
  198. /package/dist/{chunk-MGNYPVOJ.js.map → chunk-AQYAVLZK.js.map} +0 -0
  199. /package/dist/{chunk-BNQ5O6LE.js.map → chunk-AUNBGZS4.js.map} +0 -0
  200. /package/dist/{chunk-VR3CDXDT.js.map → chunk-EE5EPS32.js.map} +0 -0
  201. /package/dist/{chunk-OCEFD7V6.js.map → chunk-F3REOP7N.js.map} +0 -0
  202. /package/dist/{chunk-C577AJE7.js.map → chunk-FGLUQSVU.js.map} +0 -0
  203. /package/dist/{chunk-X5EG4EFP.js.map → chunk-MWGDG4QN.js.map} +0 -0
  204. /package/dist/{chunk-CIG7IKX3.js.map → chunk-OV5UJWS5.js.map} +0 -0
  205. /package/dist/{chunk-IEEVXLJB.js.map → chunk-R46CB36B.js.map} +0 -0
  206. /package/dist/{chunk-XUDTFI4M.js.map → chunk-T5DJCIUP.js.map} +0 -0
  207. /package/dist/{chunk-AJJJE7F7.js.map → chunk-TQLDQ3XZ.js.map} +0 -0
  208. /package/dist/{chunk-WYVDNGJB.js.map → chunk-XMLCXRTS.js.map} +0 -0
  209. /package/dist/{chunk-SDLDPFNV.js.map → chunk-YEGPTBX5.js.map} +0 -0
  210. /package/dist/{chunk-SRBN6RRD.js.map → chunk-ZFY5EMDV.js.map} +0 -0
  211. /package/dist/{loader-2O32KKAQ.js.map → loader-4YOZCFIP.js.map} +0 -0
  212. /package/dist/{source-loader-KMEBBZCQ.js.map → source-loader-O5RMYUBW.js.map} +0 -0
  213. /package/dist/{source-manager-5XBSPJNR.js.map → source-manager-NKLL6HCL.js.map} +0 -0
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deriveInstallMode,
4
- getAvailableSkills,
5
4
  resolveAlias
6
- } from "./chunk-FWMWWE3X.js";
5
+ } from "./chunk-53URJ5XK.js";
7
6
  import {
8
7
  typedEntries,
9
8
  typedKeys
10
9
  } from "./chunk-T4EXUIBY.js";
10
+ import {
11
+ findSkill,
12
+ getMatrix
13
+ } from "./chunk-BKL3DF2Q.js";
11
14
  import {
12
15
  warn
13
- } from "./chunk-LWXRUR6B.js";
16
+ } from "./chunk-LMZXL5RQ.js";
14
17
  import {
15
18
  BUILT_IN_DOMAIN_ORDER,
16
- DEFAULT_PRESELECTED_SKILLS,
17
- DEFAULT_PUBLIC_SOURCE_NAME,
18
- SOURCE_DISPLAY_NAMES
19
- } from "./chunk-6OWHQ7HM.js";
19
+ DEFAULT_PUBLIC_SOURCE_NAME
20
+ } from "./chunk-EGMQ3SXN.js";
20
21
  import {
21
22
  init_esm_shims
22
23
  } from "./chunk-DHET7RCE.js";
@@ -25,104 +26,9 @@ import {
25
26
  init_esm_shims();
26
27
  import { unique } from "remeda";
27
28
  import { create } from "zustand";
28
-
29
- // src/cli/lib/wizard/build-step-logic.ts
30
- init_esm_shims();
31
- import { sortBy } from "remeda";
32
- var FRAMEWORK_CATEGORY_ID = "web-framework";
33
- var WEB_DOMAIN_ID = "web";
34
- function validateBuildStep(categories, selections) {
35
- for (const category of categories) {
36
- if (category.required) {
37
- const categorySelections = selections[category.id] || [];
38
- if (categorySelections.length === 0) {
39
- return {
40
- valid: false,
41
- message: `Select at least one skill from the ${category.displayName} category. Use arrow keys to navigate, then SPACE to select.`
42
- };
43
- }
44
- }
45
- }
46
- return { valid: true };
47
- }
48
- function computeOptionState(skill) {
49
- if (skill.discouraged) {
50
- return "discouraged";
51
- }
52
- if (skill.recommended) {
53
- return "recommended";
54
- }
55
- return "normal";
56
- }
57
- function getSkillDisplayLabel(skill) {
58
- return skill.displayName;
59
- }
60
- function getStateReason(skill) {
61
- if (skill.discouraged && skill.discouragedReason) {
62
- return skill.discouragedReason;
63
- }
64
- if (skill.recommended && skill.recommendedReason) {
65
- return skill.recommendedReason;
66
- }
67
- return void 0;
68
- }
69
- function isFrameworkSelected(selections) {
70
- const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];
71
- return frameworkSelections.length > 0;
72
- }
73
- function getSelectedFrameworks(selections, matrix) {
74
- const frameworkSelections = selections[FRAMEWORK_CATEGORY_ID] ?? [];
75
- return frameworkSelections.map((alias) => resolveAlias(alias, matrix));
76
- }
77
- function isCompatibleWithSelectedFrameworks(skillId, selectedFrameworkIds, matrix) {
78
- const skill = matrix.skills[skillId];
79
- if (!skill) return false;
80
- if (skill.compatibleWith.length === 0) {
81
- return true;
82
- }
83
- return selectedFrameworkIds.some((frameworkId) => skill.compatibleWith.includes(frameworkId));
84
- }
85
- function buildCategoriesForDomain(domain, allSelections, matrix, selections, installedSkillIds, skillConfigs) {
86
- const frameworkSource = selections;
87
- const frameworkSelected = isFrameworkSelected(frameworkSource);
88
- const selectedFrameworkIds = frameworkSelected ? getSelectedFrameworks(frameworkSource, matrix) : [];
89
- const categories = sortBy(
90
- Object.values(matrix.categories).filter(
91
- (cat) => cat.domain === domain
92
- ),
93
- (cat) => cat.order ?? 0
94
- );
95
- const categoryRows = categories.map((cat) => {
96
- const skillOptions = getAvailableSkills(cat.id, allSelections, matrix);
97
- const useFrameworkFilter = domain === WEB_DOMAIN_ID && cat.id !== FRAMEWORK_CATEGORY_ID && frameworkSelected;
98
- const filteredSkillOptions = useFrameworkFilter ? skillOptions.filter(
99
- (skill) => isCompatibleWithSelectedFrameworks(skill.id, selectedFrameworkIds, matrix)
100
- ) : skillOptions;
101
- const options = filteredSkillOptions.map((skill) => ({
102
- id: skill.id,
103
- label: getSkillDisplayLabel(skill),
104
- state: computeOptionState(skill),
105
- stateReason: getStateReason(skill),
106
- selected: skill.selected,
107
- local: matrix.skills[skill.id]?.local,
108
- installed: installedSkillIds?.includes(skill.id) || false,
109
- scope: skillConfigs?.find((sc) => sc.id === skill.id)?.scope
110
- }));
111
- return {
112
- id: cat.id,
113
- displayName: cat.displayName,
114
- required: cat.required ?? false,
115
- exclusive: cat.exclusive ?? true,
116
- options
117
- };
118
- });
119
- return categoryRows.filter((row) => row.options.length > 0);
120
- }
121
-
122
- // src/cli/stores/wizard-store.ts
123
29
  var BUILT_IN_DOMAINS = ["web", "api", "cli", "mobile", "shared"];
124
30
  function createDefaultSkillConfig(id) {
125
- return { id, scope: "project", source: DEFAULT_PUBLIC_SOURCE_NAME };
31
+ return { id, scope: "global", source: DEFAULT_PUBLIC_SOURCE_NAME };
126
32
  }
127
33
  function getAllDomainsFromCategories(categories) {
128
34
  const allDomains = unique(
@@ -159,12 +65,8 @@ function getSourceSortTier(source) {
159
65
  if (source.type === "public") return SOURCE_SORT_TIER_PUBLIC;
160
66
  return SOURCE_SORT_TIER_THIRD_PARTY;
161
67
  }
162
- function formatSourceLabel(source) {
163
- const displayName = SOURCE_DISPLAY_NAMES[source.name] ?? source.name;
164
- const prefix = source.installed ? "\u2713 " : "";
165
- return `${prefix}${displayName}`;
166
- }
167
- function resolveSkillForPopulation(skillId, skills, categories) {
68
+ function resolveSkillForPopulation(skillId) {
69
+ const { skills, categories } = getMatrix();
168
70
  const skill = skills[skillId];
169
71
  if (!skill?.category) {
170
72
  warn(
@@ -183,22 +85,10 @@ function resolveSkillForPopulation(skillId, skills, categories) {
183
85
  function buildBoundSkillOptions(boundSkills, alias, selectedSource) {
184
86
  return boundSkills.filter((b) => b.boundTo === alias).map((bound) => ({
185
87
  id: bound.sourceName,
186
- label: formatSourceLabel({
187
- name: bound.sourceName,
188
- installed: false
189
- }),
190
88
  selected: selectedSource === bound.sourceName,
191
89
  installed: false
192
90
  }));
193
91
  }
194
- function getSkillAlias(skillId, matrix) {
195
- const slug = matrix.slugMap.idToSlug[skillId];
196
- if (slug) return slug;
197
- const segments = skillId.split("-");
198
- const fallback = segments[segments.length - 1] || skillId;
199
- warn(`No slug found for skill '${skillId}', using fallback alias '${fallback}'`);
200
- return fallback;
201
- }
202
92
  var createInitialState = () => ({
203
93
  step: "stack",
204
94
  approach: null,
@@ -233,7 +123,8 @@ var useWizardStore = create((set, get) => ({
233
123
  setApproach: (approach) => set({ approach }),
234
124
  selectStack: (stackId) => set({ selectedStackId: stackId }),
235
125
  setStackAction: (action) => set({ stackAction: action }),
236
- populateFromStack: (stack, categories) => set(() => {
126
+ populateFromStack: (stack) => set(() => {
127
+ const { categories } = getMatrix();
237
128
  const domainSelections = {};
238
129
  const domains = /* @__PURE__ */ new Set();
239
130
  const allSkillIds = /* @__PURE__ */ new Set();
@@ -269,12 +160,12 @@ var useWizardStore = create((set, get) => ({
269
160
  skillConfigs
270
161
  };
271
162
  }),
272
- populateFromSkillIds: (skillIds, skills, categories, savedConfigs) => set(() => {
163
+ populateFromSkillIds: (skillIds, savedConfigs) => set(() => {
273
164
  const domainSelections = {};
274
165
  const resolvedSkillIds = [];
275
166
  let skippedCount = 0;
276
167
  for (const skillId of skillIds) {
277
- const resolved = resolveSkillForPopulation(skillId, skills, categories);
168
+ const resolved = resolveSkillForPopulation(skillId);
278
169
  if (!resolved) {
279
170
  skippedCount++;
280
171
  continue;
@@ -295,7 +186,7 @@ var useWizardStore = create((set, get) => ({
295
186
  const saved = savedConfigs?.find((sc) => sc.id === id);
296
187
  return {
297
188
  id,
298
- scope: saved?.scope ?? "project",
189
+ scope: saved?.scope ?? "global",
299
190
  source: saved?.source ?? DEFAULT_PUBLIC_SOURCE_NAME
300
191
  };
301
192
  });
@@ -468,7 +359,7 @@ var useWizardStore = create((set, get) => ({
468
359
  }
469
360
  return {
470
361
  selectedAgents: [...state.selectedAgents, agent],
471
- agentConfigs: [...state.agentConfigs, { name: agent, scope: "project" }]
362
+ agentConfigs: [...state.agentConfigs, { name: agent, scope: "global" }]
472
363
  };
473
364
  }),
474
365
  toggleAgentScope: (agentName) => set((state) => {
@@ -491,7 +382,7 @@ var useWizardStore = create((set, get) => ({
491
382
  const sorted = agents.sort();
492
383
  return {
493
384
  selectedAgents: sorted,
494
- agentConfigs: sorted.map((name) => ({ name, scope: "project" }))
385
+ agentConfigs: sorted.map((name) => ({ name, scope: "global" }))
495
386
  };
496
387
  }),
497
388
  reset: () => set(createInitialState()),
@@ -529,9 +420,6 @@ var useWizardStore = create((set, get) => ({
529
420
  const state = get();
530
421
  return state.selectedDomains[state.currentDomainIndex] || null;
531
422
  },
532
- getDefaultMethodologySkills: () => {
533
- return [...DEFAULT_PRESELECTED_SKILLS];
534
- },
535
423
  getTechnologyCount: () => {
536
424
  return get().getAllSelectedTechnologies().length;
537
425
  },
@@ -571,10 +459,10 @@ var useWizardStore = create((set, get) => ({
571
459
  skillConfigs: state.skillConfigs.map((sc) => ({ ...sc, source: "local" }))
572
460
  }));
573
461
  },
574
- setAllSourcesPlugin: (matrix) => {
462
+ setAllSourcesPlugin: () => {
575
463
  set((state) => ({
576
464
  skillConfigs: state.skillConfigs.map((sc) => {
577
- const skill = matrix.skills[sc.id];
465
+ const skill = findSkill(sc.id);
578
466
  if (skill?.availableSources) {
579
467
  const marketplaceSource = skill.availableSources.find((s) => s.type !== "local");
580
468
  if (marketplaceSource) {
@@ -585,32 +473,26 @@ var useWizardStore = create((set, get) => ({
585
473
  })
586
474
  }));
587
475
  },
588
- buildSourceRows: (matrix) => {
476
+ buildSourceRows: () => {
589
477
  const state = get();
590
478
  const selectedTechnologies = get().getAllSelectedTechnologies();
591
479
  const { skillConfigs, boundSkills } = state;
592
480
  return selectedTechnologies.map((tech) => {
593
- const skillId = resolveAlias(tech, matrix);
594
- const skill = matrix.skills[skillId];
481
+ const skillId = resolveAlias(tech);
482
+ const skill = findSkill(skillId);
595
483
  const configEntry = skillConfigs.find((sc) => sc.id === skillId);
596
484
  const selectedSource = configEntry?.source || skill?.activeSource?.name || DEFAULT_PUBLIC_SOURCE_NAME;
597
- const alias = getSkillAlias(skillId, matrix);
598
- const displayLabel = skill ? getSkillDisplayLabel(skill) : skillId;
485
+ const slug = skill?.slug ?? "";
599
486
  const sortedSources = [...skill?.availableSources || []].sort(
600
487
  (a, b) => getSourceSortTier(a) - getSourceSortTier(b)
601
488
  );
602
489
  const options = sortedSources.length > 0 ? sortedSources.map((source) => ({
603
490
  id: source.name,
604
- label: formatSourceLabel({
605
- name: source.name,
606
- installed: source.installed
607
- }),
608
491
  selected: selectedSource === source.name,
609
492
  installed: source.installed
610
493
  })) : [
611
494
  {
612
495
  id: DEFAULT_PUBLIC_SOURCE_NAME,
613
- label: formatSourceLabel({ name: DEFAULT_PUBLIC_SOURCE_NAME, installed: false }),
614
496
  selected: selectedSource === DEFAULT_PUBLIC_SOURCE_NAME,
615
497
  installed: false
616
498
  }
@@ -618,21 +500,17 @@ var useWizardStore = create((set, get) => ({
618
500
  if (!options.some((o) => o.id === "local")) {
619
501
  options.unshift({
620
502
  id: "local",
621
- label: formatSourceLabel({ name: "local", installed: false }),
622
503
  selected: selectedSource === "local",
623
504
  installed: false
624
505
  });
625
506
  }
626
- options.push(...buildBoundSkillOptions(boundSkills, alias, selectedSource));
627
- return { skillId, displayName: displayLabel, alias, options };
507
+ options.push(...buildBoundSkillOptions(boundSkills, slug, selectedSource));
508
+ return { skillId, options };
628
509
  });
629
510
  }
630
511
  }));
631
512
 
632
513
  export {
633
- validateBuildStep,
634
- getSkillDisplayLabel,
635
- buildCategoriesForDomain,
636
514
  useWizardStore
637
515
  };
638
- //# sourceMappingURL=chunk-IGM6HA3S.js.map
516
+ //# sourceMappingURL=chunk-4C7CSZC5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/stores/wizard-store.ts"],"sourcesContent":["import { unique } from \"remeda\";\nimport { create } from \"zustand\";\nimport { BUILT_IN_DOMAIN_ORDER, DEFAULT_PUBLIC_SOURCE_NAME } from \"../consts.js\";\nimport type { InstallMode } from \"../lib/installation/index.js\";\nimport { deriveInstallMode as sharedDeriveInstallMode } from \"../lib/installation/installation.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../types/config.js\";\nimport { resolveAlias } from \"../lib/matrix/index.js\";\nimport { findSkill, getMatrix } from \"./matrix-store.js\";\nimport type {\n AgentName,\n BoundSkill,\n Domain,\n DomainSelections,\n ResolvedSkill,\n SkillAlias,\n SkillAssignment,\n SkillId,\n SkillSource,\n Category,\n CategoryDomainMap,\n} from \"../types/index.js\";\nimport type { SourceOption } from \"../components/wizard/source-grid.js\";\nimport { warn } from \"../utils/logger.js\";\nimport { typedEntries, typedKeys } from \"../utils/typed-object.js\";\n\nconst BUILT_IN_DOMAINS: Domain[] = [\"web\", \"api\", \"cli\", \"mobile\", \"shared\"];\n\nfunction createDefaultSkillConfig(id: SkillId): SkillConfig {\n return { id, scope: \"global\", source: DEFAULT_PUBLIC_SOURCE_NAME };\n}\n\n/** Derive all unique domains from a categories map, preserving built-in order then appending custom. */\nfunction getAllDomainsFromCategories(categories: CategoryDomainMap): Domain[] {\n const allDomains = unique(\n Object.values(categories)\n .map((cat) => cat?.domain)\n .filter((d): d is Domain => d != null),\n );\n return [...BUILT_IN_DOMAINS, ...allDomains.filter((d) => !BUILT_IN_DOMAINS.includes(d))];\n}\n\n/** Sort domains into canonical order: custom domains first (alphabetically), then built-in domains per BUILT_IN_DOMAIN_ORDER. */\nfunction sortDomainsCanonically(domains: Domain[]): Domain[] {\n const builtInSet = new Set<Domain>(BUILT_IN_DOMAIN_ORDER);\n return [\n ...domains.filter((d) => !builtInSet.has(d)).sort(),\n ...BUILT_IN_DOMAIN_ORDER.filter((d) => domains.includes(d)),\n ];\n}\n\n/** Built-in agent names grouped by domain prefix. Custom domains return no preselected agents. */\nconst DOMAIN_AGENTS: Partial<Record<string, AgentName[]>> = {\n web: [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-tester\",\n \"web-pm\",\n \"web-architecture\",\n ],\n api: [\"api-developer\", \"api-reviewer\", \"api-researcher\"],\n cli: [\"cli-developer\", \"cli-tester\", \"cli-reviewer\"],\n};\n\n/**\n * Fixed source sort tiers (lower = higher priority):\n * 1 = local/global (installed on disk -- type \"local\" or installed via plugin)\n * 2 = scoped marketplace (primary source from --source flag)\n * 3 = default public marketplace (Agents Inc)\n * 4 = third-party marketplaces (extra configured sources)\n */\nconst SOURCE_SORT_TIER_LOCAL = 1;\nconst SOURCE_SORT_TIER_SCOPED = 2;\nconst SOURCE_SORT_TIER_PUBLIC = 3;\nconst SOURCE_SORT_TIER_THIRD_PARTY = 4;\n\nfunction getSourceSortTier(source: SkillSource): number {\n if (source.type === \"local\") return SOURCE_SORT_TIER_LOCAL;\n if (source.primary) return SOURCE_SORT_TIER_SCOPED;\n if (source.type === \"public\") return SOURCE_SORT_TIER_PUBLIC;\n return SOURCE_SORT_TIER_THIRD_PARTY;\n}\n\nexport type SkillLookupEntry = Pick<ResolvedSkill, \"category\" | \"displayName\">;\n\nfunction resolveSkillForPopulation(\n skillId: SkillId,\n): { domain: Domain; subcat: Category; techId: SkillId } | null {\n const { skills, categories } = getMatrix();\n const skill = skills[skillId];\n if (!skill?.category) {\n warn(\n `Installed skill '${skillId}' is missing from the marketplace — it may have been removed or renamed`,\n );\n return null;\n }\n\n // Boundary cast: category is a Category at the data boundary\n const subcat = skill.category as Category;\n const domain = categories[subcat]?.domain;\n if (!domain) {\n warn(`Installed skill '${skillId}' has unknown category '${skill.category}' — skipping`);\n return null;\n }\n\n return { domain, subcat, techId: skillId };\n}\n\nfunction buildBoundSkillOptions(\n boundSkills: BoundSkill[],\n alias: SkillAlias,\n selectedSource: string,\n): SourceOption[] {\n return boundSkills\n .filter((b) => b.boundTo === alias)\n .map((bound) => ({\n id: bound.sourceName,\n selected: selectedSource === bound.sourceName,\n installed: false,\n }));\n}\n\n/**\n * Wizard step identifiers for the multi-step init/edit flow.\n *\n * Progression: stack -> build -> sources -> agents -> confirm\n * The \"stack\" step shows all stacks + \"Start from scratch\" in a unified list.\n * Navigation is tracked via the `history` stack for goBack() support.\n */\nexport type WizardStep =\n | \"stack\" // Unified first step: select stack or \"Start from scratch\", then domain selection\n | \"build\" // CategoryGrid for technology selection\n | \"sources\" // Choose skill sources (recommended vs custom)\n | \"agents\" // Select which agents to compile\n | \"confirm\"; // Final confirmation\n\n/**\n * Wizard store state and actions.\n *\n * The store uses a composition pattern: small, focused actions that each mutate\n * one or two state fields. Wizard step components compose these actions to build\n * up the full selection state incrementally (domains -> categories -> skills -> sources).\n *\n * State flow: unified stack/scratch selection -> domain selection -> per-domain skill\n * selection (build step) -> source customization -> confirmation.\n */\nexport type WizardState = {\n step: WizardStep;\n\n approach: \"stack\" | \"scratch\" | null;\n selectedStackId: string | null;\n stackAction: \"defaults\" | \"customize\" | null;\n\n selectedDomains: Domain[];\n\n currentDomainIndex: number;\n domainSelections: DomainSelections;\n /** Snapshot of stack-provided domain selections for restoration on domain re-toggle */\n _stackDomainSelections: DomainSelections | null;\n\n showLabels: boolean;\n\n skillConfigs: SkillConfig[];\n focusedSkillId: SkillId | null;\n\n customizeSources: boolean;\n\n showSettings: boolean;\n showHelp: boolean;\n enabledSources: Record<string, boolean>;\n\n selectedAgents: AgentName[];\n agentConfigs: AgentScopeConfig[];\n focusedAgentId: AgentName | null;\n\n boundSkills: BoundSkill[];\n\n /** Skill IDs that cannot be toggled or removed (D9: existing global items in project context) */\n lockedSkillIds: SkillId[];\n /** Agent names that cannot be toggled or removed (D9: existing global agents in project context) */\n lockedAgentNames: AgentName[];\n\n history: WizardStep[];\n\n /**\n * Navigate to a wizard step, pushing the current step onto history.\n * @param step - Target step to navigate to\n *\n * Side effects: sets `step`, appends previous step to `history`\n */\n setStep: (step: WizardStep) => void;\n /**\n * Set the wizard approach (stack-based or build-from-scratch).\n * @param approach - \"stack\" to use a pre-built template, \"scratch\" to select skills manually, null to reset\n *\n * Side effects: sets `approach`\n */\n setApproach: (approach: \"stack\" | \"scratch\" | null) => void;\n /**\n * Select a stack by ID, or null to deselect.\n * @param stackId - Stack identifier from suggestedStacks, or null to clear\n *\n * Side effects: sets `selectedStackId`\n */\n selectStack: (stackId: string | null) => void;\n /**\n * Set how to apply the selected stack.\n * @param action - \"defaults\" to use stack as-is, \"customize\" to enter the build step\n *\n * Side effects: sets `stackAction`\n */\n setStackAction: (action: \"defaults\" | \"customize\") => void;\n /**\n * Pre-populate domainSelections from a stack's agent-to-skill mappings.\n *\n * Iterates all agents in the stack, resolving each category's skill assignments\n * to the appropriate domain. Enables all domains and deduplicates skill IDs.\n *\n * @param stack - Stack definition with agent-level skill assignments\n * @param stack.agents - Record of agent name to `{ category: SkillAssignment[] }` mappings\n * @param categories - Category definitions used to resolve category -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to ALL_DOMAINS\n */\n populateFromStack: (stack: {\n agents: Record<string, Partial<Record<Category, SkillAssignment[]>>>;\n }) => void;\n /**\n * Pre-populate domainSelections from a flat list of installed skill IDs.\n *\n * Used by `agentsinc edit` to restore wizard state from existing project config.\n * Looks up each skill's category and domain, warns for unresolvable skills.\n *\n * @param skillIds - Flat array of currently installed skill IDs\n * @param skills - Skill lookup providing category and displayName per skill ID\n * @param categories - Category definitions used to resolve category -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to domains found in the provided skill IDs\n */\n populateFromSkillIds: (skillIds: SkillId[], savedConfigs?: SkillConfig[]) => void;\n /**\n * Toggle a domain on or off in the selectedDomains list.\n * @param domain - Domain to toggle\n *\n * Side effects: adds or removes from `selectedDomains`\n */\n toggleDomain: (domain: Domain) => void;\n /**\n * Toggle a skill selection within a domain's category.\n *\n * When exclusive is true (radio behavior), selecting a new skill replaces any\n * existing selection in that category. When false (checkbox behavior),\n * the skill is added to or removed from the selection array.\n *\n * @param domain - Domain containing the category\n * @param category - Category within the domain\n * @param technology - Skill ID to toggle\n * @param exclusive - If true, only one skill can be selected per category (radio)\n *\n * Side effects: updates `domainSelections[domain][category]`\n */\n toggleTechnology: (\n domain: Domain,\n category: Category,\n technology: SkillId,\n exclusive: boolean,\n ) => void;\n /**\n * Advance to the next domain in the build step.\n * @returns true if advanced, false if already at the last domain\n *\n * Side effects: increments `currentDomainIndex`\n */\n nextDomain: () => boolean;\n /**\n * Go back to the previous domain in the build step.\n * @returns true if moved back, false if already at the first domain\n *\n * Side effects: decrements `currentDomainIndex`\n */\n prevDomain: () => boolean;\n /** Toggle compatibility label visibility on skill tags in the build step grid. */\n toggleShowLabels: () => void;\n /**\n * Derive the install mode from skillConfigs source values.\n * If all skills use \"local\" source, returns \"local\". If all use non-local, returns \"plugin\".\n * If mixed, returns \"mixed\". Returns \"local\" when no skills are configured.\n */\n deriveInstallMode: () => InstallMode;\n /**\n * Toggle the scope of a specific skill between \"project\" and \"global\".\n * @param skillId - Skill to toggle scope for\n *\n * Side effects: updates `skillConfigs` entry for the skill\n */\n toggleSkillScope: (skillId: SkillId) => void;\n /**\n * Update the source for a specific skill in skillConfigs.\n * @param skillId - Skill to update\n * @param source - Source identifier (e.g., \"local\", marketplace name)\n *\n * Side effects: updates `skillConfigs` entry for the skill\n */\n setSkillSource: (skillId: SkillId, source: string) => void;\n /**\n * Set the currently focused skill ID in the build step (for S hotkey).\n * @param id - Skill ID to focus, or null to clear\n *\n * Side effects: sets `focusedSkillId`\n */\n setFocusedSkillId: (id: SkillId | null) => void;\n /**\n * Set which source provides a specific skill.\n * @param skillId - Skill to configure the source for\n * @param sourceId - Source identifier (e.g., \"public\", \"local\", marketplace name)\n *\n * Side effects: updates `skillConfigs` entry for the skill. No-op with warning if either param is empty.\n */\n setSourceSelection: (skillId: SkillId, sourceId: string) => void;\n /**\n * Enable or disable source customization on the sources step.\n * @param customize - true to show per-skill source pickers\n *\n * Side effects: sets `customizeSources`\n */\n setCustomizeSources: (customize: boolean) => void;\n /** Toggle the settings overlay (source management). */\n toggleSettings: () => void;\n /** Toggle the help overlay (hotkey reference). */\n toggleHelp: () => void;\n /**\n * Replace the full set of enabled/disabled sources.\n * @param sources - Record of source name to enabled boolean. Empty-string keys are filtered out.\n *\n * Side effects: sets `enabledSources`\n */\n setEnabledSources: (sources: Record<string, boolean>) => void;\n /**\n * Add a bound skill from search to the wizard's bound skills list.\n * Duplicates (same id + sourceUrl) are silently skipped with a warning.\n *\n * @param skill - Bound skill to add (foreign skill tied to a category alias)\n *\n * Side effects: appends to `boundSkills`\n */\n bindSkill: (skill: BoundSkill) => void;\n /**\n * Navigate to the previous wizard step using the history stack.\n * Falls back to \"stack\" if history is empty.\n *\n * Side effects: pops from `history`, sets `step` to the popped value\n */\n goBack: () => void;\n /**\n * Toggle an agent on or off in the selectedAgents list.\n * @param agent - Agent name to toggle\n *\n * Side effects: adds or removes from `selectedAgents`, syncs `agentConfigs`\n */\n toggleAgent: (agent: AgentName) => void;\n /**\n * Toggle the scope of a specific agent between \"project\" and \"global\".\n * @param agentName - Agent to toggle scope for\n *\n * Side effects: updates `agentConfigs` entry for the agent\n */\n toggleAgentScope: (agentName: AgentName) => void;\n /**\n * Set the currently focused agent ID in the agents step (for S hotkey).\n * @param id - Agent name to focus, or null to clear\n *\n * Side effects: sets `focusedAgentId`\n */\n setFocusedAgentId: (id: AgentName | null) => void;\n /**\n * Preselect agents based on selected domains from the first wizard step.\n * Matches domains against DOMAIN_AGENTS mapping.\n * Optional agents (meta/pattern) are excluded.\n *\n * Side effects: replaces `selectedAgents` with computed preselection\n */\n preselectAgentsFromDomains: () => void;\n /** Reset all wizard state to initial values. */\n reset: () => void;\n\n /**\n * Collect all selected skill IDs across all domains and categories.\n * @returns Flat array of every selected SkillId (may contain duplicates if shared across domains)\n */\n getAllSelectedTechnologies: () => SkillId[];\n /**\n * Group selected skill IDs by domain.\n * @returns Partial record mapping each domain with selections to its skill ID array\n */\n getSelectedTechnologiesPerDomain: () => Partial<Record<Domain, SkillId[]>>;\n /**\n * Get the domain currently visible in the build step.\n * @returns The domain at currentDomainIndex, or null if no domains are selected\n */\n getCurrentDomain: () => Domain | null;\n /**\n * Count total selected technologies across all domains.\n * @returns Number of selected skill IDs\n */\n getTechnologyCount: () => number;\n /**\n * Compute which wizard steps are completed and which are skipped.\n * Used by WizardTabs to render step progress indicators.\n * @returns Object with completedSteps and skippedSteps string arrays\n */\n getStepProgress: () => { completedSteps: WizardStep[]; skippedSteps: WizardStep[] };\n /** @returns true if there is a next domain after the current one */\n canGoToNextDomain: () => boolean;\n /** @returns true if there is a previous domain before the current one */\n canGoToPreviousDomain: () => boolean;\n /** Set all selected skills to \"local\" source. */\n setAllSourcesLocal: () => void;\n /** Set all selected skills to their first non-local (marketplace) source. */\n setAllSourcesPlugin: () => void;\n\n /**\n * Build the source selection rows for the sources step UI.\n *\n * For each selected technology, resolves the canonical skill ID, looks up available\n * sources from the matrix, merges in any bound skills from search, and determines\n * which source is currently selected. Sources are sorted: local first, then public,\n * then private/other.\n *\n * @returns Array of row objects, one per selected technology, each containing:\n * - `skillId` - Canonical resolved skill ID\n * - `options` - Available sources with selection state and install status\n */\n buildSourceRows: () => {\n skillId: SkillId;\n options: SourceOption[];\n }[];\n};\n\nconst createInitialState = () => ({\n step: \"stack\" as WizardStep,\n approach: null as \"stack\" | \"scratch\" | null,\n selectedStackId: null as string | null,\n stackAction: null as \"defaults\" | \"customize\" | null,\n selectedDomains: [] as Domain[],\n currentDomainIndex: 0,\n domainSelections: {} as DomainSelections,\n /** Snapshot of domainSelections from populateFromStack/populateFromSkillIds, used to restore on domain re-toggle */\n _stackDomainSelections: null as DomainSelections | null,\n showLabels: false,\n skillConfigs: [] as SkillConfig[],\n focusedSkillId: null as SkillId | null,\n customizeSources: false,\n showSettings: false,\n showHelp: false,\n enabledSources: {} as Record<string, boolean>,\n selectedAgents: [] as AgentName[],\n agentConfigs: [] as AgentScopeConfig[],\n focusedAgentId: null as AgentName | null,\n boundSkills: [] as BoundSkill[],\n lockedSkillIds: [] as SkillId[],\n lockedAgentNames: [] as AgentName[],\n history: [] as WizardStep[],\n});\n\nexport const useWizardStore = create<WizardState>((set, get) => ({\n ...createInitialState(),\n\n setStep: (step) =>\n set((state) => ({\n step,\n history: [...state.history, state.step],\n })),\n\n setApproach: (approach) => set({ approach }),\n\n selectStack: (stackId) => set({ selectedStackId: stackId }),\n\n setStackAction: (action) => set({ stackAction: action }),\n\n populateFromStack: (stack) =>\n set(() => {\n const { categories } = getMatrix();\n const domainSelections: DomainSelections = {};\n const domains = new Set<Domain>();\n const allSkillIds = new Set<SkillId>();\n\n for (const agentConfig of Object.values(stack.agents)) {\n for (const [subcat, assignments] of typedEntries<Category, SkillAssignment[]>(\n agentConfig,\n )) {\n const category = categories[subcat];\n const domain = category?.domain;\n\n if (!domain || !assignments) {\n continue;\n }\n\n domains.add(domain);\n\n if (!domainSelections[domain]) {\n domainSelections[domain] = {};\n }\n\n if (!domainSelections[domain][subcat]) {\n domainSelections[domain][subcat] = [];\n }\n\n for (const assignment of assignments) {\n if (!domainSelections[domain][subcat].includes(assignment.id)) {\n domainSelections[domain][subcat].push(assignment.id);\n allSkillIds.add(assignment.id);\n }\n }\n }\n }\n\n const skillConfigs: SkillConfig[] = [...allSkillIds].map(createDefaultSkillConfig);\n\n return {\n domainSelections,\n _stackDomainSelections: structuredClone(domainSelections),\n selectedDomains: sortDomainsCanonically(getAllDomainsFromCategories(categories)),\n skillConfigs,\n };\n }),\n\n populateFromSkillIds: (skillIds, savedConfigs) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const resolvedSkillIds: SkillId[] = [];\n let skippedCount = 0;\n\n for (const skillId of skillIds) {\n const resolved = resolveSkillForPopulation(skillId);\n if (!resolved) {\n skippedCount++;\n continue;\n }\n\n const { domain, subcat, techId } = resolved;\n if (!domainSelections[domain]) domainSelections[domain] = {};\n if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];\n\n if (!domainSelections[domain][subcat].includes(techId)) {\n domainSelections[domain][subcat].push(techId);\n resolvedSkillIds.push(techId);\n }\n }\n\n if (skippedCount > 0) {\n warn(`${skippedCount} installed skill(s) could not be resolved and were skipped`);\n }\n\n const selectedDomains = sortDomainsCanonically(typedKeys<Domain>(domainSelections));\n\n const skillConfigs: SkillConfig[] = resolvedSkillIds.map((id) => {\n const saved = savedConfigs?.find((sc) => sc.id === id);\n return {\n id,\n scope: saved?.scope ?? \"global\",\n source: saved?.source ?? DEFAULT_PUBLIC_SOURCE_NAME,\n };\n });\n\n return {\n domainSelections,\n _stackDomainSelections: structuredClone(domainSelections),\n selectedDomains,\n skillConfigs,\n };\n }),\n\n toggleDomain: (domain) =>\n set((state) => {\n const isSelected = state.selectedDomains.includes(domain);\n if (isSelected) {\n const { [domain]: _removed, ...remainingSelections } = state.domainSelections;\n\n // Collect all skill IDs being removed from this domain\n const removedSkillIds = new Set<SkillId>();\n if (_removed) {\n for (const skills of Object.values(_removed)) {\n if (skills) {\n for (const id of skills) {\n removedSkillIds.add(id);\n }\n }\n }\n }\n\n return {\n selectedDomains: state.selectedDomains.filter((d) => d !== domain),\n domainSelections: remainingSelections,\n skillConfigs: state.skillConfigs.filter((sc) => !removedSkillIds.has(sc.id)),\n };\n }\n\n // Restore stack selections for this domain if a stack snapshot exists\n const stackSelections = state._stackDomainSelections?.[domain];\n if (stackSelections) {\n // Also restore skillConfigs for the restored skills\n const restoredSkillIds: SkillId[] = [];\n for (const skills of Object.values(stackSelections)) {\n if (skills) restoredSkillIds.push(...skills);\n }\n const existingIds = new Set(state.skillConfigs.map((sc) => sc.id));\n const newConfigs = restoredSkillIds\n .filter((id) => !existingIds.has(id))\n .map(createDefaultSkillConfig);\n\n return {\n selectedDomains: sortDomainsCanonically([...state.selectedDomains, domain]),\n domainSelections: {\n ...state.domainSelections,\n [domain]: structuredClone(stackSelections),\n },\n skillConfigs: [...state.skillConfigs, ...newConfigs],\n };\n }\n\n return {\n selectedDomains: sortDomainsCanonically([...state.selectedDomains, domain]),\n };\n }),\n\n toggleTechnology: (domain, category, technology, exclusive) =>\n set((state) => {\n // D9: locked skills cannot be toggled\n if (state.lockedSkillIds.includes(technology)) return state;\n\n const currentSelections = state.domainSelections[domain]?.[category] || [];\n const isSelected = currentSelections.includes(technology);\n\n let newSelections: SkillId[];\n if (exclusive) {\n newSelections = isSelected ? [] : [technology];\n } else {\n newSelections = isSelected\n ? currentSelections.filter((t) => t !== technology)\n : [...currentSelections, technology];\n }\n\n // Sync skillConfigs: add entries for newly selected, remove entries for deselected\n const removed = currentSelections.filter((id) => !newSelections.includes(id));\n const added = newSelections.filter((id) => !currentSelections.includes(id));\n\n let updatedConfigs = state.skillConfigs.filter((sc) => !removed.includes(sc.id));\n for (const id of added) {\n if (!updatedConfigs.some((sc) => sc.id === id)) {\n updatedConfigs = [...updatedConfigs, createDefaultSkillConfig(id)];\n }\n }\n\n return {\n skillConfigs: updatedConfigs,\n domainSelections: {\n ...state.domainSelections,\n [domain]: {\n ...state.domainSelections[domain],\n [category]: newSelections,\n },\n },\n };\n }),\n\n nextDomain: () => {\n const state = get();\n if (state.currentDomainIndex < state.selectedDomains.length - 1) {\n set({\n currentDomainIndex: state.currentDomainIndex + 1,\n });\n return true;\n }\n return false;\n },\n\n prevDomain: () => {\n const state = get();\n if (state.currentDomainIndex > 0) {\n set({\n currentDomainIndex: state.currentDomainIndex - 1,\n });\n return true;\n }\n return false;\n },\n\n toggleShowLabels: () => set((state) => ({ showLabels: !state.showLabels })),\n\n deriveInstallMode: (): InstallMode => {\n const { skillConfigs } = get();\n return sharedDeriveInstallMode(skillConfigs);\n },\n\n toggleSkillScope: (skillId) =>\n set((state) => {\n // D9: locked skills cannot have their scope toggled\n if (state.lockedSkillIds.includes(skillId)) return state;\n return {\n skillConfigs: state.skillConfigs.map((sc) =>\n sc.id === skillId ? { ...sc, scope: sc.scope === \"project\" ? \"global\" : \"project\" } : sc,\n ),\n };\n }),\n\n setSkillSource: (skillId, source) =>\n set((state) => ({\n skillConfigs: state.skillConfigs.map((sc) => (sc.id === skillId ? { ...sc, source } : sc)),\n })),\n\n setFocusedSkillId: (id) => set({ focusedSkillId: id }),\n\n setSourceSelection: (skillId, sourceId) =>\n set((state) => {\n if (!skillId) {\n warn(\"Ignoring setSourceSelection call with empty skillId\");\n return state;\n }\n if (!sourceId) {\n warn(`Ignoring setSourceSelection call with empty sourceId for skill '${skillId}'`);\n return state;\n }\n return {\n skillConfigs: state.skillConfigs.map((sc) =>\n sc.id === skillId ? { ...sc, source: sourceId } : sc,\n ),\n };\n }),\n\n setCustomizeSources: (customize) => set({ customizeSources: customize }),\n\n toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),\n\n toggleHelp: () => set((state) => ({ showHelp: !state.showHelp })),\n\n setEnabledSources: (sources) => {\n const invalidKeys = Object.keys(sources).filter((key) => !key.trim());\n if (invalidKeys.length > 0) {\n warn(\"Ignoring setEnabledSources call with empty source name(s)\");\n }\n const validSources = Object.fromEntries(Object.entries(sources).filter(([key]) => key.trim()));\n return set({ enabledSources: validSources });\n },\n\n bindSkill: (skill) =>\n set((state) => {\n const exists = state.boundSkills.some(\n (b) => b.id === skill.id && b.sourceUrl === skill.sourceUrl,\n );\n if (exists) {\n warn(`Skill '${skill.id}' from '${skill.sourceUrl}' is already bound — skipping duplicate`);\n return state;\n }\n return { boundSkills: [...state.boundSkills, skill] };\n }),\n\n goBack: () =>\n set((state) => {\n const history = [...state.history];\n const previousStep = history.pop();\n return {\n step: previousStep || \"stack\",\n history,\n };\n }),\n\n toggleAgent: (agent) =>\n set((state) => {\n // D9: locked agents cannot be toggled\n if (state.lockedAgentNames.includes(agent)) return state;\n\n const isSelected = state.selectedAgents.includes(agent);\n if (isSelected) {\n return {\n selectedAgents: state.selectedAgents.filter((a) => a !== agent),\n agentConfigs: state.agentConfigs.filter((ac) => ac.name !== agent),\n };\n }\n return {\n selectedAgents: [...state.selectedAgents, agent],\n agentConfigs: [...state.agentConfigs, { name: agent, scope: \"global\" as const }],\n };\n }),\n\n toggleAgentScope: (agentName) =>\n set((state) => {\n // D9: locked agents cannot have their scope toggled\n if (state.lockedAgentNames.includes(agentName)) return state;\n return {\n agentConfigs: state.agentConfigs.map((ac) =>\n ac.name === agentName\n ? { ...ac, scope: ac.scope === \"project\" ? (\"global\" as const) : (\"project\" as const) }\n : ac,\n ),\n };\n }),\n\n setFocusedAgentId: (id) => set({ focusedAgentId: id }),\n\n preselectAgentsFromDomains: () =>\n set(() => {\n const agents: AgentName[] = [];\n for (const domain of get().selectedDomains) {\n const domainAgents = DOMAIN_AGENTS[domain];\n if (domainAgents) {\n agents.push(...domainAgents);\n }\n }\n const sorted = agents.sort();\n return {\n selectedAgents: sorted,\n agentConfigs: sorted.map((name) => ({ name, scope: \"global\" as const })),\n };\n }),\n\n reset: () => set(createInitialState()),\n\n getAllSelectedTechnologies: () => {\n const state = get();\n const technologies: SkillId[] = [];\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n for (const category of typedKeys<Category>(domainSel)) {\n const techs = domainSel[category];\n if (techs) technologies.push(...techs);\n }\n }\n return technologies;\n },\n\n getSelectedTechnologiesPerDomain: () => {\n const state = get();\n const result: Partial<Record<Domain, SkillId[]>> = {};\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n const techs: SkillId[] = [];\n for (const category of typedKeys<Category>(domainSel)) {\n const subTechs = domainSel[category];\n if (subTechs) techs.push(...subTechs);\n }\n if (techs.length > 0) {\n result[domain] = techs;\n }\n }\n return result;\n },\n\n getCurrentDomain: () => {\n const state = get();\n return state.selectedDomains[state.currentDomainIndex] || null;\n },\n\n getTechnologyCount: () => {\n return get().getAllSelectedTechnologies().length;\n },\n\n getStepProgress: () => {\n const state = get();\n const completed: WizardStep[] = [];\n const skipped: WizardStep[] = [];\n\n if (state.step !== \"stack\") {\n completed.push(\"stack\");\n }\n\n if (state.approach === \"stack\" && state.selectedStackId && state.stackAction === \"defaults\") {\n skipped.push(\"build\");\n skipped.push(\"sources\");\n skipped.push(\"agents\");\n } else if (state.step === \"confirm\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n completed.push(\"agents\");\n } else if (state.step === \"agents\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n } else if (state.step === \"sources\") {\n completed.push(\"build\");\n }\n\n return { completedSteps: completed, skippedSteps: skipped };\n },\n\n canGoToNextDomain: () => {\n const state = get();\n return state.currentDomainIndex < state.selectedDomains.length - 1;\n },\n\n canGoToPreviousDomain: () => {\n const state = get();\n return state.currentDomainIndex > 0;\n },\n\n setAllSourcesLocal: () => {\n set((state) => ({\n skillConfigs: state.skillConfigs.map((sc) => ({ ...sc, source: \"local\" })),\n }));\n },\n\n setAllSourcesPlugin: () => {\n set((state) => ({\n skillConfigs: state.skillConfigs.map((sc) => {\n const skill = findSkill(sc.id);\n if (skill?.availableSources) {\n const marketplaceSource = skill.availableSources.find((s) => s.type !== \"local\");\n if (marketplaceSource) {\n return { ...sc, source: marketplaceSource.name };\n }\n }\n return sc;\n }),\n }));\n },\n\n buildSourceRows: () => {\n const state = get();\n const selectedTechnologies = get().getAllSelectedTechnologies();\n const { skillConfigs, boundSkills } = state;\n\n return selectedTechnologies.map((tech) => {\n const skillId = resolveAlias(tech);\n const skill = findSkill(skillId);\n const configEntry = skillConfigs.find((sc) => sc.id === skillId);\n const selectedSource =\n configEntry?.source || skill?.activeSource?.name || DEFAULT_PUBLIC_SOURCE_NAME;\n const slug = skill?.slug ?? \"\";\n\n const sortedSources = [...(skill?.availableSources || [])].sort(\n (a, b) => getSourceSortTier(a) - getSourceSortTier(b),\n );\n\n const options =\n sortedSources.length > 0\n ? sortedSources.map((source) => ({\n id: source.name,\n selected: selectedSource === source.name,\n installed: source.installed,\n }))\n : [\n {\n id: DEFAULT_PUBLIC_SOURCE_NAME,\n selected: selectedSource === DEFAULT_PUBLIC_SOURCE_NAME,\n installed: false,\n },\n ];\n\n if (!options.some((o) => o.id === \"local\")) {\n options.unshift({\n id: \"local\",\n selected: selectedSource === \"local\",\n installed: false,\n });\n }\n\n options.push(...buildBoundSkillOptions(boundSkills, slug, selectedSource));\n\n return { skillId, options };\n });\n },\n}));\n"],"mappings":"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","names":[]}
@@ -2,20 +2,32 @@
2
2
  import {
3
3
  WIZARD_STEPS,
4
4
  WizardTabs
5
- } from "./chunk-MMFQNJPE.js";
5
+ } from "./chunk-SXGBPQY6.js";
6
6
  import {
7
7
  FEATURE_FLAGS
8
8
  } from "./chunk-HGTC76BX.js";
9
9
  import {
10
10
  HelpModal
11
- } from "./chunk-52XO4ULK.js";
11
+ } from "./chunk-7DI3HGKL.js";
12
12
  import {
13
13
  useWizardStore
14
- } from "./chunk-IGM6HA3S.js";
14
+ } from "./chunk-4C7CSZC5.js";
15
+ import {
16
+ HOTKEY_ACCEPT_DEFAULTS,
17
+ HOTKEY_HELP,
18
+ HOTKEY_SCOPE,
19
+ HOTKEY_SETTINGS,
20
+ HOTKEY_TOGGLE_LABELS,
21
+ KEY_LABEL_ARROWS,
22
+ KEY_LABEL_ARROWS_VERT,
23
+ KEY_LABEL_ENTER,
24
+ KEY_LABEL_ESC,
25
+ KEY_LABEL_SPACE
26
+ } from "./chunk-6VIOO74O.js";
15
27
  import {
16
28
  CLI_COLORS,
17
29
  DEFAULT_PLUGIN_NAME
18
- } from "./chunk-6OWHQ7HM.js";
30
+ } from "./chunk-EGMQ3SXN.js";
19
31
  import {
20
32
  init_esm_shims
21
33
  } from "./chunk-DHET7RCE.js";
@@ -84,10 +96,10 @@ var DefinitionItem = ({
84
96
  ] });
85
97
  };
86
98
  var HOT_KEYS = [
87
- { label: "navigate", values: ["\u2190/\u2192", "\u2191/\u2193"] },
88
- { label: "select", values: ["SPACE"] },
89
- { label: "continue", values: ["ENTER"] },
90
- { label: "back", values: ["ESC"] }
99
+ { label: "navigate", values: [KEY_LABEL_ARROWS, KEY_LABEL_ARROWS_VERT] },
100
+ { label: "select", values: [KEY_LABEL_SPACE] },
101
+ { label: "continue", values: [KEY_LABEL_ENTER] },
102
+ { label: "back", values: [KEY_LABEL_ESC] }
91
103
  ];
92
104
  var WizardFooter = () => {
93
105
  const store = useWizardStore();
@@ -108,7 +120,7 @@ var WizardFooter = () => {
108
120
  DefinitionItem,
109
121
  {
110
122
  label: "Accept defaults",
111
- values: ["A"],
123
+ values: [HOTKEY_ACCEPT_DEFAULTS.label],
112
124
  isVisible: store.step === "build" && !!store.selectedStackId
113
125
  }
114
126
  ),
@@ -158,22 +170,29 @@ var WizardLayout = ({
158
170
  DefinitionItem,
159
171
  {
160
172
  label: "Labels",
161
- values: ["D"],
173
+ values: [HOTKEY_TOGGLE_LABELS.label],
162
174
  isVisible: store.step === "build",
163
175
  isActive: store.showLabels
164
176
  }
165
177
  ),
166
- /* @__PURE__ */ jsx(DefinitionItem, { label: "Scope", values: ["S"], isVisible: store.step === "build" }),
178
+ /* @__PURE__ */ jsx(
179
+ DefinitionItem,
180
+ {
181
+ label: "Scope",
182
+ values: [HOTKEY_SCOPE.label],
183
+ isVisible: store.step === "build"
184
+ }
185
+ ),
167
186
  /* @__PURE__ */ jsx(
168
187
  DefinitionItem,
169
188
  {
170
189
  label: "Settings",
171
- values: ["S"],
190
+ values: [HOTKEY_SETTINGS.label],
172
191
  isVisible: store.step === "sources" && FEATURE_FLAGS.SOURCE_SEARCH,
173
192
  isActive: store.showSettings
174
193
  }
175
194
  ),
176
- /* @__PURE__ */ jsx(DefinitionItem, { label: "Help", values: ["?"] })
195
+ /* @__PURE__ */ jsx(DefinitionItem, { label: "Help", values: [HOTKEY_HELP.label] })
177
196
  ] }),
178
197
  /* @__PURE__ */ jsx(WizardFooter, {})
179
198
  ] })
@@ -184,4 +203,4 @@ var WizardLayout = ({
184
203
  export {
185
204
  WizardLayout
186
205
  };
187
- //# sourceMappingURL=chunk-WHISPMAQ.js.map
206
+ //# sourceMappingURL=chunk-4KVBH2X4.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, DEFAULT_PLUGIN_NAME } 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_ACCEPT_DEFAULTS,\n HOTKEY_HELP,\n HOTKEY_SCOPE,\n HOTKEY_SETTINGS,\n HOTKEY_TOGGLE_LABELS,\n KEY_LABEL_ARROWS,\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, 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 const store = useWizardStore();\n\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 <DefinitionItem\n label=\"Accept defaults\"\n values={[HOTKEY_ACCEPT_DEFAULTS.label]}\n isVisible={store.step === \"build\" && !!store.selectedStackId}\n />\n {HOT_KEYS.map((hotkey) => (\n <DefinitionItem {...hotkey} key={hotkey.label} />\n ))}\n </Box>\n );\n};\n\ntype WizardLayoutProps = {\n version?: string;\n marketplaceLabel?: string;\n logo?: string;\n startupMessages?: StartupMessage[];\n children: React.ReactNode;\n};\n\nexport const WizardLayout: React.FC<WizardLayoutProps> = ({\n version,\n marketplaceLabel,\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 && (\n <Box flexDirection=\"row\" marginTop={1} columnGap={1}>\n <Text>{logo}</Text>\n </Box>\n )}\n <Box>\n <Text dimColor>Marketplace: </Text>\n <Text bold>{marketplaceLabel || `${DEFAULT_PLUGIN_NAME} (public)`}</Text>\n </Box>\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,13 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDomainDisplayName
4
- } from "./chunk-BKJHAJQW.js";
4
+ } from "./chunk-ZYUASJUN.js";
5
5
  import {
6
6
  ViewTitle
7
- } from "./chunk-MGNYPVOJ.js";
7
+ } from "./chunk-AQYAVLZK.js";
8
+ import {
9
+ KEY_LABEL_ENTER,
10
+ KEY_LABEL_ESC
11
+ } from "./chunk-6VIOO74O.js";
8
12
  import {
9
13
  CLI_COLORS
10
- } from "./chunk-6OWHQ7HM.js";
14
+ } from "./chunk-EGMQ3SXN.js";
11
15
  import {
12
16
  init_esm_shims
13
17
  } from "./chunk-DHET7RCE.js";
@@ -107,11 +111,16 @@ var StepConfirm = ({
107
111
  ] })
108
112
  ] })
109
113
  ] }),
110
- /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "ENTER install ESC go back" }) })
114
+ /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
115
+ KEY_LABEL_ENTER,
116
+ " install ",
117
+ KEY_LABEL_ESC,
118
+ " go back"
119
+ ] }) })
111
120
  ] });
112
121
  };
113
122
 
114
123
  export {
115
124
  StepConfirm
116
125
  };
117
- //# sourceMappingURL=chunk-KIWFEBKH.js.map
126
+ //# sourceMappingURL=chunk-52THXN5G.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 { KEY_LABEL_ENTER, KEY_LABEL_ESC } from \"./hotkeys.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>\n {KEY_LABEL_ENTER} install {KEY_LABEL_ESC} go back\n </Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}