@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
@@ -0,0 +1,251 @@
1
+ /**
2
+ * sync-skills.ts — `mmagent sync-skills` subcommand.
3
+ *
4
+ * Single command for skill management: idempotent upsert of every shipped
5
+ * skill into every detected (or specified) client. Compares canonical
6
+ * SUPPORTED_SKILLS against on-disk SKILL.md and the install manifest, and:
7
+ * - installs skills not present on disk
8
+ * - overwrites skills whose installed version differs from canonical
9
+ * - removes skills no longer in SUPPORTED_SKILLS (orphan cleanup)
10
+ * - rewrites the install manifest to reflect post-sync state
11
+ *
12
+ * Replaces install-skill + update-skills as of 4.0.2.
13
+ *
14
+ * Usage:
15
+ * mmagent sync-skills [--target=<client>] [--all-targets] [--dry-run] [--json]
16
+ * [--silent] [--best-effort] [--if-exists]
17
+ *
18
+ * Exit codes:
19
+ * 0 — success (or no clients detected)
20
+ * 1 — one or more skills failed to write/remove
21
+ * 2 — manifest was written by a newer mmagent (FutureManifestError)
22
+ * 3 — explicit --target was not a known client
23
+ */
24
+ import * as os from 'node:os';
25
+ import * as fs from 'node:fs';
26
+ import * as path from 'node:path';
27
+ import minimist from 'minimist';
28
+ import matter from 'gray-matter';
29
+ import { ALL_CLIENTS, detectClients, listEntries, appendEntry, removeEntry, FutureManifestError, } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
30
+ import { SUPPORTED_SKILLS, readSkillContent, getSkillsRoot, } from '@zhixuan92/multi-model-agent-core/tool-surface/discover';
31
+ import { writeSkillToClient, removeSkillFromClient, resolveClientInstallDir, } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
32
+ export const ExitCode = Object.freeze({
33
+ SUCCESS: 0,
34
+ ERR_PARTIAL: 1,
35
+ ERR_FUTURE_MANIFEST: 2,
36
+ ERR_UNKNOWN_TARGET: 3,
37
+ });
38
+ export function parseArgs(argv) {
39
+ const args = minimist(argv, {
40
+ string: ['target'],
41
+ boolean: ['dry-run', 'json', 'all-targets'],
42
+ alias: { t: 'target', j: 'json' },
43
+ });
44
+ let targets = null;
45
+ if (args.target) {
46
+ const t = Array.isArray(args.target) ? args.target : [args.target];
47
+ targets = t.map((s) => s);
48
+ }
49
+ return {
50
+ targets,
51
+ allTargets: args['all-targets'] === true,
52
+ dryRun: args['dry-run'] === true,
53
+ json: args['json'] === true,
54
+ };
55
+ }
56
+ export class UnknownTargetError extends Error {
57
+ code = 'unknown_target';
58
+ constructor(target, valid) {
59
+ super(`Unknown target '${target}'. Valid: ${valid.join(', ')}`);
60
+ }
61
+ }
62
+ export function resolveTargets(explicit, allTargets, homeDir) {
63
+ if (allTargets)
64
+ return [...ALL_CLIENTS];
65
+ if (explicit !== null) {
66
+ for (const t of explicit) {
67
+ if (!ALL_CLIENTS.includes(t))
68
+ throw new UnknownTargetError(t, ALL_CLIENTS);
69
+ }
70
+ return Array.from(new Set(explicit));
71
+ }
72
+ return detectClients(homeDir);
73
+ }
74
+ function versionFromContent(content) {
75
+ try {
76
+ const parsed = matter(content);
77
+ const v = parsed.data['version'];
78
+ return typeof v === 'string' && v.length > 0 ? v : 'unknown';
79
+ }
80
+ catch {
81
+ return 'unknown';
82
+ }
83
+ }
84
+ function manifestPresent(homeDir) {
85
+ return fs.existsSync(path.join(homeDir, '.multi-model', 'install-manifest.json'));
86
+ }
87
+ function readInstalledVersion(skillName, target, homeDir) {
88
+ const dir = resolveClientInstallDir(target, homeDir);
89
+ if (!dir)
90
+ return null;
91
+ const skillFile = path.join(dir, skillName, 'SKILL.md');
92
+ try {
93
+ return versionFromContent(fs.readFileSync(skillFile, 'utf8'));
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ export async function runSyncSkills(deps = {}) {
100
+ const argv = deps.argv ?? process.argv.slice(2);
101
+ const homeDir = deps.homeDir ?? os.homedir();
102
+ const skillsRoot = getSkillsRoot(deps.skillsRoot);
103
+ const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
104
+ const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
105
+ const silent = deps.silent ?? false;
106
+ const bestEffort = deps.bestEffort ?? false;
107
+ const log = silent ? (_) => true : stdout;
108
+ if (deps.ifExists && !manifestPresent(homeDir))
109
+ return ExitCode.SUCCESS;
110
+ const parsed = parseArgs(argv);
111
+ let targets;
112
+ try {
113
+ targets = resolveTargets(parsed.targets, parsed.allTargets, homeDir);
114
+ }
115
+ catch (err) {
116
+ if (err instanceof UnknownTargetError) {
117
+ stderr(`mmagent sync-skills: ${err.message}\n`);
118
+ return bestEffort ? 0 : ExitCode.ERR_UNKNOWN_TARGET;
119
+ }
120
+ throw err;
121
+ }
122
+ if (targets.length === 0) {
123
+ if (parsed.json) {
124
+ stdout(JSON.stringify({ targets: [], outcome: 'no-clients-detected' }) + '\n');
125
+ }
126
+ else {
127
+ log('No clients detected. Use --target=<client> or --all-targets.\n');
128
+ }
129
+ return ExitCode.SUCCESS;
130
+ }
131
+ let manifestEntries;
132
+ try {
133
+ manifestEntries = listEntries(homeDir);
134
+ }
135
+ catch (err) {
136
+ if (err instanceof FutureManifestError) {
137
+ stderr(`mmagent sync-skills: ${err.message}\n`);
138
+ return bestEffort ? 0 : ExitCode.ERR_FUTURE_MANIFEST;
139
+ }
140
+ if (bestEffort)
141
+ return 0;
142
+ throw err;
143
+ }
144
+ const outcome = {
145
+ installed: [],
146
+ updated: [],
147
+ removed: [],
148
+ upToDate: [],
149
+ errors: [],
150
+ };
151
+ // Pass 1: orphan removal — drop skills that disappeared from the bundle.
152
+ for (const entry of manifestEntries) {
153
+ if (SUPPORTED_SKILLS.includes(entry.name))
154
+ continue;
155
+ for (const target of entry.targets) {
156
+ if (parsed.dryRun) {
157
+ outcome.removed.push({ skill: entry.name, target });
158
+ continue;
159
+ }
160
+ try {
161
+ removeSkillFromClient(entry.name, target, homeDir);
162
+ outcome.removed.push({ skill: entry.name, target });
163
+ }
164
+ catch (err) {
165
+ outcome.errors.push({
166
+ skill: entry.name,
167
+ target,
168
+ reason: err instanceof Error ? err.message : String(err),
169
+ });
170
+ }
171
+ }
172
+ if (!parsed.dryRun)
173
+ removeEntry(entry.name, [], homeDir);
174
+ }
175
+ // Pass 2: upsert canonical skills × resolved targets.
176
+ for (const skillName of SUPPORTED_SKILLS) {
177
+ const content = readSkillContent(skillName, skillsRoot);
178
+ if (content === null) {
179
+ outcome.errors.push({
180
+ skill: skillName,
181
+ target: targets[0],
182
+ reason: `Bundled SKILL.md not found at ${path.join(skillsRoot, skillName, 'SKILL.md')}`,
183
+ });
184
+ continue;
185
+ }
186
+ const canonicalVersion = versionFromContent(content);
187
+ for (const target of targets) {
188
+ const installedVersion = readInstalledVersion(skillName, target, homeDir);
189
+ const action = installedVersion === null
190
+ ? 'install'
191
+ : installedVersion !== canonicalVersion
192
+ ? 'update'
193
+ : 'up-to-date';
194
+ if (action === 'up-to-date') {
195
+ outcome.upToDate.push({ skill: skillName, target });
196
+ continue;
197
+ }
198
+ if (parsed.dryRun) {
199
+ if (action === 'install') {
200
+ outcome.installed.push({ skill: skillName, target, version: canonicalVersion });
201
+ }
202
+ else {
203
+ outcome.updated.push({ skill: skillName, target, from: installedVersion, to: canonicalVersion });
204
+ }
205
+ continue;
206
+ }
207
+ try {
208
+ writeSkillToClient(skillName, content, target, homeDir, skillsRoot, canonicalVersion);
209
+ appendEntry(skillName, canonicalVersion, [target], homeDir);
210
+ if (action === 'install') {
211
+ outcome.installed.push({ skill: skillName, target, version: canonicalVersion });
212
+ }
213
+ else {
214
+ outcome.updated.push({ skill: skillName, target, from: installedVersion, to: canonicalVersion });
215
+ }
216
+ }
217
+ catch (err) {
218
+ outcome.errors.push({
219
+ skill: skillName,
220
+ target,
221
+ reason: err instanceof Error ? err.message : String(err),
222
+ });
223
+ }
224
+ }
225
+ }
226
+ if (parsed.json) {
227
+ stdout(JSON.stringify({ dryRun: parsed.dryRun, targets, outcome }) + '\n');
228
+ }
229
+ else {
230
+ const verb = parsed.dryRun ? 'Would sync' : 'Synced';
231
+ const parts = [];
232
+ if (outcome.installed.length > 0)
233
+ parts.push(`${outcome.installed.length} installed`);
234
+ if (outcome.updated.length > 0)
235
+ parts.push(`${outcome.updated.length} updated`);
236
+ if (outcome.removed.length > 0)
237
+ parts.push(`${outcome.removed.length} orphan removed`);
238
+ if (outcome.upToDate.length > 0)
239
+ parts.push(`${outcome.upToDate.length} up-to-date`);
240
+ if (outcome.errors.length > 0)
241
+ parts.push(`${outcome.errors.length} errors`);
242
+ const summary = parts.length > 0 ? parts.join(', ') : 'nothing to do';
243
+ log(`${verb} ${SUPPORTED_SKILLS.length} skill(s) → ${targets.join(', ')} (${summary}).\n`);
244
+ for (const e of outcome.errors)
245
+ stderr(`error: ${e.skill} → ${e.target}: ${e.reason}\n`);
246
+ }
247
+ if (outcome.errors.length > 0)
248
+ return bestEffort ? 0 : ExitCode.ERR_PARTIAL;
249
+ return ExitCode.SUCCESS;
250
+ }
251
+ //# sourceMappingURL=sync-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-skills.js","sourceRoot":"","sources":["../../src/cli/sync-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EACL,WAAW,EACX,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,mBAAmB,GAGpB,MAAM,yDAAyD,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,yDAAyD,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,gEAAgE,CAAC;AAExE,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,CAAC;CACtB,CAAC,CAAC;AAwBH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC;QAClB,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC;QAC3C,KAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE;KAClC,CAAC,CAAC;IACH,IAAI,OAAO,GAAoB,IAAI,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,GAAI,CAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAW,CAAC,CAAC;IACpD,CAAC;IACD,OAAO;QACL,OAAO;QACP,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI;QACxC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI;QAChC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI;KAC5B,CAAC;AACJ,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,cAAc,CAC5B,QAAyB,EACzB,UAAmB,EACnB,OAAe;IAEf,IAAI,UAAU;QAAE,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;IACxC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,MAAM,IAAI,kBAAkB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,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,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,uBAAuB,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB,EAAE,MAAc,EAAE,OAAe;IAC9E,MAAM,GAAG,GAAG,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB,EAAE;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAElD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC;IAExE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;YACtC,MAAM,CAAC,wBAAwB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACtD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,gEAAgE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAED,IAAI,eAAgC,CAAC;IACrC,IAAI,CAAC;QACH,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,MAAM,CAAC,wBAAwB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACvD,CAAC;QACD,IAAI,UAAU;YAAE,OAAO,CAAC,CAAC;QACzB,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAgB;QAC3B,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,yEAAyE;IACzE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAK,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC3E,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACnD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAClB,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,MAAM;oBACN,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,sDAAsD;IACtD,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;gBAClB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE;gBACnB,MAAM,EAAE,iCAAiC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;aACxF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAErD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC1E,MAAM,MAAM,GACV,gBAAgB,KAAK,IAAI;gBACvB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,gBAAgB,KAAK,gBAAgB;oBACrC,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,YAAY,CAAC;YAErB,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAClF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBACpG,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;gBACtF,WAAW,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC5D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBAClF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAiB,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAClB,KAAK,EAAE,SAAS;oBAChB,MAAM;oBACN,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;QACtF,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QAChF,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;QACvF,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC;QACrF,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;QACtE,GAAG,CAAC,GAAG,IAAI,IAAI,gBAAgB,CAAC,MAAM,eAAe,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,MAAM,CAAC,CAAC;QAC3F,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC5E,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"async-dispatch.d.ts","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,oBAAoB,CAAC,OAAO;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EACnC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAClC,mBAAmB,CA4DrB"}
1
+ {"version":3,"file":"async-dispatch.d.ts","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,oBAAoB,CAAC,OAAO;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EACnC,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,GAClC,mBAAmB,CA0FrB"}
@@ -33,15 +33,31 @@ export function asyncDispatch(opts) {
33
33
  void (async () => {
34
34
  try {
35
35
  deps.bus.emit({ event: 'task_started', ts: new Date().toISOString(), batchId, taskIndex: 0, route: tool, cwd: projectCwd });
36
- // Mark the batch as running so composeRunningHeadline shows
37
- // "1/1 running, Xs elapsed" instead of "1/1 queued" forever.
38
- // tasksTotal is a coarse proxy for "some work is underway"; the
39
- // per-sub-task counters inside the lifecycle dispatcher track finer progress.
36
+ // Mark the batch as running so /batch/:id polling reports
37
+ // "1/1 running, Xs elapsed" the instant the executor begins.
38
+ // Without bumping the headline snapshot here, the polling endpoint
39
+ // returns the initial "0/N queued" fallback until the runner's first
40
+ // heartbeat arrives — which can be many seconds (or minutes) later
41
+ // because heartbeats fire from inside provider.run. That gap is what
42
+ // made 4.0.1 audits look like the daemon was deadlocked when the
43
+ // only thing actually slow was the LLM call.
40
44
  const entry = batchRegistry.get(batchId);
41
45
  if (entry) {
42
46
  entry.tasksTotal = 1;
43
47
  entry.tasksStarted = 1;
44
48
  entry.tasksCompleted = 0;
49
+ batchRegistry.updateRunningHeadlineSnapshot(batchId, {
50
+ prefix: `1/1 running, `,
51
+ statsClause: ``,
52
+ dispatchedAt: entry.runningHeadlineSnapshot.dispatchedAt,
53
+ fallback: `1/1 running`,
54
+ });
55
+ }
56
+ // Verbose-stderr breadcrumb so operators tailing the daemon see the
57
+ // executor lifecycle past request_received without grepping the
58
+ // JSONL log. Cheap; gated on diagnostics.verbose.
59
+ if (deps.config.diagnostics?.verbose) {
60
+ process.stdout.write(`[mmagent verbose] event=executor_started ts=${new Date().toISOString()} batch=${batchId} route=${tool}\n`);
45
61
  }
46
62
  const result = await opts.executor(ctx, batchId);
47
63
  const resultObj = result;
@@ -50,7 +66,11 @@ export function asyncDispatch(opts) {
50
66
  entryAfter.tasksCompleted = 1;
51
67
  batchRegistry.complete(batchId, result);
52
68
  const taskCount = Array.isArray(resultObj?.results) ? resultObj.results.length : 0;
53
- deps.bus.emit({ event: 'batch_completed', ts: new Date().toISOString(), batchId, tool, durationMs: Date.now() - startedAtMs, taskCount });
69
+ const durationMs = Date.now() - startedAtMs;
70
+ deps.bus.emit({ event: 'batch_completed', ts: new Date().toISOString(), batchId, tool, durationMs, taskCount });
71
+ if (deps.config.diagnostics?.verbose) {
72
+ process.stdout.write(`[mmagent verbose] event=batch_completed ts=${new Date().toISOString()} batch=${batchId} route=${tool} duration_ms=${durationMs}\n`);
73
+ }
54
74
  }
55
75
  catch (err) {
56
76
  const message = err instanceof Error ? err.message : String(err);
@@ -60,7 +80,11 @@ export function asyncDispatch(opts) {
60
80
  message,
61
81
  ...(stack !== undefined && { stack }),
62
82
  });
63
- deps.bus.emit({ event: 'batch_failed', ts: new Date().toISOString(), batchId, tool, durationMs: Date.now() - startedAtMs, errorCode: 'runner_crash', errorMessage: message });
83
+ const durationMs = Date.now() - startedAtMs;
84
+ deps.bus.emit({ event: 'batch_failed', ts: new Date().toISOString(), batchId, tool, durationMs, errorCode: 'runner_crash', errorMessage: message });
85
+ if (deps.config.diagnostics?.verbose) {
86
+ process.stdout.write(`[mmagent verbose] event=batch_failed ts=${new Date().toISOString()} batch=${batchId} route=${tool} duration_ms=${durationMs} error="${message.replace(/"/g, '\\"')}"\n`);
87
+ }
64
88
  }
65
89
  })();
66
90
  });
@@ -1 +1 @@
1
- {"version":3,"file":"async-dispatch.js","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"async-dispatch.js","sourceRoot":"","sources":["../../src/http/async-dispatch.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { homedir } from 'node:os';
4
4
  import { join } from 'node:path';
5
5
  import { sendJson } from '../../errors.js';
6
6
  /**
7
- * The skill manifest is installed by the `install-skill` CLI (Phase 9).
7
+ * The skill manifest is installed by the `sync-skills` CLI.
8
8
  * We read it at /status request time — if absent, skillVersion and
9
9
  * skillCompatible are both null.
10
10
  */
@@ -8,7 +8,7 @@ when_to_use: >-
8
8
  User asks for a doc/spec/config audit OR a methodology skill
9
9
  (superpowers:dispatching-parallel-agents, /security-review) points at one AND
10
10
  mmagent is running. Audit on PROSE/SPEC docs — use mma-review for source code.
11
- version: 4.0.1
11
+ version: 4.0.2
12
12
  ---
13
13
 
14
14
  # mma-audit
@@ -12,7 +12,7 @@ when_to_use: >-
12
12
  Register once here, then pass the ID via `contextBlockIds` on mma-delegate /
13
13
  mma-execute-plan / mma-audit / mma-review / mma-verify / mma-debug /
14
14
  mma-investigate. Cheaper and faster than inlining the same content N times.
15
- version: 4.0.1
15
+ version: 4.0.2
16
16
  ---
17
17
 
18
18
  # mma-context-blocks
@@ -10,7 +10,7 @@ when_to_use: >-
10
10
  read files, reproduce, trace — OR a methodology skill
11
11
  (superpowers:systematic-debugging) points at the investigation step. Delegate
12
12
  the read/reproduce/trace; the main agent stays on the hypothesis and the fix.
13
- version: 4.0.1
13
+ version: 4.0.2
14
14
  ---
15
15
 
16
16
  # mma-debug
@@ -11,7 +11,7 @@ when_to_use: >-
11
11
  and keep main context free. If a plan file exists → use mma-execute-plan. If
12
12
  the task is audit / review / verify / debug / investigate → use the matching
13
13
  specialized skill.
14
- version: 4.0.1
14
+ version: 4.0.2
15
15
  ---
16
16
 
17
17
  # mma-delegate
@@ -10,7 +10,7 @@ when_to_use: >-
10
10
  superpowers:subagent-driven-development / superpowers:executing-plans —
11
11
  workers are cheaper and don't pollute main context. Task descriptors must
12
12
  match plan headings verbatim.
13
- version: 4.0.1
13
+ version: 4.0.2
14
14
  ---
15
15
 
16
16
  # mma-execute-plan
@@ -11,7 +11,7 @@ when_to_use: >-
11
11
  Delegating the read+grep+web-search to a worker keeps your main context on
12
12
  judgment. DO NOT use for convergent single-answer questions (where is X
13
13
  called, how does Y work) — those are mma-investigate.
14
- version: 4.0.1
14
+ version: 4.0.2
15
15
  ---
16
16
 
17
17
  # mma-explore
@@ -12,7 +12,7 @@ when_to_use: >-
12
12
  git-history queries. OR you are about to read 3+ files / run any grep in main
13
13
  context — that's the inline-labor-leakage anti-pattern (AP2); delegate to this
14
14
  skill instead.
15
- version: 4.0.1
15
+ version: 4.0.2
16
16
  ---
17
17
 
18
18
  # mma-investigate
@@ -10,7 +10,7 @@ when_to_use: >-
10
10
  you want to re-try the failed indices only. Prefer this over re-dispatching
11
11
  the whole batch or inline-retrying — it's idempotent and preserves the
12
12
  original batch's diagnostics.
13
- version: 4.0.1
13
+ version: 4.0.2
14
14
  ---
15
15
 
16
16
  # mma-retry
@@ -10,7 +10,7 @@ when_to_use: >-
10
10
  AND mmagent is running. Delegate so each file reviews on its own worker; the
11
11
  main agent only decides what to merge. Review on SOURCE CODE — use mma-audit
12
12
  for prose specs / configs.
13
- version: 4.0.1
13
+ version: 4.0.2
14
14
  ---
15
15
 
16
16
  # mma-review
@@ -10,7 +10,7 @@ when_to_use: >-
10
10
  against implemented work BEFORE claiming success. Delegate so each checklist
11
11
  item gets independent evidence-gathering on a worker. Use this BEFORE saying
12
12
  "done" — never after.
13
- version: 4.0.1
13
+ version: 4.0.2
14
14
  ---
15
15
 
16
16
  # mma-verify
@@ -11,7 +11,7 @@ when_to_use: >-
11
11
  tasks — AND mmagent is running. Read this once, pick the matching mma-* skill,
12
12
  and delegate there. Applies equally whether the user invoked a superpowers
13
13
  methodology skill or asked directly.
14
- version: 4.0.1
14
+ version: 4.0.2
15
15
  ---
16
16
 
17
17
  # multi-model-agent (router)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhixuan92/multi-model-agent",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Standalone HTTP server for multi-model-agent. Routes tool-invocation work to Claude, Codex, or OpenAI-compatible sub-agents with async-polling REST dispatch and installable skills for Claude Code, Gemini CLI, Codex CLI, and Cursor.",
@@ -43,6 +43,7 @@
43
43
  }
44
44
  },
45
45
  "scripts": {
46
+ "prebuild": "rm -rf dist",
46
47
  "build": "tsc && rm -rf dist/skills && cp -R src/skills dist/skills && node scripts/inject-skill-version.mjs && chmod +x dist/cli/index.js",
47
48
  "postinstall": "node scripts/postinstall.js",
48
49
  "prepublishOnly": "npm run build"
@@ -52,7 +53,7 @@
52
53
  },
53
54
  "dependencies": {
54
55
  "@asteasolutions/zod-to-openapi": "^8.5.0",
55
- "@zhixuan92/multi-model-agent-core": "^4.0.1",
56
+ "@zhixuan92/multi-model-agent-core": "^4.0.2",
56
57
  "gray-matter": "^4.0.3",
57
58
  "minimist": "^1.2.8",
58
59
  "proper-lockfile": "^4.1.2",
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Runs on every `npm install @zhixuan92/multi-model-agent`.
6
6
  *
7
- * Calls `mmagent update-skills --if-exists --silent --best-effort` so that
7
+ * Calls `mmagent sync-skills --if-exists --silent --best-effort` so that
8
8
  * users who previously installed skills get their Claude Code / Gemini /
9
9
  * Codex / Cursor copies refreshed to match this release. Exits 0 on every
10
10
  * failure mode so npm install never breaks the user's environment.
@@ -28,7 +28,7 @@ if (!existsSync(cli)) {
28
28
 
29
29
  const child = spawn(
30
30
  process.execPath,
31
- [cli, 'update-skills', '--if-exists', '--silent', '--best-effort'],
31
+ [cli, 'sync-skills', '--if-exists', '--silent', '--best-effort'],
32
32
  { stdio: 'inherit' },
33
33
  );
34
34
 
@@ -1,78 +0,0 @@
1
- import type { Client } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
2
- export type { Client } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
3
- export { ALL_CLIENTS, detectClients } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
4
- export { SUPPORTED_SKILLS, SkillNotFoundError, getSkillsRoot, readSkillContent, } from '@zhixuan92/multi-model-agent-core/tool-surface/discover';
5
- export { UnknownTargetError, writeSkillToClient, removeSkillFromClient, } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
6
- export type { InstallResult } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
7
- export { doInstall, doUninstall } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
8
- /**
9
- * Return codes for `main()`.
10
- * Exported so callers (e.g. the CLI dispatcher in cli/index.ts) can pass the
11
- * code to `exit()` without calling `process.exit()` directly.
12
- */
13
- export declare const ExitCode: Readonly<{
14
- SUCCESS: 0;
15
- ERR_INVALID_ARGS: 1;
16
- ERR_SKILL_NOT_FOUND: 2;
17
- ERR_UNKNOWN_SKILL: 3;
18
- ERR_NO_TARGETS: 4;
19
- ERR_WRITER_NOT_IMPLEMENTED: 5;
20
- ERR_UNKNOWN_TARGET: 7;
21
- ERR_UNKNOWN: 8;
22
- }>;
23
- export interface ParsedArgs {
24
- skill: string | null;
25
- /** Explicit --config path, or null if not specified. */
26
- configPath: string | null;
27
- uninstall: boolean;
28
- dryRun: boolean;
29
- json: boolean;
30
- targets: Client[] | null;
31
- allTargets: boolean;
32
- }
33
- /**
34
- * Parse CLI arguments for `install-skill`.
35
- *
36
- * NOTE: `stopEarly` is deliberately NOT set on minimist. `stopEarly: true`
37
- * causes options after the first positional argument to be treated as positional
38
- * tail, which would misparse a call like:
39
- * mmagent install-skill mma-delegate --json
40
- * (--json would be captured in `_` instead of setting the `json` flag).
41
- * Instead we let minimist consume all arguments normally.
42
- */
43
- export declare function parseArgs(argv: string[]): ParsedArgs;
44
- /**
45
- * Resolve the target client list.
46
- * Priority:
47
- * 1. explicit `--target` arguments (validated against known clients)
48
- * 2. `--all-targets` → all four known clients
49
- * 3. auto-detect based on `homeDir`
50
- *
51
- * Explicit targets are de-duplicated while preserving order of first occurrence.
52
- *
53
- * @throws UnknownTargetError if an explicit target is not a known client.
54
- */
55
- export declare function resolveTargets(explicitTargets: Client[] | null, allTargets: boolean, homeDir: string): Client[];
56
- export interface MainDeps {
57
- /** Override argv (defaults to process.argv.slice(2)). */
58
- argv?: string[];
59
- /** Home directory (defaults to os.homedir()). */
60
- homeDir?: string;
61
- /** Package version string for manifest entries (defaults to '0.0.0'). */
62
- version?: string;
63
- /** Override skills root for testing. */
64
- skillsRoot?: string;
65
- /** Injectable stdout writer. */
66
- stdout?: (s: string) => boolean;
67
- /** Injectable stderr writer. */
68
- stderr?: (s: string) => boolean;
69
- }
70
- /**
71
- * Main entry point for `mmagent install-skill`.
72
- *
73
- * Returns an exit code (one of `ExitCode.*`) instead of calling `process.exit()`
74
- * directly, so the CLI dispatcher in `cli/index.ts` can control the exit
75
- * decision and make the function fully unit-testable.
76
- */
77
- export declare function main(deps?: MainDeps): Promise<number>;
78
- //# sourceMappingURL=install-skill.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/cli/install-skill.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yDAAyD,CAAC;AAetF,YAAY,EAAE,MAAM,EAAE,MAAM,yDAAyD,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AACrG,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,GACjB,MAAM,yDAAyD,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,gEAAgE,CAAC;AAIxE,YAAY,EAAE,aAAa,EAAE,MAAM,gEAAgE,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gEAAgE,CAAC;AAIxG;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;EASnB,CAAC;AAIH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wDAAwD;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA6BpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,EAChC,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAmBV;AAqED,MAAM,WAAW,QAAQ;IACvB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,gCAAgC;IAChC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAiH/D"}