@zhixuan92/multi-model-agent 4.9.1 → 5.0.1

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/README.md +4 -3
  2. package/bin/mmagent.mjs +47 -0
  3. package/package.json +24 -43
  4. package/postinstall.mjs +8 -0
  5. package/dist/cli/index.d.ts +0 -62
  6. package/dist/cli/index.d.ts.map +0 -1
  7. package/dist/cli/index.js +0 -345
  8. package/dist/cli/index.js.map +0 -1
  9. package/dist/cli/info.d.ts +0 -22
  10. package/dist/cli/info.d.ts.map +0 -1
  11. package/dist/cli/info.js +0 -100
  12. package/dist/cli/info.js.map +0 -1
  13. package/dist/cli/logs.d.ts +0 -15
  14. package/dist/cli/logs.d.ts.map +0 -1
  15. package/dist/cli/logs.js +0 -102
  16. package/dist/cli/logs.js.map +0 -1
  17. package/dist/cli/print-token.d.ts +0 -18
  18. package/dist/cli/print-token.d.ts.map +0 -1
  19. package/dist/cli/print-token.js +0 -60
  20. package/dist/cli/print-token.js.map +0 -1
  21. package/dist/cli/serve.d.ts +0 -28
  22. package/dist/cli/serve.d.ts.map +0 -1
  23. package/dist/cli/serve.js +0 -405
  24. package/dist/cli/serve.js.map +0 -1
  25. package/dist/cli/status.d.ts +0 -49
  26. package/dist/cli/status.d.ts.map +0 -1
  27. package/dist/cli/status.js +0 -155
  28. package/dist/cli/status.js.map +0 -1
  29. package/dist/cli/sync-skills.d.ts +0 -58
  30. package/dist/cli/sync-skills.d.ts.map +0 -1
  31. package/dist/cli/sync-skills.js +0 -266
  32. package/dist/cli/sync-skills.js.map +0 -1
  33. package/dist/cli/telemetry.d.ts +0 -10
  34. package/dist/cli/telemetry.d.ts.map +0 -1
  35. package/dist/cli/telemetry.js +0 -161
  36. package/dist/cli/telemetry.js.map +0 -1
  37. package/dist/cli/toggle.d.ts +0 -26
  38. package/dist/cli/toggle.d.ts.map +0 -1
  39. package/dist/cli/toggle.js +0 -185
  40. package/dist/cli/toggle.js.map +0 -1
  41. package/dist/http/async-dispatch.d.ts +0 -44
  42. package/dist/http/async-dispatch.d.ts.map +0 -1
  43. package/dist/http/async-dispatch.js +0 -175
  44. package/dist/http/async-dispatch.js.map +0 -1
  45. package/dist/http/auth.d.ts +0 -20
  46. package/dist/http/auth.d.ts.map +0 -1
  47. package/dist/http/auth.js +0 -56
  48. package/dist/http/auth.js.map +0 -1
  49. package/dist/http/canonicalize-file-paths.d.ts +0 -8
  50. package/dist/http/canonicalize-file-paths.d.ts.map +0 -1
  51. package/dist/http/canonicalize-file-paths.js +0 -43
  52. package/dist/http/canonicalize-file-paths.js.map +0 -1
  53. package/dist/http/cwd-validator.d.ts +0 -11
  54. package/dist/http/cwd-validator.d.ts.map +0 -1
  55. package/dist/http/cwd-validator.js +0 -130
  56. package/dist/http/cwd-validator.js.map +0 -1
  57. package/dist/http/errors.d.ts +0 -4
  58. package/dist/http/errors.d.ts.map +0 -1
  59. package/dist/http/errors.js +0 -9
  60. package/dist/http/errors.js.map +0 -1
  61. package/dist/http/execution-context.d.ts +0 -18
  62. package/dist/http/execution-context.d.ts.map +0 -1
  63. package/dist/http/execution-context.js +0 -61
  64. package/dist/http/execution-context.js.map +0 -1
  65. package/dist/http/handler-deps.d.ts +0 -19
  66. package/dist/http/handler-deps.d.ts.map +0 -1
  67. package/dist/http/handler-deps.js +0 -2
  68. package/dist/http/handler-deps.js.map +0 -1
  69. package/dist/http/handlers/control/batch-slice.d.ts +0 -4
  70. package/dist/http/handlers/control/batch-slice.d.ts.map +0 -1
  71. package/dist/http/handlers/control/batch-slice.js +0 -40
  72. package/dist/http/handlers/control/batch-slice.js.map +0 -1
  73. package/dist/http/handlers/control/batch.d.ts +0 -23
  74. package/dist/http/handlers/control/batch.d.ts.map +0 -1
  75. package/dist/http/handlers/control/batch.js +0 -332
  76. package/dist/http/handlers/control/batch.js.map +0 -1
  77. package/dist/http/handlers/control/context-blocks.d.ts +0 -22
  78. package/dist/http/handlers/control/context-blocks.d.ts.map +0 -1
  79. package/dist/http/handlers/control/context-blocks.js +0 -111
  80. package/dist/http/handlers/control/context-blocks.js.map +0 -1
  81. package/dist/http/handlers/introspection/health.d.ts +0 -20
  82. package/dist/http/handlers/introspection/health.d.ts.map +0 -1
  83. package/dist/http/handlers/introspection/health.js +0 -18
  84. package/dist/http/handlers/introspection/health.js.map +0 -1
  85. package/dist/http/handlers/introspection/status.d.ts +0 -26
  86. package/dist/http/handlers/introspection/status.d.ts.map +0 -1
  87. package/dist/http/handlers/introspection/status.js +0 -136
  88. package/dist/http/handlers/introspection/status.js.map +0 -1
  89. package/dist/http/handlers/tools/audit.d.ts +0 -4
  90. package/dist/http/handlers/tools/audit.d.ts.map +0 -1
  91. package/dist/http/handlers/tools/audit.js +0 -43
  92. package/dist/http/handlers/tools/audit.js.map +0 -1
  93. package/dist/http/handlers/tools/debug.d.ts +0 -4
  94. package/dist/http/handlers/tools/debug.d.ts.map +0 -1
  95. package/dist/http/handlers/tools/debug.js +0 -43
  96. package/dist/http/handlers/tools/debug.js.map +0 -1
  97. package/dist/http/handlers/tools/delegate.d.ts +0 -4
  98. package/dist/http/handlers/tools/delegate.d.ts.map +0 -1
  99. package/dist/http/handlers/tools/delegate.js +0 -43
  100. package/dist/http/handlers/tools/delegate.js.map +0 -1
  101. package/dist/http/handlers/tools/execute-plan.d.ts +0 -4
  102. package/dist/http/handlers/tools/execute-plan.d.ts.map +0 -1
  103. package/dist/http/handlers/tools/execute-plan.js +0 -45
  104. package/dist/http/handlers/tools/execute-plan.js.map +0 -1
  105. package/dist/http/handlers/tools/investigate.d.ts +0 -4
  106. package/dist/http/handlers/tools/investigate.d.ts.map +0 -1
  107. package/dist/http/handlers/tools/investigate.js +0 -64
  108. package/dist/http/handlers/tools/investigate.js.map +0 -1
  109. package/dist/http/handlers/tools/journal-recall.d.ts +0 -4
  110. package/dist/http/handlers/tools/journal-recall.d.ts.map +0 -1
  111. package/dist/http/handlers/tools/journal-recall.js +0 -40
  112. package/dist/http/handlers/tools/journal-recall.js.map +0 -1
  113. package/dist/http/handlers/tools/journal-record.d.ts +0 -4
  114. package/dist/http/handlers/tools/journal-record.d.ts.map +0 -1
  115. package/dist/http/handlers/tools/journal-record.js +0 -35
  116. package/dist/http/handlers/tools/journal-record.js.map +0 -1
  117. package/dist/http/handlers/tools/research.d.ts +0 -4
  118. package/dist/http/handlers/tools/research.d.ts.map +0 -1
  119. package/dist/http/handlers/tools/research.js +0 -64
  120. package/dist/http/handlers/tools/research.js.map +0 -1
  121. package/dist/http/handlers/tools/retry.d.ts +0 -4
  122. package/dist/http/handlers/tools/retry.d.ts.map +0 -1
  123. package/dist/http/handlers/tools/retry.js +0 -73
  124. package/dist/http/handlers/tools/retry.js.map +0 -1
  125. package/dist/http/handlers/tools/review.d.ts +0 -4
  126. package/dist/http/handlers/tools/review.d.ts.map +0 -1
  127. package/dist/http/handlers/tools/review.js +0 -43
  128. package/dist/http/handlers/tools/review.js.map +0 -1
  129. package/dist/http/middleware/body-reader.d.ts +0 -16
  130. package/dist/http/middleware/body-reader.d.ts.map +0 -1
  131. package/dist/http/middleware/body-reader.js +0 -44
  132. package/dist/http/middleware/body-reader.js.map +0 -1
  133. package/dist/http/middleware/caller-identity.d.ts +0 -16
  134. package/dist/http/middleware/caller-identity.d.ts.map +0 -1
  135. package/dist/http/middleware/caller-identity.js +0 -16
  136. package/dist/http/middleware/caller-identity.js.map +0 -1
  137. package/dist/http/middleware/decompress.d.ts +0 -14
  138. package/dist/http/middleware/decompress.d.ts.map +0 -1
  139. package/dist/http/middleware/decompress.js +0 -51
  140. package/dist/http/middleware/decompress.js.map +0 -1
  141. package/dist/http/project-registry.d.ts +0 -54
  142. package/dist/http/project-registry.d.ts.map +0 -1
  143. package/dist/http/project-registry.js +0 -130
  144. package/dist/http/project-registry.js.map +0 -1
  145. package/dist/http/request-observability.d.ts +0 -8
  146. package/dist/http/request-observability.d.ts.map +0 -1
  147. package/dist/http/request-observability.js +0 -20
  148. package/dist/http/request-observability.js.map +0 -1
  149. package/dist/http/request-pipeline.d.ts +0 -16
  150. package/dist/http/request-pipeline.d.ts.map +0 -1
  151. package/dist/http/request-pipeline.js +0 -144
  152. package/dist/http/request-pipeline.js.map +0 -1
  153. package/dist/http/server.d.ts +0 -17
  154. package/dist/http/server.d.ts.map +0 -1
  155. package/dist/http/server.js +0 -300
  156. package/dist/http/server.js.map +0 -1
  157. package/dist/http/types.d.ts +0 -20
  158. package/dist/http/types.d.ts.map +0 -1
  159. package/dist/http/types.js +0 -2
  160. package/dist/http/types.js.map +0 -1
  161. package/dist/skill-install/disabled-state.d.ts +0 -35
  162. package/dist/skill-install/disabled-state.d.ts.map +0 -1
  163. package/dist/skill-install/disabled-state.js +0 -96
  164. package/dist/skill-install/disabled-state.js.map +0 -1
  165. package/dist/skill-install/discover.d.ts +0 -29
  166. package/dist/skill-install/discover.d.ts.map +0 -1
  167. package/dist/skill-install/discover.js +0 -104
  168. package/dist/skill-install/discover.js.map +0 -1
  169. package/dist/skill-install/include-utils.d.ts +0 -27
  170. package/dist/skill-install/include-utils.d.ts.map +0 -1
  171. package/dist/skill-install/include-utils.js +0 -90
  172. package/dist/skill-install/include-utils.js.map +0 -1
  173. package/dist/skill-install/manifest.d.ts +0 -82
  174. package/dist/skill-install/manifest.d.ts.map +0 -1
  175. package/dist/skill-install/manifest.js +0 -215
  176. package/dist/skill-install/manifest.js.map +0 -1
  177. package/dist/skill-install/skill-installer-common.d.ts +0 -26
  178. package/dist/skill-install/skill-installer-common.d.ts.map +0 -1
  179. package/dist/skill-install/skill-installer-common.js +0 -139
  180. package/dist/skill-install/skill-installer-common.js.map +0 -1
  181. package/dist/skill-install/skill-installers/claude-code.d.ts +0 -43
  182. package/dist/skill-install/skill-installers/claude-code.d.ts.map +0 -1
  183. package/dist/skill-install/skill-installers/claude-code.js +0 -65
  184. package/dist/skill-install/skill-installers/claude-code.js.map +0 -1
  185. package/dist/skill-install/skill-installers/codex-cli.d.ts +0 -27
  186. package/dist/skill-install/skill-installers/codex-cli.d.ts.map +0 -1
  187. package/dist/skill-install/skill-installers/codex-cli.js +0 -84
  188. package/dist/skill-install/skill-installers/codex-cli.js.map +0 -1
  189. package/dist/skill-install/skill-installers/cursor.d.ts +0 -72
  190. package/dist/skill-install/skill-installers/cursor.d.ts.map +0 -1
  191. package/dist/skill-install/skill-installers/cursor.js +0 -81
  192. package/dist/skill-install/skill-installers/cursor.js.map +0 -1
  193. package/dist/skill-install/skill-installers/gemini-cli.d.ts +0 -50
  194. package/dist/skill-install/skill-installers/gemini-cli.d.ts.map +0 -1
  195. package/dist/skill-install/skill-installers/gemini-cli.js +0 -72
  196. package/dist/skill-install/skill-installers/gemini-cli.js.map +0 -1
  197. package/dist/skill-install/skill-manifest-sync.d.ts +0 -11
  198. package/dist/skill-install/skill-manifest-sync.d.ts.map +0 -1
  199. package/dist/skill-install/skill-manifest-sync.js +0 -65
  200. package/dist/skill-install/skill-manifest-sync.js.map +0 -1
  201. package/dist/skills/_shared/auth.md +0 -41
  202. package/dist/skills/_shared/error-handling.md +0 -31
  203. package/dist/skills/_shared/polling.md +0 -88
  204. package/dist/skills/_shared/response-shape.md +0 -55
  205. package/dist/skills/_shared/review-policy.md +0 -15
  206. package/dist/skills/mma-audit/SKILL.md +0 -270
  207. package/dist/skills/mma-context-blocks/SKILL.md +0 -148
  208. package/dist/skills/mma-debug/SKILL.md +0 -208
  209. package/dist/skills/mma-delegate/SKILL.md +0 -216
  210. package/dist/skills/mma-execute-plan/SKILL.md +0 -214
  211. package/dist/skills/mma-explore/SKILL.md +0 -190
  212. package/dist/skills/mma-investigate/SKILL.md +0 -258
  213. package/dist/skills/mma-journal-recall/SKILL.md +0 -242
  214. package/dist/skills/mma-journal-record/SKILL.md +0 -189
  215. package/dist/skills/mma-research/SKILL.md +0 -223
  216. package/dist/skills/mma-retry/SKILL.md +0 -221
  217. package/dist/skills/mma-review/SKILL.md +0 -209
  218. package/dist/skills/multi-model-agent/SKILL.md +0 -206
  219. package/dist/telemetry/consent.d.ts +0 -4
  220. package/dist/telemetry/consent.d.ts.map +0 -1
  221. package/dist/telemetry/consent.js +0 -40
  222. package/dist/telemetry/consent.js.map +0 -1
  223. package/dist/telemetry/flusher.d.ts +0 -19
  224. package/dist/telemetry/flusher.d.ts.map +0 -1
  225. package/dist/telemetry/flusher.js +0 -277
  226. package/dist/telemetry/flusher.js.map +0 -1
  227. package/dist/telemetry/generation.d.ts +0 -9
  228. package/dist/telemetry/generation.d.ts.map +0 -1
  229. package/dist/telemetry/generation.js +0 -33
  230. package/dist/telemetry/generation.js.map +0 -1
  231. package/dist/telemetry/identity.d.ts +0 -9
  232. package/dist/telemetry/identity.d.ts.map +0 -1
  233. package/dist/telemetry/identity.js +0 -35
  234. package/dist/telemetry/identity.js.map +0 -1
  235. package/dist/telemetry/install-id.d.ts +0 -13
  236. package/dist/telemetry/install-id.d.ts.map +0 -1
  237. package/dist/telemetry/install-id.js +0 -49
  238. package/dist/telemetry/install-id.js.map +0 -1
  239. package/dist/telemetry/install-meta.d.ts +0 -10
  240. package/dist/telemetry/install-meta.d.ts.map +0 -1
  241. package/dist/telemetry/install-meta.js +0 -15
  242. package/dist/telemetry/install-meta.js.map +0 -1
  243. package/dist/telemetry/queue.d.ts +0 -35
  244. package/dist/telemetry/queue.d.ts.map +0 -1
  245. package/dist/telemetry/queue.js +0 -287
  246. package/dist/telemetry/queue.js.map +0 -1
  247. package/dist/telemetry/recorder.d.ts +0 -39
  248. package/dist/telemetry/recorder.d.ts.map +0 -1
  249. package/dist/telemetry/recorder.js +0 -173
  250. package/dist/telemetry/recorder.js.map +0 -1
  251. package/scripts/postinstall.js +0 -36
@@ -1,215 +0,0 @@
1
- /**
2
- * Install manifest management.
3
- *
4
- * The manifest lives at `<homeDir>/.multi-model/install-manifest.json` and records
5
- * every skill ever installed so `install-skill --uninstall` can reverse
6
- * the operation without leaving orphaned files.
7
- *
8
- * All functions accept an optional `homeDir` parameter for testability.
9
- * When omitted, `os.homedir()` is used as the default.
10
- */
11
- import fs from 'node:fs';
12
- import path from 'node:path';
13
- import os from 'node:os';
14
- import { z } from 'zod';
15
- /** All known client values — used for --all-targets and target validation. */
16
- export const ALL_CLIENTS = ['claude-code', 'gemini', 'codex', 'cursor'];
17
- /**
18
- * Detect which AI client directories exist in the home directory.
19
- * Checks for evidence of each known client:
20
- * - claude-code: ~/.claude/ directory present (installs skills under ~/.claude/skills/)
21
- * - gemini: ~/.gemini/extensions/ directory present
22
- * - codex: ~/.codex/ directory present (installs skills under ~/.codex/skills/)
23
- * - cursor: ~/.cursor/rules/ directory present
24
- *
25
- * The claude-code check deliberately accepts ~/.claude/ as sufficient signal
26
- * even when ~/.claude/skills/ does not yet exist (fresh install with no skills).
27
- */
28
- export function detectClients(homeDir) {
29
- const detected = [];
30
- if (fs.existsSync(path.join(homeDir, '.claude')))
31
- detected.push('claude-code');
32
- if (fs.existsSync(path.join(homeDir, '.gemini', 'extensions')))
33
- detected.push('gemini');
34
- if (fs.existsSync(path.join(homeDir, '.codex')))
35
- detected.push('codex');
36
- if (fs.existsSync(path.join(homeDir, '.cursor', 'rules')))
37
- detected.push('cursor');
38
- return detected;
39
- }
40
- const MANIFEST_NAME = 'install-manifest.json';
41
- // ─── Zod schema ──────────────────────────────────────────────────────────────
42
- /** Zod schema for a single client target value. */
43
- const clientSchema = z.enum(['claude-code', 'gemini', 'codex', 'cursor']);
44
- const manifestEntrySchema = z.object({
45
- name: z.string().min(1),
46
- skillVersion: z.string().min(1),
47
- installedAt: z.number().int().nonnegative(),
48
- targets: z.array(clientSchema),
49
- });
50
- const installManifestSchema = z.object({
51
- version: z.literal(2),
52
- entries: z.array(manifestEntrySchema),
53
- });
54
- /** Thrown when the manifest declares a version newer than this mmagent supports. */
55
- export class FutureManifestError extends Error {
56
- constructor(version) {
57
- super(`install-manifest.json was written by a newer mmagent (version ${version}); upgrade mmagent or remove the file to continue`);
58
- this.name = 'FutureManifestError';
59
- }
60
- }
61
- /** Thrown when the manifest JSON parses but fails Zod structural validation. */
62
- export class ManifestSchemaValidationError extends Error {
63
- constructor(manifestPath, issues) {
64
- super(`Manifest file has invalid structure (${manifestPath}): ${issues.message}`);
65
- }
66
- }
67
- // ─── Path helpers ────────────────────────────────────────────────────────────
68
- /** The directory where the manifest file lives. */
69
- export function manifestDir(homeDir) {
70
- return path.join(homeDir ?? os.homedir(), '.multi-model');
71
- }
72
- /** Full path to the manifest file. */
73
- export function manifestPath(homeDir) {
74
- return path.join(manifestDir(homeDir), MANIFEST_NAME);
75
- }
76
- // ─── Low-level I/O ───────────────────────────────────────────────────────────
77
- function backupCorrupted(p) {
78
- const backup = `${p}.bak-${Date.now()}`;
79
- try {
80
- fs.renameSync(p, backup);
81
- }
82
- catch { /* ignore — best effort */ }
83
- return backup;
84
- }
85
- function readManifest(homeDir) {
86
- const p = manifestPath(homeDir);
87
- if (!fs.existsSync(p))
88
- return emptyManifest();
89
- let raw;
90
- try {
91
- raw = fs.readFileSync(p, 'utf-8');
92
- }
93
- catch {
94
- return emptyManifest();
95
- }
96
- let parsed;
97
- try {
98
- parsed = JSON.parse(raw);
99
- }
100
- catch {
101
- const backup = backupCorrupted(p);
102
- process.stderr.write(`[mmagent] manifest corrupt; rebuilt empty v2 (previous copy at ${backup})\n`);
103
- const empty = emptyManifest();
104
- writeManifest(empty, homeDir);
105
- return empty;
106
- }
107
- const parsedVersion = parsed !== null && typeof parsed === 'object' && 'version' in parsed
108
- ? parsed.version
109
- : undefined;
110
- if (typeof parsedVersion === 'number' && parsedVersion > 2) {
111
- throw new FutureManifestError(parsedVersion);
112
- }
113
- // v2 — validate strictly
114
- if (parsedVersion === 2) {
115
- const result = installManifestSchema.safeParse(parsed);
116
- if (!result.success) {
117
- throw new ManifestSchemaValidationError(p, result.error);
118
- }
119
- return result.data;
120
- }
121
- // Unrecognized shape (or pre-v2 manifest from an older mmagent) — back up and rebuild empty.
122
- const backup = backupCorrupted(p);
123
- process.stderr.write(`[mmagent] manifest unrecognized; rebuilt empty v2 (previous copy at ${backup})\n`);
124
- const empty = emptyManifest();
125
- writeManifest(empty, homeDir);
126
- return empty;
127
- }
128
- function writeManifest(manifest, homeDir) {
129
- fs.mkdirSync(manifestDir(homeDir), { recursive: true, mode: 0o700 });
130
- fs.writeFileSync(manifestPath(homeDir), JSON.stringify(manifest, null, 2) + '\n', {
131
- encoding: 'utf-8',
132
- mode: 0o600,
133
- });
134
- }
135
- function emptyManifest() {
136
- return { version: 2, entries: [] };
137
- }
138
- // ─── Public API ─────────────────────────────────────────────────────────────
139
- /**
140
- * Return all manifest entries, newest-first.
141
- */
142
- export function listEntries(homeDir) {
143
- return readManifest(homeDir).entries;
144
- }
145
- /**
146
- * Append (or update) the entry for `skillName`.
147
- *
148
- * - New entry: creates with de-duplicated `newTargets`.
149
- * - Existing entry: merges `newTargets` into existing targets (no duplicates),
150
- * refreshes `version` and `installedAt`.
151
- *
152
- * In both paths the stored `targets` array is a fresh copy — caller mutations
153
- * after the call do not affect the in-memory object or persisted manifest.
154
- *
155
- * Returns the resulting entry.
156
- */
157
- export function appendEntry(skillName, skillVersion, newTargets, homeDir) {
158
- const manifest = readManifest(homeDir);
159
- // De-duplicate incoming targets once, preserving order of first occurrence.
160
- const seen = new Set();
161
- const dedupedNewTargets = newTargets.filter((t) => {
162
- if (seen.has(t))
163
- return false;
164
- seen.add(t);
165
- return true;
166
- });
167
- const existing = manifest.entries.find((e) => e.name === skillName);
168
- if (existing) {
169
- for (const t of dedupedNewTargets) {
170
- if (!existing.targets.includes(t))
171
- existing.targets.push(t);
172
- }
173
- existing.skillVersion = skillVersion;
174
- existing.installedAt = Date.now();
175
- }
176
- else {
177
- // Clone the array so the caller cannot mutate the stored entry.
178
- manifest.entries.push({
179
- name: skillName,
180
- skillVersion,
181
- installedAt: Date.now(),
182
- targets: [...dedupedNewTargets],
183
- });
184
- }
185
- writeManifest(manifest, homeDir);
186
- return existing ?? manifest.entries[manifest.entries.length - 1];
187
- }
188
- /**
189
- * Remove `targets` from the entry for `skillName`.
190
- * If `targets` is omitted or empty, removes the entire entry.
191
- * Returns the removed targets (or all targets for a full removal),
192
- * or an empty array if the skill wasn't in the manifest.
193
- */
194
- export function removeEntry(skillName, targets = [], homeDir) {
195
- const manifest = readManifest(homeDir);
196
- const idx = manifest.entries.findIndex((e) => e.name === skillName);
197
- if (idx === -1)
198
- return [];
199
- const entry = manifest.entries[idx];
200
- if (targets.length === 0) {
201
- // Full removal
202
- manifest.entries.splice(idx, 1);
203
- writeManifest(manifest, homeDir);
204
- return [...entry.targets];
205
- }
206
- // Partial removal: only remove specified targets
207
- const removed = entry.targets.filter((t) => targets.includes(t));
208
- entry.targets = entry.targets.filter((t) => !removed.includes(t));
209
- if (entry.targets.length === 0) {
210
- manifest.entries.splice(idx, 1);
211
- }
212
- writeManifest(manifest, homeDir);
213
- return removed;
214
- }
215
- //# sourceMappingURL=manifest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/skill-install/manifest.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type { Client, ManifestEntry } from './manifest.js';
2
- export type HeaderClientName = 'claude-code' | 'cursor' | 'codex-cli' | 'gemini-cli';
3
- export declare function clientHeaders(client: HeaderClientName): {
4
- 'X-MMA-Client': HeaderClientName;
5
- };
6
- export declare function toHeaderClientName(client: Client): HeaderClientName;
7
- export declare function notifySkillInstalled(opts: {
8
- skillId: string;
9
- client: string;
10
- fetch?: typeof globalThis.fetch;
11
- }): void;
12
- export interface MissingSkill {
13
- name: string;
14
- targets: Client[];
15
- }
16
- export declare function findMissingSkills(manifestEntries: ManifestEntry[], supportedSkills: readonly string[]): MissingSkill[];
17
- export declare function findOrphanedSkills(manifestEntries: ManifestEntry[], supportedSkills: readonly string[]): ManifestEntry[];
18
- export declare function resolveClientInstallDir(target: Client, homeDir: string): string | null;
19
- export declare class UnknownTargetError extends Error {
20
- readonly code: "unknown_target";
21
- constructor(target: string, valid: readonly string[]);
22
- }
23
- export declare function writeSkillToClient(skillName: string, content: string, target: Client, homeDir: string, skillsRoot: string, version?: string, cwd?: string, force?: boolean): void;
24
- export declare function removeSkillFromClient(skillName: string, target: Client, homeDir: string, cwd?: string): void;
25
- export declare function activeCleanup(installDir: string, canonicalSkills: readonly string[]): string[];
26
- //# sourceMappingURL=skill-installer-common.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-installer-common.d.ts","sourceRoot":"","sources":["../../src/skill-install/skill-installer-common.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAc3D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAErF,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB;;EAErD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAOnE;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC,GAAG,IAAI,CAQP;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,aAAa,EAAE,EAChC,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,YAAY,EAAE,CAQhB;AAED,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,aAAa,EAAE,EAChC,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,aAAa,EAAE,CAEjB;AAkBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAStF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;gBAC9B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE;CAGrD;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAgB,EACzB,GAAG,GAAE,MAAsB,EAC3B,KAAK,GAAE,OAAe,GACrB,IAAI,CAuBN;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAsB,GAC1B,IAAI,CAmBN;AAID,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAc9F"}
@@ -1,139 +0,0 @@
1
- // Shared skill-install utilities. Per architecture.md:188-194, each client
2
- // gets its own writer under skill-installers/; this file holds the dispatch
3
- // layer, orchestration, missing-skill detection, and outbound headers/notify
4
- // code that was previously scattered across packages/server/src/install/.
5
- //
6
- // @module
7
- import fs from 'node:fs';
8
- import path from 'node:path';
9
- import { installClaudeCode, uninstallClaudeCode } from './skill-installers/claude-code.js';
10
- import { installGeminiCli, uninstallGeminiCli } from './skill-installers/gemini-cli.js';
11
- import { installCodexCli, uninstallCodexCli } from './skill-installers/codex-cli.js';
12
- import { installCursor, uninstallCursor } from './skill-installers/cursor.js';
13
- export function clientHeaders(client) {
14
- return { 'X-MMA-Client': client };
15
- }
16
- export function toHeaderClientName(client) {
17
- switch (client) {
18
- case 'claude-code': return 'claude-code';
19
- case 'cursor': return 'cursor';
20
- case 'codex': return 'codex-cli';
21
- case 'gemini': return 'gemini-cli';
22
- }
23
- }
24
- // ── Notify (was server/src/install/notify.ts) ──────────────────────────────
25
- export function notifySkillInstalled(opts) {
26
- const headerClient = toHeaderClientName(opts.client);
27
- const _fetch = opts.fetch ?? globalThis.fetch;
28
- _fetch('http://localhost:7331/v1/events', {
29
- method: 'POST',
30
- headers: { 'X-MMA-Client': headerClient, 'Content-Type': 'application/json' },
31
- body: JSON.stringify({ event: 'skill_installed', skillId: opts.skillId, client: opts.client }),
32
- }).catch(() => { });
33
- }
34
- export function findMissingSkills(manifestEntries, supportedSkills) {
35
- if (manifestEntries.length === 0)
36
- return [];
37
- const targets = unionTargets(manifestEntries);
38
- if (targets.length === 0)
39
- return [];
40
- const installedNames = new Set(manifestEntries.map((e) => e.name));
41
- return supportedSkills
42
- .filter((name) => !installedNames.has(name))
43
- .map((name) => ({ name, targets: [...targets] }));
44
- }
45
- export function findOrphanedSkills(manifestEntries, supportedSkills) {
46
- return manifestEntries.filter((e) => !supportedSkills.includes(e.name));
47
- }
48
- function unionTargets(entries) {
49
- const seen = new Set();
50
- const out = [];
51
- for (const e of entries) {
52
- for (const t of e.targets) {
53
- if (!seen.has(t)) {
54
- seen.add(t);
55
- out.push(t);
56
- }
57
- }
58
- }
59
- return out;
60
- }
61
- // ── Per-client dispatch (was server/src/install/manifest-resolve.ts) ────────
62
- export function resolveClientInstallDir(target, homeDir) {
63
- switch (target) {
64
- case 'claude-code':
65
- return path.join(homeDir, '.claude', 'skills');
66
- case 'codex':
67
- return path.join(homeDir, '.codex', 'skills');
68
- default:
69
- return null;
70
- }
71
- }
72
- export class UnknownTargetError extends Error {
73
- code = 'unknown_target';
74
- constructor(target, valid) {
75
- super(`Unknown target '${target}'. Valid: ${valid.join(', ')}`);
76
- }
77
- }
78
- export function writeSkillToClient(skillName, content, target, homeDir, skillsRoot, version = '0.0.0', cwd = process.cwd(), force = false) {
79
- switch (target) {
80
- case 'claude-code':
81
- installClaudeCode({ skillName, content, homeDir, skillsRoot });
82
- notifySkillInstalled({ skillId: skillName, client: target });
83
- break;
84
- case 'gemini':
85
- installGeminiCli({ skillName, content, skillVersion: version, homeDir, skillsRoot });
86
- notifySkillInstalled({ skillId: skillName, client: target });
87
- break;
88
- case 'codex':
89
- installCodexCli({ skillName, content, homeDir, skillsRoot });
90
- notifySkillInstalled({ skillId: skillName, client: target });
91
- break;
92
- case 'cursor':
93
- installCursor({ content, cwd, homeDir, skillsRoot, force });
94
- notifySkillInstalled({ skillId: skillName, client: target });
95
- break;
96
- default: {
97
- const _exhaustive = target;
98
- throw new Error(`install-skill: unknown target: ${_exhaustive}`);
99
- }
100
- }
101
- }
102
- export function removeSkillFromClient(skillName, target, homeDir, cwd = process.cwd()) {
103
- switch (target) {
104
- case 'claude-code':
105
- uninstallClaudeCode(skillName, homeDir);
106
- break;
107
- case 'gemini':
108
- uninstallGeminiCli(homeDir);
109
- break;
110
- case 'codex':
111
- uninstallCodexCli(skillName, homeDir);
112
- break;
113
- case 'cursor':
114
- uninstallCursor(cwd);
115
- break;
116
- default: {
117
- const _exhaustive = target;
118
- throw new Error(`install-skill: unknown target: ${_exhaustive}`);
119
- }
120
- }
121
- }
122
- // ── Orchestration (was server/src/install/orchestrate.ts) ───────────────────
123
- export function activeCleanup(installDir, canonicalSkills) {
124
- let entries;
125
- try {
126
- entries = fs.readdirSync(installDir);
127
- }
128
- catch {
129
- return [];
130
- }
131
- const present = entries.filter((name) => name.startsWith('mma-'));
132
- const orphaned = present.filter((name) => !canonicalSkills.includes(name));
133
- for (const orphan of orphaned) {
134
- const dirPath = path.join(installDir, orphan);
135
- fs.rmSync(dirPath, { recursive: true, force: true });
136
- }
137
- return orphaned;
138
- }
139
- //# sourceMappingURL=skill-installer-common.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-installer-common.js","sourceRoot":"","sources":["../../src/skill-install/skill-installer-common.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,0EAA0E;AAC1E,EAAE;AACF,UAAU;AACV,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAM9E,MAAM,UAAU,aAAa,CAAC,MAAwB;IACpD,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa,CAAC,CAAC,OAAO,aAAa,CAAC;QACzC,KAAK,QAAQ,CAAC,CAAM,OAAO,QAAQ,CAAC;QACpC,KAAK,OAAO,CAAC,CAAO,OAAO,WAAW,CAAC;QACvC,KAAK,QAAQ,CAAC,CAAM,OAAO,YAAY,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,MAAM,UAAU,oBAAoB,CAAC,IAIpC;IACC,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAkD,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAC9C,MAAM,CAAC,iCAAiC,EAAE;QACxC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC7E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;KAC/F,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAyB,CAAC,CAAC,CAAC;AAC5C,CAAC;AASD,MAAM,UAAU,iBAAiB,CAC/B,eAAgC,EAChC,eAAkC;IAElC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,OAAO,eAAe;SACnB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,eAAgC,EAChC,eAAkC;IAElC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,YAAY,CAAC,OAAwB;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,OAAe;IACrE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACjD,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,gBAAyB,CAAC;IAC1C,YAAY,MAAc,EAAE,KAAwB;QAClD,KAAK,CAAC,mBAAmB,MAAM,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;CACF;AAED,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,OAAe,EACf,MAAc,EACd,OAAe,EACf,UAAkB,EAClB,UAAkB,OAAO,EACzB,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,QAAiB,KAAK;IAEtB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,iBAAiB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAC/D,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,QAAQ;YACX,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACrF,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,OAAO;YACV,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAC7D,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,QAAQ;YACX,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,oBAAoB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,MAAM;QACR,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAqB,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,MAAc,EACd,OAAe,EACf,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM;QACR,KAAK,QAAQ;YACX,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM;QACR,KAAK,OAAO;YACV,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtC,MAAM;QACR,KAAK,QAAQ;YACX,eAAe,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAqB,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,eAAkC;IAClF,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,43 +0,0 @@
1
- /**
2
- * Options for installing a Claude Code skill.
3
- */
4
- export interface ClaudeCodeInstallOpts {
5
- /** Human-readable name of the skill (used in file path). */
6
- skillName: string;
7
- /**
8
- * Raw skill content. May contain `@include _shared/<file>.md` directives
9
- * which are inlined before writing.
10
- */
11
- content: string;
12
- /**
13
- * Home directory — replaces `os.homedir()` in all file operations.
14
- * Must NOT default to `os.homedir()`.
15
- */
16
- homeDir: string;
17
- /** Root of the skills directory for @include resolution. */
18
- skillsRoot: string;
19
- }
20
- /**
21
- * Write (or overwrite) the SKILL.md file for a Claude Code skill.
22
- *
23
- * Target path: `<homeDir>/.claude/skills/<skillName>/SKILL.md`
24
- *
25
- * @param opts Installation options (see `ClaudeCodeInstallOpts`).
26
- */
27
- export declare function installClaudeCode(opts: ClaudeCodeInstallOpts): void;
28
- /**
29
- * Uninstall a Claude Code skill by removing its directory.
30
- *
31
- * Target: `<homeDir>/.claude/skills/<skillName>/`
32
- *
33
- * Security: `skillName` is validated against the expected skills directory
34
- * boundary to prevent path traversal (e.g. `../other-dir`). If `skillName`
35
- * resolves outside the skills directory, the function is a no-op.
36
- *
37
- * This is also a no-op when the directory does not exist (no error is thrown).
38
- *
39
- * @param skillName Name of the skill to uninstall.
40
- * @param homeDir Home directory where the skill directory lives.
41
- */
42
- export declare function uninstallClaudeCode(skillName: string, homeDir: string): void;
43
- //# sourceMappingURL=claude-code.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/skill-install/skill-installers/claude-code.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAUnE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAe5E"}
@@ -1,65 +0,0 @@
1
- /**
2
- * Claude Code skill writer for install-skill.
3
- *
4
- * Writes each skill's SKILL.md to `<homeDir>/.claude/skills/<skillName>/SKILL.md`.
5
- *
6
- * Before writing, inlines any `@include _shared/<file>.md` directives found in
7
- * the content. The directive line is replaced with the full content of the
8
- * corresponding shared file sourced from `<skillsRoot>/_shared/<file>.md`.
9
- * The `@include` directive is NOT preserved in the written file.
10
- *
11
- * If a referenced shared file is missing (ENOENT):
12
- * - A warning is logged to stderr.
13
- * - The include line is removed from the output (not preserved).
14
- * - Processing continues for remaining content.
15
- *
16
- * @module
17
- */
18
- import fs from 'node:fs';
19
- import path from 'node:path';
20
- import { inlineIncludes } from '../include-utils.js';
21
- /**
22
- * Write (or overwrite) the SKILL.md file for a Claude Code skill.
23
- *
24
- * Target path: `<homeDir>/.claude/skills/<skillName>/SKILL.md`
25
- *
26
- * @param opts Installation options (see `ClaudeCodeInstallOpts`).
27
- */
28
- export function installClaudeCode(opts) {
29
- const { skillName, content, homeDir, skillsRoot } = opts;
30
- // Inline @include directives before writing
31
- const inlinedContent = inlineIncludes('Claude Code skill writer', content, skillsRoot);
32
- // Determine target path: <homeDir>/.claude/skills/<skillName>/SKILL.md
33
- const skillDir = path.join(homeDir, '.claude', 'skills', skillName);
34
- fs.mkdirSync(skillDir, { recursive: true });
35
- fs.writeFileSync(path.join(skillDir, 'SKILL.md'), inlinedContent, 'utf-8');
36
- }
37
- /**
38
- * Uninstall a Claude Code skill by removing its directory.
39
- *
40
- * Target: `<homeDir>/.claude/skills/<skillName>/`
41
- *
42
- * Security: `skillName` is validated against the expected skills directory
43
- * boundary to prevent path traversal (e.g. `../other-dir`). If `skillName`
44
- * resolves outside the skills directory, the function is a no-op.
45
- *
46
- * This is also a no-op when the directory does not exist (no error is thrown).
47
- *
48
- * @param skillName Name of the skill to uninstall.
49
- * @param homeDir Home directory where the skill directory lives.
50
- */
51
- export function uninstallClaudeCode(skillName, homeDir) {
52
- const skillsBase = path.resolve(homeDir, '.claude', 'skills');
53
- // Security: validate skillName does not escape the skills directory.
54
- // Normalize skillName and verify the resolved path stays within the base.
55
- const normalizedName = path.normalize(skillName);
56
- const resolvedSkillDir = path.resolve(skillsBase, normalizedName);
57
- const baseResolved = skillsBase + path.sep;
58
- if (!resolvedSkillDir.startsWith(baseResolved)) {
59
- // skillName traversal attempt — no-op rather than throwing, matching
60
- // the "no error when directory does not exist" behaviour.
61
- return;
62
- }
63
- fs.rmSync(resolvedSkillDir, { recursive: true, force: true });
64
- }
65
- //# sourceMappingURL=claude-code.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/skill-install/skill-installers/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAsBrD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA2B;IAC3D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAEzD,4CAA4C;IAC5C,MAAM,cAAc,GAAG,cAAc,CAAC,0BAA0B,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAEvF,uEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,OAAe;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE9D,qEAAqE;IACrE,0EAA0E;IAC1E,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,qEAAqE;QACrE,0DAA0D;QAC1D,OAAO;IACT,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -1,27 +0,0 @@
1
- export interface CodexCliInstallOpts {
2
- /** Human-readable name of the skill (used in file path). */
3
- skillName: string;
4
- /** Raw skill content, possibly containing @include directives. */
5
- content: string;
6
- /**
7
- * Home directory — replaces `os.homedir()` in all file operations.
8
- * Must NOT default to `os.homedir()`.
9
- */
10
- homeDir: string;
11
- /** Root of the skills directory for @include resolution. */
12
- skillsRoot: string;
13
- }
14
- /**
15
- * Write (or overwrite) the SKILL.md file for a Codex CLI skill.
16
- *
17
- * Target path: `<homeDir>/.codex/skills/<skillName>/SKILL.md`
18
- */
19
- export declare function installCodexCli(opts: CodexCliInstallOpts): void;
20
- /**
21
- * Uninstall a Codex CLI skill by removing its directory.
22
- *
23
- * This is a no-op when the directory does not exist or when `skillName` would
24
- * escape the Codex skills directory.
25
- */
26
- export declare function uninstallCodexCli(skillName: string, homeDir: string): void;
27
- //# sourceMappingURL=codex-cli.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-cli.d.ts","sourceRoot":"","sources":["../../../src/skill-install/skill-installers/codex-cli.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAuCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAW/D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAK1E"}
@@ -1,84 +0,0 @@
1
- /**
2
- * Codex CLI skill writer for install-skill.
3
- *
4
- * Writes each skill's SKILL.md to `<homeDir>/.codex/skills/<skillName>/SKILL.md`.
5
- * Codex discovers skills from that directory on the next session start. Existing
6
- * `AGENTS.md` instructions are user-owned and are not modified by this writer.
7
- *
8
- * Before writing, any `@include _shared/<file>.md` directives are inlined using
9
- * the shared include utility. Missing shared files are warned about and omitted,
10
- * matching the other client writers.
11
- *
12
- * @module
13
- */
14
- import fs from 'node:fs';
15
- import path from 'node:path';
16
- import { inlineIncludes } from '../include-utils.js';
17
- const LEGACY_MANAGED_BEGIN = '<!-- multi-model-agent:BEGIN -->';
18
- const LEGACY_MANAGED_END = '<!-- multi-model-agent:END -->';
19
- function codexSkillsBase(homeDir) {
20
- return path.resolve(homeDir, '.codex', 'skills');
21
- }
22
- function resolveSkillDir(homeDir, skillName) {
23
- const base = codexSkillsBase(homeDir);
24
- const resolved = path.resolve(base, path.normalize(skillName));
25
- if (!resolved.startsWith(base + path.sep))
26
- return null;
27
- return resolved;
28
- }
29
- function removeLegacyManagedAgentsBlock(homeDir) {
30
- const agentsPath = path.join(homeDir, '.codex', 'AGENTS.md');
31
- let content;
32
- try {
33
- content = fs.readFileSync(agentsPath, 'utf-8');
34
- }
35
- catch (err) {
36
- if (err.code === 'ENOENT')
37
- return;
38
- throw err;
39
- }
40
- const beginIdx = content.indexOf(LEGACY_MANAGED_BEGIN);
41
- const endIdx = content.indexOf(LEGACY_MANAGED_END);
42
- if (beginIdx === -1 || endIdx === -1 || beginIdx > endIdx)
43
- return;
44
- const suffixStart = endIdx + LEGACY_MANAGED_END.length;
45
- const prefix = content.slice(0, beginIdx);
46
- const suffix = content.slice(suffixStart).replace(/^\n+/, '');
47
- const nextContent = `${prefix}${suffix}`;
48
- if (nextContent.trim() === '') {
49
- fs.unlinkSync(agentsPath);
50
- }
51
- else {
52
- fs.writeFileSync(agentsPath, nextContent, 'utf-8');
53
- }
54
- }
55
- /**
56
- * Write (or overwrite) the SKILL.md file for a Codex CLI skill.
57
- *
58
- * Target path: `<homeDir>/.codex/skills/<skillName>/SKILL.md`
59
- */
60
- export function installCodexCli(opts) {
61
- const { skillName, content, homeDir, skillsRoot } = opts;
62
- const skillDir = resolveSkillDir(homeDir, skillName);
63
- if (skillDir === null) {
64
- throw new Error(`Invalid Codex CLI skill name: ${skillName}`);
65
- }
66
- removeLegacyManagedAgentsBlock(homeDir);
67
- const inlinedContent = inlineIncludes('Codex CLI skill writer', content, skillsRoot);
68
- fs.mkdirSync(skillDir, { recursive: true });
69
- fs.writeFileSync(path.join(skillDir, 'SKILL.md'), inlinedContent, 'utf-8');
70
- }
71
- /**
72
- * Uninstall a Codex CLI skill by removing its directory.
73
- *
74
- * This is a no-op when the directory does not exist or when `skillName` would
75
- * escape the Codex skills directory.
76
- */
77
- export function uninstallCodexCli(skillName, homeDir) {
78
- removeLegacyManagedAgentsBlock(homeDir);
79
- const skillDir = resolveSkillDir(homeDir, skillName);
80
- if (skillDir === null)
81
- return;
82
- fs.rmSync(skillDir, { recursive: true, force: true });
83
- }
84
- //# sourceMappingURL=codex-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex-cli.js","sourceRoot":"","sources":["../../../src/skill-install/skill-installers/codex-cli.ts"],"names":[],"mappings":"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"}