@agents-inc/cli 0.86.0 → 0.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/{chunk-GED2F75H.js → chunk-23M3SPXX.js} +180 -124
- package/dist/chunk-23M3SPXX.js.map +1 -0
- package/dist/{chunk-ZOWRO7UQ.js → chunk-2DRPZXXK.js} +3 -3
- package/dist/{chunk-5M6Q5UQO.js → chunk-57KI55GJ.js} +2 -2
- package/dist/{chunk-HH3AWXF4.js → chunk-5IYZGJDW.js} +3 -3
- package/dist/{chunk-Q4DMIPZB.js → chunk-6YR2NEW3.js} +2 -2
- package/dist/{chunk-HU6XQVZL.js → chunk-AP4DLJDP.js} +1 -1
- package/dist/{chunk-HU6XQVZL.js.map → chunk-AP4DLJDP.js.map} +1 -1
- package/dist/{chunk-SGZOFIFF.js → chunk-ATPHV3MD.js} +2 -2
- package/dist/{chunk-HSLVCKVQ.js → chunk-DDCW4SKN.js} +3 -3
- package/dist/{chunk-TMTUTUEV.js → chunk-EADZIYQW.js} +12 -7
- package/dist/chunk-EADZIYQW.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-HZ2IBXVQ.js → chunk-ITBSJNIC.js} +3 -3
- package/dist/chunk-J6PI73YV.js +68 -0
- package/dist/chunk-J6PI73YV.js.map +1 -0
- package/dist/{chunk-BEFYAFGV.js → chunk-JNUFQBXX.js} +2 -2
- package/dist/chunk-LHUK5L6P.js +564 -0
- package/dist/chunk-LHUK5L6P.js.map +1 -0
- package/dist/{chunk-LZ7XQ3IU.js → chunk-MY4TVLRB.js} +2 -2
- package/dist/{chunk-I44YG6VI.js → chunk-PZBLGD7O.js} +5 -19
- package/dist/chunk-PZBLGD7O.js.map +1 -0
- package/dist/{chunk-HZQOFFKA.js → chunk-REZZSDXG.js} +10 -10
- package/dist/{chunk-O27WJ5KS.js → chunk-RWVF6DQE.js} +3 -3
- package/dist/{chunk-B6MYECV6.js → chunk-STMRDPGZ.js} +2 -2
- package/dist/{chunk-MMTMXLI4.js → chunk-TAPEVEET.js} +2 -2
- package/dist/{chunk-CXWBVBDM.js → chunk-VWTZOBBQ.js} +2 -2
- package/dist/{chunk-UNEJKTLP.js → chunk-WTPPVXJP.js} +3 -3
- package/dist/{chunk-FBZR46GC.js → chunk-YM3V4Q3W.js} +4 -4
- package/dist/{chunk-C5IYJ42F.js → chunk-ZFQTKY2S.js} +2 -2
- package/dist/{chunk-NUU3U43A.js → chunk-ZTRQO5CX.js} +2 -2
- package/dist/chunk-ZTRQO5CX.js.map +1 -0
- package/dist/commands/build/marketplace.js +3 -3
- package/dist/commands/build/plugins.js +5 -5
- package/dist/commands/build/stack.js +5 -5
- package/dist/commands/compile.js +31 -25
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +5 -5
- package/dist/commands/config/path.js +4 -4
- package/dist/commands/config/show.js +5 -5
- package/dist/commands/diff.js +685 -86
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +35 -63
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +180 -48
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +182 -32
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/import/skill.js +200 -36
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +46 -39
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/init.js +19 -22
- package/dist/commands/list.js +4 -4
- package/dist/commands/new/agent.js +144 -48
- package/dist/commands/new/agent.js.map +1 -1
- package/dist/commands/new/marketplace.js +9 -9
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +198 -34
- package/dist/commands/new/skill.js.map +1 -1
- package/dist/commands/outdated.js +6 -8
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +165 -68
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/uninstall.js +263 -65
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +236 -167
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate.js +4 -4
- package/dist/components/skill-search/skill-search.js +1 -1
- package/dist/components/wizard/category-grid.test.js +7 -7
- package/dist/components/wizard/domain-selection.js +5 -5
- package/dist/components/wizard/help-modal.js +5 -5
- package/dist/components/wizard/source-grid.test.js +7 -7
- package/dist/components/wizard/stack-selection.js +5 -5
- package/dist/components/wizard/step-agents.js +5 -5
- package/dist/components/wizard/step-agents.test.js +8 -8
- package/dist/components/wizard/step-build.js +5 -5
- package/dist/components/wizard/step-build.test.js +7 -7
- package/dist/components/wizard/step-confirm.test.js +5 -5
- package/dist/components/wizard/step-settings.js +4 -4
- package/dist/components/wizard/step-settings.test.js +7 -7
- package/dist/components/wizard/step-sources.js +5 -5
- package/dist/components/wizard/step-sources.test.js +8 -8
- package/dist/components/wizard/step-stack.js +6 -6
- package/dist/components/wizard/step-stack.test.js +7 -7
- package/dist/components/wizard/wizard-layout.js +6 -6
- package/dist/components/wizard/wizard.js +14 -14
- package/dist/hooks/init.js +18 -20
- package/dist/hooks/init.js.map +1 -1
- package/dist/{loader-GSEGPK64.js → loader-SQOK2BF7.js} +3 -3
- package/dist/{source-loader-OGFTIRIX.js → source-loader-CCECAU5L.js} +4 -4
- package/dist/{source-manager-FMMDDVZA.js → source-manager-4P7MTZRR.js} +4 -4
- package/dist/stores/wizard-store.js +4 -4
- package/dist/stores/wizard-store.test.js +7 -7
- 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-I44YG6VI.js.map +0 -1
- package/dist/chunk-NUU3U43A.js.map +0 -1
- package/dist/chunk-O5ZWS26C.js +0 -166
- package/dist/chunk-O5ZWS26C.js.map +0 -1
- package/dist/chunk-TMTUTUEV.js.map +0 -1
- package/dist/chunk-XQK4S22C.js +0 -202
- package/dist/chunk-XQK4S22C.js.map +0 -1
- /package/dist/{chunk-ZOWRO7UQ.js.map → chunk-2DRPZXXK.js.map} +0 -0
- /package/dist/{chunk-5M6Q5UQO.js.map → chunk-57KI55GJ.js.map} +0 -0
- /package/dist/{chunk-HH3AWXF4.js.map → chunk-5IYZGJDW.js.map} +0 -0
- /package/dist/{chunk-Q4DMIPZB.js.map → chunk-6YR2NEW3.js.map} +0 -0
- /package/dist/{chunk-SGZOFIFF.js.map → chunk-ATPHV3MD.js.map} +0 -0
- /package/dist/{chunk-HSLVCKVQ.js.map → chunk-DDCW4SKN.js.map} +0 -0
- /package/dist/{chunk-HZ2IBXVQ.js.map → chunk-ITBSJNIC.js.map} +0 -0
- /package/dist/{chunk-BEFYAFGV.js.map → chunk-JNUFQBXX.js.map} +0 -0
- /package/dist/{chunk-LZ7XQ3IU.js.map → chunk-MY4TVLRB.js.map} +0 -0
- /package/dist/{chunk-HZQOFFKA.js.map → chunk-REZZSDXG.js.map} +0 -0
- /package/dist/{chunk-O27WJ5KS.js.map → chunk-RWVF6DQE.js.map} +0 -0
- /package/dist/{chunk-B6MYECV6.js.map → chunk-STMRDPGZ.js.map} +0 -0
- /package/dist/{chunk-MMTMXLI4.js.map → chunk-TAPEVEET.js.map} +0 -0
- /package/dist/{chunk-CXWBVBDM.js.map → chunk-VWTZOBBQ.js.map} +0 -0
- /package/dist/{chunk-UNEJKTLP.js.map → chunk-WTPPVXJP.js.map} +0 -0
- /package/dist/{chunk-FBZR46GC.js.map → chunk-YM3V4Q3W.js.map} +0 -0
- /package/dist/{chunk-C5IYJ42F.js.map → chunk-ZFQTKY2S.js.map} +0 -0
- /package/dist/{loader-GSEGPK64.js.map → loader-SQOK2BF7.js.map} +0 -0
- /package/dist/{source-loader-OGFTIRIX.js.map → source-loader-CCECAU5L.js.map} +0 -0
- /package/dist/{source-manager-FMMDDVZA.js.map → source-manager-4P7MTZRR.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,26 @@ Each release has detailed notes in its own file under [`changelogs/`](./changelo
|
|
|
7
7
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
8
8
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
9
|
|
|
10
|
+
## [0.88.0] - 2026-03-26
|
|
11
|
+
|
|
12
|
+
**Plugin category separation — category belongs in metadata, not manifests**
|
|
13
|
+
|
|
14
|
+
- Removed `category` from `PluginManifest` — plugin.json doesn't carry skill metadata (D-149)
|
|
15
|
+
- Removed all category inference from names — categories come from `metadata.yaml`
|
|
16
|
+
- Removed unnecessary test mocks in plugin test files (D-148)
|
|
17
|
+
|
|
18
|
+
See [changelogs/0.88.0.md](./changelogs/0.88.0.md) for full details.
|
|
19
|
+
|
|
20
|
+
## [0.87.0] - 2026-03-26
|
|
21
|
+
|
|
22
|
+
**Declarative commands, operation dissolution, global skill discovery fix**
|
|
23
|
+
|
|
24
|
+
- 14 commands restructured with declarative two-tier pattern — `run()` reads like pseudocode
|
|
25
|
+
- 12 single-use operations dissolved back into their respective commands; operations layer trimmed to 17 shared files
|
|
26
|
+
- Fix: init/edit/update now discover all skills (global + project) before compiling agents
|
|
27
|
+
|
|
28
|
+
See [changelogs/0.87.0.md](./changelogs/0.87.0.md) for full details.
|
|
29
|
+
|
|
10
30
|
## [0.86.0] - 2026-03-26
|
|
11
31
|
|
|
12
32
|
**Operations layer — composable building blocks for all CLI commands**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
Wizard
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-REZZSDXG.js";
|
|
5
5
|
import {
|
|
6
6
|
SelectList
|
|
7
7
|
} from "./chunk-XO6X5QE5.js";
|
|
@@ -17,27 +17,29 @@ import {
|
|
|
17
17
|
import {
|
|
18
18
|
compileAgents,
|
|
19
19
|
copyLocalSkills,
|
|
20
|
+
discoverInstalledSkills,
|
|
20
21
|
ensureMarketplace,
|
|
21
|
-
getDashboardData,
|
|
22
22
|
installPluginSkills,
|
|
23
23
|
loadAgentDefs,
|
|
24
24
|
loadSource,
|
|
25
25
|
writeProjectConfig
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-LHUK5L6P.js";
|
|
27
27
|
import {
|
|
28
28
|
buildAgentScopeMap,
|
|
29
29
|
deriveInstallMode,
|
|
30
30
|
detectProjectInstallation,
|
|
31
31
|
ensureBlankGlobalConfig,
|
|
32
|
+
getInstallationInfo,
|
|
33
|
+
loadProjectConfig,
|
|
32
34
|
resolveInstallPaths
|
|
33
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-EADZIYQW.js";
|
|
34
36
|
import {
|
|
35
37
|
getSkillById
|
|
36
38
|
} from "./chunk-ANXHMG32.js";
|
|
37
39
|
import {
|
|
38
40
|
BaseCommand,
|
|
39
41
|
EXIT_CODES
|
|
40
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-TAPEVEET.js";
|
|
41
43
|
import {
|
|
42
44
|
fileExists,
|
|
43
45
|
getErrorMessage,
|
|
@@ -45,7 +47,7 @@ import {
|
|
|
45
47
|
settingsFileSchema,
|
|
46
48
|
warn,
|
|
47
49
|
warnUnknownFields
|
|
48
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-ZTRQO5CX.js";
|
|
49
51
|
import {
|
|
50
52
|
ASCII_LOGO,
|
|
51
53
|
CLAUDE_DIR,
|
|
@@ -251,14 +253,26 @@ var Init = class _Init extends BaseCommand {
|
|
|
251
253
|
async run() {
|
|
252
254
|
const { flags } = await this.parse(_Init);
|
|
253
255
|
const projectDir = process.cwd();
|
|
256
|
+
if (await this.showDashboardIfInitialized(projectDir)) return;
|
|
257
|
+
await this.ensureGlobalConfig(projectDir);
|
|
258
|
+
const { sourceResult, startupMessages } = await this.loadSourceOrFail(flags);
|
|
259
|
+
const result = await this.runWizard(sourceResult, startupMessages, projectDir);
|
|
260
|
+
if (!result) this.exit(EXIT_CODES.CANCELLED);
|
|
261
|
+
if (result.skills.length === 0) {
|
|
262
|
+
this.error("No skills selected", { exit: EXIT_CODES.ERROR });
|
|
263
|
+
}
|
|
264
|
+
await this.handleInstallation(result, sourceResult, flags);
|
|
265
|
+
}
|
|
266
|
+
async showDashboardIfInitialized(projectDir) {
|
|
254
267
|
const existingInstallation = await detectProjectInstallation(projectDir);
|
|
255
|
-
if (existingInstallation)
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
}
|
|
260
|
-
return;
|
|
268
|
+
if (!existingInstallation) return false;
|
|
269
|
+
const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));
|
|
270
|
+
if (selectedCommand) {
|
|
271
|
+
await this.config.runCommand(selectedCommand);
|
|
261
272
|
}
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
async ensureGlobalConfig(projectDir) {
|
|
262
276
|
const isGlobalRoot = fs.realpathSync(projectDir) === fs.realpathSync(GLOBAL_INSTALL_ROOT);
|
|
263
277
|
if (!isGlobalRoot) {
|
|
264
278
|
const created = await ensureBlankGlobalConfig();
|
|
@@ -266,22 +280,23 @@ var Init = class _Init extends BaseCommand {
|
|
|
266
280
|
this.log("Created blank global config at ~/" + CLAUDE_SRC_DIR);
|
|
267
281
|
}
|
|
268
282
|
}
|
|
269
|
-
|
|
270
|
-
|
|
283
|
+
}
|
|
284
|
+
async loadSourceOrFail(flags) {
|
|
271
285
|
try {
|
|
272
286
|
const loaded = await loadSource({
|
|
273
287
|
sourceFlag: flags.source,
|
|
274
|
-
projectDir,
|
|
288
|
+
projectDir: process.cwd(),
|
|
275
289
|
forceRefresh: flags.refresh,
|
|
276
290
|
captureStartupMessages: true
|
|
277
291
|
});
|
|
278
|
-
sourceResult
|
|
279
|
-
startupMessages = loaded.startupMessages;
|
|
292
|
+
return { sourceResult: loaded.sourceResult, startupMessages: loaded.startupMessages };
|
|
280
293
|
} catch (error) {
|
|
281
294
|
this.error(getErrorMessage(error), {
|
|
282
295
|
exit: EXIT_CODES.ERROR
|
|
283
296
|
});
|
|
284
297
|
}
|
|
298
|
+
}
|
|
299
|
+
async runWizard(sourceResult, startupMessages, projectDir) {
|
|
285
300
|
let wizardResult = null;
|
|
286
301
|
const { waitUntilExit } = render(
|
|
287
302
|
/* @__PURE__ */ jsx2(
|
|
@@ -302,140 +317,181 @@ var Init = class _Init extends BaseCommand {
|
|
|
302
317
|
);
|
|
303
318
|
await waitUntilExit();
|
|
304
319
|
const result = wizardResult;
|
|
305
|
-
if (
|
|
306
|
-
|
|
307
|
-
}
|
|
308
|
-
if (result.skills.length === 0) {
|
|
309
|
-
this.error("No skills selected", { exit: EXIT_CODES.ERROR });
|
|
310
|
-
}
|
|
311
|
-
await this.handleInstallation(result, sourceResult, flags);
|
|
320
|
+
if (result?.cancelled) return null;
|
|
321
|
+
return result;
|
|
312
322
|
}
|
|
313
323
|
async handleInstallation(result, sourceResult, flags) {
|
|
314
324
|
const projectDir = process.cwd();
|
|
315
325
|
let installMode = deriveInstallMode(result.skills);
|
|
316
326
|
const localSkills = result.skills.filter((s) => s.source === "local");
|
|
317
327
|
const pluginSkills = result.skills.filter((s) => s.source !== "local");
|
|
328
|
+
this.logInstallPlan(result, installMode, localSkills, pluginSkills);
|
|
329
|
+
let copiedSkills = [...localSkills];
|
|
330
|
+
let pluginModeSucceeded = false;
|
|
331
|
+
if (installMode === "local" || installMode === "mixed") {
|
|
332
|
+
await this.copyLocalSkillsStep(localSkills, projectDir, sourceResult, installMode);
|
|
333
|
+
}
|
|
334
|
+
if (installMode === "plugin" || installMode === "mixed") {
|
|
335
|
+
const pluginStepResult = await this.installPluginsStep(
|
|
336
|
+
pluginSkills,
|
|
337
|
+
sourceResult,
|
|
338
|
+
projectDir,
|
|
339
|
+
installMode,
|
|
340
|
+
copiedSkills,
|
|
341
|
+
result.skills
|
|
342
|
+
);
|
|
343
|
+
copiedSkills = pluginStepResult.copiedSkills;
|
|
344
|
+
installMode = pluginStepResult.installMode;
|
|
345
|
+
pluginModeSucceeded = pluginStepResult.succeeded;
|
|
346
|
+
}
|
|
347
|
+
try {
|
|
348
|
+
const { configResult, compileResult, projectPaths } = await this.writeConfigAndCompile(
|
|
349
|
+
result,
|
|
350
|
+
sourceResult,
|
|
351
|
+
flags,
|
|
352
|
+
installMode
|
|
353
|
+
);
|
|
354
|
+
this.reportSuccess(
|
|
355
|
+
configResult,
|
|
356
|
+
compileResult,
|
|
357
|
+
projectPaths,
|
|
358
|
+
installMode,
|
|
359
|
+
pluginModeSucceeded,
|
|
360
|
+
copiedSkills
|
|
361
|
+
);
|
|
362
|
+
const permissionWarning = await checkPermissions(projectDir);
|
|
363
|
+
if (permissionWarning) {
|
|
364
|
+
const { waitUntilExit } = render(permissionWarning);
|
|
365
|
+
await waitUntilExit();
|
|
366
|
+
}
|
|
367
|
+
} catch (error) {
|
|
368
|
+
this.handleError(error);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
logInstallPlan(result, installMode, localSkills, pluginSkills) {
|
|
318
372
|
this.log("\n");
|
|
319
373
|
this.log(`Selected ${result.skills.length} skills`);
|
|
320
374
|
this.log(
|
|
321
375
|
`Install mode: ${installMode === "plugin" ? "Plugin (native install)" : installMode === "mixed" ? `Mixed (${localSkills.length} local, ${pluginSkills.length} plugin)` : "Local (copy to .claude/skills/)"}`
|
|
322
376
|
);
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
if (
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
this.log(`Copied ${copyResult.globalCopied.length} local skills to ~/.claude/skills/`);
|
|
335
|
-
} else {
|
|
336
|
-
this.log(`Copied ${copyResult.projectCopied.length} local skills to .claude/skills/`);
|
|
337
|
-
}
|
|
377
|
+
}
|
|
378
|
+
async copyLocalSkillsStep(localSkills, projectDir, sourceResult, installMode) {
|
|
379
|
+
this.log("Copying skills to local directory...");
|
|
380
|
+
const copyResult = await copyLocalSkills(localSkills, projectDir, sourceResult);
|
|
381
|
+
if (installMode === "mixed") {
|
|
382
|
+
if (copyResult.projectCopied.length > 0 && copyResult.globalCopied.length > 0) {
|
|
383
|
+
this.log(
|
|
384
|
+
`Copied ${copyResult.totalCopied} local skills (${copyResult.projectCopied.length} project, ${copyResult.globalCopied.length} global)`
|
|
385
|
+
);
|
|
386
|
+
} else if (copyResult.globalCopied.length > 0) {
|
|
387
|
+
this.log(`Copied ${copyResult.globalCopied.length} local skills to ~/.claude/skills/`);
|
|
338
388
|
} else {
|
|
339
|
-
this.log(`Copied ${copyResult.
|
|
340
|
-
`);
|
|
389
|
+
this.log(`Copied ${copyResult.projectCopied.length} local skills to .claude/skills/`);
|
|
341
390
|
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
if (installMode === "plugin" || installMode === "mixed") {
|
|
345
|
-
const mpResult = await ensureMarketplace(sourceResult);
|
|
346
|
-
if (!mpResult.marketplace) {
|
|
347
|
-
this.warn("Could not resolve marketplace. Falling back to Local Mode...");
|
|
348
|
-
const fallbackSkills = installMode === "mixed" ? pluginSkills : result.skills;
|
|
349
|
-
const fallbackCopyResult = await copyLocalSkills(fallbackSkills, projectDir, sourceResult);
|
|
350
|
-
copiedSkills = [...copiedSkills, ...fallbackSkills];
|
|
351
|
-
installMode = "local";
|
|
352
|
-
this.log(`Copied ${fallbackCopyResult.totalCopied} skills to .claude/skills/
|
|
391
|
+
} else {
|
|
392
|
+
this.log(`Copied ${copyResult.totalCopied} skills to .claude/skills/
|
|
353
393
|
`);
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
);
|
|
364
|
-
for (const item of pluginResult.installed) {
|
|
365
|
-
this.log(` Installed ${item.ref}`);
|
|
366
|
-
}
|
|
367
|
-
for (const item of pluginResult.failed) {
|
|
368
|
-
this.warn(`Failed to install plugin ${item.id}: ${item.error}`);
|
|
369
|
-
}
|
|
370
|
-
this.log(`Installed ${pluginResult.installed.length} skill plugins
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
async installPluginsStep(pluginSkills, sourceResult, projectDir, installMode, copiedSkills, allSkills) {
|
|
397
|
+
const mpResult = await ensureMarketplace(sourceResult);
|
|
398
|
+
if (!mpResult.marketplace) {
|
|
399
|
+
this.warn("Could not resolve marketplace. Falling back to Local Mode...");
|
|
400
|
+
const fallbackSkills = installMode === "mixed" ? pluginSkills : allSkills;
|
|
401
|
+
const fallbackCopyResult = await copyLocalSkills(fallbackSkills, projectDir, sourceResult);
|
|
402
|
+
this.log(`Copied ${fallbackCopyResult.totalCopied} skills to .claude/skills/
|
|
371
403
|
`);
|
|
372
|
-
|
|
373
|
-
|
|
404
|
+
return {
|
|
405
|
+
copiedSkills: [...copiedSkills, ...fallbackSkills],
|
|
406
|
+
installMode: "local",
|
|
407
|
+
succeeded: false
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
if (mpResult.registered) {
|
|
411
|
+
this.log(`Registering marketplace "${mpResult.marketplace}"...`);
|
|
412
|
+
}
|
|
413
|
+
this.log("Installing skill plugins...");
|
|
414
|
+
const pluginResult = await installPluginSkills(pluginSkills, mpResult.marketplace, projectDir);
|
|
415
|
+
for (const item of pluginResult.installed) {
|
|
416
|
+
this.log(` Installed ${item.ref}`);
|
|
417
|
+
}
|
|
418
|
+
for (const item of pluginResult.failed) {
|
|
419
|
+
this.warn(`Failed to install plugin ${item.id}: ${item.error}`);
|
|
374
420
|
}
|
|
421
|
+
this.log(`Installed ${pluginResult.installed.length} skill plugins
|
|
422
|
+
`);
|
|
423
|
+
return { copiedSkills, installMode, succeeded: true };
|
|
424
|
+
}
|
|
425
|
+
async writeConfigAndCompile(result, sourceResult, flags, installMode) {
|
|
375
426
|
this.log("Generating configuration...");
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
this.log(`Configuration saved (${configResult.config.agents.length} agents)
|
|
427
|
+
const configResult = await writeProjectConfig({
|
|
428
|
+
wizardResult: result,
|
|
429
|
+
sourceResult,
|
|
430
|
+
projectDir: process.cwd(),
|
|
431
|
+
sourceFlag: flags.source
|
|
432
|
+
});
|
|
433
|
+
if (configResult.wasMerged) {
|
|
434
|
+
this.log(`Merged with existing config at ${configResult.existingConfigPath}`);
|
|
435
|
+
}
|
|
436
|
+
this.log(`Configuration saved (${configResult.config.agents.length} agents)
|
|
387
437
|
`);
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
438
|
+
this.log(STATUS_MESSAGES.COMPILING_AGENTS);
|
|
439
|
+
const projectPaths = resolveInstallPaths(process.cwd(), "project");
|
|
440
|
+
const agentDefs = await loadAgentDefs();
|
|
441
|
+
const { allSkills } = await discoverInstalledSkills(process.cwd());
|
|
442
|
+
const compileResult = await compileAgents({
|
|
443
|
+
projectDir: process.cwd(),
|
|
444
|
+
sourcePath: agentDefs.sourcePath,
|
|
445
|
+
skills: allSkills,
|
|
446
|
+
installMode,
|
|
447
|
+
agentScopeMap: buildAgentScopeMap(configResult.config),
|
|
448
|
+
outputDir: projectPaths.agentsDir
|
|
449
|
+
});
|
|
450
|
+
this.log(`Compiled ${compileResult.compiled.length} agents to .claude/agents/
|
|
399
451
|
`);
|
|
400
|
-
|
|
452
|
+
return { configResult, compileResult, projectPaths };
|
|
453
|
+
}
|
|
454
|
+
reportSuccess(configResult, compileResult, projectPaths, installMode, pluginModeSucceeded, copiedSkills) {
|
|
455
|
+
this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}
|
|
401
456
|
`);
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
}
|
|
410
|
-
this.log("");
|
|
457
|
+
const isLocalOutput = installMode === "local" || installMode === "mixed" && !pluginModeSucceeded;
|
|
458
|
+
if (isLocalOutput && copiedSkills.length > 0) {
|
|
459
|
+
this.log("Skills copied to:");
|
|
460
|
+
this.log(` ${projectPaths.skillsDir}`);
|
|
461
|
+
for (const skill of copiedSkills) {
|
|
462
|
+
const displayName = getSkillById(skill.id).displayName;
|
|
463
|
+
this.log(` ${displayName}/`);
|
|
411
464
|
}
|
|
412
|
-
this.log("Agents compiled to:");
|
|
413
|
-
this.log(` ${projectPaths.agentsDir}`);
|
|
414
|
-
for (const agentName of compileResult.compiled) {
|
|
415
|
-
this.log(` ${agentName}.md`);
|
|
416
|
-
}
|
|
417
|
-
this.log("");
|
|
418
|
-
this.log("Configuration:");
|
|
419
|
-
this.log(` ${configResult.configPath}`);
|
|
420
465
|
this.log("");
|
|
421
|
-
this.log("To customize agent-skill assignments:");
|
|
422
|
-
this.log(` 1. Edit .claude-src/config.ts`);
|
|
423
|
-
this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);
|
|
424
|
-
this.log("");
|
|
425
|
-
const permissionWarning = await checkPermissions(projectDir);
|
|
426
|
-
if (permissionWarning) {
|
|
427
|
-
const { waitUntilExit } = render(permissionWarning);
|
|
428
|
-
await waitUntilExit();
|
|
429
|
-
}
|
|
430
|
-
} catch (error) {
|
|
431
|
-
this.handleError(error);
|
|
432
466
|
}
|
|
467
|
+
this.log("Agents compiled to:");
|
|
468
|
+
this.log(` ${projectPaths.agentsDir}`);
|
|
469
|
+
for (const agentName of compileResult.compiled) {
|
|
470
|
+
this.log(` ${agentName}.md`);
|
|
471
|
+
}
|
|
472
|
+
this.log("");
|
|
473
|
+
this.log("Configuration:");
|
|
474
|
+
this.log(` ${configResult.configPath}`);
|
|
475
|
+
this.log("");
|
|
476
|
+
this.log("To customize agent-skill assignments:");
|
|
477
|
+
this.log(` 1. Edit .claude-src/config.ts`);
|
|
478
|
+
this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);
|
|
479
|
+
this.log("");
|
|
433
480
|
}
|
|
434
481
|
};
|
|
482
|
+
async function getDashboardData(projectDir) {
|
|
483
|
+
const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);
|
|
484
|
+
const skillCount = loaded?.config?.skills?.length ?? 0;
|
|
485
|
+
const agentCount = info?.agentCount ?? 0;
|
|
486
|
+
const mode = info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : "local");
|
|
487
|
+
const source = loaded?.config?.source;
|
|
488
|
+
return { skillCount, agentCount, mode, source };
|
|
489
|
+
}
|
|
435
490
|
|
|
436
491
|
export {
|
|
437
492
|
formatDashboardText,
|
|
438
493
|
showDashboard,
|
|
439
|
-
Init
|
|
494
|
+
Init,
|
|
495
|
+
getDashboardData
|
|
440
496
|
};
|
|
441
|
-
//# sourceMappingURL=chunk-
|
|
497
|
+
//# sourceMappingURL=chunk-23M3SPXX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/init.tsx","../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport fs from \"fs\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport { type SourceLoadResult } from \"../lib/loading/index.js\";\nimport {\n loadSource,\n loadAgentDefs,\n copyLocalSkills,\n ensureMarketplace,\n installPluginSkills,\n writeProjectConfig,\n compileAgents,\n discoverInstalledSkills,\n} from \"../lib/operations/index.js\";\nimport { getInstallationInfo } from \"../lib/plugins/plugin-info.js\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport {\n type InstallMode,\n detectProjectInstallation,\n deriveInstallMode,\n resolveInstallPaths,\n buildAgentScopeMap,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport {\n ASCII_LOGO,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n GLOBAL_INSTALL_ROOT,\n} from \"../consts.js\";\nimport { SelectList, type SelectListItem } from \"../components/common/select-list.js\";\nimport {\n KEY_LABEL_ARROWS_VERT,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n} from \"../components/wizard/hotkeys.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { type StartupMessage } from \"../utils/logger.js\";\nimport { SUCCESS_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\n\n/** Clears the visible terminal area so the next render starts clean. */\nfunction clearTerminalOutput(): void {\n process.stdout.write(\"\\x1b[2J\\x1b[H\");\n}\n\nconst DASHBOARD_OPTIONS: SelectListItem<string>[] = [\n { label: \"Edit\", value: \"edit\" },\n { label: \"Compile\", value: \"compile\" },\n { label: \"Doctor\", value: \"doctor\" },\n { label: \"List\", value: \"list\" },\n];\n\ntype DashboardProps = {\n onSelect: (command: string) => void;\n onCancel: () => void;\n};\n\nconst Dashboard: React.FC<DashboardProps> = ({ onSelect, onCancel }) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{DEFAULT_BRANDING.NAME}</Text>\n <Text> </Text>\n <SelectList\n items={DASHBOARD_OPTIONS}\n onSelect={(command) => {\n onSelect(command);\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n />\n <Text> </Text>\n <Text dimColor>\n {\" \"}\n {KEY_LABEL_ARROWS_VERT} Navigate {\" \"}\n {KEY_LABEL_ENTER} Confirm {\" \"}\n {KEY_LABEL_ESC} Exit\n </Text>\n </Box>\n );\n};\n\n/** Formats the dashboard summary as plain text lines (for non-interactive/test output). */\nexport function formatDashboardText(data: DashboardData): string {\n const modeLabel = data.mode === \"plugin\" ? \"Plugin\" : data.mode === \"mixed\" ? \"Mixed\" : \"Local\";\n const lines = [\n DEFAULT_BRANDING.NAME,\n \"\",\n ` Skills: ${data.skillCount} installed`,\n ` Agents: ${data.agentCount} compiled`,\n ` Mode: ${modeLabel}`,\n ];\n if (data.source) {\n lines.push(` Source: ${data.source}`);\n }\n lines.push(\"\");\n lines.push(` [Edit] [Compile] [Doctor] [List]`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Shows the project dashboard and returns the selected command (or null if cancelled).\n * In non-interactive environments (no TTY), prints the summary text and returns null.\n */\nexport async function showDashboard(\n projectDir: string,\n log?: (message: string) => void,\n): Promise<string | null> {\n const data = await getDashboardData(projectDir);\n\n // Non-interactive: print text summary and exit (CI, piped, tests)\n if (!process.stdin.isTTY) {\n const output = log ?? console.log;\n output(formatDashboardText(data));\n return null;\n }\n\n let selectedCommand: string | null = null;\n\n const { waitUntilExit } = render(\n <Dashboard\n onSelect={(command) => {\n selectedCommand = command;\n }}\n onCancel={() => {\n selectedCommand = null;\n }}\n />,\n );\n\n await waitUntilExit();\n clearTerminalOutput();\n\n return selectedCommand;\n}\n\nexport default class Init extends BaseCommand {\n static summary = `Initialize ${DEFAULT_BRANDING.NAME} in this project`;\n static description =\n \"Interactive wizard to set up skills and agents. Supports Plugin Mode (native install) and Local Mode (copy to .claude/).\";\n\n static examples = [\n {\n description: \"Start the setup wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Initialize from a custom marketplace\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Init);\n const projectDir = process.cwd();\n\n if (await this.showDashboardIfInitialized(projectDir)) return;\n await this.ensureGlobalConfig(projectDir);\n\n const { sourceResult, startupMessages } = await this.loadSourceOrFail(flags);\n const result = await this.runWizard(sourceResult, startupMessages, projectDir);\n if (!result) this.exit(EXIT_CODES.CANCELLED);\n\n if (result.skills.length === 0) {\n this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n await this.handleInstallation(result, sourceResult, flags);\n }\n\n private async showDashboardIfInitialized(projectDir: string): Promise<boolean> {\n const existingInstallation = await detectProjectInstallation(projectDir);\n if (!existingInstallation) return false;\n\n const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return true;\n }\n\n private async ensureGlobalConfig(projectDir: string): Promise<void> {\n // Auto-create blank global config on first init from a project directory.\n // This ensures the project config can always import from global.\n // Resolve both paths through realpathSync — on macOS /var is a symlink to\n // /private/var, so os.homedir() and process.cwd() can return different\n // prefixes for the same directory.\n const isGlobalRoot = fs.realpathSync(projectDir) === fs.realpathSync(GLOBAL_INSTALL_ROOT);\n if (!isGlobalRoot) {\n const created = await ensureBlankGlobalConfig();\n if (created) {\n this.log(\"Created blank global config at ~/\" + CLAUDE_SRC_DIR);\n }\n }\n }\n\n private async loadSourceOrFail(flags: {\n source?: string;\n refresh: boolean;\n }): Promise<{ sourceResult: SourceLoadResult; startupMessages: StartupMessage[] }> {\n try {\n const loaded = await loadSource({\n sourceFlag: flags.source,\n projectDir: process.cwd(),\n forceRefresh: flags.refresh,\n captureStartupMessages: true,\n });\n return { sourceResult: loaded.sourceResult, startupMessages: loaded.startupMessages };\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n private async runWizard(\n sourceResult: SourceLoadResult,\n startupMessages: StartupMessage[],\n projectDir: string,\n ): Promise<WizardResultV2 | null> {\n let wizardResult: WizardResultV2 | null = null;\n\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n logo={ASCII_LOGO}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // TypeScript can't track that onComplete callback mutates wizardResult before waitUntilExit resolves\n const result = wizardResult as WizardResultV2 | null;\n if (result?.cancelled) return null;\n return result;\n }\n\n private async handleInstallation(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n let installMode = deriveInstallMode(result.skills);\n const localSkills = result.skills.filter((s) => s.source === \"local\");\n const pluginSkills = result.skills.filter((s) => s.source !== \"local\");\n\n this.logInstallPlan(result, installMode, localSkills, pluginSkills);\n\n let copiedSkills = [...localSkills];\n let pluginModeSucceeded = false;\n\n if (installMode === \"local\" || installMode === \"mixed\") {\n await this.copyLocalSkillsStep(localSkills, projectDir, sourceResult, installMode);\n }\n\n if (installMode === \"plugin\" || installMode === \"mixed\") {\n const pluginStepResult = await this.installPluginsStep(\n pluginSkills,\n sourceResult,\n projectDir,\n installMode,\n copiedSkills,\n result.skills,\n );\n copiedSkills = pluginStepResult.copiedSkills;\n installMode = pluginStepResult.installMode;\n pluginModeSucceeded = pluginStepResult.succeeded;\n }\n\n try {\n const { configResult, compileResult, projectPaths } = await this.writeConfigAndCompile(\n result,\n sourceResult,\n flags,\n installMode,\n );\n this.reportSuccess(\n configResult,\n compileResult,\n projectPaths,\n installMode,\n pluginModeSucceeded,\n copiedSkills,\n );\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private logInstallPlan(\n result: WizardResultV2,\n installMode: InstallMode,\n localSkills: WizardResultV2[\"skills\"],\n pluginSkills: WizardResultV2[\"skills\"],\n ): void {\n this.log(\"\\n\");\n this.log(`Selected ${result.skills.length} skills`);\n this.log(\n `Install mode: ${\n installMode === \"plugin\"\n ? \"Plugin (native install)\"\n : installMode === \"mixed\"\n ? `Mixed (${localSkills.length} local, ${pluginSkills.length} plugin)`\n : \"Local (copy to .claude/skills/)\"\n }`,\n );\n }\n\n private async copyLocalSkillsStep(\n localSkills: WizardResultV2[\"skills\"],\n projectDir: string,\n sourceResult: SourceLoadResult,\n installMode: InstallMode,\n ): Promise<void> {\n this.log(\"Copying skills to local directory...\");\n const copyResult = await copyLocalSkills(localSkills, projectDir, sourceResult);\n\n if (installMode === \"mixed\") {\n if (copyResult.projectCopied.length > 0 && copyResult.globalCopied.length > 0) {\n this.log(\n `Copied ${copyResult.totalCopied} local skills (${copyResult.projectCopied.length} project, ${copyResult.globalCopied.length} global)`,\n );\n } else if (copyResult.globalCopied.length > 0) {\n this.log(`Copied ${copyResult.globalCopied.length} local skills to ~/.claude/skills/`);\n } else {\n this.log(`Copied ${copyResult.projectCopied.length} local skills to .claude/skills/`);\n }\n } else {\n this.log(`Copied ${copyResult.totalCopied} skills to .claude/skills/\\n`);\n }\n }\n\n private async installPluginsStep(\n pluginSkills: WizardResultV2[\"skills\"],\n sourceResult: SourceLoadResult,\n projectDir: string,\n installMode: InstallMode,\n copiedSkills: WizardResultV2[\"skills\"],\n allSkills: WizardResultV2[\"skills\"],\n ): Promise<{\n copiedSkills: WizardResultV2[\"skills\"];\n installMode: InstallMode;\n succeeded: boolean;\n }> {\n const mpResult = await ensureMarketplace(sourceResult);\n\n if (!mpResult.marketplace) {\n this.warn(\"Could not resolve marketplace. Falling back to Local Mode...\");\n // Marketplace unavailable — copy all plugin-intended skills locally as fallback.\n // In \"mixed\" mode, localSkills were already copied; only copy plugin-intended skills.\n // In \"plugin\" mode, no skills were copied yet; copy all skills.\n const fallbackSkills = installMode === \"mixed\" ? pluginSkills : allSkills;\n const fallbackCopyResult = await copyLocalSkills(fallbackSkills, projectDir, sourceResult);\n this.log(`Copied ${fallbackCopyResult.totalCopied} skills to .claude/skills/\\n`);\n return {\n copiedSkills: [...copiedSkills, ...fallbackSkills],\n installMode: \"local\",\n succeeded: false,\n };\n }\n\n if (mpResult.registered) {\n this.log(`Registering marketplace \"${mpResult.marketplace}\"...`);\n }\n\n this.log(\"Installing skill plugins...\");\n const pluginResult = await installPluginSkills(pluginSkills, mpResult.marketplace, projectDir);\n\n for (const item of pluginResult.installed) {\n this.log(` Installed ${item.ref}`);\n }\n for (const item of pluginResult.failed) {\n this.warn(`Failed to install plugin ${item.id}: ${item.error}`);\n }\n\n this.log(`Installed ${pluginResult.installed.length} skill plugins\\n`);\n return { copiedSkills, installMode, succeeded: true };\n }\n\n private async writeConfigAndCompile(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n installMode: InstallMode,\n ): Promise<{\n configResult: Awaited<ReturnType<typeof writeProjectConfig>>;\n compileResult: Awaited<ReturnType<typeof compileAgents>>;\n projectPaths: ReturnType<typeof resolveInstallPaths>;\n }> {\n this.log(\"Generating configuration...\");\n const configResult = await writeProjectConfig({\n wizardResult: result,\n sourceResult,\n projectDir: process.cwd(),\n sourceFlag: flags.source,\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.existingConfigPath}`);\n }\n\n this.log(`Configuration saved (${configResult.config.agents.length} agents)\\n`);\n\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n const projectPaths = resolveInstallPaths(process.cwd(), \"project\");\n const agentDefs = await loadAgentDefs();\n const { allSkills } = await discoverInstalledSkills(process.cwd());\n const compileResult = await compileAgents({\n projectDir: process.cwd(),\n sourcePath: agentDefs.sourcePath,\n skills: allSkills,\n installMode,\n agentScopeMap: buildAgentScopeMap(configResult.config),\n outputDir: projectPaths.agentsDir,\n });\n this.log(`Compiled ${compileResult.compiled.length} agents to .claude/agents/\\n`);\n\n return { configResult, compileResult, projectPaths };\n }\n\n private reportSuccess(\n configResult: Awaited<ReturnType<typeof writeProjectConfig>>,\n compileResult: Awaited<ReturnType<typeof compileAgents>>,\n projectPaths: ReturnType<typeof resolveInstallPaths>,\n installMode: InstallMode,\n pluginModeSucceeded: boolean,\n copiedSkills: WizardResultV2[\"skills\"],\n ): void {\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n\n const isLocalOutput =\n installMode === \"local\" || (installMode === \"mixed\" && !pluginModeSucceeded);\n if (isLocalOutput && copiedSkills.length > 0) {\n this.log(\"Skills copied to:\");\n this.log(` ${projectPaths.skillsDir}`);\n for (const skill of copiedSkills) {\n const displayName = getSkillById(skill.id).displayName;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n }\n this.log(\"Agents compiled to:\");\n this.log(` ${projectPaths.agentsDir}`);\n for (const agentName of compileResult.compiled) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${configResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n }\n}\n\nexport type DashboardData = {\n skillCount: number;\n agentCount: number;\n mode: string;\n source?: string;\n};\n\n/** Gathers dashboard data from the installation and project config. */\nexport async function getDashboardData(projectDir: string): Promise<DashboardData> {\n const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);\n\n const skillCount = loaded?.config?.skills?.length ?? 0;\n const agentCount = info?.agentCount ?? 0;\n const mode =\n info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : \"local\");\n const source = loaded?.config?.source;\n\n return { skillCount, agentCount, mode, source };\n}\n","import React from \"react\";\n\nimport { Text, Box } from \"ink\";\nimport path from \"path\";\n\nimport { CLAUDE_DIR, CLI_COLORS, MAX_CONFIG_FILE_SIZE } from \"../consts\";\nimport { fileExists, readFileSafe } from \"../utils/fs\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema, warnUnknownFields } from \"./schemas\";\n\ntype PermissionConfig = {\n allow?: string[];\n deny?: string[];\n};\n\ntype SettingsFile = {\n permissions?: PermissionConfig;\n};\n\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.json\");\n const localSettingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.local.json\");\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);\n const raw = JSON.parse(content);\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n // Known Claude CLI settings.json fields (permissions is ours; the rest are managed by Claude CLI)\n const EXPECTED_SETTINGS_KEYS = [\n \"permissions\",\n \"enabledPlugins\",\n \"env\",\n \"allowedTools\",\n \"customInstructions\",\n \"defaultModel\",\n ] as const;\n warnUnknownFields(\n raw as Record<string, unknown>,\n EXPECTED_SETTINGS_KEYS,\n `settings file '${filePath}'`,\n );\n }\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? (result.data as SettingsFile) : {};\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {\n warn(`Malformed settings file at '${filePath}' — skipping`);\n }\n }\n }\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Notice\n </Text>\n <Text>No permissions configured in .claude/settings.json</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to .claude/settings.json:</Text>\n <Text> </Text>\n <Text color=\"dim\">{\"{\"}</Text>\n <Text color=\"dim\">{' \"permissions\": {'}</Text>\n <Text color=\"dim\">{' \"allow\": ['}</Text>\n <Text color=\"dim\">{' \"Read(*)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(git *)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(bun *)\"'}</Text>\n <Text color=\"dim\">{\" ]\"}</Text>\n <Text color=\"dim\">{\" }\"}</Text>\n <Text color=\"dim\">{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAEA,SAAS,aAAa;AACtB,SAAS,QAAQ,OAAAA,MAAK,QAAAC,OAAM,cAAc;AAC1C,OAAO,QAAQ;;;ACJf;AAEA,SAAS,MAAM,WAAW;AAC1B,OAAO,UAAU;AAyDX,SACE,KADF;AAzCN,eAAsB,iBAAiB,aAAyD;AAC9F,QAAM,eAAe,KAAK,KAAK,aAAa,YAAY,eAAe;AACvE,QAAM,oBAAoB,KAAK,KAAK,aAAa,YAAY,qBAAqB;AAElF,MAAI;AAEJ,aAAW,YAAY,CAAC,mBAAmB,YAAY,GAAG;AACxD,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,UAAI;AACF,cAAM,UAAU,MAAM,aAAa,UAAU,oBAAoB;AACjE,cAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,YAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG;AAElE,gBAAM,yBAAyB;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA;AAAA,YACE;AAAA,YACA;AAAA,YACA,kBAAkB,QAAQ;AAAA,UAC5B;AAAA,QACF;AACA,cAAM,SAAS,mBAAmB,UAAU,GAAG;AAC/C,cAAM,SAAuB,OAAO,UAAW,OAAO,OAAwB,CAAC;AAC/E,YAAI,OAAO,aAAa;AACtB,wBAAc,OAAO;AACrB;AAAA,QACF;AAAA,MACF,QAAQ;AACN,aAAK,+BAA+B,QAAQ,mBAAc;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,aAAa;AAChB,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,+BAEtC;AAAA,MACA,oBAAC,QAAK,gEAAkD;AAAA,MACxD,oBAAC,QAAK,+DAAiD;AAAA,MACvD,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,qEAAuD;AAAA,MAC7D,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,OAAM,OAAO,eAAI;AAAA,MACvB,oBAAC,QAAK,OAAM,OAAO,gCAAqB;AAAA,MACxC,oBAAC,QAAK,OAAM,OAAO,4BAAiB;AAAA,MACpC,oBAAC,QAAK,OAAM,OAAO,8BAAmB;AAAA,MACtC,oBAAC,QAAK,OAAM,OAAO,kCAAuB;AAAA,MAC1C,oBAAC,QAAK,OAAM,OAAO,iCAAsB;AAAA,MACzC,oBAAC,QAAK,OAAM,OAAO,mBAAQ;AAAA,MAC3B,oBAAC,QAAK,OAAM,OAAO,iBAAM;AAAA,MACzB,oBAAC,QAAK,OAAM,OAAO,eAAI;AAAA,OACzB;AAAA,EAEJ;AAEA,QAAM,qBAAqB,YAAY,MAAM;AAAA,IAC3C,CAAC,SAAS,SAAS,aAAa,SAAS;AAAA,EAC3C;AACA,QAAM,cAAc,CAAC,YAAY,SAAS,YAAY,MAAM,WAAW;AAEvE,MAAI,sBAAsB,aAAa;AACrC,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,iCAEtC;AAAA,MACC,sBACC,oBAAC,QAAK,kHAGN;AAAA,MAED,eACC,oBAAC,QAAK,qFAAkE;AAAA,OAE5E;AAAA,EAEJ;AAEA,SAAO;AACT;;;ADpCM,gBAAAC,MAcA,QAAAC,aAdA;AArBN,SAAS,sBAA4B;AACnC,UAAQ,OAAO,MAAM,eAAe;AACtC;AAEA,IAAM,oBAA8C;AAAA,EAClD,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,QAAQ,OAAO,OAAO;AACjC;AAOA,IAAM,YAAsC,CAAC,EAAE,UAAU,SAAS,MAAM;AACtE,QAAM,EAAE,KAAK,IAAI,OAAO;AAExB,SACE,gBAAAA,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAACG,OAAA,EAAK,MAAI,MAAE,2BAAiB,MAAK;AAAA,IAClC,gBAAAH,KAACG,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,YAAY;AACrB,mBAAS,OAAO;AAChB,eAAK;AAAA,QACP;AAAA,QACA,UAAU,MAAM;AACd,mBAAS;AACT,eAAK;AAAA,QACP;AAAA;AAAA,IACF;AAAA,IACA,gBAAAA,KAACG,OAAA,EAAK,eAAC;AAAA,IACP,gBAAAF,MAACE,OAAA,EAAK,UAAQ,MACX;AAAA;AAAA,MACA;AAAA,MAAsB;AAAA,MAAW;AAAA,MACjC;AAAA,MAAgB;AAAA,MAAU;AAAA,MAC1B;AAAA,MAAc;AAAA,OACjB;AAAA,KACF;AAEJ;AAGO,SAAS,oBAAoB,MAA6B;AAC/D,QAAM,YAAY,KAAK,SAAS,WAAW,WAAW,KAAK,SAAS,UAAU,UAAU;AACxF,QAAM,QAAQ;AAAA,IACZ,iBAAiB;AAAA,IACjB;AAAA,IACA,cAAc,KAAK,UAAU;AAAA,IAC7B,cAAc,KAAK,UAAU;AAAA,IAC7B,cAAc,SAAS;AAAA,EACzB;AACA,MAAI,KAAK,QAAQ;AACf,UAAM,KAAK,cAAc,KAAK,MAAM,EAAE;AAAA,EACxC;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,uCAAuC;AAClD,SAAO,MAAM,KAAK,IAAI;AACxB;AAMA,eAAsB,cACpB,YACA,KACwB;AACxB,QAAM,OAAO,MAAM,iBAAiB,UAAU;AAG9C,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAM,SAAS,OAAO,QAAQ;AAC9B,WAAO,oBAAoB,IAAI,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,kBAAiC;AAErC,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,CAAC,YAAY;AACrB,4BAAkB;AAAA,QACpB;AAAA,QACA,UAAU,MAAM;AACd,4BAAkB;AAAA,QACpB;AAAA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc;AACpB,sBAAoB;AAEpB,SAAO;AACT;AAEA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA,EAC5C,OAAO,UAAU,cAAc,iBAAiB,IAAI;AAAA,EACpD,OAAO,cACL;AAAA,EAEF,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG,YAAY;AAAA,IACf,SAAS,MAAM,QAAQ;AAAA,MACrB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,KAAI;AACvC,UAAM,aAAa,QAAQ,IAAI;AAE/B,QAAI,MAAM,KAAK,2BAA2B,UAAU,EAAG;AACvD,UAAM,KAAK,mBAAmB,UAAU;AAExC,UAAM,EAAE,cAAc,gBAAgB,IAAI,MAAM,KAAK,iBAAiB,KAAK;AAC3E,UAAM,SAAS,MAAM,KAAK,UAAU,cAAc,iBAAiB,UAAU;AAC7E,QAAI,CAAC,OAAQ,MAAK,KAAK,WAAW,SAAS;AAE3C,QAAI,OAAO,OAAO,WAAW,GAAG;AAC9B,WAAK,MAAM,sBAAsB,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IAC7D;AAEA,UAAM,KAAK,mBAAmB,QAAQ,cAAc,KAAK;AAAA,EAC3D;AAAA,EAEA,MAAc,2BAA2B,YAAsC;AAC7E,UAAM,uBAAuB,MAAM,0BAA0B,UAAU;AACvE,QAAI,CAAC,qBAAsB,QAAO;AAElC,UAAM,kBAAkB,MAAM,cAAc,YAAY,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC;AAC9E,QAAI,iBAAiB;AACnB,YAAM,KAAK,OAAO,WAAW,eAAe;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,YAAmC;AAMlE,UAAM,eAAe,GAAG,aAAa,UAAU,MAAM,GAAG,aAAa,mBAAmB;AACxF,QAAI,CAAC,cAAc;AACjB,YAAM,UAAU,MAAM,wBAAwB;AAC9C,UAAI,SAAS;AACX,aAAK,IAAI,sCAAsC,cAAc;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,OAGoD;AACjF,QAAI;AACF,YAAM,SAAS,MAAM,WAAW;AAAA,QAC9B,YAAY,MAAM;AAAA,QAClB,YAAY,QAAQ,IAAI;AAAA,QACxB,cAAc,MAAM;AAAA,QACpB,wBAAwB;AAAA,MAC1B,CAAC;AACD,aAAO,EAAE,cAAc,OAAO,cAAc,iBAAiB,OAAO,gBAAgB;AAAA,IACtF,SAAS,OAAO;AACd,WAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,QACjC,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,UACZ,cACA,iBACA,YACgC;AAChC,QAAI,eAAsC;AAE1C,UAAM,EAAE,cAAc,IAAI;AAAA,MACxB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,KAAK,OAAO;AAAA,UACrB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,YAAY,CAACI,YAAW;AACtB,2BAAeA;AAAA,UACjB;AAAA,UACA,UAAU,MAAM;AACd,iBAAK,IAAI,iBAAiB;AAAA,UAC5B;AAAA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc;AAGpB,UAAM,SAAS;AACf,QAAI,QAAQ,UAAW,QAAO;AAC9B,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBACZ,QACA,cACA,OACe;AACf,UAAM,aAAa,QAAQ,IAAI;AAC/B,QAAI,cAAc,kBAAkB,OAAO,MAAM;AACjD,UAAM,cAAc,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AACpE,UAAM,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO;AAErE,SAAK,eAAe,QAAQ,aAAa,aAAa,YAAY;AAElE,QAAI,eAAe,CAAC,GAAG,WAAW;AAClC,QAAI,sBAAsB;AAE1B,QAAI,gBAAgB,WAAW,gBAAgB,SAAS;AACtD,YAAM,KAAK,oBAAoB,aAAa,YAAY,cAAc,WAAW;AAAA,IACnF;AAEA,QAAI,gBAAgB,YAAY,gBAAgB,SAAS;AACvD,YAAM,mBAAmB,MAAM,KAAK;AAAA,QAClC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT;AACA,qBAAe,iBAAiB;AAChC,oBAAc,iBAAiB;AAC/B,4BAAsB,iBAAiB;AAAA,IACzC;AAEA,QAAI;AACF,YAAM,EAAE,cAAc,eAAe,aAAa,IAAI,MAAM,KAAK;AAAA,QAC/D;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,oBAAoB,MAAM,iBAAiB,UAAU;AAC3D,UAAI,mBAAmB;AACrB,cAAM,EAAE,cAAc,IAAI,OAAO,iBAAiB;AAClD,cAAM,cAAc;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,eACN,QACA,aACA,aACA,cACM;AACN,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,YAAY,OAAO,OAAO,MAAM,SAAS;AAClD,SAAK;AAAA,MACH,iBACE,gBAAgB,WACZ,4BACA,gBAAgB,UACd,UAAU,YAAY,MAAM,WAAW,aAAa,MAAM,aAC1D,iCACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBACZ,aACA,YACA,cACA,aACe;AACf,SAAK,IAAI,sCAAsC;AAC/C,UAAM,aAAa,MAAM,gBAAgB,aAAa,YAAY,YAAY;AAE9E,QAAI,gBAAgB,SAAS;AAC3B,UAAI,WAAW,cAAc,SAAS,KAAK,WAAW,aAAa,SAAS,GAAG;AAC7E,aAAK;AAAA,UACH,UAAU,WAAW,WAAW,kBAAkB,WAAW,cAAc,MAAM,aAAa,WAAW,aAAa,MAAM;AAAA,QAC9H;AAAA,MACF,WAAW,WAAW,aAAa,SAAS,GAAG;AAC7C,aAAK,IAAI,UAAU,WAAW,aAAa,MAAM,oCAAoC;AAAA,MACvF,OAAO;AACL,aAAK,IAAI,UAAU,WAAW,cAAc,MAAM,kCAAkC;AAAA,MACtF;AAAA,IACF,OAAO;AACL,WAAK,IAAI,UAAU,WAAW,WAAW;AAAA,CAA8B;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,cACA,cACA,YACA,aACA,cACA,WAKC;AACD,UAAM,WAAW,MAAM,kBAAkB,YAAY;AAErD,QAAI,CAAC,SAAS,aAAa;AACzB,WAAK,KAAK,8DAA8D;AAIxE,YAAM,iBAAiB,gBAAgB,UAAU,eAAe;AAChE,YAAM,qBAAqB,MAAM,gBAAgB,gBAAgB,YAAY,YAAY;AACzF,WAAK,IAAI,UAAU,mBAAmB,WAAW;AAAA,CAA8B;AAC/E,aAAO;AAAA,QACL,cAAc,CAAC,GAAG,cAAc,GAAG,cAAc;AAAA,QACjD,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,IACF;AAEA,QAAI,SAAS,YAAY;AACvB,WAAK,IAAI,4BAA4B,SAAS,WAAW,MAAM;AAAA,IACjE;AAEA,SAAK,IAAI,6BAA6B;AACtC,UAAM,eAAe,MAAM,oBAAoB,cAAc,SAAS,aAAa,UAAU;AAE7F,eAAW,QAAQ,aAAa,WAAW;AACzC,WAAK,IAAI,eAAe,KAAK,GAAG,EAAE;AAAA,IACpC;AACA,eAAW,QAAQ,aAAa,QAAQ;AACtC,WAAK,KAAK,4BAA4B,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAAA,IAChE;AAEA,SAAK,IAAI,aAAa,aAAa,UAAU,MAAM;AAAA,CAAkB;AACrE,WAAO,EAAE,cAAc,aAAa,WAAW,KAAK;AAAA,EACtD;AAAA,EAEA,MAAc,sBACZ,QACA,cACA,OACA,aAKC;AACD,SAAK,IAAI,6BAA6B;AACtC,UAAM,eAAe,MAAM,mBAAmB;AAAA,MAC5C,cAAc;AAAA,MACd;AAAA,MACA,YAAY,QAAQ,IAAI;AAAA,MACxB,YAAY,MAAM;AAAA,IACpB,CAAC;AAED,QAAI,aAAa,WAAW;AAC1B,WAAK,IAAI,kCAAkC,aAAa,kBAAkB,EAAE;AAAA,IAC9E;AAEA,SAAK,IAAI,wBAAwB,aAAa,OAAO,OAAO,MAAM;AAAA,CAAY;AAE9E,SAAK,IAAI,gBAAgB,gBAAgB;AACzC,UAAM,eAAe,oBAAoB,QAAQ,IAAI,GAAG,SAAS;AACjE,UAAM,YAAY,MAAM,cAAc;AACtC,UAAM,EAAE,UAAU,IAAI,MAAM,wBAAwB,QAAQ,IAAI,CAAC;AACjE,UAAM,gBAAgB,MAAM,cAAc;AAAA,MACxC,YAAY,QAAQ,IAAI;AAAA,MACxB,YAAY,UAAU;AAAA,MACtB,QAAQ;AAAA,MACR;AAAA,MACA,eAAe,mBAAmB,aAAa,MAAM;AAAA,MACrD,WAAW,aAAa;AAAA,IAC1B,CAAC;AACD,SAAK,IAAI,YAAY,cAAc,SAAS,MAAM;AAAA,CAA8B;AAEhF,WAAO,EAAE,cAAc,eAAe,aAAa;AAAA,EACrD;AAAA,EAEQ,cACN,cACA,eACA,cACA,aACA,qBACA,cACM;AACN,SAAK,IAAI,GAAG,iBAAiB,YAAY;AAAA,CAAI;AAE7C,UAAM,gBACJ,gBAAgB,WAAY,gBAAgB,WAAW,CAAC;AAC1D,QAAI,iBAAiB,aAAa,SAAS,GAAG;AAC5C,WAAK,IAAI,mBAAmB;AAC5B,WAAK,IAAI,KAAK,aAAa,SAAS,EAAE;AACtC,iBAAW,SAAS,cAAc;AAChC,cAAM,cAAc,aAAa,MAAM,EAAE,EAAE;AAC3C,aAAK,IAAI,OAAO,WAAW,GAAG;AAAA,MAChC;AACA,WAAK,IAAI,EAAE;AAAA,IACb;AACA,SAAK,IAAI,qBAAqB;AAC9B,SAAK,IAAI,KAAK,aAAa,SAAS,EAAE;AACtC,eAAW,aAAa,cAAc,UAAU;AAC9C,WAAK,IAAI,OAAO,SAAS,KAAK;AAAA,IAChC;AACA,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,gBAAgB;AACzB,SAAK,IAAI,KAAK,aAAa,UAAU,EAAE;AACvC,SAAK,IAAI,EAAE;AACX,SAAK,IAAI,uCAAuC;AAChD,SAAK,IAAI,iCAAiC;AAC1C,SAAK,IAAI,aAAa,YAAY,gCAAgC;AAClE,SAAK,IAAI,EAAE;AAAA,EACb;AACF;AAUA,eAAsB,iBAAiB,YAA4C;AACjF,QAAM,CAAC,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC,oBAAoB,GAAG,kBAAkB,UAAU,CAAC,CAAC;AAE/F,QAAM,aAAa,QAAQ,QAAQ,QAAQ,UAAU;AACrD,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,OACJ,MAAM,SAAS,QAAQ,QAAQ,SAAS,kBAAkB,OAAO,OAAO,MAAM,IAAI;AACpF,QAAM,SAAS,QAAQ,QAAQ;AAE/B,SAAO,EAAE,YAAY,YAAY,MAAM,OAAO;AAChD;","names":["Box","Text","jsx","jsxs","Box","Text","result"]}
|
|
@@ -24,11 +24,11 @@ import {
|
|
|
24
24
|
addSource,
|
|
25
25
|
getSourceSummary,
|
|
26
26
|
removeSource
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-EADZIYQW.js";
|
|
28
28
|
import {
|
|
29
29
|
getErrorMessage,
|
|
30
30
|
verbose
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-ZTRQO5CX.js";
|
|
32
32
|
import {
|
|
33
33
|
CLI_COLORS
|
|
34
34
|
} from "./chunk-6PGL2XMY.js";
|
|
@@ -263,4 +263,4 @@ var StepSettings = ({
|
|
|
263
263
|
export {
|
|
264
264
|
StepSettings
|
|
265
265
|
};
|
|
266
|
-
//# sourceMappingURL=chunk-
|
|
266
|
+
//# sourceMappingURL=chunk-2DRPZXXK.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "./chunk-4QA5TIBU.js";
|
|
8
8
|
import {
|
|
9
9
|
useWizardStore
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-DDCW4SKN.js";
|
|
11
11
|
import {
|
|
12
12
|
matrix
|
|
13
13
|
} from "./chunk-ANXHMG32.js";
|
|
@@ -191,4 +191,4 @@ var StackSelection = ({ onCancel }) => {
|
|
|
191
191
|
export {
|
|
192
192
|
StackSelection
|
|
193
193
|
};
|
|
194
|
-
//# sourceMappingURL=chunk-
|
|
194
|
+
//# sourceMappingURL=chunk-57KI55GJ.js.map
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./chunk-CKZ65VFJ.js";
|
|
14
14
|
import {
|
|
15
15
|
useWizardStore
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-DDCW4SKN.js";
|
|
17
17
|
import {
|
|
18
18
|
HOTKEY_SET_ALL_LOCAL,
|
|
19
19
|
HOTKEY_SET_ALL_PLUGIN,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
import {
|
|
23
23
|
resolveAllSources,
|
|
24
24
|
searchExtraSources
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-EADZIYQW.js";
|
|
26
26
|
import {
|
|
27
27
|
CLI_COLORS,
|
|
28
28
|
DEFAULT_BRANDING
|
|
@@ -168,4 +168,4 @@ var StepSources = ({ projectDir, onContinue, onBack }) => {
|
|
|
168
168
|
export {
|
|
169
169
|
StepSources
|
|
170
170
|
};
|
|
171
|
-
//# sourceMappingURL=chunk-
|
|
171
|
+
//# sourceMappingURL=chunk-5IYZGJDW.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StackSelection
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-57KI55GJ.js";
|
|
5
5
|
import {
|
|
6
6
|
useMeasuredHeight
|
|
7
7
|
} from "./chunk-K77I4XGL.js";
|
|
@@ -21,4 +21,4 @@ var StepStack = ({ onCancel }) => {
|
|
|
21
21
|
export {
|
|
22
22
|
StepStack
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=chunk-
|
|
24
|
+
//# sourceMappingURL=chunk-6YR2NEW3.js.map
|