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.
Files changed (163) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/{chunk-BMRUNMPV.js → chunk-2YA4DDRM.js} +35 -35
  3. package/dist/chunk-2YA4DDRM.js.map +1 -0
  4. package/dist/{chunk-44TE3RKH.js → chunk-3ED3KHHD.js} +5 -4
  5. package/dist/chunk-3ED3KHHD.js.map +1 -0
  6. package/dist/{chunk-3G7X2WKI.js → chunk-5BNX73OU.js} +18 -38
  7. package/dist/chunk-5BNX73OU.js.map +1 -0
  8. package/dist/{chunk-7RDMTR64.js → chunk-66AEVERM.js} +785 -256
  9. package/dist/chunk-66AEVERM.js.map +1 -0
  10. package/dist/{chunk-PJWGTNOX.js → chunk-7C3PFRBU.js} +144 -186
  11. package/dist/chunk-7C3PFRBU.js.map +1 -0
  12. package/dist/{chunk-52HDHJ7I.js → chunk-AUNRHWH4.js} +32 -21
  13. package/dist/chunk-AUNRHWH4.js.map +1 -0
  14. package/dist/{chunk-KOLDW6SF.js → chunk-BBDGYJHX.js} +2 -2
  15. package/dist/chunk-BBDGYJHX.js.map +1 -0
  16. package/dist/{chunk-SZYQISA2.js → chunk-ELV5WDS3.js} +43 -29
  17. package/dist/chunk-ELV5WDS3.js.map +1 -0
  18. package/dist/{chunk-MQ6CGZNJ.js → chunk-GAKVZNTX.js} +1879 -2019
  19. package/dist/chunk-GAKVZNTX.js.map +1 -0
  20. package/dist/chunk-GEMW5RQ2.js +1169 -0
  21. package/dist/chunk-GEMW5RQ2.js.map +1 -0
  22. package/dist/{chunk-NQW25DCF.js → chunk-GHHJYNAN.js} +1 -7
  23. package/dist/chunk-GHHJYNAN.js.map +1 -0
  24. package/dist/{chunk-WTWMGH2C.js → chunk-HACRR422.js} +2 -2
  25. package/dist/chunk-HACRR422.js.map +1 -0
  26. package/dist/{chunk-F2BHT5C4.js → chunk-IWY5IR4F.js} +129 -151
  27. package/dist/chunk-IWY5IR4F.js.map +1 -0
  28. package/dist/{chunk-JFLVEFFP.js → chunk-KIK5EZYD.js} +1 -1
  29. package/dist/chunk-KIK5EZYD.js.map +1 -0
  30. package/dist/{chunk-USVBYQSQ.js → chunk-O4LN3HFI.js} +16 -6
  31. package/dist/chunk-O4LN3HFI.js.map +1 -0
  32. package/dist/{chunk-RIPSGNLU.js → chunk-OCAVW6N5.js} +3 -3
  33. package/dist/chunk-OCAVW6N5.js.map +1 -0
  34. package/dist/{chunk-4AAOOAIN.js → chunk-P6CYS4JK.js} +2 -2
  35. package/dist/chunk-P6CYS4JK.js.map +1 -0
  36. package/dist/chunk-PLFANHRZ.js +35 -0
  37. package/dist/chunk-PLFANHRZ.js.map +1 -0
  38. package/dist/{chunk-6ZRH5RHC.js → chunk-PMUZR4XO.js} +4 -4
  39. package/dist/chunk-PMUZR4XO.js.map +1 -0
  40. package/dist/{chunk-F5EBEATU.js → chunk-PSUTNOQ2.js} +34 -46
  41. package/dist/chunk-PSUTNOQ2.js.map +1 -0
  42. package/dist/chunk-RIK45Q4I.js +103 -0
  43. package/dist/chunk-RIK45Q4I.js.map +1 -0
  44. package/dist/{chunk-HED2DAXZ.js → chunk-THO7LO5B.js} +5 -5
  45. package/dist/chunk-THO7LO5B.js.map +1 -0
  46. package/dist/{chunk-OYJQUA3D.js → chunk-YGDWHDOY.js} +31 -13
  47. package/dist/chunk-YGDWHDOY.js.map +1 -0
  48. package/dist/{chunk-NCWDK6L7.js → chunk-YXKTY5WM.js} +254 -379
  49. package/dist/chunk-YXKTY5WM.js.map +1 -0
  50. package/dist/{chunk-NEZ4OAOL.js → chunk-ZEGM3MVR.js} +3 -5
  51. package/dist/chunk-ZEGM3MVR.js.map +1 -0
  52. package/dist/commands/build/marketplace.js +46 -46
  53. package/dist/commands/build/marketplace.js.map +1 -1
  54. package/dist/commands/build/plugins.js +25 -28
  55. package/dist/commands/build/plugins.js.map +1 -1
  56. package/dist/commands/compile.js +87 -178
  57. package/dist/commands/compile.js.map +1 -1
  58. package/dist/commands/doctor.js +510 -360
  59. package/dist/commands/doctor.js.map +1 -1
  60. package/dist/commands/edit.js +451 -357
  61. package/dist/commands/edit.js.map +1 -1
  62. package/dist/commands/eject.js +144 -125
  63. package/dist/commands/eject.js.map +1 -1
  64. package/dist/commands/init.js +20 -27
  65. package/dist/commands/list.js +39 -55
  66. package/dist/commands/list.js.map +1 -1
  67. package/dist/commands/new/marketplace.js +6 -11
  68. package/dist/commands/new/marketplace.js.map +1 -1
  69. package/dist/commands/search.js +35 -32
  70. package/dist/commands/search.js.map +1 -1
  71. package/dist/commands/share.js +17 -77
  72. package/dist/commands/share.js.map +1 -1
  73. package/dist/commands/uninstall.js +159 -222
  74. package/dist/commands/uninstall.js.map +1 -1
  75. package/dist/commands/update.js +9 -32
  76. package/dist/commands/update.js.map +1 -1
  77. package/dist/components/common/prompt-confirm.js +2 -2
  78. package/dist/components/common/removal-plan-confirm.js +2 -2
  79. package/dist/components/common/scroll-affordance.js +2 -2
  80. package/dist/components/common/select-list.js +2 -2
  81. package/dist/components/common/skill-agent-summary.js +4 -4
  82. package/dist/components/common/spinner.js +2 -4
  83. package/dist/components/common/summary-panel.js +5 -5
  84. package/dist/components/common/summary-panel.js.map +1 -1
  85. package/dist/config-exports.js +7 -3
  86. package/dist/config-exports.js.map +1 -1
  87. package/dist/hooks/init.js +18 -19
  88. package/dist/hooks/init.js.map +1 -1
  89. package/dist/index.js.map +1 -1
  90. package/dist/load-agent-defs-6QUUMGHK.js +14 -0
  91. package/dist/recompile-project-agents-I33KQJFB.js +65 -0
  92. package/dist/recompile-project-agents-I33KQJFB.js.map +1 -0
  93. package/dist/{source-loader-C5SQXZXI.js → source-loader-TTJVW2ER.js} +5 -5
  94. package/dist/src/agents/developer/ai-developer/playbook.md +2 -5
  95. package/dist/src/agents/developer/api-developer/playbook.md +2 -5
  96. package/dist/src/agents/developer/cli-developer/playbook.md +2 -5
  97. package/dist/src/agents/developer/web-developer/playbook.md +2 -5
  98. package/dist/src/agents/meta/agent-summoner/output.md +2 -2
  99. package/dist/src/agents/meta/agent-summoner/playbook.md +1 -13
  100. package/dist/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  101. package/dist/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  102. package/dist/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  103. package/dist/src/agents/tester/ai-tester/playbook.md +2 -0
  104. package/dist/src/agents/tester/api-tester/critical-requirements.md +1 -2
  105. package/dist/src/agents/tester/api-tester/playbook.md +2 -0
  106. package/dist/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  107. package/dist/src/agents/tester/cli-tester/playbook.md +2 -0
  108. package/dist/src/agents/tester/web-tester/critical-requirements.md +1 -2
  109. package/dist/src/agents/tester/web-tester/playbook.md +2 -0
  110. package/package.json +9 -8
  111. package/src/agents/developer/ai-developer/playbook.md +2 -5
  112. package/src/agents/developer/api-developer/playbook.md +2 -5
  113. package/src/agents/developer/cli-developer/playbook.md +2 -5
  114. package/src/agents/developer/web-developer/playbook.md +2 -5
  115. package/src/agents/meta/agent-summoner/output.md +2 -2
  116. package/src/agents/meta/agent-summoner/playbook.md +1 -13
  117. package/src/agents/meta/codex-keeper/critical-requirements.md +2 -5
  118. package/src/agents/meta/convention-keeper/critical-requirements.md +2 -4
  119. package/src/agents/tester/ai-tester/critical-requirements.md +1 -2
  120. package/src/agents/tester/ai-tester/playbook.md +2 -0
  121. package/src/agents/tester/api-tester/critical-requirements.md +1 -2
  122. package/src/agents/tester/api-tester/playbook.md +2 -0
  123. package/src/agents/tester/cli-tester/critical-requirements.md +1 -2
  124. package/src/agents/tester/cli-tester/playbook.md +2 -0
  125. package/src/agents/tester/web-tester/critical-requirements.md +1 -2
  126. package/src/agents/tester/web-tester/playbook.md +2 -0
  127. package/src/schemas/project-config.schema.json +0 -3
  128. package/src/schemas/project-source-config.schema.json +0 -6
  129. package/dist/chunk-3G7X2WKI.js.map +0 -1
  130. package/dist/chunk-44TE3RKH.js.map +0 -1
  131. package/dist/chunk-4AAOOAIN.js.map +0 -1
  132. package/dist/chunk-52HDHJ7I.js.map +0 -1
  133. package/dist/chunk-6HNXYYVF.js +0 -373
  134. package/dist/chunk-6HNXYYVF.js.map +0 -1
  135. package/dist/chunk-6ZRH5RHC.js.map +0 -1
  136. package/dist/chunk-7RDMTR64.js.map +0 -1
  137. package/dist/chunk-BMRUNMPV.js.map +0 -1
  138. package/dist/chunk-CLPUWOSA.js +0 -46
  139. package/dist/chunk-CLPUWOSA.js.map +0 -1
  140. package/dist/chunk-F2BHT5C4.js.map +0 -1
  141. package/dist/chunk-F5EBEATU.js.map +0 -1
  142. package/dist/chunk-HED2DAXZ.js.map +0 -1
  143. package/dist/chunk-JFLVEFFP.js.map +0 -1
  144. package/dist/chunk-KOLDW6SF.js.map +0 -1
  145. package/dist/chunk-MQ6CGZNJ.js.map +0 -1
  146. package/dist/chunk-NCWDK6L7.js.map +0 -1
  147. package/dist/chunk-NEZ4OAOL.js.map +0 -1
  148. package/dist/chunk-NIHUOWE4.js +0 -106
  149. package/dist/chunk-NIHUOWE4.js.map +0 -1
  150. package/dist/chunk-NQW25DCF.js.map +0 -1
  151. package/dist/chunk-OYJQUA3D.js.map +0 -1
  152. package/dist/chunk-PJWGTNOX.js.map +0 -1
  153. package/dist/chunk-RIPSGNLU.js.map +0 -1
  154. package/dist/chunk-SZYQISA2.js.map +0 -1
  155. package/dist/chunk-USVBYQSQ.js.map +0 -1
  156. package/dist/chunk-V3KTSP3Q.js +0 -940
  157. package/dist/chunk-V3KTSP3Q.js.map +0 -1
  158. package/dist/chunk-WTWMGH2C.js.map +0 -1
  159. package/dist/load-agent-defs-YMDWBFDP.js +0 -14
  160. package/dist/recompile-project-agents-SZ76WNTW.js +0 -18
  161. package/dist/source-loader-C5SQXZXI.js.map +0 -1
  162. /package/dist/{load-agent-defs-YMDWBFDP.js.map → load-agent-defs-6QUUMGHK.js.map} +0 -0
  163. /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-MQ6CGZNJ.js";
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-WTWMGH2C.js.map
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-BMRUNMPV.js";
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-MQ6CGZNJ.js";
30
+ } from "./chunk-GAKVZNTX.js";
32
31
  import {
33
32
  initializeMatrix,
34
- matrix,
35
- typedEntries,
36
- typedKeys
37
- } from "./chunk-52HDHJ7I.js";
33
+ matrix
34
+ } from "./chunk-AUNRHWH4.js";
38
35
  import {
39
36
  globalInstallRoot
40
- } from "./chunk-PJWGTNOX.js";
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 globalPluginSkills = isGlobalProject ? {} : await discoverAllPluginSkills(globalInstallRoot());
153
- const globalPluginSkillCount = typedKeys(globalPluginSkills).length;
154
- if (globalPluginSkillCount > 0) {
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 local = await discoverLocalProjectSkills(projectDir, localScope);
167
- const localSkillCount = typedKeys(local.skills).length;
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 ${localSkillCount} local skills from ${projectSkillsRoot(projectDir, localScope)}`
96
+ ` Found ${skillCount(loaded.skills)} local skills from ${projectSkillsRoot(projectDir, scope)}`
170
97
  );
171
- const allSkills = mergeSkills(globalPluginSkills, globalLocal.skills, pluginSkills, local.skills);
172
- const totalSkillCount = typedKeys(allSkills).length;
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: globalPluginSkillCount + pluginSkillCount,
177
- localSkillCount: globalLocalSkillCount + localSkillCount,
178
- globalPluginSkillCount,
179
- globalLocalSkillCount,
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/recompile-project-agents.ts
253
- async function recompileRegisteredProjectAgents(projectDir) {
254
- return withCatalogueSeatedFor(projectDir, async () => {
255
- const { allSkills } = await discoverInstalledSkills(projectDir);
256
- const { sourcePath } = await loadAgentDefs();
257
- return compileAgents({
258
- projectDir,
259
- sourcePath,
260
- skills: allSkills,
261
- scopeFilter: "project",
262
- outputDir: resolveInstallPaths(projectDir, "project").agentsDir
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 recompilePropagatedProjectAgents(projectDirs) {
267
- let rewrittenCount = 0;
268
- let unchangedCount = 0;
269
- let failedCount = 0;
270
- const warnings = [];
271
- for (const dir of projectDirs) {
272
- try {
273
- const result = await recompileRegisteredProjectAgents(dir);
274
- if (result.failed.length > 0) {
275
- failedCount++;
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
- return { rewrittenCount, unchangedCount, failedCount, warnings };
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-F2BHT5C4.js.map
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"]}
@@ -13,4 +13,4 @@ function render(node, options) {
13
13
  export {
14
14
  render
15
15
  };
16
- //# sourceMappingURL=chunk-JFLVEFFP.js.map
16
+ //# sourceMappingURL=chunk-KIK5EZYD.js.map
@@ -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-PJWGTNOX.js";
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__ */ jsx(Text, { bold: true, children: heading }),
25
- /* @__PURE__ */ jsx(Text, { children: " " }),
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(Box, { flexDirection: "column", paddingLeft: ITEM_INDENT, children: section.items.map((item) => /* @__PURE__ */ jsx(Text, { dimColor: true, children: item }, item)) })
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-USVBYQSQ.js.map
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-MQ6CGZNJ.js";
5
+ } from "./chunk-GAKVZNTX.js";
6
6
  import {
7
7
  CLI_INVOKE_COMMAND,
8
8
  EDITOR_URL,
9
9
  PROVIDERS
10
- } from "./chunk-PJWGTNOX.js";
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-RIPSGNLU.js.map
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-JFLVEFFP.js";
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-4AAOOAIN.js.map
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-NIHUOWE4.js";
4
+ } from "./chunk-RIK45Q4I.js";
5
5
  import {
6
6
  getSkillDisplayName
7
- } from "./chunk-52HDHJ7I.js";
7
+ } from "./chunk-AUNRHWH4.js";
8
8
  import {
9
9
  CLI_COLORS,
10
10
  EJECT_SOURCE,
11
11
  UI_SYMBOLS
12
- } from "./chunk-PJWGTNOX.js";
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-6ZRH5RHC.js.map
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":[]}