@agents-inc/cli 0.74.1 → 0.74.3
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 +24 -0
- package/dist/{chunk-JWZLVWTX.js → chunk-23OJO4JS.js} +4 -4
- package/dist/{chunk-NTVY4G35.js → chunk-2NWQS7N4.js} +2 -2
- package/dist/{chunk-KTF5RKKP.js → chunk-ALCUVCY5.js} +3 -3
- package/dist/{chunk-QJUPZPXO.js → chunk-AV5KJHP2.js} +2 -2
- package/dist/{chunk-WQRFVEAA.js → chunk-DUF4UVJB.js} +2 -2
- package/dist/{chunk-ANUYSHQA.js → chunk-GJLM53PH.js} +2 -2
- package/dist/{chunk-ZCJ4YYWL.js → chunk-N2HO5IT2.js} +6 -4
- package/dist/chunk-N2HO5IT2.js.map +1 -0
- package/dist/{chunk-B7KVPY3Z.js → chunk-OLS55LVJ.js} +2 -2
- package/dist/{chunk-VOYGRNLS.js → chunk-SFZQL6DJ.js} +2 -2
- package/dist/{chunk-UFAP6GHD.js → chunk-TUILIOBW.js} +9 -9
- package/dist/{chunk-XP7BXHFG.js → chunk-UVNIFNIN.js} +2 -2
- package/dist/{chunk-ZO7C5WMJ.js → chunk-XYXDEODG.js} +3 -3
- package/dist/{chunk-ZLMKEYDF.js → chunk-ZD3U734W.js} +44 -23
- package/dist/chunk-ZD3U734W.js.map +1 -0
- package/dist/{chunk-J6SHWAS6.js → chunk-ZNXK2J6R.js} +14 -6
- package/dist/chunk-ZNXK2J6R.js.map +1 -0
- package/dist/{chunk-J5T7M2CS.js → chunk-ZWYCZ7BN.js} +2 -2
- package/dist/commands/build/plugins.js +2 -2
- package/dist/commands/build/stack.js +2 -2
- package/dist/commands/compile.js +2 -2
- package/dist/commands/config/index.js +2 -2
- package/dist/commands/config/path.js +1 -1
- package/dist/commands/config/show.js +2 -2
- package/dist/commands/diff.js +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/edit.js +15 -13
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +1 -1
- package/dist/commands/import/skill.js +1 -1
- package/dist/commands/info.js +1 -1
- package/dist/commands/init.js +12 -12
- package/dist/commands/list.js +1 -1
- package/dist/commands/new/agent.js +2 -2
- package/dist/commands/new/marketplace.js +2 -2
- package/dist/commands/new/skill.js +2 -2
- package/dist/commands/outdated.js +1 -1
- package/dist/commands/search.js +1 -1
- package/dist/commands/uninstall.js +17 -8
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +2 -2
- package/dist/commands/validate.js +4 -2
- package/dist/commands/validate.js.map +1 -1
- package/dist/components/wizard/category-grid.test.js +2 -2
- package/dist/components/wizard/domain-selection.js +3 -3
- package/dist/components/wizard/source-grid.test.js +2 -2
- package/dist/components/wizard/stack-selection.js +3 -3
- package/dist/components/wizard/step-agents.js +3 -3
- package/dist/components/wizard/step-agents.test.js +3 -3
- package/dist/components/wizard/step-build.js +3 -3
- package/dist/components/wizard/step-build.test.js +3 -3
- package/dist/components/wizard/step-confirm.test.js +2 -2
- package/dist/components/wizard/step-settings.js +2 -2
- package/dist/components/wizard/step-settings.test.js +5 -5
- package/dist/components/wizard/step-sources.js +3 -3
- package/dist/components/wizard/step-sources.test.js +3 -3
- package/dist/components/wizard/step-stack.js +5 -5
- package/dist/components/wizard/step-stack.test.js +5 -5
- package/dist/components/wizard/wizard-layout.js +3 -3
- package/dist/components/wizard/wizard.js +11 -11
- package/dist/hooks/init.js +12 -12
- package/dist/{source-loader-RTG42MWG.js → source-loader-VTNIFSL6.js} +2 -2
- package/dist/{source-manager-NCOFHYHD.js → source-manager-FWAJVMYS.js} +2 -2
- package/dist/stores/wizard-store.js +2 -2
- package/dist/stores/wizard-store.test.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-J6SHWAS6.js.map +0 -1
- package/dist/chunk-ZCJ4YYWL.js.map +0 -1
- package/dist/chunk-ZLMKEYDF.js.map +0 -1
- package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +0 -1
- package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +0 -13
- /package/dist/{chunk-JWZLVWTX.js.map → chunk-23OJO4JS.js.map} +0 -0
- /package/dist/{chunk-NTVY4G35.js.map → chunk-2NWQS7N4.js.map} +0 -0
- /package/dist/{chunk-KTF5RKKP.js.map → chunk-ALCUVCY5.js.map} +0 -0
- /package/dist/{chunk-QJUPZPXO.js.map → chunk-AV5KJHP2.js.map} +0 -0
- /package/dist/{chunk-WQRFVEAA.js.map → chunk-DUF4UVJB.js.map} +0 -0
- /package/dist/{chunk-ANUYSHQA.js.map → chunk-GJLM53PH.js.map} +0 -0
- /package/dist/{chunk-B7KVPY3Z.js.map → chunk-OLS55LVJ.js.map} +0 -0
- /package/dist/{chunk-VOYGRNLS.js.map → chunk-SFZQL6DJ.js.map} +0 -0
- /package/dist/{chunk-UFAP6GHD.js.map → chunk-TUILIOBW.js.map} +0 -0
- /package/dist/{chunk-XP7BXHFG.js.map → chunk-UVNIFNIN.js.map} +0 -0
- /package/dist/{chunk-ZO7C5WMJ.js.map → chunk-XYXDEODG.js.map} +0 -0
- /package/dist/{chunk-J5T7M2CS.js.map → chunk-ZWYCZ7BN.js.map} +0 -0
- /package/dist/{source-loader-RTG42MWG.js.map → source-loader-VTNIFSL6.js.map} +0 -0
- /package/dist/{source-manager-NCOFHYHD.js.map → source-manager-FWAJVMYS.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,30 @@ 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.74.3] - 2026-03-13
|
|
11
|
+
|
|
12
|
+
**Verbose slug warnings, init symlink fix, E2E test hygiene**
|
|
13
|
+
|
|
14
|
+
- Fix verbose logging in validate command and init symlink path comparison
|
|
15
|
+
- Demote unresolved slug warnings to verbose level
|
|
16
|
+
- Fix E2E fixtures with required metadata fields and valid SkillIds
|
|
17
|
+
|
|
18
|
+
See [changelogs/0.74.3.md](./changelogs/0.74.3.md) for full details.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## [0.74.2] - 2026-03-13
|
|
23
|
+
|
|
24
|
+
**Plugin scope routing, uninstall filtering, and config splitting**
|
|
25
|
+
|
|
26
|
+
- Uninstall only removes CLI-installed plugins, preserving third-party plugins
|
|
27
|
+
- Plugin install/uninstall uses correct cwd for scope routing
|
|
28
|
+
- Agent recompiler and config generator correctly split by scope
|
|
29
|
+
|
|
30
|
+
See [changelogs/0.74.2.md](./changelogs/0.74.2.md) for full details.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
10
34
|
## [0.74.1] - 2026-03-13
|
|
11
35
|
|
|
12
36
|
**Plugin install and uninstall scope fixes**
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
StackSelection
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-SFZQL6DJ.js";
|
|
5
5
|
import {
|
|
6
6
|
useMeasuredHeight
|
|
7
7
|
} from "./chunk-K77I4XGL.js";
|
|
8
8
|
import {
|
|
9
9
|
DomainSelection
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-GJLM53PH.js";
|
|
11
11
|
import {
|
|
12
12
|
ViewTitle
|
|
13
13
|
} from "./chunk-AQYAVLZK.js";
|
|
14
14
|
import {
|
|
15
15
|
useWizardStore
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OLS55LVJ.js";
|
|
17
17
|
import {
|
|
18
18
|
init_esm_shims
|
|
19
19
|
} from "./chunk-DHET7RCE.js";
|
|
@@ -37,4 +37,4 @@ var StepStack = ({ onCancel }) => {
|
|
|
37
37
|
export {
|
|
38
38
|
StepStack
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-23OJO4JS.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
loadProjectSourceConfig,
|
|
8
8
|
resolveAgentsSource,
|
|
9
9
|
resolveSource
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ZD3U734W.js";
|
|
11
11
|
import {
|
|
12
12
|
BaseCommand
|
|
13
13
|
} from "./chunk-IJLAVOKZ.js";
|
|
@@ -90,4 +90,4 @@ ${DEFAULT_BRANDING.NAME} Configuration
|
|
|
90
90
|
export {
|
|
91
91
|
ConfigShow
|
|
92
92
|
};
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
93
|
+
//# sourceMappingURL=chunk-2NWQS7N4.js.map
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "./chunk-AQYAVLZK.js";
|
|
17
17
|
import {
|
|
18
18
|
useWizardStore
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OLS55LVJ.js";
|
|
20
20
|
import {
|
|
21
21
|
HOTKEY_SET_ALL_LOCAL,
|
|
22
22
|
HOTKEY_SET_ALL_PLUGIN,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
resolveAllSources,
|
|
29
29
|
searchExtraSources
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-ZD3U734W.js";
|
|
31
31
|
import {
|
|
32
32
|
CLI_COLORS,
|
|
33
33
|
DEFAULT_BRANDING
|
|
@@ -181,4 +181,4 @@ var StepSources = ({ projectDir, onContinue, onBack }) => {
|
|
|
181
181
|
export {
|
|
182
182
|
StepSources
|
|
183
183
|
};
|
|
184
|
-
//# sourceMappingURL=chunk-
|
|
184
|
+
//# sourceMappingURL=chunk-ALCUVCY5.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
loadConfigTypesDataInBackground,
|
|
8
8
|
regenerateConfigTypes,
|
|
9
9
|
resolveAuthor
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ZD3U734W.js";
|
|
11
11
|
import {
|
|
12
12
|
BaseCommand,
|
|
13
13
|
EXIT_CODES
|
|
@@ -339,4 +339,4 @@ export {
|
|
|
339
339
|
generateSkillRulesTs,
|
|
340
340
|
NewSkill
|
|
341
341
|
};
|
|
342
|
-
//# sourceMappingURL=chunk-
|
|
342
|
+
//# sourceMappingURL=chunk-AV5KJHP2.js.map
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
addSource,
|
|
28
28
|
getSourceSummary,
|
|
29
29
|
removeSource
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-ZD3U734W.js";
|
|
31
31
|
import {
|
|
32
32
|
getErrorMessage,
|
|
33
33
|
verbose
|
|
@@ -270,4 +270,4 @@ var StepSettings = ({
|
|
|
270
270
|
export {
|
|
271
271
|
StepSettings
|
|
272
272
|
};
|
|
273
|
-
//# sourceMappingURL=chunk-
|
|
273
|
+
//# sourceMappingURL=chunk-DUF4UVJB.js.map
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
} from "./chunk-OV5UJWS5.js";
|
|
9
9
|
import {
|
|
10
10
|
useWizardStore
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-OLS55LVJ.js";
|
|
12
12
|
import {
|
|
13
13
|
typedEntries
|
|
14
14
|
} from "./chunk-EMX7PA2I.js";
|
|
@@ -65,4 +65,4 @@ var DomainSelection = () => {
|
|
|
65
65
|
export {
|
|
66
66
|
DomainSelection
|
|
67
67
|
};
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
68
|
+
//# sourceMappingURL=chunk-GJLM53PH.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
Wizard
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TUILIOBW.js";
|
|
5
5
|
import {
|
|
6
6
|
SelectList
|
|
7
7
|
} from "./chunk-WF5PMBIR.js";
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
installPluginConfig,
|
|
31
31
|
loadProjectConfig,
|
|
32
32
|
loadSkillsMatrixFromSource
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-ZD3U734W.js";
|
|
34
34
|
import {
|
|
35
35
|
getSkillById
|
|
36
36
|
} from "./chunk-E74Q7GUE.js";
|
|
@@ -67,6 +67,7 @@ import {
|
|
|
67
67
|
init_esm_shims();
|
|
68
68
|
import { Flags } from "@oclif/core";
|
|
69
69
|
import { render, Box as Box2, Text as Text2, useApp } from "ink";
|
|
70
|
+
import fs from "fs";
|
|
70
71
|
import os from "os";
|
|
71
72
|
import path2 from "path";
|
|
72
73
|
|
|
@@ -353,7 +354,8 @@ var Init = class _Init extends BaseCommand {
|
|
|
353
354
|
}
|
|
354
355
|
}
|
|
355
356
|
}
|
|
356
|
-
|
|
357
|
+
const isGlobalRoot = fs.realpathSync(projectDir) === fs.realpathSync(GLOBAL_INSTALL_ROOT);
|
|
358
|
+
if (!isGlobalRoot) {
|
|
357
359
|
const created = await ensureBlankGlobalConfig();
|
|
358
360
|
if (created) {
|
|
359
361
|
this.log("Created blank global config at ~/" + CLAUDE_SRC_DIR);
|
|
@@ -560,4 +562,4 @@ export {
|
|
|
560
562
|
showDashboard,
|
|
561
563
|
Init
|
|
562
564
|
};
|
|
563
|
-
//# sourceMappingURL=chunk-
|
|
565
|
+
//# sourceMappingURL=chunk-N2HO5IT2.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\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n loadSkillsMatrixFromSource,\n getMarketplaceLabel,\n fetchMarketplace,\n type SourceLoadResult,\n} from \"../lib/loading/index.js\";\nimport {\n installLocal,\n installPluginConfig,\n detectGlobalInstallation,\n detectProjectInstallation,\n deriveInstallMode,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { getInstallationInfo } from \"../lib/plugins/plugin-info.js\";\nimport { hasIndividualPlugins } from \"../lib/plugins/index.js\";\nimport {\n claudePluginInstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport {\n ASCII_LOGO,\n CLAUDE_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 { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n type StartupMessage,\n} 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\ntype GlobalConfigChoice = \"edit-global\" | \"create-project\";\n\nconst GLOBAL_CONFIG_OPTIONS: SelectListItem<GlobalConfigChoice>[] = [\n { label: \"Edit global installation\", value: \"edit-global\" },\n { label: \"Create new project installation\", value: \"create-project\" },\n];\n\ntype GlobalConfigPromptProps = {\n globalConfigDir: string;\n onSelect: (choice: GlobalConfigChoice) => void;\n onCancel: () => void;\n};\n\nconst GlobalConfigPrompt: React.FC<GlobalConfigPromptProps> = ({\n globalConfigDir,\n onSelect,\n onCancel,\n}) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text>A global installation was found at {globalConfigDir}</Text>\n <Text> </Text>\n <SelectList\n items={GLOBAL_CONFIG_OPTIONS}\n onSelect={(choice) => {\n onSelect(choice);\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\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 // Skill count from config (canonical source of truth for installed skills)\n const skillCount = loaded?.config?.skills?.length ?? 0;\n // Agent count from filesystem (compiled .md files in agents dir)\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\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\" : \"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 // For \"already initialized\" check, only look at the target directory (no global fallback)\n const individualPluginsExist = await hasIndividualPlugins(projectDir);\n const existingInstallation = await detectProjectInstallation(projectDir);\n\n if (individualPluginsExist || existingInstallation) {\n const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return;\n }\n\n // No project config exists: check if a global installation exists\n const globalInstallation = await detectGlobalInstallation();\n if (globalInstallation) {\n const globalConfigDir = path.join(os.homedir(), CLAUDE_SRC_DIR);\n\n // Non-interactive: skip prompt and fall through to wizard\n if (process.stdin.isTTY) {\n let globalChoice: GlobalConfigChoice | null = null;\n\n const { waitUntilExit: waitForPrompt } = render(\n <GlobalConfigPrompt\n globalConfigDir={globalConfigDir}\n onSelect={(choice) => {\n globalChoice = choice;\n }}\n onCancel={() => {\n globalChoice = null;\n }}\n />,\n );\n\n await waitForPrompt();\n clearTerminalOutput();\n\n if (globalChoice === \"edit-global\") {\n const editArgs: string[] = [];\n if (flags.source) {\n editArgs.push(\"--source\", flags.source);\n }\n if (flags.refresh) {\n editArgs.push(\"--refresh\");\n }\n await this.config.runCommand(\"edit\", editArgs);\n return;\n }\n\n // User cancelled (Esc)\n if (globalChoice === null) {\n return;\n }\n\n // \"create-project\" falls through to wizard below\n }\n }\n\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 enableBuffering();\n\n let sourceResult: SourceLoadResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n disableBuffering();\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n const marketplaceLabel = getMarketplaceLabel(sourceResult);\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n marketplaceLabel={marketplaceLabel}\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\n if (!result || result.cancelled) {\n this.exit(EXIT_CODES.CANCELLED);\n }\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 handleInstallation(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const installMode = deriveInstallMode(result.skills);\n\n this.log(\"\\n\");\n this.log(`Selected ${result.skills.length} skills`);\n this.log(\n `Install mode: ${installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\"}`,\n );\n\n if (installMode === \"plugin\") {\n await this.installIndividualPlugins(result, sourceResult, flags, projectDir);\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n }\n\n private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n // Lazily resolve marketplace name if not already set (e.g. BUILT_IN_MATRIX skips fetch)\n if (!sourceResult.marketplace) {\n try {\n const marketplaceResult = await fetchMarketplace(sourceResult.sourceConfig.source, {});\n sourceResult.marketplace = marketplaceResult.marketplace.name;\n } catch {\n this.warn(\"Could not resolve marketplace. Falling back to Local Mode...\");\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n return;\n }\n }\n\n // After lazy resolution, marketplace is guaranteed to be set (or we returned above)\n const marketplace = sourceResult.marketplace;\n\n const marketplaceExists = await claudePluginMarketplaceExists(marketplace);\n\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${marketplace}\"...`);\n try {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${marketplace}`);\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n this.log(\"Installing skill plugins...\");\n for (const skill of result.skills.filter((s) => s.source !== \"local\")) {\n const pluginRef = `${skill.id}@${marketplace}`;\n const pluginScope = skill.scope === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginInstall(pluginRef, pluginScope, projectDir);\n this.log(` Installed ${pluginRef}`);\n } catch (error) {\n this.error(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n const pluginSkillCount = result.skills.filter((s) => s.source !== \"local\").length;\n this.log(`Installed ${pluginSkillCount} skill plugins\\n`);\n\n this.log(\"Generating configuration...\");\n try {\n const configResult = await installPluginConfig({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${configResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${configResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Agents compiled to:\");\n this.log(` ${configResult.agentsDir}`);\n for (const agentName of configResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${configResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async installLocalMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n this.log(\"Copying skills to local directory...\");\n try {\n const installResult = await installLocal({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/\\n`);\n this.log(\"Generating configuration...\");\n\n if (installResult.wasMerged) {\n this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${installResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Skills copied to:\");\n this.log(` ${installResult.skillsDir}`);\n for (const copiedSkill of installResult.copiedSkills) {\n const displayName = getSkillById(copiedSkill.skillId).displayName;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n this.log(\"Agents compiled to:\");\n this.log(` ${installResult.agentsDir}`);\n for (const agentName of installResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${installResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n","import React from \"react\";\n\nimport { Text, Box } from \"ink\";\nimport path from \"path\";\n\nimport { CLAUDE_DIR, CLI_COLORS, MAX_CONFIG_FILE_SIZE } from \"../consts\";\nimport { fileExists, readFileSafe } from \"../utils/fs\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema, warnUnknownFields } from \"./schemas\";\n\ntype PermissionConfig = {\n allow?: string[];\n deny?: string[];\n};\n\ntype SettingsFile = {\n permissions?: PermissionConfig;\n};\n\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.json\");\n const localSettingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.local.json\");\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);\n const raw = JSON.parse(content);\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n // Known Claude CLI settings.json fields (permissions is ours; the rest are managed by Claude CLI)\n const EXPECTED_SETTINGS_KEYS = [\n \"permissions\",\n \"enabledPlugins\",\n \"env\",\n \"allowedTools\",\n \"customInstructions\",\n \"defaultModel\",\n ] as const;\n warnUnknownFields(\n raw as Record<string, unknown>,\n EXPECTED_SETTINGS_KEYS,\n `settings file '${filePath}'`,\n );\n }\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? (result.data as SettingsFile) : {};\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {\n warn(`Malformed settings file at '${filePath}' — skipping`);\n }\n }\n }\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Notice\n </Text>\n <Text>No permissions configured in .claude/settings.json</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to .claude/settings.json:</Text>\n <Text> </Text>\n <Text color=\"dim\">{\"{\"}</Text>\n <Text color=\"dim\">{' \"permissions\": {'}</Text>\n <Text color=\"dim\">{' \"allow\": ['}</Text>\n <Text color=\"dim\">{' \"Read(*)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(git *)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(bun *)\"'}</Text>\n <Text color=\"dim\">{\" ]\"}</Text>\n <Text color=\"dim\">{\" }\"}</Text>\n <Text color=\"dim\">{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":"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","names":["Box","Text","path","jsx","jsxs","Box","Text","path","result"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
deriveInstallMode,
|
|
4
4
|
resolveAlias
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-ZD3U734W.js";
|
|
6
6
|
import {
|
|
7
7
|
isCategory,
|
|
8
8
|
typedEntries,
|
|
@@ -518,4 +518,4 @@ var useWizardStore = create((set, get) => ({
|
|
|
518
518
|
export {
|
|
519
519
|
useWizardStore
|
|
520
520
|
};
|
|
521
|
-
//# sourceMappingURL=chunk-
|
|
521
|
+
//# sourceMappingURL=chunk-OLS55LVJ.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
} from "./chunk-AUNBGZS4.js";
|
|
8
8
|
import {
|
|
9
9
|
useWizardStore
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-OLS55LVJ.js";
|
|
11
11
|
import {
|
|
12
12
|
matrix
|
|
13
13
|
} from "./chunk-E74Q7GUE.js";
|
|
@@ -110,4 +110,4 @@ var StackSelection = ({
|
|
|
110
110
|
export {
|
|
111
111
|
StackSelection
|
|
112
112
|
};
|
|
113
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-SFZQL6DJ.js.map
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
WizardLayout
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZWYCZ7BN.js";
|
|
5
5
|
import {
|
|
6
6
|
StepSettings
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-DUF4UVJB.js";
|
|
8
8
|
import {
|
|
9
9
|
StepSources
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ALCUVCY5.js";
|
|
11
11
|
import {
|
|
12
12
|
StepStack
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-23OJO4JS.js";
|
|
14
14
|
import {
|
|
15
15
|
StepAgents
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-UVNIFNIN.js";
|
|
17
17
|
import {
|
|
18
18
|
StepBuild
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-XYXDEODG.js";
|
|
20
20
|
import {
|
|
21
21
|
StepConfirm
|
|
22
22
|
} from "./chunk-NUJHWYCR.js";
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
} from "./chunk-BH4LN7XV.js";
|
|
26
26
|
import {
|
|
27
27
|
useWizardStore
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-OLS55LVJ.js";
|
|
29
29
|
import {
|
|
30
30
|
cliTheme
|
|
31
31
|
} from "./chunk-T5DJCIUP.js";
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
import {
|
|
40
40
|
resolveAlias,
|
|
41
41
|
validateSelection
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-ZD3U734W.js";
|
|
43
43
|
import {
|
|
44
44
|
findStack,
|
|
45
45
|
matrix
|
|
@@ -339,4 +339,4 @@ var Wizard = ({
|
|
|
339
339
|
export {
|
|
340
340
|
Wizard
|
|
341
341
|
};
|
|
342
|
-
//# sourceMappingURL=chunk-
|
|
342
|
+
//# sourceMappingURL=chunk-TUILIOBW.js.map
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from "./chunk-AQYAVLZK.js";
|
|
14
14
|
import {
|
|
15
15
|
useWizardStore
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OLS55LVJ.js";
|
|
17
17
|
import {
|
|
18
18
|
isAgentName,
|
|
19
19
|
typedKeys
|
|
@@ -268,4 +268,4 @@ var StepAgents = () => {
|
|
|
268
268
|
export {
|
|
269
269
|
StepAgents
|
|
270
270
|
};
|
|
271
|
-
//# sourceMappingURL=chunk-
|
|
271
|
+
//# sourceMappingURL=chunk-UVNIFNIN.js.map
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "./chunk-AQYAVLZK.js";
|
|
15
15
|
import {
|
|
16
16
|
useWizardStore
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-OLS55LVJ.js";
|
|
18
18
|
import {
|
|
19
19
|
KEY_LABEL_ENTER,
|
|
20
20
|
KEY_LABEL_ESC
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
import {
|
|
23
23
|
getAvailableSkills,
|
|
24
24
|
resolveAlias
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-ZD3U734W.js";
|
|
26
26
|
import {
|
|
27
27
|
getSkillById,
|
|
28
28
|
matrix
|
|
@@ -243,4 +243,4 @@ export {
|
|
|
243
243
|
validateBuildStep,
|
|
244
244
|
StepBuild
|
|
245
245
|
};
|
|
246
|
-
//# sourceMappingURL=chunk-
|
|
246
|
+
//# sourceMappingURL=chunk-XYXDEODG.js.map
|
|
@@ -102,7 +102,7 @@ import {
|
|
|
102
102
|
|
|
103
103
|
// src/cli/lib/loading/source-loader.ts
|
|
104
104
|
init_esm_shims();
|
|
105
|
-
import
|
|
105
|
+
import os10 from "os";
|
|
106
106
|
import path28 from "path";
|
|
107
107
|
|
|
108
108
|
// src/cli/lib/metadata-keys.ts
|
|
@@ -595,12 +595,19 @@ function splitConfigByScope(config) {
|
|
|
595
595
|
}
|
|
596
596
|
}
|
|
597
597
|
}
|
|
598
|
+
const globalAgentNames = new Set(globalAgents.map((a) => a.name));
|
|
599
|
+
const globalSelectedAgents = config.selectedAgents?.filter((a) => globalAgentNames.has(a)) ?? [];
|
|
600
|
+
const projectSelectedAgents = config.selectedAgents?.filter((a) => !globalAgentNames.has(a)) ?? [];
|
|
601
|
+
const globalDomains = config.domains ?? [];
|
|
602
|
+
const globalDomainSet = new Set(globalDomains);
|
|
603
|
+
const projectOnlyDomains = (config.domains ?? []).filter((d) => !globalDomainSet.has(d));
|
|
598
604
|
const globalConfig = {
|
|
599
605
|
name: "global",
|
|
600
606
|
agents: globalAgents,
|
|
601
607
|
skills: globalSkills,
|
|
602
608
|
...Object.keys(globalStack).length > 0 && { stack: globalStack },
|
|
603
|
-
...
|
|
609
|
+
...globalDomains.length > 0 && { domains: globalDomains },
|
|
610
|
+
...globalSelectedAgents.length > 0 && { selectedAgents: globalSelectedAgents }
|
|
604
611
|
};
|
|
605
612
|
const projectConfig = {
|
|
606
613
|
name: config.name,
|
|
@@ -612,8 +619,8 @@ function splitConfigByScope(config) {
|
|
|
612
619
|
...config.source && { source: config.source },
|
|
613
620
|
...config.marketplace && { marketplace: config.marketplace },
|
|
614
621
|
...config.agentsSource && { agentsSource: config.agentsSource },
|
|
615
|
-
...
|
|
616
|
-
...
|
|
622
|
+
...projectOnlyDomains.length > 0 && { domains: projectOnlyDomains },
|
|
623
|
+
...projectSelectedAgents.length > 0 && { selectedAgents: projectSelectedAgents }
|
|
617
624
|
};
|
|
618
625
|
return { global: globalConfig, project: projectConfig };
|
|
619
626
|
}
|
|
@@ -975,7 +982,7 @@ function loadConfigTypesDataInBackground(sourceFlag, projectDir) {
|
|
|
975
982
|
if (!await directoryExists(claudeSrcDir)) {
|
|
976
983
|
throw new Error(`${CLAUDE_SRC_DIR}/ not found \u2014 run '${CLI_BIN_NAME} init' first`);
|
|
977
984
|
}
|
|
978
|
-
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-
|
|
985
|
+
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-VTNIFSL6.js");
|
|
979
986
|
const { loadAllAgents: loadAllAgents2 } = await import("./loader-NHUCFMFQ.js");
|
|
980
987
|
const sourceResult = await loadSkillsMatrixFromSource2({
|
|
981
988
|
sourceFlag,
|
|
@@ -1004,7 +1011,8 @@ async function regenerateConfigTypes(projectDir, backgroundData, extras) {
|
|
|
1004
1011
|
globalTypesImportPath: computeGlobalTypesImportPath(projectDir),
|
|
1005
1012
|
projectSkillIds: extras?.extraSkillIds ?? [],
|
|
1006
1013
|
projectAgentNames: extras?.extraAgentNames ?? [],
|
|
1007
|
-
projectDomains: extras?.extraDomains ?? []
|
|
1014
|
+
projectDomains: extras?.extraDomains ?? [],
|
|
1015
|
+
projectCategories: extras?.extraCategories ?? []
|
|
1008
1016
|
});
|
|
1009
1017
|
verbose("Using project config-types.ts that imports from global");
|
|
1010
1018
|
} else {
|
|
@@ -1286,8 +1294,10 @@ function generateProjectConfigWithGlobalImport(cleaned, globalImportPath) {
|
|
|
1286
1294
|
const agentsArr = cleaned.agents ?? [];
|
|
1287
1295
|
const stackObj = cleaned.stack;
|
|
1288
1296
|
const domainsArr = cleaned.domains ?? [];
|
|
1297
|
+
const selectedAgentsArr = cleaned.selectedAgents ?? [];
|
|
1289
1298
|
const hasProjectDomains = domainsArr.length > 0;
|
|
1290
1299
|
const hasStack = stackObj != null && Object.keys(stackObj).length > 0;
|
|
1300
|
+
const hasProjectSelectedAgents = selectedAgentsArr.length > 0;
|
|
1291
1301
|
const typeImports = buildTypeImports({
|
|
1292
1302
|
hasSkills: true,
|
|
1293
1303
|
// Always present (spread from global)
|
|
@@ -1325,11 +1335,10 @@ function generateProjectConfigWithGlobalImport(cleaned, globalImportPath) {
|
|
|
1325
1335
|
if (domainItems) lines.push(domainItems);
|
|
1326
1336
|
lines.push(`];`);
|
|
1327
1337
|
}
|
|
1328
|
-
const scalarFields = Object.entries(cleaned).filter(([key]) => !EXTRACTED_FIELDS.has(key) && key !== "name").map(([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)},`).join("\n");
|
|
1338
|
+
const scalarFields = Object.entries(cleaned).filter(([key]) => !EXTRACTED_FIELDS.has(key) && key !== "name" && key !== "selectedAgents").map(([key, value]) => ` ${JSON.stringify(key)}: ${JSON.stringify(value)},`).join("\n");
|
|
1329
1339
|
const exportFields = [` ...globalConfig,`];
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
}
|
|
1340
|
+
const projectName = cleaned.name && cleaned.name !== "global" ? cleaned.name : DEFAULT_PLUGIN_NAME;
|
|
1341
|
+
exportFields.push(` name: ${JSON.stringify(projectName)},`);
|
|
1333
1342
|
exportFields.push(` skills,`);
|
|
1334
1343
|
exportFields.push(` agents,`);
|
|
1335
1344
|
if (hasStack) {
|
|
@@ -1338,6 +1347,12 @@ function generateProjectConfigWithGlobalImport(cleaned, globalImportPath) {
|
|
|
1338
1347
|
if (hasProjectDomains) {
|
|
1339
1348
|
exportFields.push(` domains,`);
|
|
1340
1349
|
}
|
|
1350
|
+
if (hasProjectSelectedAgents) {
|
|
1351
|
+
const projectAgentItems = selectedAgentsArr.map((a) => `${JSON.stringify(a)}`).join(", ");
|
|
1352
|
+
exportFields.push(
|
|
1353
|
+
` "selectedAgents": [...(globalConfig.selectedAgents ?? []), ${projectAgentItems}],`
|
|
1354
|
+
);
|
|
1355
|
+
}
|
|
1341
1356
|
if (scalarFields) {
|
|
1342
1357
|
exportFields.push(scalarFields);
|
|
1343
1358
|
}
|
|
@@ -1698,7 +1713,7 @@ function resolveToCanonicalId(slug, slugToId, context) {
|
|
|
1698
1713
|
return slugResult;
|
|
1699
1714
|
}
|
|
1700
1715
|
const location = context ? ` in ${context}` : "";
|
|
1701
|
-
|
|
1716
|
+
verbose(`Unresolved slug '${slug}'${location} \u2014 skipping`);
|
|
1702
1717
|
return null;
|
|
1703
1718
|
}
|
|
1704
1719
|
function mergeMatrixWithSkills(categories, relationships, skills) {
|
|
@@ -2429,7 +2444,7 @@ async function detectInstallation(projectDir = process.cwd()) {
|
|
|
2429
2444
|
|
|
2430
2445
|
// src/cli/lib/installation/local-installer.ts
|
|
2431
2446
|
init_esm_shims();
|
|
2432
|
-
import
|
|
2447
|
+
import os8 from "os";
|
|
2433
2448
|
import path20 from "path";
|
|
2434
2449
|
|
|
2435
2450
|
// src/cli/lib/skills/index.ts
|
|
@@ -3386,6 +3401,7 @@ Stack plugin compiled: ${result.stackName}`);
|
|
|
3386
3401
|
// src/cli/utils/exec.ts
|
|
3387
3402
|
init_esm_shims();
|
|
3388
3403
|
import { spawn } from "child_process";
|
|
3404
|
+
import os7 from "os";
|
|
3389
3405
|
var MAX_PLUGIN_PATH_LENGTH = 1024;
|
|
3390
3406
|
var MAX_PLUGIN_NAME_LENGTH = 256;
|
|
3391
3407
|
var MAX_MARKETPLACE_SOURCE_LENGTH = 1024;
|
|
@@ -3476,10 +3492,14 @@ async function execCommand(command, args, options) {
|
|
|
3476
3492
|
});
|
|
3477
3493
|
});
|
|
3478
3494
|
}
|
|
3495
|
+
function resolvePluginCwd(scope, projectDir) {
|
|
3496
|
+
return scope === "user" ? os7.homedir() : projectDir;
|
|
3497
|
+
}
|
|
3479
3498
|
async function claudePluginInstall(pluginPath, scope, projectDir) {
|
|
3480
3499
|
validatePluginPath(pluginPath);
|
|
3500
|
+
const cwd = resolvePluginCwd(scope, projectDir);
|
|
3481
3501
|
const args = ["plugin", "install", pluginPath, "--scope", scope];
|
|
3482
|
-
const result = await execCommand("claude", args, { cwd
|
|
3502
|
+
const result = await execCommand("claude", args, { cwd });
|
|
3483
3503
|
if (result.exitCode !== 0) {
|
|
3484
3504
|
const errorMessage = result.stderr || result.stdout || "Unknown error";
|
|
3485
3505
|
throw new Error(`Plugin installation failed: ${errorMessage.trim()}`);
|
|
@@ -3538,8 +3558,9 @@ async function claudePluginMarketplaceAdd(source) {
|
|
|
3538
3558
|
}
|
|
3539
3559
|
async function claudePluginUninstall(pluginName, scope, projectDir) {
|
|
3540
3560
|
validatePluginName(pluginName);
|
|
3561
|
+
const cwd = resolvePluginCwd(scope, projectDir);
|
|
3541
3562
|
const args = ["plugin", "uninstall", pluginName, "--scope", scope];
|
|
3542
|
-
const result = await execCommand("claude", args, { cwd
|
|
3563
|
+
const result = await execCommand("claude", args, { cwd });
|
|
3543
3564
|
if (result.exitCode !== 0) {
|
|
3544
3565
|
const errorMessage = result.stderr || result.stdout || "Unknown error";
|
|
3545
3566
|
if (errorMessage.includes("not installed") || errorMessage.includes("not found")) {
|
|
@@ -3551,7 +3572,7 @@ async function claudePluginUninstall(pluginName, scope, projectDir) {
|
|
|
3551
3572
|
|
|
3552
3573
|
// src/cli/lib/installation/local-installer.ts
|
|
3553
3574
|
function resolveInstallPaths(projectDir, scope = "project") {
|
|
3554
|
-
const baseDir = scope === "global" ?
|
|
3575
|
+
const baseDir = scope === "global" ? os8.homedir() : projectDir;
|
|
3555
3576
|
return {
|
|
3556
3577
|
skillsDir: path20.join(baseDir, LOCAL_SKILLS_PATH),
|
|
3557
3578
|
agentsDir: path20.join(baseDir, CLAUDE_DIR, "agents"),
|
|
@@ -3729,7 +3750,7 @@ async function writeStandaloneConfigTypes(configPath, matrix2, agents, finalConf
|
|
|
3729
3750
|
async function writeProjectConfigTypes(projectConfigPath, projectDir, projectConfig, matrix2) {
|
|
3730
3751
|
const typesPath = path20.join(path20.dirname(projectConfigPath), STANDARD_FILES.CONFIG_TYPES_TS);
|
|
3731
3752
|
const projectClaudeSrc = path20.join(projectDir, CLAUDE_SRC_DIR);
|
|
3732
|
-
const globalClaudeSrc = path20.join(
|
|
3753
|
+
const globalClaudeSrc = path20.join(os8.homedir(), CLAUDE_SRC_DIR);
|
|
3733
3754
|
const relativePath = path20.relative(projectClaudeSrc, globalClaudeSrc);
|
|
3734
3755
|
const globalTypesImportPath = relativePath.split(path20.sep).join("/");
|
|
3735
3756
|
const projectSkillIds = projectConfig?.skills.map((s) => s.id) ?? [];
|
|
@@ -3766,7 +3787,7 @@ async function writeProjectConfigTypes(projectConfigPath, projectDir, projectCon
|
|
|
3766
3787
|
verbose("Using project config-types.ts that imports from global");
|
|
3767
3788
|
}
|
|
3768
3789
|
async function writeScopedConfigs(finalConfig, matrix2, agents, projectDir, projectConfigPath) {
|
|
3769
|
-
const homeDir =
|
|
3790
|
+
const homeDir = os8.homedir();
|
|
3770
3791
|
const isProjectContext = path20.resolve(projectDir) !== path20.resolve(homeDir);
|
|
3771
3792
|
if (!isProjectContext) {
|
|
3772
3793
|
await writeConfigFile(finalConfig, projectConfigPath);
|
|
@@ -3783,7 +3804,7 @@ async function writeScopedConfigs(finalConfig, matrix2, agents, projectDir, proj
|
|
|
3783
3804
|
await ensureDir(path20.dirname(projectConfigPath));
|
|
3784
3805
|
await writeConfigFile(projectSplitConfig, projectConfigPath, { isProjectConfig: true });
|
|
3785
3806
|
verbose(`Updated project config at ${projectConfigPath}`);
|
|
3786
|
-
await writeProjectConfigTypes(projectConfigPath, projectDir,
|
|
3807
|
+
await writeProjectConfigTypes(projectConfigPath, projectDir, projectSplitConfig, matrix2);
|
|
3787
3808
|
}
|
|
3788
3809
|
async function compileAndWriteAgents(compileConfig, agents, localSkills, sourceResult, projectDir, agentsDir, installMode, agentScopeMap) {
|
|
3789
3810
|
const engine = await createLiquidEngine(projectDir);
|
|
@@ -3793,7 +3814,7 @@ async function compileAndWriteAgents(compileConfig, agents, localSkills, sourceR
|
|
|
3793
3814
|
compileConfig,
|
|
3794
3815
|
sourceResult.sourcePath
|
|
3795
3816
|
);
|
|
3796
|
-
const globalAgentsDir = path20.join(
|
|
3817
|
+
const globalAgentsDir = path20.join(os8.homedir(), CLAUDE_DIR, "agents");
|
|
3797
3818
|
const compiledAgentNames = [];
|
|
3798
3819
|
for (const [name, agent] of typedEntries(resolvedAgents)) {
|
|
3799
3820
|
const output = await compileAgentForPlugin(
|
|
@@ -4012,7 +4033,7 @@ init_esm_shims();
|
|
|
4012
4033
|
// src/cli/lib/plugins/plugin-settings.ts
|
|
4013
4034
|
init_esm_shims();
|
|
4014
4035
|
import path22 from "path";
|
|
4015
|
-
import
|
|
4036
|
+
import os9 from "os";
|
|
4016
4037
|
import { z as z2 } from "zod";
|
|
4017
4038
|
var pluginSettingsSchema = z2.object({
|
|
4018
4039
|
enabledPlugins: z2.record(z2.string(), z2.unknown()).optional()
|
|
@@ -4063,7 +4084,7 @@ async function resolvePluginInstallPaths(pluginKeys, projectDir) {
|
|
|
4063
4084
|
if (pluginKeys.length === 0) {
|
|
4064
4085
|
return [];
|
|
4065
4086
|
}
|
|
4066
|
-
const registryPath = path22.join(
|
|
4087
|
+
const registryPath = path22.join(os9.homedir(), CLAUDE_DIR, PLUGINS_SUBDIR, INSTALLED_PLUGINS_FILE);
|
|
4067
4088
|
if (!await fileExists(registryPath)) {
|
|
4068
4089
|
verbose(`Plugin registry not found at '${registryPath}'`);
|
|
4069
4090
|
return [];
|
|
@@ -5158,7 +5179,7 @@ async function loadSkillsMatrixFromSource(options = {}) {
|
|
|
5158
5179
|
}
|
|
5159
5180
|
const resolvedProjectDir = projectDir || process.cwd();
|
|
5160
5181
|
let localSkillsResult = await discoverLocalSkills(resolvedProjectDir);
|
|
5161
|
-
const homeDir =
|
|
5182
|
+
const homeDir = os10.homedir();
|
|
5162
5183
|
if ((!localSkillsResult || localSkillsResult.skills.length === 0) && resolvedProjectDir !== homeDir) {
|
|
5163
5184
|
localSkillsResult = await discoverLocalSkills(homeDir);
|
|
5164
5185
|
}
|
|
@@ -5482,4 +5503,4 @@ export {
|
|
|
5482
5503
|
validateAllPlugins,
|
|
5483
5504
|
printPluginValidationResult
|
|
5484
5505
|
};
|
|
5485
|
-
//# sourceMappingURL=chunk-
|
|
5506
|
+
//# sourceMappingURL=chunk-ZD3U734W.js.map
|