@agents-inc/cli 0.85.0 → 0.86.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 (123) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/{chunk-6VGBO6SZ.js → chunk-5M6Q5UQO.js} +2 -2
  3. package/dist/{chunk-YJ2URWF7.js → chunk-B6MYECV6.js} +2 -2
  4. package/dist/{chunk-FT46LN7K.js → chunk-BV2MIQ3O.js} +7 -8
  5. package/dist/chunk-BV2MIQ3O.js.map +1 -0
  6. package/dist/{chunk-G2MINRWX.js → chunk-C5IYJ42F.js} +2 -2
  7. package/dist/{chunk-7UZUDHP7.js → chunk-CXWBVBDM.js} +2 -2
  8. package/dist/chunk-DCVCFBQ7.js +1800 -0
  9. package/dist/chunk-DCVCFBQ7.js.map +1 -0
  10. package/dist/{chunk-CYPCJ536.js → chunk-FBZR46GC.js} +92 -92
  11. package/dist/chunk-FBZR46GC.js.map +1 -0
  12. package/dist/{chunk-TXW257CU.js → chunk-GED2F75H.js} +90 -167
  13. package/dist/chunk-GED2F75H.js.map +1 -0
  14. package/dist/{chunk-LTFGEVTM.js → chunk-HH3AWXF4.js} +3 -3
  15. package/dist/{chunk-2XVLQDNI.js → chunk-HSLVCKVQ.js} +3 -3
  16. package/dist/{chunk-TAQGYJIS.js → chunk-HZ2IBXVQ.js} +3 -3
  17. package/dist/{chunk-LN76TJJP.js → chunk-HZQOFFKA.js} +10 -10
  18. package/dist/{chunk-W7LHI54P.js → chunk-I44YG6VI.js} +2 -2
  19. package/dist/{chunk-L7COG2EX.js → chunk-LZ7XQ3IU.js} +2 -2
  20. package/dist/{chunk-LMR7VAP3.js → chunk-MMTMXLI4.js} +2 -2
  21. package/dist/chunk-N6A7A4RA.js +16 -0
  22. package/dist/chunk-N6A7A4RA.js.map +1 -0
  23. package/dist/{chunk-WJKD6EGK.js → chunk-NUU3U43A.js} +5 -6
  24. package/dist/chunk-NUU3U43A.js.map +1 -0
  25. package/dist/chunk-O5ZWS26C.js +166 -0
  26. package/dist/chunk-O5ZWS26C.js.map +1 -0
  27. package/dist/{chunk-YYIWB42G.js → chunk-Q4DMIPZB.js} +2 -2
  28. package/dist/{chunk-YSLDMYWP.js → chunk-SGZOFIFF.js} +2 -2
  29. package/dist/{chunk-FKXD3EXJ.js → chunk-TMTUTUEV.js} +42 -228
  30. package/dist/chunk-TMTUTUEV.js.map +1 -0
  31. package/dist/{chunk-WCCWQ56J.js → chunk-UNEJKTLP.js} +3 -3
  32. package/dist/chunk-XQK4S22C.js +202 -0
  33. package/dist/chunk-XQK4S22C.js.map +1 -0
  34. package/dist/{chunk-ZGD7PLLC.js → chunk-ZOWRO7UQ.js} +3 -3
  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 +63 -163
  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 +27 -632
  44. package/dist/commands/diff.js.map +1 -1
  45. package/dist/commands/doctor.js +41 -28
  46. package/dist/commands/doctor.js.map +1 -1
  47. package/dist/commands/edit.js +128 -194
  48. package/dist/commands/edit.js.map +1 -1
  49. package/dist/commands/eject.js +58 -126
  50. package/dist/commands/eject.js.map +1 -1
  51. package/dist/commands/import/skill.js +15 -148
  52. package/dist/commands/import/skill.js.map +1 -1
  53. package/dist/commands/info.js +34 -85
  54. package/dist/commands/info.js.map +1 -1
  55. package/dist/commands/init.js +23 -17
  56. package/dist/commands/list.js +4 -4
  57. package/dist/commands/new/agent.js +23 -97
  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 +169 -20
  62. package/dist/commands/new/skill.js.map +1 -1
  63. package/dist/commands/outdated.js +18 -24
  64. package/dist/commands/outdated.js.map +1 -1
  65. package/dist/commands/search.js +37 -100
  66. package/dist/commands/search.js.map +1 -1
  67. package/dist/commands/uninstall.js +39 -156
  68. package/dist/commands/uninstall.js.map +1 -1
  69. package/dist/commands/update.js +49 -99
  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 +2 -1
  73. package/dist/components/wizard/category-grid.test.js +4 -4
  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 +4 -4
  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 +5 -5
  80. package/dist/components/wizard/step-build.js +5 -5
  81. package/dist/components/wizard/step-build.test.js +5 -5
  82. package/dist/components/wizard/step-confirm.test.js +4 -4
  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 +5 -5
  87. package/dist/components/wizard/step-stack.js +6 -6
  88. package/dist/components/wizard/step-stack.test.js +6 -6
  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 +21 -16
  92. package/dist/hooks/init.js.map +1 -1
  93. package/dist/{loader-GT2A7R7U.js → loader-GSEGPK64.js} +3 -3
  94. package/dist/{source-loader-TNQW4P47.js → source-loader-OGFTIRIX.js} +4 -4
  95. package/dist/{source-manager-INRXRFJE.js → source-manager-FMMDDVZA.js} +4 -4
  96. package/dist/stores/wizard-store.js +4 -4
  97. package/dist/stores/wizard-store.test.js +4 -4
  98. package/package.json +1 -1
  99. package/dist/chunk-AABH2HSE.js +0 -340
  100. package/dist/chunk-AABH2HSE.js.map +0 -1
  101. package/dist/chunk-CYPCJ536.js.map +0 -1
  102. package/dist/chunk-FKXD3EXJ.js.map +0 -1
  103. package/dist/chunk-FT46LN7K.js.map +0 -1
  104. package/dist/chunk-TXW257CU.js.map +0 -1
  105. package/dist/chunk-WJKD6EGK.js.map +0 -1
  106. /package/dist/{chunk-6VGBO6SZ.js.map → chunk-5M6Q5UQO.js.map} +0 -0
  107. /package/dist/{chunk-YJ2URWF7.js.map → chunk-B6MYECV6.js.map} +0 -0
  108. /package/dist/{chunk-G2MINRWX.js.map → chunk-C5IYJ42F.js.map} +0 -0
  109. /package/dist/{chunk-7UZUDHP7.js.map → chunk-CXWBVBDM.js.map} +0 -0
  110. /package/dist/{chunk-LTFGEVTM.js.map → chunk-HH3AWXF4.js.map} +0 -0
  111. /package/dist/{chunk-2XVLQDNI.js.map → chunk-HSLVCKVQ.js.map} +0 -0
  112. /package/dist/{chunk-TAQGYJIS.js.map → chunk-HZ2IBXVQ.js.map} +0 -0
  113. /package/dist/{chunk-LN76TJJP.js.map → chunk-HZQOFFKA.js.map} +0 -0
  114. /package/dist/{chunk-W7LHI54P.js.map → chunk-I44YG6VI.js.map} +0 -0
  115. /package/dist/{chunk-L7COG2EX.js.map → chunk-LZ7XQ3IU.js.map} +0 -0
  116. /package/dist/{chunk-LMR7VAP3.js.map → chunk-MMTMXLI4.js.map} +0 -0
  117. /package/dist/{chunk-YYIWB42G.js.map → chunk-Q4DMIPZB.js.map} +0 -0
  118. /package/dist/{chunk-YSLDMYWP.js.map → chunk-SGZOFIFF.js.map} +0 -0
  119. /package/dist/{chunk-WCCWQ56J.js.map → chunk-UNEJKTLP.js.map} +0 -0
  120. /package/dist/{chunk-ZGD7PLLC.js.map → chunk-ZOWRO7UQ.js.map} +0 -0
  121. /package/dist/{loader-GT2A7R7U.js.map → loader-GSEGPK64.js.map} +0 -0
  122. /package/dist/{source-loader-TNQW4P47.js.map → source-loader-OGFTIRIX.js.map} +0 -0
  123. /package/dist/{source-manager-INRXRFJE.js.map → source-manager-FMMDDVZA.js.map} +0 -0
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  Wizard
4
- } from "../chunk-LN76TJJP.js";
5
- import "../chunk-WCCWQ56J.js";
4
+ } from "../chunk-HZQOFFKA.js";
5
+ import "../chunk-UNEJKTLP.js";
6
6
  import "../chunk-YVFGISUO.js";
7
- import "../chunk-ZGD7PLLC.js";
8
- import "../chunk-LTFGEVTM.js";
7
+ import "../chunk-ZOWRO7UQ.js";
8
+ import "../chunk-HH3AWXF4.js";
9
9
  import "../chunk-V36FRPAU.js";
10
- import "../chunk-YYIWB42G.js";
11
- import "../chunk-6VGBO6SZ.js";
12
- import "../chunk-L7COG2EX.js";
13
- import "../chunk-YSLDMYWP.js";
10
+ import "../chunk-Q4DMIPZB.js";
11
+ import "../chunk-5M6Q5UQO.js";
12
+ import "../chunk-LZ7XQ3IU.js";
13
+ import "../chunk-SGZOFIFF.js";
14
14
  import "../chunk-FQTYF3OU.js";
15
15
  import "../chunk-K77I4XGL.js";
16
16
  import "../chunk-ANZV33N5.js";
@@ -20,50 +20,49 @@ import "../chunk-7SOPVGDV.js";
20
20
  import "../chunk-SB2R5KHJ.js";
21
21
  import "../chunk-BEZ6ZPDS.js";
22
22
  import "../chunk-P2FHS5IS.js";
23
- import "../chunk-G2MINRWX.js";
23
+ import "../chunk-C5IYJ42F.js";
24
24
  import "../chunk-NL5EB57E.js";
25
25
  import "../chunk-HSKKGAOW.js";
26
26
  import "../chunk-4QA5TIBU.js";
27
27
  import "../chunk-WJXWYSBT.js";
28
- import "../chunk-7UZUDHP7.js";
28
+ import "../chunk-CXWBVBDM.js";
29
29
  import "../chunk-XO6X5QE5.js";
30
30
  import "../chunk-KUV24B5M.js";
31
- import "../chunk-2XVLQDNI.js";
31
+ import "../chunk-HSLVCKVQ.js";
32
32
  import "../chunk-HEQVUIHQ.js";
33
33
  import "../chunk-U3IGFMCY.js";
34
34
  import "../chunk-HK53FRMU.js";
35
- import {
36
- getAgentDefinitions,
37
- recompileAgents
38
- } from "../chunk-CYPCJ536.js";
39
35
  import {
40
36
  ERROR_MESSAGES,
41
37
  INFO_MESSAGES,
42
38
  STATUS_MESSAGES
43
39
  } from "../chunk-B7KZLXHV.js";
44
40
  import {
45
- buildAndMergeConfig,
46
- claudePluginInstall,
47
- claudePluginMarketplaceAdd,
48
- claudePluginMarketplaceExists,
49
- claudePluginUninstall,
50
- copySkillsToLocalFlattened,
41
+ compileAgents,
42
+ copyLocalSkills,
43
+ detectConfigChanges,
44
+ detectProject,
45
+ ensureMarketplace,
46
+ installPluginSkills,
47
+ loadAgentDefs,
48
+ loadSource,
49
+ migratePluginSkillScopes,
50
+ uninstallPluginSkills,
51
+ writeProjectConfig
52
+ } from "../chunk-DCVCFBQ7.js";
53
+ import "../chunk-N6A7A4RA.js";
54
+ import "../chunk-O5ZWS26C.js";
55
+ import "../chunk-XQK4S22C.js";
56
+ import "../chunk-FBZR46GC.js";
57
+ import {
51
58
  deleteLocalSkill,
52
59
  deriveInstallMode,
53
- detectInstallation,
54
60
  detectMigrations,
55
61
  discoverAllPluginSkills,
56
- ensureBlankGlobalConfig,
57
62
  executeMigration,
58
- loadProjectConfig,
59
- loadSkillsMatrixFromSource,
60
- migrateLocalSkillScope,
61
- resolveInstallPaths,
62
- writeScopedConfigs
63
- } from "../chunk-FKXD3EXJ.js";
64
- import {
65
- loadAllAgents
66
- } from "../chunk-YJ2URWF7.js";
63
+ migrateLocalSkillScope
64
+ } from "../chunk-TMTUTUEV.js";
65
+ import "../chunk-B6MYECV6.js";
67
66
  import {
68
67
  getSkillById,
69
68
  matrix
@@ -71,25 +70,17 @@ import {
71
70
  import {
72
71
  BaseCommand,
73
72
  EXIT_CODES
74
- } from "../chunk-LMR7VAP3.js";
73
+ } from "../chunk-MMTMXLI4.js";
75
74
  import {
76
- disableBuffering,
77
- drainBuffer,
78
- enableBuffering,
79
- ensureDir,
80
75
  getErrorMessage,
81
- pushBufferMessage,
82
76
  remove
83
- } from "../chunk-WJKD6EGK.js";
77
+ } from "../chunk-NUU3U43A.js";
84
78
  import "../chunk-6XWHJHNZ.js";
85
79
  import {
86
80
  CLAUDE_DIR,
87
- CLAUDE_SRC_DIR,
88
81
  CLI_BIN_NAME,
89
82
  GLOBAL_INSTALL_ROOT,
90
- PROJECT_ROOT,
91
- SOURCE_DISPLAY_NAMES,
92
- STANDARD_FILES
83
+ SOURCE_DISPLAY_NAMES
93
84
  } from "../chunk-6PGL2XMY.js";
94
85
  import "../chunk-NPMMU4GY.js";
95
86
  import {
@@ -136,62 +127,63 @@ var Edit = class _Edit extends BaseCommand {
136
127
  async run() {
137
128
  const { flags } = await this.parse(_Edit);
138
129
  const cwd = process.cwd();
139
- const installation = await detectInstallation();
140
- if (!installation) {
130
+ const detected = await detectProject();
131
+ if (!detected) {
141
132
  this.error(ERROR_MESSAGES.NO_INSTALLATION, {
142
133
  exit: EXIT_CODES.ERROR
143
134
  });
144
135
  }
136
+ const { installation, config: projectConfig } = detected;
145
137
  const projectDir = installation.projectDir;
146
- enableBuffering();
147
138
  let sourceResult;
148
139
  let startupMessages = [];
149
140
  try {
150
- sourceResult = await loadSkillsMatrixFromSource({
141
+ const loaded = await loadSource({
151
142
  sourceFlag: flags.source,
152
143
  projectDir,
153
- forceRefresh: flags.refresh
144
+ forceRefresh: flags.refresh,
145
+ captureStartupMessages: true
154
146
  });
147
+ sourceResult = loaded.sourceResult;
148
+ startupMessages = loaded.startupMessages;
155
149
  const sourceInfo = sourceResult.isLocal ? "local" : sourceResult.sourceConfig.sourceOrigin;
156
- pushBufferMessage(
157
- "info",
158
- `Loaded ${Object.keys(matrix.skills).length} skills (${sourceInfo})`
159
- );
150
+ startupMessages.push({
151
+ level: "info",
152
+ text: `Loaded ${Object.keys(matrix.skills).length} skills (${sourceInfo})`
153
+ });
160
154
  } catch (error) {
161
- disableBuffering();
162
155
  this.handleError(error);
163
156
  }
164
- const projectConfig = await loadProjectConfig(projectDir);
165
157
  let currentSkillIds;
166
158
  try {
167
159
  const discoveredSkills = await discoverAllPluginSkills(projectDir);
168
160
  const pluginSkillIds = Object.keys(discoveredSkills);
169
- const configSkillIds = projectConfig?.config?.skills?.map((s) => s.id) ?? [];
161
+ const configSkillIds = projectConfig?.skills?.map((s) => s.id) ?? [];
170
162
  const mergedIds = /* @__PURE__ */ new Set([...pluginSkillIds, ...configSkillIds]);
171
163
  currentSkillIds = [...mergedIds];
172
- pushBufferMessage("info", `Found ${currentSkillIds.length} installed skills`);
164
+ startupMessages.push({
165
+ level: "info",
166
+ text: `Found ${currentSkillIds.length} installed skills`
167
+ });
173
168
  } catch (error) {
174
- disableBuffering();
175
169
  this.handleError(error);
176
170
  }
177
- startupMessages = drainBuffer();
178
- disableBuffering();
179
171
  let wizardResult = null;
180
172
  const isGlobalDir = cwd === GLOBAL_INSTALL_ROOT;
181
- const lockedSkillIds = isGlobalDir ? void 0 : projectConfig?.config?.skills?.filter((s) => s.scope === "global").map((s) => s.id);
182
- const lockedAgentNames = isGlobalDir ? void 0 : projectConfig?.config?.agents?.filter((a) => a.scope === "global").map((a) => a.name);
173
+ const lockedSkillIds = isGlobalDir ? void 0 : projectConfig?.skills?.filter((s) => s.scope === "global").map((s) => s.id);
174
+ const lockedAgentNames = isGlobalDir ? void 0 : projectConfig?.agents?.filter((a) => a.scope === "global").map((a) => a.name);
183
175
  const { waitUntilExit } = render(
184
176
  /* @__PURE__ */ jsx(
185
177
  Wizard,
186
178
  {
187
179
  version: this.config.version,
188
180
  initialStep: "build",
189
- initialDomains: projectConfig?.config?.domains,
190
- initialAgents: projectConfig?.config?.selectedAgents,
181
+ initialDomains: projectConfig?.domains,
182
+ initialAgents: projectConfig?.selectedAgents,
191
183
  installedSkillIds: currentSkillIds,
192
- installedSkillConfigs: projectConfig?.config?.skills,
184
+ installedSkillConfigs: projectConfig?.skills,
193
185
  lockedSkillIds,
194
- installedAgentConfigs: projectConfig?.config?.agents,
186
+ installedAgentConfigs: projectConfig?.agents,
195
187
  lockedAgentNames,
196
188
  isEditingFromGlobalScope: isGlobalDir,
197
189
  projectDir,
@@ -215,44 +207,16 @@ var Edit = class _Edit extends BaseCommand {
215
207
  this.warn(err.message);
216
208
  }
217
209
  }
218
- const newSkillIds = result.skills.map((s) => s.id);
219
- const addedSkills = newSkillIds.filter((id) => !currentSkillIds.includes(id));
220
- const removedSkills = currentSkillIds.filter((id) => !newSkillIds.includes(id));
221
- const oldAgentNames = projectConfig?.config?.agents?.map((a) => a.name) ?? [];
222
- const newAgentNames = result.agentConfigs.map((a) => a.name);
223
- const addedAgents = newAgentNames.filter((name) => !oldAgentNames.includes(name));
224
- const removedAgents = oldAgentNames.filter((name) => !newAgentNames.includes(name));
225
- const sourceChanges = /* @__PURE__ */ new Map();
226
- const scopeChanges = /* @__PURE__ */ new Map();
227
- if (projectConfig?.config?.skills) {
228
- for (const newSkill of result.skills) {
229
- const oldSkill = projectConfig.config.skills.find((s) => s.id === newSkill.id);
230
- if (oldSkill && oldSkill.source !== newSkill.source) {
231
- sourceChanges.set(newSkill.id, {
232
- from: oldSkill.source,
233
- to: newSkill.source
234
- });
235
- }
236
- if (oldSkill && oldSkill.scope !== newSkill.scope) {
237
- scopeChanges.set(newSkill.id, {
238
- from: oldSkill.scope,
239
- to: newSkill.scope
240
- });
241
- }
242
- }
243
- }
244
- const agentScopeChanges = /* @__PURE__ */ new Map();
245
- if (projectConfig?.config?.agents) {
246
- for (const newAgent of result.agentConfigs) {
247
- const oldAgent = projectConfig.config.agents.find((a) => a.name === newAgent.name);
248
- if (oldAgent && oldAgent.scope !== newAgent.scope) {
249
- agentScopeChanges.set(newAgent.name, {
250
- from: oldAgent.scope,
251
- to: newAgent.scope
252
- });
253
- }
254
- }
255
- }
210
+ const changes = detectConfigChanges(projectConfig, result, currentSkillIds);
211
+ const {
212
+ addedSkills,
213
+ removedSkills,
214
+ addedAgents,
215
+ removedAgents,
216
+ sourceChanges,
217
+ scopeChanges,
218
+ agentScopeChanges
219
+ } = changes;
256
220
  const hasSourceChanges = sourceChanges.size > 0;
257
221
  const hasScopeChanges = scopeChanges.size > 0;
258
222
  const hasAgentScopeChanges = agentScopeChanges.size > 0;
@@ -293,7 +257,7 @@ var Edit = class _Edit extends BaseCommand {
293
257
  this.log(` ~ ${agentName} (${fromLabel} \u2192 ${toLabel})`);
294
258
  }
295
259
  this.log("");
296
- const oldSkills = projectConfig?.config?.skills ?? [];
260
+ const oldSkills = projectConfig?.skills ?? [];
297
261
  const migrationPlan = detectMigrations(oldSkills, result.skills);
298
262
  const hasMigrations = migrationPlan.toLocal.length > 0 || migrationPlan.toPlugin.length > 0;
299
263
  if (hasMigrations) {
@@ -322,16 +286,17 @@ var Edit = class _Edit extends BaseCommand {
322
286
  const skillConfig = result.skills.find((s) => s.id === skillId);
323
287
  if (skillConfig?.source === "local") {
324
288
  await migrateLocalSkillScope(skillId, change.from, cwd);
325
- } else if (sourceResult.marketplace && skillConfig) {
326
- const oldPluginScope = change.from === "global" ? "user" : "project";
327
- const newPluginScope = change.to === "global" ? "user" : "project";
328
- try {
329
- await claudePluginUninstall(skillId, oldPluginScope, cwd);
330
- const pluginRef = `${skillId}@${sourceResult.marketplace}`;
331
- await claudePluginInstall(pluginRef, newPluginScope, cwd);
332
- } catch (error) {
333
- this.warn(`Failed to migrate plugin scope for ${skillId}: ${getErrorMessage(error)}`);
334
- }
289
+ }
290
+ }
291
+ if (sourceResult.marketplace && scopeChanges.size > 0) {
292
+ const pluginScopeResult = await migratePluginSkillScopes(
293
+ scopeChanges,
294
+ result.skills,
295
+ sourceResult.marketplace,
296
+ cwd
297
+ );
298
+ for (const item of pluginScopeResult.failed) {
299
+ this.warn(`Failed to migrate plugin scope for ${item.id}: ${item.error}`);
335
300
  }
336
301
  }
337
302
  for (const [skillId, change] of sourceChanges) {
@@ -339,39 +304,43 @@ var Edit = class _Edit extends BaseCommand {
339
304
  continue;
340
305
  }
341
306
  if (change.from === "local") {
342
- const oldSkill = projectConfig?.config?.skills?.find((s) => s.id === skillId);
307
+ const oldSkill = projectConfig?.skills?.find((s) => s.id === skillId);
343
308
  const deleteDir = oldSkill?.scope === "global" ? os.homedir() : cwd;
344
309
  await deleteLocalSkill(deleteDir, skillId);
345
310
  }
346
311
  }
347
312
  if (sourceResult.marketplace) {
348
- const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);
349
- if (!marketplaceExists) {
350
- this.log(`Registering marketplace "${sourceResult.marketplace}"...`);
351
- const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, "");
352
- await claudePluginMarketplaceAdd(marketplaceSource);
353
- this.log(`Registered marketplace: ${sourceResult.marketplace}`);
313
+ const mpResult = await ensureMarketplace(sourceResult);
314
+ if (mpResult.registered) {
315
+ this.log(`Registered marketplace: ${mpResult.marketplace}`);
354
316
  }
355
- for (const skillId of addedSkills) {
356
- const skillConfig = result.skills.find((s) => s.id === skillId);
357
- if (!skillConfig || skillConfig.source === "local") continue;
358
- const pluginRef = `${skillId}@${sourceResult.marketplace}`;
359
- const pluginScope = skillConfig.scope === "global" ? "user" : "project";
360
- this.log(`Installing plugin: ${pluginRef}...`);
361
- try {
362
- await claudePluginInstall(pluginRef, pluginScope, cwd);
363
- } catch (error) {
364
- this.warn(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`);
317
+ const addedPluginSkills = result.skills.filter(
318
+ (s) => addedSkills.includes(s.id) && s.source !== "local"
319
+ );
320
+ if (addedPluginSkills.length > 0) {
321
+ const pluginResult = await installPluginSkills(
322
+ addedPluginSkills,
323
+ sourceResult.marketplace,
324
+ cwd
325
+ );
326
+ for (const item of pluginResult.installed) {
327
+ this.log(`Installing plugin: ${item.ref}...`);
328
+ }
329
+ for (const item of pluginResult.failed) {
330
+ this.warn(`Failed to install plugin ${item.id}: ${item.error}`);
365
331
  }
366
332
  }
367
- for (const skillId of removedSkills) {
368
- const oldSkill = projectConfig?.config?.skills?.find((s) => s.id === skillId);
369
- const pluginScope = oldSkill?.scope === "global" ? "user" : "project";
370
- this.log(`Uninstalling plugin: ${skillId}...`);
371
- try {
372
- await claudePluginUninstall(skillId, pluginScope, cwd);
373
- } catch (error) {
374
- this.warn(`Failed to uninstall plugin ${skillId}: ${getErrorMessage(error)}`);
333
+ if (removedSkills.length > 0) {
334
+ const uninstallResult = await uninstallPluginSkills(
335
+ removedSkills,
336
+ projectConfig?.skills ?? [],
337
+ cwd
338
+ );
339
+ for (const id of uninstallResult.uninstalled) {
340
+ this.log(`Uninstalling plugin: ${id}...`);
341
+ }
342
+ for (const item of uninstallResult.failed) {
343
+ this.warn(`Failed to uninstall plugin ${item.id}: ${item.error}`);
375
344
  }
376
345
  }
377
346
  }
@@ -379,88 +348,53 @@ var Edit = class _Edit extends BaseCommand {
379
348
  (s) => addedSkills.includes(s.id) && s.source === "local"
380
349
  );
381
350
  if (addedLocalSkills.length > 0) {
382
- const projectLocalSkills = addedLocalSkills.filter((s) => s.scope !== "global");
383
- const globalLocalSkills = addedLocalSkills.filter((s) => s.scope === "global");
384
- const projectPaths = resolveInstallPaths(cwd, "project");
385
- const globalPaths = resolveInstallPaths(cwd, "global");
386
- if (projectLocalSkills.length > 0) {
387
- await ensureDir(projectPaths.skillsDir);
388
- await copySkillsToLocalFlattened(
389
- projectLocalSkills.map((s) => s.id),
390
- projectPaths.skillsDir,
391
- sourceResult.matrix,
392
- sourceResult
393
- );
394
- }
395
- if (globalLocalSkills.length > 0) {
396
- await ensureDir(globalPaths.skillsDir);
397
- await copySkillsToLocalFlattened(
398
- globalLocalSkills.map((s) => s.id),
399
- globalPaths.skillsDir,
400
- sourceResult.matrix,
401
- sourceResult
402
- );
403
- }
404
- this.log(`Copied ${addedLocalSkills.length} local skill(s) to .claude/skills/`);
351
+ const copyResult = await copyLocalSkills(addedLocalSkills, cwd, sourceResult);
352
+ this.log(`Copied ${copyResult.totalCopied} local skill(s) to .claude/skills/`);
405
353
  }
406
- let sourcePath;
354
+ let agentDefsResult;
407
355
  this.log(
408
356
  flags["agent-source"] ? STATUS_MESSAGES.FETCHING_AGENT_PARTIALS : STATUS_MESSAGES.LOADING_AGENT_PARTIALS
409
357
  );
410
358
  try {
411
- const agentDefs = await getAgentDefinitions(flags["agent-source"], {
359
+ agentDefsResult = await loadAgentDefs(flags["agent-source"], {
412
360
  forceRefresh: flags.refresh
413
361
  });
414
- sourcePath = agentDefs.sourcePath;
415
362
  this.log(flags["agent-source"] ? "\u2713 Agent partials fetched\n" : "\u2713 Agent partials loaded\n");
416
363
  } catch (error) {
417
364
  this.handleError(error);
418
365
  }
419
366
  try {
420
- const mergeResult = await buildAndMergeConfig(result, sourceResult, cwd, flags.source);
421
- const cliAgents = await loadAllAgents(PROJECT_ROOT);
422
- const sourceAgents = await loadAllAgents(sourcePath);
423
- const agents = { ...cliAgents, ...sourceAgents };
424
- if (cwd !== os.homedir()) {
425
- await ensureBlankGlobalConfig();
426
- }
427
- const configPath = path.join(cwd, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_TS);
428
- const projectInstallationExists = path.resolve(installation.projectDir) !== path.resolve(os.homedir());
429
- await writeScopedConfigs(
430
- mergeResult.config,
431
- sourceResult.matrix,
432
- agents,
433
- cwd,
434
- configPath,
435
- projectInstallationExists
436
- );
367
+ await writeProjectConfig({
368
+ wizardResult: result,
369
+ sourceResult,
370
+ projectDir: cwd,
371
+ sourceFlag: flags.source,
372
+ agents: agentDefsResult.agents
373
+ });
437
374
  } catch (error) {
438
375
  this.warn(`Could not update config: ${getErrorMessage(error)}`);
439
376
  }
440
377
  this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);
441
378
  try {
442
- const recompileSkills = await discoverAllPluginSkills(cwd);
443
379
  const agentScopeMap = new Map(result.agentConfigs.map((a) => [a.name, a.scope]));
444
- const outputDir = path.join(cwd, CLAUDE_DIR, "agents");
445
- const recompileResult = await recompileAgents({
446
- pluginDir: cwd,
447
- sourcePath,
448
- skills: recompileSkills,
380
+ const compilationResult = await compileAgents({
449
381
  projectDir: cwd,
450
- outputDir,
382
+ sourcePath: agentDefsResult.sourcePath,
383
+ pluginDir: cwd,
384
+ outputDir: path.join(cwd, CLAUDE_DIR, "agents"),
451
385
  installMode: deriveInstallMode(result.skills),
452
386
  agentScopeMap
453
387
  });
454
- if (recompileResult.failed.length > 0) {
388
+ if (compilationResult.failed.length > 0) {
455
389
  this.log(
456
- `\u2713 Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)
390
+ `\u2713 Recompiled ${compilationResult.compiled.length} agents (${compilationResult.failed.length} failed)
457
391
  `
458
392
  );
459
- for (const warning of recompileResult.warnings) {
393
+ for (const warning of compilationResult.warnings) {
460
394
  this.warn(warning);
461
395
  }
462
- } else if (recompileResult.compiled.length > 0) {
463
- this.log(`\u2713 Recompiled ${recompileResult.compiled.length} agents
396
+ } else if (compilationResult.compiled.length > 0) {
397
+ this.log(`\u2713 Recompiled ${compilationResult.compiled.length} agents
464
398
  `);
465
399
  } else {
466
400
  this.log("\u2713 No agents to recompile\n");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n CLAUDE_DIR,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n GLOBAL_INSTALL_ROOT,\n PROJECT_ROOT,\n SOURCE_DISPLAY_NAMES,\n STANDARD_FILES,\n} from \"../consts.js\";\nimport { getAgentDefinitions, recompileAgents } from \"../lib/agents/index.js\";\nimport { loadProjectConfig } from \"../lib/configuration/index.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n detectInstallation,\n buildAndMergeConfig,\n writeScopedConfigs,\n detectMigrations,\n executeMigration,\n deriveInstallMode,\n resolveInstallPaths,\n} from \"../lib/installation/index.js\";\nimport { loadAllAgents, loadSkillsMatrixFromSource } from \"../lib/loading/index.js\";\nimport { matrix, getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { discoverAllPluginSkills } from \"../lib/plugins/index.js\";\nimport {\n deleteLocalSkill,\n migrateLocalSkillScope,\n copySkillsToLocalFlattened,\n} from \"../lib/skills/index.js\";\nimport type { AgentDefinition, AgentName, SkillId } from \"../types/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { ensureDir, remove } from \"../utils/fs.js\";\nimport {\n claudePluginInstall,\n claudePluginUninstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n pushBufferMessage,\n type StartupMessage,\n} from \"../utils/logger.js\";\nimport { ERROR_MESSAGES, INFO_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\n\nfunction formatSourceDisplayName(sourceName: string): string {\n return SOURCE_DISPLAY_NAMES[sourceName] ?? sourceName;\n}\n\nexport default class Edit extends BaseCommand {\n static summary = \"Edit skills in the plugin\";\n static description = \"Modify the currently installed skills via interactive wizard\";\n\n static examples = [\n {\n description: \"Open the edit wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Edit with a custom source\",\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 sources\",\n default: false,\n }),\n \"agent-source\": Flags.string({\n description: \"Remote agent partials source (default: local CLI)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Edit);\n const cwd = process.cwd();\n\n const installation = await detectInstallation();\n\n if (!installation) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n // Use installation.projectDir for reads (loading config, discovering installed skills).\n // Use cwd for writes (config saves, plugin installs, scope migrations, recompilation output)\n // and for the locked-items check (determining whether global items are read-only).\n const projectDir = installation.projectDir;\n\n enableBuffering();\n\n let sourceResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n\n const sourceInfo = sourceResult.isLocal ? \"local\" : sourceResult.sourceConfig.sourceOrigin;\n pushBufferMessage(\n \"info\",\n `Loaded ${Object.keys(matrix.skills).length} skills (${sourceInfo})`,\n );\n } catch (error) {\n disableBuffering();\n this.handleError(error);\n }\n\n const projectConfig = await loadProjectConfig(projectDir);\n\n let currentSkillIds: SkillId[];\n try {\n const discoveredSkills = await discoverAllPluginSkills(projectDir);\n // Boundary cast: discoverAllPluginSkills keys are skill IDs from frontmatter\n const pluginSkillIds = Object.keys(discoveredSkills) as SkillId[];\n\n // Merge plugin-discovered skills with config skills (catches local skills and\n // global-scoped plugins that discoverAllPluginSkills doesn't find).\n const configSkillIds = projectConfig?.config?.skills?.map((s) => s.id) ?? [];\n const mergedIds = new Set<SkillId>([...pluginSkillIds, ...configSkillIds]);\n currentSkillIds = [...mergedIds];\n\n pushBufferMessage(\"info\", `Found ${currentSkillIds.length} installed skills`);\n } catch (error) {\n disableBuffering();\n this.handleError(error);\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n // D9: In project context, existing global items are read-only (locked).\n // When editing from ~/ (global context), nothing is locked.\n // Uses cwd (not projectDir) so that global items are correctly locked\n // even when detectInstallation() fell back to the global installation.\n const isGlobalDir = cwd === GLOBAL_INSTALL_ROOT;\n const lockedSkillIds = isGlobalDir\n ? undefined\n : projectConfig?.config?.skills?.filter((s) => s.scope === \"global\").map((s) => s.id);\n const lockedAgentNames = isGlobalDir\n ? undefined\n : projectConfig?.config?.agents?.filter((a) => a.scope === \"global\").map((a) => a.name);\n\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n initialStep=\"build\"\n initialDomains={projectConfig?.config?.domains}\n initialAgents={projectConfig?.config?.selectedAgents}\n installedSkillIds={currentSkillIds}\n installedSkillConfigs={projectConfig?.config?.skills}\n lockedSkillIds={lockedSkillIds}\n installedAgentConfigs={projectConfig?.config?.agents}\n lockedAgentNames={lockedAgentNames}\n isEditingFromGlobalScope={isGlobalDir}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"\\nEdit 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\n if (!result || result.cancelled) {\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n if (result.validation.errors.length > 0) {\n for (const err of result.validation.errors) {\n this.warn(err.message);\n }\n }\n\n const newSkillIds = result.skills.map((s) => s.id);\n const addedSkills = newSkillIds.filter((id) => !currentSkillIds.includes(id));\n const removedSkills = currentSkillIds.filter((id) => !newSkillIds.includes(id));\n\n const oldAgentNames = projectConfig?.config?.agents?.map((a) => a.name) ?? [];\n const newAgentNames = result.agentConfigs.map((a) => a.name);\n const addedAgents = newAgentNames.filter((name) => !oldAgentNames.includes(name));\n const removedAgents = oldAgentNames.filter((name) => !newAgentNames.includes(name));\n\n const sourceChanges = new Map<SkillId, { from: string; to: string }>();\n const scopeChanges = new Map<\n SkillId,\n { from: \"project\" | \"global\"; to: \"project\" | \"global\" }\n >();\n if (projectConfig?.config?.skills) {\n for (const newSkill of result.skills) {\n const oldSkill = projectConfig.config.skills.find((s) => s.id === newSkill.id);\n if (oldSkill && oldSkill.source !== newSkill.source) {\n sourceChanges.set(newSkill.id, {\n from: oldSkill.source,\n to: newSkill.source,\n });\n }\n if (oldSkill && oldSkill.scope !== newSkill.scope) {\n scopeChanges.set(newSkill.id, {\n from: oldSkill.scope,\n to: newSkill.scope,\n });\n }\n }\n }\n\n const agentScopeChanges = new Map<\n AgentName,\n { from: \"project\" | \"global\"; to: \"project\" | \"global\" }\n >();\n if (projectConfig?.config?.agents) {\n for (const newAgent of result.agentConfigs) {\n const oldAgent = projectConfig.config.agents.find((a) => a.name === newAgent.name);\n if (oldAgent && oldAgent.scope !== newAgent.scope) {\n agentScopeChanges.set(newAgent.name, {\n from: oldAgent.scope,\n to: newAgent.scope,\n });\n }\n }\n }\n\n const hasSourceChanges = sourceChanges.size > 0;\n const hasScopeChanges = scopeChanges.size > 0;\n const hasAgentScopeChanges = agentScopeChanges.size > 0;\n const hasSkillChanges = addedSkills.length > 0 || removedSkills.length > 0;\n const hasAgentChanges = addedAgents.length > 0 || removedAgents.length > 0;\n\n if (\n !hasSkillChanges &&\n !hasAgentChanges &&\n !hasSourceChanges &&\n !hasScopeChanges &&\n !hasAgentScopeChanges\n ) {\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n this.log(\"Plugin unchanged\\n\");\n return;\n }\n\n this.log(\"\\nChanges:\");\n for (const skillId of addedSkills) {\n this.log(` + ${getSkillById(skillId).displayName}`);\n }\n for (const skillId of removedSkills) {\n const skill = matrix.skills[skillId];\n this.log(` - ${skill?.displayName ?? skillId}`);\n }\n for (const agentName of addedAgents) {\n this.log(` + ${agentName} (agent)`);\n }\n for (const agentName of removedAgents) {\n this.log(` - ${agentName} (agent)`);\n }\n for (const [skillId, change] of sourceChanges) {\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [skillId, change] of scopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [agentName, change] of agentScopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${agentName} (${fromLabel} \\u2192 ${toLabel})`);\n }\n this.log(\"\");\n\n // Handle per-skill mode migrations (local <-> plugin)\n const oldSkills = projectConfig?.config?.skills ?? [];\n const migrationPlan = detectMigrations(oldSkills, result.skills);\n const hasMigrations = migrationPlan.toLocal.length > 0 || migrationPlan.toPlugin.length > 0;\n\n if (hasMigrations) {\n if (migrationPlan.toLocal.length > 0) {\n this.log(`Switching ${migrationPlan.toLocal.length} skill(s) to local:`);\n for (const migration of migrationPlan.toLocal) {\n this.log(` - ${migration.id}`);\n }\n }\n if (migrationPlan.toPlugin.length > 0) {\n this.log(`Switching ${migrationPlan.toPlugin.length} skill(s) to plugin:`);\n for (const migration of migrationPlan.toPlugin) {\n this.log(` - ${migration.id}`);\n }\n }\n\n const migrationResult = await executeMigration(migrationPlan, cwd, sourceResult);\n\n for (const warning of migrationResult.warnings) {\n this.warn(warning);\n }\n }\n\n const migratedSkillIds = new Set([\n ...migrationPlan.toLocal.map((m) => m.id),\n ...migrationPlan.toPlugin.map((m) => m.id),\n ]);\n\n // Handle scope migrations (P→G or G→P) for local-mode skills\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = result.skills.find((s) => s.id === skillId);\n if (skillConfig?.source === \"local\") {\n await migrateLocalSkillScope(skillId, change.from, cwd);\n } else if (sourceResult.marketplace && skillConfig) {\n // Plugin-mode scope change: uninstall from old scope, install to new scope\n const oldPluginScope = change.from === \"global\" ? \"user\" : \"project\";\n const newPluginScope = change.to === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginUninstall(skillId, oldPluginScope, cwd);\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n await claudePluginInstall(pluginRef, newPluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to migrate plugin scope for ${skillId}: ${getErrorMessage(error)}`);\n }\n }\n }\n\n // Handle remaining non-migration source changes (e.g., marketplace A -> marketplace B)\n for (const [skillId, change] of sourceChanges) {\n // Skip skills already handled by mode migration\n if (migratedSkillIds.has(skillId)) {\n continue;\n }\n if (change.from === \"local\") {\n const oldSkill = projectConfig?.config?.skills?.find((s) => s.id === skillId);\n const deleteDir = oldSkill?.scope === \"global\" ? os.homedir() : cwd;\n await deleteLocalSkill(deleteDir, skillId);\n }\n }\n\n if (sourceResult.marketplace) {\n const marketplaceExists = await claudePluginMarketplaceExists(sourceResult.marketplace);\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${sourceResult.marketplace}\"...`);\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${sourceResult.marketplace}`);\n }\n\n for (const skillId of addedSkills) {\n // Find the skill config to get its scope\n const skillConfig = result.skills.find((s) => s.id === skillId);\n if (!skillConfig || skillConfig.source === \"local\") continue;\n\n const pluginRef = `${skillId}@${sourceResult.marketplace}`;\n const pluginScope = skillConfig.scope === \"global\" ? \"user\" : \"project\";\n this.log(`Installing plugin: ${pluginRef}...`);\n try {\n await claudePluginInstall(pluginRef, pluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`);\n }\n }\n for (const skillId of removedSkills) {\n // For removed skills, use old config to determine scope\n const oldSkill = projectConfig?.config?.skills?.find((s) => s.id === skillId);\n const pluginScope = oldSkill?.scope === \"global\" ? \"user\" : \"project\";\n this.log(`Uninstalling plugin: ${skillId}...`);\n try {\n await claudePluginUninstall(skillId, pluginScope, cwd);\n } catch (error) {\n this.warn(`Failed to uninstall plugin ${skillId}: ${getErrorMessage(error)}`);\n }\n }\n }\n\n // Copy newly added local-source skills to .claude/skills/ (split by scope)\n const addedLocalSkills = result.skills.filter(\n (s) => addedSkills.includes(s.id) && s.source === \"local\",\n );\n\n if (addedLocalSkills.length > 0) {\n const projectLocalSkills = addedLocalSkills.filter((s) => s.scope !== \"global\");\n const globalLocalSkills = addedLocalSkills.filter((s) => s.scope === \"global\");\n\n const projectPaths = resolveInstallPaths(cwd, \"project\");\n const globalPaths = resolveInstallPaths(cwd, \"global\");\n\n if (projectLocalSkills.length > 0) {\n await ensureDir(projectPaths.skillsDir);\n await copySkillsToLocalFlattened(\n projectLocalSkills.map((s) => s.id),\n projectPaths.skillsDir,\n sourceResult.matrix,\n sourceResult,\n );\n }\n\n if (globalLocalSkills.length > 0) {\n await ensureDir(globalPaths.skillsDir);\n await copySkillsToLocalFlattened(\n globalLocalSkills.map((s) => s.id),\n globalPaths.skillsDir,\n sourceResult.matrix,\n sourceResult,\n );\n }\n\n this.log(`Copied ${addedLocalSkills.length} local skill(s) to .claude/skills/`);\n }\n\n // Load agent definitions first — needed for both config-types.ts and recompilation\n let sourcePath: string;\n this.log(\n flags[\"agent-source\"]\n ? STATUS_MESSAGES.FETCHING_AGENT_PARTIALS\n : STATUS_MESSAGES.LOADING_AGENT_PARTIALS,\n );\n try {\n const agentDefs = await getAgentDefinitions(flags[\"agent-source\"], {\n forceRefresh: flags.refresh,\n });\n sourcePath = agentDefs.sourcePath;\n this.log(flags[\"agent-source\"] ? \"✓ Agent partials fetched\\n\" : \"✓ Agent partials loaded\\n\");\n } catch (error) {\n this.handleError(error);\n }\n\n // Persist wizard result to config.ts and config-types.ts (split by scope when in project context)\n try {\n const mergeResult = await buildAndMergeConfig(result, sourceResult, cwd, flags.source);\n\n // Load full agent definitions for config-types.ts generation\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const sourceAgents = await loadAllAgents(sourcePath);\n const agents: Record<AgentName, AgentDefinition> = { ...cliAgents, ...sourceAgents };\n\n // Ensure global config exists before writing project config (so the\n // `import globalConfig from \"~/.claude-src/config\"` doesn't throw)\n if (cwd !== os.homedir()) {\n await ensureBlankGlobalConfig();\n }\n\n // Recompute configPath from cwd — when detectInstallation() fell back to\n // global, installation.configPath points to ~/.claude-src/config.ts, but\n // writeScopedConfigs uses it as the project config path.\n const configPath = path.join(cwd, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_TS);\n\n // Determine whether a project installation already exists:\n // If detectInstallation() found a project config, projectDir differs from homedir.\n // If it fell back to global, projectDir === homedir (no project installation).\n const projectInstallationExists =\n path.resolve(installation.projectDir) !== path.resolve(os.homedir());\n\n await writeScopedConfigs(\n mergeResult.config,\n sourceResult.matrix,\n agents,\n cwd,\n configPath,\n projectInstallationExists,\n );\n } catch (error) {\n this.warn(`Could not update config: ${getErrorMessage(error)}`);\n }\n\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n try {\n const recompileSkills = await discoverAllPluginSkills(cwd);\n\n // Build scope map so recompileAgents routes agents to the correct directory:\n // global agents -> ~/.claude/agents/, project agents -> <cwd>/.claude/agents/\n const agentScopeMap = new Map(result.agentConfigs.map((a) => [a.name, a.scope] as const));\n const outputDir = path.join(cwd, CLAUDE_DIR, \"agents\");\n\n const recompileResult = await recompileAgents({\n pluginDir: cwd,\n sourcePath,\n skills: recompileSkills,\n projectDir: cwd,\n outputDir,\n installMode: deriveInstallMode(result.skills),\n agentScopeMap,\n });\n\n if (recompileResult.failed.length > 0) {\n this.log(\n `✓ Recompiled ${recompileResult.compiled.length} agents (${recompileResult.failed.length} failed)\\n`,\n );\n for (const warning of recompileResult.warnings) {\n this.warn(warning);\n }\n } else if (recompileResult.compiled.length > 0) {\n this.log(`✓ Recompiled ${recompileResult.compiled.length} agents\\n`);\n } else {\n this.log(\"✓ No agents to recompile\\n\");\n }\n } catch (error) {\n this.warn(`Agent recompilation failed: ${getErrorMessage(error)}`);\n this.log(`You can manually recompile with '${CLI_BIN_NAME} compile'.\\n`);\n }\n\n // Clean up old agent .md files after scope changes.\n // Recompilation wrote the new file to the correct scope directory;\n // now delete the stale copy from the old scope directory.\n for (const [agentName, change] of agentScopeChanges) {\n const oldBaseDir = change.from === \"global\" ? os.homedir() : cwd;\n const oldAgentPath = path.join(oldBaseDir, CLAUDE_DIR, \"agents\", `${agentName}.md`);\n try {\n await remove(oldAgentPath);\n } catch (error) {\n this.warn(`Could not remove old agent file ${oldAgentPath}: ${getErrorMessage(error)}`);\n }\n }\n\n const summaryParts = [`${addedSkills.length} added`, `${removedSkills.length} removed`];\n if (hasAgentChanges) {\n summaryParts.push(\n `${addedAgents.length} agent${addedAgents.length !== 1 ? \"s\" : \"\"} added, ${removedAgents.length} agent${removedAgents.length !== 1 ? \"s\" : \"\"} removed`,\n );\n }\n if (hasSourceChanges) {\n summaryParts.push(`${sourceChanges.size} source${sourceChanges.size > 1 ? \"s\" : \"\"} changed`);\n }\n if (hasScopeChanges || hasAgentScopeChanges) {\n const totalScopeChanges = scopeChanges.size + agentScopeChanges.size;\n summaryParts.push(`${totalScopeChanges} scope${totalScopeChanges > 1 ? \"s\" : \"\"} changed`);\n }\n this.log(`\\n\\u2713 Plugin updated! (${summaryParts.join(\", \")})\\n`);\n }\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../../src/cli/commands/edit.tsx"],"sourcesContent":["import os from \"os\";\nimport path from \"path\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render } from \"ink\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { CLAUDE_DIR, CLI_BIN_NAME, GLOBAL_INSTALL_ROOT, SOURCE_DISPLAY_NAMES } from \"../consts.js\";\nimport {\n detectProject,\n loadSource,\n copyLocalSkills,\n ensureMarketplace,\n installPluginSkills,\n uninstallPluginSkills,\n migratePluginSkillScopes,\n loadAgentDefs,\n type AgentDefs,\n writeProjectConfig,\n compileAgents,\n detectConfigChanges,\n} from \"../lib/operations/index.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport {\n detectMigrations,\n executeMigration,\n deriveInstallMode,\n} from \"../lib/installation/index.js\";\nimport { matrix, getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { discoverAllPluginSkills } from \"../lib/plugins/index.js\";\nimport { deleteLocalSkill, migrateLocalSkillScope } from \"../lib/skills/index.js\";\nimport type { SkillId } from \"../types/index.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { remove } from \"../utils/fs.js\";\nimport { type StartupMessage } from \"../utils/logger.js\";\nimport { ERROR_MESSAGES, INFO_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\n\nfunction formatSourceDisplayName(sourceName: string): string {\n return SOURCE_DISPLAY_NAMES[sourceName] ?? sourceName;\n}\n\nexport default class Edit extends BaseCommand {\n static summary = \"Edit skills in the plugin\";\n static description = \"Modify the currently installed skills via interactive wizard\";\n\n static examples = [\n {\n description: \"Open the edit wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Edit with a custom source\",\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 sources\",\n default: false,\n }),\n \"agent-source\": Flags.string({\n description: \"Remote agent partials source (default: local CLI)\",\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Edit);\n const cwd = process.cwd();\n\n const detected = await detectProject();\n if (!detected) {\n this.error(ERROR_MESSAGES.NO_INSTALLATION, {\n exit: EXIT_CODES.ERROR,\n });\n }\n const { installation, config: projectConfig } = detected;\n\n // Use installation.projectDir for reads (loading config, discovering installed skills).\n // Use cwd for writes (config saves, plugin installs, scope migrations, recompilation output)\n // and for the locked-items check (determining whether global items are read-only).\n const projectDir = installation.projectDir;\n\n let sourceResult;\n let startupMessages: StartupMessage[] = [];\n try {\n const loaded = await loadSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n captureStartupMessages: true,\n });\n sourceResult = loaded.sourceResult;\n startupMessages = loaded.startupMessages;\n\n const sourceInfo = sourceResult.isLocal ? \"local\" : sourceResult.sourceConfig.sourceOrigin;\n startupMessages.push({\n level: \"info\",\n text: `Loaded ${Object.keys(matrix.skills).length} skills (${sourceInfo})`,\n });\n } catch (error) {\n this.handleError(error);\n }\n\n let currentSkillIds: SkillId[];\n try {\n const discoveredSkills = await discoverAllPluginSkills(projectDir);\n // Boundary cast: discoverAllPluginSkills keys are skill IDs from frontmatter\n const pluginSkillIds = Object.keys(discoveredSkills) as SkillId[];\n\n // Merge plugin-discovered skills with config skills (catches local skills and\n // global-scoped plugins that discoverAllPluginSkills doesn't find).\n const configSkillIds = projectConfig?.skills?.map((s) => s.id) ?? [];\n const mergedIds = new Set<SkillId>([...pluginSkillIds, ...configSkillIds]);\n currentSkillIds = [...mergedIds];\n\n startupMessages.push({\n level: \"info\",\n text: `Found ${currentSkillIds.length} installed skills`,\n });\n } catch (error) {\n this.handleError(error);\n }\n\n let wizardResult: WizardResultV2 | null = null;\n\n // D9: In project context, existing global items are read-only (locked).\n // When editing from ~/ (global context), nothing is locked.\n // Uses cwd (not projectDir) so that global items are correctly locked\n // even when detectInstallation() fell back to the global installation.\n const isGlobalDir = cwd === GLOBAL_INSTALL_ROOT;\n const lockedSkillIds = isGlobalDir\n ? undefined\n : projectConfig?.skills?.filter((s) => s.scope === \"global\").map((s) => s.id);\n const lockedAgentNames = isGlobalDir\n ? undefined\n : projectConfig?.agents?.filter((a) => a.scope === \"global\").map((a) => a.name);\n\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n initialStep=\"build\"\n initialDomains={projectConfig?.domains}\n initialAgents={projectConfig?.selectedAgents}\n installedSkillIds={currentSkillIds}\n installedSkillConfigs={projectConfig?.skills}\n lockedSkillIds={lockedSkillIds}\n installedAgentConfigs={projectConfig?.agents}\n lockedAgentNames={lockedAgentNames}\n isEditingFromGlobalScope={isGlobalDir}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"\\nEdit 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\n if (!result || result.cancelled) {\n this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n }\n\n if (result.validation.errors.length > 0) {\n for (const err of result.validation.errors) {\n this.warn(err.message);\n }\n }\n\n const changes = detectConfigChanges(projectConfig, result, currentSkillIds);\n const {\n addedSkills,\n removedSkills,\n addedAgents,\n removedAgents,\n sourceChanges,\n scopeChanges,\n agentScopeChanges,\n } = changes;\n\n const hasSourceChanges = sourceChanges.size > 0;\n const hasScopeChanges = scopeChanges.size > 0;\n const hasAgentScopeChanges = agentScopeChanges.size > 0;\n const hasSkillChanges = addedSkills.length > 0 || removedSkills.length > 0;\n const hasAgentChanges = addedAgents.length > 0 || removedAgents.length > 0;\n\n if (\n !hasSkillChanges &&\n !hasAgentChanges &&\n !hasSourceChanges &&\n !hasScopeChanges &&\n !hasAgentScopeChanges\n ) {\n this.log(INFO_MESSAGES.NO_CHANGES_MADE);\n this.log(\"Plugin unchanged\\n\");\n return;\n }\n\n this.log(\"\\nChanges:\");\n for (const skillId of addedSkills) {\n this.log(` + ${getSkillById(skillId).displayName}`);\n }\n for (const skillId of removedSkills) {\n const skill = matrix.skills[skillId];\n this.log(` - ${skill?.displayName ?? skillId}`);\n }\n for (const agentName of addedAgents) {\n this.log(` + ${agentName} (agent)`);\n }\n for (const agentName of removedAgents) {\n this.log(` - ${agentName} (agent)`);\n }\n for (const [skillId, change] of sourceChanges) {\n const fromLabel = formatSourceDisplayName(change.from);\n const toLabel = formatSourceDisplayName(change.to);\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [skillId, change] of scopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${skillId} (${fromLabel} \\u2192 ${toLabel})`);\n }\n for (const [agentName, change] of agentScopeChanges) {\n const fromLabel = change.from === \"global\" ? \"[G]\" : \"[P]\";\n const toLabel = change.to === \"global\" ? \"[G]\" : \"[P]\";\n this.log(` ~ ${agentName} (${fromLabel} \\u2192 ${toLabel})`);\n }\n this.log(\"\");\n\n // Handle per-skill mode migrations (local <-> plugin)\n const oldSkills = projectConfig?.skills ?? [];\n const migrationPlan = detectMigrations(oldSkills, result.skills);\n const hasMigrations = migrationPlan.toLocal.length > 0 || migrationPlan.toPlugin.length > 0;\n\n if (hasMigrations) {\n if (migrationPlan.toLocal.length > 0) {\n this.log(`Switching ${migrationPlan.toLocal.length} skill(s) to local:`);\n for (const migration of migrationPlan.toLocal) {\n this.log(` - ${migration.id}`);\n }\n }\n if (migrationPlan.toPlugin.length > 0) {\n this.log(`Switching ${migrationPlan.toPlugin.length} skill(s) to plugin:`);\n for (const migration of migrationPlan.toPlugin) {\n this.log(` - ${migration.id}`);\n }\n }\n\n const migrationResult = await executeMigration(migrationPlan, cwd, sourceResult);\n\n for (const warning of migrationResult.warnings) {\n this.warn(warning);\n }\n }\n\n const migratedSkillIds = new Set([\n ...migrationPlan.toLocal.map((m) => m.id),\n ...migrationPlan.toPlugin.map((m) => m.id),\n ]);\n\n // Handle scope migrations (P→G or G→P) for local-mode skills\n for (const [skillId, change] of scopeChanges) {\n const skillConfig = result.skills.find((s) => s.id === skillId);\n if (skillConfig?.source === \"local\") {\n await migrateLocalSkillScope(skillId, change.from, cwd);\n }\n }\n\n // Handle scope migrations for plugin-mode skills\n if (sourceResult.marketplace && scopeChanges.size > 0) {\n const pluginScopeResult = await migratePluginSkillScopes(\n scopeChanges,\n result.skills,\n sourceResult.marketplace,\n cwd,\n );\n for (const item of pluginScopeResult.failed) {\n this.warn(`Failed to migrate plugin scope for ${item.id}: ${item.error}`);\n }\n }\n\n // Handle remaining non-migration source changes (e.g., marketplace A -> marketplace B)\n for (const [skillId, change] of sourceChanges) {\n // Skip skills already handled by mode migration\n if (migratedSkillIds.has(skillId)) {\n continue;\n }\n if (change.from === \"local\") {\n const oldSkill = projectConfig?.skills?.find((s) => s.id === skillId);\n const deleteDir = oldSkill?.scope === \"global\" ? os.homedir() : cwd;\n await deleteLocalSkill(deleteDir, skillId);\n }\n }\n\n if (sourceResult.marketplace) {\n const mpResult = await ensureMarketplace(sourceResult);\n if (mpResult.registered) {\n this.log(`Registered marketplace: ${mpResult.marketplace}`);\n }\n\n const addedPluginSkills = result.skills.filter(\n (s) => addedSkills.includes(s.id) && s.source !== \"local\",\n );\n if (addedPluginSkills.length > 0) {\n const pluginResult = await installPluginSkills(\n addedPluginSkills,\n sourceResult.marketplace,\n cwd,\n );\n for (const item of pluginResult.installed) {\n this.log(`Installing plugin: ${item.ref}...`);\n }\n for (const item of pluginResult.failed) {\n this.warn(`Failed to install plugin ${item.id}: ${item.error}`);\n }\n }\n\n if (removedSkills.length > 0) {\n const uninstallResult = await uninstallPluginSkills(\n removedSkills,\n projectConfig?.skills ?? [],\n cwd,\n );\n for (const id of uninstallResult.uninstalled) {\n this.log(`Uninstalling plugin: ${id}...`);\n }\n for (const item of uninstallResult.failed) {\n this.warn(`Failed to uninstall plugin ${item.id}: ${item.error}`);\n }\n }\n }\n\n // Copy newly added local-source skills to .claude/skills/ (split by scope)\n const addedLocalSkills = result.skills.filter(\n (s) => addedSkills.includes(s.id) && s.source === \"local\",\n );\n\n if (addedLocalSkills.length > 0) {\n const copyResult = await copyLocalSkills(addedLocalSkills, cwd, sourceResult);\n this.log(`Copied ${copyResult.totalCopied} local skill(s) to .claude/skills/`);\n }\n\n // Load agent definitions — needed for both config-types.ts and recompilation\n let agentDefsResult: AgentDefs;\n this.log(\n flags[\"agent-source\"]\n ? STATUS_MESSAGES.FETCHING_AGENT_PARTIALS\n : STATUS_MESSAGES.LOADING_AGENT_PARTIALS,\n );\n try {\n agentDefsResult = await loadAgentDefs(flags[\"agent-source\"], {\n forceRefresh: flags.refresh,\n });\n this.log(flags[\"agent-source\"] ? \"✓ Agent partials fetched\\n\" : \"✓ Agent partials loaded\\n\");\n } catch (error) {\n this.handleError(error);\n }\n\n // Persist wizard result to config.ts and config-types.ts (split by scope when in project context)\n try {\n await writeProjectConfig({\n wizardResult: result,\n sourceResult,\n projectDir: cwd,\n sourceFlag: flags.source,\n agents: agentDefsResult.agents,\n });\n } catch (error) {\n this.warn(`Could not update config: ${getErrorMessage(error)}`);\n }\n\n this.log(STATUS_MESSAGES.RECOMPILING_AGENTS);\n try {\n const agentScopeMap = new Map(result.agentConfigs.map((a) => [a.name, a.scope] as const));\n const compilationResult = await compileAgents({\n projectDir: cwd,\n sourcePath: agentDefsResult.sourcePath,\n pluginDir: cwd,\n outputDir: path.join(cwd, CLAUDE_DIR, \"agents\"),\n installMode: deriveInstallMode(result.skills),\n agentScopeMap,\n });\n\n if (compilationResult.failed.length > 0) {\n this.log(\n `✓ Recompiled ${compilationResult.compiled.length} agents (${compilationResult.failed.length} failed)\\n`,\n );\n for (const warning of compilationResult.warnings) {\n this.warn(warning);\n }\n } else if (compilationResult.compiled.length > 0) {\n this.log(`✓ Recompiled ${compilationResult.compiled.length} agents\\n`);\n } else {\n this.log(\"✓ No agents to recompile\\n\");\n }\n } catch (error) {\n this.warn(`Agent recompilation failed: ${getErrorMessage(error)}`);\n this.log(`You can manually recompile with '${CLI_BIN_NAME} compile'.\\n`);\n }\n\n // Clean up old agent .md files after scope changes.\n // Recompilation wrote the new file to the correct scope directory;\n // now delete the stale copy from the old scope directory.\n for (const [agentName, change] of agentScopeChanges) {\n const oldBaseDir = change.from === \"global\" ? os.homedir() : cwd;\n const oldAgentPath = path.join(oldBaseDir, CLAUDE_DIR, \"agents\", `${agentName}.md`);\n try {\n await remove(oldAgentPath);\n } catch (error) {\n this.warn(`Could not remove old agent file ${oldAgentPath}: ${getErrorMessage(error)}`);\n }\n }\n\n const summaryParts = [`${addedSkills.length} added`, `${removedSkills.length} removed`];\n if (hasAgentChanges) {\n summaryParts.push(\n `${addedAgents.length} agent${addedAgents.length !== 1 ? \"s\" : \"\"} added, ${removedAgents.length} agent${removedAgents.length !== 1 ? \"s\" : \"\"} removed`,\n );\n }\n if (hasSourceChanges) {\n summaryParts.push(`${sourceChanges.size} source${sourceChanges.size > 1 ? \"s\" : \"\"} changed`);\n }\n if (hasScopeChanges || hasAgentScopeChanges) {\n const totalScopeChanges = scopeChanges.size + agentScopeChanges.size;\n summaryParts.push(`${totalScopeChanges} scope${totalScopeChanges > 1 ? \"s\" : \"\"} changed`);\n }\n this.log(`\\n\\u2713 Plugin updated! (${summaryParts.join(\", \")})\\n`);\n }\n}\n"],"mappings":"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","names":["result"]}