@x-code-cli/core 0.2.10 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/agent/compression.d.ts +12 -2
  2. package/dist/agent/compression.d.ts.map +1 -1
  3. package/dist/agent/compression.js +51 -2
  4. package/dist/agent/compression.js.map +1 -1
  5. package/dist/agent/file-ingest.js +2 -2
  6. package/dist/agent/file-ingest.js.map +1 -1
  7. package/dist/agent/loop-state.d.ts +3 -2
  8. package/dist/agent/loop-state.d.ts.map +1 -1
  9. package/dist/agent/loop-state.js.map +1 -1
  10. package/dist/agent/loop.d.ts.map +1 -1
  11. package/dist/agent/loop.js +134 -5
  12. package/dist/agent/loop.js.map +1 -1
  13. package/dist/agent/memory-extractor.js +5 -5
  14. package/dist/agent/memory-extractor.js.map +1 -1
  15. package/dist/agent/plan-storage.js +1 -1
  16. package/dist/agent/plan-storage.js.map +1 -1
  17. package/dist/agent/sub-agents/index.d.ts +2 -1
  18. package/dist/agent/sub-agents/index.d.ts.map +1 -1
  19. package/dist/agent/sub-agents/index.js +1 -1
  20. package/dist/agent/sub-agents/index.js.map +1 -1
  21. package/dist/agent/sub-agents/loader.d.ts +13 -3
  22. package/dist/agent/sub-agents/loader.d.ts.map +1 -1
  23. package/dist/agent/sub-agents/loader.js +36 -9
  24. package/dist/agent/sub-agents/loader.js.map +1 -1
  25. package/dist/agent/sub-agents/registry.d.ts +18 -1
  26. package/dist/agent/sub-agents/registry.d.ts.map +1 -1
  27. package/dist/agent/sub-agents/registry.js +38 -5
  28. package/dist/agent/sub-agents/registry.js.map +1 -1
  29. package/dist/agent/sub-agents/runner.d.ts.map +1 -1
  30. package/dist/agent/sub-agents/runner.js +45 -1
  31. package/dist/agent/sub-agents/runner.js.map +1 -1
  32. package/dist/agent/sub-agents/types.d.ts +4 -1
  33. package/dist/agent/sub-agents/types.d.ts.map +1 -1
  34. package/dist/agent/system-prompt.d.ts +21 -0
  35. package/dist/agent/system-prompt.d.ts.map +1 -1
  36. package/dist/agent/system-prompt.js +68 -2
  37. package/dist/agent/system-prompt.js.map +1 -1
  38. package/dist/agent/tool-execution.d.ts.map +1 -1
  39. package/dist/agent/tool-execution.js +220 -1
  40. package/dist/agent/tool-execution.js.map +1 -1
  41. package/dist/commands/index.d.ts +6 -0
  42. package/dist/commands/index.d.ts.map +1 -0
  43. package/dist/commands/index.js +3 -0
  44. package/dist/commands/index.js.map +1 -0
  45. package/dist/commands/loader.d.ts +13 -0
  46. package/dist/commands/loader.d.ts.map +1 -0
  47. package/dist/commands/loader.js +93 -0
  48. package/dist/commands/loader.js.map +1 -0
  49. package/dist/commands/registry.d.ts +44 -0
  50. package/dist/commands/registry.d.ts.map +1 -0
  51. package/dist/commands/registry.js +102 -0
  52. package/dist/commands/registry.js.map +1 -0
  53. package/dist/commands/types.d.ts +23 -0
  54. package/dist/commands/types.d.ts.map +1 -0
  55. package/dist/commands/types.js +26 -0
  56. package/dist/commands/types.js.map +1 -0
  57. package/dist/config/index.d.ts +9 -0
  58. package/dist/config/index.d.ts.map +1 -1
  59. package/dist/config/index.js +12 -10
  60. package/dist/config/index.js.map +1 -1
  61. package/dist/hooks/bus.d.ts +54 -0
  62. package/dist/hooks/bus.d.ts.map +1 -0
  63. package/dist/hooks/bus.js +165 -0
  64. package/dist/hooks/bus.js.map +1 -0
  65. package/dist/hooks/config-schema.d.ts +854 -0
  66. package/dist/hooks/config-schema.d.ts.map +1 -0
  67. package/dist/hooks/config-schema.js +79 -0
  68. package/dist/hooks/config-schema.js.map +1 -0
  69. package/dist/hooks/executor.d.ts +16 -0
  70. package/dist/hooks/executor.d.ts.map +1 -0
  71. package/dist/hooks/executor.js +183 -0
  72. package/dist/hooks/executor.js.map +1 -0
  73. package/dist/hooks/index.d.ts +10 -0
  74. package/dist/hooks/index.d.ts.map +1 -0
  75. package/dist/hooks/index.js +6 -0
  76. package/dist/hooks/index.js.map +1 -0
  77. package/dist/hooks/registry.d.ts +23 -0
  78. package/dist/hooks/registry.d.ts.map +1 -0
  79. package/dist/hooks/registry.js +49 -0
  80. package/dist/hooks/registry.js.map +1 -0
  81. package/dist/hooks/types.d.ts +165 -0
  82. package/dist/hooks/types.d.ts.map +1 -0
  83. package/dist/hooks/types.js +25 -0
  84. package/dist/hooks/types.js.map +1 -0
  85. package/dist/hooks/variables.d.ts +22 -0
  86. package/dist/hooks/variables.d.ts.map +1 -0
  87. package/dist/hooks/variables.js +80 -0
  88. package/dist/hooks/variables.js.map +1 -0
  89. package/dist/index.d.ts +56 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +37 -1
  92. package/dist/index.js.map +1 -1
  93. package/dist/knowledge/auto-memory.d.ts +1 -1
  94. package/dist/knowledge/auto-memory.d.ts.map +1 -1
  95. package/dist/knowledge/auto-memory.js +10 -10
  96. package/dist/knowledge/auto-memory.js.map +1 -1
  97. package/dist/knowledge/loader.js +12 -12
  98. package/dist/knowledge/loader.js.map +1 -1
  99. package/dist/mcp/arg-parser.d.ts +49 -0
  100. package/dist/mcp/arg-parser.d.ts.map +1 -0
  101. package/dist/mcp/arg-parser.js +357 -0
  102. package/dist/mcp/arg-parser.js.map +1 -0
  103. package/dist/mcp/client.d.ts +73 -0
  104. package/dist/mcp/client.d.ts.map +1 -0
  105. package/dist/mcp/client.js +376 -0
  106. package/dist/mcp/client.js.map +1 -0
  107. package/dist/mcp/config-schema.d.ts +64 -0
  108. package/dist/mcp/config-schema.d.ts.map +1 -0
  109. package/dist/mcp/config-schema.js +86 -0
  110. package/dist/mcp/config-schema.js.map +1 -0
  111. package/dist/mcp/config-writer.d.ts +41 -0
  112. package/dist/mcp/config-writer.d.ts.map +1 -0
  113. package/dist/mcp/config-writer.js +138 -0
  114. package/dist/mcp/config-writer.js.map +1 -0
  115. package/dist/mcp/env-safety.d.ts +12 -0
  116. package/dist/mcp/env-safety.d.ts.map +1 -0
  117. package/dist/mcp/env-safety.js +80 -0
  118. package/dist/mcp/env-safety.js.map +1 -0
  119. package/dist/mcp/expand-env.d.ts +14 -0
  120. package/dist/mcp/expand-env.d.ts.map +1 -0
  121. package/dist/mcp/expand-env.js +52 -0
  122. package/dist/mcp/expand-env.js.map +1 -0
  123. package/dist/mcp/loader.d.ts +81 -0
  124. package/dist/mcp/loader.d.ts.map +1 -0
  125. package/dist/mcp/loader.js +223 -0
  126. package/dist/mcp/loader.js.map +1 -0
  127. package/dist/mcp/name-mangling.d.ts +11 -0
  128. package/dist/mcp/name-mangling.d.ts.map +1 -0
  129. package/dist/mcp/name-mangling.js +82 -0
  130. package/dist/mcp/name-mangling.js.map +1 -0
  131. package/dist/mcp/oauth/callback-server.d.ts +25 -0
  132. package/dist/mcp/oauth/callback-server.d.ts.map +1 -0
  133. package/dist/mcp/oauth/callback-server.js +118 -0
  134. package/dist/mcp/oauth/callback-server.js.map +1 -0
  135. package/dist/mcp/oauth/provider.d.ts +80 -0
  136. package/dist/mcp/oauth/provider.d.ts.map +1 -0
  137. package/dist/mcp/oauth/provider.js +292 -0
  138. package/dist/mcp/oauth/provider.js.map +1 -0
  139. package/dist/mcp/oauth/token-storage.d.ts +42 -0
  140. package/dist/mcp/oauth/token-storage.d.ts.map +1 -0
  141. package/dist/mcp/oauth/token-storage.js +121 -0
  142. package/dist/mcp/oauth/token-storage.js.map +1 -0
  143. package/dist/mcp/permissions.d.ts +28 -0
  144. package/dist/mcp/permissions.d.ts.map +1 -0
  145. package/dist/mcp/permissions.js +105 -0
  146. package/dist/mcp/permissions.js.map +1 -0
  147. package/dist/mcp/registry.d.ts +150 -0
  148. package/dist/mcp/registry.d.ts.map +1 -0
  149. package/dist/mcp/registry.js +334 -0
  150. package/dist/mcp/registry.js.map +1 -0
  151. package/dist/mcp/resources.d.ts +7 -0
  152. package/dist/mcp/resources.d.ts.map +1 -0
  153. package/dist/mcp/resources.js +40 -0
  154. package/dist/mcp/resources.js.map +1 -0
  155. package/dist/mcp/tool-bridge.d.ts +16 -0
  156. package/dist/mcp/tool-bridge.d.ts.map +1 -0
  157. package/dist/mcp/tool-bridge.js +56 -0
  158. package/dist/mcp/tool-bridge.js.map +1 -0
  159. package/dist/mcp/trust.d.ts +31 -0
  160. package/dist/mcp/trust.d.ts.map +1 -0
  161. package/dist/mcp/trust.js +103 -0
  162. package/dist/mcp/trust.js.map +1 -0
  163. package/dist/mcp/types.d.ts +73 -0
  164. package/dist/mcp/types.d.ts.map +1 -0
  165. package/dist/mcp/types.js +13 -0
  166. package/dist/mcp/types.js.map +1 -0
  167. package/dist/permissions/session-store.d.ts +4 -1
  168. package/dist/permissions/session-store.d.ts.map +1 -1
  169. package/dist/permissions/session-store.js +6 -1
  170. package/dist/permissions/session-store.js.map +1 -1
  171. package/dist/plugins/consent.d.ts +87 -0
  172. package/dist/plugins/consent.d.ts.map +1 -0
  173. package/dist/plugins/consent.js +181 -0
  174. package/dist/plugins/consent.js.map +1 -0
  175. package/dist/plugins/enable-state.d.ts +34 -0
  176. package/dist/plugins/enable-state.d.ts.map +1 -0
  177. package/dist/plugins/enable-state.js +159 -0
  178. package/dist/plugins/enable-state.js.map +1 -0
  179. package/dist/plugins/installer.d.ts +64 -0
  180. package/dist/plugins/installer.d.ts.map +1 -0
  181. package/dist/plugins/installer.js +416 -0
  182. package/dist/plugins/installer.js.map +1 -0
  183. package/dist/plugins/integration.d.ts +91 -0
  184. package/dist/plugins/integration.d.ts.map +1 -0
  185. package/dist/plugins/integration.js +233 -0
  186. package/dist/plugins/integration.js.map +1 -0
  187. package/dist/plugins/loader.d.ts +69 -0
  188. package/dist/plugins/loader.d.ts.map +1 -0
  189. package/dist/plugins/loader.js +243 -0
  190. package/dist/plugins/loader.js.map +1 -0
  191. package/dist/plugins/manifest.d.ts +23 -0
  192. package/dist/plugins/manifest.d.ts.map +1 -0
  193. package/dist/plugins/manifest.js +143 -0
  194. package/dist/plugins/manifest.js.map +1 -0
  195. package/dist/plugins/marketplace.d.ts +100 -0
  196. package/dist/plugins/marketplace.d.ts.map +1 -0
  197. package/dist/plugins/marketplace.js +529 -0
  198. package/dist/plugins/marketplace.js.map +1 -0
  199. package/dist/plugins/paths.d.ts +44 -0
  200. package/dist/plugins/paths.d.ts.map +1 -0
  201. package/dist/plugins/paths.js +89 -0
  202. package/dist/plugins/paths.js.map +1 -0
  203. package/dist/plugins/refresh.d.ts +61 -0
  204. package/dist/plugins/refresh.d.ts.map +1 -0
  205. package/dist/plugins/refresh.js +98 -0
  206. package/dist/plugins/refresh.js.map +1 -0
  207. package/dist/plugins/registry.d.ts +40 -0
  208. package/dist/plugins/registry.d.ts.map +1 -0
  209. package/dist/plugins/registry.js +80 -0
  210. package/dist/plugins/registry.js.map +1 -0
  211. package/dist/plugins/types.d.ts +225 -0
  212. package/dist/plugins/types.d.ts.map +1 -0
  213. package/dist/plugins/types.js +16 -0
  214. package/dist/plugins/types.js.map +1 -0
  215. package/dist/plugins/user-config.d.ts +22 -0
  216. package/dist/plugins/user-config.d.ts.map +1 -0
  217. package/dist/plugins/user-config.js +96 -0
  218. package/dist/plugins/user-config.js.map +1 -0
  219. package/dist/skills/loader.d.ts +19 -0
  220. package/dist/skills/loader.d.ts.map +1 -0
  221. package/dist/skills/loader.js +197 -0
  222. package/dist/skills/loader.js.map +1 -0
  223. package/dist/skills/registry.d.ts +74 -0
  224. package/dist/skills/registry.d.ts.map +1 -0
  225. package/dist/skills/registry.js +136 -0
  226. package/dist/skills/registry.js.map +1 -0
  227. package/dist/skills/settings.d.ts +13 -0
  228. package/dist/skills/settings.d.ts.map +1 -0
  229. package/dist/skills/settings.js +100 -0
  230. package/dist/skills/settings.js.map +1 -0
  231. package/dist/tools/activate-skill.d.ts +5 -0
  232. package/dist/tools/activate-skill.d.ts.map +1 -0
  233. package/dist/tools/activate-skill.js +33 -0
  234. package/dist/tools/activate-skill.js.map +1 -0
  235. package/dist/tools/index.d.ts +1 -1
  236. package/dist/tools/todo-write.d.ts +1 -1
  237. package/dist/tools/web-fetch.d.ts.map +1 -1
  238. package/dist/tools/web-fetch.js +2 -1
  239. package/dist/tools/web-fetch.js.map +1 -1
  240. package/dist/types/index.d.ts +46 -1
  241. package/dist/types/index.d.ts.map +1 -1
  242. package/dist/types/index.js.map +1 -1
  243. package/dist/utils.d.ts +23 -2
  244. package/dist/utils.d.ts.map +1 -1
  245. package/dist/utils.js +76 -20
  246. package/dist/utils.js.map +1 -1
  247. package/dist/version.d.ts +2 -0
  248. package/dist/version.d.ts.map +1 -0
  249. package/dist/version.js +47 -0
  250. package/dist/version.js.map +1 -0
  251. package/package.json +2 -1
@@ -0,0 +1,34 @@
1
+ import type { PluginScope } from './types.js';
2
+ export declare function settingsPathForScope(scope: PluginScope, cwd?: string): string;
3
+ /** Resolved per-plugin enable state, plus which scope decided it (for
4
+ * `/plugin doctor`). When `decidedBy` is `undefined`, no scope mentioned
5
+ * the plugin and the default applied. */
6
+ export interface ResolvedEnableState {
7
+ enabled: boolean;
8
+ decidedBy: PluginScope | undefined;
9
+ }
10
+ export declare class EnableState {
11
+ private readonly perScope;
12
+ private constructor();
13
+ /** Load both settings files and build a snapshot. The snapshot is
14
+ * intentionally immutable from this point — callers re-load via
15
+ * `EnableState.load()` after settings.json writes. `cwd` defaults to
16
+ * `process.cwd()` and controls where the `'project'` scope file is
17
+ * read from. */
18
+ static load(cwd?: string): Promise<EnableState>;
19
+ /** Effective enabled state for one plugin id. */
20
+ resolve(pluginId: string): ResolvedEnableState;
21
+ /** Raw map for one scope — used by `/plugin list` to show the per-scope
22
+ * flags alongside the effective state. */
23
+ scopeEntries(scope: PluginScope): Record<string, boolean>;
24
+ }
25
+ /** Write a single plugin's enable flag in the chosen scope. Read-modify-
26
+ * write so unrelated fields in settings.json (e.g. `disabledSkills` from
27
+ * the skill subsystem) aren't clobbered. Returns whether the file
28
+ * actually changed (so callers can render an accurate
29
+ * "already enabled" vs "enabled" message). */
30
+ export declare function setPluginEnabled(pluginId: string, scope: PluginScope, enabled: boolean, cwd?: string): Promise<'changed' | 'noop'>;
31
+ /** Remove a plugin's entry from a scope's enabledPlugins (used by
32
+ * `/plugin uninstall` to keep settings.json tidy). */
33
+ export declare function clearPluginEntry(pluginId: string, scope: PluginScope, cwd?: string): Promise<'changed' | 'noop'>;
34
+ //# sourceMappingURL=enable-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable-state.d.ts","sourceRoot":"","sources":["../../src/plugins/enable-state.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAc7C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAG5F;AA2BD;;0CAE0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,WAAW,GAAG,SAAS,CAAA;CACnC;AAED,qBAAa,WAAW;IACF,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAA7C,OAAO;IAEP;;;;qBAIiB;WACJ,IAAI,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,WAAW,CAAC;IASpE,iDAAiD;IACjD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAU9C;+CAC2C;IAC3C,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG1D;AAID;;;;+CAI+C;AAC/C,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,OAAO,EAChB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,CAwB7B;AAED;uDACuD;AACvD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,EAClB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,CA+B7B"}
@@ -0,0 +1,159 @@
1
+ // @x-code-cli/core — Plugin enable/disable state
2
+ //
3
+ // Reads the per-scope `enabledPlugins` map from settings.json files and
4
+ // resolves the effective enabled state for each plugin id.
5
+ //
6
+ // Two-scope model, mirroring mcp + skill subsystems:
7
+ //
8
+ // user ~/.x-code/settings.json
9
+ // project <cwd>/.x-code/settings.local.json (gitignored)
10
+ //
11
+ // `'project'` reading a `.local.json` file is a slight naming quirk we
12
+ // inherit from skills — it's a per-user override for one repo, not a
13
+ // team-shared file. A separate team-shared scope (committed) can be
14
+ // added later without touching the existing two.
15
+ //
16
+ // Map shape: `{ "name@marketplace": true | false }` — true = enabled,
17
+ // false = explicitly disabled, missing = use the project-wide default
18
+ // (currently `true`, i.e. default-enable).
19
+ //
20
+ // Precedence: project > user. An explicit value in a higher-priority
21
+ // scope wins; a missing entry falls through.
22
+ import fs from 'node:fs/promises';
23
+ import path from 'node:path';
24
+ import { XCODE_DIR, userXcodeDir } from '../utils.js';
25
+ /** Highest precedence first. The first scope with an explicit entry wins. */
26
+ const SCOPE_PRECEDENCE = ['project', 'user'];
27
+ /** Default enabled state when no scope mentions the plugin. We default
28
+ * to ENABLED so newly-installed plugins work out-of-the-box; users who
29
+ * want opt-in behaviour can flip individual plugins off explicitly. */
30
+ const DEFAULT_ENABLED = true;
31
+ export function settingsPathForScope(scope, cwd = process.cwd()) {
32
+ if (scope === 'user')
33
+ return path.join(userXcodeDir(), 'settings.json');
34
+ return path.join(cwd, XCODE_DIR, 'settings.local.json');
35
+ }
36
+ async function readSettings(scope, cwd) {
37
+ const file = settingsPathForScope(scope, cwd);
38
+ try {
39
+ const raw = await fs.readFile(file, 'utf-8');
40
+ const parsed = JSON.parse(raw);
41
+ if (!parsed || typeof parsed !== 'object')
42
+ return {};
43
+ const obj = parsed;
44
+ if (obj.enabledPlugins && typeof obj.enabledPlugins === 'object' && !Array.isArray(obj.enabledPlugins)) {
45
+ // Coerce values to boolean defensively — settings.json may have been
46
+ // hand-edited and the wrong type here shouldn't crash the loader.
47
+ const out = {};
48
+ for (const [k, v] of Object.entries(obj.enabledPlugins)) {
49
+ if (typeof v === 'boolean')
50
+ out[k] = v;
51
+ }
52
+ return { enabledPlugins: out };
53
+ }
54
+ return {};
55
+ }
56
+ catch (err) {
57
+ if (err.code === 'ENOENT')
58
+ return {};
59
+ // Malformed JSON: ignore + return empty so a broken settings file never
60
+ // blocks startup. The user can fix the file and re-launch.
61
+ return {};
62
+ }
63
+ }
64
+ export class EnableState {
65
+ perScope;
66
+ constructor(perScope) {
67
+ this.perScope = perScope;
68
+ }
69
+ /** Load both settings files and build a snapshot. The snapshot is
70
+ * intentionally immutable from this point — callers re-load via
71
+ * `EnableState.load()` after settings.json writes. `cwd` defaults to
72
+ * `process.cwd()` and controls where the `'project'` scope file is
73
+ * read from. */
74
+ static async load(cwd = process.cwd()) {
75
+ const map = new Map();
76
+ for (const scope of SCOPE_PRECEDENCE) {
77
+ const s = await readSettings(scope, cwd);
78
+ map.set(scope, s.enabledPlugins ?? {});
79
+ }
80
+ return new EnableState(map);
81
+ }
82
+ /** Effective enabled state for one plugin id. */
83
+ resolve(pluginId) {
84
+ for (const scope of SCOPE_PRECEDENCE) {
85
+ const table = this.perScope.get(scope) ?? {};
86
+ if (pluginId in table) {
87
+ return { enabled: table[pluginId], decidedBy: scope };
88
+ }
89
+ }
90
+ return { enabled: DEFAULT_ENABLED, decidedBy: undefined };
91
+ }
92
+ /** Raw map for one scope — used by `/plugin list` to show the per-scope
93
+ * flags alongside the effective state. */
94
+ scopeEntries(scope) {
95
+ return { ...(this.perScope.get(scope) ?? {}) };
96
+ }
97
+ }
98
+ // ── Mutating writes (used by /plugin enable|disable|install) ────────────
99
+ /** Write a single plugin's enable flag in the chosen scope. Read-modify-
100
+ * write so unrelated fields in settings.json (e.g. `disabledSkills` from
101
+ * the skill subsystem) aren't clobbered. Returns whether the file
102
+ * actually changed (so callers can render an accurate
103
+ * "already enabled" vs "enabled" message). */
104
+ export async function setPluginEnabled(pluginId, scope, enabled, cwd = process.cwd()) {
105
+ const file = settingsPathForScope(scope, cwd);
106
+ await fs.mkdir(path.dirname(file), { recursive: true });
107
+ let existing = {};
108
+ try {
109
+ const raw = await fs.readFile(file, 'utf-8');
110
+ const parsed = JSON.parse(raw);
111
+ if (parsed && typeof parsed === 'object')
112
+ existing = parsed;
113
+ }
114
+ catch {
115
+ // first write — file may not exist yet
116
+ }
117
+ const currentMap = existing.enabledPlugins && typeof existing.enabledPlugins === 'object' && !Array.isArray(existing.enabledPlugins)
118
+ ? { ...existing.enabledPlugins }
119
+ : {};
120
+ if (currentMap[pluginId] === enabled)
121
+ return 'noop';
122
+ currentMap[pluginId] = enabled;
123
+ existing.enabledPlugins = currentMap;
124
+ await fs.writeFile(file, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
125
+ return 'changed';
126
+ }
127
+ /** Remove a plugin's entry from a scope's enabledPlugins (used by
128
+ * `/plugin uninstall` to keep settings.json tidy). */
129
+ export async function clearPluginEntry(pluginId, scope, cwd = process.cwd()) {
130
+ const file = settingsPathForScope(scope, cwd);
131
+ let existing = {};
132
+ try {
133
+ const raw = await fs.readFile(file, 'utf-8');
134
+ const parsed = JSON.parse(raw);
135
+ if (parsed && typeof parsed === 'object')
136
+ existing = parsed;
137
+ }
138
+ catch {
139
+ return 'noop';
140
+ }
141
+ if (!existing.enabledPlugins ||
142
+ typeof existing.enabledPlugins !== 'object' ||
143
+ Array.isArray(existing.enabledPlugins)) {
144
+ return 'noop';
145
+ }
146
+ const map = { ...existing.enabledPlugins };
147
+ if (!(pluginId in map))
148
+ return 'noop';
149
+ delete map[pluginId];
150
+ if (Object.keys(map).length === 0) {
151
+ delete existing.enabledPlugins;
152
+ }
153
+ else {
154
+ existing.enabledPlugins = map;
155
+ }
156
+ await fs.writeFile(file, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
157
+ return 'changed';
158
+ }
159
+ //# sourceMappingURL=enable-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable-state.js","sourceRoot":"","sources":["../../src/plugins/enable-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { type ConsentPreview } from './consent.js';
2
+ import type { InstalledPluginRecord, ManifestFormat, PluginManifest, PluginScope, PluginSource } from './types.js';
3
+ import { type UserConfigValue } from './user-config.js';
4
+ export interface InstallRequest {
5
+ source: PluginSource;
6
+ /** Marketplace this plugin belongs to. Use `"local"` for direct
7
+ * git/local installs that aren't associated with a subscribed
8
+ * marketplace — the resulting plugin id will be `<name>@local`. */
9
+ marketplace: string;
10
+ /** Scope where the install is recorded (which settings.json's
11
+ * `enabledPlugins` map will mention it). Defaults to `'user'`. */
12
+ scope?: PluginScope;
13
+ /** If set, the installer aborts when the manifest's `name` field
14
+ * doesn't match — used by the marketplace install path to catch
15
+ * spoofed entries. */
16
+ expectedName?: string;
17
+ /** Whether the marketplace listing marked this plugin as verified.
18
+ * Surfaced to the consent callback so users know whether the listing
19
+ * came with curator endorsement. Pure metadata — we don't grant
20
+ * extra trust based on the flag. */
21
+ verified?: boolean;
22
+ /** Called after manifest parse but BEFORE the temp dir is moved to
23
+ * the cache. Return false to abort the install — the temp dir is
24
+ * cleaned up and the cache is untouched. Absent ⇒ install proceeds
25
+ * without prompting (used by tests + the `--yes` CLI flag). */
26
+ consent?: (preview: ConsentPreview) => Promise<boolean> | boolean;
27
+ /** Called AFTER consent passes when the manifest declares `userConfig`.
28
+ * The caller (a CLI / TUI handler) collects values for each field —
29
+ * typically by prompting the user one field at a time, masking input
30
+ * for `sensitive: true` fields — and resolves to a `{ key: value }`
31
+ * map that gets persisted via user-config.ts. Returning `null`
32
+ * aborts the install (treat it like consent denial). Absent ⇒ we
33
+ * skip the prompt; non-sensitive fields fall back to manifest
34
+ * defaults, sensitive fields are simply unset (the plugin's hooks /
35
+ * MCP entries will see empty env vars, which is the same as today). */
36
+ userConfigPrompt?: (fields: PluginManifest['userConfig']) => Promise<Record<string, UserConfigValue> | null>;
37
+ signal?: AbortSignal;
38
+ }
39
+ export interface InstallResult {
40
+ pluginId: string;
41
+ rootDir: string;
42
+ manifest: PluginManifest;
43
+ manifestFormat: ManifestFormat;
44
+ record: InstalledPluginRecord;
45
+ }
46
+ export declare class InstallError extends Error {
47
+ constructor(message: string);
48
+ }
49
+ export declare function installPlugin(req: InstallRequest): Promise<InstallResult>;
50
+ export declare function listInstalledPlugins(): Promise<InstalledPluginRecord[]>;
51
+ export declare function findInstalledPlugin(id: string): Promise<InstalledPluginRecord | undefined>;
52
+ export interface UninstallResult {
53
+ /** Versions that were removed from cache. Empty if the plugin wasn't
54
+ * cached. */
55
+ removedVersions: string[];
56
+ /** Whether the installed_plugins.json record was removed. */
57
+ removedRecord: boolean;
58
+ }
59
+ /** Remove all cached versions of a plugin + drop its
60
+ * installed_plugins.json record. Leaves the data dir
61
+ * (`~/.x-code/plugins/data/<id>/`) intact so the user doesn't lose
62
+ * state if they reinstall later. */
63
+ export declare function uninstallPlugin(id: string): Promise<UninstallResult>;
64
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/plugins/installer.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,cAAc,EAAwC,MAAM,cAAc,CAAA;AAIxF,OAAO,KAAK,EACV,qBAAqB,EAErB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,KAAK,eAAe,EAAuB,MAAM,kBAAkB,CAAA;AAE5E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAA;IACpB;;wEAEoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB;uEACmE;IACnE,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;2BAEuB;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;yCAGqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;oEAGgE;IAChE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IACjE;;;;;;;;4EAQwE;IACxE,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,CAAA;IAC5G,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,qBAAqB,CAAA;CAC9B;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA6I/E;AA0ND,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAG7E;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAGhG;AAID,MAAM,WAAW,eAAe;IAC9B;kBACc;IACd,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,6DAA6D;IAC7D,aAAa,EAAE,OAAO,CAAA;CACvB;AAED;;;qCAGqC;AACrC,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAyB1E"}