@zhixuan92/multi-model-agent 4.0.1 → 4.0.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 (114) hide show
  1. package/README.md +6 -7
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +9 -24
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/serve.d.ts.map +1 -1
  6. package/dist/cli/serve.js +15 -16
  7. package/dist/cli/serve.js.map +1 -1
  8. package/dist/cli/status.js +1 -1
  9. package/dist/cli/status.js.map +1 -1
  10. package/dist/cli/sync-skills.d.ts +62 -0
  11. package/dist/cli/sync-skills.d.ts.map +1 -0
  12. package/dist/cli/sync-skills.js +251 -0
  13. package/dist/cli/sync-skills.js.map +1 -0
  14. package/dist/http/async-dispatch.d.ts.map +1 -1
  15. package/dist/http/async-dispatch.js +30 -6
  16. package/dist/http/async-dispatch.js.map +1 -1
  17. package/dist/http/handlers/introspection/status.js +1 -1
  18. package/dist/skills/mma-audit/SKILL.md +1 -1
  19. package/dist/skills/mma-context-blocks/SKILL.md +1 -1
  20. package/dist/skills/mma-debug/SKILL.md +1 -1
  21. package/dist/skills/mma-delegate/SKILL.md +1 -1
  22. package/dist/skills/mma-execute-plan/SKILL.md +1 -1
  23. package/dist/skills/mma-explore/SKILL.md +1 -1
  24. package/dist/skills/mma-investigate/SKILL.md +1 -1
  25. package/dist/skills/mma-retry/SKILL.md +1 -1
  26. package/dist/skills/mma-review/SKILL.md +1 -1
  27. package/dist/skills/mma-verify/SKILL.md +1 -1
  28. package/dist/skills/multi-model-agent/SKILL.md +1 -1
  29. package/package.json +3 -2
  30. package/scripts/postinstall.js +2 -2
  31. package/dist/cli/install-skill.d.ts +0 -78
  32. package/dist/cli/install-skill.d.ts.map +0 -1
  33. package/dist/cli/install-skill.js +0 -304
  34. package/dist/cli/install-skill.js.map +0 -1
  35. package/dist/cli/update-skills.d.ts +0 -16
  36. package/dist/cli/update-skills.d.ts.map +0 -1
  37. package/dist/cli/update-skills.js +0 -158
  38. package/dist/cli/update-skills.js.map +0 -1
  39. package/dist/http/loopback.d.ts +0 -17
  40. package/dist/http/loopback.d.ts.map +0 -1
  41. package/dist/http/loopback.js +0 -43
  42. package/dist/http/loopback.js.map +0 -1
  43. package/dist/http/router.d.ts +0 -19
  44. package/dist/http/router.d.ts.map +0 -1
  45. package/dist/http/router.js +0 -51
  46. package/dist/http/router.js.map +0 -1
  47. package/dist/http/wire/delegate-wire.d.ts +0 -4
  48. package/dist/http/wire/delegate-wire.d.ts.map +0 -1
  49. package/dist/http/wire/delegate-wire.js +0 -16
  50. package/dist/http/wire/delegate-wire.js.map +0 -1
  51. package/dist/http/wire/execute-plan-wire.d.ts +0 -18
  52. package/dist/http/wire/execute-plan-wire.d.ts.map +0 -1
  53. package/dist/http/wire/execute-plan-wire.js +0 -26
  54. package/dist/http/wire/execute-plan-wire.js.map +0 -1
  55. package/dist/http/wire/registry.d.ts +0 -3
  56. package/dist/http/wire/registry.d.ts.map +0 -1
  57. package/dist/http/wire/registry.js +0 -20
  58. package/dist/http/wire/registry.js.map +0 -1
  59. package/dist/install/claude-code.d.ts +0 -43
  60. package/dist/install/claude-code.d.ts.map +0 -1
  61. package/dist/install/claude-code.js +0 -65
  62. package/dist/install/claude-code.js.map +0 -1
  63. package/dist/install/codex-cli.d.ts +0 -27
  64. package/dist/install/codex-cli.d.ts.map +0 -1
  65. package/dist/install/codex-cli.js +0 -84
  66. package/dist/install/codex-cli.js.map +0 -1
  67. package/dist/install/cursor.d.ts +0 -72
  68. package/dist/install/cursor.d.ts.map +0 -1
  69. package/dist/install/cursor.js +0 -81
  70. package/dist/install/cursor.js.map +0 -1
  71. package/dist/install/discover.d.ts +0 -27
  72. package/dist/install/discover.d.ts.map +0 -1
  73. package/dist/install/discover.js +0 -67
  74. package/dist/install/discover.js.map +0 -1
  75. package/dist/install/gemini-cli.d.ts +0 -66
  76. package/dist/install/gemini-cli.d.ts.map +0 -1
  77. package/dist/install/gemini-cli.js +0 -111
  78. package/dist/install/gemini-cli.js.map +0 -1
  79. package/dist/install/headers.d.ts +0 -17
  80. package/dist/install/headers.d.ts.map +0 -1
  81. package/dist/install/headers.js +0 -22
  82. package/dist/install/headers.js.map +0 -1
  83. package/dist/install/include-utils.d.ts +0 -27
  84. package/dist/install/include-utils.d.ts.map +0 -1
  85. package/dist/install/include-utils.js +0 -90
  86. package/dist/install/include-utils.js.map +0 -1
  87. package/dist/install/manifest-resolve.d.ts +0 -17
  88. package/dist/install/manifest-resolve.d.ts.map +0 -1
  89. package/dist/install/manifest-resolve.js +0 -78
  90. package/dist/install/manifest-resolve.js.map +0 -1
  91. package/dist/install/manifest.d.ts +0 -94
  92. package/dist/install/manifest.d.ts.map +0 -1
  93. package/dist/install/manifest.js +0 -234
  94. package/dist/install/manifest.js.map +0 -1
  95. package/dist/install/missing-skills.d.ts +0 -20
  96. package/dist/install/missing-skills.d.ts.map +0 -1
  97. package/dist/install/missing-skills.js +0 -42
  98. package/dist/install/missing-skills.js.map +0 -1
  99. package/dist/install/notify.d.ts +0 -6
  100. package/dist/install/notify.d.ts.map +0 -1
  101. package/dist/install/notify.js +0 -13
  102. package/dist/install/notify.js.map +0 -1
  103. package/dist/install/orchestrate.d.ts +0 -47
  104. package/dist/install/orchestrate.d.ts.map +0 -1
  105. package/dist/install/orchestrate.js +0 -98
  106. package/dist/install/orchestrate.js.map +0 -1
  107. package/dist/install/skill-manifest-sync.d.ts +0 -11
  108. package/dist/install/skill-manifest-sync.d.ts.map +0 -1
  109. package/dist/install/skill-manifest-sync.js +0 -65
  110. package/dist/install/skill-manifest-sync.js.map +0 -1
  111. package/dist/openapi.d.ts +0 -15
  112. package/dist/openapi.d.ts.map +0 -1
  113. package/dist/openapi.js +0 -286
  114. package/dist/openapi.js.map +0 -1
@@ -1,234 +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 file exists but cannot be parsed as valid JSON. */
62
- export class ManifestParseError extends Error {
63
- constructor(manifestPath, cause) {
64
- super(`Manifest file is corrupt (${manifestPath}): ${cause}`);
65
- }
66
- }
67
- /** Thrown when the manifest JSON parses but fails Zod structural validation. */
68
- export class ManifestSchemaValidationError extends Error {
69
- constructor(manifestPath, issues) {
70
- super(`Manifest file has invalid structure (${manifestPath}): ${issues.message}`);
71
- }
72
- }
73
- // ─── Path helpers ────────────────────────────────────────────────────────────
74
- /** The directory where the manifest file lives. */
75
- export function manifestDir(homeDir) {
76
- return path.join(homeDir ?? os.homedir(), '.multi-model');
77
- }
78
- /** Full path to the manifest file. */
79
- export function manifestPath(homeDir) {
80
- return path.join(manifestDir(homeDir), MANIFEST_NAME);
81
- }
82
- // ─── Low-level I/O ───────────────────────────────────────────────────────────
83
- function backupCorrupted(p) {
84
- const backup = `${p}.bak-${Date.now()}`;
85
- try {
86
- fs.renameSync(p, backup);
87
- }
88
- catch { /* ignore — best effort */ }
89
- return backup;
90
- }
91
- function readManifest(homeDir) {
92
- const p = manifestPath(homeDir);
93
- if (!fs.existsSync(p))
94
- return emptyManifest();
95
- let raw;
96
- try {
97
- raw = fs.readFileSync(p, 'utf-8');
98
- }
99
- catch {
100
- return emptyManifest();
101
- }
102
- let parsed;
103
- try {
104
- parsed = JSON.parse(raw);
105
- }
106
- catch {
107
- const backup = backupCorrupted(p);
108
- process.stderr.write(`[mmagent] manifest corrupt; rebuilt empty v2 (previous copy at ${backup})\n`);
109
- const empty = emptyManifest();
110
- writeManifest(empty, homeDir);
111
- return empty;
112
- }
113
- const parsedVersion = parsed !== null && typeof parsed === 'object' && 'version' in parsed
114
- ? parsed.version
115
- : undefined;
116
- if (typeof parsedVersion === 'number' && parsedVersion > 2) {
117
- throw new FutureManifestError(parsedVersion);
118
- }
119
- // v2 — validate strictly
120
- if (parsedVersion === 2) {
121
- const result = installManifestSchema.safeParse(parsed);
122
- if (!result.success) {
123
- throw new ManifestSchemaValidationError(p, result.error);
124
- }
125
- return result.data;
126
- }
127
- // Unrecognized shape (or pre-v2 manifest from an older mmagent) — back up and rebuild empty.
128
- const backup = backupCorrupted(p);
129
- process.stderr.write(`[mmagent] manifest unrecognized; rebuilt empty v2 (previous copy at ${backup})\n`);
130
- const empty = emptyManifest();
131
- writeManifest(empty, homeDir);
132
- return empty;
133
- }
134
- function writeManifest(manifest, homeDir) {
135
- fs.mkdirSync(manifestDir(homeDir), { recursive: true, mode: 0o700 });
136
- fs.writeFileSync(manifestPath(homeDir), JSON.stringify(manifest, null, 2) + '\n', {
137
- encoding: 'utf-8',
138
- mode: 0o600,
139
- });
140
- }
141
- function emptyManifest() {
142
- return { version: 2, entries: [] };
143
- }
144
- // ─── Public API ─────────────────────────────────────────────────────────────
145
- /**
146
- * Return all manifest entries, newest-first.
147
- */
148
- export function listEntries(homeDir) {
149
- return readManifest(homeDir).entries;
150
- }
151
- /**
152
- * Find the entry for `skillName`, or undefined if not installed.
153
- */
154
- export function getEntry(skillName, homeDir) {
155
- return readManifest(homeDir).entries.find((e) => e.name === skillName);
156
- }
157
- /**
158
- * Append (or update) the entry for `skillName`.
159
- *
160
- * - New entry: creates with de-duplicated `newTargets`.
161
- * - Existing entry: merges `newTargets` into existing targets (no duplicates),
162
- * refreshes `version` and `installedAt`.
163
- *
164
- * In both paths the stored `targets` array is a fresh copy — caller mutations
165
- * after the call do not affect the in-memory object or persisted manifest.
166
- *
167
- * Returns the resulting entry.
168
- */
169
- export function appendEntry(skillName, skillVersion, newTargets, homeDir) {
170
- const manifest = readManifest(homeDir);
171
- // De-duplicate incoming targets once, preserving order of first occurrence.
172
- const seen = new Set();
173
- const dedupedNewTargets = newTargets.filter((t) => {
174
- if (seen.has(t))
175
- return false;
176
- seen.add(t);
177
- return true;
178
- });
179
- const existing = manifest.entries.find((e) => e.name === skillName);
180
- if (existing) {
181
- for (const t of dedupedNewTargets) {
182
- if (!existing.targets.includes(t))
183
- existing.targets.push(t);
184
- }
185
- existing.skillVersion = skillVersion;
186
- existing.installedAt = Date.now();
187
- }
188
- else {
189
- // Clone the array so the caller cannot mutate the stored entry.
190
- manifest.entries.push({
191
- name: skillName,
192
- skillVersion,
193
- installedAt: Date.now(),
194
- targets: [...dedupedNewTargets],
195
- });
196
- }
197
- writeManifest(manifest, homeDir);
198
- return existing ?? manifest.entries[manifest.entries.length - 1];
199
- }
200
- /**
201
- * Remove `targets` from the entry for `skillName`.
202
- * If `targets` is omitted or empty, removes the entire entry.
203
- * Returns the removed targets (or all targets for a full removal),
204
- * or an empty array if the skill wasn't in the manifest.
205
- */
206
- export function removeEntry(skillName, targets = [], homeDir) {
207
- const manifest = readManifest(homeDir);
208
- const idx = manifest.entries.findIndex((e) => e.name === skillName);
209
- if (idx === -1)
210
- return [];
211
- const entry = manifest.entries[idx];
212
- if (targets.length === 0) {
213
- // Full removal
214
- manifest.entries.splice(idx, 1);
215
- writeManifest(manifest, homeDir);
216
- return [...entry.targets];
217
- }
218
- // Partial removal: only remove specified targets
219
- const removed = entry.targets.filter((t) => targets.includes(t));
220
- entry.targets = entry.targets.filter((t) => !removed.includes(t));
221
- if (entry.targets.length === 0) {
222
- manifest.entries.splice(idx, 1);
223
- }
224
- writeManifest(manifest, homeDir);
225
- return removed;
226
- }
227
- /**
228
- * Returns true when `skillName` is recorded in the manifest with at least one target.
229
- */
230
- export function isInstalled(skillName, homeDir) {
231
- const e = getEntry(skillName, homeDir);
232
- return e !== undefined && e.targets.length > 0;
233
- }
234
- //# sourceMappingURL=manifest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/install/manifest.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import type { ManifestEntry, Client } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
2
- export interface MissingSkill {
3
- name: string;
4
- targets: Client[];
5
- }
6
- /**
7
- * Skills present in `supportedSkills` but not in `manifestEntries`. The
8
- * `targets` for each missing skill is the union of all targets currently
9
- * in the manifest, preserving first-seen order. Returns [] when the
10
- * manifest is empty (the user never opted in to any mma skills).
11
- */
12
- export declare function findMissingSkills(manifestEntries: ManifestEntry[], supportedSkills: readonly string[]): MissingSkill[];
13
- /**
14
- * Skills present in the manifest but NOT in `supportedSkills`. These are
15
- * orphaned — previously installed but no longer shipped. The `targets`
16
- * for each orphan is the entry's recorded targets (so the caller knows
17
- * which client dirs to clean).
18
- */
19
- export declare function findOrphanedSkills(manifestEntries: ManifestEntry[], supportedSkills: readonly string[]): ManifestEntry[];
20
- //# sourceMappingURL=missing-skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"missing-skills.d.ts","sourceRoot":"","sources":["../../src/install/missing-skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,yDAAyD,CAAC;AAErG,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,aAAa,EAAE,EAChC,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,YAAY,EAAE,CAUhB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,aAAa,EAAE,EAChC,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,aAAa,EAAE,CAEjB"}
@@ -1,42 +0,0 @@
1
- /**
2
- * Skills present in `supportedSkills` but not in `manifestEntries`. The
3
- * `targets` for each missing skill is the union of all targets currently
4
- * in the manifest, preserving first-seen order. Returns [] when the
5
- * manifest is empty (the user never opted in to any mma skills).
6
- */
7
- export function findMissingSkills(manifestEntries, supportedSkills) {
8
- if (manifestEntries.length === 0)
9
- return [];
10
- const targets = unionTargets(manifestEntries);
11
- // If every entry has empty targets (corrupt or never-completed install),
12
- // treat as no opted-in clients — same as an empty manifest.
13
- if (targets.length === 0)
14
- return [];
15
- const installedNames = new Set(manifestEntries.map((e) => e.name));
16
- return supportedSkills
17
- .filter((name) => !installedNames.has(name))
18
- .map((name) => ({ name, targets: [...targets] })); // defensive copy per skill
19
- }
20
- /**
21
- * Skills present in the manifest but NOT in `supportedSkills`. These are
22
- * orphaned — previously installed but no longer shipped. The `targets`
23
- * for each orphan is the entry's recorded targets (so the caller knows
24
- * which client dirs to clean).
25
- */
26
- export function findOrphanedSkills(manifestEntries, supportedSkills) {
27
- return manifestEntries.filter((e) => !supportedSkills.includes(e.name));
28
- }
29
- function unionTargets(entries) {
30
- const seen = new Set();
31
- const out = [];
32
- for (const e of entries) {
33
- for (const t of e.targets) {
34
- if (!seen.has(t)) {
35
- seen.add(t);
36
- out.push(t);
37
- }
38
- }
39
- }
40
- return out;
41
- }
42
- //# sourceMappingURL=missing-skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"missing-skills.js","sourceRoot":"","sources":["../../src/install/missing-skills.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,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,yEAAyE;IACzE,4DAA4D;IAC5D,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,CAAE,2BAA2B;AACnF,CAAC;AAED;;;;;GAKG;AACH,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"}
@@ -1,6 +0,0 @@
1
- export declare function notifySkillInstalled(opts: {
2
- skillId: string;
3
- client: string;
4
- fetch?: typeof globalThis.fetch;
5
- }): void;
6
- //# sourceMappingURL=notify.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/install/notify.ts"],"names":[],"mappings":"AAEA,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,CAWP"}
@@ -1,13 +0,0 @@
1
- import { toHeaderClientName } from './headers.js';
2
- export function notifySkillInstalled(opts) {
3
- // V3: no separate skill.installed telemetry event.
4
- // Skill usage is visible via route distribution on task.completed.
5
- const headerClient = toHeaderClientName(opts.client);
6
- const _fetch = opts.fetch ?? globalThis.fetch;
7
- _fetch('http://localhost:7331/v1/events', {
8
- method: 'POST',
9
- headers: { 'X-MMA-Client': headerClient, 'Content-Type': 'application/json' },
10
- body: JSON.stringify({ event: 'skill_installed', skillId: opts.skillId, client: opts.client }),
11
- }).catch(() => { });
12
- }
13
- //# sourceMappingURL=notify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/install/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,oBAAoB,CAAC,IAIpC;IACC,mDAAmD;IACnD,mEAAmE;IAEnE,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"}
@@ -1,47 +0,0 @@
1
- import type { Client } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
2
- export interface InstallResult {
3
- skill: string;
4
- action: 'installed' | 'uninstalled';
5
- /** Targets for which the operation succeeded. */
6
- targets: Client[];
7
- /** Targets that were skipped (dry-run, unknown, or not applicable). */
8
- skipped: Client[];
9
- /** Files would be written but were not (dry-run mode). */
10
- dryRun: boolean;
11
- /** Orphaned skill names removed during cleanup, per client. */
12
- orphanedSkills?: Partial<Record<Client, string[]>>;
13
- }
14
- /**
15
- * Scan an install directory for `mma-*` subdirectories and remove any that
16
- * are not in `canonicalSkills`. Returns the list of removed skill names.
17
- *
18
- * Only applies to clients that use per-skill directories (claude-code, codex).
19
- * Gemini and Cursor use single-file models and are handled separately.
20
- */
21
- export declare function activeCleanup(installDir: string, canonicalSkills: readonly string[]): string[];
22
- /**
23
- * Install a skill to the specified client targets.
24
- * - dryRun=true: checks skill existence; does NOT write files or update manifest.
25
- * - dryRun=false: writes files via the per-client writers.
26
- */
27
- export declare function doInstall(skillName: string, targets: Client[], opts: {
28
- dryRun: boolean;
29
- homeDir: string;
30
- skillsRoot?: string;
31
- version?: string;
32
- cwd?: string;
33
- force?: boolean;
34
- /** When true, scan install dirs and remove orphaned mma-* skills not in SUPPORTED_SKILLS. */
35
- cleanupOrphans?: boolean;
36
- }): InstallResult;
37
- /**
38
- * Uninstall a skill from the specified client targets.
39
- * - dryRun=true: resolves targets; does NOT remove files or update manifest.
40
- * - dryRun=false: removes files via the per-client removers.
41
- */
42
- export declare function doUninstall(skillName: string, targets: Client[], opts: {
43
- dryRun: boolean;
44
- homeDir: string;
45
- cwd?: string;
46
- }): InstallResult;
47
- //# sourceMappingURL=orchestrate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrate.d.ts","sourceRoot":"","sources":["../../src/install/orchestrate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yDAAyD,CAAC;AAQtF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,GAAG,aAAa,CAAC;IACpC,iDAAiD;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,uEAAuE;IACvE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;CACpD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAc9F;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE;IACJ,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6FAA6F;IAC7F,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACA,aAAa,CA6Cf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,aAAa,CAef"}
@@ -1,98 +0,0 @@
1
- // Install/uninstall orchestration. Pure logic — no CLI/argv handling.
2
- // Extracted from cli/install-skill.ts as part of Ch 7 Task 39.
3
- import fs from 'node:fs';
4
- import path from 'node:path';
5
- import { SkillNotFoundError, getSkillsRoot, readSkillContent, SUPPORTED_SKILLS } from '@zhixuan92/multi-model-agent-core/tool-surface/discover';
6
- import { writeSkillToClient, removeSkillFromClient, resolveClientInstallDir, } from './manifest-resolve.js';
7
- /**
8
- * Scan an install directory for `mma-*` subdirectories and remove any that
9
- * are not in `canonicalSkills`. Returns the list of removed skill names.
10
- *
11
- * Only applies to clients that use per-skill directories (claude-code, codex).
12
- * Gemini and Cursor use single-file models and are handled separately.
13
- */
14
- export function activeCleanup(installDir, canonicalSkills) {
15
- let entries;
16
- try {
17
- entries = fs.readdirSync(installDir);
18
- }
19
- catch {
20
- return [];
21
- }
22
- const present = entries.filter((name) => name.startsWith('mma-'));
23
- const orphaned = present.filter((name) => !canonicalSkills.includes(name));
24
- for (const orphan of orphaned) {
25
- const dirPath = path.join(installDir, orphan);
26
- fs.rmSync(dirPath, { recursive: true, force: true });
27
- }
28
- return orphaned;
29
- }
30
- /**
31
- * Install a skill to the specified client targets.
32
- * - dryRun=true: checks skill existence; does NOT write files or update manifest.
33
- * - dryRun=false: writes files via the per-client writers.
34
- */
35
- export function doInstall(skillName, targets, opts) {
36
- const checkedPath = path.join(getSkillsRoot(opts.skillsRoot), skillName, 'SKILL.md');
37
- const content = readSkillContent(skillName, opts.skillsRoot);
38
- if (!content) {
39
- throw new SkillNotFoundError(skillName, checkedPath);
40
- }
41
- const skillsRoot = getSkillsRoot(opts.skillsRoot);
42
- const version = opts.version ?? '0.0.0';
43
- const cwd = opts.cwd ?? process.cwd();
44
- const installed = [];
45
- const skipped = [];
46
- for (const target of targets) {
47
- if (opts.dryRun) {
48
- skipped.push(target);
49
- }
50
- else {
51
- writeSkillToClient(skillName, content, target, opts.homeDir, skillsRoot, version, cwd, opts.force);
52
- installed.push(target);
53
- }
54
- }
55
- // Active cleanup: runs after writes complete. Opt-in so single-skill
56
- // invocations don't accidentally wipe other canonical skills.
57
- let orphanedSkills;
58
- if (opts.cleanupOrphans && !opts.dryRun) {
59
- orphanedSkills = {};
60
- for (const target of targets) {
61
- const installDir = resolveClientInstallDir(target, opts.homeDir);
62
- if (installDir !== null) {
63
- const removed = activeCleanup(installDir, SUPPORTED_SKILLS);
64
- if (removed.length > 0)
65
- orphanedSkills[target] = removed;
66
- }
67
- }
68
- }
69
- return {
70
- skill: skillName,
71
- action: 'installed',
72
- targets: installed,
73
- skipped,
74
- dryRun: opts.dryRun,
75
- ...(orphanedSkills ? { orphanedSkills } : {}),
76
- };
77
- }
78
- /**
79
- * Uninstall a skill from the specified client targets.
80
- * - dryRun=true: resolves targets; does NOT remove files or update manifest.
81
- * - dryRun=false: removes files via the per-client removers.
82
- */
83
- export function doUninstall(skillName, targets, opts) {
84
- const cwd = opts.cwd ?? process.cwd();
85
- const installed = [];
86
- const skipped = [];
87
- for (const target of targets) {
88
- if (opts.dryRun) {
89
- skipped.push(target);
90
- }
91
- else {
92
- removeSkillFromClient(skillName, target, opts.homeDir, cwd);
93
- installed.push(target);
94
- }
95
- }
96
- return { skill: skillName, action: 'uninstalled', targets: installed, skipped, dryRun: opts.dryRun };
97
- }
98
- //# sourceMappingURL=orchestrate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/install/orchestrate.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,+DAA+D;AAC/D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yDAAyD,CAAC;AAChJ,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAe/B;;;;;;GAMG;AACH,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;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,SAAiB,EACjB,OAAiB,EACjB,IASC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACnG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,8DAA8D;IAC9D,IAAI,cAA6D,CAAC;IAClE,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACxC,cAAc,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;gBAC5D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,SAAS;QAClB,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,OAAiB,EACjB,IAAwD;IAExD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5D,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACvG,CAAC"}
@@ -1,11 +0,0 @@
1
- import type { Client } from './manifest.js';
2
- export interface DriftEntry {
3
- skill: string;
4
- client: Client;
5
- issue: 'missing' | 'outdated' | 'orphan';
6
- }
7
- export interface SkillManifestSync {
8
- driftReport(): DriftEntry[];
9
- }
10
- export declare function makeSkillManifestSync(perClientInstallDirs: Partial<Record<Client, string>>): SkillManifestSync;
11
- //# sourceMappingURL=skill-manifest-sync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-manifest-sync.d.ts","sourceRoot":"","sources":["../../src/install/skill-manifest-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,IAAI,UAAU,EAAE,CAAC;CAC7B;AAcD,wBAAgB,qBAAqB,CAAC,oBAAoB,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,iBAAiB,CAuC9G"}
@@ -1,65 +0,0 @@
1
- import { readdirSync, readFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { SUPPORTED_SKILLS, readSkillContent } from './discover.js';
4
- import matter from 'gray-matter';
5
- function canonicalVersion(skillName) {
6
- const content = readSkillContent(skillName);
7
- if (content === null)
8
- return null;
9
- try {
10
- const parsed = matter(content);
11
- const v = parsed.data['version'];
12
- return typeof v === 'string' ? v : null;
13
- }
14
- catch {
15
- return null;
16
- }
17
- }
18
- export function makeSkillManifestSync(perClientInstallDirs) {
19
- return {
20
- driftReport() {
21
- const drift = [];
22
- const supported = new Set(SUPPORTED_SKILLS);
23
- for (const [client, dir] of Object.entries(perClientInstallDirs)) {
24
- let entries;
25
- try {
26
- entries = readdirSync(dir);
27
- }
28
- catch {
29
- continue;
30
- }
31
- const present = new Set(entries.filter(n => n.startsWith('mma-') || n === 'multi-model-agent'));
32
- for (const exp of supported) {
33
- if (!present.has(exp))
34
- drift.push({ skill: exp, client: client, issue: 'missing' });
35
- }
36
- for (const got of present) {
37
- if (!supported.has(got)) {
38
- drift.push({ skill: got, client: client, issue: 'orphan' });
39
- }
40
- }
41
- for (const skill of present) {
42
- if (!supported.has(skill))
43
- continue;
44
- const canonVer = canonicalVersion(skill);
45
- if (canonVer === null)
46
- continue;
47
- const installedPath = join(dir, skill, 'SKILL.md');
48
- try {
49
- const installedContent = readFileSync(installedPath, 'utf-8');
50
- const parsed = matter(installedContent);
51
- const installedVer = parsed.data['version'];
52
- if (typeof installedVer === 'string' && installedVer !== canonVer) {
53
- drift.push({ skill, client: client, issue: 'outdated' });
54
- }
55
- }
56
- catch {
57
- // skip outdated check if installed SKILL.md is unreadable
58
- }
59
- }
60
- }
61
- return drift;
62
- },
63
- };
64
- }
65
- //# sourceMappingURL=skill-manifest-sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-manifest-sync.js","sourceRoot":"","sources":["../../src/install/skill-manifest-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,MAAM,MAAM,aAAa,CAAC;AAYjC,SAAS,gBAAgB,CAAC,SAAiB;IACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,oBAAqD;IACzF,OAAO;QACL,WAAW;YACT,MAAM,KAAK,GAAiB,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;YACpD,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACjE,IAAI,OAAiB,CAAC;gBACtB,IAAI,CAAC;oBAAC,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACvD,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,mBAAmB,CAAC,CACvE,CAAC;gBACF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAChG,CAAC;gBACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACxE,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;wBAAE,SAAS;oBACpC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACzC,IAAI,QAAQ,KAAK,IAAI;wBAAE,SAAS;oBAChC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;oBACnD,IAAI,CAAC;wBACH,MAAM,gBAAgB,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;wBAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;wBACxC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAC5C,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;4BAClE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;wBACrE,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,0DAA0D;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/openapi.d.ts DELETED
@@ -1,15 +0,0 @@
1
- /** Shared `cwd` query parameter (required by all tool endpoints). */
2
- declare const cwdQueryParam: {
3
- name: string;
4
- in: "query";
5
- required: boolean;
6
- description: string;
7
- schema: {
8
- type: "string";
9
- };
10
- };
11
- export declare function buildOpenApiDoc(): Record<string, unknown>;
12
- /** Utility: serialize the OpenAPI doc with sorted keys for golden snapshots. */
13
- export declare function serializeOpenApiDoc(doc: Record<string, unknown>): string;
14
- export { cwdQueryParam };
15
- //# sourceMappingURL=openapi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAmFA,qEAAqE;AACrE,QAAA,MAAM,aAAa;;;;;;;;CAMlB,CAAC;AAyDF,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiKzD;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAExE;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}