@agents-inc/cli 0.88.0 → 0.91.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 +29 -0
- package/dist/{chunk-RWVF6DQE.js → chunk-2RFE7LTV.js} +3 -3
- package/dist/{chunk-ZFQTKY2S.js → chunk-2RXDM5HN.js} +5 -5
- package/dist/chunk-2RXDM5HN.js.map +1 -0
- package/dist/{chunk-CKZ65VFJ.js → chunk-35WALWDD.js} +5 -5
- package/dist/chunk-35WALWDD.js.map +1 -0
- package/dist/{chunk-BEZ6ZPDS.js → chunk-3O57Z6Q3.js} +3 -3
- package/dist/{chunk-2DRPZXXK.js → chunk-3STOCHK4.js} +4 -4
- package/dist/{chunk-ANXHMG32.js → chunk-47HMJ4BY.js} +28 -1
- package/dist/chunk-47HMJ4BY.js.map +1 -0
- package/dist/{chunk-LHUK5L6P.js → chunk-4DZNTUK7.js} +23 -10
- package/dist/chunk-4DZNTUK7.js.map +1 -0
- package/dist/{chunk-REZZSDXG.js → chunk-5IR4QU7G.js} +37 -24
- package/dist/chunk-5IR4QU7G.js.map +1 -0
- package/dist/{chunk-TAPEVEET.js → chunk-7K7SA4TZ.js} +2 -2
- package/dist/chunk-7QWCPF6F.js +135 -0
- package/dist/chunk-7QWCPF6F.js.map +1 -0
- package/dist/{chunk-WTPPVXJP.js → chunk-AWB6DO24.js} +17 -10
- package/dist/chunk-AWB6DO24.js.map +1 -0
- package/dist/{chunk-SB2R5KHJ.js → chunk-BGICSUQK.js} +2 -2
- package/dist/{chunk-HK53FRMU.js → chunk-DVBA6PGR.js} +3 -7
- package/dist/{chunk-HK53FRMU.js.map → chunk-DVBA6PGR.js.map} +1 -1
- package/dist/{chunk-YM3V4Q3W.js → chunk-DZ2IQERZ.js} +5 -5
- package/dist/{chunk-I5AZKNNL.js → chunk-FEKVKYCN.js} +2 -2
- package/dist/{chunk-EADZIYQW.js → chunk-FVBSRBU3.js} +30 -21
- package/dist/chunk-FVBSRBU3.js.map +1 -0
- package/dist/{chunk-6YR2NEW3.js → chunk-G3VPBEBC.js} +2 -2
- package/dist/{chunk-JNUFQBXX.js → chunk-HCSIS35Y.js} +2 -2
- package/dist/{chunk-NPMMU4GY.js → chunk-IR7ADPAZ.js} +56 -1
- package/dist/chunk-IR7ADPAZ.js.map +1 -0
- package/dist/{chunk-AP4DLJDP.js → chunk-JBS4CCJG.js} +2 -2
- package/dist/chunk-M6J5YQ3P.js +100 -0
- package/dist/chunk-M6J5YQ3P.js.map +1 -0
- package/dist/{chunk-23M3SPXX.js → chunk-MBEXASMU.js} +8 -8
- package/dist/{chunk-TEA5KBIA.js → chunk-NESVWSI7.js} +2 -2
- package/dist/{chunk-ZTRQO5CX.js → chunk-OOHPUT5M.js} +2 -2
- package/dist/{chunk-V36FRPAU.js → chunk-ORTNQZLF.js} +4 -2
- package/dist/{chunk-V36FRPAU.js.map → chunk-ORTNQZLF.js.map} +1 -1
- package/dist/{chunk-ANZV33N5.js → chunk-OVY7IV3C.js} +2 -2
- package/dist/{chunk-ITBSJNIC.js → chunk-Q3NIGPRZ.js} +3 -3
- package/dist/{chunk-5IYZGJDW.js → chunk-RDQBXB3Y.js} +6 -6
- package/dist/{chunk-MY4TVLRB.js → chunk-TJHCK4OS.js} +4 -4
- package/dist/{chunk-PZBLGD7O.js → chunk-UCORQ7YO.js} +2 -2
- package/dist/{chunk-NL5EB57E.js → chunk-UHARXISZ.js} +4 -4
- package/dist/chunk-UHARXISZ.js.map +1 -0
- package/dist/{chunk-57KI55GJ.js → chunk-UK572773.js} +3 -3
- package/dist/{chunk-DDCW4SKN.js → chunk-V75HVZTB.js} +7 -6
- package/dist/chunk-V75HVZTB.js.map +1 -0
- package/dist/{chunk-6XWHJHNZ.js → chunk-WEYWZ7UE.js} +4 -1
- package/dist/chunk-WEYWZ7UE.js.map +1 -0
- package/dist/{chunk-STMRDPGZ.js → chunk-XM2Y5AFQ.js} +2 -2
- package/dist/commands/build/marketplace.js +62 -44
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +46 -37
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/build/stack.js +43 -35
- package/dist/commands/build/stack.js.map +1 -1
- package/dist/commands/compile.js +44 -41
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/config/index.js +8 -8
- package/dist/commands/config/path.js +7 -7
- package/dist/commands/config/show.js +8 -8
- package/dist/commands/diff.js +13 -12
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.js +17 -40
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +63 -70
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +9 -9
- package/dist/commands/import/skill.js +60 -50
- package/dist/commands/import/skill.js.map +1 -1
- package/dist/commands/info.js +9 -9
- package/dist/commands/init.js +28 -29
- package/dist/commands/list.js +7 -7
- package/dist/commands/new/agent.js +8 -8
- package/dist/commands/new/marketplace.js +98 -83
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/new/skill.js +7 -7
- package/dist/commands/outdated.js +91 -100
- package/dist/commands/outdated.js.map +1 -1
- package/dist/commands/search.js +11 -11
- package/dist/commands/uninstall.js +40 -31
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +9 -9
- package/dist/commands/validate.js +7 -7
- package/dist/components/skill-search/skill-search.js +2 -2
- package/dist/components/wizard/category-grid.js +3 -3
- package/dist/components/wizard/category-grid.test.js +12 -12
- package/dist/components/wizard/domain-selection.js +9 -9
- package/dist/components/wizard/info-panel.js +18 -0
- package/dist/components/wizard/search-modal.js +2 -2
- package/dist/components/wizard/search-modal.test.js +2 -2
- package/dist/components/wizard/source-grid.js +4 -4
- package/dist/components/wizard/source-grid.test.js +13 -13
- package/dist/components/wizard/stack-selection.js +8 -8
- package/dist/components/wizard/stats-panel.js +106 -5
- package/dist/components/wizard/stats-panel.js.map +1 -1
- package/dist/components/wizard/step-agents.js +9 -9
- package/dist/components/wizard/step-agents.test.js +12 -12
- package/dist/components/wizard/step-build.js +10 -11
- package/dist/components/wizard/step-build.test.js +13 -14
- package/dist/components/wizard/step-build.test.js.map +1 -1
- package/dist/components/wizard/step-confirm.js +4 -4
- package/dist/components/wizard/step-confirm.test.js +10 -10
- package/dist/components/wizard/step-refine.js +2 -2
- package/dist/components/wizard/step-refine.test.js +2 -2
- package/dist/components/wizard/step-settings.js +8 -8
- package/dist/components/wizard/step-settings.test.js +11 -11
- package/dist/components/wizard/step-sources.js +12 -12
- package/dist/components/wizard/step-sources.test.js +15 -15
- package/dist/components/wizard/step-stack.js +9 -9
- package/dist/components/wizard/step-stack.test.js +10 -10
- package/dist/components/wizard/wizard-layout.js +12 -12
- package/dist/components/wizard/wizard.js +24 -25
- package/dist/config-exports.js +1 -1
- package/dist/hooks/init.js +28 -29
- package/dist/hooks/init.js.map +1 -1
- package/dist/{loader-SQOK2BF7.js → loader-D5VE56SI.js} +4 -4
- package/dist/{source-loader-CCECAU5L.js → source-loader-INCCYL5P.js} +7 -7
- package/dist/source-manager-TEOUO734.js +19 -0
- package/dist/src/agents/developer/ai-developer/critical-reminders.md +31 -0
- package/dist/src/agents/developer/ai-developer/critical-requirements.md +17 -0
- package/dist/src/agents/developer/ai-developer/examples.md +137 -0
- package/dist/src/agents/developer/ai-developer/intro.md +23 -0
- package/dist/src/agents/developer/ai-developer/metadata.yaml +12 -0
- package/dist/src/agents/developer/ai-developer/output-format.md +228 -0
- package/dist/src/agents/developer/ai-developer/workflow.md +464 -0
- package/dist/src/agents/planning/api-pm/critical-reminders.md +32 -0
- package/dist/src/agents/planning/api-pm/critical-requirements.md +21 -0
- package/dist/src/agents/planning/api-pm/examples.md +157 -0
- package/dist/src/agents/planning/api-pm/intro.md +14 -0
- package/dist/src/agents/planning/api-pm/metadata.yaml +12 -0
- package/dist/src/agents/planning/api-pm/output-format.md +317 -0
- package/dist/src/agents/planning/api-pm/workflow.md +214 -0
- package/dist/src/agents/reviewer/ai-reviewer/critical-reminders.md +23 -0
- package/dist/src/agents/reviewer/ai-reviewer/critical-requirements.md +19 -0
- package/dist/src/agents/reviewer/ai-reviewer/examples.md +131 -0
- package/dist/src/agents/reviewer/ai-reviewer/intro.md +23 -0
- package/dist/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
- package/dist/src/agents/reviewer/ai-reviewer/output-format.md +263 -0
- package/dist/src/agents/reviewer/ai-reviewer/workflow.md +177 -0
- package/dist/src/agents/reviewer/infra-reviewer/critical-reminders.md +21 -0
- package/dist/src/agents/reviewer/infra-reviewer/critical-requirements.md +19 -0
- package/dist/src/agents/reviewer/infra-reviewer/examples.md +123 -0
- package/dist/src/agents/reviewer/infra-reviewer/intro.md +25 -0
- package/dist/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
- package/dist/src/agents/reviewer/infra-reviewer/output-format.md +240 -0
- package/dist/src/agents/reviewer/infra-reviewer/workflow.md +250 -0
- package/dist/src/agents/tester/api-tester/critical-reminders.md +23 -0
- package/dist/src/agents/tester/api-tester/critical-requirements.md +19 -0
- package/dist/src/agents/tester/api-tester/examples.md +74 -0
- package/dist/src/agents/tester/api-tester/intro.md +21 -0
- package/dist/src/agents/tester/api-tester/metadata.yaml +12 -0
- package/dist/src/agents/tester/api-tester/output-format.md +209 -0
- package/dist/src/agents/tester/api-tester/workflow.md +364 -0
- package/dist/stores/wizard-store.js +7 -7
- package/dist/stores/wizard-store.test.js +26 -26
- package/dist/stores/wizard-store.test.js.map +1 -1
- package/package.json +1 -1
- package/src/agents/developer/ai-developer/critical-reminders.md +31 -0
- package/src/agents/developer/ai-developer/critical-requirements.md +17 -0
- package/src/agents/developer/ai-developer/examples.md +137 -0
- package/src/agents/developer/ai-developer/intro.md +23 -0
- package/src/agents/developer/ai-developer/metadata.yaml +12 -0
- package/src/agents/developer/ai-developer/output-format.md +228 -0
- package/src/agents/developer/ai-developer/workflow.md +464 -0
- package/src/agents/planning/api-pm/critical-reminders.md +32 -0
- package/src/agents/planning/api-pm/critical-requirements.md +21 -0
- package/src/agents/planning/api-pm/examples.md +157 -0
- package/src/agents/planning/api-pm/intro.md +14 -0
- package/src/agents/planning/api-pm/metadata.yaml +12 -0
- package/src/agents/planning/api-pm/output-format.md +317 -0
- package/src/agents/planning/api-pm/workflow.md +214 -0
- package/src/agents/reviewer/ai-reviewer/critical-reminders.md +23 -0
- package/src/agents/reviewer/ai-reviewer/critical-requirements.md +19 -0
- package/src/agents/reviewer/ai-reviewer/examples.md +131 -0
- package/src/agents/reviewer/ai-reviewer/intro.md +23 -0
- package/src/agents/reviewer/ai-reviewer/metadata.yaml +10 -0
- package/src/agents/reviewer/ai-reviewer/output-format.md +263 -0
- package/src/agents/reviewer/ai-reviewer/workflow.md +177 -0
- package/src/agents/reviewer/infra-reviewer/critical-reminders.md +21 -0
- package/src/agents/reviewer/infra-reviewer/critical-requirements.md +19 -0
- package/src/agents/reviewer/infra-reviewer/examples.md +123 -0
- package/src/agents/reviewer/infra-reviewer/intro.md +25 -0
- package/src/agents/reviewer/infra-reviewer/metadata.yaml +10 -0
- package/src/agents/reviewer/infra-reviewer/output-format.md +240 -0
- package/src/agents/reviewer/infra-reviewer/workflow.md +250 -0
- package/src/agents/tester/api-tester/critical-reminders.md +23 -0
- package/src/agents/tester/api-tester/critical-requirements.md +19 -0
- package/src/agents/tester/api-tester/examples.md +74 -0
- package/src/agents/tester/api-tester/intro.md +21 -0
- package/src/agents/tester/api-tester/metadata.yaml +12 -0
- package/src/agents/tester/api-tester/output-format.md +209 -0
- package/src/agents/tester/api-tester/workflow.md +364 -0
- package/dist/chunk-6XWHJHNZ.js.map +0 -1
- package/dist/chunk-ANXHMG32.js.map +0 -1
- package/dist/chunk-ATPHV3MD.js +0 -143
- package/dist/chunk-ATPHV3MD.js.map +0 -1
- package/dist/chunk-CKZ65VFJ.js.map +0 -1
- package/dist/chunk-DDCW4SKN.js.map +0 -1
- package/dist/chunk-EADZIYQW.js.map +0 -1
- package/dist/chunk-FQTYF3OU.js +0 -114
- package/dist/chunk-FQTYF3OU.js.map +0 -1
- package/dist/chunk-LHUK5L6P.js.map +0 -1
- package/dist/chunk-NL5EB57E.js.map +0 -1
- package/dist/chunk-NPMMU4GY.js.map +0 -1
- package/dist/chunk-REZZSDXG.js.map +0 -1
- package/dist/chunk-VWTZOBBQ.js +0 -111
- package/dist/chunk-VWTZOBBQ.js.map +0 -1
- package/dist/chunk-WTPPVXJP.js.map +0 -1
- package/dist/chunk-ZFQTKY2S.js.map +0 -1
- package/dist/components/wizard/help-modal.js +0 -18
- package/dist/source-manager-4P7MTZRR.js +0 -19
- /package/dist/{chunk-RWVF6DQE.js.map → chunk-2RFE7LTV.js.map} +0 -0
- /package/dist/{chunk-BEZ6ZPDS.js.map → chunk-3O57Z6Q3.js.map} +0 -0
- /package/dist/{chunk-2DRPZXXK.js.map → chunk-3STOCHK4.js.map} +0 -0
- /package/dist/{chunk-TAPEVEET.js.map → chunk-7K7SA4TZ.js.map} +0 -0
- /package/dist/{chunk-SB2R5KHJ.js.map → chunk-BGICSUQK.js.map} +0 -0
- /package/dist/{chunk-YM3V4Q3W.js.map → chunk-DZ2IQERZ.js.map} +0 -0
- /package/dist/{chunk-I5AZKNNL.js.map → chunk-FEKVKYCN.js.map} +0 -0
- /package/dist/{chunk-6YR2NEW3.js.map → chunk-G3VPBEBC.js.map} +0 -0
- /package/dist/{chunk-JNUFQBXX.js.map → chunk-HCSIS35Y.js.map} +0 -0
- /package/dist/{chunk-AP4DLJDP.js.map → chunk-JBS4CCJG.js.map} +0 -0
- /package/dist/{chunk-23M3SPXX.js.map → chunk-MBEXASMU.js.map} +0 -0
- /package/dist/{chunk-TEA5KBIA.js.map → chunk-NESVWSI7.js.map} +0 -0
- /package/dist/{chunk-ZTRQO5CX.js.map → chunk-OOHPUT5M.js.map} +0 -0
- /package/dist/{chunk-ANZV33N5.js.map → chunk-OVY7IV3C.js.map} +0 -0
- /package/dist/{chunk-ITBSJNIC.js.map → chunk-Q3NIGPRZ.js.map} +0 -0
- /package/dist/{chunk-5IYZGJDW.js.map → chunk-RDQBXB3Y.js.map} +0 -0
- /package/dist/{chunk-MY4TVLRB.js.map → chunk-TJHCK4OS.js.map} +0 -0
- /package/dist/{chunk-PZBLGD7O.js.map → chunk-UCORQ7YO.js.map} +0 -0
- /package/dist/{chunk-57KI55GJ.js.map → chunk-UK572773.js.map} +0 -0
- /package/dist/{chunk-STMRDPGZ.js.map → chunk-XM2Y5AFQ.js.map} +0 -0
- /package/dist/components/wizard/{help-modal.js.map → info-panel.js.map} +0 -0
- /package/dist/{loader-SQOK2BF7.js.map → loader-D5VE56SI.js.map} +0 -0
- /package/dist/{source-loader-CCECAU5L.js.map → source-loader-INCCYL5P.js.map} +0 -0
- /package/dist/{source-manager-4P7MTZRR.js.map → source-manager-TEOUO734.js.map} +0 -0
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
getAgentDefinitions,
|
|
7
7
|
recompileAgents
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-DZ2IQERZ.js";
|
|
9
9
|
import {
|
|
10
10
|
buildAgentScopeMap,
|
|
11
11
|
buildAndMergeConfig,
|
|
@@ -28,15 +28,15 @@ import {
|
|
|
28
28
|
loadSkillsMatrixFromSource,
|
|
29
29
|
resolveInstallPaths,
|
|
30
30
|
writeScopedConfigs
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-FVBSRBU3.js";
|
|
32
32
|
import {
|
|
33
33
|
loadAllAgents,
|
|
34
34
|
parseFrontmatter
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-XM2Y5AFQ.js";
|
|
36
36
|
import {
|
|
37
37
|
typedEntries,
|
|
38
38
|
typedKeys
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-47HMJ4BY.js";
|
|
40
40
|
import {
|
|
41
41
|
directoryExists,
|
|
42
42
|
disableBuffering,
|
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
readFile,
|
|
51
51
|
verbose,
|
|
52
52
|
warn
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-OOHPUT5M.js";
|
|
54
54
|
import {
|
|
55
55
|
GLOBAL_INSTALL_ROOT,
|
|
56
56
|
LOCAL_SKILLS_PATH,
|
|
@@ -63,10 +63,17 @@ import {
|
|
|
63
63
|
|
|
64
64
|
// src/cli/lib/operations/detect-both-installations.ts
|
|
65
65
|
init_esm_shims();
|
|
66
|
+
import fs from "fs";
|
|
66
67
|
import os from "os";
|
|
67
68
|
async function detectBothInstallations(projectDir) {
|
|
68
69
|
const global = await detectGlobalInstallation();
|
|
69
|
-
|
|
70
|
+
let isSameAsHome;
|
|
71
|
+
try {
|
|
72
|
+
isSameAsHome = fs.realpathSync(projectDir) === fs.realpathSync(os.homedir());
|
|
73
|
+
} catch {
|
|
74
|
+
isSameAsHome = projectDir === os.homedir();
|
|
75
|
+
}
|
|
76
|
+
const project = isSameAsHome ? null : await detectProjectInstallation(projectDir);
|
|
70
77
|
return { global, project, hasBoth: !!global && !!project };
|
|
71
78
|
}
|
|
72
79
|
|
|
@@ -278,7 +285,7 @@ async function ensureMarketplace(sourceResult) {
|
|
|
278
285
|
|
|
279
286
|
// src/cli/lib/operations/write-project-config.ts
|
|
280
287
|
init_esm_shims();
|
|
281
|
-
import
|
|
288
|
+
import fs2 from "fs";
|
|
282
289
|
import os4 from "os";
|
|
283
290
|
import path2 from "path";
|
|
284
291
|
async function writeProjectConfig(options) {
|
|
@@ -295,7 +302,7 @@ async function writeProjectConfig(options) {
|
|
|
295
302
|
}
|
|
296
303
|
const mergeResult = await buildAndMergeConfig(wizardResult, sourceResult, projectDir, sourceFlag);
|
|
297
304
|
const finalConfig = mergeResult.config;
|
|
298
|
-
const isProjectContext =
|
|
305
|
+
const isProjectContext = fs2.realpathSync(projectDir) !== fs2.realpathSync(os4.homedir());
|
|
299
306
|
if (isProjectContext) {
|
|
300
307
|
await ensureBlankGlobalConfig();
|
|
301
308
|
}
|
|
@@ -353,6 +360,7 @@ async function compileAgents(options) {
|
|
|
353
360
|
|
|
354
361
|
// src/cli/lib/operations/discover-skills.ts
|
|
355
362
|
init_esm_shims();
|
|
363
|
+
import fs3 from "fs";
|
|
356
364
|
import os5 from "os";
|
|
357
365
|
import path3 from "path";
|
|
358
366
|
async function loadSkillsFromDir(skillsDir, pathPrefix = "") {
|
|
@@ -411,7 +419,12 @@ function mergeSkills(...skillSources) {
|
|
|
411
419
|
return merged;
|
|
412
420
|
}
|
|
413
421
|
async function discoverInstalledSkills(projectDir) {
|
|
414
|
-
|
|
422
|
+
let isGlobalProject;
|
|
423
|
+
try {
|
|
424
|
+
isGlobalProject = fs3.realpathSync(projectDir) === fs3.realpathSync(os5.homedir());
|
|
425
|
+
} catch {
|
|
426
|
+
isGlobalProject = projectDir === os5.homedir();
|
|
427
|
+
}
|
|
415
428
|
const globalPluginSkills = isGlobalProject ? {} : await discoverAllPluginSkills(os5.homedir());
|
|
416
429
|
const globalPluginSkillCount = typedKeys(globalPluginSkills).length;
|
|
417
430
|
if (globalPluginSkillCount > 0) {
|
|
@@ -561,4 +574,4 @@ export {
|
|
|
561
574
|
findSkillMatch,
|
|
562
575
|
resolveSkillInfo
|
|
563
576
|
};
|
|
564
|
-
//# sourceMappingURL=chunk-
|
|
577
|
+
//# sourceMappingURL=chunk-4DZNTUK7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/operations/detect-both-installations.ts","../src/cli/lib/operations/load-source.ts","../src/cli/lib/operations/detect-project.ts","../src/cli/lib/operations/load-agent-defs.ts","../src/cli/lib/operations/copy-local-skills.ts","../src/cli/lib/operations/install-plugin-skills.ts","../src/cli/lib/operations/uninstall-plugin-skills.ts","../src/cli/lib/operations/collect-scoped-skill-dirs.ts","../src/cli/lib/operations/compare-skills.ts","../src/cli/lib/operations/ensure-marketplace.ts","../src/cli/lib/operations/write-project-config.ts","../src/cli/lib/operations/compile-agents.ts","../src/cli/lib/operations/discover-skills.ts","../src/cli/lib/operations/find-skill-match.ts","../src/cli/lib/operations/resolve-skill-info.ts","../src/cli/lib/operations/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport os from \"os\";\nimport {\n detectGlobalInstallation,\n detectProjectInstallation,\n type Installation,\n} from \"../installation/index.js\";\n\nexport type BothInstallations = {\n global: Installation | null;\n project: Installation | null;\n hasBoth: boolean;\n};\n\n/**\n * Detects both global and project installations.\n *\n * Skips project detection when projectDir is the home directory\n * to avoid double-compile. Returns a convenience `hasBoth` flag\n * used by callers to set scopeFilter on compile passes.\n */\nexport async function detectBothInstallations(projectDir: string): Promise<BothInstallations> {\n const global = await detectGlobalInstallation();\n\n let isSameAsHome: boolean;\n try {\n isSameAsHome = fs.realpathSync(projectDir) === fs.realpathSync(os.homedir());\n } catch {\n isSameAsHome = projectDir === os.homedir();\n }\n\n const project = isSameAsHome ? null : await detectProjectInstallation(projectDir);\n return { global, project, hasBoth: !!global && !!project };\n}\n","import { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../loading/index.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n type StartupMessage,\n} from \"../../utils/logger.js\";\n\nexport type LoadSourceOptions = {\n sourceFlag?: string;\n projectDir: string;\n forceRefresh?: boolean;\n /** When true, enables message buffering and captures startup messages. Default: false. */\n captureStartupMessages?: boolean;\n};\n\nexport type LoadedSource = {\n sourceResult: SourceLoadResult;\n /** Empty array when captureStartupMessages is false. */\n startupMessages: StartupMessage[];\n};\n\n/**\n * Loads the skills matrix from a resolved source.\n *\n * When `captureStartupMessages` is true, wraps the load in buffer mode so\n * warn() calls during loading are captured instead of written to stderr.\n * The caller (init/edit) passes these messages to the Wizard's <Static> block.\n *\n * @throws {Error} If source resolution or fetching fails.\n */\nexport async function loadSource(options: LoadSourceOptions): Promise<LoadedSource> {\n const { sourceFlag, projectDir, forceRefresh, captureStartupMessages } = options;\n\n if (captureStartupMessages) {\n enableBuffering();\n }\n\n let sourceResult: SourceLoadResult;\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag,\n projectDir,\n forceRefresh,\n });\n } catch (error) {\n if (captureStartupMessages) {\n disableBuffering();\n }\n throw error;\n }\n\n let startupMessages: StartupMessage[] = [];\n if (captureStartupMessages) {\n startupMessages = drainBuffer();\n disableBuffering();\n }\n\n return { sourceResult, startupMessages };\n}\n","import { detectInstallation, type Installation } from \"../installation/index.js\";\nimport { loadProjectConfig } from \"../configuration/index.js\";\nimport type { ProjectConfig } from \"../../types/index.js\";\n\nexport type DetectedProject = {\n installation: Installation;\n config: ProjectConfig | null;\n configPath: string | null;\n};\n\n/**\n * Detects an existing CLI installation and loads its project config.\n *\n * Uses detectInstallation() which checks project-level first, then falls back\n * to global. Returns the installation metadata plus the loaded config.\n *\n * Does NOT throw. Returns null if no installation found.\n * Commands decide how to handle null (error out, warn, etc.).\n */\nexport async function detectProject(projectDir?: string): Promise<DetectedProject | null> {\n const resolvedDir = projectDir ?? process.cwd();\n const installation = await detectInstallation(resolvedDir);\n\n if (!installation) {\n return null;\n }\n\n const loaded = await loadProjectConfig(installation.projectDir);\n\n return {\n installation,\n config: loaded?.config ?? null,\n configPath: loaded?.configPath ?? null,\n };\n}\n","import { getAgentDefinitions } from \"../agents/index.js\";\nimport { loadAllAgents } from \"../loading/index.js\";\nimport { PROJECT_ROOT } from \"../../consts.js\";\nimport type { AgentDefinition, AgentName, AgentSourcePaths } from \"../../types/index.js\";\n\nexport type AgentDefs = {\n /** Merged agent definitions (CLI defaults + source overrides). Source takes precedence. */\n agents: Record<AgentName, AgentDefinition>;\n /** The sourcePath used to load agent partials (for compilation). */\n sourcePath: string;\n /** Full agent source paths (agentsDir, templatesDir, sourcePath). */\n agentSourcePaths: AgentSourcePaths;\n};\n\n/**\n * Loads agent definitions from the CLI and optionally from a remote source.\n *\n * Merges CLI built-in agents with source repository agents (source overrides CLI).\n * Returns the merged definitions plus the source path for compilation.\n */\nexport async function loadAgentDefs(\n agentSource?: string,\n options?: { projectDir?: string; forceRefresh?: boolean },\n): Promise<AgentDefs> {\n const agentSourcePaths = await getAgentDefinitions(agentSource, options);\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const sourceAgents = await loadAllAgents(agentSourcePaths.sourcePath);\n const agents: Record<AgentName, AgentDefinition> = { ...cliAgents, ...sourceAgents };\n\n return {\n agents,\n sourcePath: agentSourcePaths.sourcePath,\n agentSourcePaths,\n };\n}\n","import { resolveInstallPaths } from \"../installation/index.js\";\nimport { copySkillsToLocalFlattened, type CopiedSkill } from \"../skills/index.js\";\nimport { ensureDir } from \"../../utils/fs.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport type { SourceLoadResult } from \"../loading/source-loader.js\";\n\nexport type SkillCopyResult = {\n projectCopied: CopiedSkill[];\n globalCopied: CopiedSkill[];\n totalCopied: number;\n};\n\n/**\n * Copies local-source skills to their scope-appropriate directories.\n *\n * Splits skills by scope (project vs global), resolves install paths,\n * ensures directories exist, and copies from source.\n */\nexport async function copyLocalSkills(\n skills: SkillConfig[],\n projectDir: string,\n sourceResult: SourceLoadResult,\n): Promise<SkillCopyResult> {\n const projectLocalSkills = skills.filter((s) => s.scope !== \"global\");\n const globalLocalSkills = skills.filter((s) => s.scope === \"global\");\n\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n const globalPaths = resolveInstallPaths(projectDir, \"global\");\n\n let projectCopied: CopiedSkill[] = [];\n if (projectLocalSkills.length > 0) {\n await ensureDir(projectPaths.skillsDir);\n projectCopied = await copySkillsToLocalFlattened(\n projectLocalSkills.map((s) => s.id),\n projectPaths.skillsDir,\n sourceResult.matrix,\n sourceResult,\n );\n }\n\n let globalCopied: CopiedSkill[] = [];\n if (globalLocalSkills.length > 0) {\n await ensureDir(globalPaths.skillsDir);\n globalCopied = await copySkillsToLocalFlattened(\n globalLocalSkills.map((s) => s.id),\n globalPaths.skillsDir,\n sourceResult.matrix,\n sourceResult,\n );\n }\n\n return {\n projectCopied,\n globalCopied,\n totalCopied: projectCopied.length + globalCopied.length,\n };\n}\n","import { claudePluginInstall } from \"../../utils/exec.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport type { SkillId } from \"../../types/index.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\n\nexport type PluginInstallResult = {\n installed: Array<{ id: SkillId; ref: string }>;\n failed: Array<{ id: SkillId; error: string }>;\n};\n\n/**\n * Installs skill plugins via the Claude CLI, routing by scope.\n *\n * For each skill, constructs the plugin ref as `{skillId}@{marketplace}`\n * and invokes `claudePluginInstall` with the correct scope.\n */\nexport async function installPluginSkills(\n skills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginInstallResult> {\n const pluginSkills = skills.filter((s) => s.source !== \"local\");\n const installed: PluginInstallResult[\"installed\"] = [];\n const failed: PluginInstallResult[\"failed\"] = [];\n\n for (const skill of pluginSkills) {\n const pluginRef = `${skill.id}@${marketplace}`;\n const pluginScope = skill.scope === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginInstall(pluginRef, pluginScope, projectDir);\n installed.push({ id: skill.id, ref: pluginRef });\n } catch (error) {\n failed.push({ id: skill.id, error: getErrorMessage(error) });\n }\n }\n\n return { installed, failed };\n}\n","import { claudePluginUninstall } from \"../../utils/exec.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport type { SkillId } from \"../../types/index.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\n\nexport type PluginUninstallResult = {\n uninstalled: SkillId[];\n failed: Array<{ id: SkillId; error: string }>;\n};\n\n/**\n * Uninstalls skill plugins via the Claude CLI, using scope from old config.\n */\nexport async function uninstallPluginSkills(\n skillIds: SkillId[],\n oldSkills: SkillConfig[],\n projectDir: string,\n): Promise<PluginUninstallResult> {\n const uninstalled: SkillId[] = [];\n const failed: PluginUninstallResult[\"failed\"] = [];\n\n for (const skillId of skillIds) {\n const oldSkill = oldSkills.find((s) => s.id === skillId);\n const pluginScope = oldSkill?.scope === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginUninstall(skillId, pluginScope, projectDir);\n uninstalled.push(skillId);\n } catch (error) {\n failed.push({ id: skillId, error: getErrorMessage(error) });\n }\n }\n\n return { uninstalled, failed };\n}\n","import os from \"os\";\nimport path from \"path\";\nimport { fileExists, listDirectories } from \"../../utils/fs.js\";\nimport { LOCAL_SKILLS_PATH } from \"../../consts.js\";\n\nexport type ScopedSkillDir = {\n dirName: string;\n localSkillsPath: string;\n scope: \"project\" | \"global\";\n};\n\nexport type ScopedSkillDirsResult = {\n dirs: ScopedSkillDir[];\n hasProject: boolean;\n hasGlobal: boolean;\n projectLocalPath: string;\n globalLocalPath: string;\n};\n\n/**\n * Collects local skill directories from both project and global scopes.\n * Project-scoped dirs take precedence over global on name conflict.\n *\n * @returns directories with scope annotations, plus path/existence metadata\n */\nexport async function collectScopedSkillDirs(projectDir: string): Promise<ScopedSkillDirsResult> {\n const homeDir = os.homedir();\n const projectLocalPath = path.join(projectDir, LOCAL_SKILLS_PATH);\n const globalLocalPath = path.join(homeDir, LOCAL_SKILLS_PATH);\n const hasProject = await fileExists(projectLocalPath);\n const hasGlobal = projectDir !== homeDir && (await fileExists(globalLocalPath));\n\n const dirs: ScopedSkillDir[] = [];\n\n if (hasProject) {\n for (const dirName of await listDirectories(projectLocalPath)) {\n dirs.push({ dirName, localSkillsPath: projectLocalPath, scope: \"project\" });\n }\n }\n\n if (hasGlobal) {\n const projectDirNames = new Set(dirs.map((d) => d.dirName));\n for (const dirName of await listDirectories(globalLocalPath)) {\n if (!projectDirNames.has(dirName)) {\n dirs.push({ dirName, localSkillsPath: globalLocalPath, scope: \"global\" });\n }\n }\n }\n\n return { dirs, hasProject, hasGlobal, projectLocalPath, globalLocalPath };\n}\n","import os from \"os\";\nimport { compareLocalSkillsWithSource, type SkillComparisonResult } from \"../skills/index.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\nimport { collectScopedSkillDirs } from \"./collect-scoped-skill-dirs.js\";\nimport type { MergedSkillsMatrix } from \"../../types/index.js\";\n\nexport type SkillComparisonResults = {\n projectResults: SkillComparisonResult[];\n globalResults: SkillComparisonResult[];\n /** Merged results with project taking precedence over global. */\n merged: SkillComparisonResult[];\n};\n\n/**\n * Builds a map of source skill IDs to their paths, excluding local-only skills.\n * Used by both compareSkillsWithSource and diff command.\n */\nexport function buildSourceSkillsMap(matrix: MergedSkillsMatrix): Record<string, { path: string }> {\n const sourceSkills: Record<string, { path: string }> = {};\n for (const [skillId, skill] of typedEntries(matrix.skills)) {\n if (!skill) continue;\n if (!skill.local) {\n sourceSkills[skillId] = { path: skill.path };\n }\n }\n return sourceSkills;\n}\n\n/**\n * Compares local skills (project + global scope) against their source versions.\n *\n * Builds a source skills map from the matrix (excluding local-only skills),\n * runs compareLocalSkillsWithSource for both project and global scopes,\n * and merges results with project taking precedence.\n */\nexport async function compareSkillsWithSource(\n projectDir: string,\n sourcePath: string,\n matrix: MergedSkillsMatrix,\n): Promise<SkillComparisonResults> {\n const sourceSkills = buildSourceSkillsMap(matrix);\n\n const { hasProject, hasGlobal } = await collectScopedSkillDirs(projectDir);\n const homeDir = os.homedir();\n\n const projectResults = hasProject\n ? await compareLocalSkillsWithSource(projectDir, sourcePath, sourceSkills)\n : [];\n\n const globalResults = hasGlobal\n ? await compareLocalSkillsWithSource(homeDir, sourcePath, sourceSkills)\n : [];\n\n const seenIds = new Set(projectResults.map((r) => r.id));\n const merged = [...projectResults, ...globalResults.filter((r) => !seenIds.has(r.id))];\n\n return { projectResults, globalResults, merged };\n}\n","import {\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n claudePluginMarketplaceUpdate,\n} from \"../../utils/exec.js\";\nimport { fetchMarketplace } from \"../loading/index.js\";\nimport { warn } from \"../../utils/logger.js\";\nimport type { SourceLoadResult } from \"../loading/source-loader.js\";\n\nexport type MarketplaceResult = {\n /** The resolved marketplace name, or null if no marketplace is configured. */\n marketplace: string | null;\n /** Whether a new marketplace was registered (vs. updated or already existed). */\n registered: boolean;\n};\n\n/**\n * Ensures the marketplace is registered with the Claude CLI.\n *\n * If the marketplace does not exist, registers it. If it exists, updates it.\n * Handles lazy marketplace name resolution when sourceResult.marketplace is undefined.\n *\n * Operation is intentionally SILENT — commands decide what to log based on the\n * `registered` flag.\n */\nexport async function ensureMarketplace(\n sourceResult: SourceLoadResult,\n): Promise<MarketplaceResult> {\n if (!sourceResult.marketplace) {\n try {\n const marketplaceResult = await fetchMarketplace(sourceResult.sourceConfig.source, {});\n sourceResult.marketplace = marketplaceResult.marketplace.name;\n } catch {\n return { marketplace: null, registered: false };\n }\n }\n\n const marketplace = sourceResult.marketplace;\n const exists = await claudePluginMarketplaceExists(marketplace);\n\n if (!exists) {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n return { marketplace, registered: true };\n }\n\n try {\n await claudePluginMarketplaceUpdate(marketplace);\n } catch {\n warn(\"Could not update marketplace — continuing with cached version\");\n }\n\n return { marketplace, registered: false };\n}\n","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport {\n buildAndMergeConfig,\n writeScopedConfigs,\n resolveInstallPaths,\n} from \"../installation/index.js\";\nimport { loadAllAgents, type SourceLoadResult } from \"../loading/index.js\";\nimport { ensureBlankGlobalConfig } from \"../configuration/config-writer.js\";\nimport { ensureDir } from \"../../utils/fs.js\";\nimport { PROJECT_ROOT } from \"../../consts.js\";\nimport type { ProjectConfig, AgentDefinition, AgentName } from \"../../types/index.js\";\nimport type { WizardResultV2 } from \"../../components/wizard/wizard.js\";\n\nexport type ConfigWriteOptions = {\n wizardResult: WizardResultV2;\n sourceResult: SourceLoadResult;\n projectDir: string;\n sourceFlag?: string;\n /** Pre-loaded agent definitions. If omitted, loads from CLI + source. */\n agents?: Record<AgentName, AgentDefinition>;\n};\n\nexport type ConfigWriteResult = {\n config: ProjectConfig;\n configPath: string;\n globalConfigPath?: string;\n wasMerged: boolean;\n existingConfigPath?: string;\n filesWritten: number;\n};\n\n/**\n * Builds, merges, and writes project configuration files.\n *\n * Handles the full config pipeline:\n * 1. buildAndMergeConfig() — generates config from wizard result, merges with existing\n * 2. loadAllAgents() — loads agent definitions for config-types generation\n * 3. ensureBlankGlobalConfig() — ensures global config exists (when in project context)\n * 4. writeScopedConfigs() — writes config.ts and config-types.ts split by scope\n */\nexport async function writeProjectConfig(options: ConfigWriteOptions): Promise<ConfigWriteResult> {\n const { wizardResult, sourceResult, projectDir, sourceFlag } = options;\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n\n await ensureDir(path.dirname(projectPaths.configPath));\n\n let agents: Record<AgentName, AgentDefinition>;\n if (options.agents) {\n agents = options.agents;\n } else {\n const cliAgents = await loadAllAgents(PROJECT_ROOT);\n const sourceAgents = await loadAllAgents(sourceResult.sourcePath);\n agents = { ...cliAgents, ...sourceAgents };\n }\n\n const mergeResult = await buildAndMergeConfig(wizardResult, sourceResult, projectDir, sourceFlag);\n const finalConfig = mergeResult.config;\n\n const isProjectContext = fs.realpathSync(projectDir) !== fs.realpathSync(os.homedir());\n\n if (isProjectContext) {\n await ensureBlankGlobalConfig();\n }\n\n await writeScopedConfigs(\n finalConfig,\n sourceResult.matrix,\n agents,\n projectDir,\n projectPaths.configPath,\n isProjectContext,\n );\n\n return {\n config: finalConfig,\n configPath: projectPaths.configPath,\n wasMerged: mergeResult.merged,\n existingConfigPath: mergeResult.existingConfigPath,\n filesWritten: isProjectContext ? 4 : 2,\n };\n}\n","import { recompileAgents } from \"../agents/index.js\";\nimport { loadProjectConfigFromDir } from \"../configuration/index.js\";\nimport { buildAgentScopeMap } from \"../installation/index.js\";\nimport type { AgentName, SkillDefinitionMap } from \"../../types/index.js\";\nimport type { InstallMode } from \"../installation/index.js\";\n\nexport type CompileAgentsOptions = {\n projectDir: string;\n sourcePath: string;\n pluginDir?: string;\n skills?: SkillDefinitionMap;\n agentScopeMap?: Map<AgentName, \"project\" | \"global\">;\n agents?: AgentName[];\n /** When set, loads config and filters agents to only those matching this scope. */\n scopeFilter?: \"project\" | \"global\";\n outputDir?: string;\n installMode?: InstallMode;\n};\n\nexport type CompilationResult = {\n compiled: AgentName[];\n failed: AgentName[];\n warnings: string[];\n};\n\n/**\n * Compiles agent markdown files from templates + skill content.\n *\n * Thin wrapper around recompileAgents() that standardizes options.\n * The caller invokes this once (edit, update) or twice with scopeFilter (compile).\n */\nexport async function compileAgents(options: CompileAgentsOptions): Promise<CompilationResult> {\n let resolvedAgents = options.agents;\n let resolvedAgentScopeMap = options.agentScopeMap;\n\n if (options.scopeFilter) {\n const loadedConfig = await loadProjectConfigFromDir(options.projectDir);\n\n // Auto-build agentScopeMap from config if not provided\n if (!resolvedAgentScopeMap && loadedConfig?.config) {\n resolvedAgentScopeMap = buildAgentScopeMap(loadedConfig.config);\n }\n\n const filteredAgents = loadedConfig?.config?.agents\n ?.filter((a) => a.scope === options.scopeFilter)\n .map((a) => a.name);\n\n if (resolvedAgents && filteredAgents) {\n const filterSet = new Set(filteredAgents);\n resolvedAgents = resolvedAgents.filter((a) => filterSet.has(a));\n } else if (filteredAgents) {\n resolvedAgents = filteredAgents;\n }\n }\n\n const recompileResult = await recompileAgents({\n pluginDir: options.pluginDir ?? options.projectDir,\n sourcePath: options.sourcePath,\n agents: resolvedAgents,\n skills: options.skills,\n projectDir: options.projectDir,\n outputDir: options.outputDir,\n installMode: options.installMode,\n agentScopeMap: resolvedAgentScopeMap,\n });\n\n return {\n compiled: recompileResult.compiled,\n failed: recompileResult.failed,\n warnings: recompileResult.warnings,\n };\n}\n","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { discoverAllPluginSkills } from \"../plugins/index.js\";\nimport { directoryExists, glob, readFile, fileExists } from \"../../utils/fs.js\";\nimport { parseFrontmatter } from \"../loading/index.js\";\nimport { verbose, warn } from \"../../utils/logger.js\";\nimport { GLOBAL_INSTALL_ROOT, LOCAL_SKILLS_PATH, STANDARD_FILES } from \"../../consts.js\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object.js\";\nimport type { SkillDefinition, SkillDefinitionMap, SkillId } from \"../../types/index.js\";\n\nexport type DiscoveredSkills = {\n allSkills: SkillDefinitionMap;\n totalSkillCount: number;\n pluginSkillCount: number;\n localSkillCount: number;\n globalPluginSkillCount: number;\n globalLocalSkillCount: number;\n};\n\n/**\n * Loads SKILL.md files from a directory, parsing frontmatter for skill metadata.\n * Returns a map of skillId -> SkillDefinition.\n */\nexport async function loadSkillsFromDir(\n skillsDir: string,\n pathPrefix = \"\",\n): Promise<SkillDefinitionMap> {\n const skills: SkillDefinitionMap = {};\n\n if (!(await directoryExists(skillsDir))) {\n return skills;\n }\n\n const skillFiles = await glob(\"**/SKILL.md\", skillsDir);\n\n for (const skillFile of skillFiles) {\n const skillPath = path.join(skillsDir, skillFile);\n const skillDir = path.dirname(skillPath);\n const relativePath = path.relative(skillsDir, skillDir);\n const skillDirName = path.basename(skillDir);\n\n const metadataPath = path.join(skillDir, STANDARD_FILES.METADATA_YAML);\n if (!(await fileExists(metadataPath))) {\n const displayPath = pathPrefix ? `${pathPrefix}/${relativePath}/` : `${relativePath}/`;\n warn(\n `Skill '${skillDirName}' in '${displayPath}' is missing ${STANDARD_FILES.METADATA_YAML} — skipped. Add ${STANDARD_FILES.METADATA_YAML} to register it with the CLI.`,\n );\n continue;\n }\n\n try {\n const content = await readFile(skillPath);\n const frontmatter = parseFrontmatter(content, skillPath);\n\n if (!frontmatter?.name) {\n warn(`Skipping skill in '${skillDirName}': missing or invalid frontmatter name`);\n continue;\n }\n\n const canonicalId = frontmatter.name;\n\n const skill: SkillDefinition = {\n id: canonicalId,\n path: pathPrefix ? `${pathPrefix}/${relativePath}/` : `${relativePath}/`,\n description: frontmatter?.description || \"\",\n };\n\n skills[canonicalId] = skill;\n verbose(` Loaded skill: ${canonicalId}`);\n } catch (error) {\n verbose(` Failed to load skill: ${skillFile} - ${error}`);\n }\n }\n\n return skills;\n}\n\n/**\n * Discovers local project skills from the .claude/skills/ directory.\n */\nexport async function discoverLocalProjectSkills(projectDir: string): Promise<SkillDefinitionMap> {\n const localSkillsDir = path.join(projectDir, LOCAL_SKILLS_PATH);\n return loadSkillsFromDir(localSkillsDir, LOCAL_SKILLS_PATH);\n}\n\n/** Merges skill maps — later sources take precedence over earlier ones. */\nexport function mergeSkills(...skillSources: SkillDefinitionMap[]): SkillDefinitionMap {\n const merged: SkillDefinitionMap = {};\n\n for (const source of skillSources) {\n for (const [id, skill] of typedEntries<SkillId, SkillDefinition | undefined>(source)) {\n if (skill) {\n merged[id] = skill;\n }\n }\n }\n\n return merged;\n}\n\n/**\n * Discovers all installed skills for a project directory using 4-way merge:\n * 1. Global plugins (from ~/.claude/plugins/)\n * 2. Global local (from ~/.claude/skills/)\n * 3. Project plugins (from <projectDir>/.claude/plugins/)\n * 4. Project local (from <projectDir>/.claude/skills/)\n *\n * Pure function — no user-facing logging. Callers add their own log messages.\n * Uses verbose() for diagnostic output only.\n */\nexport async function discoverInstalledSkills(projectDir: string): Promise<DiscoveredSkills> {\n let isGlobalProject: boolean;\n try {\n isGlobalProject = fs.realpathSync(projectDir) === fs.realpathSync(os.homedir());\n } catch {\n isGlobalProject = projectDir === os.homedir();\n }\n\n // 1. Global plugins\n const globalPluginSkills = isGlobalProject ? {} : await discoverAllPluginSkills(os.homedir());\n const globalPluginSkillCount = typedKeys<SkillId>(globalPluginSkills).length;\n if (globalPluginSkillCount > 0) {\n verbose(` Found ${globalPluginSkillCount} skills from global plugins`);\n }\n\n // 2. Global local skills\n const globalLocalSkillsDir = path.join(GLOBAL_INSTALL_ROOT, LOCAL_SKILLS_PATH);\n const globalLocalSkills = isGlobalProject\n ? {}\n : await loadSkillsFromDir(globalLocalSkillsDir, LOCAL_SKILLS_PATH);\n const globalLocalSkillCount = typedKeys<SkillId>(globalLocalSkills).length;\n if (globalLocalSkillCount > 0) {\n verbose(` Found ${globalLocalSkillCount} global local skills from ~/.claude/skills/`);\n }\n\n // 3. Project plugins\n const pluginSkills = await discoverAllPluginSkills(projectDir);\n const pluginSkillCount = typedKeys<SkillId>(pluginSkills).length;\n verbose(` Found ${pluginSkillCount} skills from installed plugins`);\n\n // 4. Project local skills\n const localSkills = await discoverLocalProjectSkills(projectDir);\n const localSkillCount = typedKeys<SkillId>(localSkills).length;\n verbose(` Found ${localSkillCount} local skills from .claude/skills/`);\n\n // Merge: global first, project second — project wins on conflict\n const allSkills = mergeSkills(globalPluginSkills, globalLocalSkills, pluginSkills, localSkills);\n const totalSkillCount = typedKeys<SkillId>(allSkills).length;\n\n return {\n allSkills,\n totalSkillCount,\n pluginSkillCount: globalPluginSkillCount + pluginSkillCount,\n localSkillCount: globalLocalSkillCount + localSkillCount,\n globalPluginSkillCount,\n globalLocalSkillCount,\n };\n}\n","import type { SkillComparisonResult } from \"../skills/index.js\";\n\nexport type SkillMatchResult = {\n match: SkillComparisonResult | null;\n similar: string[];\n};\n\n/**\n * Finds a skill by exact ID, partial name, or directory name.\n * Falls back to fuzzy matching and returns similar suggestions.\n */\nexport function findSkillMatch(\n skillName: string,\n results: SkillComparisonResult[],\n): SkillMatchResult {\n // Exact match by ID\n const exact = results.find((r) => r.id === skillName);\n if (exact) return { match: exact, similar: [] };\n\n // Partial match (without author suffix)\n const partial = results.find((r) => {\n const nameWithoutAuthor = r.id.replace(/\\s*\\(@\\w+\\)$/, \"\").toLowerCase();\n return nameWithoutAuthor === skillName.toLowerCase();\n });\n if (partial) return { match: partial, similar: [] };\n\n // Match by directory name\n const byDir = results.find((r) => r.dirName.toLowerCase() === skillName.toLowerCase());\n if (byDir) return { match: byDir, similar: [] };\n\n // No match — find similar suggestions\n const lowered = skillName.toLowerCase();\n const similar = results\n .filter((r) => {\n const name = r.id.toLowerCase();\n const dir = r.dirName.toLowerCase();\n return (\n name.includes(lowered) || dir.includes(lowered) || lowered.includes(name.split(\" \")[0])\n );\n })\n .map((r) => r.id)\n .slice(0, 3);\n\n return { match: null, similar };\n}\n","import path from \"path\";\nimport { fileExists, readFile } from \"../../utils/fs.js\";\nimport { discoverLocalSkills } from \"../skills/index.js\";\nimport { STANDARD_FILES } from \"../../consts.js\";\nimport type { ResolvedSkill, SkillId, SkillSlug } from \"../../types/index.js\";\nimport { truncateText } from \"../../utils/string.js\";\n\nconst CONTENT_PREVIEW_LINES = 10;\nconst MAX_LINE_LENGTH = 80;\nconst MAX_SUGGESTIONS = 5;\n\nexport type ResolvedSkillInfo = {\n skill: ResolvedSkill;\n isInstalled: boolean;\n preview: string[];\n};\n\nexport type SkillInfoResult = {\n resolved: ResolvedSkillInfo | null;\n suggestions: string[];\n};\n\nexport type ResolveSkillInfoOptions = {\n /** The skill ID, slug, or search query from user input */\n query: string;\n /** Full skills map from the loaded matrix */\n skills: Partial<Record<SkillId, ResolvedSkill>>;\n /** Slug-to-ID lookup map from the loaded matrix */\n slugToId: Partial<Record<SkillSlug, SkillId>>;\n /** Project directory for local skill discovery */\n projectDir: string;\n /** Resolved source path from loadSource */\n sourcePath: string;\n /** Whether the source is local */\n isLocal: boolean;\n /** Whether to load the content preview */\n includePreview: boolean;\n};\n\n/**\n * Strips YAML frontmatter delimiters and content from markdown.\n */\nfunction stripFrontmatter(content: string): string {\n const lines = content.split(\"\\n\");\n let inFrontmatter = false;\n let frontmatterEndIndex = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === \"---\") {\n if (!inFrontmatter) {\n inFrontmatter = true;\n } else {\n frontmatterEndIndex = i + 1;\n break;\n }\n }\n }\n\n return lines.slice(frontmatterEndIndex).join(\"\\n\");\n}\n\n/**\n * Extracts the first N non-empty lines from markdown content (after frontmatter).\n */\nfunction getPreviewLines(content: string, maxLines: number): string[] {\n const body = stripFrontmatter(content);\n const lines = body.split(\"\\n\");\n const result: string[] = [];\n\n for (const line of lines) {\n if (result.length >= maxLines) break;\n if (line.trim() || result.length > 0) {\n result.push(truncateText(line, MAX_LINE_LENGTH));\n }\n }\n\n return result;\n}\n\n/**\n * Finds similar skill names for \"did you mean\" suggestions.\n */\nfunction findSuggestions(\n skills: Partial<Record<SkillId, ResolvedSkill>>,\n query: string,\n maxSuggestions: number,\n): string[] {\n const lowerQuery = query.toLowerCase();\n const matches: string[] = [];\n\n for (const skill of Object.values(skills)) {\n if (!skill) continue;\n if (matches.length >= maxSuggestions) break;\n if (\n skill.id.toLowerCase().includes(lowerQuery) ||\n skill.displayName.toLowerCase().includes(lowerQuery) ||\n skill.slug.toLowerCase().includes(lowerQuery)\n ) {\n matches.push(skill.id);\n }\n }\n\n return matches;\n}\n\n/**\n * Resolves complete skill information for display.\n *\n * Looks up the skill by ID or slug, discovers local installation status,\n * and optionally loads a content preview from SKILL.md.\n */\nexport async function resolveSkillInfo(options: ResolveSkillInfoOptions): Promise<SkillInfoResult> {\n const { query, skills, slugToId, projectDir, sourcePath, isLocal, includePreview } = options;\n\n // CLI arg is an untyped string — try as skill ID first, then as slug\n const slugResolvedId = slugToId[query as SkillSlug];\n const skill = skills[query as SkillId] ?? (slugResolvedId ? skills[slugResolvedId] : undefined);\n\n if (!skill) {\n const suggestions = findSuggestions(skills, query, MAX_SUGGESTIONS);\n return { resolved: null, suggestions };\n }\n\n const localSkillsResult = await discoverLocalSkills(projectDir);\n const localSkillIds = localSkillsResult?.skills.map((s) => s.id) || [];\n const isInstalled = localSkillIds.includes(skill.id);\n\n let preview: string[] = [];\n if (includePreview) {\n let skillMdPath: string;\n\n if (skill.local && skill.localPath) {\n skillMdPath = path.join(projectDir, skill.localPath, STANDARD_FILES.SKILL_MD);\n } else {\n const sourceDir = isLocal ? sourcePath : path.dirname(sourcePath);\n skillMdPath = path.join(sourceDir, skill.path, STANDARD_FILES.SKILL_MD);\n }\n\n if (await fileExists(skillMdPath)) {\n const content = await readFile(skillMdPath);\n preview = getPreviewLines(content, CONTENT_PREVIEW_LINES);\n }\n }\n\n return {\n resolved: { skill, isInstalled, preview },\n suggestions: [],\n };\n}\n","// Operations — composable building blocks for CLI commands.\n// Each operation wraps lower-level lib functions into a single typed call.\n\nexport { detectBothInstallations, type BothInstallations } from \"./detect-both-installations.js\";\nexport { loadSource, type LoadSourceOptions, type LoadedSource } from \"./load-source.js\";\nexport { detectProject, type DetectedProject } from \"./detect-project.js\";\nexport { loadAgentDefs, type AgentDefs } from \"./load-agent-defs.js\";\nexport { copyLocalSkills, type SkillCopyResult } from \"./copy-local-skills.js\";\nexport { installPluginSkills, type PluginInstallResult } from \"./install-plugin-skills.js\";\nexport { uninstallPluginSkills, type PluginUninstallResult } from \"./uninstall-plugin-skills.js\";\nexport {\n compareSkillsWithSource,\n buildSourceSkillsMap,\n type SkillComparisonResults,\n} from \"./compare-skills.js\";\nexport { ensureMarketplace, type MarketplaceResult } from \"./ensure-marketplace.js\";\nexport {\n writeProjectConfig,\n type ConfigWriteOptions,\n type ConfigWriteResult,\n} from \"./write-project-config.js\";\nexport {\n compileAgents,\n type CompileAgentsOptions,\n type CompilationResult,\n} from \"./compile-agents.js\";\nexport {\n executeInstallation,\n type ExecuteInstallationOptions,\n type ExecuteInstallationResult,\n} from \"./execute-installation.js\";\nexport {\n recompileProject,\n type RecompileProjectOptions,\n type RecompileProjectResult,\n} from \"./recompile-project.js\";\nexport {\n discoverInstalledSkills,\n loadSkillsFromDir,\n discoverLocalProjectSkills,\n mergeSkills,\n type DiscoveredSkills,\n} from \"./discover-skills.js\";\nexport {\n collectScopedSkillDirs,\n type ScopedSkillDir,\n type ScopedSkillDirsResult,\n} from \"./collect-scoped-skill-dirs.js\";\nexport { findSkillMatch, type SkillMatchResult } from \"./find-skill-match.js\";\nexport {\n resolveSkillInfo,\n type ResolveSkillInfoOptions,\n type ResolvedSkillInfo,\n type SkillInfoResult,\n} from \"./resolve-skill-info.js\";\n"],"mappings":"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","names":["os","os","os","os","fs","os","path","path","fs","os","fs","os","path","path","fs","os","path","path"]}
|
|
@@ -1,52 +1,58 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
WizardLayout
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-AWB6DO24.js";
|
|
5
|
+
import {
|
|
6
|
+
WIZARD_STEPS
|
|
7
|
+
} from "./chunk-YVFGISUO.js";
|
|
5
8
|
import {
|
|
6
9
|
StepSettings
|
|
7
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3STOCHK4.js";
|
|
8
11
|
import {
|
|
9
12
|
StepSources
|
|
10
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-RDQBXB3Y.js";
|
|
14
|
+
import {
|
|
15
|
+
FEATURE_FLAGS
|
|
16
|
+
} from "./chunk-ORTNQZLF.js";
|
|
11
17
|
import {
|
|
12
18
|
StepStack
|
|
13
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-G3VPBEBC.js";
|
|
14
20
|
import {
|
|
15
21
|
StepAgents
|
|
16
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-TJHCK4OS.js";
|
|
17
23
|
import {
|
|
18
24
|
StepBuild
|
|
19
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-M6J5YQ3P.js";
|
|
20
26
|
import {
|
|
21
27
|
StepConfirm
|
|
22
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-OVY7IV3C.js";
|
|
23
29
|
import {
|
|
24
30
|
DomainSelection
|
|
25
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-2RXDM5HN.js";
|
|
26
32
|
import {
|
|
27
33
|
getStackName
|
|
28
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-UHARXISZ.js";
|
|
29
35
|
import {
|
|
30
36
|
useWizardStore
|
|
31
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-V75HVZTB.js";
|
|
32
38
|
import {
|
|
33
39
|
cliTheme
|
|
34
40
|
} from "./chunk-HEQVUIHQ.js";
|
|
35
41
|
import {
|
|
36
42
|
HOTKEY_ACCEPT_DEFAULTS,
|
|
37
|
-
|
|
43
|
+
HOTKEY_INFO,
|
|
38
44
|
HOTKEY_SCOPE,
|
|
39
45
|
HOTKEY_SETTINGS,
|
|
40
46
|
isHotkey
|
|
41
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-DVBA6PGR.js";
|
|
42
48
|
import {
|
|
43
49
|
resolveAlias,
|
|
44
50
|
validateSelection
|
|
45
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-FVBSRBU3.js";
|
|
46
52
|
import {
|
|
47
53
|
findStack,
|
|
48
54
|
matrix
|
|
49
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-47HMJ4BY.js";
|
|
50
56
|
import {
|
|
51
57
|
CLI_COLORS
|
|
52
58
|
} from "./chunk-6PGL2XMY.js";
|
|
@@ -81,7 +87,12 @@ function useWizardInitialization({
|
|
|
81
87
|
if (installedSkillIds?.length) {
|
|
82
88
|
useWizardStore.getState().populateFromSkillIds(installedSkillIds, installedSkillConfigs);
|
|
83
89
|
}
|
|
84
|
-
useWizardStore.setState({
|
|
90
|
+
useWizardStore.setState({ approach: "scratch" });
|
|
91
|
+
const stepIds = WIZARD_STEPS.map((s) => s.id);
|
|
92
|
+
const targetIndex = stepIds.indexOf(initialStep);
|
|
93
|
+
for (let i = 1; i <= targetIndex; i++) {
|
|
94
|
+
useWizardStore.getState().setStep(stepIds[i]);
|
|
95
|
+
}
|
|
85
96
|
}
|
|
86
97
|
if (initialDomains?.length) {
|
|
87
98
|
useWizardStore.setState({ selectedDomains: initialDomains, currentDomainIndex: 0 });
|
|
@@ -198,15 +209,17 @@ var Wizard = ({
|
|
|
198
209
|
}
|
|
199
210
|
return;
|
|
200
211
|
}
|
|
201
|
-
if (
|
|
202
|
-
if (
|
|
203
|
-
|
|
212
|
+
if (FEATURE_FLAGS.INFO_PANEL) {
|
|
213
|
+
if (store.showInfo) {
|
|
214
|
+
if (key.escape || isHotkey(input, HOTKEY_INFO)) {
|
|
215
|
+
store.toggleInfo();
|
|
216
|
+
}
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (isHotkey(input, HOTKEY_INFO)) {
|
|
220
|
+
store.toggleInfo();
|
|
221
|
+
return;
|
|
204
222
|
}
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
if (isHotkey(input, HOTKEY_HELP)) {
|
|
208
|
-
store.toggleHelp();
|
|
209
|
-
return;
|
|
210
223
|
}
|
|
211
224
|
if (key.escape) {
|
|
212
225
|
return;
|
|
@@ -342,4 +355,4 @@ var Wizard = ({
|
|
|
342
355
|
export {
|
|
343
356
|
Wizard
|
|
344
357
|
};
|
|
345
|
-
//# sourceMappingURL=chunk-
|
|
358
|
+
//# sourceMappingURL=chunk-5IR4QU7G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/wizard.tsx","../src/cli/components/hooks/use-wizard-initialization.ts","../src/cli/components/hooks/use-build-step-props.ts"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Box, Text, useApp, useInput, useStdout } from \"ink\";\nimport { ThemeProvider } from \"@inkjs/ui\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { cliTheme } from \"../themes/default.js\";\nimport { WizardLayout } from \"./wizard-layout.js\";\nimport { StepStack } from \"./step-stack.js\";\nimport { StepBuild } from \"./step-build.js\";\nimport { StepConfirm } from \"./step-confirm.js\";\nimport { StepSources } from \"./step-sources.js\";\nimport { StepSettings } from \"./step-settings.js\";\nimport { StepAgents } from \"./step-agents.js\";\nimport { DomainSelection } from \"./domain-selection.js\";\nimport { resolveAlias, validateSelection } from \"../../lib/matrix/index.js\";\nimport { matrix, findStack } from \"../../lib/matrix/matrix-provider.js\";\nimport {\n HOTKEY_ACCEPT_DEFAULTS,\n HOTKEY_INFO,\n HOTKEY_SCOPE,\n HOTKEY_SETTINGS,\n isHotkey,\n} from \"./hotkeys.js\";\nimport type { AgentName, Domain, DomainSelections, SkillId } from \"../../types/index.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport { getStackName } from \"./utils.js\";\nimport type { StartupMessage } from \"../../utils/logger.js\";\nimport { useWizardInitialization } from \"../hooks/use-wizard-initialization.js\";\nimport { useBuildStepProps } from \"../hooks/use-build-step-props.js\";\nimport { FEATURE_FLAGS } from \"../../lib/feature-flags.js\";\n\nexport type WizardResultV2 = {\n skills: SkillConfig[];\n selectedAgents: AgentName[];\n agentConfigs: AgentScopeConfig[];\n selectedStackId: string | null;\n domainSelections: DomainSelections;\n selectedDomains: Domain[];\n cancelled: boolean;\n validation: {\n valid: boolean;\n errors: Array<{ message: string }>;\n warnings: Array<{ message: string }>;\n };\n};\n\ntype WizardProps = {\n onComplete: (result: WizardResultV2) => void;\n onCancel: () => void;\n version?: string;\n logo?: string;\n initialStep?: WizardStep;\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n installedSkillConfigs?: SkillConfig[];\n installedAgentConfigs?: AgentScopeConfig[];\n lockedSkillIds?: SkillId[];\n lockedAgentNames?: AgentName[];\n isEditingFromGlobalScope?: boolean;\n projectDir?: string;\n startupMessages?: StartupMessage[];\n};\n\nconst MIN_TERMINAL_WIDTH = 80;\nconst MIN_TERMINAL_HEIGHT = 15;\n\nexport const Wizard: React.FC<WizardProps> = ({\n onComplete,\n onCancel,\n version,\n logo,\n initialStep,\n initialDomains,\n initialAgents,\n installedSkillIds,\n installedSkillConfigs,\n installedAgentConfigs,\n lockedSkillIds,\n lockedAgentNames,\n isEditingFromGlobalScope,\n projectDir,\n startupMessages,\n}) => {\n const store = useWizardStore();\n const { exit } = useApp();\n const { stdout } = useStdout();\n\n const terminalWidth = stdout.columns || MIN_TERMINAL_WIDTH;\n const terminalHeight = stdout.rows || MIN_TERMINAL_HEIGHT;\n const isNarrowTerminal = terminalWidth < MIN_TERMINAL_WIDTH;\n const isShortTerminal = terminalHeight < MIN_TERMINAL_HEIGHT;\n\n useWizardInitialization({\n initialStep,\n initialDomains,\n initialAgents,\n installedSkillIds,\n installedSkillConfigs,\n installedAgentConfigs,\n lockedSkillIds,\n lockedAgentNames,\n isEditingFromGlobalScope,\n });\n\n const buildStepProps = useBuildStepProps({ store, installedSkillIds });\n\n useInput((input, key) => {\n // ESC is handled by step-settings.tsx's own useKeyboardNavigation hook\n if (store.showSettings) {\n if (isHotkey(input, HOTKEY_SETTINGS)) {\n store.toggleSettings();\n }\n return;\n }\n\n if (FEATURE_FLAGS.INFO_PANEL) {\n if (store.showInfo) {\n if (key.escape || isHotkey(input, HOTKEY_INFO)) {\n store.toggleInfo();\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_INFO)) {\n store.toggleInfo();\n return;\n }\n }\n\n if (key.escape) {\n // Steps with their own ESC handling (via useInput in child components):\n // - \"stack\": StackSelection handles ESC via onCancel prop\n // - \"domains\": DomainSelection handles ESC via CheckboxGrid onBack\n // - \"build\": StepBuild handles ESC via its own useInput\n // - \"sources\": StepSources handles ESC via onBack prop\n // - \"confirm\": StepConfirm handles ESC via onBack prop\n // - \"agents\": StepAgents handles ESC via its own useInput\n // All steps handle their own ESC, so this is a no-op.\n return;\n }\n\n if (\n isHotkey(input, HOTKEY_ACCEPT_DEFAULTS) &&\n store.step === \"build\" &&\n store.selectedStackId\n ) {\n store.setStackAction(\"defaults\");\n store.setStep(\"confirm\");\n return;\n }\n\n if (isHotkey(input, HOTKEY_SCOPE) && store.step === \"build\") {\n if (store.isEditingFromGlobalScope) return;\n const focused = store.focusedSkillId;\n if (focused) {\n store.toggleSkillScope(focused);\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_SCOPE) && store.step === \"agents\") {\n if (store.isEditingFromGlobalScope) return;\n const focused = store.focusedAgentId;\n if (focused) {\n store.toggleAgentScope(focused);\n }\n return;\n }\n\n if (isHotkey(input, HOTKEY_SETTINGS) && store.step === \"sources\") {\n store.toggleSettings();\n return;\n }\n });\n\n const handleComplete = useCallback(() => {\n let allSkills: SkillId[];\n\n if (store.selectedStackId && store.stackAction === \"defaults\") {\n const stack = findStack(store.selectedStackId);\n if (!stack) {\n throw new Error(`Stack not found: ${store.selectedStackId}`);\n }\n allSkills = [...stack.allSkillIds];\n } else {\n const techNames = store.getAllSelectedTechnologies();\n allSkills = techNames.map((tech) => resolveAlias(tech));\n }\n\n const skillConfigs: SkillConfig[] = allSkills.map((id) => {\n const existing = store.skillConfigs.find((sc) => sc.id === id);\n return existing ?? { id, scope: \"global\" as const, source: \"local\" };\n });\n\n const validation = validateSelection(allSkills);\n\n const result: WizardResultV2 = {\n skills: skillConfigs,\n selectedAgents: store.selectedAgents,\n agentConfigs: store.agentConfigs,\n selectedStackId: store.selectedStackId,\n domainSelections: store.domainSelections,\n selectedDomains: store.selectedDomains,\n cancelled: false,\n validation,\n };\n\n onComplete(result);\n exit();\n }, [store, onComplete, exit]);\n\n const handleCancel = useCallback(() => {\n onCancel();\n exit();\n }, [onCancel, exit]);\n\n const renderStep = () => {\n switch (store.step) {\n case \"stack\":\n return <StepStack onCancel={handleCancel} />;\n\n case \"domains\":\n return <DomainSelection />;\n\n case \"build\":\n return <StepBuild {...buildStepProps} />;\n\n case \"sources\": {\n if (store.showSettings) {\n return (\n <StepSettings\n projectDir={projectDir || process.cwd()}\n onClose={() => store.toggleSettings()}\n />\n );\n }\n return (\n <StepSources\n projectDir={projectDir}\n onContinue={() => {\n if (!initialAgents?.length) {\n store.preselectAgentsFromDomains();\n }\n store.setStep(\"agents\");\n }}\n onBack={store.goBack}\n />\n );\n }\n\n case \"agents\":\n return <StepAgents />;\n\n case \"confirm\": {\n const stackName = getStackName(store.selectedStackId);\n const selectedSkills = store.getAllSelectedTechnologies();\n return (\n <StepConfirm\n onComplete={handleComplete}\n stackName={stackName}\n selectedDomains={store.selectedDomains}\n domainSelections={store.domainSelections}\n technologyCount={selectedSkills.length}\n skillCount={selectedSkills.length}\n agentCount={store.selectedAgents.length}\n skillConfigs={store.skillConfigs}\n agentConfigs={store.agentConfigs}\n onBack={store.goBack}\n />\n );\n }\n\n default:\n return null;\n }\n };\n\n if (isNarrowTerminal || isShortTerminal) {\n const issue = isNarrowTerminal\n ? `too narrow (${terminalWidth} columns, need ${MIN_TERMINAL_WIDTH})`\n : `too short (${terminalHeight} rows, need ${MIN_TERMINAL_HEIGHT})`;\n\n return (\n <ThemeProvider theme={cliTheme}>\n <Box flexDirection=\"column\" padding={1}>\n <Text color={CLI_COLORS.WARNING}>Terminal {issue}. Please resize your terminal.</Text>\n </Box>\n </ThemeProvider>\n );\n }\n\n return (\n <ThemeProvider theme={cliTheme}>\n <WizardLayout version={version} logo={logo} startupMessages={startupMessages}>\n {renderStep()}\n </WizardLayout>\n </ThemeProvider>\n );\n};\n","import { useRef } from \"react\";\nimport { useWizardStore, type WizardStep } from \"../../stores/wizard-store.js\";\nimport { WIZARD_STEPS } from \"../wizard/wizard-tabs.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport type { AgentName, Domain, SkillId } from \"../../types/index.js\";\n\ntype UseWizardInitializationOptions = {\n initialStep?: WizardStep;\n initialDomains?: Domain[];\n initialAgents?: AgentName[];\n installedSkillIds?: SkillId[];\n installedSkillConfigs?: SkillConfig[];\n installedAgentConfigs?: AgentScopeConfig[];\n lockedSkillIds?: SkillId[];\n lockedAgentNames?: AgentName[];\n isEditingFromGlobalScope?: boolean;\n};\n\n/**\n * Runs one-time wizard store initialization before the first render.\n * Populates step, approach, and skill selections from props.\n */\nexport function useWizardInitialization({\n initialStep,\n initialDomains,\n initialAgents,\n installedSkillIds,\n installedSkillConfigs,\n installedAgentConfigs,\n lockedSkillIds,\n lockedAgentNames,\n isEditingFromGlobalScope,\n}: UseWizardInitializationOptions): void {\n const initialized = useRef(false);\n\n if (!initialized.current) {\n initialized.current = true;\n\n if (initialStep) {\n if (installedSkillIds?.length) {\n useWizardStore.getState().populateFromSkillIds(installedSkillIds, installedSkillConfigs);\n }\n // Walk through steps via setStep() so history builds naturally.\n // E.g. initialStep=\"build\" → setStep(\"domains\") then setStep(\"build\")\n // → history=[\"stack\", \"domains\"], step=\"build\".\n useWizardStore.setState({ approach: \"scratch\" });\n const stepIds = WIZARD_STEPS.map((s) => s.id);\n const targetIndex = stepIds.indexOf(initialStep);\n for (let i = 1; i <= targetIndex; i++) {\n useWizardStore.getState().setStep(stepIds[i]!);\n }\n }\n // Restore saved domains from config, overriding the domains\n // derived by populateFromSkillIds\n if (initialDomains?.length) {\n useWizardStore.setState({ selectedDomains: initialDomains, currentDomainIndex: 0 });\n }\n // Restore saved agents from config, overriding the default empty array\n if (initialAgents?.length) {\n useWizardStore.setState({ selectedAgents: initialAgents });\n }\n // Restore saved agent scope configs (project vs global)\n if (initialAgents?.length && installedAgentConfigs?.length) {\n useWizardStore.setState({ agentConfigs: installedAgentConfigs });\n }\n // Set locked IDs (D9: global items read-only in project context)\n if (lockedSkillIds?.length || lockedAgentNames?.length) {\n useWizardStore.setState({\n ...(lockedSkillIds?.length && { lockedSkillIds }),\n ...(lockedAgentNames?.length && { lockedAgentNames }),\n });\n }\n if (isEditingFromGlobalScope) {\n useWizardStore.setState({ isEditingFromGlobalScope });\n }\n }\n}\n","import { useCallback } from \"react\";\nimport type { Domain, SkillId } from \"../../types/index.js\";\nimport type { WizardState } from \"../../stores/wizard-store.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport type { StepBuildProps } from \"../wizard/step-build.js\";\n\ntype UseBuildStepPropsOptions = {\n store: WizardState;\n installedSkillIds?: SkillId[];\n};\n\nexport function useBuildStepProps({\n store,\n installedSkillIds,\n}: UseBuildStepPropsOptions): StepBuildProps {\n const currentDomain = store.getCurrentDomain();\n const defaultDomains: Domain[] = [\"web\"];\n const effectiveDomains =\n store.selectedDomains.length > 0 ? store.selectedDomains : defaultDomains;\n\n const allSelections = store.getAllSelectedTechnologies();\n\n const activeDomain: Domain = currentDomain || effectiveDomains[0] || \"web\";\n\n const onToggle = useCallback(\n (categoryId: Parameters<StepBuildProps[\"onToggle\"]>[0], techId: SkillId) => {\n const domain: Domain = store.getCurrentDomain() || \"web\";\n const cat = matrix.categories[categoryId];\n const exclusive = cat?.exclusive ?? true;\n store.toggleTechnology(domain, categoryId, techId, exclusive);\n },\n [store],\n );\n\n const onContinue = useCallback(() => {\n if (!store.nextDomain()) {\n store.setStep(\"sources\");\n }\n }, [store]);\n\n const onBack = useCallback(() => {\n if (!store.prevDomain()) {\n store.goBack();\n }\n }, [store]);\n\n return {\n domain: activeDomain,\n selectedDomains: effectiveDomains,\n selections: store.domainSelections[activeDomain] || {},\n allSelections,\n showLabels: store.showLabels,\n filterIncompatible: store.filterIncompatible,\n installedSkillIds,\n onToggle,\n onToggleLabels: store.toggleShowLabels,\n onToggleFilterIncompatible: store.toggleFilterIncompatible,\n onContinue,\n onBack,\n };\n}\n"],"mappings":"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","names":["useCallback","useCallback"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getErrorMessage
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-OOHPUT5M.js";
|
|
5
5
|
import {
|
|
6
6
|
init_esm_shims
|
|
7
7
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -49,4 +49,4 @@ export {
|
|
|
49
49
|
EXIT_CODES,
|
|
50
50
|
BaseCommand
|
|
51
51
|
};
|
|
52
|
-
//# sourceMappingURL=chunk-
|
|
52
|
+
//# sourceMappingURL=chunk-7K7SA4TZ.js.map
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
useWizardStore
|
|
4
|
+
} from "./chunk-V75HVZTB.js";
|
|
5
|
+
import {
|
|
6
|
+
HOTKEY_INFO
|
|
7
|
+
} from "./chunk-DVBA6PGR.js";
|
|
8
|
+
import {
|
|
9
|
+
matrix
|
|
10
|
+
} from "./chunk-47HMJ4BY.js";
|
|
11
|
+
import {
|
|
12
|
+
CLI_COLORS
|
|
13
|
+
} from "./chunk-6PGL2XMY.js";
|
|
14
|
+
import {
|
|
15
|
+
init_esm_shims
|
|
16
|
+
} from "./chunk-DHET7RCE.js";
|
|
17
|
+
|
|
18
|
+
// src/cli/components/wizard/info-panel.tsx
|
|
19
|
+
init_esm_shims();
|
|
20
|
+
import { Box, Text } from "ink";
|
|
21
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
22
|
+
var SCOPE_COLOR_PROJECT = "#eee";
|
|
23
|
+
var LABEL_WIDTH = 10;
|
|
24
|
+
var ITEM_WIDTH = 20;
|
|
25
|
+
function getSkillDisplayName(config) {
|
|
26
|
+
return matrix.skills[config.id]?.slug ?? config.id;
|
|
27
|
+
}
|
|
28
|
+
function isLocalSource(config) {
|
|
29
|
+
return config.source === "local";
|
|
30
|
+
}
|
|
31
|
+
function groupSkillsByBucket(configs) {
|
|
32
|
+
const buckets = {
|
|
33
|
+
globalPlugin: [],
|
|
34
|
+
globalLocal: [],
|
|
35
|
+
projectPlugin: [],
|
|
36
|
+
projectLocal: []
|
|
37
|
+
};
|
|
38
|
+
for (const config of configs) {
|
|
39
|
+
const name = getSkillDisplayName(config);
|
|
40
|
+
if (config.scope === "global") {
|
|
41
|
+
if (isLocalSource(config)) buckets.globalLocal.push(name);
|
|
42
|
+
else buckets.globalPlugin.push(name);
|
|
43
|
+
} else {
|
|
44
|
+
if (isLocalSource(config)) buckets.projectLocal.push(name);
|
|
45
|
+
else buckets.projectPlugin.push(name);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return buckets;
|
|
49
|
+
}
|
|
50
|
+
function groupAgentsByScope(configs) {
|
|
51
|
+
const buckets = { global: [], project: [] };
|
|
52
|
+
for (const config of configs) {
|
|
53
|
+
if (config.scope === "global") buckets.global.push(config.name);
|
|
54
|
+
else buckets.project.push(config.name);
|
|
55
|
+
}
|
|
56
|
+
return buckets;
|
|
57
|
+
}
|
|
58
|
+
var ItemPairs = ({ items }) => {
|
|
59
|
+
const rows = [];
|
|
60
|
+
for (let i = 0; i < items.length; i += 2) {
|
|
61
|
+
rows.push(
|
|
62
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
63
|
+
/* @__PURE__ */ jsx(Box, { width: ITEM_WIDTH, children: /* @__PURE__ */ jsx(Text, { children: items[i] }) }),
|
|
64
|
+
items[i + 1] && /* @__PURE__ */ jsx(Box, { width: ITEM_WIDTH, children: /* @__PURE__ */ jsx(Text, { children: items[i + 1] }) })
|
|
65
|
+
] }, i)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return /* @__PURE__ */ jsx(Fragment, { children: rows });
|
|
69
|
+
};
|
|
70
|
+
var ScopeColumns = ({ globalItems, projectItems }) => /* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
|
|
71
|
+
/* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx(ItemPairs, { items: globalItems }) }),
|
|
72
|
+
/* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx(ItemPairs, { items: projectItems }) })
|
|
73
|
+
] });
|
|
74
|
+
var InfoPanel = () => {
|
|
75
|
+
const skillConfigs = useWizardStore((s) => s.skillConfigs);
|
|
76
|
+
const agentConfigs = useWizardStore((s) => s.agentConfigs);
|
|
77
|
+
const skills = groupSkillsByBucket(skillConfigs);
|
|
78
|
+
const agents = groupAgentsByScope(agentConfigs);
|
|
79
|
+
const hasLocalSkills = skills.globalLocal.length > 0 || skills.projectLocal.length > 0;
|
|
80
|
+
return /* @__PURE__ */ jsxs(
|
|
81
|
+
Box,
|
|
82
|
+
{
|
|
83
|
+
flexDirection: "column",
|
|
84
|
+
borderStyle: "single",
|
|
85
|
+
borderColor: CLI_COLORS.PRIMARY,
|
|
86
|
+
paddingX: 2,
|
|
87
|
+
paddingY: 1,
|
|
88
|
+
marginTop: 1,
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Text, { bold: true, color: CLI_COLORS.PRIMARY, children: "Info" }),
|
|
91
|
+
/* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
92
|
+
"SKILLS (",
|
|
93
|
+
skillConfigs.length,
|
|
94
|
+
")"
|
|
95
|
+
] }) }),
|
|
96
|
+
/* @__PURE__ */ jsxs(Box, { flexDirection: "row", marginTop: 0, children: [
|
|
97
|
+
/* @__PURE__ */ jsx(Box, { width: LABEL_WIDTH }),
|
|
98
|
+
/* @__PURE__ */ jsx(Box, { flexGrow: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, color: CLI_COLORS.WARNING, children: "Global" }) }),
|
|
99
|
+
/* @__PURE__ */ jsx(Box, { flexGrow: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, color: SCOPE_COLOR_PROJECT, children: "Project" }) })
|
|
100
|
+
] }),
|
|
101
|
+
/* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
|
|
102
|
+
/* @__PURE__ */ jsx(Box, { width: LABEL_WIDTH, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Plugin" }) }),
|
|
103
|
+
/* @__PURE__ */ jsx(ScopeColumns, { globalItems: skills.globalPlugin, projectItems: skills.projectPlugin })
|
|
104
|
+
] }),
|
|
105
|
+
hasLocalSkills && /* @__PURE__ */ jsxs(Box, { flexDirection: "row", marginTop: 1, children: [
|
|
106
|
+
/* @__PURE__ */ jsx(Box, { width: LABEL_WIDTH, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "Local" }) }),
|
|
107
|
+
/* @__PURE__ */ jsx(ScopeColumns, { globalItems: skills.globalLocal, projectItems: skills.projectLocal })
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsxs(Text, { bold: true, children: [
|
|
110
|
+
"AGENTS (",
|
|
111
|
+
agentConfigs.length,
|
|
112
|
+
")"
|
|
113
|
+
] }) }),
|
|
114
|
+
/* @__PURE__ */ jsxs(Box, { flexDirection: "row", marginTop: 0, children: [
|
|
115
|
+
/* @__PURE__ */ jsx(Box, { width: LABEL_WIDTH }),
|
|
116
|
+
/* @__PURE__ */ jsx(Box, { flexGrow: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, color: CLI_COLORS.WARNING, children: "Global" }) }),
|
|
117
|
+
/* @__PURE__ */ jsx(Box, { flexGrow: 1, children: /* @__PURE__ */ jsx(Text, { dimColor: true, color: SCOPE_COLOR_PROJECT, children: "Project" }) })
|
|
118
|
+
] }),
|
|
119
|
+
/* @__PURE__ */ jsxs(Box, { flexDirection: "row", children: [
|
|
120
|
+
/* @__PURE__ */ jsx(Box, { width: LABEL_WIDTH }),
|
|
121
|
+
/* @__PURE__ */ jsx(ScopeColumns, { globalItems: agents.global, projectItems: agents.project })
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsx(Box, { paddingY: 1, children: /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
|
|
124
|
+
HOTKEY_INFO.label,
|
|
125
|
+
" close"
|
|
126
|
+
] }) })
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export {
|
|
133
|
+
InfoPanel
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=chunk-7QWCPF6F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/wizard/info-panel.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS } from \"../../consts.js\";\nimport { matrix } from \"../../lib/matrix/matrix-provider.js\";\nimport { useWizardStore } from \"../../stores/wizard-store.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\nimport { HOTKEY_INFO } from \"./hotkeys.js\";\n\nconst SCOPE_COLOR_PROJECT = \"#eee\";\nconst LABEL_WIDTH = 10;\nconst ITEM_WIDTH = 20;\n\nfunction getSkillDisplayName(config: SkillConfig): string {\n return matrix.skills[config.id]?.slug ?? config.id;\n}\n\nfunction isLocalSource(config: SkillConfig): boolean {\n return config.source === \"local\";\n}\n\ntype SkillBuckets = {\n globalPlugin: string[];\n globalLocal: string[];\n projectPlugin: string[];\n projectLocal: string[];\n};\n\nfunction groupSkillsByBucket(configs: SkillConfig[]): SkillBuckets {\n const buckets: SkillBuckets = {\n globalPlugin: [],\n globalLocal: [],\n projectPlugin: [],\n projectLocal: [],\n };\n\n for (const config of configs) {\n const name = getSkillDisplayName(config);\n if (config.scope === \"global\") {\n if (isLocalSource(config)) buckets.globalLocal.push(name);\n else buckets.globalPlugin.push(name);\n } else {\n if (isLocalSource(config)) buckets.projectLocal.push(name);\n else buckets.projectPlugin.push(name);\n }\n }\n\n return buckets;\n}\n\ntype AgentBuckets = {\n global: string[];\n project: string[];\n};\n\nfunction groupAgentsByScope(configs: AgentScopeConfig[]): AgentBuckets {\n const buckets: AgentBuckets = { global: [], project: [] };\n\n for (const config of configs) {\n if (config.scope === \"global\") buckets.global.push(config.name);\n else buckets.project.push(config.name);\n }\n\n return buckets;\n}\n\nconst ItemPairs: React.FC<{ items: string[] }> = ({ items }) => {\n const rows: React.ReactNode[] = [];\n for (let i = 0; i < items.length; i += 2) {\n rows.push(\n <Box key={i}>\n <Box width={ITEM_WIDTH}>\n <Text>{items[i]}</Text>\n </Box>\n {items[i + 1] && (\n <Box width={ITEM_WIDTH}>\n <Text>{items[i + 1]}</Text>\n </Box>\n )}\n </Box>,\n );\n }\n return <>{rows}</>;\n};\n\ntype ScopeColumnsProps = {\n globalItems: string[];\n projectItems: string[];\n};\n\nconst ScopeColumns: React.FC<ScopeColumnsProps> = ({ globalItems, projectItems }) => (\n <Box flexDirection=\"row\">\n <Box flexDirection=\"column\" flexGrow={1}>\n <ItemPairs items={globalItems} />\n </Box>\n <Box flexDirection=\"column\" flexGrow={1}>\n <ItemPairs items={projectItems} />\n </Box>\n </Box>\n);\n\nexport const InfoPanel: React.FC = () => {\n const skillConfigs = useWizardStore((s) => s.skillConfigs);\n const agentConfigs = useWizardStore((s) => s.agentConfigs);\n\n const skills = groupSkillsByBucket(skillConfigs);\n const agents = groupAgentsByScope(agentConfigs);\n\n const hasLocalSkills = skills.globalLocal.length > 0 || skills.projectLocal.length > 0;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor={CLI_COLORS.PRIMARY}\n paddingX={2}\n paddingY={1}\n marginTop={1}\n >\n <Text bold color={CLI_COLORS.PRIMARY}>\n Info\n </Text>\n\n <Box marginTop={1}>\n <Text bold>SKILLS ({skillConfigs.length})</Text>\n </Box>\n\n <Box flexDirection=\"row\" marginTop={0}>\n <Box width={LABEL_WIDTH} />\n <Box flexGrow={1}>\n <Text dimColor color={CLI_COLORS.WARNING}>\n Global\n </Text>\n </Box>\n <Box flexGrow={1}>\n <Text dimColor color={SCOPE_COLOR_PROJECT}>\n Project\n </Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"row\">\n <Box width={LABEL_WIDTH}>\n <Text dimColor>Plugin</Text>\n </Box>\n <ScopeColumns globalItems={skills.globalPlugin} projectItems={skills.projectPlugin} />\n </Box>\n\n {hasLocalSkills && (\n <Box flexDirection=\"row\" marginTop={1}>\n <Box width={LABEL_WIDTH}>\n <Text dimColor>Local</Text>\n </Box>\n <ScopeColumns globalItems={skills.globalLocal} projectItems={skills.projectLocal} />\n </Box>\n )}\n\n <Box marginTop={1}>\n <Text bold>AGENTS ({agentConfigs.length})</Text>\n </Box>\n\n <Box flexDirection=\"row\" marginTop={0}>\n <Box width={LABEL_WIDTH} />\n <Box flexGrow={1}>\n <Text dimColor color={CLI_COLORS.WARNING}>\n Global\n </Text>\n </Box>\n <Box flexGrow={1}>\n <Text dimColor color={SCOPE_COLOR_PROJECT}>\n Project\n </Text>\n </Box>\n </Box>\n\n <Box flexDirection=\"row\">\n <Box width={LABEL_WIDTH} />\n <ScopeColumns globalItems={agents.global} projectItems={agents.project} />\n </Box>\n\n <Box paddingY={1}>\n <Text dimColor>{HOTKEY_INFO.label} close</Text>\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA,SAAS,KAAK,YAAY;AAqEpB,SAYG,UAVC,KAFJ;AA7DN,IAAM,sBAAsB;AAC5B,IAAM,cAAc;AACpB,IAAM,aAAa;AAEnB,SAAS,oBAAoB,QAA6B;AACxD,SAAO,OAAO,OAAO,OAAO,EAAE,GAAG,QAAQ,OAAO;AAClD;AAEA,SAAS,cAAc,QAA8B;AACnD,SAAO,OAAO,WAAW;AAC3B;AASA,SAAS,oBAAoB,SAAsC;AACjE,QAAM,UAAwB;AAAA,IAC5B,cAAc,CAAC;AAAA,IACf,aAAa,CAAC;AAAA,IACd,eAAe,CAAC;AAAA,IAChB,cAAc,CAAC;AAAA,EACjB;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,OAAO,oBAAoB,MAAM;AACvC,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,cAAc,MAAM,EAAG,SAAQ,YAAY,KAAK,IAAI;AAAA,UACnD,SAAQ,aAAa,KAAK,IAAI;AAAA,IACrC,OAAO;AACL,UAAI,cAAc,MAAM,EAAG,SAAQ,aAAa,KAAK,IAAI;AAAA,UACpD,SAAQ,cAAc,KAAK,IAAI;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,mBAAmB,SAA2C;AACrE,QAAM,UAAwB,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC,EAAE;AAExD,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,UAAU,SAAU,SAAQ,OAAO,KAAK,OAAO,IAAI;AAAA,QACzD,SAAQ,QAAQ,KAAK,OAAO,IAAI;AAAA,EACvC;AAEA,SAAO;AACT;AAEA,IAAM,YAA2C,CAAC,EAAE,MAAM,MAAM;AAC9D,QAAM,OAA0B,CAAC;AACjC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,SAAK;AAAA,MACH,qBAAC,OACC;AAAA,4BAAC,OAAI,OAAO,YACV,8BAAC,QAAM,gBAAM,CAAC,GAAE,GAClB;AAAA,QACC,MAAM,IAAI,CAAC,KACV,oBAAC,OAAI,OAAO,YACV,8BAAC,QAAM,gBAAM,IAAI,CAAC,GAAE,GACtB;AAAA,WAPM,CASV;AAAA,IACF;AAAA,EACF;AACA,SAAO,gCAAG,gBAAK;AACjB;AAOA,IAAM,eAA4C,CAAC,EAAE,aAAa,aAAa,MAC7E,qBAAC,OAAI,eAAc,OACjB;AAAA,sBAAC,OAAI,eAAc,UAAS,UAAU,GACpC,8BAAC,aAAU,OAAO,aAAa,GACjC;AAAA,EACA,oBAAC,OAAI,eAAc,UAAS,UAAU,GACpC,8BAAC,aAAU,OAAO,cAAc,GAClC;AAAA,GACF;AAGK,IAAM,YAAsB,MAAM;AACvC,QAAM,eAAe,eAAe,CAAC,MAAM,EAAE,YAAY;AACzD,QAAM,eAAe,eAAe,CAAC,MAAM,EAAE,YAAY;AAEzD,QAAM,SAAS,oBAAoB,YAAY;AAC/C,QAAM,SAAS,mBAAmB,YAAY;AAE9C,QAAM,iBAAiB,OAAO,YAAY,SAAS,KAAK,OAAO,aAAa,SAAS;AAErF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,WAAW;AAAA,MACxB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MAEX;AAAA,4BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,kBAEtC;AAAA,QAEA,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK,MAAI,MAAC;AAAA;AAAA,UAAS,aAAa;AAAA,UAAO;AAAA,WAAC,GAC3C;AAAA,QAEA,qBAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,8BAAC,OAAI,OAAO,aAAa;AAAA,UACzB,oBAAC,OAAI,UAAU,GACb,8BAAC,QAAK,UAAQ,MAAC,OAAO,WAAW,SAAS,oBAE1C,GACF;AAAA,UACA,oBAAC,OAAI,UAAU,GACb,8BAAC,QAAK,UAAQ,MAAC,OAAO,qBAAqB,qBAE3C,GACF;AAAA,WACF;AAAA,QAEA,qBAAC,OAAI,eAAc,OACjB;AAAA,8BAAC,OAAI,OAAO,aACV,8BAAC,QAAK,UAAQ,MAAC,oBAAM,GACvB;AAAA,UACA,oBAAC,gBAAa,aAAa,OAAO,cAAc,cAAc,OAAO,eAAe;AAAA,WACtF;AAAA,QAEC,kBACC,qBAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,8BAAC,OAAI,OAAO,aACV,8BAAC,QAAK,UAAQ,MAAC,mBAAK,GACtB;AAAA,UACA,oBAAC,gBAAa,aAAa,OAAO,aAAa,cAAc,OAAO,cAAc;AAAA,WACpF;AAAA,QAGF,oBAAC,OAAI,WAAW,GACd,+BAAC,QAAK,MAAI,MAAC;AAAA;AAAA,UAAS,aAAa;AAAA,UAAO;AAAA,WAAC,GAC3C;AAAA,QAEA,qBAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,8BAAC,OAAI,OAAO,aAAa;AAAA,UACzB,oBAAC,OAAI,UAAU,GACb,8BAAC,QAAK,UAAQ,MAAC,OAAO,WAAW,SAAS,oBAE1C,GACF;AAAA,UACA,oBAAC,OAAI,UAAU,GACb,8BAAC,QAAK,UAAQ,MAAC,OAAO,qBAAqB,qBAE3C,GACF;AAAA,WACF;AAAA,QAEA,qBAAC,OAAI,eAAc,OACjB;AAAA,8BAAC,OAAI,OAAO,aAAa;AAAA,UACzB,oBAAC,gBAAa,aAAa,OAAO,QAAQ,cAAc,OAAO,SAAS;AAAA,WAC1E;AAAA,QAEA,oBAAC,OAAI,UAAU,GACb,+BAAC,QAAK,UAAQ,MAAE;AAAA,sBAAY;AAAA,UAAM;AAAA,WAAM,GAC1C;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -5,21 +5,21 @@ import {
|
|
|
5
5
|
} from "./chunk-YVFGISUO.js";
|
|
6
6
|
import {
|
|
7
7
|
FEATURE_FLAGS
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ORTNQZLF.js";
|
|
9
9
|
import {
|
|
10
10
|
getDomainDisplayName,
|
|
11
11
|
getStackName,
|
|
12
12
|
orderDomains
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-UHARXISZ.js";
|
|
14
14
|
import {
|
|
15
|
-
|
|
16
|
-
} from "./chunk-
|
|
15
|
+
InfoPanel
|
|
16
|
+
} from "./chunk-7QWCPF6F.js";
|
|
17
17
|
import {
|
|
18
18
|
useWizardStore
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-V75HVZTB.js";
|
|
20
20
|
import {
|
|
21
21
|
HOTKEY_FILTER_INCOMPATIBLE,
|
|
22
|
-
|
|
22
|
+
HOTKEY_INFO,
|
|
23
23
|
HOTKEY_SCOPE,
|
|
24
24
|
HOTKEY_SETTINGS,
|
|
25
25
|
HOTKEY_SET_ALL_LOCAL,
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
KEY_LABEL_ENTER,
|
|
29
29
|
KEY_LABEL_ESC,
|
|
30
30
|
KEY_LABEL_SPACE
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-DVBA6PGR.js";
|
|
32
32
|
import {
|
|
33
33
|
CLI_COLORS
|
|
34
34
|
} from "./chunk-6PGL2XMY.js";
|
|
@@ -186,7 +186,7 @@ var WizardLayout = ({
|
|
|
186
186
|
dropdowns
|
|
187
187
|
}
|
|
188
188
|
),
|
|
189
|
-
store.
|
|
189
|
+
FEATURE_FLAGS.INFO_PANEL && store.showInfo ? /* @__PURE__ */ jsx(InfoPanel, {}) : /* @__PURE__ */ jsxs(Fragment2, { children: [
|
|
190
190
|
/* @__PURE__ */ jsx(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, marginTop: 1, children }),
|
|
191
191
|
/* @__PURE__ */ jsxs(Box, { paddingX: 1, columnGap: 2, marginTop: 2, children: [
|
|
192
192
|
/* @__PURE__ */ jsx(
|
|
@@ -239,7 +239,14 @@ var WizardLayout = ({
|
|
|
239
239
|
isActive: store.showSettings
|
|
240
240
|
}
|
|
241
241
|
),
|
|
242
|
-
/* @__PURE__ */ jsx(
|
|
242
|
+
/* @__PURE__ */ jsx(
|
|
243
|
+
DefinitionItem,
|
|
244
|
+
{
|
|
245
|
+
label: "Info",
|
|
246
|
+
values: [HOTKEY_INFO.label],
|
|
247
|
+
isVisible: FEATURE_FLAGS.INFO_PANEL
|
|
248
|
+
}
|
|
249
|
+
)
|
|
243
250
|
] }),
|
|
244
251
|
/* @__PURE__ */ jsx(WizardFooter, {})
|
|
245
252
|
] })
|
|
@@ -250,4 +257,4 @@ var WizardLayout = ({
|
|
|
250
257
|
export {
|
|
251
258
|
WizardLayout
|
|
252
259
|
};
|
|
253
|
-
//# sourceMappingURL=chunk-
|
|
260
|
+
//# sourceMappingURL=chunk-AWB6DO24.js.map
|