@agents-inc/cli 0.86.0 → 0.87.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.
- package/CHANGELOG.md +10 -0
- package/dist/chunk-5UJJQFET.js +564 -0
- package/dist/chunk-5UJJQFET.js.map +1 -0
- package/dist/{chunk-GED2F75H.js → chunk-7FFNNDJQ.js} +176 -120
- package/dist/chunk-7FFNNDJQ.js.map +1 -0
- package/dist/{chunk-BV2MIQ3O.js → chunk-I5AZKNNL.js} +1 -1
- package/dist/chunk-I5AZKNNL.js.map +1 -0
- package/dist/chunk-J6PI73YV.js +68 -0
- package/dist/chunk-J6PI73YV.js.map +1 -0
- package/dist/commands/compile.js +26 -20
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/diff.js +681 -82
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +30 -58
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +164 -32
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +177 -27
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +197 -33
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +41 -34
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +3 -6
- package/dist/commands/new/agent.js +140 -44
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +4 -4
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +194 -30
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +1 -3
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +162 -65
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +259 -62
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +232 -163
- package/dist/commands/update.js.map +1 -1
- package/dist/components/skill-search/skill-search.js +1 -1
- package/dist/hooks/init.js +2 -4
- package/dist/hooks/init.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-BV2MIQ3O.js.map +0 -1
- package/dist/chunk-DCVCFBQ7.js +0 -1800
- package/dist/chunk-DCVCFBQ7.js.map +0 -1
- package/dist/chunk-GED2F75H.js.map +0 -1
- package/dist/chunk-O5ZWS26C.js +0 -166
- package/dist/chunk-O5ZWS26C.js.map +0 -1
- package/dist/chunk-XQK4S22C.js +0 -202
- package/dist/chunk-XQK4S22C.js.map +0 -1
package/dist/commands/eject.js
CHANGED
|
@@ -1,32 +1,40 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
ejectAgentPartials,
|
|
4
|
-
ejectSkills,
|
|
5
|
-
ensureMinimalConfig,
|
|
6
3
|
loadSource
|
|
7
|
-
} from "../chunk-
|
|
4
|
+
} from "../chunk-5UJJQFET.js";
|
|
8
5
|
import "../chunk-N6A7A4RA.js";
|
|
9
|
-
import "../chunk-O5ZWS26C.js";
|
|
10
|
-
import "../chunk-XQK4S22C.js";
|
|
11
6
|
import "../chunk-FBZR46GC.js";
|
|
12
7
|
import {
|
|
8
|
+
copySkillsToLocalFlattened,
|
|
9
|
+
loadProjectSourceConfig,
|
|
10
|
+
resolveSource,
|
|
13
11
|
saveSourceToProjectConfig
|
|
14
12
|
} from "../chunk-TMTUTUEV.js";
|
|
15
13
|
import "../chunk-B6MYECV6.js";
|
|
16
14
|
import {
|
|
17
|
-
matrix
|
|
15
|
+
matrix,
|
|
16
|
+
typedKeys
|
|
18
17
|
} from "../chunk-ANXHMG32.js";
|
|
19
18
|
import {
|
|
20
19
|
BaseCommand,
|
|
21
20
|
EXIT_CODES
|
|
22
21
|
} from "../chunk-MMTMXLI4.js";
|
|
23
22
|
import {
|
|
24
|
-
|
|
23
|
+
copy,
|
|
24
|
+
directoryExists,
|
|
25
|
+
ensureDir,
|
|
26
|
+
fileExists,
|
|
27
|
+
listDirectories,
|
|
28
|
+
writeFile
|
|
25
29
|
} from "../chunk-NUU3U43A.js";
|
|
26
30
|
import "../chunk-6XWHJHNZ.js";
|
|
27
31
|
import {
|
|
28
32
|
CLAUDE_SRC_DIR,
|
|
29
|
-
DEFAULT_BRANDING
|
|
33
|
+
DEFAULT_BRANDING,
|
|
34
|
+
DIRS,
|
|
35
|
+
LOCAL_SKILLS_PATH,
|
|
36
|
+
PROJECT_ROOT,
|
|
37
|
+
STANDARD_FILES
|
|
30
38
|
} from "../chunk-6PGL2XMY.js";
|
|
31
39
|
import "../chunk-NPMMU4GY.js";
|
|
32
40
|
import {
|
|
@@ -93,45 +101,64 @@ var Eject = class _Eject extends BaseCommand {
|
|
|
93
101
|
async run() {
|
|
94
102
|
const { args, flags } = await this.parse(_Eject);
|
|
95
103
|
const projectDir = process.cwd();
|
|
96
|
-
|
|
104
|
+
const ejectType = this.validateEjectType(args.type);
|
|
105
|
+
const outputBase = await this.resolveOutputBase(flags, projectDir);
|
|
106
|
+
this.printHeader(flags.output ? outputBase : void 0);
|
|
107
|
+
const sourceResult = await this.loadSourceIfNeeded(ejectType, flags, projectDir);
|
|
108
|
+
await this.executeEject(ejectType, outputBase, flags, projectDir, sourceResult);
|
|
109
|
+
await this.saveSourceIfFlagged(flags.source, projectDir);
|
|
110
|
+
await this.ensureConfig(projectDir, flags.source, sourceResult);
|
|
111
|
+
this.log("");
|
|
112
|
+
this.logSuccess("Eject complete!");
|
|
113
|
+
this.log("");
|
|
114
|
+
}
|
|
115
|
+
validateEjectType(typeArg) {
|
|
116
|
+
if (!typeArg) {
|
|
97
117
|
this.error("Please specify what to eject: agent-partials, templates, skills, or all", {
|
|
98
118
|
exit: EXIT_CODES.INVALID_ARGS
|
|
99
119
|
});
|
|
100
120
|
}
|
|
101
|
-
if (!isEjectType(
|
|
102
|
-
this.error(`Unknown eject type: ${
|
|
121
|
+
if (!isEjectType(typeArg)) {
|
|
122
|
+
this.error(`Unknown eject type: ${typeArg}`, {
|
|
103
123
|
exit: EXIT_CODES.INVALID_ARGS
|
|
104
124
|
});
|
|
105
125
|
}
|
|
106
|
-
|
|
126
|
+
return typeArg;
|
|
127
|
+
}
|
|
128
|
+
async resolveOutputBase(flags, projectDir) {
|
|
107
129
|
if (flags.output) {
|
|
108
130
|
const expandedPath = flags.output.startsWith("~") ? path.join(os.homedir(), flags.output.slice(1)) : flags.output;
|
|
109
|
-
outputBase = path.resolve(projectDir, expandedPath);
|
|
131
|
+
const outputBase = path.resolve(projectDir, expandedPath);
|
|
110
132
|
if (await fileExists(outputBase)) {
|
|
111
133
|
this.error(`Output path exists as a file: ${outputBase}`, {
|
|
112
134
|
exit: EXIT_CODES.INVALID_ARGS
|
|
113
135
|
});
|
|
114
136
|
}
|
|
115
|
-
|
|
116
|
-
outputBase = path.join(projectDir, CLAUDE_SRC_DIR);
|
|
137
|
+
return outputBase;
|
|
117
138
|
}
|
|
139
|
+
return path.join(projectDir, CLAUDE_SRC_DIR);
|
|
140
|
+
}
|
|
141
|
+
printHeader(outputBase) {
|
|
118
142
|
this.log("");
|
|
119
143
|
this.log(`${DEFAULT_BRANDING.NAME} Eject`);
|
|
120
144
|
this.log("");
|
|
121
|
-
if (
|
|
145
|
+
if (outputBase) {
|
|
122
146
|
this.log(`Output directory: ${outputBase}`);
|
|
123
147
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
let sourceResult;
|
|
148
|
+
}
|
|
149
|
+
async loadSourceIfNeeded(ejectType, flags, projectDir) {
|
|
127
150
|
if (ejectType === "skills" || ejectType === "all") {
|
|
128
151
|
const loaded = await loadSource({
|
|
129
152
|
sourceFlag: flags.source,
|
|
130
153
|
projectDir,
|
|
131
154
|
forceRefresh: flags.refresh
|
|
132
155
|
});
|
|
133
|
-
|
|
156
|
+
return loaded.sourceResult;
|
|
134
157
|
}
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
160
|
+
async executeEject(ejectType, outputBase, flags, projectDir, sourceResult) {
|
|
161
|
+
const directOutput = !!flags.output;
|
|
135
162
|
switch (ejectType) {
|
|
136
163
|
case "agent-partials":
|
|
137
164
|
await this.handleAgentPartials(outputBase, flags.force, directOutput, false);
|
|
@@ -150,21 +177,22 @@ var Eject = class _Eject extends BaseCommand {
|
|
|
150
177
|
default:
|
|
151
178
|
break;
|
|
152
179
|
}
|
|
153
|
-
|
|
154
|
-
|
|
180
|
+
}
|
|
181
|
+
async saveSourceIfFlagged(sourceFlag, projectDir) {
|
|
182
|
+
if (sourceFlag) {
|
|
183
|
+
await saveSourceToProjectConfig(projectDir, sourceFlag, path.basename(projectDir));
|
|
155
184
|
this.log(`Source saved to .claude-src/config.ts`);
|
|
156
185
|
}
|
|
186
|
+
}
|
|
187
|
+
async ensureConfig(projectDir, sourceFlag, sourceResult) {
|
|
157
188
|
const configResult = await ensureMinimalConfig({
|
|
158
189
|
projectDir,
|
|
159
|
-
sourceFlag
|
|
190
|
+
sourceFlag,
|
|
160
191
|
sourceResult
|
|
161
192
|
});
|
|
162
193
|
if (configResult.created) {
|
|
163
194
|
this.logSuccess(`Created ${CLAUDE_SRC_DIR}/config.ts`);
|
|
164
195
|
}
|
|
165
|
-
this.log("");
|
|
166
|
-
this.logSuccess("Eject complete!");
|
|
167
|
-
this.log("");
|
|
168
196
|
}
|
|
169
197
|
async handleAgentPartials(outputBase, force, directOutput, templatesOnly) {
|
|
170
198
|
const result = await ejectAgentPartials({
|
|
@@ -208,6 +236,128 @@ var Eject = class _Eject extends BaseCommand {
|
|
|
208
236
|
this.log("You can now customize skill content locally.");
|
|
209
237
|
}
|
|
210
238
|
};
|
|
239
|
+
async function ejectAgentPartials(options) {
|
|
240
|
+
const { outputBase, force, directOutput = false, templatesOnly = false } = options;
|
|
241
|
+
const sourceDir = templatesOnly ? path.join(PROJECT_ROOT, DIRS.templates) : path.join(PROJECT_ROOT, DIRS.agents);
|
|
242
|
+
if (!await directoryExists(sourceDir)) {
|
|
243
|
+
return {
|
|
244
|
+
skipped: true,
|
|
245
|
+
skipReason: templatesOnly ? "No agent templates found in CLI." : "No agent partials found in CLI.",
|
|
246
|
+
templatesSkipped: false
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const destDir = directOutput ? outputBase : templatesOnly ? path.join(outputBase, path.basename(DIRS.agents), path.basename(DIRS.templates)) : path.join(outputBase, path.basename(DIRS.agents));
|
|
250
|
+
const templatesBasename = path.basename(DIRS.templates);
|
|
251
|
+
if (await directoryExists(destDir) && !force) {
|
|
252
|
+
if (templatesOnly) {
|
|
253
|
+
return {
|
|
254
|
+
skipped: true,
|
|
255
|
+
skipReason: `Agent templates already exist at ${destDir}. Use --force to overwrite.`,
|
|
256
|
+
templatesSkipped: false
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
const hasTemplates = await directoryExists(path.join(destDir, templatesBasename));
|
|
260
|
+
if (await hasAgentPartialDirs(destDir) && !hasTemplates) {
|
|
261
|
+
return {
|
|
262
|
+
skipped: true,
|
|
263
|
+
skipReason: `Agent partials already exist at ${destDir}. Use --force to overwrite.`,
|
|
264
|
+
templatesSkipped: false
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
await ensureDir(destDir);
|
|
269
|
+
const skipTemplates = !templatesOnly && !force && await directoryExists(path.join(destDir, templatesBasename));
|
|
270
|
+
if (skipTemplates) {
|
|
271
|
+
const sourceEntries = await listDirectories(sourceDir);
|
|
272
|
+
const nonTemplateEntries = sourceEntries.filter((entry) => entry !== templatesBasename);
|
|
273
|
+
for (const entry of nonTemplateEntries) {
|
|
274
|
+
await copy(path.join(sourceDir, entry), path.join(destDir, entry));
|
|
275
|
+
}
|
|
276
|
+
} else {
|
|
277
|
+
await copy(sourceDir, destDir);
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
skipped: false,
|
|
281
|
+
destDir,
|
|
282
|
+
templatesSkipped: skipTemplates
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
async function ejectSkills(options) {
|
|
286
|
+
const {
|
|
287
|
+
projectDir,
|
|
288
|
+
force,
|
|
289
|
+
sourceResult,
|
|
290
|
+
matrix: matrix2,
|
|
291
|
+
directOutput = false,
|
|
292
|
+
customOutputBase
|
|
293
|
+
} = options;
|
|
294
|
+
const destDir = directOutput && customOutputBase ? customOutputBase : path.join(projectDir, LOCAL_SKILLS_PATH);
|
|
295
|
+
if (await directoryExists(destDir) && !force) {
|
|
296
|
+
return {
|
|
297
|
+
skipped: true,
|
|
298
|
+
skipReason: `Skills already exist at ${destDir}. Use --force to overwrite.`,
|
|
299
|
+
copiedSkills: []
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
const skillIds = typedKeys(matrix2.skills).filter(
|
|
303
|
+
(skillId) => !matrix2.skills[skillId]?.local
|
|
304
|
+
);
|
|
305
|
+
if (skillIds.length === 0) {
|
|
306
|
+
return {
|
|
307
|
+
skipped: true,
|
|
308
|
+
skipReason: "No skills found in source to eject.",
|
|
309
|
+
copiedSkills: []
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
await ensureDir(destDir);
|
|
313
|
+
const copiedSkills = await copySkillsToLocalFlattened(skillIds, destDir, matrix2, sourceResult);
|
|
314
|
+
const sourceLabel = sourceResult.isLocal ? sourceResult.sourcePath : sourceResult.marketplace || sourceResult.sourceConfig.source;
|
|
315
|
+
return {
|
|
316
|
+
skipped: false,
|
|
317
|
+
copiedSkills,
|
|
318
|
+
destDir,
|
|
319
|
+
sourceLabel
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
async function ensureMinimalConfig(options) {
|
|
323
|
+
const { projectDir, sourceFlag, sourceResult } = options;
|
|
324
|
+
const tsConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_TS);
|
|
325
|
+
if (await fileExists(tsConfigPath)) {
|
|
326
|
+
return { configPath: tsConfigPath, created: false };
|
|
327
|
+
}
|
|
328
|
+
const projectName = path.basename(projectDir);
|
|
329
|
+
const config = {
|
|
330
|
+
name: projectName
|
|
331
|
+
};
|
|
332
|
+
const resolvedConfig = sourceResult?.sourceConfig ?? await resolveSource(sourceFlag, projectDir);
|
|
333
|
+
if (sourceFlag) {
|
|
334
|
+
config.source = sourceFlag;
|
|
335
|
+
} else if (resolvedConfig.source) {
|
|
336
|
+
config.source = resolvedConfig.source;
|
|
337
|
+
}
|
|
338
|
+
if (resolvedConfig.marketplace) {
|
|
339
|
+
config.marketplace = resolvedConfig.marketplace;
|
|
340
|
+
}
|
|
341
|
+
const existingProjectConfig = await loadProjectSourceConfig(projectDir);
|
|
342
|
+
if (existingProjectConfig?.author) {
|
|
343
|
+
config.author = existingProjectConfig.author;
|
|
344
|
+
}
|
|
345
|
+
if (existingProjectConfig?.agentsSource) {
|
|
346
|
+
config.agentsSource = existingProjectConfig.agentsSource;
|
|
347
|
+
}
|
|
348
|
+
await ensureDir(path.join(projectDir, CLAUDE_SRC_DIR));
|
|
349
|
+
const cleaned = JSON.parse(JSON.stringify(config));
|
|
350
|
+
const body = JSON.stringify(cleaned, null, 2);
|
|
351
|
+
const content = `export default ${body};
|
|
352
|
+
`;
|
|
353
|
+
await writeFile(tsConfigPath, content);
|
|
354
|
+
return { configPath: tsConfigPath, created: true };
|
|
355
|
+
}
|
|
356
|
+
async function hasAgentPartialDirs(agentsDir) {
|
|
357
|
+
const subdirs = await listDirectories(agentsDir);
|
|
358
|
+
const templatesBasename = path.basename(DIRS.templates);
|
|
359
|
+
return subdirs.some((dir) => dir !== templatesBasename);
|
|
360
|
+
}
|
|
211
361
|
export {
|
|
212
362
|
Eject as default
|
|
213
363
|
};
|
|
@@ -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 { BaseCommand } from \"../base-command.js\";\nimport { fileExists } from \"../utils/fs.js\";\nimport { CLAUDE_SRC_DIR, DEFAULT_BRANDING } from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { type SourceLoadResult } from \"../lib/loading/index.js\";\nimport {\n loadSource,\n ejectAgentPartials,\n ejectSkills,\n ensureMinimalConfig,\n} from \"../lib/operations/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport { saveSourceToProjectConfig } from \"../lib/configuration/index.js\";\n\nconst EJECT_TYPES = [\"agent-partials\", \"templates\", \"skills\", \"all\"] as const;\ntype EjectType = (typeof EJECT_TYPES)[number];\n\nfunction isEjectType(value: string): value is EjectType {\n return (EJECT_TYPES as readonly string[]).includes(value);\n}\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],\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 (!isEjectType(args.type)) {\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;\n const directOutput = !!flags.output;\n\n let sourceResult: SourceLoadResult | undefined;\n if (ejectType === \"skills\" || ejectType === \"all\") {\n const loaded = await loadSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n sourceResult = loaded.sourceResult;\n }\n\n switch (ejectType) {\n case \"agent-partials\":\n await this.handleAgentPartials(outputBase, flags.force, directOutput, false);\n break;\n case \"templates\":\n await this.handleAgentPartials(outputBase, flags.force, directOutput, true);\n break;\n case \"skills\":\n await this.handleSkills(projectDir, flags.force, sourceResult!, directOutput, outputBase);\n break;\n case \"all\":\n await this.handleAgentPartials(outputBase, flags.force, directOutput, false);\n await this.handleAgentPartials(outputBase, true, directOutput, true);\n await this.handleSkills(projectDir, flags.force, sourceResult!, directOutput, outputBase);\n break;\n default:\n break;\n }\n\n if (flags.source) {\n await saveSourceToProjectConfig(projectDir, flags.source, path.basename(projectDir));\n this.log(`Source saved to .claude-src/config.ts`);\n }\n\n const configResult = await ensureMinimalConfig({\n projectDir,\n sourceFlag: flags.source,\n sourceResult,\n });\n if (configResult.created) {\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/config.ts`);\n }\n\n this.log(\"\");\n this.logSuccess(\"Eject complete!\");\n this.log(\"\");\n }\n\n private async handleAgentPartials(\n outputBase: string,\n force: boolean,\n directOutput: boolean,\n templatesOnly: boolean,\n ): Promise<void> {\n const result = await ejectAgentPartials({\n outputBase,\n force,\n directOutput,\n templatesOnly,\n });\n\n if (result.skipped) {\n this.warn(result.skipReason!);\n return;\n }\n\n if (result.templatesSkipped) {\n this.warn(\n \"Agent templates already exist — skipping templates, only ejecting agent partials.\",\n );\n }\n\n this.logSuccess(\n `${templatesOnly ? \"Agent templates\" : \"Agent partials\"} ejected to ${result.destDir}`,\n );\n this.log(\n templatesOnly\n ? \"You can now customize agent templates locally.\"\n : \"You can now customize templates, agent intro, workflow, and examples locally.\",\n );\n }\n\n private async handleSkills(\n projectDir: string,\n force: boolean,\n sourceResult: SourceLoadResult,\n directOutput: boolean,\n outputBase: string,\n ): Promise<void> {\n const result = await ejectSkills({\n projectDir,\n force,\n sourceResult,\n matrix,\n directOutput,\n customOutputBase: directOutput ? outputBase : undefined,\n });\n\n if (result.skipped) {\n this.warn(result.skipReason!);\n return;\n }\n\n this.logSuccess(\n `${result.copiedSkills.length} skills ejected to ${result.destDir} from ${result.sourceLabel}`,\n );\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 { 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} from \"../consts.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { type SourceLoadResult } from \"../lib/loading/index.js\";\nimport { loadSource } from \"../lib/operations/index.js\";\nimport { matrix } from \"../lib/matrix/matrix-provider\";\nimport {\n saveSourceToProjectConfig,\n resolveSource,\n loadProjectSourceConfig,\n} from \"../lib/configuration/index.js\";\nimport { copySkillsToLocalFlattened, type CopiedSkill } from \"../lib/skills/index.js\";\nimport type { MergedSkillsMatrix, SkillId } from \"../types/index.js\";\nimport { typedKeys } from \"../utils/typed-object.js\";\n\nconst EJECT_TYPES = [\"agent-partials\", \"templates\", \"skills\", \"all\"] as const;\ntype EjectType = (typeof EJECT_TYPES)[number];\n\nfunction isEjectType(value: string): value is EjectType {\n return (EJECT_TYPES as readonly string[]).includes(value);\n}\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],\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 const ejectType = this.validateEjectType(args.type);\n const outputBase = await this.resolveOutputBase(flags, projectDir);\n\n this.printHeader(flags.output ? outputBase : undefined);\n\n const sourceResult = await this.loadSourceIfNeeded(ejectType, flags, projectDir);\n await this.executeEject(ejectType, outputBase, flags, projectDir, sourceResult);\n await this.saveSourceIfFlagged(flags.source, projectDir);\n await this.ensureConfig(projectDir, flags.source, sourceResult);\n\n this.log(\"\");\n this.logSuccess(\"Eject complete!\");\n this.log(\"\");\n }\n\n private validateEjectType(typeArg: string | undefined): EjectType {\n if (!typeArg) {\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 (!isEjectType(typeArg)) {\n this.error(`Unknown eject type: ${typeArg}`, {\n exit: EXIT_CODES.INVALID_ARGS,\n });\n }\n\n return typeArg;\n }\n\n private async resolveOutputBase(flags: { output?: string }, projectDir: string): Promise<string> {\n if (flags.output) {\n const expandedPath = flags.output.startsWith(\"~\")\n ? path.join(os.homedir(), flags.output.slice(1))\n : flags.output;\n const 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\n return outputBase;\n }\n\n return path.join(projectDir, CLAUDE_SRC_DIR);\n }\n\n private printHeader(outputBase?: string): void {\n this.log(\"\");\n this.log(`${DEFAULT_BRANDING.NAME} Eject`);\n this.log(\"\");\n\n if (outputBase) {\n this.log(`Output directory: ${outputBase}`);\n }\n }\n\n private async loadSourceIfNeeded(\n ejectType: EjectType,\n flags: { source?: string; refresh: boolean },\n projectDir: string,\n ): Promise<SourceLoadResult | undefined> {\n if (ejectType === \"skills\" || ejectType === \"all\") {\n const loaded = await loadSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n return loaded.sourceResult;\n }\n return undefined;\n }\n\n private async executeEject(\n ejectType: EjectType,\n outputBase: string,\n flags: { force: boolean; output?: string },\n projectDir: string,\n sourceResult: SourceLoadResult | undefined,\n ): Promise<void> {\n const directOutput = !!flags.output;\n\n switch (ejectType) {\n case \"agent-partials\":\n await this.handleAgentPartials(outputBase, flags.force, directOutput, false);\n break;\n case \"templates\":\n await this.handleAgentPartials(outputBase, flags.force, directOutput, true);\n break;\n case \"skills\":\n await this.handleSkills(projectDir, flags.force, sourceResult!, directOutput, outputBase);\n break;\n case \"all\":\n await this.handleAgentPartials(outputBase, flags.force, directOutput, false);\n await this.handleAgentPartials(outputBase, true, directOutput, true);\n await this.handleSkills(projectDir, flags.force, sourceResult!, directOutput, outputBase);\n break;\n default:\n break;\n }\n }\n\n private async saveSourceIfFlagged(\n sourceFlag: string | undefined,\n projectDir: string,\n ): Promise<void> {\n if (sourceFlag) {\n await saveSourceToProjectConfig(projectDir, sourceFlag, path.basename(projectDir));\n this.log(`Source saved to .claude-src/config.ts`);\n }\n }\n\n private async ensureConfig(\n projectDir: string,\n sourceFlag: string | undefined,\n sourceResult: SourceLoadResult | undefined,\n ): Promise<void> {\n const configResult = await ensureMinimalConfig({\n projectDir,\n sourceFlag,\n sourceResult,\n });\n if (configResult.created) {\n this.logSuccess(`Created ${CLAUDE_SRC_DIR}/config.ts`);\n }\n }\n\n private async handleAgentPartials(\n outputBase: string,\n force: boolean,\n directOutput: boolean,\n templatesOnly: boolean,\n ): Promise<void> {\n const result = await ejectAgentPartials({\n outputBase,\n force,\n directOutput,\n templatesOnly,\n });\n\n if (result.skipped) {\n this.warn(result.skipReason!);\n return;\n }\n\n if (result.templatesSkipped) {\n this.warn(\n \"Agent templates already exist — skipping templates, only ejecting agent partials.\",\n );\n }\n\n this.logSuccess(\n `${templatesOnly ? \"Agent templates\" : \"Agent partials\"} ejected to ${result.destDir}`,\n );\n this.log(\n templatesOnly\n ? \"You can now customize agent templates locally.\"\n : \"You can now customize templates, agent intro, workflow, and examples locally.\",\n );\n }\n\n private async handleSkills(\n projectDir: string,\n force: boolean,\n sourceResult: SourceLoadResult,\n directOutput: boolean,\n outputBase: string,\n ): Promise<void> {\n const result = await ejectSkills({\n projectDir,\n force,\n sourceResult,\n matrix,\n directOutput,\n customOutputBase: directOutput ? outputBase : undefined,\n });\n\n if (result.skipped) {\n this.warn(result.skipReason!);\n return;\n }\n\n this.logSuccess(\n `${result.copiedSkills.length} skills ejected to ${result.destDir} from ${result.sourceLabel}`,\n );\n this.log(\"You can now customize skill content locally.\");\n }\n}\n\ntype EjectAgentPartialsOptions = {\n outputBase: string;\n force: boolean;\n /** When true, outputBase is used directly as the destination (no subdirectory nesting). */\n directOutput?: boolean;\n /** When true, ejects only the _templates directory instead of the full agents directory. */\n templatesOnly?: boolean;\n};\n\ntype EjectAgentPartialsResult = {\n /** Whether the operation was skipped (e.g. destination already exists without --force). */\n skipped: boolean;\n /** Human-readable reason when skipped. */\n skipReason?: string;\n /** Destination directory that was written to (undefined when skipped). */\n destDir?: string;\n /** Whether templates were skipped during a full agent-partials eject (existing templates preserved). */\n templatesSkipped: boolean;\n};\n\n/**\n * Copies agent partials or templates from the CLI source to a target directory.\n *\n * When `templatesOnly` is true, copies only the _templates subdirectory.\n * When false, copies the full agents directory (optionally skipping existing templates).\n *\n * Returns structured data — the command decides what to log.\n */\nasync function ejectAgentPartials(\n options: EjectAgentPartialsOptions,\n): Promise<EjectAgentPartialsResult> {\n const { outputBase, force, directOutput = false, templatesOnly = false } = options;\n\n const sourceDir = templatesOnly\n ? path.join(PROJECT_ROOT, DIRS.templates)\n : path.join(PROJECT_ROOT, DIRS.agents);\n\n if (!(await directoryExists(sourceDir))) {\n return {\n skipped: true,\n skipReason: templatesOnly\n ? \"No agent templates found in CLI.\"\n : \"No agent partials found in CLI.\",\n templatesSkipped: false,\n };\n }\n\n const destDir = directOutput\n ? outputBase\n : templatesOnly\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 (templatesOnly) {\n return {\n skipped: true,\n skipReason: `Agent templates already exist at ${destDir}. Use --force to overwrite.`,\n templatesSkipped: false,\n };\n }\n\n const hasTemplates = await directoryExists(path.join(destDir, templatesBasename));\n if ((await hasAgentPartialDirs(destDir)) && !hasTemplates) {\n return {\n skipped: true,\n skipReason: `Agent partials already exist at ${destDir}. Use --force to overwrite.`,\n templatesSkipped: false,\n };\n }\n }\n\n await ensureDir(destDir);\n\n const skipTemplates =\n !templatesOnly && !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 } else {\n await copy(sourceDir, destDir);\n }\n\n return {\n skipped: false,\n destDir,\n templatesSkipped: skipTemplates,\n };\n}\n\ntype EjectSkillsOptions = {\n projectDir: string;\n force: boolean;\n sourceResult: SourceLoadResult;\n matrix: MergedSkillsMatrix;\n /** When true, uses customOutputBase as destination instead of LOCAL_SKILLS_PATH. */\n directOutput?: boolean;\n customOutputBase?: string;\n};\n\ntype EjectSkillsResult = {\n /** Whether the operation was skipped. */\n skipped: boolean;\n /** Human-readable reason when skipped. */\n skipReason?: string;\n /** Array of skills that were copied. */\n copiedSkills: CopiedSkill[];\n /** Destination directory that was written to. */\n destDir?: string;\n /** Label describing the source that skills were copied from. */\n sourceLabel?: string;\n};\n\n/**\n * Copies non-local skills from source to a target directory.\n *\n * Filters out skills already marked as local, then copies the remaining skills\n * using copySkillsToLocalFlattened.\n *\n * Returns structured data — the command decides what to log.\n */\nasync function ejectSkills(options: EjectSkillsOptions): Promise<EjectSkillsResult> {\n const {\n projectDir,\n force,\n sourceResult,\n matrix,\n directOutput = false,\n customOutputBase,\n } = options;\n\n const destDir =\n directOutput && customOutputBase ? customOutputBase : path.join(projectDir, LOCAL_SKILLS_PATH);\n\n if ((await directoryExists(destDir)) && !force) {\n return {\n skipped: true,\n skipReason: `Skills already exist at ${destDir}. Use --force to overwrite.`,\n copiedSkills: [],\n };\n }\n\n const skillIds = typedKeys<SkillId>(matrix.skills).filter(\n (skillId) => !matrix.skills[skillId]?.local,\n );\n\n if (skillIds.length === 0) {\n return {\n skipped: true,\n skipReason: \"No skills found in source to eject.\",\n copiedSkills: [],\n };\n }\n\n await ensureDir(destDir);\n\n const copiedSkills = await copySkillsToLocalFlattened(skillIds, destDir, matrix, sourceResult);\n\n const sourceLabel = sourceResult.isLocal\n ? sourceResult.sourcePath\n : sourceResult.marketplace || sourceResult.sourceConfig.source;\n\n return {\n skipped: false,\n copiedSkills,\n destDir,\n sourceLabel,\n };\n}\n\ntype EnsureMinimalConfigOptions = {\n projectDir: string;\n sourceFlag?: string;\n sourceResult?: SourceLoadResult;\n};\n\ntype EnsureMinimalConfigResult = {\n /** Path to the config file. */\n configPath: string;\n /** Whether a new config was created. */\n created: boolean;\n};\n\n/**\n * Ensures a minimal config.ts exists so `agentsinc compile` works after eject.\n *\n * If the config already exists, returns immediately with `created: false`.\n * Otherwise generates a minimal config from the resolved source and project metadata.\n *\n * Returns structured data — the command decides what to log.\n */\nasync function ensureMinimalConfig(\n options: EnsureMinimalConfigOptions,\n): Promise<EnsureMinimalConfigResult> {\n const { projectDir, sourceFlag, sourceResult } = options;\n\n const tsConfigPath = path.join(projectDir, CLAUDE_SRC_DIR, STANDARD_FILES.CONFIG_TS);\n\n if (await fileExists(tsConfigPath)) {\n return { configPath: tsConfigPath, created: false };\n }\n\n const projectName = path.basename(projectDir);\n\n const config: Record<string, unknown> = {\n name: projectName,\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 // JSON.parse(JSON.stringify(x)) removes undefined values\n const cleaned = JSON.parse(JSON.stringify(config));\n const body = JSON.stringify(cleaned, null, 2);\n const content = `export default ${body};\\n`;\n\n await writeFile(tsConfigPath, content);\n\n return { configPath: tsConfigPath, created: true };\n}\n\n/** Checks whether the agents directory contains any agent subdirectories (not just _templates). */\nasync function 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"],"mappings":"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","names":["matrix"]}
|