@agents-inc/cli 0.86.0 → 0.88.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 (129) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{chunk-GED2F75H.js → chunk-23M3SPXX.js} +180 -124
  3. package/dist/chunk-23M3SPXX.js.map +1 -0
  4. package/dist/{chunk-ZOWRO7UQ.js → chunk-2DRPZXXK.js} +3 -3
  5. package/dist/{chunk-5M6Q5UQO.js → chunk-57KI55GJ.js} +2 -2
  6. package/dist/{chunk-HH3AWXF4.js → chunk-5IYZGJDW.js} +3 -3
  7. package/dist/{chunk-Q4DMIPZB.js → chunk-6YR2NEW3.js} +2 -2
  8. package/dist/{chunk-HU6XQVZL.js → chunk-AP4DLJDP.js} +1 -1
  9. package/dist/{chunk-HU6XQVZL.js.map → chunk-AP4DLJDP.js.map} +1 -1
  10. package/dist/{chunk-SGZOFIFF.js → chunk-ATPHV3MD.js} +2 -2
  11. package/dist/{chunk-HSLVCKVQ.js → chunk-DDCW4SKN.js} +3 -3
  12. package/dist/{chunk-TMTUTUEV.js → chunk-EADZIYQW.js} +12 -7
  13. package/dist/chunk-EADZIYQW.js.map +1 -0
  14. package/dist/{chunk-BV2MIQ3O.js → chunk-I5AZKNNL.js} +1 -1
  15. package/dist/chunk-I5AZKNNL.js.map +1 -0
  16. package/dist/{chunk-HZ2IBXVQ.js → chunk-ITBSJNIC.js} +3 -3
  17. package/dist/chunk-J6PI73YV.js +68 -0
  18. package/dist/chunk-J6PI73YV.js.map +1 -0
  19. package/dist/{chunk-BEFYAFGV.js → chunk-JNUFQBXX.js} +2 -2
  20. package/dist/chunk-LHUK5L6P.js +564 -0
  21. package/dist/chunk-LHUK5L6P.js.map +1 -0
  22. package/dist/{chunk-LZ7XQ3IU.js → chunk-MY4TVLRB.js} +2 -2
  23. package/dist/{chunk-I44YG6VI.js → chunk-PZBLGD7O.js} +5 -19
  24. package/dist/chunk-PZBLGD7O.js.map +1 -0
  25. package/dist/{chunk-HZQOFFKA.js → chunk-REZZSDXG.js} +10 -10
  26. package/dist/{chunk-O27WJ5KS.js → chunk-RWVF6DQE.js} +3 -3
  27. package/dist/{chunk-B6MYECV6.js → chunk-STMRDPGZ.js} +2 -2
  28. package/dist/{chunk-MMTMXLI4.js → chunk-TAPEVEET.js} +2 -2
  29. package/dist/{chunk-CXWBVBDM.js → chunk-VWTZOBBQ.js} +2 -2
  30. package/dist/{chunk-UNEJKTLP.js → chunk-WTPPVXJP.js} +3 -3
  31. package/dist/{chunk-FBZR46GC.js → chunk-YM3V4Q3W.js} +4 -4
  32. package/dist/{chunk-C5IYJ42F.js → chunk-ZFQTKY2S.js} +2 -2
  33. package/dist/{chunk-NUU3U43A.js → chunk-ZTRQO5CX.js} +2 -2
  34. package/dist/chunk-ZTRQO5CX.js.map +1 -0
  35. package/dist/commands/build/marketplace.js +3 -3
  36. package/dist/commands/build/plugins.js +5 -5
  37. package/dist/commands/build/stack.js +5 -5
  38. package/dist/commands/compile.js +31 -25
  39. package/dist/commands/compile.js.map +1 -1
  40. package/dist/commands/config/index.js +5 -5
  41. package/dist/commands/config/path.js +4 -4
  42. package/dist/commands/config/show.js +5 -5
  43. package/dist/commands/diff.js +685 -86
  44. package/dist/commands/diff.js.map +1 -1
  45. package/dist/commands/doctor.js +35 -63
  46. package/dist/commands/doctor.js.map +1 -1
  47. package/dist/commands/edit.js +180 -48
  48. package/dist/commands/edit.js.map +1 -1
  49. package/dist/commands/eject.js +182 -32
  50. package/dist/commands/eject.js.map +1 -1
  51. package/dist/commands/import/skill.js +200 -36
  52. package/dist/commands/import/skill.js.map +1 -1
  53. package/dist/commands/info.js +46 -39
  54. package/dist/commands/info.js.map +1 -1
  55. package/dist/commands/init.js +19 -22
  56. package/dist/commands/list.js +4 -4
  57. package/dist/commands/new/agent.js +144 -48
  58. package/dist/commands/new/agent.js.map +1 -1
  59. package/dist/commands/new/marketplace.js +9 -9
  60. package/dist/commands/new/marketplace.js.map +1 -1
  61. package/dist/commands/new/skill.js +198 -34
  62. package/dist/commands/new/skill.js.map +1 -1
  63. package/dist/commands/outdated.js +6 -8
  64. package/dist/commands/outdated.js.map +1 -1
  65. package/dist/commands/search.js +165 -68
  66. package/dist/commands/search.js.map +1 -1
  67. package/dist/commands/uninstall.js +263 -65
  68. package/dist/commands/uninstall.js.map +1 -1
  69. package/dist/commands/update.js +236 -167
  70. package/dist/commands/update.js.map +1 -1
  71. package/dist/commands/validate.js +4 -4
  72. package/dist/components/skill-search/skill-search.js +1 -1
  73. package/dist/components/wizard/category-grid.test.js +7 -7
  74. package/dist/components/wizard/domain-selection.js +5 -5
  75. package/dist/components/wizard/help-modal.js +5 -5
  76. package/dist/components/wizard/source-grid.test.js +7 -7
  77. package/dist/components/wizard/stack-selection.js +5 -5
  78. package/dist/components/wizard/step-agents.js +5 -5
  79. package/dist/components/wizard/step-agents.test.js +8 -8
  80. package/dist/components/wizard/step-build.js +5 -5
  81. package/dist/components/wizard/step-build.test.js +7 -7
  82. package/dist/components/wizard/step-confirm.test.js +5 -5
  83. package/dist/components/wizard/step-settings.js +4 -4
  84. package/dist/components/wizard/step-settings.test.js +7 -7
  85. package/dist/components/wizard/step-sources.js +5 -5
  86. package/dist/components/wizard/step-sources.test.js +8 -8
  87. package/dist/components/wizard/step-stack.js +6 -6
  88. package/dist/components/wizard/step-stack.test.js +7 -7
  89. package/dist/components/wizard/wizard-layout.js +6 -6
  90. package/dist/components/wizard/wizard.js +14 -14
  91. package/dist/hooks/init.js +18 -20
  92. package/dist/hooks/init.js.map +1 -1
  93. package/dist/{loader-GSEGPK64.js → loader-SQOK2BF7.js} +3 -3
  94. package/dist/{source-loader-OGFTIRIX.js → source-loader-CCECAU5L.js} +4 -4
  95. package/dist/{source-manager-FMMDDVZA.js → source-manager-4P7MTZRR.js} +4 -4
  96. package/dist/stores/wizard-store.js +4 -4
  97. package/dist/stores/wizard-store.test.js +7 -7
  98. package/package.json +1 -1
  99. package/dist/chunk-BV2MIQ3O.js.map +0 -1
  100. package/dist/chunk-DCVCFBQ7.js +0 -1800
  101. package/dist/chunk-DCVCFBQ7.js.map +0 -1
  102. package/dist/chunk-GED2F75H.js.map +0 -1
  103. package/dist/chunk-I44YG6VI.js.map +0 -1
  104. package/dist/chunk-NUU3U43A.js.map +0 -1
  105. package/dist/chunk-O5ZWS26C.js +0 -166
  106. package/dist/chunk-O5ZWS26C.js.map +0 -1
  107. package/dist/chunk-TMTUTUEV.js.map +0 -1
  108. package/dist/chunk-XQK4S22C.js +0 -202
  109. package/dist/chunk-XQK4S22C.js.map +0 -1
  110. /package/dist/{chunk-ZOWRO7UQ.js.map → chunk-2DRPZXXK.js.map} +0 -0
  111. /package/dist/{chunk-5M6Q5UQO.js.map → chunk-57KI55GJ.js.map} +0 -0
  112. /package/dist/{chunk-HH3AWXF4.js.map → chunk-5IYZGJDW.js.map} +0 -0
  113. /package/dist/{chunk-Q4DMIPZB.js.map → chunk-6YR2NEW3.js.map} +0 -0
  114. /package/dist/{chunk-SGZOFIFF.js.map → chunk-ATPHV3MD.js.map} +0 -0
  115. /package/dist/{chunk-HSLVCKVQ.js.map → chunk-DDCW4SKN.js.map} +0 -0
  116. /package/dist/{chunk-HZ2IBXVQ.js.map → chunk-ITBSJNIC.js.map} +0 -0
  117. /package/dist/{chunk-BEFYAFGV.js.map → chunk-JNUFQBXX.js.map} +0 -0
  118. /package/dist/{chunk-LZ7XQ3IU.js.map → chunk-MY4TVLRB.js.map} +0 -0
  119. /package/dist/{chunk-HZQOFFKA.js.map → chunk-REZZSDXG.js.map} +0 -0
  120. /package/dist/{chunk-O27WJ5KS.js.map → chunk-RWVF6DQE.js.map} +0 -0
  121. /package/dist/{chunk-B6MYECV6.js.map → chunk-STMRDPGZ.js.map} +0 -0
  122. /package/dist/{chunk-MMTMXLI4.js.map → chunk-TAPEVEET.js.map} +0 -0
  123. /package/dist/{chunk-CXWBVBDM.js.map → chunk-VWTZOBBQ.js.map} +0 -0
  124. /package/dist/{chunk-UNEJKTLP.js.map → chunk-WTPPVXJP.js.map} +0 -0
  125. /package/dist/{chunk-FBZR46GC.js.map → chunk-YM3V4Q3W.js.map} +0 -0
  126. /package/dist/{chunk-C5IYJ42F.js.map → chunk-ZFQTKY2S.js.map} +0 -0
  127. /package/dist/{loader-GSEGPK64.js.map → loader-SQOK2BF7.js.map} +0 -0
  128. /package/dist/{source-loader-OGFTIRIX.js.map → source-loader-CCECAU5L.js.map} +0 -0
  129. /package/dist/{source-manager-FMMDDVZA.js.map → source-manager-4P7MTZRR.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,26 @@ Each release has detailed notes in its own file under [`changelogs/`](./changelo
7
7
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
8
8
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
+ ## [0.88.0] - 2026-03-26
11
+
12
+ **Plugin category separation — category belongs in metadata, not manifests**
13
+
14
+ - Removed `category` from `PluginManifest` — plugin.json doesn't carry skill metadata (D-149)
15
+ - Removed all category inference from names — categories come from `metadata.yaml`
16
+ - Removed unnecessary test mocks in plugin test files (D-148)
17
+
18
+ See [changelogs/0.88.0.md](./changelogs/0.88.0.md) for full details.
19
+
20
+ ## [0.87.0] - 2026-03-26
21
+
22
+ **Declarative commands, operation dissolution, global skill discovery fix**
23
+
24
+ - 14 commands restructured with declarative two-tier pattern — `run()` reads like pseudocode
25
+ - 12 single-use operations dissolved back into their respective commands; operations layer trimmed to 17 shared files
26
+ - Fix: init/edit/update now discover all skills (global + project) before compiling agents
27
+
28
+ See [changelogs/0.87.0.md](./changelogs/0.87.0.md) for full details.
29
+
10
30
  ## [0.86.0] - 2026-03-26
11
31
 
12
32
  **Operations layer — composable building blocks for all CLI commands**
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "./chunk-HZQOFFKA.js";
4
+ } from "./chunk-REZZSDXG.js";
5
5
  import {
6
6
  SelectList
7
7
  } from "./chunk-XO6X5QE5.js";
@@ -17,27 +17,29 @@ import {
17
17
  import {
18
18
  compileAgents,
19
19
  copyLocalSkills,
20
+ discoverInstalledSkills,
20
21
  ensureMarketplace,
21
- getDashboardData,
22
22
  installPluginSkills,
23
23
  loadAgentDefs,
24
24
  loadSource,
25
25
  writeProjectConfig
26
- } from "./chunk-DCVCFBQ7.js";
26
+ } from "./chunk-LHUK5L6P.js";
27
27
  import {
28
28
  buildAgentScopeMap,
29
29
  deriveInstallMode,
30
30
  detectProjectInstallation,
31
31
  ensureBlankGlobalConfig,
32
+ getInstallationInfo,
33
+ loadProjectConfig,
32
34
  resolveInstallPaths
33
- } from "./chunk-TMTUTUEV.js";
35
+ } from "./chunk-EADZIYQW.js";
34
36
  import {
35
37
  getSkillById
36
38
  } from "./chunk-ANXHMG32.js";
37
39
  import {
38
40
  BaseCommand,
39
41
  EXIT_CODES
40
- } from "./chunk-MMTMXLI4.js";
42
+ } from "./chunk-TAPEVEET.js";
41
43
  import {
42
44
  fileExists,
43
45
  getErrorMessage,
@@ -45,7 +47,7 @@ import {
45
47
  settingsFileSchema,
46
48
  warn,
47
49
  warnUnknownFields
48
- } from "./chunk-NUU3U43A.js";
50
+ } from "./chunk-ZTRQO5CX.js";
49
51
  import {
50
52
  ASCII_LOGO,
51
53
  CLAUDE_DIR,
@@ -251,14 +253,26 @@ var Init = class _Init extends BaseCommand {
251
253
  async run() {
252
254
  const { flags } = await this.parse(_Init);
253
255
  const projectDir = process.cwd();
256
+ if (await this.showDashboardIfInitialized(projectDir)) return;
257
+ await this.ensureGlobalConfig(projectDir);
258
+ const { sourceResult, startupMessages } = await this.loadSourceOrFail(flags);
259
+ const result = await this.runWizard(sourceResult, startupMessages, projectDir);
260
+ if (!result) this.exit(EXIT_CODES.CANCELLED);
261
+ if (result.skills.length === 0) {
262
+ this.error("No skills selected", { exit: EXIT_CODES.ERROR });
263
+ }
264
+ await this.handleInstallation(result, sourceResult, flags);
265
+ }
266
+ async showDashboardIfInitialized(projectDir) {
254
267
  const existingInstallation = await detectProjectInstallation(projectDir);
255
- if (existingInstallation) {
256
- const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));
257
- if (selectedCommand) {
258
- await this.config.runCommand(selectedCommand);
259
- }
260
- return;
268
+ if (!existingInstallation) return false;
269
+ const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));
270
+ if (selectedCommand) {
271
+ await this.config.runCommand(selectedCommand);
261
272
  }
273
+ return true;
274
+ }
275
+ async ensureGlobalConfig(projectDir) {
262
276
  const isGlobalRoot = fs.realpathSync(projectDir) === fs.realpathSync(GLOBAL_INSTALL_ROOT);
263
277
  if (!isGlobalRoot) {
264
278
  const created = await ensureBlankGlobalConfig();
@@ -266,22 +280,23 @@ var Init = class _Init extends BaseCommand {
266
280
  this.log("Created blank global config at ~/" + CLAUDE_SRC_DIR);
267
281
  }
268
282
  }
269
- let sourceResult;
270
- let startupMessages = [];
283
+ }
284
+ async loadSourceOrFail(flags) {
271
285
  try {
272
286
  const loaded = await loadSource({
273
287
  sourceFlag: flags.source,
274
- projectDir,
288
+ projectDir: process.cwd(),
275
289
  forceRefresh: flags.refresh,
276
290
  captureStartupMessages: true
277
291
  });
278
- sourceResult = loaded.sourceResult;
279
- startupMessages = loaded.startupMessages;
292
+ return { sourceResult: loaded.sourceResult, startupMessages: loaded.startupMessages };
280
293
  } catch (error) {
281
294
  this.error(getErrorMessage(error), {
282
295
  exit: EXIT_CODES.ERROR
283
296
  });
284
297
  }
298
+ }
299
+ async runWizard(sourceResult, startupMessages, projectDir) {
285
300
  let wizardResult = null;
286
301
  const { waitUntilExit } = render(
287
302
  /* @__PURE__ */ jsx2(
@@ -302,140 +317,181 @@ var Init = class _Init extends BaseCommand {
302
317
  );
303
318
  await waitUntilExit();
304
319
  const result = wizardResult;
305
- if (!result || result.cancelled) {
306
- this.exit(EXIT_CODES.CANCELLED);
307
- }
308
- if (result.skills.length === 0) {
309
- this.error("No skills selected", { exit: EXIT_CODES.ERROR });
310
- }
311
- await this.handleInstallation(result, sourceResult, flags);
320
+ if (result?.cancelled) return null;
321
+ return result;
312
322
  }
313
323
  async handleInstallation(result, sourceResult, flags) {
314
324
  const projectDir = process.cwd();
315
325
  let installMode = deriveInstallMode(result.skills);
316
326
  const localSkills = result.skills.filter((s) => s.source === "local");
317
327
  const pluginSkills = result.skills.filter((s) => s.source !== "local");
328
+ this.logInstallPlan(result, installMode, localSkills, pluginSkills);
329
+ let copiedSkills = [...localSkills];
330
+ let pluginModeSucceeded = false;
331
+ if (installMode === "local" || installMode === "mixed") {
332
+ await this.copyLocalSkillsStep(localSkills, projectDir, sourceResult, installMode);
333
+ }
334
+ if (installMode === "plugin" || installMode === "mixed") {
335
+ const pluginStepResult = await this.installPluginsStep(
336
+ pluginSkills,
337
+ sourceResult,
338
+ projectDir,
339
+ installMode,
340
+ copiedSkills,
341
+ result.skills
342
+ );
343
+ copiedSkills = pluginStepResult.copiedSkills;
344
+ installMode = pluginStepResult.installMode;
345
+ pluginModeSucceeded = pluginStepResult.succeeded;
346
+ }
347
+ try {
348
+ const { configResult, compileResult, projectPaths } = await this.writeConfigAndCompile(
349
+ result,
350
+ sourceResult,
351
+ flags,
352
+ installMode
353
+ );
354
+ this.reportSuccess(
355
+ configResult,
356
+ compileResult,
357
+ projectPaths,
358
+ installMode,
359
+ pluginModeSucceeded,
360
+ copiedSkills
361
+ );
362
+ const permissionWarning = await checkPermissions(projectDir);
363
+ if (permissionWarning) {
364
+ const { waitUntilExit } = render(permissionWarning);
365
+ await waitUntilExit();
366
+ }
367
+ } catch (error) {
368
+ this.handleError(error);
369
+ }
370
+ }
371
+ logInstallPlan(result, installMode, localSkills, pluginSkills) {
318
372
  this.log("\n");
319
373
  this.log(`Selected ${result.skills.length} skills`);
320
374
  this.log(
321
375
  `Install mode: ${installMode === "plugin" ? "Plugin (native install)" : installMode === "mixed" ? `Mixed (${localSkills.length} local, ${pluginSkills.length} plugin)` : "Local (copy to .claude/skills/)"}`
322
376
  );
323
- let copiedSkills = [];
324
- if (installMode === "local" || installMode === "mixed") {
325
- this.log("Copying skills to local directory...");
326
- const copyResult = await copyLocalSkills(localSkills, projectDir, sourceResult);
327
- copiedSkills = localSkills;
328
- if (installMode === "mixed") {
329
- if (copyResult.projectCopied.length > 0 && copyResult.globalCopied.length > 0) {
330
- this.log(
331
- `Copied ${copyResult.totalCopied} local skills (${copyResult.projectCopied.length} project, ${copyResult.globalCopied.length} global)`
332
- );
333
- } else if (copyResult.globalCopied.length > 0) {
334
- this.log(`Copied ${copyResult.globalCopied.length} local skills to ~/.claude/skills/`);
335
- } else {
336
- this.log(`Copied ${copyResult.projectCopied.length} local skills to .claude/skills/`);
337
- }
377
+ }
378
+ async copyLocalSkillsStep(localSkills, projectDir, sourceResult, installMode) {
379
+ this.log("Copying skills to local directory...");
380
+ const copyResult = await copyLocalSkills(localSkills, projectDir, sourceResult);
381
+ if (installMode === "mixed") {
382
+ if (copyResult.projectCopied.length > 0 && copyResult.globalCopied.length > 0) {
383
+ this.log(
384
+ `Copied ${copyResult.totalCopied} local skills (${copyResult.projectCopied.length} project, ${copyResult.globalCopied.length} global)`
385
+ );
386
+ } else if (copyResult.globalCopied.length > 0) {
387
+ this.log(`Copied ${copyResult.globalCopied.length} local skills to ~/.claude/skills/`);
338
388
  } else {
339
- this.log(`Copied ${copyResult.totalCopied} skills to .claude/skills/
340
- `);
389
+ this.log(`Copied ${copyResult.projectCopied.length} local skills to .claude/skills/`);
341
390
  }
342
- }
343
- let pluginModeSucceeded = false;
344
- if (installMode === "plugin" || installMode === "mixed") {
345
- const mpResult = await ensureMarketplace(sourceResult);
346
- if (!mpResult.marketplace) {
347
- this.warn("Could not resolve marketplace. Falling back to Local Mode...");
348
- const fallbackSkills = installMode === "mixed" ? pluginSkills : result.skills;
349
- const fallbackCopyResult = await copyLocalSkills(fallbackSkills, projectDir, sourceResult);
350
- copiedSkills = [...copiedSkills, ...fallbackSkills];
351
- installMode = "local";
352
- this.log(`Copied ${fallbackCopyResult.totalCopied} skills to .claude/skills/
391
+ } else {
392
+ this.log(`Copied ${copyResult.totalCopied} skills to .claude/skills/
353
393
  `);
354
- } else {
355
- if (mpResult.registered) {
356
- this.log(`Registering marketplace "${mpResult.marketplace}"...`);
357
- }
358
- this.log("Installing skill plugins...");
359
- const pluginResult = await installPluginSkills(
360
- pluginSkills,
361
- mpResult.marketplace,
362
- projectDir
363
- );
364
- for (const item of pluginResult.installed) {
365
- this.log(` Installed ${item.ref}`);
366
- }
367
- for (const item of pluginResult.failed) {
368
- this.warn(`Failed to install plugin ${item.id}: ${item.error}`);
369
- }
370
- this.log(`Installed ${pluginResult.installed.length} skill plugins
394
+ }
395
+ }
396
+ async installPluginsStep(pluginSkills, sourceResult, projectDir, installMode, copiedSkills, allSkills) {
397
+ const mpResult = await ensureMarketplace(sourceResult);
398
+ if (!mpResult.marketplace) {
399
+ this.warn("Could not resolve marketplace. Falling back to Local Mode...");
400
+ const fallbackSkills = installMode === "mixed" ? pluginSkills : allSkills;
401
+ const fallbackCopyResult = await copyLocalSkills(fallbackSkills, projectDir, sourceResult);
402
+ this.log(`Copied ${fallbackCopyResult.totalCopied} skills to .claude/skills/
371
403
  `);
372
- pluginModeSucceeded = true;
373
- }
404
+ return {
405
+ copiedSkills: [...copiedSkills, ...fallbackSkills],
406
+ installMode: "local",
407
+ succeeded: false
408
+ };
409
+ }
410
+ if (mpResult.registered) {
411
+ this.log(`Registering marketplace "${mpResult.marketplace}"...`);
412
+ }
413
+ this.log("Installing skill plugins...");
414
+ const pluginResult = await installPluginSkills(pluginSkills, mpResult.marketplace, projectDir);
415
+ for (const item of pluginResult.installed) {
416
+ this.log(` Installed ${item.ref}`);
417
+ }
418
+ for (const item of pluginResult.failed) {
419
+ this.warn(`Failed to install plugin ${item.id}: ${item.error}`);
374
420
  }
421
+ this.log(`Installed ${pluginResult.installed.length} skill plugins
422
+ `);
423
+ return { copiedSkills, installMode, succeeded: true };
424
+ }
425
+ async writeConfigAndCompile(result, sourceResult, flags, installMode) {
375
426
  this.log("Generating configuration...");
376
- try {
377
- const configResult = await writeProjectConfig({
378
- wizardResult: result,
379
- sourceResult,
380
- projectDir,
381
- sourceFlag: flags.source
382
- });
383
- if (configResult.wasMerged) {
384
- this.log(`Merged with existing config at ${configResult.existingConfigPath}`);
385
- }
386
- this.log(`Configuration saved (${configResult.config.agents.length} agents)
427
+ const configResult = await writeProjectConfig({
428
+ wizardResult: result,
429
+ sourceResult,
430
+ projectDir: process.cwd(),
431
+ sourceFlag: flags.source
432
+ });
433
+ if (configResult.wasMerged) {
434
+ this.log(`Merged with existing config at ${configResult.existingConfigPath}`);
435
+ }
436
+ this.log(`Configuration saved (${configResult.config.agents.length} agents)
387
437
  `);
388
- this.log(STATUS_MESSAGES.COMPILING_AGENTS);
389
- const projectPaths = resolveInstallPaths(projectDir, "project");
390
- const agentDefs = await loadAgentDefs();
391
- const compileResult = await compileAgents({
392
- projectDir,
393
- sourcePath: agentDefs.sourcePath,
394
- installMode,
395
- agentScopeMap: buildAgentScopeMap(configResult.config),
396
- outputDir: projectPaths.agentsDir
397
- });
398
- this.log(`Compiled ${compileResult.compiled.length} agents to .claude/agents/
438
+ this.log(STATUS_MESSAGES.COMPILING_AGENTS);
439
+ const projectPaths = resolveInstallPaths(process.cwd(), "project");
440
+ const agentDefs = await loadAgentDefs();
441
+ const { allSkills } = await discoverInstalledSkills(process.cwd());
442
+ const compileResult = await compileAgents({
443
+ projectDir: process.cwd(),
444
+ sourcePath: agentDefs.sourcePath,
445
+ skills: allSkills,
446
+ installMode,
447
+ agentScopeMap: buildAgentScopeMap(configResult.config),
448
+ outputDir: projectPaths.agentsDir
449
+ });
450
+ this.log(`Compiled ${compileResult.compiled.length} agents to .claude/agents/
399
451
  `);
400
- this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}
452
+ return { configResult, compileResult, projectPaths };
453
+ }
454
+ reportSuccess(configResult, compileResult, projectPaths, installMode, pluginModeSucceeded, copiedSkills) {
455
+ this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}
401
456
  `);
402
- const isLocalOutput = installMode === "local" || installMode === "mixed" && !pluginModeSucceeded;
403
- if (isLocalOutput && copiedSkills.length > 0) {
404
- this.log("Skills copied to:");
405
- this.log(` ${projectPaths.skillsDir}`);
406
- for (const skill of copiedSkills) {
407
- const displayName = getSkillById(skill.id).displayName;
408
- this.log(` ${displayName}/`);
409
- }
410
- this.log("");
457
+ const isLocalOutput = installMode === "local" || installMode === "mixed" && !pluginModeSucceeded;
458
+ if (isLocalOutput && copiedSkills.length > 0) {
459
+ this.log("Skills copied to:");
460
+ this.log(` ${projectPaths.skillsDir}`);
461
+ for (const skill of copiedSkills) {
462
+ const displayName = getSkillById(skill.id).displayName;
463
+ this.log(` ${displayName}/`);
411
464
  }
412
- this.log("Agents compiled to:");
413
- this.log(` ${projectPaths.agentsDir}`);
414
- for (const agentName of compileResult.compiled) {
415
- this.log(` ${agentName}.md`);
416
- }
417
- this.log("");
418
- this.log("Configuration:");
419
- this.log(` ${configResult.configPath}`);
420
465
  this.log("");
421
- this.log("To customize agent-skill assignments:");
422
- this.log(` 1. Edit .claude-src/config.ts`);
423
- this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);
424
- this.log("");
425
- const permissionWarning = await checkPermissions(projectDir);
426
- if (permissionWarning) {
427
- const { waitUntilExit } = render(permissionWarning);
428
- await waitUntilExit();
429
- }
430
- } catch (error) {
431
- this.handleError(error);
432
466
  }
467
+ this.log("Agents compiled to:");
468
+ this.log(` ${projectPaths.agentsDir}`);
469
+ for (const agentName of compileResult.compiled) {
470
+ this.log(` ${agentName}.md`);
471
+ }
472
+ this.log("");
473
+ this.log("Configuration:");
474
+ this.log(` ${configResult.configPath}`);
475
+ this.log("");
476
+ this.log("To customize agent-skill assignments:");
477
+ this.log(` 1. Edit .claude-src/config.ts`);
478
+ this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);
479
+ this.log("");
433
480
  }
434
481
  };
482
+ async function getDashboardData(projectDir) {
483
+ const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);
484
+ const skillCount = loaded?.config?.skills?.length ?? 0;
485
+ const agentCount = info?.agentCount ?? 0;
486
+ const mode = info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : "local");
487
+ const source = loaded?.config?.source;
488
+ return { skillCount, agentCount, mode, source };
489
+ }
435
490
 
436
491
  export {
437
492
  formatDashboardText,
438
493
  showDashboard,
439
- Init
494
+ Init,
495
+ getDashboardData
440
496
  };
441
- //# sourceMappingURL=chunk-GED2F75H.js.map
497
+ //# sourceMappingURL=chunk-23M3SPXX.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 fs from \"fs\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { type SourceLoadResult } from \"../lib/loading/index.js\";\nimport {\n loadSource,\n loadAgentDefs,\n copyLocalSkills,\n ensureMarketplace,\n installPluginSkills,\n writeProjectConfig,\n compileAgents,\n discoverInstalledSkills,\n} from \"../lib/operations/index.js\";\nimport { getInstallationInfo } from \"../lib/plugins/plugin-info.js\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport {\n type InstallMode,\n detectProjectInstallation,\n deriveInstallMode,\n resolveInstallPaths,\n buildAgentScopeMap,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.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 { getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { type StartupMessage } 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\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\" : data.mode === \"mixed\" ? \"Mixed\" : \"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 if (await this.showDashboardIfInitialized(projectDir)) return;\n await this.ensureGlobalConfig(projectDir);\n\n const { sourceResult, startupMessages } = await this.loadSourceOrFail(flags);\n const result = await this.runWizard(sourceResult, startupMessages, projectDir);\n if (!result) this.exit(EXIT_CODES.CANCELLED);\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 showDashboardIfInitialized(projectDir: string): Promise<boolean> {\n const existingInstallation = await detectProjectInstallation(projectDir);\n if (!existingInstallation) return false;\n\n const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return true;\n }\n\n private async ensureGlobalConfig(projectDir: string): Promise<void> {\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 // Resolve both paths through realpathSync — on macOS /var is a symlink to\n // /private/var, so os.homedir() and process.cwd() can return different\n // prefixes for the same directory.\n const isGlobalRoot = fs.realpathSync(projectDir) === fs.realpathSync(GLOBAL_INSTALL_ROOT);\n if (!isGlobalRoot) {\n const created = await ensureBlankGlobalConfig();\n if (created) {\n this.log(\"Created blank global config at ~/\" + CLAUDE_SRC_DIR);\n }\n }\n }\n\n private async loadSourceOrFail(flags: {\n source?: string;\n refresh: boolean;\n }): Promise<{ sourceResult: SourceLoadResult; startupMessages: StartupMessage[] }> {\n try {\n const loaded = await loadSource({\n sourceFlag: flags.source,\n projectDir: process.cwd(),\n forceRefresh: flags.refresh,\n captureStartupMessages: true,\n });\n return { sourceResult: loaded.sourceResult, startupMessages: loaded.startupMessages };\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n private async runWizard(\n sourceResult: SourceLoadResult,\n startupMessages: StartupMessage[],\n projectDir: string,\n ): Promise<WizardResultV2 | null> {\n let wizardResult: WizardResultV2 | null = null;\n\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n logo={ASCII_LOGO}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // TypeScript can't track that onComplete callback mutates wizardResult before waitUntilExit resolves\n const result = wizardResult as WizardResultV2 | null;\n if (result?.cancelled) return null;\n return result;\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 let installMode = deriveInstallMode(result.skills);\n const localSkills = result.skills.filter((s) => s.source === \"local\");\n const pluginSkills = result.skills.filter((s) => s.source !== \"local\");\n\n this.logInstallPlan(result, installMode, localSkills, pluginSkills);\n\n let copiedSkills = [...localSkills];\n let pluginModeSucceeded = false;\n\n if (installMode === \"local\" || installMode === \"mixed\") {\n await this.copyLocalSkillsStep(localSkills, projectDir, sourceResult, installMode);\n }\n\n if (installMode === \"plugin\" || installMode === \"mixed\") {\n const pluginStepResult = await this.installPluginsStep(\n pluginSkills,\n sourceResult,\n projectDir,\n installMode,\n copiedSkills,\n result.skills,\n );\n copiedSkills = pluginStepResult.copiedSkills;\n installMode = pluginStepResult.installMode;\n pluginModeSucceeded = pluginStepResult.succeeded;\n }\n\n try {\n const { configResult, compileResult, projectPaths } = await this.writeConfigAndCompile(\n result,\n sourceResult,\n flags,\n installMode,\n );\n this.reportSuccess(\n configResult,\n compileResult,\n projectPaths,\n installMode,\n pluginModeSucceeded,\n copiedSkills,\n );\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 logInstallPlan(\n result: WizardResultV2,\n installMode: InstallMode,\n localSkills: WizardResultV2[\"skills\"],\n pluginSkills: WizardResultV2[\"skills\"],\n ): void {\n this.log(\"\\n\");\n this.log(`Selected ${result.skills.length} skills`);\n this.log(\n `Install mode: ${\n installMode === \"plugin\"\n ? \"Plugin (native install)\"\n : installMode === \"mixed\"\n ? `Mixed (${localSkills.length} local, ${pluginSkills.length} plugin)`\n : \"Local (copy to .claude/skills/)\"\n }`,\n );\n }\n\n private async copyLocalSkillsStep(\n localSkills: WizardResultV2[\"skills\"],\n projectDir: string,\n sourceResult: SourceLoadResult,\n installMode: InstallMode,\n ): Promise<void> {\n this.log(\"Copying skills to local directory...\");\n const copyResult = await copyLocalSkills(localSkills, projectDir, sourceResult);\n\n if (installMode === \"mixed\") {\n if (copyResult.projectCopied.length > 0 && copyResult.globalCopied.length > 0) {\n this.log(\n `Copied ${copyResult.totalCopied} local skills (${copyResult.projectCopied.length} project, ${copyResult.globalCopied.length} global)`,\n );\n } else if (copyResult.globalCopied.length > 0) {\n this.log(`Copied ${copyResult.globalCopied.length} local skills to ~/.claude/skills/`);\n } else {\n this.log(`Copied ${copyResult.projectCopied.length} local skills to .claude/skills/`);\n }\n } else {\n this.log(`Copied ${copyResult.totalCopied} skills to .claude/skills/\\n`);\n }\n }\n\n private async installPluginsStep(\n pluginSkills: WizardResultV2[\"skills\"],\n sourceResult: SourceLoadResult,\n projectDir: string,\n installMode: InstallMode,\n copiedSkills: WizardResultV2[\"skills\"],\n allSkills: WizardResultV2[\"skills\"],\n ): Promise<{\n copiedSkills: WizardResultV2[\"skills\"];\n installMode: InstallMode;\n succeeded: boolean;\n }> {\n const mpResult = await ensureMarketplace(sourceResult);\n\n if (!mpResult.marketplace) {\n this.warn(\"Could not resolve marketplace. Falling back to Local Mode...\");\n // Marketplace unavailable — copy all plugin-intended skills locally as fallback.\n // In \"mixed\" mode, localSkills were already copied; only copy plugin-intended skills.\n // In \"plugin\" mode, no skills were copied yet; copy all skills.\n const fallbackSkills = installMode === \"mixed\" ? pluginSkills : allSkills;\n const fallbackCopyResult = await copyLocalSkills(fallbackSkills, projectDir, sourceResult);\n this.log(`Copied ${fallbackCopyResult.totalCopied} skills to .claude/skills/\\n`);\n return {\n copiedSkills: [...copiedSkills, ...fallbackSkills],\n installMode: \"local\",\n succeeded: false,\n };\n }\n\n if (mpResult.registered) {\n this.log(`Registering marketplace \"${mpResult.marketplace}\"...`);\n }\n\n this.log(\"Installing skill plugins...\");\n const pluginResult = await installPluginSkills(pluginSkills, mpResult.marketplace, projectDir);\n\n for (const item of pluginResult.installed) {\n this.log(` Installed ${item.ref}`);\n }\n for (const item of pluginResult.failed) {\n this.warn(`Failed to install plugin ${item.id}: ${item.error}`);\n }\n\n this.log(`Installed ${pluginResult.installed.length} skill plugins\\n`);\n return { copiedSkills, installMode, succeeded: true };\n }\n\n private async writeConfigAndCompile(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n installMode: InstallMode,\n ): Promise<{\n configResult: Awaited<ReturnType<typeof writeProjectConfig>>;\n compileResult: Awaited<ReturnType<typeof compileAgents>>;\n projectPaths: ReturnType<typeof resolveInstallPaths>;\n }> {\n this.log(\"Generating configuration...\");\n const configResult = await writeProjectConfig({\n wizardResult: result,\n sourceResult,\n projectDir: process.cwd(),\n sourceFlag: flags.source,\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.existingConfigPath}`);\n }\n\n this.log(`Configuration saved (${configResult.config.agents.length} agents)\\n`);\n\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n const projectPaths = resolveInstallPaths(process.cwd(), \"project\");\n const agentDefs = await loadAgentDefs();\n const { allSkills } = await discoverInstalledSkills(process.cwd());\n const compileResult = await compileAgents({\n projectDir: process.cwd(),\n sourcePath: agentDefs.sourcePath,\n skills: allSkills,\n installMode,\n agentScopeMap: buildAgentScopeMap(configResult.config),\n outputDir: projectPaths.agentsDir,\n });\n this.log(`Compiled ${compileResult.compiled.length} agents to .claude/agents/\\n`);\n\n return { configResult, compileResult, projectPaths };\n }\n\n private reportSuccess(\n configResult: Awaited<ReturnType<typeof writeProjectConfig>>,\n compileResult: Awaited<ReturnType<typeof compileAgents>>,\n projectPaths: ReturnType<typeof resolveInstallPaths>,\n installMode: InstallMode,\n pluginModeSucceeded: boolean,\n copiedSkills: WizardResultV2[\"skills\"],\n ): void {\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n\n const isLocalOutput =\n installMode === \"local\" || (installMode === \"mixed\" && !pluginModeSucceeded);\n if (isLocalOutput && copiedSkills.length > 0) {\n this.log(\"Skills copied to:\");\n this.log(` ${projectPaths.skillsDir}`);\n for (const skill of copiedSkills) {\n const displayName = getSkillById(skill.id).displayName;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n }\n this.log(\"Agents compiled to:\");\n this.log(` ${projectPaths.agentsDir}`);\n for (const agentName of compileResult.compiled) {\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}\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 const skillCount = loaded?.config?.skills?.length ?? 0;\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","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","jsx","jsxs","Box","Text","result"]}
@@ -24,11 +24,11 @@ import {
24
24
  addSource,
25
25
  getSourceSummary,
26
26
  removeSource
27
- } from "./chunk-TMTUTUEV.js";
27
+ } from "./chunk-EADZIYQW.js";
28
28
  import {
29
29
  getErrorMessage,
30
30
  verbose
31
- } from "./chunk-NUU3U43A.js";
31
+ } from "./chunk-ZTRQO5CX.js";
32
32
  import {
33
33
  CLI_COLORS
34
34
  } from "./chunk-6PGL2XMY.js";
@@ -263,4 +263,4 @@ var StepSettings = ({
263
263
  export {
264
264
  StepSettings
265
265
  };
266
- //# sourceMappingURL=chunk-ZOWRO7UQ.js.map
266
+ //# sourceMappingURL=chunk-2DRPZXXK.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-4QA5TIBU.js";
8
8
  import {
9
9
  useWizardStore
10
- } from "./chunk-HSLVCKVQ.js";
10
+ } from "./chunk-DDCW4SKN.js";
11
11
  import {
12
12
  matrix
13
13
  } from "./chunk-ANXHMG32.js";
@@ -191,4 +191,4 @@ var StackSelection = ({ onCancel }) => {
191
191
  export {
192
192
  StackSelection
193
193
  };
194
- //# sourceMappingURL=chunk-5M6Q5UQO.js.map
194
+ //# sourceMappingURL=chunk-57KI55GJ.js.map
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-CKZ65VFJ.js";
14
14
  import {
15
15
  useWizardStore
16
- } from "./chunk-HSLVCKVQ.js";
16
+ } from "./chunk-DDCW4SKN.js";
17
17
  import {
18
18
  HOTKEY_SET_ALL_LOCAL,
19
19
  HOTKEY_SET_ALL_PLUGIN,
@@ -22,7 +22,7 @@ import {
22
22
  import {
23
23
  resolveAllSources,
24
24
  searchExtraSources
25
- } from "./chunk-TMTUTUEV.js";
25
+ } from "./chunk-EADZIYQW.js";
26
26
  import {
27
27
  CLI_COLORS,
28
28
  DEFAULT_BRANDING
@@ -168,4 +168,4 @@ var StepSources = ({ projectDir, onContinue, onBack }) => {
168
168
  export {
169
169
  StepSources
170
170
  };
171
- //# sourceMappingURL=chunk-HH3AWXF4.js.map
171
+ //# sourceMappingURL=chunk-5IYZGJDW.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  StackSelection
4
- } from "./chunk-5M6Q5UQO.js";
4
+ } from "./chunk-57KI55GJ.js";
5
5
  import {
6
6
  useMeasuredHeight
7
7
  } from "./chunk-K77I4XGL.js";
@@ -21,4 +21,4 @@ var StepStack = ({ onCancel }) => {
21
21
  export {
22
22
  StepStack
23
23
  };
24
- //# sourceMappingURL=chunk-Q4DMIPZB.js.map
24
+ //# sourceMappingURL=chunk-6YR2NEW3.js.map
@@ -362,4 +362,4 @@ export {
362
362
  createMockCompileConfig,
363
363
  testSkillToResolvedSkill
364
364
  };
365
- //# sourceMappingURL=chunk-HU6XQVZL.js.map
365
+ //# sourceMappingURL=chunk-AP4DLJDP.js.map