@agents-inc/cli 0.68.0 → 0.72.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 (127) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +172 -23
  3. package/dist/chunk-2MHSOPIU.js +84 -0
  4. package/dist/chunk-2MHSOPIU.js.map +1 -0
  5. package/dist/{chunk-VTRVAXUM.js → chunk-3SLO2QPW.js} +6 -6
  6. package/dist/{chunk-KFDTVSIC.js → chunk-6YMW4HMX.js} +2 -2
  7. package/dist/{chunk-KBG7GYPL.js → chunk-AHZ34QVK.js} +76 -113
  8. package/dist/chunk-AHZ34QVK.js.map +1 -0
  9. package/dist/chunk-D7FEORKC.js +253 -0
  10. package/dist/chunk-D7FEORKC.js.map +1 -0
  11. package/dist/{chunk-L6MTIQ2U.js → chunk-F43WGOGN.js} +2 -2
  12. package/dist/{chunk-F6KEZ4Y5.js → chunk-FKRYJOPC.js} +4 -4
  13. package/dist/{chunk-RMMHVE2R.js → chunk-G3LNIYZG.js} +2 -2
  14. package/dist/{chunk-GK5CAS3A.js → chunk-HJVWBSLM.js} +4 -4
  15. package/dist/{chunk-45R64U2S.js → chunk-HMJGSAKV.js} +24 -22
  16. package/dist/chunk-HMJGSAKV.js.map +1 -0
  17. package/dist/{chunk-6BXKF5GP.js → chunk-J4TVAB5H.js} +2 -2
  18. package/dist/{chunk-2JJUPWE5.js → chunk-LBTW5HSY.js} +2 -2
  19. package/dist/{chunk-QUEO6QEL.js → chunk-LM5YQUBR.js} +3 -3
  20. package/dist/{chunk-FCF4WQEI.js → chunk-MGQVO357.js} +2 -2
  21. package/dist/{chunk-KWB3B2HS.js → chunk-NKKYTCBH.js} +109 -86
  22. package/dist/chunk-NKKYTCBH.js.map +1 -0
  23. package/dist/{chunk-HADHP7XF.js → chunk-OODTDGEM.js} +6 -6
  24. package/dist/chunk-Q3YMO5YG.js +58 -0
  25. package/dist/chunk-Q3YMO5YG.js.map +1 -0
  26. package/dist/{chunk-L5LD3ZSR.js → chunk-RJOLQ7EK.js} +4 -4
  27. package/dist/{chunk-SSGPFKS4.js → chunk-SEAL43IR.js} +3 -3
  28. package/dist/{chunk-JAWXWNIX.js → chunk-UQTG4ZBA.js} +10 -10
  29. package/dist/{chunk-EULHBV5V.js → chunk-URAXGHF2.js} +3 -3
  30. package/dist/{chunk-KMDBOO3E.js → chunk-V2XIWRHP.js} +2 -2
  31. package/dist/chunk-WF5PMBIR.js +54 -0
  32. package/dist/chunk-WF5PMBIR.js.map +1 -0
  33. package/dist/{chunk-N4D43IOO.js → chunk-WWHDP5CP.js} +55 -8
  34. package/dist/chunk-WWHDP5CP.js.map +1 -0
  35. package/dist/{chunk-R3AR4VLZ.js → chunk-ZEJIEC2A.js} +154 -150
  36. package/dist/chunk-ZEJIEC2A.js.map +1 -0
  37. package/dist/{chunk-7LCI5PSJ.js → chunk-ZFRALAK5.js} +2 -2
  38. package/dist/commands/build/marketplace.js +3 -3
  39. package/dist/commands/build/plugins.js +6 -6
  40. package/dist/commands/build/stack.js +6 -6
  41. package/dist/commands/compile.js +6 -6
  42. package/dist/commands/config/index.js +6 -6
  43. package/dist/commands/config/path.js +5 -5
  44. package/dist/commands/config/show.js +6 -6
  45. package/dist/commands/diff.js +5 -5
  46. package/dist/commands/doctor.js +5 -5
  47. package/dist/commands/edit.js +21 -20
  48. package/dist/commands/edit.js.map +1 -1
  49. package/dist/commands/eject.js +5 -5
  50. package/dist/commands/import/skill.js +5 -5
  51. package/dist/commands/info.js +5 -5
  52. package/dist/commands/init.js +21 -20
  53. package/dist/commands/list.js +5 -5
  54. package/dist/commands/new/agent.js +6 -6
  55. package/dist/commands/new/marketplace.js +7 -7
  56. package/dist/commands/new/skill.js +6 -6
  57. package/dist/commands/outdated.js +5 -5
  58. package/dist/commands/search.js +5 -5
  59. package/dist/commands/uninstall.js +5 -5
  60. package/dist/commands/update.js +6 -6
  61. package/dist/commands/validate.js +5 -5
  62. package/dist/components/common/select-list.js +11 -0
  63. package/dist/components/wizard/category-grid.test.js +6 -6
  64. package/dist/components/wizard/domain-selection.js +6 -6
  65. package/dist/components/wizard/search-modal.js +2 -1
  66. package/dist/components/wizard/search-modal.test.js +3 -2
  67. package/dist/components/wizard/search-modal.test.js.map +1 -1
  68. package/dist/components/wizard/source-grid.js +3 -2
  69. package/dist/components/wizard/source-grid.test.js +17 -13
  70. package/dist/components/wizard/source-grid.test.js.map +1 -1
  71. package/dist/components/wizard/stack-selection.js +6 -6
  72. package/dist/components/wizard/step-agents.js +6 -6
  73. package/dist/components/wizard/step-agents.test.js +10 -9
  74. package/dist/components/wizard/step-agents.test.js.map +1 -1
  75. package/dist/components/wizard/step-build.js +7 -7
  76. package/dist/components/wizard/step-build.test.js +17 -52
  77. package/dist/components/wizard/step-build.test.js.map +1 -1
  78. package/dist/components/wizard/step-confirm.test.js +6 -6
  79. package/dist/components/wizard/step-settings.js +5 -5
  80. package/dist/components/wizard/step-settings.test.js +8 -8
  81. package/dist/components/wizard/step-sources.js +10 -9
  82. package/dist/components/wizard/step-sources.test.js +15 -13
  83. package/dist/components/wizard/step-sources.test.js.map +1 -1
  84. package/dist/components/wizard/step-stack.js +9 -9
  85. package/dist/components/wizard/step-stack.test.js +10 -10
  86. package/dist/components/wizard/wizard-layout.js +6 -6
  87. package/dist/components/wizard/wizard.js +19 -18
  88. package/dist/config-exports.js +1 -1
  89. package/dist/hooks/init.js +21 -20
  90. package/dist/hooks/init.js.map +1 -1
  91. package/dist/{loader-CMSC3RAO.js → loader-KVKSTKWX.js} +3 -3
  92. package/dist/{source-loader-YMWWZFVD.js → source-loader-65IAJPNV.js} +5 -5
  93. package/dist/{source-manager-6G3EVTU2.js → source-manager-LJH225GA.js} +5 -5
  94. package/dist/source-manager-LJH225GA.js.map +1 -0
  95. package/dist/stores/matrix-store.test.js +17 -13
  96. package/dist/stores/matrix-store.test.js.map +1 -1
  97. package/dist/stores/wizard-store.js +5 -5
  98. package/dist/stores/wizard-store.test.js +35 -110
  99. package/dist/stores/wizard-store.test.js.map +1 -1
  100. package/package.json +2 -1
  101. package/dist/chunk-45R64U2S.js.map +0 -1
  102. package/dist/chunk-6IK2TCK7.js +0 -97
  103. package/dist/chunk-6IK2TCK7.js.map +0 -1
  104. package/dist/chunk-KBG7GYPL.js.map +0 -1
  105. package/dist/chunk-KWB3B2HS.js.map +0 -1
  106. package/dist/chunk-N4D43IOO.js.map +0 -1
  107. package/dist/chunk-R3AR4VLZ.js.map +0 -1
  108. /package/dist/{chunk-VTRVAXUM.js.map → chunk-3SLO2QPW.js.map} +0 -0
  109. /package/dist/{chunk-KFDTVSIC.js.map → chunk-6YMW4HMX.js.map} +0 -0
  110. /package/dist/{chunk-L6MTIQ2U.js.map → chunk-F43WGOGN.js.map} +0 -0
  111. /package/dist/{chunk-F6KEZ4Y5.js.map → chunk-FKRYJOPC.js.map} +0 -0
  112. /package/dist/{chunk-RMMHVE2R.js.map → chunk-G3LNIYZG.js.map} +0 -0
  113. /package/dist/{chunk-GK5CAS3A.js.map → chunk-HJVWBSLM.js.map} +0 -0
  114. /package/dist/{chunk-6BXKF5GP.js.map → chunk-J4TVAB5H.js.map} +0 -0
  115. /package/dist/{chunk-2JJUPWE5.js.map → chunk-LBTW5HSY.js.map} +0 -0
  116. /package/dist/{chunk-QUEO6QEL.js.map → chunk-LM5YQUBR.js.map} +0 -0
  117. /package/dist/{chunk-FCF4WQEI.js.map → chunk-MGQVO357.js.map} +0 -0
  118. /package/dist/{chunk-HADHP7XF.js.map → chunk-OODTDGEM.js.map} +0 -0
  119. /package/dist/{chunk-L5LD3ZSR.js.map → chunk-RJOLQ7EK.js.map} +0 -0
  120. /package/dist/{chunk-SSGPFKS4.js.map → chunk-SEAL43IR.js.map} +0 -0
  121. /package/dist/{chunk-JAWXWNIX.js.map → chunk-UQTG4ZBA.js.map} +0 -0
  122. /package/dist/{chunk-EULHBV5V.js.map → chunk-URAXGHF2.js.map} +0 -0
  123. /package/dist/{chunk-KMDBOO3E.js.map → chunk-V2XIWRHP.js.map} +0 -0
  124. /package/dist/{chunk-7LCI5PSJ.js.map → chunk-ZFRALAK5.js.map} +0 -0
  125. /package/dist/{loader-CMSC3RAO.js.map → components/common/select-list.js.map} +0 -0
  126. /package/dist/{source-loader-YMWWZFVD.js.map → loader-KVKSTKWX.js.map} +0 -0
  127. /package/dist/{source-manager-6G3EVTU2.js.map → source-loader-65IAJPNV.js.map} +0 -0
@@ -1,7 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "./chunk-JAWXWNIX.js";
4
+ } from "./chunk-UQTG4ZBA.js";
5
+ import {
6
+ SelectList
7
+ } from "./chunk-WF5PMBIR.js";
8
+ import {
9
+ KEY_LABEL_ARROWS_VERT,
10
+ KEY_LABEL_ENTER,
11
+ KEY_LABEL_ESC
12
+ } from "./chunk-6VIOO74O.js";
5
13
  import {
6
14
  STATUS_MESSAGES,
7
15
  SUCCESS_MESSAGES
@@ -21,7 +29,7 @@ import {
21
29
  installPluginConfig,
22
30
  loadProjectConfig,
23
31
  loadSkillsMatrixFromSource
24
- } from "./chunk-45R64U2S.js";
32
+ } from "./chunk-HMJGSAKV.js";
25
33
  import {
26
34
  getSkill,
27
35
  useMatrixStore
@@ -29,7 +37,7 @@ import {
29
37
  import {
30
38
  BaseCommand,
31
39
  EXIT_CODES
32
- } from "./chunk-FCF4WQEI.js";
40
+ } from "./chunk-MGQVO357.js";
33
41
  import {
34
42
  disableBuffering,
35
43
  drainBuffer,
@@ -40,7 +48,7 @@ import {
40
48
  settingsFileSchema,
41
49
  warn,
42
50
  warnUnknownFields
43
- } from "./chunk-R3AR4VLZ.js";
51
+ } from "./chunk-ZEJIEC2A.js";
44
52
  import {
45
53
  ASCII_LOGO,
46
54
  CLAUDE_DIR,
@@ -57,9 +65,8 @@ import {
57
65
 
58
66
  // src/cli/commands/init.tsx
59
67
  init_esm_shims();
60
- import { useState } from "react";
61
68
  import { Flags } from "@oclif/core";
62
- import { render, Box as Box2, Text as Text2, useApp, useInput } from "ink";
69
+ import { render, Box as Box2, Text as Text2, useApp } from "ink";
63
70
  import os from "os";
64
71
  import path2 from "path";
65
72
 
@@ -138,83 +145,51 @@ async function checkPermissions(projectRoot) {
138
145
 
139
146
  // src/cli/commands/init.tsx
140
147
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
148
+ function clearTerminalOutput() {
149
+ process.stdout.write("\x1B[2J\x1B[H");
150
+ }
141
151
  var DASHBOARD_OPTIONS = [
142
- { label: "Edit", command: "edit" },
143
- { label: "Compile", command: "compile" },
144
- { label: "Doctor", command: "doctor" },
145
- { label: "List", command: "list" }
152
+ { label: "Edit", value: "edit" },
153
+ { label: "Compile", value: "compile" },
154
+ { label: "Doctor", value: "doctor" },
155
+ { label: "List", value: "list" }
146
156
  ];
147
- var Dashboard = ({
148
- skillCount,
149
- agentCount,
150
- source,
151
- mode,
152
- onSelect,
153
- onCancel
154
- }) => {
157
+ var Dashboard = ({ onSelect, onCancel }) => {
155
158
  const { exit } = useApp();
156
- const [focusIndex, setFocusIndex] = useState(0);
157
- useInput((_input, key) => {
158
- if (key.escape) {
159
- onCancel();
160
- exit();
161
- return;
162
- }
163
- if (key.return) {
164
- onSelect(DASHBOARD_OPTIONS[focusIndex].command);
165
- exit();
166
- return;
167
- }
168
- if (key.leftArrow) {
169
- setFocusIndex((i) => i > 0 ? i - 1 : DASHBOARD_OPTIONS.length - 1);
170
- }
171
- if (key.rightArrow) {
172
- setFocusIndex((i) => i < DASHBOARD_OPTIONS.length - 1 ? i + 1 : 0);
173
- }
174
- });
175
159
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
176
160
  /* @__PURE__ */ jsx2(Text2, { bold: true, children: DEFAULT_BRANDING.NAME }),
177
161
  /* @__PURE__ */ jsx2(Text2, { children: " " }),
178
- /* @__PURE__ */ jsxs2(Text2, { children: [
179
- " Skills: ",
180
- skillCount,
181
- " installed"
182
- ] }),
183
- /* @__PURE__ */ jsxs2(Text2, { children: [
184
- " Agents: ",
185
- agentCount,
186
- " compiled"
187
- ] }),
188
- /* @__PURE__ */ jsxs2(Text2, { children: [
189
- " Mode: ",
190
- mode === "plugin" ? "Plugin" : "Local"
191
- ] }),
192
- source && /* @__PURE__ */ jsxs2(Text2, { children: [
193
- " Source: ",
194
- source
195
- ] }),
196
- /* @__PURE__ */ jsx2(Text2, { children: " " }),
197
- /* @__PURE__ */ jsxs2(Box2, { children: [
198
- /* @__PURE__ */ jsx2(Text2, { children: " " }),
199
- DASHBOARD_OPTIONS.map((option, index) => /* @__PURE__ */ jsx2(Box2, { marginRight: 1, children: /* @__PURE__ */ jsxs2(
200
- Text2,
201
- {
202
- color: index === focusIndex ? CLI_COLORS.FOCUS : void 0,
203
- bold: index === focusIndex,
204
- children: [
205
- "[",
206
- option.label,
207
- "]"
208
- ]
162
+ /* @__PURE__ */ jsx2(
163
+ SelectList,
164
+ {
165
+ items: DASHBOARD_OPTIONS,
166
+ onSelect: (command) => {
167
+ onSelect(command);
168
+ exit();
169
+ },
170
+ onCancel: () => {
171
+ onCancel();
172
+ exit();
209
173
  }
210
- ) }, option.command))
211
- ] }),
212
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: " Use arrow keys to select, Enter to confirm, Esc to exit" })
174
+ }
175
+ ),
176
+ /* @__PURE__ */ jsx2(Text2, { children: " " }),
177
+ /* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
178
+ " ",
179
+ KEY_LABEL_ARROWS_VERT,
180
+ " Navigate ",
181
+ " ",
182
+ KEY_LABEL_ENTER,
183
+ " Confirm ",
184
+ " ",
185
+ KEY_LABEL_ESC,
186
+ " Exit"
187
+ ] })
213
188
  ] });
214
189
  };
215
190
  var GLOBAL_CONFIG_OPTIONS = [
216
- { label: "Edit global installation", choice: "edit-global" },
217
- { label: "Create new project installation", choice: "create-project" }
191
+ { label: "Edit global installation", value: "edit-global" },
192
+ { label: "Create new project installation", value: "create-project" }
218
193
  ];
219
194
  var GlobalConfigPrompt = ({
220
195
  globalConfigDir,
@@ -222,48 +197,38 @@ var GlobalConfigPrompt = ({
222
197
  onCancel
223
198
  }) => {
224
199
  const { exit } = useApp();
225
- const [focusIndex, setFocusIndex] = useState(0);
226
- useInput((_input, key) => {
227
- if (key.escape) {
228
- onCancel();
229
- exit();
230
- return;
231
- }
232
- if (key.return) {
233
- onSelect(GLOBAL_CONFIG_OPTIONS[focusIndex].choice);
234
- exit();
235
- return;
236
- }
237
- if (key.leftArrow) {
238
- setFocusIndex((i) => i > 0 ? i - 1 : GLOBAL_CONFIG_OPTIONS.length - 1);
239
- }
240
- if (key.rightArrow) {
241
- setFocusIndex((i) => i < GLOBAL_CONFIG_OPTIONS.length - 1 ? i + 1 : 0);
242
- }
243
- });
244
200
  return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
245
201
  /* @__PURE__ */ jsxs2(Text2, { children: [
246
202
  "A global installation was found at ",
247
203
  globalConfigDir
248
204
  ] }),
249
- /* @__PURE__ */ jsx2(Text2, { children: "What would you like to do?" }),
250
205
  /* @__PURE__ */ jsx2(Text2, { children: " " }),
251
- /* @__PURE__ */ jsxs2(Box2, { children: [
252
- /* @__PURE__ */ jsx2(Text2, { children: " " }),
253
- GLOBAL_CONFIG_OPTIONS.map((option, index) => /* @__PURE__ */ jsx2(Box2, { marginRight: 1, children: /* @__PURE__ */ jsxs2(
254
- Text2,
255
- {
256
- color: index === focusIndex ? CLI_COLORS.FOCUS : void 0,
257
- bold: index === focusIndex,
258
- children: [
259
- "[",
260
- option.label,
261
- "]"
262
- ]
206
+ /* @__PURE__ */ jsx2(
207
+ SelectList,
208
+ {
209
+ items: GLOBAL_CONFIG_OPTIONS,
210
+ onSelect: (choice) => {
211
+ onSelect(choice);
212
+ exit();
213
+ },
214
+ onCancel: () => {
215
+ onCancel();
216
+ exit();
263
217
  }
264
- ) }, option.choice))
265
- ] }),
266
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: " Use arrow keys to select, Enter to confirm, Esc to exit" })
218
+ }
219
+ ),
220
+ /* @__PURE__ */ jsx2(Text2, { children: " " }),
221
+ /* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
222
+ " ",
223
+ KEY_LABEL_ARROWS_VERT,
224
+ " Navigate ",
225
+ " ",
226
+ KEY_LABEL_ENTER,
227
+ " Confirm ",
228
+ " ",
229
+ KEY_LABEL_ESC,
230
+ " Exit"
231
+ ] })
267
232
  ] });
268
233
  };
269
234
  async function getDashboardData(projectDir) {
@@ -302,10 +267,6 @@ async function showDashboard(projectDir, log) {
302
267
  /* @__PURE__ */ jsx2(
303
268
  Dashboard,
304
269
  {
305
- skillCount: data.skillCount,
306
- agentCount: data.agentCount,
307
- source: data.source,
308
- mode: data.mode,
309
270
  onSelect: (command) => {
310
271
  selectedCommand = command;
311
272
  },
@@ -316,6 +277,7 @@ async function showDashboard(projectDir, log) {
316
277
  )
317
278
  );
318
279
  await waitUntilExit();
280
+ clearTerminalOutput();
319
281
  return selectedCommand;
320
282
  }
321
283
  var Init = class _Init extends BaseCommand {
@@ -374,6 +336,7 @@ var Init = class _Init extends BaseCommand {
374
336
  )
375
337
  );
376
338
  await waitForPrompt();
339
+ clearTerminalOutput();
377
340
  if (globalChoice === "edit-global") {
378
341
  const selectedCommand = await showDashboard(os.homedir(), (msg) => this.log(msg));
379
342
  if (selectedCommand) {
@@ -592,4 +555,4 @@ export {
592
555
  showDashboard,
593
556
  Init
594
557
  };
595
- //# sourceMappingURL=chunk-KBG7GYPL.js.map
558
+ //# sourceMappingURL=chunk-AHZ34QVK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/init.tsx","../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n loadSkillsMatrixFromSource,\n getMarketplaceLabel,\n type SourceLoadResult,\n} from \"../lib/loading/index.js\";\nimport {\n installLocal,\n installPluginConfig,\n detectGlobalInstallation,\n detectProjectInstallation,\n deriveInstallMode,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { getInstallationInfo } from \"../lib/plugins/plugin-info.js\";\nimport { hasIndividualPlugins } from \"../lib/plugins/index.js\";\nimport {\n claudePluginInstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport {\n ASCII_LOGO,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n GLOBAL_INSTALL_ROOT,\n} from \"../consts.js\";\nimport { SelectList, type SelectListItem } from \"../components/common/select-list.js\";\nimport {\n KEY_LABEL_ARROWS_VERT,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n} from \"../components/wizard/hotkeys.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { getSkill, useMatrixStore } from \"../stores/matrix-store\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n type StartupMessage,\n} from \"../utils/logger.js\";\nimport { SUCCESS_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\n\n/** Clears the visible terminal area so the next render starts clean. */\nfunction clearTerminalOutput(): void {\n process.stdout.write(\"\\x1b[2J\\x1b[H\");\n}\n\nconst DASHBOARD_OPTIONS: SelectListItem<string>[] = [\n { label: \"Edit\", value: \"edit\" },\n { label: \"Compile\", value: \"compile\" },\n { label: \"Doctor\", value: \"doctor\" },\n { label: \"List\", value: \"list\" },\n];\n\ntype DashboardProps = {\n onSelect: (command: string) => void;\n onCancel: () => void;\n};\n\nconst Dashboard: React.FC<DashboardProps> = ({ onSelect, onCancel }) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{DEFAULT_BRANDING.NAME}</Text>\n <Text> </Text>\n <SelectList\n items={DASHBOARD_OPTIONS}\n onSelect={(command) => {\n onSelect(command);\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n />\n <Text> </Text>\n <Text dimColor>\n {\" \"}\n {KEY_LABEL_ARROWS_VERT} Navigate {\" \"}\n {KEY_LABEL_ENTER} Confirm {\" \"}\n {KEY_LABEL_ESC} Exit\n </Text>\n </Box>\n );\n};\n\ntype GlobalConfigChoice = \"edit-global\" | \"create-project\";\n\nconst GLOBAL_CONFIG_OPTIONS: SelectListItem<GlobalConfigChoice>[] = [\n { label: \"Edit global installation\", value: \"edit-global\" },\n { label: \"Create new project installation\", value: \"create-project\" },\n];\n\ntype GlobalConfigPromptProps = {\n globalConfigDir: string;\n onSelect: (choice: GlobalConfigChoice) => void;\n onCancel: () => void;\n};\n\nconst GlobalConfigPrompt: React.FC<GlobalConfigPromptProps> = ({\n globalConfigDir,\n onSelect,\n onCancel,\n}) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text>A global installation was found at {globalConfigDir}</Text>\n <Text> </Text>\n <SelectList\n items={GLOBAL_CONFIG_OPTIONS}\n onSelect={(choice) => {\n onSelect(choice);\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n />\n <Text> </Text>\n <Text dimColor>\n {\" \"}\n {KEY_LABEL_ARROWS_VERT} Navigate {\" \"}\n {KEY_LABEL_ENTER} Confirm {\" \"}\n {KEY_LABEL_ESC} Exit\n </Text>\n </Box>\n );\n};\n\nexport type DashboardData = {\n skillCount: number;\n agentCount: number;\n mode: string;\n source?: string;\n};\n\n/** Gathers dashboard data from the installation and project config. */\nexport async function getDashboardData(projectDir: string): Promise<DashboardData> {\n const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);\n\n // Skill count from config (canonical source of truth for installed skills)\n const skillCount = loaded?.config?.skills?.length ?? 0;\n // Agent count from filesystem (compiled .md files in agents dir)\n const agentCount = info?.agentCount ?? 0;\n const mode =\n info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : \"local\");\n const source = loaded?.config?.source;\n\n return { skillCount, agentCount, mode, source };\n}\n\n/** Formats the dashboard summary as plain text lines (for non-interactive/test output). */\nexport function formatDashboardText(data: DashboardData): string {\n const modeLabel = data.mode === \"plugin\" ? \"Plugin\" : \"Local\";\n const lines = [\n DEFAULT_BRANDING.NAME,\n \"\",\n ` Skills: ${data.skillCount} installed`,\n ` Agents: ${data.agentCount} compiled`,\n ` Mode: ${modeLabel}`,\n ];\n if (data.source) {\n lines.push(` Source: ${data.source}`);\n }\n lines.push(\"\");\n lines.push(` [Edit] [Compile] [Doctor] [List]`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Shows the project dashboard and returns the selected command (or null if cancelled).\n * In non-interactive environments (no TTY), prints the summary text and returns null.\n */\nexport async function showDashboard(\n projectDir: string,\n log?: (message: string) => void,\n): Promise<string | null> {\n const data = await getDashboardData(projectDir);\n\n // Non-interactive: print text summary and exit (CI, piped, tests)\n if (!process.stdin.isTTY) {\n const output = log ?? console.log;\n output(formatDashboardText(data));\n return null;\n }\n\n let selectedCommand: string | null = null;\n\n const { waitUntilExit } = render(\n <Dashboard\n onSelect={(command) => {\n selectedCommand = command;\n }}\n onCancel={() => {\n selectedCommand = null;\n }}\n />,\n );\n\n await waitUntilExit();\n clearTerminalOutput();\n\n return selectedCommand;\n}\n\nexport default class Init extends BaseCommand {\n static summary = `Initialize ${DEFAULT_BRANDING.NAME} in this project`;\n static description =\n \"Interactive wizard to set up skills and agents. Supports Plugin Mode (native install) and Local Mode (copy to .claude/).\";\n\n static examples = [\n {\n description: \"Start the setup wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Initialize from a custom marketplace\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Init);\n const projectDir = process.cwd();\n\n // For \"already initialized\" check, only look at the target directory (no global fallback)\n const individualPluginsExist = await hasIndividualPlugins(projectDir);\n const existingInstallation = await detectProjectInstallation(projectDir);\n\n if (individualPluginsExist || existingInstallation) {\n const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return;\n }\n\n // No project config exists: check if a global installation exists\n const globalInstallation = await detectGlobalInstallation();\n if (globalInstallation) {\n const globalConfigDir = path.join(os.homedir(), CLAUDE_SRC_DIR);\n\n // Non-interactive: skip prompt and fall through to wizard\n if (process.stdin.isTTY) {\n let globalChoice: GlobalConfigChoice | null = null;\n\n const { waitUntilExit: waitForPrompt } = render(\n <GlobalConfigPrompt\n globalConfigDir={globalConfigDir}\n onSelect={(choice) => {\n globalChoice = choice;\n }}\n onCancel={() => {\n globalChoice = null;\n }}\n />,\n );\n\n await waitForPrompt();\n clearTerminalOutput();\n\n if (globalChoice === \"edit-global\") {\n const selectedCommand = await showDashboard(os.homedir(), (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return;\n }\n\n // User cancelled (Esc)\n if (globalChoice === null) {\n return;\n }\n\n // \"create-project\" falls through to wizard below\n }\n }\n\n // Auto-create blank global config on first init from a project directory.\n // This ensures the project config can always import from global.\n if (projectDir !== GLOBAL_INSTALL_ROOT) {\n const created = await ensureBlankGlobalConfig();\n if (created) {\n this.log(\"Created blank global config at ~/\" + CLAUDE_SRC_DIR);\n }\n }\n\n enableBuffering();\n\n let sourceResult: SourceLoadResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n disableBuffering();\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n const marketplaceLabel = getMarketplaceLabel(sourceResult);\n useMatrixStore.getState().setMatrix(sourceResult.matrix);\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n marketplaceLabel={marketplaceLabel}\n logo={ASCII_LOGO}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n // Boundary cast: Ink render callback returns unknown result type\n wizardResult = result as WizardResultV2;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // Boundary cast: re-narrow after Ink waitUntilExit()\n const result = wizardResult as WizardResultV2 | null;\n if (!result || result.cancelled) {\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (result.skills.length === 0) {\n this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n await this.handleInstallation(result, sourceResult, flags);\n }\n\n private async handleInstallation(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const installMode = deriveInstallMode(result.skills);\n\n this.log(\"\\n\");\n this.log(`Selected ${result.skills.length} skills`);\n this.log(\n `Install mode: ${installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\"}`,\n );\n\n if (installMode === \"plugin\") {\n if (sourceResult.marketplace) {\n await this.installIndividualPlugins(result, sourceResult, flags, projectDir);\n } else {\n this.warn(\"Plugin Mode requires a marketplace for individual skill installation.\");\n this.log(`Falling back to Local Mode (copying to .claude/skills/)...`);\n this.log(\"To use Plugin Mode, either select a stack or configure a marketplace source.\\n\");\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n }\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n }\n\n private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);\n\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${sourceResult.marketplace}\"...`);\n try {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${sourceResult.marketplace}`);\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n }\n\n this.log(\"Installing skill plugins...\");\n for (const skill of result.skills.filter((s) => s.source !== \"local\")) {\n const pluginRef = `${skill.id}@${sourceResult.marketplace}`;\n const pluginScope = skill.scope === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginInstall(pluginRef, pluginScope, projectDir);\n this.log(` Installed ${pluginRef}`);\n } catch (error) {\n this.error(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n const pluginSkillCount = result.skills.filter((s) => s.source !== \"local\").length;\n this.log(`Installed ${pluginSkillCount} skill plugins\\n`);\n\n this.log(\"Generating configuration...\");\n try {\n const configResult = await installPluginConfig({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${configResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${configResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Agents compiled to:\");\n this.log(` ${configResult.agentsDir}`);\n for (const agentName of configResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${configResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async installLocalMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n this.log(\"Copying skills to local directory...\");\n try {\n const installResult = await installLocal({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/\\n`);\n this.log(\"Generating configuration...\");\n\n if (installResult.wasMerged) {\n this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${installResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Skills copied to:\");\n this.log(` ${installResult.skillsDir}`);\n for (const copiedSkill of installResult.copiedSkills) {\n const displayName = getSkill(copiedSkill.skillId).displayName;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n this.log(\"Agents compiled to:\");\n this.log(` ${installResult.agentsDir}`);\n for (const agentName of installResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${installResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n","import React from \"react\";\n\nimport { Text, Box } from \"ink\";\nimport path from \"path\";\n\nimport { CLAUDE_DIR, CLI_COLORS, MAX_CONFIG_FILE_SIZE } from \"../consts\";\nimport { fileExists, readFileSafe } from \"../utils/fs\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema, warnUnknownFields } from \"./schemas\";\n\ntype PermissionConfig = {\n allow?: string[];\n deny?: string[];\n};\n\ntype SettingsFile = {\n permissions?: PermissionConfig;\n};\n\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.json\");\n const localSettingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.local.json\");\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);\n const raw = JSON.parse(content);\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n // Known Claude CLI settings.json fields (permissions is ours; the rest are managed by Claude CLI)\n const EXPECTED_SETTINGS_KEYS = [\n \"permissions\",\n \"enabledPlugins\",\n \"env\",\n \"allowedTools\",\n \"customInstructions\",\n \"defaultModel\",\n ] as const;\n warnUnknownFields(\n raw as Record<string, unknown>,\n EXPECTED_SETTINGS_KEYS,\n `settings file '${filePath}'`,\n );\n }\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? (result.data as SettingsFile) : {};\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {\n warn(`Malformed settings file at '${filePath}' — skipping`);\n }\n }\n }\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Notice\n </Text>\n <Text>No permissions configured in .claude/settings.json</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to .claude/settings.json:</Text>\n <Text> </Text>\n <Text color=\"dim\">{\"{\"}</Text>\n <Text color=\"dim\">{' \"permissions\": {'}</Text>\n <Text color=\"dim\">{' \"allow\": ['}</Text>\n <Text color=\"dim\">{' \"Read(*)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(git *)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(bun *)\"'}</Text>\n <Text color=\"dim\">{\" ]\"}</Text>\n <Text color=\"dim\">{\" }\"}</Text>\n <Text color=\"dim\">{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":"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","names":["Box","Text","path","jsx","jsxs","Box","Text","path","result"]}
@@ -0,0 +1,253 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ FRAMEWORK_CATEGORY
4
+ } from "./chunk-Q3YMO5YG.js";
5
+ import {
6
+ SKILLS,
7
+ TEST_CATEGORIES,
8
+ createMockCategory,
9
+ createMockCompileConfig,
10
+ createMockMatrix,
11
+ createMockMatrixConfig,
12
+ createMockSkill
13
+ } from "./chunk-WWHDP5CP.js";
14
+ import {
15
+ init_esm_shims
16
+ } from "./chunk-DHET7RCE.js";
17
+
18
+ // src/cli/lib/__tests__/mock-data/mock-matrices.ts
19
+ init_esm_shims();
20
+ var EMPTY_MATRIX = createMockMatrix();
21
+ var SINGLE_REACT_MATRIX = createMockMatrix(SKILLS.react);
22
+ var WEB_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand);
23
+ var FULLSTACK_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono);
24
+ var WEB_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.vitest);
25
+ var FULLSTACK_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, SKILLS.vitest);
26
+ var VITEST_REACT_HONO_MATRIX = createMockMatrix(SKILLS.vitest, SKILLS.react, SKILLS.hono);
27
+ var REACT_SCSS_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss);
28
+ var REACT_SCSS_HONO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss, SKILLS.hono);
29
+ var SCSS_HONO_REACT_MATRIX = createMockMatrix(SKILLS.scss, SKILLS.hono, SKILLS.react);
30
+ var HONO_REACT_MATRIX = createMockMatrix(SKILLS.hono, SKILLS.react);
31
+ var REACT_ZUSTAND_HONO_MATRIX = createMockMatrix(
32
+ SKILLS.react,
33
+ SKILLS.zustand,
34
+ SKILLS.hono
35
+ );
36
+ var ALL_SKILLS_TEST_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {
37
+ categories: TEST_CATEGORIES
38
+ });
39
+ var ALL_SKILLS_WEB_FRAMEWORK_MATRIX = createMockMatrix(...Object.values(SKILLS), {
40
+ categories: {
41
+ "web-framework": { domain: "web" }
42
+ }
43
+ });
44
+ var ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {
45
+ categories: {
46
+ "web-framework": { domain: "web" },
47
+ "web-client-state": { domain: "web" }
48
+ }
49
+ });
50
+ var ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {
51
+ categories: {
52
+ "web-framework": { domain: "web" },
53
+ "web-client-state": { domain: "web" },
54
+ "api-api": { domain: "api" }
55
+ }
56
+ });
57
+ var ALL_SKILLS_WEB_AND_API_MATRIX = createMockMatrix(...Object.values(SKILLS), {
58
+ categories: {
59
+ "web-framework": { domain: "web" },
60
+ "api-api": { domain: "api" }
61
+ }
62
+ });
63
+ var ALL_SKILLS_METHODOLOGY_MATRIX = createMockMatrix(...Object.values(SKILLS), {
64
+ categories: {
65
+ "shared-methodology": { domain: "shared" }
66
+ }
67
+ });
68
+ var ALL_SKILLS_METHODOLOGY_BARE_MATRIX = createMockMatrix(...Object.values(SKILLS), {
69
+ categories: {
70
+ "shared-methodology": {}
71
+ }
72
+ });
73
+ var ALL_SKILLS_MULTI_DOMAIN_MATRIX = createMockMatrix(...Object.values(SKILLS), {
74
+ categories: {
75
+ "web-framework": { domain: "web" },
76
+ "shared-methodology": { domain: "shared" },
77
+ "api-api": { domain: "api" }
78
+ }
79
+ });
80
+ var REACT_HONO_FRAMEWORK_API_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, {
81
+ categories: {
82
+ "web-framework": TEST_CATEGORIES.framework,
83
+ "api-api": TEST_CATEGORIES.api
84
+ }
85
+ });
86
+ var MERGE_BASIC_MATRIX = createMockMatrixConfig({ "web-framework": FRAMEWORK_CATEGORY });
87
+ var CONFLICT_MATRIX = createMockMatrixConfig(
88
+ {},
89
+ {
90
+ relationships: {
91
+ conflicts: [{ skills: ["react", "vue-composition-api"], reason: "Pick one framework" }]
92
+ }
93
+ }
94
+ );
95
+ var ALTERNATIVES_MATRIX = createMockMatrixConfig(
96
+ {},
97
+ {
98
+ relationships: {
99
+ alternatives: [
100
+ {
101
+ purpose: "State management",
102
+ skills: ["zustand", "jotai"]
103
+ }
104
+ ]
105
+ }
106
+ }
107
+ );
108
+ var REQUIRES_MATRIX = createMockMatrixConfig(
109
+ {},
110
+ {
111
+ relationships: {
112
+ requires: [
113
+ {
114
+ skill: "zustand",
115
+ needs: ["react"],
116
+ reason: "Zustand needs React"
117
+ }
118
+ ]
119
+ }
120
+ }
121
+ );
122
+ var LOCAL_SKILL_MATRIX = createMockMatrix(
123
+ createMockSkill("web-local-skill", {
124
+ local: true,
125
+ localPath: ".claude/skills/my-local-skill/"
126
+ })
127
+ );
128
+ var MIXED_LOCAL_REMOTE_MATRIX = createMockMatrix(
129
+ SKILLS.react,
130
+ createMockSkill("meta-company-patterns", {
131
+ local: true,
132
+ localPath: ".claude/skills/company-patterns/"
133
+ })
134
+ );
135
+ var METHODOLOGY_MATRIX = createMockMatrix(SKILLS.antiOverEng);
136
+ var VITEST_MATRIX = createMockMatrix(SKILLS.vitest);
137
+ var WEB_AND_API_COMPILE_CONFIG = createMockCompileConfig({
138
+ "web-developer": {},
139
+ "api-developer": {}
140
+ });
141
+ var WEB_ONLY_COMPILE_CONFIG = createMockCompileConfig({
142
+ "web-developer": {}
143
+ });
144
+ var TOOLING_AND_FRAMEWORK_CONFIG = createMockMatrixConfig({
145
+ "shared-tooling": {
146
+ ...TEST_CATEGORIES.tooling,
147
+ description: "Development tooling and infrastructure",
148
+ domain: "shared",
149
+ exclusive: false,
150
+ order: 20
151
+ },
152
+ "web-framework": {
153
+ ...TEST_CATEGORIES.framework,
154
+ description: "UI Framework",
155
+ required: true,
156
+ order: 1
157
+ }
158
+ });
159
+ var CI_CD_CONFIG = createMockMatrixConfig({
160
+ "shared-ci-cd": createMockCategory("shared-ci-cd", "CI/CD", {
161
+ description: "Continuous integration and deployment",
162
+ domain: "shared",
163
+ exclusive: true,
164
+ required: false,
165
+ order: 30
166
+ })
167
+ });
168
+ var FRAMEWORK_AND_STYLING_CONFIG = createMockMatrixConfig(
169
+ {
170
+ "web-framework": {
171
+ ...TEST_CATEGORIES.framework,
172
+ description: "UI Framework",
173
+ required: true,
174
+ order: 1
175
+ },
176
+ "web-styling": {
177
+ ...TEST_CATEGORIES.styling,
178
+ description: "CSS approach",
179
+ exclusive: false,
180
+ order: 2
181
+ }
182
+ },
183
+ {
184
+ relationships: {
185
+ discourages: [
186
+ {
187
+ skills: ["react", "scss-modules"],
188
+ reason: "These tools have conflicting design philosophies"
189
+ }
190
+ ],
191
+ recommends: [
192
+ {
193
+ skill: "vue-composition-api",
194
+ reason: "These work great together"
195
+ }
196
+ ]
197
+ }
198
+ }
199
+ );
200
+ var OBSERVABILITY_CONFIG = createMockMatrixConfig({
201
+ "api-observability": createMockCategory("api-observability", "Observability", {
202
+ description: "Monitoring and observability tools",
203
+ domain: "api",
204
+ exclusive: false,
205
+ required: false,
206
+ order: 15
207
+ })
208
+ });
209
+ var FRAMEWORK_AND_TESTING_CONFIG = createMockMatrixConfig(
210
+ {
211
+ "web-framework": {
212
+ ...TEST_CATEGORIES.framework,
213
+ description: "UI Framework",
214
+ required: true,
215
+ order: 1
216
+ },
217
+ "web-testing": {
218
+ ...TEST_CATEGORIES.testing,
219
+ description: "Testing tools",
220
+ domain: "shared",
221
+ exclusive: false,
222
+ order: 10
223
+ }
224
+ },
225
+ {
226
+ relationships: {
227
+ requires: [
228
+ {
229
+ skill: "vitest",
230
+ needs: ["react"],
231
+ reason: "RTL requires React to function"
232
+ }
233
+ ]
234
+ }
235
+ }
236
+ );
237
+
238
+ export {
239
+ EMPTY_MATRIX,
240
+ SINGLE_REACT_MATRIX,
241
+ WEB_PAIR_MATRIX,
242
+ WEB_TRIO_MATRIX,
243
+ ALL_SKILLS_TEST_CATEGORIES_MATRIX,
244
+ ALL_SKILLS_WEB_FRAMEWORK_MATRIX,
245
+ ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX,
246
+ ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX,
247
+ ALL_SKILLS_WEB_AND_API_MATRIX,
248
+ ALL_SKILLS_METHODOLOGY_MATRIX,
249
+ ALL_SKILLS_METHODOLOGY_BARE_MATRIX,
250
+ ALL_SKILLS_MULTI_DOMAIN_MATRIX,
251
+ REACT_HONO_FRAMEWORK_API_MATRIX
252
+ };
253
+ //# sourceMappingURL=chunk-D7FEORKC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/__tests__/mock-data/mock-matrices.ts"],"sourcesContent":["// Shared matrix configs and compile configs for test files.\n// Uses createMockMatrixConfig/createMockCompileConfig from helpers.ts.\n\nimport {\n createMockMatrixConfig,\n createMockCompileConfig,\n createMockCategory,\n createMockMatrix,\n createMockSkill,\n} from \"../helpers.js\";\nimport { SKILLS, TEST_CATEGORIES } from \"../test-fixtures.js\";\nimport { FRAMEWORK_CATEGORY } from \"./mock-categories.js\";\nimport type { Category, CategoryDefinition } from \"../../../types\";\n\n// ---------------------------------------------------------------------------\n// Canonical matrix shapes — use these instead of inline createMockMatrix() calls\n// ---------------------------------------------------------------------------\n\nexport const EMPTY_MATRIX = createMockMatrix();\nexport const SINGLE_REACT_MATRIX = createMockMatrix(SKILLS.react);\nexport const WEB_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand);\nexport const FULLSTACK_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono);\nexport const WEB_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.vitest);\nexport const FULLSTACK_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, SKILLS.vitest);\nexport const VITEST_REACT_HONO_MATRIX = createMockMatrix(SKILLS.vitest, SKILLS.react, SKILLS.hono);\nexport const REACT_SCSS_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss);\nexport const REACT_SCSS_HONO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss, SKILLS.hono);\nexport const SCSS_HONO_REACT_MATRIX = createMockMatrix(SKILLS.scss, SKILLS.hono, SKILLS.react);\nexport const HONO_REACT_MATRIX = createMockMatrix(SKILLS.hono, SKILLS.react);\nexport const REACT_ZUSTAND_HONO_MATRIX = createMockMatrix(\n SKILLS.react,\n SKILLS.zustand,\n SKILLS.hono,\n);\n\n// ---------------------------------------------------------------------------\n// All-skills matrices with category overrides — for wizard store tests\n// ---------------------------------------------------------------------------\n\nexport const ALL_SKILLS_TEST_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: TEST_CATEGORIES as unknown as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_FRAMEWORK_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"web-client-state\": { domain: \"web\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"web-client-state\": { domain: \"web\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_AND_API_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_METHODOLOGY_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"shared-methodology\": { domain: \"shared\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_METHODOLOGY_BARE_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"shared-methodology\": {},\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_MULTI_DOMAIN_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"shared-methodology\": { domain: \"shared\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const REACT_HONO_FRAMEWORK_API_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"api-api\": TEST_CATEGORIES.api,\n } as Record<Category, CategoryDefinition>,\n});\n\n// ---------------------------------------------------------------------------\n// Matrix configs from matrix-loader.test.ts\n// ---------------------------------------------------------------------------\n\nexport const MERGE_BASIC_MATRIX = createMockMatrixConfig({ \"web-framework\": FRAMEWORK_CATEGORY });\n\nexport const CONFLICT_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n conflicts: [{ skills: [\"react\", \"vue-composition-api\"], reason: \"Pick one framework\" }],\n },\n },\n);\n\nexport const ALTERNATIVES_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n alternatives: [\n {\n purpose: \"State management\",\n skills: [\"zustand\", \"jotai\"],\n },\n ],\n },\n },\n);\n\nexport const REQUIRES_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n requires: [\n {\n skill: \"zustand\",\n needs: [\"react\"],\n reason: \"Zustand needs React\",\n },\n ],\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// MergedSkillsMatrix instances from config-generator.test.ts\n// ---------------------------------------------------------------------------\n\nexport const LOCAL_SKILL_MATRIX = createMockMatrix(\n createMockSkill(\"web-local-skill\", {\n local: true,\n localPath: \".claude/skills/my-local-skill/\",\n }),\n);\n\nexport const MIXED_LOCAL_REMOTE_MATRIX = createMockMatrix(\n SKILLS.react,\n createMockSkill(\"meta-company-patterns\", {\n local: true,\n localPath: \".claude/skills/company-patterns/\",\n }),\n);\n\nexport const METHODOLOGY_MATRIX = createMockMatrix(SKILLS.antiOverEng);\n\nexport const VITEST_MATRIX = createMockMatrix(SKILLS.vitest);\n\n// ---------------------------------------------------------------------------\n// Compile configs from resolver.test.ts\n// ---------------------------------------------------------------------------\n\nexport const WEB_AND_API_COMPILE_CONFIG = createMockCompileConfig({\n \"web-developer\": {},\n \"api-developer\": {},\n});\n\nexport const WEB_ONLY_COMPILE_CONFIG = createMockCompileConfig({\n \"web-developer\": {},\n});\n\n// ---------------------------------------------------------------------------\n// Matrix configs from consumer-stacks-matrix.integration.test.ts\n// ---------------------------------------------------------------------------\n\nexport const TOOLING_AND_FRAMEWORK_CONFIG = createMockMatrixConfig({\n \"shared-tooling\": {\n ...TEST_CATEGORIES.tooling,\n description: \"Development tooling and infrastructure\",\n domain: \"shared\" as const,\n exclusive: false,\n order: 20,\n },\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n});\n\nexport const CI_CD_CONFIG = createMockMatrixConfig({\n \"shared-ci-cd\": createMockCategory(\"shared-ci-cd\", \"CI/CD\", {\n description: \"Continuous integration and deployment\",\n domain: \"shared\",\n exclusive: true,\n required: false,\n order: 30,\n }),\n});\n\nexport const FRAMEWORK_AND_STYLING_CONFIG = createMockMatrixConfig(\n {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n \"web-styling\": {\n ...TEST_CATEGORIES.styling,\n description: \"CSS approach\",\n exclusive: false,\n order: 2,\n },\n },\n {\n relationships: {\n discourages: [\n {\n skills: [\"react\", \"scss-modules\"],\n reason: \"These tools have conflicting design philosophies\",\n },\n ],\n recommends: [\n {\n skill: \"vue-composition-api\",\n reason: \"These work great together\",\n },\n ],\n },\n },\n);\n\nexport const OBSERVABILITY_CONFIG = createMockMatrixConfig({\n \"api-observability\": createMockCategory(\"api-observability\", \"Observability\", {\n description: \"Monitoring and observability tools\",\n domain: \"api\",\n exclusive: false,\n required: false,\n order: 15,\n }),\n});\n\nexport const FRAMEWORK_AND_TESTING_CONFIG = createMockMatrixConfig(\n {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n description: \"Testing tools\",\n domain: \"shared\" as const,\n exclusive: false,\n order: 10,\n },\n },\n {\n relationships: {\n requires: [\n {\n skill: \"vitest\",\n needs: [\"react\"],\n reason: \"RTL requires React to function\",\n },\n ],\n },\n },\n);\n"],"mappings":"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","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  skillFrontmatterLoaderSchema,
10
10
  verbose,
11
11
  warn
12
- } from "./chunk-R3AR4VLZ.js";
12
+ } from "./chunk-ZEJIEC2A.js";
13
13
  import {
14
14
  CLAUDE_SRC_DIR,
15
15
  DIRS,
@@ -198,4 +198,4 @@ export {
198
198
  loadSkillsByIds,
199
199
  loadPluginSkills
200
200
  };
201
- //# sourceMappingURL=chunk-L6MTIQ2U.js.map
201
+ //# sourceMappingURL=chunk-F43WGOGN.js.map