agents-inc 0.170.1 → 0.170.2
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 +9 -0
- package/dist/{chunk-BMRUNMPV.js → chunk-2YA4DDRM.js} +35 -35
- package/dist/chunk-2YA4DDRM.js.map +1 -0
- package/dist/{chunk-44TE3RKH.js → chunk-3ED3KHHD.js} +5 -4
- package/dist/chunk-3ED3KHHD.js.map +1 -0
- package/dist/{chunk-3G7X2WKI.js → chunk-5BNX73OU.js} +18 -38
- package/dist/chunk-5BNX73OU.js.map +1 -0
- package/dist/{chunk-7RDMTR64.js → chunk-66AEVERM.js} +785 -256
- package/dist/chunk-66AEVERM.js.map +1 -0
- package/dist/{chunk-PJWGTNOX.js → chunk-7C3PFRBU.js} +144 -186
- package/dist/chunk-7C3PFRBU.js.map +1 -0
- package/dist/{chunk-52HDHJ7I.js → chunk-AUNRHWH4.js} +32 -21
- package/dist/chunk-AUNRHWH4.js.map +1 -0
- package/dist/{chunk-KOLDW6SF.js → chunk-BBDGYJHX.js} +2 -2
- package/dist/chunk-BBDGYJHX.js.map +1 -0
- package/dist/{chunk-SZYQISA2.js → chunk-ELV5WDS3.js} +43 -29
- package/dist/chunk-ELV5WDS3.js.map +1 -0
- package/dist/{chunk-MQ6CGZNJ.js → chunk-GAKVZNTX.js} +1879 -2019
- package/dist/chunk-GAKVZNTX.js.map +1 -0
- package/dist/chunk-GEMW5RQ2.js +1169 -0
- package/dist/chunk-GEMW5RQ2.js.map +1 -0
- package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
- package/dist/chunk-GHHJYNAN.js.map +1 -0
- package/dist/{chunk-WTWMGH2C.js → chunk-HACRR422.js} +2 -2
- package/dist/chunk-HACRR422.js.map +1 -0
- package/dist/{chunk-F2BHT5C4.js → chunk-IWY5IR4F.js} +129 -151
- package/dist/chunk-IWY5IR4F.js.map +1 -0
- package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
- package/dist/chunk-KIK5EZYD.js.map +1 -0
- package/dist/{chunk-USVBYQSQ.js → chunk-O4LN3HFI.js} +16 -6
- package/dist/chunk-O4LN3HFI.js.map +1 -0
- package/dist/{chunk-RIPSGNLU.js → chunk-OCAVW6N5.js} +3 -3
- package/dist/chunk-OCAVW6N5.js.map +1 -0
- package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
- package/dist/chunk-P6CYS4JK.js.map +1 -0
- package/dist/chunk-PLFANHRZ.js +35 -0
- package/dist/chunk-PLFANHRZ.js.map +1 -0
- package/dist/{chunk-6ZRH5RHC.js → chunk-PMUZR4XO.js} +4 -4
- package/dist/chunk-PMUZR4XO.js.map +1 -0
- package/dist/{chunk-F5EBEATU.js → chunk-PSUTNOQ2.js} +34 -46
- package/dist/chunk-PSUTNOQ2.js.map +1 -0
- package/dist/chunk-RIK45Q4I.js +103 -0
- package/dist/chunk-RIK45Q4I.js.map +1 -0
- package/dist/{chunk-HED2DAXZ.js → chunk-THO7LO5B.js} +5 -5
- package/dist/chunk-THO7LO5B.js.map +1 -0
- package/dist/{chunk-OYJQUA3D.js → chunk-YGDWHDOY.js} +31 -13
- package/dist/chunk-YGDWHDOY.js.map +1 -0
- package/dist/{chunk-NCWDK6L7.js → chunk-YXKTY5WM.js} +254 -379
- package/dist/chunk-YXKTY5WM.js.map +1 -0
- package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
- package/dist/chunk-ZEGM3MVR.js.map +1 -0
- package/dist/commands/build/marketplace.js +46 -46
- package/dist/commands/build/marketplace.js.map +1 -1
- package/dist/commands/build/plugins.js +25 -28
- package/dist/commands/build/plugins.js.map +1 -1
- package/dist/commands/compile.js +87 -178
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.js +510 -360
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +451 -357
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/eject.js +144 -125
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +20 -27
- package/dist/commands/list.js +39 -55
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/new/marketplace.js +6 -11
- package/dist/commands/new/marketplace.js.map +1 -1
- package/dist/commands/search.js +35 -32
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +17 -77
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/uninstall.js +159 -222
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +9 -32
- package/dist/commands/update.js.map +1 -1
- package/dist/components/common/prompt-confirm.js +2 -2
- package/dist/components/common/removal-plan-confirm.js +2 -2
- package/dist/components/common/scroll-affordance.js +2 -2
- package/dist/components/common/select-list.js +2 -2
- package/dist/components/common/skill-agent-summary.js +4 -4
- package/dist/components/common/spinner.js +2 -4
- package/dist/components/common/summary-panel.js +5 -5
- package/dist/components/common/summary-panel.js.map +1 -1
- package/dist/config-exports.js +7 -3
- package/dist/config-exports.js.map +1 -1
- package/dist/hooks/init.js +18 -19
- package/dist/hooks/init.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/load-agent-defs-6QUUMGHK.js +14 -0
- package/dist/recompile-project-agents-I33KQJFB.js +65 -0
- package/dist/recompile-project-agents-I33KQJFB.js.map +1 -0
- package/dist/{source-loader-C5SQXZXI.js → source-loader-TTJVW2ER.js} +5 -5
- package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
- package/dist/src/agents/developer/api-developer/playbook.md +2 -5
- package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
- package/dist/src/agents/developer/web-developer/playbook.md +2 -5
- package/dist/src/agents/meta/agent-summoner/output.md +2 -2
- package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
- package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
- package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
- package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
- package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/api-tester/playbook.md +2 -0
- package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
- package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
- package/dist/src/agents/tester/web-tester/playbook.md +2 -0
- package/package.json +9 -8
- package/src/agents/developer/ai-developer/playbook.md +2 -5
- package/src/agents/developer/api-developer/playbook.md +2 -5
- package/src/agents/developer/cli-developer/playbook.md +2 -5
- package/src/agents/developer/web-developer/playbook.md +2 -5
- package/src/agents/meta/agent-summoner/output.md +2 -2
- package/src/agents/meta/agent-summoner/playbook.md +1 -13
- package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
- package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
- package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
- package/src/agents/tester/ai-tester/playbook.md +2 -0
- package/src/agents/tester/api-tester/critical-requirements.md +1 -2
- package/src/agents/tester/api-tester/playbook.md +2 -0
- package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
- package/src/agents/tester/cli-tester/playbook.md +2 -0
- package/src/agents/tester/web-tester/critical-requirements.md +1 -2
- package/src/agents/tester/web-tester/playbook.md +2 -0
- package/src/schemas/project-config.schema.json +0 -3
- package/src/schemas/project-source-config.schema.json +0 -6
- package/dist/chunk-3G7X2WKI.js.map +0 -1
- package/dist/chunk-44TE3RKH.js.map +0 -1
- package/dist/chunk-4AAOOAIN.js.map +0 -1
- package/dist/chunk-52HDHJ7I.js.map +0 -1
- package/dist/chunk-6HNXYYVF.js +0 -373
- package/dist/chunk-6HNXYYVF.js.map +0 -1
- package/dist/chunk-6ZRH5RHC.js.map +0 -1
- package/dist/chunk-7RDMTR64.js.map +0 -1
- package/dist/chunk-BMRUNMPV.js.map +0 -1
- package/dist/chunk-CLPUWOSA.js +0 -46
- package/dist/chunk-CLPUWOSA.js.map +0 -1
- package/dist/chunk-F2BHT5C4.js.map +0 -1
- package/dist/chunk-F5EBEATU.js.map +0 -1
- package/dist/chunk-HED2DAXZ.js.map +0 -1
- package/dist/chunk-JFLVEFFP.js.map +0 -1
- package/dist/chunk-KOLDW6SF.js.map +0 -1
- package/dist/chunk-MQ6CGZNJ.js.map +0 -1
- package/dist/chunk-NCWDK6L7.js.map +0 -1
- package/dist/chunk-NEZ4OAOL.js.map +0 -1
- package/dist/chunk-NIHUOWE4.js +0 -106
- package/dist/chunk-NIHUOWE4.js.map +0 -1
- package/dist/chunk-NQW25DCF.js.map +0 -1
- package/dist/chunk-OYJQUA3D.js.map +0 -1
- package/dist/chunk-PJWGTNOX.js.map +0 -1
- package/dist/chunk-RIPSGNLU.js.map +0 -1
- package/dist/chunk-SZYQISA2.js.map +0 -1
- package/dist/chunk-USVBYQSQ.js.map +0 -1
- package/dist/chunk-V3KTSP3Q.js +0 -940
- package/dist/chunk-V3KTSP3Q.js.map +0 -1
- package/dist/chunk-WTWMGH2C.js.map +0 -1
- package/dist/load-agent-defs-YMDWBFDP.js +0 -14
- package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
- package/dist/source-loader-C5SQXZXI.js.map +0 -1
- /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-6QUUMGHK.js.map} +0 -0
- /package/dist/{recompile-project-agents-SZ76WNTW.js.map → source-loader-TTJVW2ER.js.map} +0 -0
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
hostAt,
|
|
7
7
|
loadInstalledConfig,
|
|
8
8
|
refuseUnofferedPlacements
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-GAKVZNTX.js";
|
|
10
10
|
|
|
11
11
|
// src/cli/lib/hosts/configured-placements.ts
|
|
12
12
|
async function unofferablePlacementsFound(cwd) {
|
|
@@ -36,4 +36,4 @@ async function configuredSkillsAt(root) {
|
|
|
36
36
|
export {
|
|
37
37
|
unofferablePlacementsFound
|
|
38
38
|
};
|
|
39
|
-
//# sourceMappingURL=chunk-
|
|
39
|
+
//# sourceMappingURL=chunk-HACRR422.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/hosts/configured-placements.ts"],"sourcesContent":["/**\n * The placement refusal on the read path: `config.ts` carries no provider, so a config copied into\n * another provider's folder never met that host's pre-flight. Not run by `uninstall`, which must\n * still be able to remove such an installation.\n */\n\nimport {\n ConfigLoadError,\n configDirsInPlay,\n loadInstalledConfig,\n} from \"../configuration/project-config.js\";\nimport { getErrorMessage } from \"../../utils/errors.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { hostAt } from \"./host-for.js\";\nimport { refuseUnofferedPlacements } from \"./offered-placements.js\";\n\n/** Both scopes, each asked of its OWN host: the two scopes can be on different providers. */\nexport async function unofferablePlacementsFound(cwd: string): Promise<string[]> {\n const findings = await Promise.all(configDirsInPlay(cwd).map(unofferablePlacementIn));\n return findings.filter((finding): finding is string => finding !== null);\n}\n\nasync function unofferablePlacementIn(root: string): Promise<string | null> {\n const skills = await configuredSkillsAt(root);\n if (skills === null) return null;\n\n try {\n refuseUnofferedPlacements(skills, hostAt(root));\n return null;\n } catch (error) {\n return getErrorMessage(error);\n }\n}\n\n/** Degrades on `ConfigLoadError` only, which `ensureConfigReadable` and doctor report by name. */\nasync function configuredSkillsAt(root: string): Promise<SkillConfig[] | null> {\n try {\n const loaded = await loadInstalledConfig(root);\n return loaded?.config.skills ?? null;\n } catch (error) {\n if (error instanceof ConfigLoadError) return null;\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;;AAiBA,eAAsB,2BAA2B,KAAgC;AAC/E,QAAM,WAAW,MAAM,QAAQ,IAAI,iBAAiB,GAAG,EAAE,IAAI,sBAAsB,CAAC;AACpF,SAAO,SAAS,OAAO,CAAC,YAA+B,YAAY,IAAI;AACzE;AAEA,eAAe,uBAAuB,MAAsC;AAC1E,QAAM,SAAS,MAAM,mBAAmB,IAAI;AAC5C,MAAI,WAAW,KAAM,QAAO;AAE5B,MAAI;AACF,8BAA0B,QAAQ,OAAO,IAAI,CAAC;AAC9C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AACF;AAGA,eAAe,mBAAmB,MAA6C;AAC7E,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB,IAAI;AAC7C,WAAO,QAAQ,OAAO,UAAU;AAAA,EAClC,SAAS,OAAO;AACd,QAAI,iBAAiB,gBAAiB,QAAO;AAC7C,UAAM;AAAA,EACR;AACF;","names":[]}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
loadAgentDefs
|
|
4
|
-
} from "./chunk-HED2DAXZ.js";
|
|
5
2
|
import {
|
|
6
3
|
pruneStaleCompiledAgents,
|
|
7
4
|
recompileAgents
|
|
8
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-2YA4DDRM.js";
|
|
9
6
|
import {
|
|
10
7
|
agentCodec,
|
|
11
8
|
buildAgentScopeMap,
|
|
@@ -27,97 +24,17 @@ import {
|
|
|
27
24
|
sayingEachWarningOnce,
|
|
28
25
|
skillsDir,
|
|
29
26
|
skillsPathPrefix,
|
|
27
|
+
typedEntries,
|
|
28
|
+
typedKeys,
|
|
30
29
|
verbose
|
|
31
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-GAKVZNTX.js";
|
|
32
31
|
import {
|
|
33
32
|
initializeMatrix,
|
|
34
|
-
matrix
|
|
35
|
-
|
|
36
|
-
typedKeys
|
|
37
|
-
} from "./chunk-52HDHJ7I.js";
|
|
33
|
+
matrix
|
|
34
|
+
} from "./chunk-AUNRHWH4.js";
|
|
38
35
|
import {
|
|
39
36
|
globalInstallRoot
|
|
40
|
-
} from "./chunk-
|
|
41
|
-
|
|
42
|
-
// src/cli/lib/operations/project/remove-compiled-agents.ts
|
|
43
|
-
import path from "path";
|
|
44
|
-
var AGENT_FILE_EXTENSION = ".md";
|
|
45
|
-
async function removeCompiledAgents(options) {
|
|
46
|
-
const outcomes = await Promise.all(
|
|
47
|
-
options.agents.map((name) => removeCompiledAgentFile(options.agentsDir, name))
|
|
48
|
-
);
|
|
49
|
-
await tidyEmptiedAgentsDir(options.agentsDir);
|
|
50
|
-
return {
|
|
51
|
-
removed: outcomes.flatMap((outcome) => outcome.ok ? [outcome.name] : []),
|
|
52
|
-
failed: outcomes.flatMap(
|
|
53
|
-
(outcome) => outcome.ok ? [] : [{ name: outcome.name, error: outcome.error }]
|
|
54
|
-
)
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
async function pruneCompiledAgents(options) {
|
|
58
|
-
await pruneStaleCompiledAgents(options.agentsDir, options.keep, options.codec);
|
|
59
|
-
await tidyEmptiedAgentsDir(options.agentsDir);
|
|
60
|
-
}
|
|
61
|
-
async function removeCompiledAgentFile(agentsDir, name) {
|
|
62
|
-
try {
|
|
63
|
-
await remove(path.join(agentsDir, `${name}${AGENT_FILE_EXTENSION}`));
|
|
64
|
-
return { name, ok: true };
|
|
65
|
-
} catch (error) {
|
|
66
|
-
return { name, ok: false, error: getErrorMessage(error) };
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async function tidyEmptiedAgentsDir(agentsDir) {
|
|
70
|
-
await removeDirIfEmpty(agentsDir);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// src/cli/lib/operations/project/compile-agents.ts
|
|
74
|
-
async function compileAgents(options) {
|
|
75
|
-
const { agents: resolvedAgents, agentScopeMap: resolvedAgentScopeMap } = options.scopeFilter ? await rosterForScope(options, options.scopeFilter) : { agents: options.agents, agentScopeMap: options.agentScopeMap };
|
|
76
|
-
const recompileResult = await recompileAgents({
|
|
77
|
-
pluginDir: options.pluginDir ?? options.projectDir,
|
|
78
|
-
sourcePath: options.sourcePath,
|
|
79
|
-
...resolvedAgents !== void 0 && { agents: resolvedAgents },
|
|
80
|
-
...options.skills !== void 0 && { skills: options.skills },
|
|
81
|
-
projectDir: options.projectDir,
|
|
82
|
-
...options.outputDir !== void 0 && { outputDir: options.outputDir },
|
|
83
|
-
...resolvedAgentScopeMap !== void 0 && { agentScopeMap: resolvedAgentScopeMap }
|
|
84
|
-
});
|
|
85
|
-
await pruneStaleAgentsForPass(options, recompileResult);
|
|
86
|
-
return {
|
|
87
|
-
compiled: recompileResult.compiled,
|
|
88
|
-
rewritten: recompileResult.rewritten,
|
|
89
|
-
failed: recompileResult.failed,
|
|
90
|
-
warnings: recompileResult.warnings
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
async function rosterForScope(options, scope) {
|
|
94
|
-
const config = (await loadInstalledConfig(options.projectDir))?.config;
|
|
95
|
-
const activeAtScope = config?.agents.filter((agent) => !agent.excluded && agent.scope === scope).map((agent) => agent.name);
|
|
96
|
-
return {
|
|
97
|
-
agents: requestedAgentsAmong(options.agents, activeAtScope),
|
|
98
|
-
agentScopeMap: options.agentScopeMap ?? (config ? buildAgentScopeMap(config) : void 0)
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
function requestedAgentsAmong(requested, activeAtScope) {
|
|
102
|
-
if (activeAtScope === void 0) return requested;
|
|
103
|
-
if (requested === void 0) return activeAtScope;
|
|
104
|
-
const atScope = new Set(activeAtScope);
|
|
105
|
-
return requested.filter((name) => atScope.has(name));
|
|
106
|
-
}
|
|
107
|
-
async function pruneStaleAgentsForPass(options, recompileResult) {
|
|
108
|
-
if (options.scopeFilter || !options.outputDir) return;
|
|
109
|
-
const compiledForDir = /* @__PURE__ */ new Set([
|
|
110
|
-
...recompileResult.compiled,
|
|
111
|
-
...recompileResult.failed
|
|
112
|
-
]);
|
|
113
|
-
await pruneCompiledAgents({
|
|
114
|
-
agentsDir: options.outputDir,
|
|
115
|
-
keep: compiledForDir,
|
|
116
|
-
// The host this installation compiles for — a Codex role is a `.toml`, and a prune that only
|
|
117
|
-
// knew `.md` left a deselected role in place for Codex to keep offering (CLI-896's sibling).
|
|
118
|
-
codec: agentCodec(providerInUse(options.projectDir))
|
|
119
|
-
});
|
|
120
|
-
}
|
|
37
|
+
} from "./chunk-7C3PFRBU.js";
|
|
121
38
|
|
|
122
39
|
// src/cli/lib/operations/skills/discover-skills.ts
|
|
123
40
|
var NO_LOCAL_SKILLS = { skills: {}, unusableMetadata: [] };
|
|
@@ -149,37 +66,58 @@ function mergeSkills(...skillSources) {
|
|
|
149
66
|
}
|
|
150
67
|
async function discoverInstalledSkills(projectDir) {
|
|
151
68
|
const isGlobalProject = isHomeDirectory(projectDir);
|
|
152
|
-
const
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
verbose(` Found ${globalPluginSkillCount} skills from global plugins`);
|
|
156
|
-
}
|
|
157
|
-
const globalLocal = isGlobalProject ? NO_LOCAL_SKILLS : await discoverLocalProjectSkills(projectDir, "global");
|
|
158
|
-
const globalLocalSkillCount = typedKeys(globalLocal.skills).length;
|
|
159
|
-
if (globalLocalSkillCount > 0) {
|
|
160
|
-
verbose(` Found ${globalLocalSkillCount} global local skills from ${globalSkillsRoot()}`);
|
|
161
|
-
}
|
|
162
|
-
const pluginSkills = await discoverAllPluginSkills(projectDir);
|
|
163
|
-
const pluginSkillCount = typedKeys(pluginSkills).length;
|
|
164
|
-
verbose(` Found ${pluginSkillCount} skills from installed plugins`);
|
|
69
|
+
const globalPlugins = isGlobalProject ? {} : await discoverGlobalPluginSkills();
|
|
70
|
+
const globalLocal = isGlobalProject ? NO_LOCAL_SKILLS : await discoverGlobalLocalSkills(projectDir);
|
|
71
|
+
const projectPlugins = await discoverProjectPluginSkills(projectDir);
|
|
165
72
|
const localScope = isGlobalProject ? "global" : "project";
|
|
166
|
-
const
|
|
167
|
-
|
|
73
|
+
const projectLocal = await discoverLocalSkillsAt(projectDir, localScope);
|
|
74
|
+
return assembleDiscoveredSkills({ globalPlugins, globalLocal, projectPlugins, projectLocal });
|
|
75
|
+
}
|
|
76
|
+
async function discoverGlobalPluginSkills() {
|
|
77
|
+
const skills = await discoverAllPluginSkills(globalInstallRoot());
|
|
78
|
+
const count = skillCount(skills);
|
|
79
|
+
if (count > 0) verbose(` Found ${count} skills from global plugins`);
|
|
80
|
+
return skills;
|
|
81
|
+
}
|
|
82
|
+
async function discoverGlobalLocalSkills(projectDir) {
|
|
83
|
+
const loaded = await discoverLocalProjectSkills(projectDir, "global");
|
|
84
|
+
const count = skillCount(loaded.skills);
|
|
85
|
+
if (count > 0) verbose(` Found ${count} global local skills from ${globalSkillsRoot()}`);
|
|
86
|
+
return loaded;
|
|
87
|
+
}
|
|
88
|
+
async function discoverProjectPluginSkills(projectDir) {
|
|
89
|
+
const skills = await discoverAllPluginSkills(projectDir);
|
|
90
|
+
verbose(` Found ${skillCount(skills)} skills from installed plugins`);
|
|
91
|
+
return skills;
|
|
92
|
+
}
|
|
93
|
+
async function discoverLocalSkillsAt(projectDir, scope) {
|
|
94
|
+
const loaded = await discoverLocalProjectSkills(projectDir, scope);
|
|
168
95
|
verbose(
|
|
169
|
-
` Found ${
|
|
96
|
+
` Found ${skillCount(loaded.skills)} local skills from ${projectSkillsRoot(projectDir, scope)}`
|
|
170
97
|
);
|
|
171
|
-
|
|
172
|
-
|
|
98
|
+
return loaded;
|
|
99
|
+
}
|
|
100
|
+
function assembleDiscoveredSkills(found) {
|
|
101
|
+
const { globalPlugins, globalLocal, projectPlugins, projectLocal } = found;
|
|
102
|
+
const allSkills = mergeSkills(
|
|
103
|
+
globalPlugins,
|
|
104
|
+
globalLocal.skills,
|
|
105
|
+
projectPlugins,
|
|
106
|
+
projectLocal.skills
|
|
107
|
+
);
|
|
108
|
+
const distinctPluginSkills = mergeSkills(globalPlugins, projectPlugins);
|
|
173
109
|
return {
|
|
174
110
|
allSkills,
|
|
175
|
-
totalSkillCount,
|
|
176
|
-
pluginSkillCount:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
unusableMetadata: [...globalLocal.unusableMetadata, ...local.unusableMetadata]
|
|
111
|
+
totalSkillCount: skillCount(allSkills),
|
|
112
|
+
pluginSkillCount: skillCount(distinctPluginSkills),
|
|
113
|
+
globalPluginSkillCount: skillCount(globalPlugins),
|
|
114
|
+
globalLocalSkillCount: skillCount(globalLocal.skills),
|
|
115
|
+
unusableMetadata: [...globalLocal.unusableMetadata, ...projectLocal.unusableMetadata]
|
|
181
116
|
};
|
|
182
117
|
}
|
|
118
|
+
function skillCount(skills) {
|
|
119
|
+
return typedKeys(skills).length;
|
|
120
|
+
}
|
|
183
121
|
|
|
184
122
|
// src/cli/lib/operations/skills/copy-local-skills.ts
|
|
185
123
|
async function copyScopedLocalSkills(scopeSkills, skillsDir2, sourceResult) {
|
|
@@ -249,41 +187,83 @@ async function withCatalogueSeatedFor(projectDir, body) {
|
|
|
249
187
|
}
|
|
250
188
|
}
|
|
251
189
|
|
|
252
|
-
// src/cli/lib/operations/project/
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
190
|
+
// src/cli/lib/operations/project/remove-compiled-agents.ts
|
|
191
|
+
import path from "path";
|
|
192
|
+
async function removeCompiledAgents(options) {
|
|
193
|
+
const outcomes = await Promise.all(
|
|
194
|
+
options.agents.map((name) => removeCompiledAgentFile(options.agentsDir, name))
|
|
195
|
+
);
|
|
196
|
+
await removeDirIfEmpty(options.agentsDir);
|
|
197
|
+
return {
|
|
198
|
+
removed: outcomes.flatMap((outcome) => outcome.ok ? [outcome.name] : []),
|
|
199
|
+
failed: outcomes.flatMap(
|
|
200
|
+
(outcome) => outcome.ok ? [] : [{ name: outcome.name, error: outcome.error }]
|
|
201
|
+
)
|
|
202
|
+
};
|
|
265
203
|
}
|
|
266
|
-
async function
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
warnings.push(...result.warnings);
|
|
277
|
-
continue;
|
|
278
|
-
}
|
|
279
|
-
if (result.rewritten.length > 0) rewrittenCount++;
|
|
280
|
-
else unchangedCount++;
|
|
281
|
-
} catch (error) {
|
|
282
|
-
failedCount++;
|
|
283
|
-
warnings.push(`Could not recompile agents in ${dir}: ${getErrorMessage(error)}`);
|
|
284
|
-
}
|
|
204
|
+
async function pruneCompiledAgents(options) {
|
|
205
|
+
await pruneStaleCompiledAgents(options.agentsDir, options.keep, options.codec);
|
|
206
|
+
await removeDirIfEmpty(options.agentsDir);
|
|
207
|
+
}
|
|
208
|
+
async function removeCompiledAgentFile(agentsDir, name) {
|
|
209
|
+
try {
|
|
210
|
+
await remove(path.join(agentsDir, `${name}${agentCodec("claude").extension}`));
|
|
211
|
+
return { name, ok: true };
|
|
212
|
+
} catch (error) {
|
|
213
|
+
return { name, ok: false, error: getErrorMessage(error) };
|
|
285
214
|
}
|
|
286
|
-
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// src/cli/lib/operations/project/compile-agents.ts
|
|
218
|
+
async function compileAgents(options) {
|
|
219
|
+
const roster = await rosterForPass(options);
|
|
220
|
+
const recompileResult = await recompileAgents({
|
|
221
|
+
pluginDir: options.pluginDir ?? options.projectDir,
|
|
222
|
+
sourcePath: options.sourcePath,
|
|
223
|
+
...roster.agents !== void 0 && { agents: roster.agents },
|
|
224
|
+
...options.skills !== void 0 && { skills: options.skills },
|
|
225
|
+
projectDir: options.projectDir,
|
|
226
|
+
...options.outputDir !== void 0 && { outputDir: options.outputDir },
|
|
227
|
+
...roster.agentScopeMap !== void 0 && { agentScopeMap: roster.agentScopeMap }
|
|
228
|
+
});
|
|
229
|
+
await pruneStaleAgentsForPass(options, recompileResult);
|
|
230
|
+
return {
|
|
231
|
+
compiled: recompileResult.compiled,
|
|
232
|
+
rewritten: recompileResult.rewritten,
|
|
233
|
+
failed: recompileResult.failed,
|
|
234
|
+
warnings: recompileResult.warnings
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
async function rosterForPass(options) {
|
|
238
|
+
if (!options.scopeFilter) return { agents: options.agents, agentScopeMap: options.agentScopeMap };
|
|
239
|
+
return rosterForScope(options, options.scopeFilter);
|
|
240
|
+
}
|
|
241
|
+
async function rosterForScope(options, scope) {
|
|
242
|
+
const config = (await loadInstalledConfig(options.projectDir))?.config;
|
|
243
|
+
const activeAtScope = config?.agents.filter((agent) => !agent.excluded && agent.scope === scope).map((agent) => agent.name);
|
|
244
|
+
return {
|
|
245
|
+
agents: requestedAgentsAmong(options.agents, activeAtScope),
|
|
246
|
+
agentScopeMap: options.agentScopeMap ?? (config ? buildAgentScopeMap(config) : void 0)
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function requestedAgentsAmong(requested, activeAtScope) {
|
|
250
|
+
if (activeAtScope === void 0) return requested;
|
|
251
|
+
if (requested === void 0) return activeAtScope;
|
|
252
|
+
const atScope = new Set(activeAtScope);
|
|
253
|
+
return requested.filter((name) => atScope.has(name));
|
|
254
|
+
}
|
|
255
|
+
async function pruneStaleAgentsForPass(options, recompileResult) {
|
|
256
|
+
if (options.scopeFilter || !options.outputDir) return;
|
|
257
|
+
const compiledForDir = /* @__PURE__ */ new Set([
|
|
258
|
+
...recompileResult.compiled,
|
|
259
|
+
...recompileResult.failed
|
|
260
|
+
]);
|
|
261
|
+
await pruneCompiledAgents({
|
|
262
|
+
agentsDir: options.outputDir,
|
|
263
|
+
keep: compiledForDir,
|
|
264
|
+
// A Codex role is a `.toml`, so the prune must know the host's extension.
|
|
265
|
+
codec: agentCodec(providerInUse(options.projectDir))
|
|
266
|
+
});
|
|
287
267
|
}
|
|
288
268
|
|
|
289
269
|
export {
|
|
@@ -292,8 +272,6 @@ export {
|
|
|
292
272
|
uninstallPluginSkills,
|
|
293
273
|
withCatalogueSeatedFor,
|
|
294
274
|
removeCompiledAgents,
|
|
295
|
-
compileAgents
|
|
296
|
-
recompileRegisteredProjectAgents,
|
|
297
|
-
recompilePropagatedProjectAgents
|
|
275
|
+
compileAgents
|
|
298
276
|
};
|
|
299
|
-
//# sourceMappingURL=chunk-
|
|
277
|
+
//# sourceMappingURL=chunk-IWY5IR4F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/operations/skills/discover-skills.ts","../src/cli/lib/operations/skills/copy-local-skills.ts","../src/cli/lib/operations/skills/uninstall-plugin-skills.ts","../src/cli/lib/loading/catalogue-seat.ts","../src/cli/lib/operations/project/remove-compiled-agents.ts","../src/cli/lib/operations/project/compile-agents.ts"],"sourcesContent":["import { discoverAllPluginSkills } from \"../../plugins/index.js\";\nimport { isHomeDirectory } from \"../../installation/is-home-directory.js\";\nimport { loadSkillsFromDir, type LoadedSkills } from \"../../loading/index.js\";\nimport { sayingEachWarningOnce, verbose } from \"../../../utils/logger.js\";\nimport { globalInstallRoot } from \"../../../consts.js\";\nimport {\n installBaseDir,\n providerInUse,\n skillsDir,\n skillsPathPrefix,\n} from \"../../installation/install-layout.js\";\nimport { typedEntries, typedKeys } from \"../../../utils/typed-object.js\";\nimport type { UnusableSkillMetadata } from \"../../loading/index.js\";\nimport type {\n SkillDefinition,\n SkillDefinitionMap,\n SkillId,\n SkillScope,\n} from \"../../../types/index.js\";\n\nexport type DiscoveredSkills = {\n allSkills: SkillDefinitionMap;\n totalSkillCount: number;\n pluginSkillCount: number;\n globalPluginSkillCount: number;\n globalLocalSkillCount: number;\n /** Skills whose metadata.yaml describes no skill; `compile` refuses over any entry. */\n unusableMetadata: UnusableSkillMetadata[];\n};\n\nconst NO_LOCAL_SKILLS: LoadedSkills = { skills: {}, unusableMetadata: [] };\n\n/**\n * Discovers copied-in (not plugin) skills at one scope. A global scan's warnings are said once per\n * run, since the fan-out asks for that one directory once per registered project.\n */\nasync function discoverLocalProjectSkills(\n projectDir: string,\n scope: SkillScope,\n): Promise<LoadedSkills> {\n const provider = providerInUse(installBaseDir(projectDir, scope));\n const scan = () =>\n loadSkillsFromDir(skillsDir(provider, scope, projectDir), {\n pathPrefix: skillsPathPrefix(provider, scope, projectDir),\n requireMetadata: true,\n });\n\n return scope === \"global\" ? sayingEachWarningOnce(scan) : scan();\n}\n\nfunction globalSkillsRoot(): string {\n const home = globalInstallRoot();\n return skillsDir(providerInUse(home), \"global\", home);\n}\n\nfunction projectSkillsRoot(projectDir: string, scope: SkillScope): string {\n return skillsDir(providerInUse(installBaseDir(projectDir, scope)), scope, projectDir);\n}\n\n/** Later sources win. */\nfunction 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/** Merges global plugins, global copied-in, project plugins, project copied-in; project wins. */\nexport async function discoverInstalledSkills(projectDir: string): Promise<DiscoveredSkills> {\n const isGlobalProject = isHomeDirectory(projectDir);\n\n const globalPlugins = isGlobalProject ? {} : await discoverGlobalPluginSkills();\n const globalLocal = isGlobalProject\n ? NO_LOCAL_SKILLS\n : await discoverGlobalLocalSkills(projectDir);\n const projectPlugins = await discoverProjectPluginSkills(projectDir);\n // At the home root both scopes are one installation, so ask the global scope only.\n const localScope: SkillScope = isGlobalProject ? \"global\" : \"project\";\n const projectLocal = await discoverLocalSkillsAt(projectDir, localScope);\n\n return assembleDiscoveredSkills({ globalPlugins, globalLocal, projectPlugins, projectLocal });\n}\n\nasync function discoverGlobalPluginSkills(): Promise<SkillDefinitionMap> {\n const skills = await discoverAllPluginSkills(globalInstallRoot());\n const count = skillCount(skills);\n if (count > 0) verbose(` Found ${count} skills from global plugins`);\n return skills;\n}\n\nasync function discoverGlobalLocalSkills(projectDir: string): Promise<LoadedSkills> {\n const loaded = await discoverLocalProjectSkills(projectDir, \"global\");\n const count = skillCount(loaded.skills);\n if (count > 0) verbose(` Found ${count} global local skills from ${globalSkillsRoot()}`);\n return loaded;\n}\n\nasync function discoverProjectPluginSkills(projectDir: string): Promise<SkillDefinitionMap> {\n const skills = await discoverAllPluginSkills(projectDir);\n verbose(` Found ${skillCount(skills)} skills from installed plugins`);\n return skills;\n}\n\nasync function discoverLocalSkillsAt(projectDir: string, scope: SkillScope): Promise<LoadedSkills> {\n const loaded = await discoverLocalProjectSkills(projectDir, scope);\n verbose(\n ` Found ${skillCount(loaded.skills)} local skills from ${projectSkillsRoot(projectDir, scope)}`,\n );\n return loaded;\n}\n\ntype SkillsByOrigin = {\n globalPlugins: SkillDefinitionMap;\n globalLocal: LoadedSkills;\n projectPlugins: SkillDefinitionMap;\n projectLocal: LoadedSkills;\n};\n\nfunction assembleDiscoveredSkills(found: SkillsByOrigin): DiscoveredSkills {\n const { globalPlugins, globalLocal, projectPlugins, projectLocal } = found;\n const allSkills = mergeSkills(\n globalPlugins,\n globalLocal.skills,\n projectPlugins,\n projectLocal.skills,\n );\n // A plugin installed at both scopes is listed by both, but is one skill.\n const distinctPluginSkills = mergeSkills(globalPlugins, projectPlugins);\n\n return {\n allSkills,\n totalSkillCount: skillCount(allSkills),\n pluginSkillCount: skillCount(distinctPluginSkills),\n globalPluginSkillCount: skillCount(globalPlugins),\n globalLocalSkillCount: skillCount(globalLocal.skills),\n unusableMetadata: [...globalLocal.unusableMetadata, ...projectLocal.unusableMetadata],\n };\n}\n\nfunction skillCount(skills: SkillDefinitionMap): number {\n return typedKeys<SkillId>(skills).length;\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\nasync function copyScopedLocalSkills(\n scopeSkills: SkillConfig[],\n skillsDir: string,\n sourceResult: SourceLoadResult,\n): Promise<CopiedSkill[]> {\n if (scopeSkills.length === 0) return [];\n\n await ensureDir(skillsDir);\n\n return copySkillsToLocalFlattened(\n scopeSkills.map((s) => s.id),\n skillsDir,\n sourceResult,\n );\n}\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 const projectCopied = await copyScopedLocalSkills(\n projectLocalSkills,\n projectPaths.skillsDir,\n sourceResult,\n );\n const globalCopied = await copyScopedLocalSkills(\n globalLocalSkills,\n globalPaths.skillsDir,\n sourceResult,\n );\n\n return {\n projectCopied,\n globalCopied,\n totalCopied: projectCopied.length + globalCopied.length,\n };\n}\n","import { hostAt } from \"../../hosts/host-for.js\";\nimport { buildMarketplacePluginRef } from \"../../plugins/index.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport type { SkillId } from \"../../../types/index.js\";\nimport type { SkillConfig, SkillScope } from \"../../../types/config.js\";\n\n/** The safe default: a project removal cannot take a plugin from every project under one HOME. */\nconst SCOPE_OF_AN_UNRECORDED_SKILL: SkillScope = \"project\";\n\nexport type PluginUninstallResult = {\n /** Only plugins the host reported `removed`; an already-absent plugin is not listed. */\n uninstalled: SkillId[];\n failed: Array<{ id: SkillId; error: string }>;\n};\n\nexport async function uninstallPluginSkills(\n skillIds: SkillId[],\n oldSkills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginUninstallResult> {\n const host = hostAt(projectDir);\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 ?? SCOPE_OF_AN_UNRECORDED_SKILL;\n const pluginRef = buildMarketplacePluginRef(skillId, marketplace);\n try {\n const outcome = await host.uninstallPlugin(pluginRef, pluginScope, projectDir);\n if (outcome === \"removed\") uninstalled.push(skillId);\n } catch (error) {\n failed.push({ id: skillId, error: getErrorMessage(error) });\n }\n }\n\n return { uninstalled, failed };\n}\n","import type { MergedSkillsMatrix } from \"../../types\";\nimport { initializeMatrix, matrix } from \"../matrix/matrix-provider.js\";\nimport { loadSkillsMatrixFromSource } from \"./source-loader.js\";\n\n/**\n * Runs `body` against `projectDir`'s own skills catalogue, then restores the caller's. The load\n * stays outside the `try`: a failed load seats nothing, so there is nothing to restore.\n */\nexport async function withCatalogueSeatedFor<T>(\n projectDir: string,\n body: (catalogue: MergedSkillsMatrix) => Promise<T>,\n): Promise<T> {\n const callersCatalogue = matrix;\n const { matrix: seated } = await loadSkillsMatrixFromSource({\n projectDir,\n purpose: \"upkeep\",\n skipExtraSources: true,\n matrixOnly: true,\n });\n try {\n return await body(seated);\n } finally {\n initializeMatrix(callersCatalogue);\n }\n}\n","import path from \"path\";\nimport { pruneStaleCompiledAgents } from \"../../agents/list-compiled-agents.js\";\nimport { type AgentCodec, agentCodec } from \"../../installation/install-layout.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport { remove, removeDirIfEmpty } from \"../../../utils/fs.js\";\nimport type { AgentName } from \"../../../types/index.js\";\n\nexport type RemoveCompiledAgentsOptions = {\n agentsDir: string;\n agents: readonly AgentName[];\n};\n\nexport type PruneCompiledAgentsOptions = {\n agentsDir: string;\n /** The COMPLETE set of agents that belong in `agentsDir`; every other compiled agent is stale. */\n keep: ReadonlySet<AgentName>;\n codec?: AgentCodec;\n};\n\nexport type RemoveCompiledAgentsResult = {\n /** An absent file counts as removed. */\n removed: AgentName[];\n failed: Array<{ name: AgentName; error: string }>;\n};\n\ntype RemovalOutcome = { name: AgentName; ok: true } | { name: AgentName; ok: false; error: string };\n\n/**\n * Also removes `agentsDir` when nothing at all is left in it; the `.claude/` above is uninstall's.\n */\nexport async function removeCompiledAgents(\n options: RemoveCompiledAgentsOptions,\n): Promise<RemoveCompiledAgentsResult> {\n const outcomes = await Promise.all(\n options.agents.map((name) => removeCompiledAgentFile(options.agentsDir, name)),\n );\n await removeDirIfEmpty(options.agentsDir);\n\n return {\n removed: outcomes.flatMap((outcome) => (outcome.ok ? [outcome.name] : [])),\n failed: outcomes.flatMap((outcome) =>\n outcome.ok ? [] : [{ name: outcome.name, error: outcome.error }],\n ),\n };\n}\n\n/** Hand-authored agents survive; the directory goes only when nothing at all remains. */\nexport async function pruneCompiledAgents(options: PruneCompiledAgentsOptions): Promise<void> {\n await pruneStaleCompiledAgents(options.agentsDir, options.keep, options.codec);\n await removeDirIfEmpty(options.agentsDir);\n}\n\nasync function removeCompiledAgentFile(\n agentsDir: string,\n name: AgentName,\n): Promise<RemovalOutcome> {\n try {\n await remove(path.join(agentsDir, `${name}${agentCodec(\"claude\").extension}`));\n return { name, ok: true };\n } catch (error) {\n return { name, ok: false, error: getErrorMessage(error) };\n }\n}\n","import { pruneCompiledAgents } from \"./remove-compiled-agents.js\";\nimport { recompileAgents } from \"../../agents/index.js\";\nimport { loadInstalledConfig } from \"../../configuration/index.js\";\nimport { buildAgentScopeMap } from \"../../installation/index.js\";\nimport { agentCodec, providerInUse } from \"../../installation/install-layout.js\";\nimport type { AgentName, SkillDefinitionMap, SkillScope } from \"../../../types/index.js\";\n\nexport type CompileAgentsOptions = {\n projectDir: string;\n sourcePath: string;\n pluginDir?: string;\n skills?: SkillDefinitionMap;\n agentScopeMap?: Map<AgentName, SkillScope>;\n agents?: AgentName[];\n scopeFilter?: SkillScope;\n outputDir?: string;\n};\n\nexport type CompilationResult = {\n compiled: AgentName[];\n /** The subset of `compiled` whose file this pass actually wrote. */\n rewritten: AgentName[];\n failed: AgentName[];\n warnings: string[];\n};\n\nexport async function compileAgents(options: CompileAgentsOptions): Promise<CompilationResult> {\n const roster = await rosterForPass(options);\n\n const recompileResult = await recompileAgents({\n pluginDir: options.pluginDir ?? options.projectDir,\n sourcePath: options.sourcePath,\n ...(roster.agents !== undefined && { agents: roster.agents }),\n ...(options.skills !== undefined && { skills: options.skills }),\n projectDir: options.projectDir,\n ...(options.outputDir !== undefined && { outputDir: options.outputDir }),\n ...(roster.agentScopeMap !== undefined && { agentScopeMap: roster.agentScopeMap }),\n });\n\n await pruneStaleAgentsForPass(options, recompileResult);\n\n return {\n compiled: recompileResult.compiled,\n rewritten: recompileResult.rewritten,\n failed: recompileResult.failed,\n warnings: recompileResult.warnings,\n };\n}\n\ntype PassRoster = {\n agents: AgentName[] | undefined;\n agentScopeMap: Map<AgentName, SkillScope> | undefined;\n};\n\nasync function rosterForPass(options: CompileAgentsOptions): Promise<PassRoster> {\n if (!options.scopeFilter) return { agents: options.agents, agentScopeMap: options.agentScopeMap };\n return rosterForScope(options, options.scopeFilter);\n}\n\nasync function rosterForScope(\n options: CompileAgentsOptions,\n scope: SkillScope,\n): Promise<PassRoster> {\n const config = (await loadInstalledConfig(options.projectDir))?.config;\n const activeAtScope = config?.agents\n .filter((agent) => !agent.excluded && agent.scope === scope)\n .map((agent) => agent.name);\n\n return {\n agents: requestedAgentsAmong(options.agents, activeAtScope),\n agentScopeMap: options.agentScopeMap ?? (config ? buildAgentScopeMap(config) : undefined),\n };\n}\n\nfunction requestedAgentsAmong(\n requested: AgentName[] | undefined,\n activeAtScope: AgentName[] | undefined,\n): AgentName[] | undefined {\n if (activeAtScope === undefined) return requested;\n if (requested === undefined) return activeAtScope;\n\n const atScope = new Set(activeAtScope);\n return requested.filter((name) => atScope.has(name));\n}\n\n/**\n * Only an unfiltered pass owns its whole `outputDir`, so only it prunes agents no longer compiled\n * there; a scope-filtered pass must never delete another scope's files.\n */\nasync function pruneStaleAgentsForPass(\n options: CompileAgentsOptions,\n recompileResult: CompilationResult,\n): Promise<void> {\n if (options.scopeFilter || !options.outputDir) return;\n\n const compiledForDir = new Set<AgentName>([\n ...recompileResult.compiled,\n ...recompileResult.failed,\n ]);\n await pruneCompiledAgents({\n agentsDir: options.outputDir,\n keep: compiledForDir,\n // A Codex role is a `.toml`, so the prune must know the host's extension.\n codec: agentCodec(providerInUse(options.projectDir)),\n });\n}\n"],"mappings":"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","names":["skillsDir"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/render.ts"],"sourcesContent":["import { render as inkRender, type Instance, type RenderOptions } from \"ink\";\nimport type { ReactNode } from \"react\";\n\n/**\n * Ink checks CI env vars before the stream and, under CI, paints nothing until exit — fatal for a\n * prompt on a real TTY. A TTY therefore forces `interactive: true`; a caller's value still wins.\n */\nexport function render(node: ReactNode, options?: RenderOptions): Instance {\n const stdout = options?.stdout ?? process.stdout;\n return inkRender(node, {\n ...(stdout.isTTY && { interactive: true }),\n ...options,\n });\n}\n"],"mappings":";;;AAAA,SAAS,UAAU,iBAAoD;AAOhE,SAAS,OAAO,MAAiB,SAAmC;AACzE,QAAM,SAAS,SAAS,UAAU,QAAQ;AAC1C,SAAO,UAAU,MAAM;AAAA,IACrB,GAAI,OAAO,SAAS,EAAE,aAAa,KAAK;AAAA,IACxC,GAAG;AAAA,EACL,CAAC;AACH;","names":[]}
|
|
@@ -4,32 +4,41 @@ import {
|
|
|
4
4
|
} from "./chunk-OZXAJNLA.js";
|
|
5
5
|
import {
|
|
6
6
|
CLI_COLORS
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7C3PFRBU.js";
|
|
8
8
|
|
|
9
9
|
// src/cli/components/common/removal-plan-confirm.tsx
|
|
10
10
|
import "react";
|
|
11
11
|
import { Box, Text, useApp } from "ink";
|
|
12
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
13
13
|
var ITEM_INDENT = 3;
|
|
14
14
|
var RemovalPlanConfirm = ({
|
|
15
15
|
heading,
|
|
16
16
|
sections,
|
|
17
|
+
overwritten,
|
|
17
18
|
statements,
|
|
18
19
|
message,
|
|
19
20
|
onConfirm,
|
|
20
21
|
onCancel
|
|
21
22
|
}) => {
|
|
22
23
|
const { exit } = useApp();
|
|
24
|
+
const opensTheFrame = heading === void 0 && sections.length === 0;
|
|
23
25
|
return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
24
|
-
/* @__PURE__ */
|
|
25
|
-
|
|
26
|
+
heading !== void 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
27
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: heading }),
|
|
28
|
+
/* @__PURE__ */ jsx(Text, { children: " " })
|
|
29
|
+
] }),
|
|
26
30
|
sections.map((section) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
27
31
|
/* @__PURE__ */ jsxs(Text, { color: CLI_COLORS.ERROR, children: [
|
|
28
32
|
" ",
|
|
29
33
|
section.label
|
|
30
34
|
] }),
|
|
31
|
-
/* @__PURE__ */ jsx(
|
|
35
|
+
/* @__PURE__ */ jsx(PlanItems, { items: section.items })
|
|
32
36
|
] }, section.label)),
|
|
37
|
+
overwritten !== void 0 && overwritten.items.length > 0 && /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
38
|
+
!opensTheFrame && /* @__PURE__ */ jsx(Text, { children: " " }),
|
|
39
|
+
/* @__PURE__ */ jsx(Text, { bold: true, children: overwritten.label }),
|
|
40
|
+
/* @__PURE__ */ jsx(PlanItems, { items: overwritten.items })
|
|
41
|
+
] }),
|
|
33
42
|
statements.map((statement) => /* @__PURE__ */ jsxs(Box, { flexDirection: "column", children: [
|
|
34
43
|
/* @__PURE__ */ jsx(Text, { children: " " }),
|
|
35
44
|
/* @__PURE__ */ jsx(Text, { dimColor: true, children: statement })
|
|
@@ -52,8 +61,9 @@ var RemovalPlanConfirm = ({
|
|
|
52
61
|
)
|
|
53
62
|
] });
|
|
54
63
|
};
|
|
64
|
+
var PlanItems = ({ items }) => /* @__PURE__ */ jsx(Box, { flexDirection: "column", paddingLeft: ITEM_INDENT, children: items.map((item) => /* @__PURE__ */ jsx(Text, { dimColor: true, children: item }, item)) });
|
|
55
65
|
|
|
56
66
|
export {
|
|
57
67
|
RemovalPlanConfirm
|
|
58
68
|
};
|
|
59
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-O4LN3HFI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/common/removal-plan-confirm.tsx"],"sourcesContent":["import React from \"react\";\nimport { Box, Text, useApp } from \"ink\";\n\nimport { Confirm } from \"./confirm.js\";\nimport { CLI_COLORS } from \"../../consts.js\";\n\nconst ITEM_INDENT = 3;\n\nexport type RemovalPlanSection = {\n label: string;\n items: string[];\n};\n\nexport type RemovalPlanConfirmProps = {\n /** Omitted where the plan opens on what it overwrites. */\n heading?: string;\n /** Omit headings with no items. */\n sections: RemovalPlanSection[];\n /** What the apply writes over in place, under a heading of its own; omitted when empty. */\n overwritten?: RemovalPlanSection;\n /** Prose under the removals: what stays and why, and what a removal reaches beyond. */\n statements: string[];\n message: string;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport const RemovalPlanConfirm: React.FC<RemovalPlanConfirmProps> = ({\n heading,\n sections,\n overwritten,\n statements,\n message,\n onConfirm,\n onCancel,\n}) => {\n const { exit } = useApp();\n const opensTheFrame = heading === undefined && sections.length === 0;\n\n return (\n <Box flexDirection=\"column\">\n {heading !== undefined && (\n <>\n <Text bold>{heading}</Text>\n <Text> </Text>\n </>\n )}\n\n {sections.map((section) => (\n <Box key={section.label} flexDirection=\"column\">\n <Text color={CLI_COLORS.ERROR}> {section.label}</Text>\n <PlanItems items={section.items} />\n </Box>\n ))}\n\n {overwritten !== undefined && overwritten.items.length > 0 && (\n <Box flexDirection=\"column\">\n {!opensTheFrame && <Text> </Text>}\n <Text bold>{overwritten.label}</Text>\n <PlanItems items={overwritten.items} />\n </Box>\n )}\n\n {statements.map((statement) => (\n <Box key={statement} flexDirection=\"column\">\n <Text> </Text>\n <Text dimColor>{statement}</Text>\n </Box>\n ))}\n\n <Text> </Text>\n <Confirm\n message={message}\n onConfirm={() => {\n onConfirm();\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n defaultValue={false}\n />\n </Box>\n );\n};\n\nconst PlanItems: React.FC<{ items: string[] }> = ({ items }) => (\n <Box flexDirection=\"column\" paddingLeft={ITEM_INDENT}>\n {items.map((item) => (\n <Text key={item} dimColor>\n {item}\n </Text>\n ))}\n </Box>\n);\n"],"mappings":";;;;;;;;;AAAA,OAAkB;AAClB,SAAS,KAAK,MAAM,cAAc;AAyC1B,mBACE,KADF;AApCR,IAAM,cAAc;AAqBb,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,gBAAgB,YAAY,UAAa,SAAS,WAAW;AAEnE,SACE,qBAAC,OAAI,eAAc,UAChB;AAAA,gBAAY,UACX,iCACE;AAAA,0BAAC,QAAK,MAAI,MAAE,mBAAQ;AAAA,MACpB,oBAAC,QAAK,eAAC;AAAA,OACT;AAAA,IAGD,SAAS,IAAI,CAAC,YACb,qBAAC,OAAwB,eAAc,UACrC;AAAA,2BAAC,QAAK,OAAO,WAAW,OAAO;AAAA;AAAA,QAAE,QAAQ;AAAA,SAAM;AAAA,MAC/C,oBAAC,aAAU,OAAO,QAAQ,OAAO;AAAA,SAFzB,QAAQ,KAGlB,CACD;AAAA,IAEA,gBAAgB,UAAa,YAAY,MAAM,SAAS,KACvD,qBAAC,OAAI,eAAc,UAChB;AAAA,OAAC,iBAAiB,oBAAC,QAAK,eAAC;AAAA,MAC1B,oBAAC,QAAK,MAAI,MAAE,sBAAY,OAAM;AAAA,MAC9B,oBAAC,aAAU,OAAO,YAAY,OAAO;AAAA,OACvC;AAAA,IAGD,WAAW,IAAI,CAAC,cACf,qBAAC,OAAoB,eAAc,UACjC;AAAA,0BAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,UAAQ,MAAE,qBAAU;AAAA,SAFlB,SAGV,CACD;AAAA,IAED,oBAAC,QAAK,eAAC;AAAA,IACP;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,MAAM;AACf,oBAAU;AACV,eAAK;AAAA,QACP;AAAA,QACA,UAAU,MAAM;AACd,mBAAS;AACT,eAAK;AAAA,QACP;AAAA,QACA,cAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAEJ;AAEA,IAAM,YAA2C,CAAC,EAAE,MAAM,MACxD,oBAAC,OAAI,eAAc,UAAS,aAAa,aACtC,gBAAM,IAAI,CAAC,SACV,oBAAC,QAAgB,UAAQ,MACtB,kBADQ,IAEX,CACD,GACH;","names":[]}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
chooseProviderForThisRun,
|
|
4
4
|
detectInstallations
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-GAKVZNTX.js";
|
|
6
6
|
import {
|
|
7
7
|
CLI_INVOKE_COMMAND,
|
|
8
8
|
EDITOR_URL,
|
|
9
9
|
PROVIDERS
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-7C3PFRBU.js";
|
|
11
11
|
|
|
12
12
|
// src/cli/lib/installation/provider-flag.ts
|
|
13
13
|
import os from "os";
|
|
@@ -70,4 +70,4 @@ export {
|
|
|
70
70
|
ambiguityFinding,
|
|
71
71
|
otherInstallationsInThisScope
|
|
72
72
|
};
|
|
73
|
-
//# sourceMappingURL=chunk-
|
|
73
|
+
//# sourceMappingURL=chunk-OCAVW6N5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/lib/installation/provider-flag.ts"],"sourcesContent":["/**\n * `--provider`: names the installation where the folder cannot — a greenfield `init --from`, or a\n * scope holding both providers, where acting commands refuse until it is given.\n */\n\nimport os from \"os\";\n\nimport { Flags } from \"@oclif/core\";\n\nimport { PROVIDERS, EDITOR_URL, CLI_INVOKE_COMMAND, type Provider } from \"../../consts.js\";\nimport { detectInstallations, type DetectedInstallation } from \"./detect-installations.js\";\nimport { chooseProviderForThisRun } from \"./install-layout.js\";\n\n/** A factory because oclif mutates flag definitions, so commands must not share one. */\nexport function providerFlag() {\n return Flags.string({\n description: \"Which provider's installation this run is about\",\n helpValue: `<${PROVIDERS.join(\"|\")}>`,\n options: [...PROVIDERS],\n });\n}\n\n/** oclif has already rejected unlisted values; this only narrows. */\nexport function providerNamedBy(flagValue: string | undefined): Provider | undefined {\n if (flagValue === undefined) return undefined;\n return PROVIDERS.find((provider) => provider === flagValue);\n}\n\nexport function providerNeedsAConfigurationToInstall(): string {\n return (\n `--provider names which installation to create and needs the configuration to create it ` +\n `from, so it is only meaningful beside --from. Build one at ${EDITOR_URL}, then run ` +\n `'${CLI_INVOKE_COMMAND} init --from <id> --provider <provider>'.`\n );\n}\n\nfunction ambiguousInstallation(\n subject: string,\n providers: readonly Provider[],\n scopeRoot: string,\n): string {\n return (\n `${scopeRoot} holds ${providers.length} installations — ${providers.join(\" and \")} — so ` +\n `${subject} cannot tell which one you mean. Name it with --provider <${providers.join(\"|\")}>. ` +\n `Nothing has been changed.`\n );\n}\n\ntype InstallationsInPlay = {\n scopeRoot: string;\n providers: Provider[];\n};\n\n/** The project's installations, or the global ones only when the project has none. */\nasync function installationsInPlay(cwd: string): Promise<InstallationsInPlay> {\n const found = await detectInstallations(cwd);\n const inTheProject = atScope(found, \"project\");\n\n if (inTheProject.length > 0) return { scopeRoot: cwd, providers: providersOf(inTheProject) };\n return { scopeRoot: os.homedir(), providers: providersOf(atScope(found, \"global\")) };\n}\n\nfunction atScope(\n found: readonly DetectedInstallation[],\n scope: DetectedInstallation[\"scope\"],\n): DetectedInstallation[] {\n return found.filter((installation) => installation.scope === scope);\n}\n\nfunction providersOf(installations: readonly DetectedInstallation[]): Provider[] {\n return installations.map((installation) => installation.provider);\n}\n\n/**\n * A named provider is committed for the run; two installations and no flag call `onAmbiguous`\n * (the command's `this.error`); otherwise nothing happens.\n */\nexport async function refuseAnAmbiguousInstallation(\n cwd: string,\n subject: string,\n named: Provider | undefined,\n onAmbiguous: (message: string) => never,\n): Promise<void> {\n if (named !== undefined) {\n chooseProviderForThisRun(named);\n return;\n }\n\n const { scopeRoot, providers } = await installationsInPlay(cwd);\n if (providers.length <= 1) return;\n\n onAmbiguous(ambiguousInstallation(subject, providers, scopeRoot));\n}\n\n/** The non-refusing form, for `doctor`. */\nexport async function ambiguityFinding(cwd: string): Promise<string | null> {\n const { scopeRoot, providers } = await installationsInPlay(cwd);\n if (providers.length <= 1) return null;\n\n return ambiguousInstallation(\"every command that acts on one\", providers, scopeRoot);\n}\n\n/** For `list`: names the other installation in the scope, or `null` when there is none. */\nexport async function otherInstallationsInThisScope(\n cwd: string,\n showing: Provider,\n): Promise<string | null> {\n const { scopeRoot, providers } = await installationsInPlay(cwd);\n const others = providers.filter((provider) => provider !== showing);\n if (others.length === 0) return null;\n\n return (\n `${scopeRoot} holds ${providers.length} installations — ${providers.join(\" and \")} — and this ` +\n `is the ${showing} one. Show another with --provider <${providers.join(\"|\")}>.`\n );\n}\n"],"mappings":";;;;;;;;;;;;AAKA,OAAO,QAAQ;AAEf,SAAS,aAAa;AAOf,SAAS,eAAe;AAC7B,SAAO,MAAM,OAAO;AAAA,IAClB,aAAa;AAAA,IACb,WAAW,IAAI,UAAU,KAAK,GAAG,CAAC;AAAA,IAClC,SAAS,CAAC,GAAG,SAAS;AAAA,EACxB,CAAC;AACH;AAGO,SAAS,gBAAgB,WAAqD;AACnF,MAAI,cAAc,OAAW,QAAO;AACpC,SAAO,UAAU,KAAK,CAAC,aAAa,aAAa,SAAS;AAC5D;AAEO,SAAS,uCAA+C;AAC7D,SACE,qJAC8D,UAAU,eACpE,kBAAkB;AAE1B;AAEA,SAAS,sBACP,SACA,WACA,WACQ;AACR,SACE,GAAG,SAAS,UAAU,UAAU,MAAM,yBAAoB,UAAU,KAAK,OAAO,CAAC,cAC9E,OAAO,6DAA6D,UAAU,KAAK,GAAG,CAAC;AAG9F;AAQA,eAAe,oBAAoB,KAA2C;AAC5E,QAAM,QAAQ,MAAM,oBAAoB,GAAG;AAC3C,QAAM,eAAe,QAAQ,OAAO,SAAS;AAE7C,MAAI,aAAa,SAAS,EAAG,QAAO,EAAE,WAAW,KAAK,WAAW,YAAY,YAAY,EAAE;AAC3F,SAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,YAAY,QAAQ,OAAO,QAAQ,CAAC,EAAE;AACrF;AAEA,SAAS,QACP,OACA,OACwB;AACxB,SAAO,MAAM,OAAO,CAAC,iBAAiB,aAAa,UAAU,KAAK;AACpE;AAEA,SAAS,YAAY,eAA4D;AAC/E,SAAO,cAAc,IAAI,CAAC,iBAAiB,aAAa,QAAQ;AAClE;AAMA,eAAsB,8BACpB,KACA,SACA,OACA,aACe;AACf,MAAI,UAAU,QAAW;AACvB,6BAAyB,KAAK;AAC9B;AAAA,EACF;AAEA,QAAM,EAAE,WAAW,UAAU,IAAI,MAAM,oBAAoB,GAAG;AAC9D,MAAI,UAAU,UAAU,EAAG;AAE3B,cAAY,sBAAsB,SAAS,WAAW,SAAS,CAAC;AAClE;AAGA,eAAsB,iBAAiB,KAAqC;AAC1E,QAAM,EAAE,WAAW,UAAU,IAAI,MAAM,oBAAoB,GAAG;AAC9D,MAAI,UAAU,UAAU,EAAG,QAAO;AAElC,SAAO,sBAAsB,kCAAkC,WAAW,SAAS;AACrF;AAGA,eAAsB,8BACpB,KACA,SACwB;AACxB,QAAM,EAAE,WAAW,UAAU,IAAI,MAAM,oBAAoB,GAAG;AAC9D,QAAM,SAAS,UAAU,OAAO,CAAC,aAAa,aAAa,OAAO;AAClE,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,SACE,GAAG,SAAS,UAAU,UAAU,MAAM,yBAAoB,UAAU,KAAK,OAAO,CAAC,2BACvE,OAAO,uCAAuC,UAAU,KAAK,GAAG,CAAC;AAE/E;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
render
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-KIK5EZYD.js";
|
|
5
5
|
|
|
6
6
|
// src/cli/components/common/prompt-confirm.tsx
|
|
7
7
|
import "react";
|
|
@@ -46,4 +46,4 @@ export {
|
|
|
46
46
|
promptValue,
|
|
47
47
|
promptConfirm
|
|
48
48
|
};
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
49
|
+
//# sourceMappingURL=chunk-P6CYS4JK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/common/prompt-confirm.tsx"],"sourcesContent":["import React from \"react\";\nimport { render } from \"../render.js\";\n\nexport type ConfirmHandlers = {\n onConfirm: () => void;\n onCancel: () => void;\n};\n\nexport type PromptValueOptions<T> = {\n /** Resolved when the app exits before any callback fires (Ctrl+C, render failure). */\n onExit: T;\n /** Clear before unmount. */\n clearOnResolve?: boolean;\n};\n\n/** First resolve wins, whether a callback or the app-exit fallback; callers own exit policy. */\nexport async function promptValue<T>(\n build: (resolve: (value: T) => void) => React.ReactElement,\n options: PromptValueOptions<T>,\n): Promise<T> {\n // The seed is never called: the executor below replaces it synchronously.\n const answer: { settle: (value: T) => void } = { settle: () => {} };\n const chosen = new Promise<T>((resolve) => {\n answer.settle = resolve;\n });\n\n const releaseInput = holdInputRaw(process.stdin);\n try {\n const instance = render(build((value) => answer.settle(value)));\n\n instance.waitUntilExit().then(\n () => answer.settle(options.onExit),\n () => answer.settle(options.onExit),\n );\n\n const value = await chosen;\n\n // Here, not at each resolve site: a prompt can answer before `render()` returns the instance.\n if (options.clearOnResolve) instance.clear();\n instance.unmount();\n\n return value;\n } finally {\n releaseInput();\n }\n}\n\n/**\n * Ink sets raw mode only after the first frame, so an early Enter is echoed in cooked mode.\n * Prompts only: under raw mode Ctrl+C could not interrupt a spinner, which reads no input.\n */\nfunction holdInputRaw(input: NodeJS.ReadStream): () => void {\n if (!input.isTTY) return () => {};\n const wasRaw = input.isRaw;\n input.setRawMode(true);\n return () => {\n input.setRawMode(wasRaw);\n };\n}\n\nexport async function promptConfirm(\n build: (handlers: ConfirmHandlers) => React.ReactElement,\n): Promise<\"confirmed\" | \"cancelled\"> {\n return promptValue<\"confirmed\" | \"cancelled\">(\n (resolve) =>\n build({ onConfirm: () => resolve(\"confirmed\"), onCancel: () => resolve(\"cancelled\") }),\n { onExit: \"cancelled\" },\n );\n}\n"],"mappings":";;;;;;AAAA,OAAkB;AAgBlB,eAAsB,YACpB,OACA,SACY;AAEZ,QAAM,SAAyC,EAAE,QAAQ,MAAM;AAAA,EAAC,EAAE;AAClE,QAAM,SAAS,IAAI,QAAW,CAAC,YAAY;AACzC,WAAO,SAAS;AAAA,EAClB,CAAC;AAED,QAAM,eAAe,aAAa,QAAQ,KAAK;AAC/C,MAAI;AACF,UAAM,WAAW,OAAO,MAAM,CAACA,WAAU,OAAO,OAAOA,MAAK,CAAC,CAAC;AAE9D,aAAS,cAAc,EAAE;AAAA,MACvB,MAAM,OAAO,OAAO,QAAQ,MAAM;AAAA,MAClC,MAAM,OAAO,OAAO,QAAQ,MAAM;AAAA,IACpC;AAEA,UAAM,QAAQ,MAAM;AAGpB,QAAI,QAAQ,eAAgB,UAAS,MAAM;AAC3C,aAAS,QAAQ;AAEjB,WAAO;AAAA,EACT,UAAE;AACA,iBAAa;AAAA,EACf;AACF;AAMA,SAAS,aAAa,OAAsC;AAC1D,MAAI,CAAC,MAAM,MAAO,QAAO,MAAM;AAAA,EAAC;AAChC,QAAM,SAAS,MAAM;AACrB,QAAM,WAAW,IAAI;AACrB,SAAO,MAAM;AACX,UAAM,WAAW,MAAM;AAAA,EACzB;AACF;AAEA,eAAsB,cACpB,OACoC;AACpC,SAAO;AAAA,IACL,CAAC,YACC,MAAM,EAAE,WAAW,MAAM,QAAQ,WAAW,GAAG,UAAU,MAAM,QAAQ,WAAW,EAAE,CAAC;AAAA,IACvF,EAAE,QAAQ,YAAY;AAAA,EACxB;AACF;","names":["value"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
execCommand,
|
|
4
|
+
getErrorMessage
|
|
5
|
+
} from "./chunk-GAKVZNTX.js";
|
|
6
|
+
|
|
7
|
+
// src/cli/utils/open-url.ts
|
|
8
|
+
function browserOpenerCommand(platform, url) {
|
|
9
|
+
if (platform === "darwin") return { command: "open", args: [url] };
|
|
10
|
+
if (platform === "win32") return { command: "cmd", args: ["/c", "start", "", url] };
|
|
11
|
+
return { command: "xdg-open", args: [url] };
|
|
12
|
+
}
|
|
13
|
+
function openerRefusedMessage(command, exitCode) {
|
|
14
|
+
return `Could not open your browser \u2014 '${command}' exited ${exitCode}.`;
|
|
15
|
+
}
|
|
16
|
+
function openerUnavailableMessage(command, reason) {
|
|
17
|
+
return `Could not open your browser \u2014 '${command}' could not be run: ${reason}`;
|
|
18
|
+
}
|
|
19
|
+
async function openUrl(url) {
|
|
20
|
+
const { command, args } = browserOpenerCommand(process.platform, url);
|
|
21
|
+
try {
|
|
22
|
+
const result = await execCommand(command, args);
|
|
23
|
+
if (result.exitCode !== 0) {
|
|
24
|
+
return { ok: false, error: openerRefusedMessage(command, result.exitCode) };
|
|
25
|
+
}
|
|
26
|
+
return { ok: true };
|
|
27
|
+
} catch (error) {
|
|
28
|
+
return { ok: false, error: openerUnavailableMessage(command, getErrorMessage(error)) };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
openUrl
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-PLFANHRZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/utils/open-url.ts"],"sourcesContent":["import { execCommand } from \"./exec.js\";\nimport { getErrorMessage } from \"./errors.js\";\n\nexport type OpenerCommand = { command: string; args: string[] };\n\n/** Never throws: the link is already printed, so failing to open it is reported, not fatal. */\nexport type OpenUrlResult = { ok: true } | { ok: false; error: string };\n\n// `start` is a cmd builtin; its empty first argument is the window title, or it opens nothing.\nexport function browserOpenerCommand(platform: NodeJS.Platform, url: string): OpenerCommand {\n if (platform === \"darwin\") return { command: \"open\", args: [url] };\n if (platform === \"win32\") return { command: \"cmd\", args: [\"/c\", \"start\", \"\", url] };\n return { command: \"xdg-open\", args: [url] };\n}\n\nfunction openerRefusedMessage(command: string, exitCode: number): string {\n return `Could not open your browser — '${command}' exited ${exitCode}.`;\n}\n\nfunction openerUnavailableMessage(command: string, reason: string): string {\n return `Could not open your browser — '${command}' could not be run: ${reason}`;\n}\n\nexport async function openUrl(url: string): Promise<OpenUrlResult> {\n const { command, args } = browserOpenerCommand(process.platform, url);\n\n try {\n const result = await execCommand(command, args);\n if (result.exitCode !== 0) {\n return { ok: false, error: openerRefusedMessage(command, result.exitCode) };\n }\n return { ok: true };\n } catch (error) {\n return { ok: false, error: openerUnavailableMessage(command, getErrorMessage(error)) };\n }\n}\n"],"mappings":";;;;;;;AASO,SAAS,qBAAqB,UAA2B,KAA4B;AAC1F,MAAI,aAAa,SAAU,QAAO,EAAE,SAAS,QAAQ,MAAM,CAAC,GAAG,EAAE;AACjE,MAAI,aAAa,QAAS,QAAO,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,SAAS,IAAI,GAAG,EAAE;AAClF,SAAO,EAAE,SAAS,YAAY,MAAM,CAAC,GAAG,EAAE;AAC5C;AAEA,SAAS,qBAAqB,SAAiB,UAA0B;AACvE,SAAO,uCAAkC,OAAO,YAAY,QAAQ;AACtE;AAEA,SAAS,yBAAyB,SAAiB,QAAwB;AACzE,SAAO,uCAAkC,OAAO,uBAAuB,MAAM;AAC/E;AAEA,eAAsB,QAAQ,KAAqC;AACjE,QAAM,EAAE,SAAS,KAAK,IAAI,qBAAqB,QAAQ,UAAU,GAAG;AAEpE,MAAI;AACF,UAAM,SAAS,MAAM,YAAY,SAAS,IAAI;AAC9C,QAAI,OAAO,aAAa,GAAG;AACzB,aAAO,EAAE,IAAI,OAAO,OAAO,qBAAqB,SAAS,OAAO,QAAQ,EAAE;AAAA,IAC5E;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACpB,SAAS,OAAO;AACd,WAAO,EAAE,IAAI,OAAO,OAAO,yBAAyB,SAAS,gBAAgB,KAAK,CAAC,EAAE;AAAA,EACvF;AACF;","names":[]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
computeScopeDiff
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RIK45Q4I.js";
|
|
5
5
|
import {
|
|
6
6
|
getSkillDisplayName
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-AUNRHWH4.js";
|
|
8
8
|
import {
|
|
9
9
|
CLI_COLORS,
|
|
10
10
|
EJECT_SOURCE,
|
|
11
11
|
UI_SYMBOLS
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-7C3PFRBU.js";
|
|
13
13
|
|
|
14
14
|
// src/cli/components/common/skill-agent-summary.tsx
|
|
15
15
|
import { Box, Text } from "ink";
|
|
@@ -105,4 +105,4 @@ var SkillAgentSummary = ({
|
|
|
105
105
|
export {
|
|
106
106
|
SkillAgentSummary
|
|
107
107
|
};
|
|
108
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-PMUZR4XO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/common/skill-agent-summary.tsx"],"sourcesContent":["import { Box, Text } from \"ink\";\nimport React from \"react\";\nimport { CLI_COLORS, EJECT_SOURCE, UI_SYMBOLS } from \"../../consts.js\";\nimport { computeScopeDiff } from \"../../lib/configuration/scope-diff.js\";\nimport type {\n AgentDiffRow,\n DiffRowStatus,\n ScopeDiffInput,\n SkillDiffRow,\n} from \"../../lib/configuration/scope-diff.js\";\nimport { getSkillDisplayName } from \"../../lib/matrix/matrix-provider.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config.js\";\n\nexport type SkillAgentSummaryProps = Pick<\n ScopeDiffInput,\n \"installedSkillConfigs\" | \"installedAgentConfigs\" | \"isInitMode\"\n> & {\n skillConfigs: SkillConfig[];\n agentConfigs: AgentScopeConfig[];\n};\n\nconst TableHeader: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <Text bold color={CLI_COLORS.WARNING}>\n {children}\n </Text>\n);\n\nconst ScopeLabel: React.FC<{ children: string }> = ({ children }) => (\n <Text color={CLI_COLORS.WHITE} backgroundColor={CLI_COLORS.LABEL_BG}>\n {` ${children} `}\n </Text>\n);\n\nconst EjectIcon: React.FC = () => <Text color={CLI_COLORS.WARNING}> {UI_SYMBOLS.EJECT}</Text>;\n\nconst DIFF_PREFIX: Record<DiffRowStatus, string> = {\n added: `${UI_SYMBOLS.ADDED} `,\n \"mode-changed\": \"~ \",\n removed: `${UI_SYMBOLS.REMOVED} `,\n unchanged: `${UI_SYMBOLS.BULLET} `,\n};\n\nconst DIFF_COLOR: Record<DiffRowStatus, string> = {\n added: CLI_COLORS.SUCCESS,\n \"mode-changed\": CLI_COLORS.WARNING,\n removed: CLI_COLORS.ERROR,\n unchanged: CLI_COLORS.NEUTRAL,\n};\n\nconst SkillRow: React.FC<{ row: SkillDiffRow }> = ({ row }) => (\n <Box width=\"50%\" flexDirection=\"row\">\n <Text color={DIFF_COLOR[row.status]}>\n {DIFF_PREFIX[row.status]}\n {getSkillDisplayName(row.id)}\n </Text>\n {row.source === EJECT_SOURCE && <EjectIcon />}\n </Box>\n);\n\nconst AgentRow: React.FC<{ row: AgentDiffRow }> = ({ row }) => (\n <Text color={DIFF_COLOR[row.status]}>\n {DIFF_PREFIX[row.status]}\n {row.name}\n </Text>\n);\n\nconst skillRowKey = (row: SkillDiffRow): string =>\n row.status === \"removed\" ? `removed-${row.id}` : row.id;\n\nconst agentRowKey = (row: AgentDiffRow): string =>\n row.status === \"removed\" ? `removed-${row.name}` : row.name;\n\nexport const SkillAgentSummary: React.FC<SkillAgentSummaryProps> = ({\n skillConfigs,\n agentConfigs,\n installedSkillConfigs,\n installedAgentConfigs,\n isInitMode,\n}) => {\n const diff = computeScopeDiff({\n currentSkills: skillConfigs,\n currentAgents: agentConfigs,\n installedSkillConfigs,\n installedAgentConfigs,\n isInitMode,\n });\n\n if (!diff.hasContent) return null;\n\n return (\n <Box flexDirection=\"row\" width=\"100%\">\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n flexGrow={2}\n flexBasis={0}\n borderRight={true}\n borderTop={false}\n borderBottom={false}\n borderLeft={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderRightDimColor\n >\n <TableHeader>Skills</TableHeader>\n {diff.projectSkillRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Project</ScopeLabel>\n <Box flexWrap=\"wrap\">\n {diff.projectSkillRows.map((row) => (\n <SkillRow key={skillRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n {diff.globalSkillRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Global</ScopeLabel>\n <Box flexWrap=\"wrap\">\n {diff.globalSkillRows.map((row) => (\n <SkillRow key={skillRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n <Box flexDirection=\"column\" flexGrow={1} flexBasis={0} marginLeft={1} paddingLeft={1}>\n <TableHeader>Agents</TableHeader>\n {diff.projectAgentRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Project</ScopeLabel>\n <Box flexDirection=\"column\">\n {diff.projectAgentRows.map((row) => (\n <AgentRow key={agentRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n {diff.globalAgentRows.length > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n <ScopeLabel>Global</ScopeLabel>\n <Box flexDirection=\"column\">\n {diff.globalAgentRows.map((row) => (\n <AgentRow key={agentRowKey(row)} row={row} />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
|