@agents-inc/cli 0.45.0 → 0.46.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 (164) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{chunk-NTPHCNJO.js → chunk-3WKFSTG6.js} +2 -2
  3. package/dist/{chunk-ELRGSZHZ.js → chunk-4C7PDDLY.js} +5 -5
  4. package/dist/{chunk-HKRLWERR.js → chunk-5M6JI76P.js} +2 -2
  5. package/dist/{chunk-473YHDYQ.js → chunk-5QRJUBK7.js} +131 -45
  6. package/dist/chunk-5QRJUBK7.js.map +1 -0
  7. package/dist/{chunk-KVHLKPYB.js → chunk-72GS6PIH.js} +7 -7
  8. package/dist/{chunk-FVN5PFFY.js → chunk-74HSA7C4.js} +3 -1
  9. package/dist/chunk-74HSA7C4.js.map +1 -0
  10. package/dist/chunk-7LDSHHKN.js +132 -0
  11. package/dist/chunk-7LDSHHKN.js.map +1 -0
  12. package/dist/{chunk-F3O5YHSI.js → chunk-C7BO2ASM.js} +2 -2
  13. package/dist/{chunk-ABE55TEU.js → chunk-CD64ZNYI.js} +2 -2
  14. package/dist/chunk-CDGHSTB6.js +69 -0
  15. package/dist/chunk-CDGHSTB6.js.map +1 -0
  16. package/dist/{chunk-Q5BSIARS.js → chunk-CTQHZELA.js} +15 -15
  17. package/dist/chunk-CTQHZELA.js.map +1 -0
  18. package/dist/{chunk-OALQWRLG.js → chunk-D7JTL3DJ.js} +2 -2
  19. package/dist/{chunk-KWWLPPHF.js → chunk-DO5OZHSS.js} +2 -2
  20. package/dist/{chunk-DAVOSI4M.js → chunk-FKBCYT7B.js} +5 -5
  21. package/dist/{chunk-VTDEENSP.js → chunk-FUEZQ2H6.js} +5 -5
  22. package/dist/{chunk-VTDEENSP.js.map → chunk-FUEZQ2H6.js.map} +1 -1
  23. package/dist/{chunk-V43QDMYQ.js → chunk-G2WNOT3R.js} +2 -2
  24. package/dist/{chunk-M3AGB4TR.js → chunk-GVLYNP2I.js} +4 -4
  25. package/dist/{chunk-WWSKP5SR.js → chunk-HM3DHMW7.js} +70 -24
  26. package/dist/chunk-HM3DHMW7.js.map +1 -0
  27. package/dist/{chunk-ENWMWIHP.js → chunk-I26YP2Q3.js} +5 -12
  28. package/dist/chunk-I26YP2Q3.js.map +1 -0
  29. package/dist/{chunk-KZNPPUQG.js → chunk-J64CA4V6.js} +5 -3
  30. package/dist/chunk-J64CA4V6.js.map +1 -0
  31. package/dist/{chunk-YQFU2KZ5.js → chunk-KWQ2BQXF.js} +3 -3
  32. package/dist/{chunk-SRFNNOLC.js → chunk-LFZXMQOH.js} +2 -2
  33. package/dist/{chunk-ARET3NYO.js → chunk-NMXNHRAK.js} +3 -3
  34. package/dist/{chunk-GUIRWCKI.js → chunk-ODQ2BKWU.js} +3 -3
  35. package/dist/{chunk-SYGEV3KV.js → chunk-PZLUO4OY.js} +4 -4
  36. package/dist/{chunk-CLHBKFHU.js → chunk-QBUOZVNZ.js} +2 -2
  37. package/dist/{chunk-ZECXM7LP.js → chunk-RT6IBH37.js} +3524 -3502
  38. package/dist/chunk-RT6IBH37.js.map +1 -0
  39. package/dist/{chunk-YRVTXSXP.js → chunk-RWR56UVK.js} +3 -18
  40. package/dist/chunk-RWR56UVK.js.map +1 -0
  41. package/dist/{chunk-OLZBZAW4.js → chunk-SGXUMZWL.js} +2 -2
  42. package/dist/{chunk-3S4GIO4B.js → chunk-TOWP4T5L.js} +2 -2
  43. package/dist/{chunk-FYNMNY4P.js → chunk-UK3AMBR7.js} +17 -11
  44. package/dist/chunk-UK3AMBR7.js.map +1 -0
  45. package/dist/{chunk-M2XPTQDT.js → chunk-VH3PI43B.js} +4 -4
  46. package/dist/{chunk-3JRWNWBF.js → chunk-XE6RTHUD.js} +2 -3
  47. package/dist/{chunk-3JRWNWBF.js.map → chunk-XE6RTHUD.js.map} +1 -1
  48. package/dist/{chunk-KCYNTAAF.js → chunk-YT7UHV67.js} +8 -8
  49. package/dist/{chunk-SBWMSNS2.js → chunk-YVMYQSED.js} +2 -2
  50. package/dist/commands/build/marketplace.js +12 -126
  51. package/dist/commands/build/marketplace.js.map +1 -1
  52. package/dist/commands/build/plugins.js +5 -5
  53. package/dist/commands/build/stack.js +5 -5
  54. package/dist/commands/compile.js +6 -6
  55. package/dist/commands/config/get.js +4 -4
  56. package/dist/commands/config/index.js +5 -5
  57. package/dist/commands/config/path.js +4 -4
  58. package/dist/commands/config/set-project.js +4 -4
  59. package/dist/commands/config/show.js +5 -5
  60. package/dist/commands/config/unset-project.js +4 -4
  61. package/dist/commands/diff.js +4 -4
  62. package/dist/commands/doctor.js +4 -4
  63. package/dist/commands/edit.js +29 -29
  64. package/dist/commands/eject.js +19 -23
  65. package/dist/commands/eject.js.map +1 -1
  66. package/dist/commands/import/skill.js +5 -5
  67. package/dist/commands/info.js +5 -5
  68. package/dist/commands/init.js +30 -29
  69. package/dist/commands/init.js.map +1 -1
  70. package/dist/commands/list.js +4 -4
  71. package/dist/commands/new/agent.js +52 -38
  72. package/dist/commands/new/agent.js.map +1 -1
  73. package/dist/commands/new/marketplace.js +252 -0
  74. package/dist/commands/new/marketplace.js.map +1 -0
  75. package/dist/commands/new/skill.js +30 -14
  76. package/dist/commands/new/skill.js.map +1 -1
  77. package/dist/commands/outdated.js +4 -4
  78. package/dist/commands/search.js +7 -7
  79. package/dist/commands/uninstall.js +6 -6
  80. package/dist/commands/update.js +6 -6
  81. package/dist/commands/validate.js +5 -5
  82. package/dist/components/skill-search/skill-search.js +3 -3
  83. package/dist/components/wizard/category-grid.js +2 -2
  84. package/dist/components/wizard/category-grid.test.js +2 -2
  85. package/dist/components/wizard/checkbox-grid.js +3 -3
  86. package/dist/components/wizard/checkbox-grid.test.js +3 -3
  87. package/dist/components/wizard/domain-selection.js +9 -8
  88. package/dist/components/wizard/help-modal.js +2 -2
  89. package/dist/components/wizard/menu-item.js +1 -1
  90. package/dist/components/wizard/search-modal.js +2 -2
  91. package/dist/components/wizard/search-modal.test.js +2 -2
  92. package/dist/components/wizard/section-progress.js +2 -2
  93. package/dist/components/wizard/section-progress.test.js +2 -2
  94. package/dist/components/wizard/selection-card.js +2 -2
  95. package/dist/components/wizard/source-grid.js +3 -3
  96. package/dist/components/wizard/source-grid.test.js +3 -3
  97. package/dist/components/wizard/stack-selection.js +8 -9
  98. package/dist/components/wizard/step-agents.js +8 -7
  99. package/dist/components/wizard/step-agents.test.js +25 -20
  100. package/dist/components/wizard/step-agents.test.js.map +1 -1
  101. package/dist/components/wizard/step-build.js +8 -8
  102. package/dist/components/wizard/step-build.test.js +10 -10
  103. package/dist/components/wizard/step-confirm.js +4 -4
  104. package/dist/components/wizard/step-confirm.test.js +8 -8
  105. package/dist/components/wizard/step-refine.js +2 -2
  106. package/dist/components/wizard/step-refine.test.js +2 -2
  107. package/dist/components/wizard/step-settings.js +5 -5
  108. package/dist/components/wizard/step-settings.test.js +8 -8
  109. package/dist/components/wizard/step-sources.js +10 -10
  110. package/dist/components/wizard/step-sources.test.js +11 -11
  111. package/dist/components/wizard/step-stack.js +12 -12
  112. package/dist/components/wizard/step-stack.test.js +27 -15
  113. package/dist/components/wizard/step-stack.test.js.map +1 -1
  114. package/dist/components/wizard/view-title.js +2 -2
  115. package/dist/components/wizard/wizard-layout.js +8 -8
  116. package/dist/components/wizard/wizard-tabs.js +2 -2
  117. package/dist/components/wizard/wizard-tabs.test.js +2 -2
  118. package/dist/components/wizard/wizard.js +25 -25
  119. package/dist/hooks/init.js +3 -5
  120. package/dist/hooks/init.js.map +1 -1
  121. package/dist/{source-manager-HXFXBZJU.js → source-manager-6QZ2GDUA.js} +4 -4
  122. package/dist/stores/wizard-store.js +5 -5
  123. package/dist/stores/wizard-store.test.js +6 -6
  124. package/package.json +1 -1
  125. package/src/schemas/agent.schema.json +3 -0
  126. package/src/schemas/metadata.schema.json +4 -41
  127. package/src/schemas/project-config.schema.json +8 -4
  128. package/src/schemas/skills-matrix.schema.json +11 -298
  129. package/src/schemas/stacks.schema.json +2 -4
  130. package/dist/chunk-473YHDYQ.js.map +0 -1
  131. package/dist/chunk-5BDYODWP.js +0 -45
  132. package/dist/chunk-5BDYODWP.js.map +0 -1
  133. package/dist/chunk-ENWMWIHP.js.map +0 -1
  134. package/dist/chunk-FVN5PFFY.js.map +0 -1
  135. package/dist/chunk-FYNMNY4P.js.map +0 -1
  136. package/dist/chunk-KZNPPUQG.js.map +0 -1
  137. package/dist/chunk-Q5BSIARS.js.map +0 -1
  138. package/dist/chunk-WWSKP5SR.js.map +0 -1
  139. package/dist/chunk-YRVTXSXP.js.map +0 -1
  140. package/dist/chunk-ZECXM7LP.js.map +0 -1
  141. package/dist/cli/defaults/agent-mappings.yaml +0 -215
  142. /package/dist/{chunk-NTPHCNJO.js.map → chunk-3WKFSTG6.js.map} +0 -0
  143. /package/dist/{chunk-ELRGSZHZ.js.map → chunk-4C7PDDLY.js.map} +0 -0
  144. /package/dist/{chunk-HKRLWERR.js.map → chunk-5M6JI76P.js.map} +0 -0
  145. /package/dist/{chunk-KVHLKPYB.js.map → chunk-72GS6PIH.js.map} +0 -0
  146. /package/dist/{chunk-F3O5YHSI.js.map → chunk-C7BO2ASM.js.map} +0 -0
  147. /package/dist/{chunk-ABE55TEU.js.map → chunk-CD64ZNYI.js.map} +0 -0
  148. /package/dist/{chunk-OALQWRLG.js.map → chunk-D7JTL3DJ.js.map} +0 -0
  149. /package/dist/{chunk-KWWLPPHF.js.map → chunk-DO5OZHSS.js.map} +0 -0
  150. /package/dist/{chunk-DAVOSI4M.js.map → chunk-FKBCYT7B.js.map} +0 -0
  151. /package/dist/{chunk-V43QDMYQ.js.map → chunk-G2WNOT3R.js.map} +0 -0
  152. /package/dist/{chunk-M3AGB4TR.js.map → chunk-GVLYNP2I.js.map} +0 -0
  153. /package/dist/{chunk-YQFU2KZ5.js.map → chunk-KWQ2BQXF.js.map} +0 -0
  154. /package/dist/{chunk-SRFNNOLC.js.map → chunk-LFZXMQOH.js.map} +0 -0
  155. /package/dist/{chunk-ARET3NYO.js.map → chunk-NMXNHRAK.js.map} +0 -0
  156. /package/dist/{chunk-GUIRWCKI.js.map → chunk-ODQ2BKWU.js.map} +0 -0
  157. /package/dist/{chunk-SYGEV3KV.js.map → chunk-PZLUO4OY.js.map} +0 -0
  158. /package/dist/{chunk-CLHBKFHU.js.map → chunk-QBUOZVNZ.js.map} +0 -0
  159. /package/dist/{chunk-OLZBZAW4.js.map → chunk-SGXUMZWL.js.map} +0 -0
  160. /package/dist/{chunk-3S4GIO4B.js.map → chunk-TOWP4T5L.js.map} +0 -0
  161. /package/dist/{chunk-M2XPTQDT.js.map → chunk-VH3PI43B.js.map} +0 -0
  162. /package/dist/{chunk-KCYNTAAF.js.map → chunk-YT7UHV67.js.map} +0 -0
  163. /package/dist/{chunk-SBWMSNS2.js.map → chunk-YVMYQSED.js.map} +0 -0
  164. /package/dist/{source-manager-HXFXBZJU.js.map → source-manager-6QZ2GDUA.js.map} +0 -0
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  BaseCommand,
4
4
  EXIT_CODES
5
- } from "../chunk-SRFNNOLC.js";
5
+ } from "../chunk-LFZXMQOH.js";
6
6
  import {
7
7
  copySkillsToLocalFlattened,
8
8
  loadProjectSourceConfig,
9
9
  loadSkillsMatrixFromSource,
10
10
  resolveSource,
11
11
  saveSourceToProjectConfig
12
- } from "../chunk-ZECXM7LP.js";
12
+ } from "../chunk-RT6IBH37.js";
13
13
  import {
14
14
  typedKeys
15
15
  } from "../chunk-T4EXUIBY.js";
@@ -20,7 +20,7 @@ import {
20
20
  fileExists,
21
21
  listDirectories,
22
22
  writeFile
23
- } from "../chunk-473YHDYQ.js";
23
+ } from "../chunk-5QRJUBK7.js";
24
24
  import {
25
25
  CLAUDE_SRC_DIR,
26
26
  DEFAULT_BRANDING,
@@ -29,7 +29,7 @@ import {
29
29
  PROJECT_ROOT,
30
30
  STANDARD_FILES,
31
31
  YAML_FORMATTING
32
- } from "../chunk-FVN5PFFY.js";
32
+ } from "../chunk-74HSA7C4.js";
33
33
  import {
34
34
  init_esm_shims
35
35
  } from "../chunk-DHET7RCE.js";
@@ -40,15 +40,19 @@ import { Args, Flags } from "@oclif/core";
40
40
  import path from "path";
41
41
  import os from "os";
42
42
  import { stringify as stringifyYaml } from "yaml";
43
- var EJECT_TYPES = ["agent-partials", "skills", "all"];
43
+ var EJECT_TYPES = ["agent-partials", "templates", "skills", "all"];
44
44
  var Eject = class _Eject extends BaseCommand {
45
- static summary = "Eject skills or agent partials for local customization";
46
- static description = "Copy agent partials or skills to your project for customization. Agent partials are always copied from the CLI. Skills are copied from the configured source (public marketplace by default).";
45
+ static summary = "Eject skills, agent partials, or templates for local customization";
46
+ static description = "Copy agent partials, templates, or skills to your project for customization. Agent partials and templates are always copied from the CLI. Skills are copied from the configured source (public marketplace by default).";
47
47
  static examples = [
48
48
  {
49
49
  description: "Eject agent partials for customization",
50
50
  command: "<%= config.bin %> <%= command.id %> agent-partials"
51
51
  },
52
+ {
53
+ description: "Eject only agent templates",
54
+ command: "<%= config.bin %> <%= command.id %> templates"
55
+ },
52
56
  {
53
57
  description: "Eject skills to local directory",
54
58
  command: "<%= config.bin %> <%= command.id %> skills"
@@ -60,15 +64,11 @@ var Eject = class _Eject extends BaseCommand {
60
64
  {
61
65
  description: "Eject to a custom output directory",
62
66
  command: "<%= config.bin %> <%= command.id %> skills -o ./custom-dir"
63
- },
64
- {
65
- description: "Eject only agent templates",
66
- command: "<%= config.bin %> <%= command.id %> agent-partials --templates"
67
67
  }
68
68
  ];
69
69
  static args = {
70
70
  type: Args.string({
71
- description: "What to eject: agent-partials, skills, all",
71
+ description: "What to eject: agent-partials, templates, skills, all",
72
72
  required: false,
73
73
  options: EJECT_TYPES
74
74
  })
@@ -87,18 +87,13 @@ var Eject = class _Eject extends BaseCommand {
87
87
  refresh: Flags.boolean({
88
88
  description: "Force refresh from remote source",
89
89
  default: false
90
- }),
91
- templates: Flags.boolean({
92
- char: "t",
93
- description: "Eject only agent templates (used with agent-partials)",
94
- default: false
95
90
  })
96
91
  };
97
92
  async run() {
98
93
  const { args, flags } = await this.parse(_Eject);
99
94
  const projectDir = process.cwd();
100
95
  if (!args.type) {
101
- this.error("Please specify what to eject: agent-partials, skills, or all", {
96
+ this.error("Please specify what to eject: agent-partials, templates, skills, or all", {
102
97
  exit: EXIT_CODES.INVALID_ARGS
103
98
  });
104
99
  }
@@ -127,9 +122,6 @@ var Eject = class _Eject extends BaseCommand {
127
122
  }
128
123
  const ejectType = args.type;
129
124
  const directOutput = !!flags.output;
130
- if (flags.templates && ejectType === "skills") {
131
- this.warn("The --templates flag only applies to agent-partials. Ignoring.");
132
- }
133
125
  let sourceResult;
134
126
  if (ejectType === "skills" || ejectType === "all") {
135
127
  sourceResult = await loadSkillsMatrixFromSource({
@@ -140,7 +132,10 @@ var Eject = class _Eject extends BaseCommand {
140
132
  }
141
133
  switch (ejectType) {
142
134
  case "agent-partials":
143
- await this.ejectAgentPartials(outputBase, flags.force, directOutput, flags.templates);
135
+ await this.ejectAgentPartials(outputBase, flags.force, directOutput, false);
136
+ break;
137
+ case "templates":
138
+ await this.ejectAgentPartials(outputBase, flags.force, directOutput, true);
144
139
  break;
145
140
  case "skills":
146
141
  await this.ejectSkills(
@@ -152,7 +147,8 @@ var Eject = class _Eject extends BaseCommand {
152
147
  );
153
148
  break;
154
149
  case "all":
155
- await this.ejectAgentPartials(outputBase, flags.force, directOutput, flags.templates);
150
+ await this.ejectAgentPartials(outputBase, flags.force, directOutput, false);
151
+ await this.ejectAgentPartials(outputBase, true, directOutput, true);
156
152
  await this.ejectSkills(
157
153
  projectDir,
158
154
  flags.force,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/eject.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport os from \"os\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport {\n copy,\n ensureDir,\n directoryExists,\n fileExists,\n listDirectories,\n writeFile,\n} from \"../utils/fs.js\";\nimport {\n CLAUDE_SRC_DIR,\n DEFAULT_BRANDING,\n DIRS,\n LOCAL_SKILLS_PATH,\n PROJECT_ROOT,\n STANDARD_FILES,\n YAML_FORMATTING,\n} from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { copySkillsToLocalFlattened } from \"../lib/skills/index.js\";\nimport type { SkillId } from \"../types/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\nimport {\n loadProjectSourceConfig,\n resolveSource,\n saveSourceToProjectConfig,\n} from \"../lib/configuration/index.js\";\n\nconst EJECT_TYPES = [\"agent-partials\", \"skills\", \"all\"] as const;\ntype EjectType = (typeof EJECT_TYPES)[number];\n\nexport default class Eject extends BaseCommand {\n static summary = \"Eject skills or agent partials for local customization\";\n static description =\n \"Copy agent partials or skills to your project for customization. \" +\n \"Agent partials are always copied from the CLI. \" +\n \"Skills are copied from the configured source (public marketplace by default).\";\n\n static examples = [\n {\n description: \"Eject agent partials for customization\",\n command: \"<%= config.bin %> <%= command.id %> agent-partials\",\n },\n {\n description: \"Eject skills to local directory\",\n command: \"<%= config.bin %> <%= command.id %> skills\",\n },\n {\n description: \"Eject everything with force overwrite\",\n command: \"<%= config.bin %> <%= command.id %> all --force\",\n },\n {\n description: \"Eject to a custom output directory\",\n command: \"<%= config.bin %> <%= command.id %> skills -o ./custom-dir\",\n },\n {\n description: \"Eject only agent templates\",\n command: \"<%= config.bin %> <%= command.id %> agent-partials --templates\",\n },\n ];\n\n static args = {\n type: Args.string({\n description: \"What to eject: agent-partials, skills, all\",\n required: false,\n options: EJECT_TYPES as unknown as string[],\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing files\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory (default: .claude/ in current directory)\",\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n templates: Flags.boolean({\n char: \"t\",\n description: \"Eject only agent templates (used with agent-partials)\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Eject);\n const projectDir = process.cwd();\n\n if (!args.type) {\n this.error(\"Please specify what to eject: agent-partials, skills, or all\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n if (!EJECT_TYPES.includes(args.type as EjectType)) {\n this.error(`Unknown eject type: ${args.type}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n let outputBase: string;\n if (flags.output) {\n const expandedPath = flags.output.startsWith(\"~\")\n ? path.join(os.homedir(), flags.output.slice(1))\n : flags.output;\n outputBase = path.resolve(projectDir, expandedPath);\n\n if (await fileExists(outputBase)) {\n this.error(`Output path exists as a file: ${outputBase}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n } else {\n outputBase = path.join(projectDir, CLAUDE_SRC_DIR);\n }\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Eject`);\n this.log(\"\");\n\n if (flags.output) {\n this.log(`Output directory: ${outputBase}`);\n }\n\n const ejectType = args.type as EjectType;\n const directOutput = !!flags.output;\n\n if (flags.templates && ejectType === \"skills\") {\n this.warn(\"The --templates flag only applies to agent-partials. Ignoring.\");\n }\n\n let sourceResult: SourceLoadResult | undefined;\n if (ejectType === \"skills\" || ejectType === \"all\") {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n }\n\n switch (ejectType) {\n case \"agent-partials\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput, flags.templates);\n break;\n case \"skills\":\n await this.ejectSkills(\n projectDir,\n flags.force,\n sourceResult!,\n directOutput,\n directOutput ? outputBase : undefined,\n );\n break;\n case \"all\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput, flags.templates);\n await this.ejectSkills(\n projectDir,\n flags.force,\n sourceResult!,\n directOutput,\n directOutput ? outputBase : undefined,\n );\n break;\n default:\n break;\n }\n\n if (flags.source) {\n await saveSourceToProjectConfig(projectDir, flags.source);\n this.log(`Source saved to .claude-src/config.yaml`);\n }\n\n await this.ensureMinimalConfig(projectDir, flags.source, sourceResult);\n\n this.log(\"\");\n this.logSuccess(\"Eject complete!\");\n this.log(\"\");\n }\n\n // Ensures a minimal config.yaml exists so `agentsinc compile` works after eject\n private async ensureMinimalConfig(\n projectDir: string,\n sourceFlag?: string,\n sourceResult?: SourceLoadResult,\n ): Promise<void> {\n const configPath = path.join(projectDir, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_YAML);\n\n if (await fileExists(configPath)) {\n return;\n }\n\n const projectName = path.basename(projectDir);\n\n const config: Record<string, unknown> = {\n name: projectName,\n installMode: \"local\",\n };\n\n const resolvedConfig =\n sourceResult?.sourceConfig ?? (await resolveSource(sourceFlag, projectDir));\n\n if (sourceFlag) {\n config.source = sourceFlag;\n } else if (resolvedConfig.source) {\n config.source = resolvedConfig.source;\n }\n\n if (resolvedConfig.marketplace) {\n config.marketplace = resolvedConfig.marketplace;\n }\n\n const existingProjectConfig = await loadProjectSourceConfig(projectDir);\n if (existingProjectConfig?.author) {\n config.author = existingProjectConfig.author;\n }\n if (existingProjectConfig?.agentsSource) {\n config.agentsSource = existingProjectConfig.agentsSource;\n }\n\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n\n let configContent = stringifyYaml(config, { indent: YAML_FORMATTING.INDENT });\n\n const exampleStackComment = `\n# Example stack configuration (uncomment and customize):\n#\n# skills:\n# - web-framework-react\n# - web-styling-scss-modules\n# - api-framework-hono\n# - api-database-drizzle\n#\n# agents:\n# - web-developer\n# - api-developer\n# - web-reviewer\n#\n# stack:\n# web-developer:\n# framework: web-framework-react\n# styling: web-styling-scss-modules\n# api-developer:\n# api: api-framework-hono\n# database: api-database-drizzle\n`;\n\n configContent += exampleStackComment;\n await writeFile(configPath, configContent);\n\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/config.yaml`);\n }\n\n private async ejectAgentPartials(\n outputBase: string,\n force: boolean,\n directOutput = false,\n templatesFlag = false,\n ): Promise<void> {\n const sourceDir = templatesFlag\n ? path.join(PROJECT_ROOT, DIRS.templates)\n : path.join(PROJECT_ROOT, DIRS.agents);\n\n if (!(await directoryExists(sourceDir))) {\n this.warn(\n templatesFlag ? \"No agent templates found in CLI.\" : \"No agent partials found in CLI.\",\n );\n return;\n }\n\n const destDir = directOutput\n ? outputBase\n : templatesFlag\n ? path.join(outputBase, path.basename(DIRS.agents), path.basename(DIRS.templates))\n : path.join(outputBase, path.basename(DIRS.agents));\n\n const templatesBasename = path.basename(DIRS.templates);\n\n if ((await directoryExists(destDir)) && !force) {\n if (templatesFlag) {\n this.warn(`Agent templates already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n const hasTemplates = await directoryExists(path.join(destDir, templatesBasename));\n if ((await this.hasAgentPartialDirs(destDir)) && !hasTemplates) {\n this.warn(`Agent partials already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n }\n\n await ensureDir(destDir);\n\n const skipTemplates =\n !templatesFlag && !force && (await directoryExists(path.join(destDir, templatesBasename)));\n\n if (skipTemplates) {\n const sourceEntries = await listDirectories(sourceDir);\n const nonTemplateEntries = sourceEntries.filter((entry) => entry !== templatesBasename);\n for (const entry of nonTemplateEntries) {\n await copy(path.join(sourceDir, entry), path.join(destDir, entry));\n }\n this.warn(\n \"Agent templates already exist — skipping templates, only ejecting agent partials.\",\n );\n } else {\n await copy(sourceDir, destDir);\n }\n\n this.logSuccess(\n `${templatesFlag ? \"Agent templates\" : \"Agent partials\"} ejected to ${destDir}`,\n );\n this.log(\n templatesFlag\n ? \"You can now customize agent templates locally.\"\n : \"You can now customize templates, agent intro, workflow, and examples locally.\",\n );\n }\n\n /** Checks whether the agents directory contains any agent subdirectories (not just _templates). */\n private async hasAgentPartialDirs(agentsDir: string): Promise<boolean> {\n const subdirs = await listDirectories(agentsDir);\n const templatesBasename = path.basename(DIRS.templates);\n return subdirs.some((dir) => dir !== templatesBasename);\n }\n\n private async ejectSkills(\n projectDir: string,\n force: boolean,\n sourceResult: SourceLoadResult,\n directOutput = false,\n customOutputBase?: string,\n ): Promise<void> {\n const destDir =\n directOutput && customOutputBase\n ? customOutputBase\n : path.join(projectDir, LOCAL_SKILLS_PATH);\n\n if ((await directoryExists(destDir)) && !force) {\n this.warn(`Skills already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n const skillIds = typedKeys<SkillId>(sourceResult.matrix.skills).filter(\n (skillId) => !sourceResult.matrix.skills[skillId]?.local,\n );\n\n if (skillIds.length === 0) {\n this.warn(\"No skills found in source to eject.\");\n return;\n }\n\n await ensureDir(destDir);\n\n const copiedSkills = await copySkillsToLocalFlattened(\n skillIds,\n destDir,\n sourceResult.matrix,\n sourceResult,\n );\n\n const sourceLabel = sourceResult.isLocal\n ? sourceResult.sourcePath\n : sourceResult.marketplace || sourceResult.sourceConfig.source;\n\n this.logSuccess(`${copiedSkills.length} skills ejected to ${destDir} from ${sourceLabel}`);\n this.log(\"You can now customize skill content locally.\");\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/eject.ts"],"sourcesContent":["import { Args, Flags } from \"@oclif/core\";\nimport path from \"path\";\nimport os from \"os\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport { BaseCommand } from \"../base-command.js\";\nimport {\n copy,\n ensureDir,\n directoryExists,\n fileExists,\n listDirectories,\n writeFile,\n} from \"../utils/fs.js\";\nimport {\n CLAUDE_SRC_DIR,\n DEFAULT_BRANDING,\n DIRS,\n LOCAL_SKILLS_PATH,\n PROJECT_ROOT,\n STANDARD_FILES,\n YAML_FORMATTING,\n} from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { copySkillsToLocalFlattened } from \"../lib/skills/index.js\";\nimport type { SkillId } from \"../types/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\nimport {\n loadProjectSourceConfig,\n resolveSource,\n saveSourceToProjectConfig,\n} from \"../lib/configuration/index.js\";\n\nconst EJECT_TYPES = [\"agent-partials\", \"templates\", \"skills\", \"all\"] as const;\ntype EjectType = (typeof EJECT_TYPES)[number];\n\nexport default class Eject extends BaseCommand {\n static summary = \"Eject skills, agent partials, or templates for local customization\";\n static description =\n \"Copy agent partials, templates, or skills to your project for customization. \" +\n \"Agent partials and templates are always copied from the CLI. \" +\n \"Skills are copied from the configured source (public marketplace by default).\";\n\n static examples = [\n {\n description: \"Eject agent partials for customization\",\n command: \"<%= config.bin %> <%= command.id %> agent-partials\",\n },\n {\n description: \"Eject only agent templates\",\n command: \"<%= config.bin %> <%= command.id %> templates\",\n },\n {\n description: \"Eject skills to local directory\",\n command: \"<%= config.bin %> <%= command.id %> skills\",\n },\n {\n description: \"Eject everything with force overwrite\",\n command: \"<%= config.bin %> <%= command.id %> all --force\",\n },\n {\n description: \"Eject to a custom output directory\",\n command: \"<%= config.bin %> <%= command.id %> skills -o ./custom-dir\",\n },\n ];\n\n static args = {\n type: Args.string({\n description: \"What to eject: agent-partials, templates, skills, all\",\n required: false,\n options: EJECT_TYPES as unknown as string[],\n }),\n };\n\n static flags = {\n ...BaseCommand.baseFlags,\n force: Flags.boolean({\n char: \"f\",\n description: \"Overwrite existing files\",\n default: false,\n }),\n output: Flags.string({\n char: \"o\",\n description: \"Output directory (default: .claude/ in current directory)\",\n }),\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { args, flags } = await this.parse(Eject);\n const projectDir = process.cwd();\n\n if (!args.type) {\n this.error(\"Please specify what to eject: agent-partials, templates, skills, or all\", {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n if (!EJECT_TYPES.includes(args.type as EjectType)) {\n this.error(`Unknown eject type: ${args.type}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n let outputBase: string;\n if (flags.output) {\n const expandedPath = flags.output.startsWith(\"~\")\n ? path.join(os.homedir(), flags.output.slice(1))\n : flags.output;\n outputBase = path.resolve(projectDir, expandedPath);\n\n if (await fileExists(outputBase)) {\n this.error(`Output path exists as a file: ${outputBase}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n } else {\n outputBase = path.join(projectDir, CLAUDE_SRC_DIR);\n }\n\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Eject`);\n this.log(\"\");\n\n if (flags.output) {\n this.log(`Output directory: ${outputBase}`);\n }\n\n const ejectType = args.type as EjectType;\n const directOutput = !!flags.output;\n\n let sourceResult: SourceLoadResult | undefined;\n if (ejectType === \"skills\" || ejectType === \"all\") {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n }\n\n switch (ejectType) {\n case \"agent-partials\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput, false);\n break;\n case \"templates\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput, true);\n break;\n case \"skills\":\n await this.ejectSkills(\n projectDir,\n flags.force,\n sourceResult!,\n directOutput,\n directOutput ? outputBase : undefined,\n );\n break;\n case \"all\":\n await this.ejectAgentPartials(outputBase, flags.force, directOutput, false);\n await this.ejectAgentPartials(outputBase, true, directOutput, true);\n await this.ejectSkills(\n projectDir,\n flags.force,\n sourceResult!,\n directOutput,\n directOutput ? outputBase : undefined,\n );\n break;\n default:\n break;\n }\n\n if (flags.source) {\n await saveSourceToProjectConfig(projectDir, flags.source);\n this.log(`Source saved to .claude-src/config.yaml`);\n }\n\n await this.ensureMinimalConfig(projectDir, flags.source, sourceResult);\n\n this.log(\"\");\n this.logSuccess(\"Eject complete!\");\n this.log(\"\");\n }\n\n // Ensures a minimal config.yaml exists so `agentsinc compile` works after eject\n private async ensureMinimalConfig(\n projectDir: string,\n sourceFlag?: string,\n sourceResult?: SourceLoadResult,\n ): Promise<void> {\n const configPath = path.join(projectDir, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_YAML);\n\n if (await fileExists(configPath)) {\n return;\n }\n\n const projectName = path.basename(projectDir);\n\n const config: Record<string, unknown> = {\n name: projectName,\n installMode: \"local\",\n };\n\n const resolvedConfig =\n sourceResult?.sourceConfig ?? (await resolveSource(sourceFlag, projectDir));\n\n if (sourceFlag) {\n config.source = sourceFlag;\n } else if (resolvedConfig.source) {\n config.source = resolvedConfig.source;\n }\n\n if (resolvedConfig.marketplace) {\n config.marketplace = resolvedConfig.marketplace;\n }\n\n const existingProjectConfig = await loadProjectSourceConfig(projectDir);\n if (existingProjectConfig?.author) {\n config.author = existingProjectConfig.author;\n }\n if (existingProjectConfig?.agentsSource) {\n config.agentsSource = existingProjectConfig.agentsSource;\n }\n\n await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));\n\n let configContent = stringifyYaml(config, { indent: YAML_FORMATTING.INDENT });\n\n const exampleStackComment = `\n# Example stack configuration (uncomment and customize):\n#\n# skills:\n# - web-framework-react\n# - web-styling-scss-modules\n# - api-framework-hono\n# - api-database-drizzle\n#\n# agents:\n# - web-developer\n# - api-developer\n# - web-reviewer\n#\n# stack:\n# web-developer:\n# framework: web-framework-react\n# styling: web-styling-scss-modules\n# api-developer:\n# api: api-framework-hono\n# database: api-database-drizzle\n`;\n\n configContent += exampleStackComment;\n await writeFile(configPath, configContent);\n\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/config.yaml`);\n }\n\n private async ejectAgentPartials(\n outputBase: string,\n force: boolean,\n directOutput = false,\n templatesFlag = false,\n ): Promise<void> {\n const sourceDir = templatesFlag\n ? path.join(PROJECT_ROOT, DIRS.templates)\n : path.join(PROJECT_ROOT, DIRS.agents);\n\n if (!(await directoryExists(sourceDir))) {\n this.warn(\n templatesFlag ? \"No agent templates found in CLI.\" : \"No agent partials found in CLI.\",\n );\n return;\n }\n\n const destDir = directOutput\n ? outputBase\n : templatesFlag\n ? path.join(outputBase, path.basename(DIRS.agents), path.basename(DIRS.templates))\n : path.join(outputBase, path.basename(DIRS.agents));\n\n const templatesBasename = path.basename(DIRS.templates);\n\n if ((await directoryExists(destDir)) && !force) {\n if (templatesFlag) {\n this.warn(`Agent templates already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n const hasTemplates = await directoryExists(path.join(destDir, templatesBasename));\n if ((await this.hasAgentPartialDirs(destDir)) && !hasTemplates) {\n this.warn(`Agent partials already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n }\n\n await ensureDir(destDir);\n\n const skipTemplates =\n !templatesFlag && !force && (await directoryExists(path.join(destDir, templatesBasename)));\n\n if (skipTemplates) {\n const sourceEntries = await listDirectories(sourceDir);\n const nonTemplateEntries = sourceEntries.filter((entry) => entry !== templatesBasename);\n for (const entry of nonTemplateEntries) {\n await copy(path.join(sourceDir, entry), path.join(destDir, entry));\n }\n this.warn(\n \"Agent templates already exist — skipping templates, only ejecting agent partials.\",\n );\n } else {\n await copy(sourceDir, destDir);\n }\n\n this.logSuccess(\n `${templatesFlag ? \"Agent templates\" : \"Agent partials\"} ejected to ${destDir}`,\n );\n this.log(\n templatesFlag\n ? \"You can now customize agent templates locally.\"\n : \"You can now customize templates, agent intro, workflow, and examples locally.\",\n );\n }\n\n /** Checks whether the agents directory contains any agent subdirectories (not just _templates). */\n private async hasAgentPartialDirs(agentsDir: string): Promise<boolean> {\n const subdirs = await listDirectories(agentsDir);\n const templatesBasename = path.basename(DIRS.templates);\n return subdirs.some((dir) => dir !== templatesBasename);\n }\n\n private async ejectSkills(\n projectDir: string,\n force: boolean,\n sourceResult: SourceLoadResult,\n directOutput = false,\n customOutputBase?: string,\n ): Promise<void> {\n const destDir =\n directOutput && customOutputBase\n ? customOutputBase\n : path.join(projectDir, LOCAL_SKILLS_PATH);\n\n if ((await directoryExists(destDir)) && !force) {\n this.warn(`Skills already exist at ${destDir}. Use --force to overwrite.`);\n return;\n }\n\n const skillIds = typedKeys<SkillId>(sourceResult.matrix.skills).filter(\n (skillId) => !sourceResult.matrix.skills[skillId]?.local,\n );\n\n if (skillIds.length === 0) {\n this.warn(\"No skills found in source to eject.\");\n return;\n }\n\n await ensureDir(destDir);\n\n const copiedSkills = await copySkillsToLocalFlattened(\n skillIds,\n destDir,\n sourceResult.matrix,\n sourceResult,\n );\n\n const sourceLabel = sourceResult.isLocal\n ? sourceResult.sourcePath\n : sourceResult.marketplace || sourceResult.sourceConfig.source;\n\n this.logSuccess(`${copiedSkills.length} skills ejected to ${destDir} from ${sourceLabel}`);\n this.log(\"You can now customize skill content locally.\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,MAAM,aAAa;AAC5B,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,aAAa,qBAAqB;AA8B3C,IAAM,cAAc,CAAC,kBAAkB,aAAa,UAAU,KAAK;AAGnE,IAAqB,QAArB,MAAqB,eAAc,YAAY;AAAA,EAC7C,OAAO,UAAU;AAAA,EACjB,OAAO,cACL;AAAA,EAIF,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO;AAAA,MAChB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,OAAO,MAAM,QAAQ;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,IACD,QAAQ,MAAM,OAAO;AAAA,MACnB,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,IACD,SAAS,MAAM,QAAQ;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,MAAK;AAC9C,UAAM,aAAa,QAAQ,IAAI;AAE/B,QAAI,CAAC,KAAK,MAAM;AACd,WAAK,MAAM,2EAA2E;AAAA,QACpF,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,YAAY,SAAS,KAAK,IAAiB,GAAG;AACjD,WAAK,MAAM,uBAAuB,KAAK,IAAI,IAAI;AAAA,QAC7C,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI;AACJ,QAAI,MAAM,QAAQ;AAChB,YAAM,eAAe,MAAM,OAAO,WAAW,GAAG,IAC5C,KAAK,KAAK,GAAG,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,IAC7C,MAAM;AACV,mBAAa,KAAK,QAAQ,YAAY,YAAY;AAElD,UAAI,MAAM,WAAW,UAAU,GAAG;AAChC,aAAK,MAAM,iCAAiC,UAAU,IAAI;AAAA,UACxD,MAAM,WAAW;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,mBAAa,KAAK,KAAK,YAAY,cAAc;AAAA,IACnD;AAEA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,GAAG,iBAAiB,IAAI,QAAQ;AACzC,SAAK,IAAI,EAAE;AAEX,QAAI,MAAM,QAAQ;AAChB,WAAK,IAAI,qBAAqB,UAAU,EAAE;AAAA,IAC5C;AAEA,UAAM,YAAY,KAAK;AACvB,UAAM,eAAe,CAAC,CAAC,MAAM;AAE7B,QAAI;AACJ,QAAI,cAAc,YAAY,cAAc,OAAO;AACjD,qBAAe,MAAM,2BAA2B;AAAA,QAC9C,YAAY,MAAM;AAAA,QAClB;AAAA,QACA,cAAc,MAAM;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,cAAM,KAAK,mBAAmB,YAAY,MAAM,OAAO,cAAc,KAAK;AAC1E;AAAA,MACF,KAAK;AACH,cAAM,KAAK,mBAAmB,YAAY,MAAM,OAAO,cAAc,IAAI;AACzE;AAAA,MACF,KAAK;AACH,cAAM,KAAK;AAAA,UACT;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,eAAe,aAAa;AAAA,QAC9B;AACA;AAAA,MACF,KAAK;AACH,cAAM,KAAK,mBAAmB,YAAY,MAAM,OAAO,cAAc,KAAK;AAC1E,cAAM,KAAK,mBAAmB,YAAY,MAAM,cAAc,IAAI;AAClE,cAAM,KAAK;AAAA,UACT;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,eAAe,aAAa;AAAA,QAC9B;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAEA,QAAI,MAAM,QAAQ;AAChB,YAAM,0BAA0B,YAAY,MAAM,MAAM;AACxD,WAAK,IAAI,yCAAyC;AAAA,IACpD;AAEA,UAAM,KAAK,oBAAoB,YAAY,MAAM,QAAQ,YAAY;AAErE,SAAK,IAAI,EAAE;AACX,SAAK,WAAW,iBAAiB;AACjC,SAAK,IAAI,EAAE;AAAA,EACb;AAAA;AAAA,EAGA,MAAc,oBACZ,YACA,YACA,cACe;AACf,UAAM,aAAa,KAAK,KAAK,YAAY,gBAAgB,eAAe,WAAW;AAEnF,QAAI,MAAM,WAAW,UAAU,GAAG;AAChC;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,SAAS,UAAU;AAE5C,UAAM,SAAkC;AAAA,MACtC,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAEA,UAAM,iBACJ,cAAc,gBAAiB,MAAM,cAAc,YAAY,UAAU;AAE3E,QAAI,YAAY;AACd,aAAO,SAAS;AAAA,IAClB,WAAW,eAAe,QAAQ;AAChC,aAAO,SAAS,eAAe;AAAA,IACjC;AAEA,QAAI,eAAe,aAAa;AAC9B,aAAO,cAAc,eAAe;AAAA,IACtC;AAEA,UAAM,wBAAwB,MAAM,wBAAwB,UAAU;AACtE,QAAI,uBAAuB,QAAQ;AACjC,aAAO,SAAS,sBAAsB;AAAA,IACxC;AACA,QAAI,uBAAuB,cAAc;AACvC,aAAO,eAAe,sBAAsB;AAAA,IAC9C;AAEA,UAAM,UAAU,KAAK,KAAK,YAAY,cAAc,CAAC;AAErD,QAAI,gBAAgB,cAAc,QAAQ,EAAE,QAAQ,gBAAgB,OAAO,CAAC;AAE5E,UAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuB5B,qBAAiB;AACjB,UAAM,UAAU,YAAY,aAAa;AAEzC,SAAK,WAAW,WAAW,cAAc,cAAc;AAAA,EACzD;AAAA,EAEA,MAAc,mBACZ,YACA,OACA,eAAe,OACf,gBAAgB,OACD;AACf,UAAM,YAAY,gBACd,KAAK,KAAK,cAAc,KAAK,SAAS,IACtC,KAAK,KAAK,cAAc,KAAK,MAAM;AAEvC,QAAI,CAAE,MAAM,gBAAgB,SAAS,GAAI;AACvC,WAAK;AAAA,QACH,gBAAgB,qCAAqC;AAAA,MACvD;AACA;AAAA,IACF;AAEA,UAAM,UAAU,eACZ,aACA,gBACE,KAAK,KAAK,YAAY,KAAK,SAAS,KAAK,MAAM,GAAG,KAAK,SAAS,KAAK,SAAS,CAAC,IAC/E,KAAK,KAAK,YAAY,KAAK,SAAS,KAAK,MAAM,CAAC;AAEtD,UAAM,oBAAoB,KAAK,SAAS,KAAK,SAAS;AAEtD,QAAK,MAAM,gBAAgB,OAAO,KAAM,CAAC,OAAO;AAC9C,UAAI,eAAe;AACjB,aAAK,KAAK,oCAAoC,OAAO,6BAA6B;AAClF;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,gBAAgB,KAAK,KAAK,SAAS,iBAAiB,CAAC;AAChF,UAAK,MAAM,KAAK,oBAAoB,OAAO,KAAM,CAAC,cAAc;AAC9D,aAAK,KAAK,mCAAmC,OAAO,6BAA6B;AACjF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,OAAO;AAEvB,UAAM,gBACJ,CAAC,iBAAiB,CAAC,SAAU,MAAM,gBAAgB,KAAK,KAAK,SAAS,iBAAiB,CAAC;AAE1F,QAAI,eAAe;AACjB,YAAM,gBAAgB,MAAM,gBAAgB,SAAS;AACrD,YAAM,qBAAqB,cAAc,OAAO,CAAC,UAAU,UAAU,iBAAiB;AACtF,iBAAW,SAAS,oBAAoB;AACtC,cAAM,KAAK,KAAK,KAAK,WAAW,KAAK,GAAG,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,MACnE;AACA,WAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,KAAK,WAAW,OAAO;AAAA,IAC/B;AAEA,SAAK;AAAA,MACH,GAAG,gBAAgB,oBAAoB,gBAAgB,eAAe,OAAO;AAAA,IAC/E;AACA,SAAK;AAAA,MACH,gBACI,mDACA;AAAA,IACN;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,oBAAoB,WAAqC;AACrE,UAAM,UAAU,MAAM,gBAAgB,SAAS;AAC/C,UAAM,oBAAoB,KAAK,SAAS,KAAK,SAAS;AACtD,WAAO,QAAQ,KAAK,CAAC,QAAQ,QAAQ,iBAAiB;AAAA,EACxD;AAAA,EAEA,MAAc,YACZ,YACA,OACA,cACA,eAAe,OACf,kBACe;AACf,UAAM,UACJ,gBAAgB,mBACZ,mBACA,KAAK,KAAK,YAAY,iBAAiB;AAE7C,QAAK,MAAM,gBAAgB,OAAO,KAAM,CAAC,OAAO;AAC9C,WAAK,KAAK,2BAA2B,OAAO,6BAA6B;AACzE;AAAA,IACF;AAEA,UAAM,WAAW,UAAmB,aAAa,OAAO,MAAM,EAAE;AAAA,MAC9D,CAAC,YAAY,CAAC,aAAa,OAAO,OAAO,OAAO,GAAG;AAAA,IACrD;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,WAAK,KAAK,qCAAqC;AAC/C;AAAA,IACF;AAEA,UAAM,UAAU,OAAO;AAEvB,UAAM,eAAe,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AAEA,UAAM,cAAc,aAAa,UAC7B,aAAa,aACb,aAAa,eAAe,aAAa,aAAa;AAE1D,SAAK,WAAW,GAAG,aAAa,MAAM,sBAAsB,OAAO,SAAS,WAAW,EAAE;AACzF,SAAK,IAAI,8CAA8C;AAAA,EACzD;AACF;","names":[]}
@@ -2,17 +2,17 @@
2
2
  import {
3
3
  INFO_MESSAGES,
4
4
  STATUS_MESSAGES
5
- } from "../../chunk-V43QDMYQ.js";
5
+ } from "../../chunk-G2WNOT3R.js";
6
6
  import {
7
7
  BaseCommand,
8
8
  EXIT_CODES
9
- } from "../../chunk-SRFNNOLC.js";
9
+ } from "../../chunk-LFZXMQOH.js";
10
10
  import {
11
11
  IMPORT_DEFAULTS,
12
12
  computeFileHash,
13
13
  fetchFromSource,
14
14
  getCurrentDate
15
- } from "../../chunk-ZECXM7LP.js";
15
+ } from "../../chunk-RT6IBH37.js";
16
16
  import "../../chunk-T4EXUIBY.js";
17
17
  import {
18
18
  copy,
@@ -24,14 +24,14 @@ import {
24
24
  listDirectories,
25
25
  readFile,
26
26
  writeFile
27
- } from "../../chunk-473YHDYQ.js";
27
+ } from "../../chunk-5QRJUBK7.js";
28
28
  import {
29
29
  DEFAULT_SKILLS_SUBDIR,
30
30
  GITHUB_SOURCE,
31
31
  LOCAL_SKILLS_PATH,
32
32
  STANDARD_FILES,
33
33
  YAML_FORMATTING
34
- } from "../../chunk-FVN5PFFY.js";
34
+ } from "../../chunk-74HSA7C4.js";
35
35
  import {
36
36
  init_esm_shims
37
37
  } from "../../chunk-DHET7RCE.js";
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  STATUS_MESSAGES
4
- } from "../chunk-V43QDMYQ.js";
4
+ } from "../chunk-G2WNOT3R.js";
5
5
  import {
6
6
  BaseCommand,
7
7
  EXIT_CODES
8
- } from "../chunk-SRFNNOLC.js";
8
+ } from "../chunk-LFZXMQOH.js";
9
9
  import {
10
10
  discoverLocalSkills,
11
11
  loadSkillsMatrixFromSource
12
- } from "../chunk-ZECXM7LP.js";
12
+ } from "../chunk-RT6IBH37.js";
13
13
  import "../chunk-T4EXUIBY.js";
14
14
  import {
15
15
  fileExists,
16
16
  readFile
17
- } from "../chunk-473YHDYQ.js";
17
+ } from "../chunk-5QRJUBK7.js";
18
18
  import {
19
19
  CLI_BIN_NAME,
20
20
  STANDARD_FILES
21
- } from "../chunk-FVN5PFFY.js";
21
+ } from "../chunk-74HSA7C4.js";
22
22
  import {
23
23
  init_esm_shims
24
24
  } from "../chunk-DHET7RCE.js";
@@ -1,48 +1,48 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "../chunk-Q5BSIARS.js";
5
- import "../chunk-DAVOSI4M.js";
6
- import "../chunk-3S4GIO4B.js";
7
- import "../chunk-ELRGSZHZ.js";
8
- import "../chunk-KVHLKPYB.js";
9
- import "../chunk-VTDEENSP.js";
10
- import "../chunk-ENWMWIHP.js";
11
- import "../chunk-WWSKP5SR.js";
12
- import "../chunk-KCYNTAAF.js";
4
+ } from "../chunk-CTQHZELA.js";
5
+ import "../chunk-FKBCYT7B.js";
6
+ import "../chunk-TOWP4T5L.js";
7
+ import "../chunk-4C7PDDLY.js";
8
+ import "../chunk-72GS6PIH.js";
9
+ import "../chunk-FUEZQ2H6.js";
10
+ import "../chunk-I26YP2Q3.js";
11
+ import "../chunk-HM3DHMW7.js";
12
+ import "../chunk-YT7UHV67.js";
13
13
  import "../chunk-K77I4XGL.js";
14
- import "../chunk-M3AGB4TR.js";
15
- import "../chunk-YRVTXSXP.js";
16
- import "../chunk-NTPHCNJO.js";
17
- import "../chunk-YQFU2KZ5.js";
14
+ import "../chunk-GVLYNP2I.js";
15
+ import "../chunk-D7JTL3DJ.js";
16
+ import "../chunk-3WKFSTG6.js";
17
+ import "../chunk-KWQ2BQXF.js";
18
18
  import "../chunk-7SOPVGDV.js";
19
- import "../chunk-F3O5YHSI.js";
19
+ import "../chunk-C7BO2ASM.js";
20
20
  import "../chunk-KUV24B5M.js";
21
- import "../chunk-ABE55TEU.js";
21
+ import "../chunk-CD64ZNYI.js";
22
22
  import "../chunk-GG4BSB6S.js";
23
- import "../chunk-5BDYODWP.js";
24
- import "../chunk-GUIRWCKI.js";
25
- import "../chunk-KWWLPPHF.js";
26
- import "../chunk-OALQWRLG.js";
27
- import "../chunk-HKRLWERR.js";
23
+ import "../chunk-CDGHSTB6.js";
24
+ import "../chunk-RWR56UVK.js";
25
+ import "../chunk-ODQ2BKWU.js";
26
+ import "../chunk-DO5OZHSS.js";
27
+ import "../chunk-5M6JI76P.js";
28
28
  import "../chunk-U3IGFMCY.js";
29
29
  import {
30
30
  claudePluginInstall,
31
31
  claudePluginMarketplaceAdd,
32
32
  claudePluginMarketplaceExists
33
- } from "../chunk-CLHBKFHU.js";
34
- import "../chunk-FYNMNY4P.js";
35
- import "../chunk-KZNPPUQG.js";
33
+ } from "../chunk-QBUOZVNZ.js";
34
+ import "../chunk-UK3AMBR7.js";
35
+ import "../chunk-J64CA4V6.js";
36
36
  import {
37
37
  DRY_RUN_MESSAGES,
38
38
  INFO_MESSAGES,
39
39
  STATUS_MESSAGES,
40
40
  SUCCESS_MESSAGES
41
- } from "../chunk-V43QDMYQ.js";
41
+ } from "../chunk-G2WNOT3R.js";
42
42
  import {
43
43
  BaseCommand,
44
44
  EXIT_CODES
45
- } from "../chunk-SRFNNOLC.js";
45
+ } from "../chunk-LFZXMQOH.js";
46
46
  import {
47
47
  detectInstallation,
48
48
  getMarketplaceLabel,
@@ -50,7 +50,7 @@ import {
50
50
  installLocal,
51
51
  installPluginConfig,
52
52
  loadSkillsMatrixFromSource
53
- } from "../chunk-ZECXM7LP.js";
53
+ } from "../chunk-RT6IBH37.js";
54
54
  import "../chunk-T4EXUIBY.js";
55
55
  import {
56
56
  fileExists,
@@ -59,7 +59,7 @@ import {
59
59
  settingsFileSchema,
60
60
  warn,
61
61
  warnUnknownFields
62
- } from "../chunk-473YHDYQ.js";
62
+ } from "../chunk-5QRJUBK7.js";
63
63
  import {
64
64
  ASCII_LOGO,
65
65
  CLAUDE_DIR,
@@ -68,7 +68,7 @@ import {
68
68
  DEFAULT_BRANDING,
69
69
  LOCAL_SKILLS_PATH,
70
70
  MAX_CONFIG_FILE_SIZE
71
- } from "../chunk-FVN5PFFY.js";
71
+ } from "../chunk-74HSA7C4.js";
72
72
  import {
73
73
  init_esm_shims
74
74
  } from "../chunk-DHET7RCE.js";
@@ -321,7 +321,8 @@ ${DRY_RUN_MESSAGES.COMPLETE_NO_FILES_CREATED}`);
321
321
  if (!marketplaceExists) {
322
322
  this.log(`Registering marketplace "${sourceResult.marketplace}"...`);
323
323
  try {
324
- await claudePluginMarketplaceAdd(sourceResult.marketplace);
324
+ const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, "");
325
+ await claudePluginMarketplaceAdd(marketplaceSource);
325
326
  this.log(`Registered marketplace: ${sourceResult.marketplace}`);
326
327
  } catch (error) {
327
328
  this.error(getErrorMessage(error), {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/init.tsx","../../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\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 detectInstallation as detectExistingInstallation,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.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_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n LOCAL_SKILLS_PATH,\n} from \"../consts.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n ERROR_MESSAGES,\n SUCCESS_MESSAGES,\n STATUS_MESSAGES,\n INFO_MESSAGES,\n DRY_RUN_MESSAGES,\n} from \"../utils/messages.js\";\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: \"Preview without creating files\",\n command: \"<%= config.bin %> <%= command.id %> --dry-run\",\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 (flags[\"dry-run\"]) {\n this.log(`${DRY_RUN_MESSAGES.PREVIEW_NO_FILES_CREATED}\\n`);\n }\n\n const individualPluginsExist = await hasIndividualPlugins(projectDir);\n const existingInstallation = await detectExistingInstallation(projectDir);\n\n if (individualPluginsExist || existingInstallation) {\n const location = individualPluginsExist\n ? `.claude/settings.json`\n : (existingInstallation?.configPath ?? projectDir);\n this.warn(`${DEFAULT_BRANDING.NAME} is already initialized at ${location}`);\n this.log(`Use '${CLI_BIN_NAME} edit' to modify skills.`);\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n\n let sourceResult: SourceLoadResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n let wizardResult: WizardResultV2 | null = null;\n\n const marketplaceLabel = getMarketplaceLabel(sourceResult);\n const { waitUntilExit } = render(\n <Wizard\n matrix={sourceResult.matrix}\n version={this.config.version}\n marketplaceLabel={marketplaceLabel}\n logo={ASCII_LOGO}\n projectDir={process.cwd()}\n initialInstallMode={sourceResult.marketplace ? \"plugin\" : \"local\"}\n initialExpertMode={!!flags.source}\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.selectedSkills.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: { \"dry-run\": boolean; source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const dryRun = flags[\"dry-run\"];\n\n this.log(\"\\n\");\n this.log(`Selected ${result.selectedSkills.length} skills`);\n this.log(\n `Install mode: ${result.installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\"}`,\n );\n\n if (dryRun) {\n if (result.installMode === \"plugin\" && result.selectedStackId) {\n const useMarketplace = !!sourceResult.marketplace;\n if (useMarketplace) {\n this.log(\n `[dry-run] Would install stack \"${result.selectedStackId}\" from marketplace \"${sourceResult.marketplace}\"`,\n );\n this.log(\n `[dry-run] claude plugin install ${result.selectedStackId}@${sourceResult.marketplace} --scope project`,\n );\n } else {\n this.log(\n `[dry-run] Would compile and install stack \"${result.selectedStackId}\" as a native plugin`,\n );\n this.log(\n `[dry-run] claude plugin install ./compiled-stack/${result.selectedStackId} --scope project`,\n );\n this.log(\n `[dry-run] Stack includes ${result.selectedSkills.length} skills and agents bundled together`,\n );\n }\n } else if (result.installMode === \"plugin\" && sourceResult.marketplace) {\n this.log(\n `[dry-run] Would install ${result.selectedSkills.length} skills as individual plugins from \"${sourceResult.marketplace}\"`,\n );\n for (const skillId of result.selectedSkills) {\n this.log(\n `[dry-run] claude plugin install ${skillId}@${sourceResult.marketplace} --scope project`,\n );\n }\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n this.log(`[dry-run] Would compile agents to ${localAgentsDir}`);\n this.log(`[dry-run] Would save config to .claude-src/config.yaml`);\n } else {\n if (result.installMode === \"plugin\") {\n this.log(\n `[dry-run] Plugin Mode requires a marketplace for individual skills — would fall back to Local Mode`,\n );\n }\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n this.log(\n `[dry-run] Would copy ${result.selectedSkills.length} skills to ${localSkillsDir}`,\n );\n this.log(`[dry-run] Would compile agents to ${localAgentsDir}`);\n this.log(`[dry-run] Would save config to .claude-src/config.yaml`);\n }\n this.log(`\\n${DRY_RUN_MESSAGES.COMPLETE_NO_FILES_CREATED}`);\n return;\n }\n\n if (result.installMode === \"plugin\") {\n if (sourceResult.marketplace) {\n await this.installIndividualPlugins(result, sourceResult, flags);\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);\n }\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags);\n }\n\n private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n ): Promise<void> {\n const projectDir = process.cwd();\n\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 await claudePluginMarketplaceAdd(sourceResult.marketplace);\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 skillId of result.selectedSkills) {\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n try {\n await claudePluginInstall(pluginRef, \"project\", 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 this.log(`Installed ${result.selectedSkills.length} 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.yaml`);\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 ): Promise<void> {\n const projectDir = process.cwd();\n const matrix = sourceResult.matrix;\n\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 skill = matrix.skills[copiedSkill.skillId];\n const displayName = skill?.displayName || copiedSkill.skillId;\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.yaml`);\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,aAAa;AACtB,SAAS,cAAc;AACvB,OAAOA,WAAU;;;ACFjB;AAEA,SAAS,MAAM,WAAW;AAC1B,OAAO,UAAU;AAyDX,SACE,KADF;AAzCN,eAAsB,iBAAiB,aAAyD;AAC9F,QAAM,eAAe,KAAK,KAAK,aAAa,YAAY,eAAe;AACvE,QAAM,oBAAoB,KAAK,KAAK,aAAa,YAAY,qBAAqB;AAElF,MAAI;AAEJ,aAAW,YAAY,CAAC,mBAAmB,YAAY,GAAG;AACxD,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,aAAa,UAAU,oBAAoB;AACjE,cAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,YAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG;AAElE,gBAAM,yBAAyB;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA;AAAA,YACE;AAAA,YACA;AAAA,YACA,kBAAkB,QAAQ;AAAA,UAC5B;AAAA,QACF;AACA,cAAM,SAAS,mBAAmB,UAAU,GAAG;AAC/C,cAAM,SAAuB,OAAO,UAAW,OAAO,OAAwB,CAAC;AAC/E,YAAI,OAAO,aAAa;AACtB,wBAAc,OAAO;AACrB;AAAA,QACF;AAAA,MACF,QAAQ;AACN,aAAK,+BAA+B,QAAQ,mBAAc;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,aAAa;AAChB,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,+BAEtC;AAAA,MACA,oBAAC,QAAK,gEAAkD;AAAA,MACxD,oBAAC,QAAK,+DAAiD;AAAA,MACvD,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,qEAAuD;AAAA,MAC7D,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,OAAM,OAAO,eAAI;AAAA,MACvB,oBAAC,QAAK,OAAM,OAAO,gCAAqB;AAAA,MACxC,oBAAC,QAAK,OAAM,OAAO,4BAAiB;AAAA,MACpC,oBAAC,QAAK,OAAM,OAAO,8BAAmB;AAAA,MACtC,oBAAC,QAAK,OAAM,OAAO,kCAAuB;AAAA,MAC1C,oBAAC,QAAK,OAAM,OAAO,iCAAsB;AAAA,MACzC,oBAAC,QAAK,OAAM,OAAO,mBAAQ;AAAA,MAC3B,oBAAC,QAAK,OAAM,OAAO,iBAAM;AAAA,MACzB,oBAAC,QAAK,OAAM,OAAO,eAAI;AAAA,OACzB;AAAA,EAEJ;AAEA,QAAM,qBAAqB,YAAY,MAAM;AAAA,IAC3C,CAAC,SAAS,SAAS,aAAa,SAAS;AAAA,EAC3C;AACA,QAAM,cAAc,CAAC,YAAY,SAAS,YAAY,MAAM,WAAW;AAEvE,MAAI,sBAAsB,aAAa;AACrC,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,iCAEtC;AAAA,MACC,sBACC,oBAAC,QAAK,kHAGN;AAAA,MAED,eACC,oBAAC,QAAK,qFAAkE;AAAA,OAE5E;AAAA,EAEJ;AAEA,SAAO;AACT;;;ADGM,gBAAAC,YAAA;AAtEN,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU,cAAc,iBAAiB,IAAI;AAAA,EACpD,OAAO,cACL;AAAA,EAEF,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,QAAQ;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,KAAI;AACvC,UAAM,aAAa,QAAQ,IAAI;AAE/B,QAAI,MAAM,SAAS,GAAG;AACpB,WAAK,IAAI,GAAG,iBAAiB,wBAAwB;AAAA,CAAI;AAAA,IAC3D;AAEA,UAAM,yBAAyB,MAAM,qBAAqB,UAAU;AACpE,UAAM,uBAAuB,MAAM,mBAA2B,UAAU;AAExE,QAAI,0BAA0B,sBAAsB;AAClD,YAAM,WAAW,yBACb,0BACC,sBAAsB,cAAc;AACzC,WAAK,KAAK,GAAG,iBAAiB,IAAI,8BAA8B,QAAQ,EAAE;AAC1E,WAAK,IAAI,QAAQ,YAAY,0BAA0B;AACvD,WAAK,IAAI,cAAc,eAAe;AACtC;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,qBAAe,MAAM,2BAA2B;AAAA,QAC9C,YAAY,MAAM;AAAA,QAClB;AAAA,QACA,cAAc,MAAM;AAAA,MACtB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,WAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,QACjC,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI,eAAsC;AAE1C,UAAM,mBAAmB,oBAAoB,YAAY;AACzD,UAAM,EAAE,cAAc,IAAI;AAAA,MACxB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ,aAAa;AAAA,UACrB,SAAS,KAAK,OAAO;AAAA,UACrB;AAAA,UACA,MAAM;AAAA,UACN,YAAY,QAAQ,IAAI;AAAA,UACxB,oBAAoB,aAAa,cAAc,WAAW;AAAA,UAC1D,mBAAmB,CAAC,CAAC,MAAM;AAAA,UAC3B,YAAY,CAACC,YAAW;AAEtB,2BAAeA;AAAA,UACjB;AAAA,UACA,UAAU,MAAM;AACd,iBAAK,IAAI,iBAAiB;AAAA,UAC5B;AAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc;AAGpB,UAAM,SAAS;AACf,QAAI,CAAC,UAAU,OAAO,WAAW;AAC/B,WAAK,KAAK,WAAW,SAAS;AAAA,IAChC;AAEA,QAAI,OAAO,eAAe,WAAW,GAAG;AACtC,WAAK,MAAM,sBAAsB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAC7D;AAEA,UAAM,KAAK,mBAAmB,QAAQ,cAAc,KAAK;AAAA,EAC3D;AAAA,EAEA,MAAc,mBACZ,QACA,cACA,OACe;AACf,UAAM,aAAa,QAAQ,IAAI;AAC/B,UAAM,SAAS,MAAM,SAAS;AAE9B,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,YAAY,OAAO,eAAe,MAAM,SAAS;AAC1D,SAAK;AAAA,MACH,iBAAiB,OAAO,gBAAgB,WAAW,4BAA4B,iCAAiC;AAAA,IAClH;AAEA,QAAI,QAAQ;AACV,UAAI,OAAO,gBAAgB,YAAY,OAAO,iBAAiB;AAC7D,cAAM,iBAAiB,CAAC,CAAC,aAAa;AACtC,YAAI,gBAAgB;AAClB,eAAK;AAAA,YACH,kCAAkC,OAAO,eAAe,uBAAuB,aAAa,WAAW;AAAA,UACzG;AACA,eAAK;AAAA,YACH,qCAAqC,OAAO,eAAe,IAAI,aAAa,WAAW;AAAA,UACzF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,YACH,8CAA8C,OAAO,eAAe;AAAA,UACtE;AACA,eAAK;AAAA,YACH,sDAAsD,OAAO,eAAe;AAAA,UAC9E;AACA,eAAK;AAAA,YACH,4BAA4B,OAAO,eAAe,MAAM;AAAA,UAC1D;AAAA,QACF;AAAA,MACF,WAAW,OAAO,gBAAgB,YAAY,aAAa,aAAa;AACtE,aAAK;AAAA,UACH,2BAA2B,OAAO,eAAe,MAAM,uCAAuC,aAAa,WAAW;AAAA,QACxH;AACA,mBAAW,WAAW,OAAO,gBAAgB;AAC3C,eAAK;AAAA,YACH,qCAAqC,OAAO,IAAI,aAAa,WAAW;AAAA,UAC1E;AAAA,QACF;AACA,cAAM,iBAAiBC,MAAK,KAAK,YAAY,YAAY,QAAQ;AACjE,aAAK,IAAI,qCAAqC,cAAc,EAAE;AAC9D,aAAK,IAAI,wDAAwD;AAAA,MACnE,OAAO;AACL,YAAI,OAAO,gBAAgB,UAAU;AACnC,eAAK;AAAA,YACH;AAAA,UACF;AAAA,QACF;AACA,cAAM,iBAAiBA,MAAK,KAAK,YAAY,iBAAiB;AAC9D,cAAM,iBAAiBA,MAAK,KAAK,YAAY,YAAY,QAAQ;AACjE,aAAK;AAAA,UACH,wBAAwB,OAAO,eAAe,MAAM,cAAc,cAAc;AAAA,QAClF;AACA,aAAK,IAAI,qCAAqC,cAAc,EAAE;AAC9D,aAAK,IAAI,wDAAwD;AAAA,MACnE;AACA,WAAK,IAAI;AAAA,EAAK,iBAAiB,yBAAyB,EAAE;AAC1D;AAAA,IACF;AAEA,QAAI,OAAO,gBAAgB,UAAU;AACnC,UAAI,aAAa,aAAa;AAC5B,cAAM,KAAK,yBAAyB,QAAQ,cAAc,KAAK;AAAA,MACjE,OAAO;AACL,aAAK,KAAK,uEAAuE;AACjF,aAAK,IAAI,4DAA4D;AACrE,aAAK,IAAI,gFAAgF;AACzF,cAAM,KAAK,iBAAiB,QAAQ,cAAc,KAAK;AAAA,MACzD;AACA;AAAA,IACF;AAEA,UAAM,KAAK,iBAAiB,QAAQ,cAAc,KAAK;AAAA,EACzD;AAAA,EAEA,MAAc,yBACZ,QACA,cACA,OACe;AACf,UAAM,aAAa,QAAQ,IAAI;AAE/B,QAAI,aAAa,aAAa;AAC5B,YAAM,oBAAoB,MAAM,8BAA8B,aAAa,WAAW;AAEtF,UAAI,CAAC,mBAAmB;AACtB,aAAK,IAAI,4BAA4B,aAAa,WAAW,MAAM;AACnE,YAAI;AACF,gBAAM,2BAA2B,aAAa,WAAW;AACzD,eAAK,IAAI,2BAA2B,aAAa,WAAW,EAAE;AAAA,QAChE,SAAS,OAAO;AACd,eAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,YACjC,MAAM,WAAW;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,SAAK,IAAI,6BAA6B;AACtC,eAAW,WAAW,OAAO,gBAAgB;AAC3C,YAAM,YAAY,GAAG,OAAO,IAAI,aAAa,WAAW;AACxD,UAAI;AACF,cAAM,oBAAoB,WAAW,WAAW,UAAU;AAC1D,aAAK,IAAI,eAAe,SAAS,EAAE;AAAA,MACrC,SAAS,OAAO;AACd,aAAK,MAAM,4BAA4B,SAAS,KAAK,gBAAgB,KAAK,CAAC,IAAI;AAAA,UAC7E,MAAM,WAAW;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,IAAI,aAAa,OAAO,eAAe,MAAM;AAAA,CAAkB;AAEpE,SAAK,IAAI,6BAA6B;AACtC,QAAI;AACF,YAAM,eAAe,MAAM,oBAAoB;AAAA,QAC7C,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,MACpB,CAAC;AAED,UAAI,aAAa,WAAW;AAC1B,aAAK,IAAI,kCAAkC,aAAa,gBAAgB,EAAE;AAAA,MAC5E;AAEA,WAAK,IAAI,wBAAwB,aAAa,OAAO,OAAO,MAAM;AAAA,CAAY;AAC9E,WAAK,IAAI,gBAAgB,gBAAgB;AACzC,WAAK,IAAI,YAAY,aAAa,eAAe,MAAM;AAAA,CAA8B;AAErF,WAAK,IAAI,GAAG,iBAAiB,YAAY;AAAA,CAAI;AAC7C,WAAK,IAAI,qBAAqB;AAC9B,WAAK,IAAI,KAAK,aAAa,SAAS,EAAE;AACtC,iBAAW,aAAa,aAAa,gBAAgB;AACnD,aAAK,IAAI,OAAO,SAAS,KAAK;AAAA,MAChC;AACA,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,gBAAgB;AACzB,WAAK,IAAI,KAAK,aAAa,UAAU,EAAE;AACvC,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,uCAAuC;AAChD,WAAK,IAAI,mCAAmC;AAC5C,WAAK,IAAI,aAAa,YAAY,gCAAgC;AAClE,WAAK,IAAI,EAAE;AAEX,YAAM,oBAAoB,MAAM,iBAAiB,UAAU;AAC3D,UAAI,mBAAmB;AACrB,cAAM,EAAE,cAAc,IAAI,OAAO,iBAAiB;AAClD,cAAM,cAAc;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,QACA,cACA,OACe;AACf,UAAM,aAAa,QAAQ,IAAI;AAC/B,UAAM,SAAS,aAAa;AAE5B,SAAK,IAAI,sCAAsC;AAC/C,QAAI;AACF,YAAM,gBAAgB,MAAM,aAAa;AAAA,QACvC,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,MACpB,CAAC;AAED,WAAK,IAAI,UAAU,cAAc,aAAa,MAAM;AAAA,CAA8B;AAClF,WAAK,IAAI,6BAA6B;AAEtC,UAAI,cAAc,WAAW;AAC3B,aAAK,IAAI,kCAAkC,cAAc,gBAAgB,EAAE;AAAA,MAC7E;AAEA,WAAK,IAAI,wBAAwB,cAAc,OAAO,OAAO,MAAM;AAAA,CAAY;AAC/E,WAAK,IAAI,gBAAgB,gBAAgB;AACzC,WAAK,IAAI,YAAY,cAAc,eAAe,MAAM;AAAA,CAA8B;AAEtF,WAAK,IAAI,GAAG,iBAAiB,YAAY;AAAA,CAAI;AAC7C,WAAK,IAAI,mBAAmB;AAC5B,WAAK,IAAI,KAAK,cAAc,SAAS,EAAE;AACvC,iBAAW,eAAe,cAAc,cAAc;AACpD,cAAM,QAAQ,OAAO,OAAO,YAAY,OAAO;AAC/C,cAAM,cAAc,OAAO,eAAe,YAAY;AACtD,aAAK,IAAI,OAAO,WAAW,GAAG;AAAA,MAChC;AACA,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,qBAAqB;AAC9B,WAAK,IAAI,KAAK,cAAc,SAAS,EAAE;AACvC,iBAAW,aAAa,cAAc,gBAAgB;AACpD,aAAK,IAAI,OAAO,SAAS,KAAK;AAAA,MAChC;AACA,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,gBAAgB;AACzB,WAAK,IAAI,KAAK,cAAc,UAAU,EAAE;AACxC,WAAK,IAAI,EAAE;AACX,WAAK,IAAI,uCAAuC;AAChD,WAAK,IAAI,mCAAmC;AAC5C,WAAK,IAAI,aAAa,YAAY,gCAAgC;AAClE,WAAK,IAAI,EAAE;AAEX,YAAM,oBAAoB,MAAM,iBAAiB,UAAU;AAC3D,UAAI,mBAAmB;AACrB,cAAM,EAAE,cAAc,IAAI,OAAO,iBAAiB;AAClD,cAAM,cAAc;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AACF;","names":["path","jsx","result","path"]}
1
+ {"version":3,"sources":["../../src/cli/commands/init.tsx","../../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\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 detectInstallation as detectExistingInstallation,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.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_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n LOCAL_SKILLS_PATH,\n} from \"../consts.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n ERROR_MESSAGES,\n SUCCESS_MESSAGES,\n STATUS_MESSAGES,\n INFO_MESSAGES,\n DRY_RUN_MESSAGES,\n} from \"../utils/messages.js\";\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: \"Preview without creating files\",\n command: \"<%= config.bin %> <%= command.id %> --dry-run\",\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 (flags[\"dry-run\"]) {\n this.log(`${DRY_RUN_MESSAGES.PREVIEW_NO_FILES_CREATED}\\n`);\n }\n\n const individualPluginsExist = await hasIndividualPlugins(projectDir);\n const existingInstallation = await detectExistingInstallation(projectDir);\n\n if (individualPluginsExist || existingInstallation) {\n const location = individualPluginsExist\n ? `.claude/settings.json`\n : (existingInstallation?.configPath ?? projectDir);\n this.warn(`${DEFAULT_BRANDING.NAME} is already initialized at ${location}`);\n this.log(`Use '${CLI_BIN_NAME} edit' to modify skills.`);\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n return;\n }\n\n let sourceResult: SourceLoadResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n let wizardResult: WizardResultV2 | null = null;\n\n const marketplaceLabel = getMarketplaceLabel(sourceResult);\n const { waitUntilExit } = render(\n <Wizard\n matrix={sourceResult.matrix}\n version={this.config.version}\n marketplaceLabel={marketplaceLabel}\n logo={ASCII_LOGO}\n projectDir={process.cwd()}\n initialInstallMode={sourceResult.marketplace ? \"plugin\" : \"local\"}\n initialExpertMode={!!flags.source}\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.selectedSkills.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: { \"dry-run\": boolean; source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const dryRun = flags[\"dry-run\"];\n\n this.log(\"\\n\");\n this.log(`Selected ${result.selectedSkills.length} skills`);\n this.log(\n `Install mode: ${result.installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\"}`,\n );\n\n if (dryRun) {\n if (result.installMode === \"plugin\" && result.selectedStackId) {\n const useMarketplace = !!sourceResult.marketplace;\n if (useMarketplace) {\n this.log(\n `[dry-run] Would install stack \"${result.selectedStackId}\" from marketplace \"${sourceResult.marketplace}\"`,\n );\n this.log(\n `[dry-run] claude plugin install ${result.selectedStackId}@${sourceResult.marketplace} --scope project`,\n );\n } else {\n this.log(\n `[dry-run] Would compile and install stack \"${result.selectedStackId}\" as a native plugin`,\n );\n this.log(\n `[dry-run] claude plugin install ./compiled-stack/${result.selectedStackId} --scope project`,\n );\n this.log(\n `[dry-run] Stack includes ${result.selectedSkills.length} skills and agents bundled together`,\n );\n }\n } else if (result.installMode === \"plugin\" && sourceResult.marketplace) {\n this.log(\n `[dry-run] Would install ${result.selectedSkills.length} skills as individual plugins from \"${sourceResult.marketplace}\"`,\n );\n for (const skillId of result.selectedSkills) {\n this.log(\n `[dry-run] claude plugin install ${skillId}@${sourceResult.marketplace} --scope project`,\n );\n }\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n this.log(`[dry-run] Would compile agents to ${localAgentsDir}`);\n this.log(`[dry-run] Would save config to .claude-src/config.yaml`);\n } else {\n if (result.installMode === \"plugin\") {\n this.log(\n `[dry-run] Plugin Mode requires a marketplace for individual skills — would fall back to Local Mode`,\n );\n }\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n const localAgentsDir = path.join(projectDir, CLAUDE_DIR, \"agents\");\n this.log(\n `[dry-run] Would copy ${result.selectedSkills.length} skills to ${localSkillsDir}`,\n );\n this.log(`[dry-run] Would compile agents to ${localAgentsDir}`);\n this.log(`[dry-run] Would save config to .claude-src/config.yaml`);\n }\n this.log(`\\n${DRY_RUN_MESSAGES.COMPLETE_NO_FILES_CREATED}`);\n return;\n }\n\n if (result.installMode === \"plugin\") {\n if (sourceResult.marketplace) {\n await this.installIndividualPlugins(result, sourceResult, flags);\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);\n }\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags);\n }\n\n private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n ): Promise<void> {\n const projectDir = process.cwd();\n\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 skillId of result.selectedSkills) {\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n try {\n await claudePluginInstall(pluginRef, \"project\", 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 this.log(`Installed ${result.selectedSkills.length} 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.yaml`);\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 ): Promise<void> {\n const projectDir = process.cwd();\n const matrix = sourceResult.matrix;\n\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 skill = matrix.skills[copiedSkill.skillId];\n const displayName = skill?.displayName || copiedSkill.skillId;\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.yaml`);\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":["path","jsx","result","path"]}
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  BaseCommand
4
- } from "../chunk-SRFNNOLC.js";
4
+ } from "../chunk-LFZXMQOH.js";
5
5
  import {
6
6
  formatInstallationDisplay,
7
7
  getInstallationInfo
8
- } from "../chunk-ZECXM7LP.js";
8
+ } from "../chunk-RT6IBH37.js";
9
9
  import "../chunk-T4EXUIBY.js";
10
- import "../chunk-473YHDYQ.js";
10
+ import "../chunk-5QRJUBK7.js";
11
11
  import {
12
12
  CLI_BIN_NAME,
13
13
  DEFAULT_BRANDING
14
- } from "../chunk-FVN5PFFY.js";
14
+ } from "../chunk-74HSA7C4.js";
15
15
  import {
16
16
  init_esm_shims
17
17
  } from "../chunk-DHET7RCE.js";