@zhixuan92/multi-model-agent 4.7.10 → 4.7.12
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.
- package/README.md +1 -2
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +5 -6
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/sync-skills.d.ts +1 -1
- package/dist/cli/sync-skills.d.ts.map +1 -1
- package/dist/cli/sync-skills.js +3 -3
- package/dist/cli/sync-skills.js.map +1 -1
- package/dist/http/handlers/introspection/health.d.ts +2 -2
- package/dist/http/handlers/introspection/health.d.ts.map +1 -1
- package/dist/http/request-pipeline.d.ts.map +1 -1
- package/dist/http/request-pipeline.js +10 -2
- package/dist/http/request-pipeline.js.map +1 -1
- package/dist/http/server.d.ts +1 -1
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +9 -17
- package/dist/http/server.js.map +1 -1
- package/dist/skill-install/discover.d.ts +29 -0
- package/dist/skill-install/discover.d.ts.map +1 -0
- package/dist/skill-install/discover.js +102 -0
- package/dist/skill-install/discover.js.map +1 -0
- package/dist/skill-install/include-utils.d.ts +27 -0
- package/dist/skill-install/include-utils.d.ts.map +1 -0
- package/dist/skill-install/include-utils.js +90 -0
- package/dist/skill-install/include-utils.js.map +1 -0
- package/dist/skill-install/manifest.d.ts +90 -0
- package/dist/skill-install/manifest.d.ts.map +1 -0
- package/dist/skill-install/manifest.js +228 -0
- package/dist/skill-install/manifest.js.map +1 -0
- package/dist/skill-install/skill-installer-common.d.ts +48 -0
- package/dist/skill-install/skill-installer-common.d.ts.map +1 -0
- package/dist/skill-install/skill-installer-common.js +195 -0
- package/dist/skill-install/skill-installer-common.js.map +1 -0
- package/dist/skill-install/skill-installers/claude-code.d.ts +43 -0
- package/dist/skill-install/skill-installers/claude-code.d.ts.map +1 -0
- package/dist/skill-install/skill-installers/claude-code.js +65 -0
- package/dist/skill-install/skill-installers/claude-code.js.map +1 -0
- package/dist/skill-install/skill-installers/codex-cli.d.ts +27 -0
- package/dist/skill-install/skill-installers/codex-cli.d.ts.map +1 -0
- package/dist/skill-install/skill-installers/codex-cli.js +84 -0
- package/dist/skill-install/skill-installers/codex-cli.js.map +1 -0
- package/dist/skill-install/skill-installers/cursor.d.ts +72 -0
- package/dist/skill-install/skill-installers/cursor.d.ts.map +1 -0
- package/dist/skill-install/skill-installers/cursor.js +81 -0
- package/dist/skill-install/skill-installers/cursor.js.map +1 -0
- package/dist/skill-install/skill-installers/gemini-cli.d.ts +50 -0
- package/dist/skill-install/skill-installers/gemini-cli.d.ts.map +1 -0
- package/dist/skill-install/skill-installers/gemini-cli.js +72 -0
- package/dist/skill-install/skill-installers/gemini-cli.js.map +1 -0
- package/dist/skill-install/skill-manifest-sync.d.ts +11 -0
- package/dist/skill-install/skill-manifest-sync.d.ts.map +1 -0
- package/dist/skill-install/skill-manifest-sync.js +65 -0
- package/dist/skill-install/skill-manifest-sync.js.map +1 -0
- package/dist/skills/mma-audit/SKILL.md +1 -1
- package/dist/skills/mma-context-blocks/SKILL.md +1 -1
- package/dist/skills/mma-debug/SKILL.md +1 -1
- package/dist/skills/mma-delegate/SKILL.md +1 -1
- package/dist/skills/mma-execute-plan/SKILL.md +1 -1
- package/dist/skills/mma-explore/SKILL.md +1 -1
- package/dist/skills/mma-investigate/SKILL.md +1 -1
- package/dist/skills/mma-research/SKILL.md +1 -1
- package/dist/skills/mma-retry/SKILL.md +1 -1
- package/dist/skills/mma-review/SKILL.md +1 -1
- package/dist/skills/multi-model-agent/SKILL.md +1 -1
- package/package.json +2 -2
- package/dist/http/handlers/introspection/tools-list.d.ts +0 -9
- package/dist/http/handlers/introspection/tools-list.d.ts.map +0 -1
- package/dist/http/handlers/introspection/tools-list.js +0 -28
- package/dist/http/handlers/introspection/tools-list.js.map +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for installing a skill via the Gemini CLI writer.
|
|
3
|
+
*/
|
|
4
|
+
export interface GeminiCliInstallOpts {
|
|
5
|
+
/** Skill name (currently informational; writes always go to multi-model-agent extension). */
|
|
6
|
+
skillName: string;
|
|
7
|
+
/**
|
|
8
|
+
* Raw SKILL.md content. May contain `@include _shared/<file>.md` directives
|
|
9
|
+
* which are inlined before writing.
|
|
10
|
+
*/
|
|
11
|
+
content: string;
|
|
12
|
+
/**
|
|
13
|
+
* Version string for the extension manifest's `version` field.
|
|
14
|
+
*/
|
|
15
|
+
skillVersion: string;
|
|
16
|
+
/**
|
|
17
|
+
* The "home directory" that replaces `os.homedir()`.
|
|
18
|
+
* Must NOT default to `os.homedir()` — always required explicitly.
|
|
19
|
+
*/
|
|
20
|
+
homeDir: string;
|
|
21
|
+
/**
|
|
22
|
+
* Where shared files live. The writer reads `<skillsRoot>/_shared/<file>.md`
|
|
23
|
+
* when inlining `@include` directives.
|
|
24
|
+
*/
|
|
25
|
+
skillsRoot: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Install a skill to the Gemini CLI extensions directory.
|
|
29
|
+
*
|
|
30
|
+
* Writes two files into `<homeDir>/.gemini/extensions/multi-model-agent/`:
|
|
31
|
+
* 1. `gemini-extension.json` — the extension manifest
|
|
32
|
+
* 2. `SKILL.md` — the skill content with @include directives inlined
|
|
33
|
+
*
|
|
34
|
+
* The directory (and any parent directories) are created with mode `0o700`.
|
|
35
|
+
* Calling this function multiple times overwrites the previous installation
|
|
36
|
+
* (idempotent).
|
|
37
|
+
*
|
|
38
|
+
* @param opts Installation options (see `GeminiCliInstallOpts`).
|
|
39
|
+
*/
|
|
40
|
+
export declare function installGeminiCli(opts: GeminiCliInstallOpts): void;
|
|
41
|
+
/**
|
|
42
|
+
* Uninstall the multi-model-agent Gemini CLI extension.
|
|
43
|
+
*
|
|
44
|
+
* Recursively removes `<homeDir>/.gemini/extensions/multi-model-agent/`.
|
|
45
|
+
* This is a no-op when the directory does not exist (no error is thrown).
|
|
46
|
+
*
|
|
47
|
+
* @param homeDir The "home directory" that replaces `os.homedir()`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function uninstallGeminiCli(homeDir: string): void;
|
|
50
|
+
//# sourceMappingURL=gemini-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-cli.d.ts","sourceRoot":"","sources":["../../../src/skill-install/skill-installers/gemini-cli.ts"],"names":[],"mappings":"AAwBA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6FAA6F;IAC7F,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAuBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKxD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI skill writer.
|
|
3
|
+
*
|
|
4
|
+
* Writes to `<homeDir>/.gemini/extensions/multi-model-agent/`:
|
|
5
|
+
* - `gemini-extension.json` — extension manifest
|
|
6
|
+
* - `SKILL.md` — skill content (with @include directives inlined)
|
|
7
|
+
*
|
|
8
|
+
* The extension is always named `multi-model-agent` regardless of `skillName`
|
|
9
|
+
* (the extension loads whichever skill files are provided). This is a
|
|
10
|
+
* judgment call because the Gemini CLI extension format is not fully
|
|
11
|
+
* standardized; a minimal JSON schema is used.
|
|
12
|
+
*
|
|
13
|
+
* Before writing SKILL.md, any `@include _shared/<file>.md` directive lines
|
|
14
|
+
* are replaced via the shared `inlineIncludes` helper (the same one
|
|
15
|
+
* Claude/Codex/Cursor use). That helper enforces the `_shared/` prefix,
|
|
16
|
+
* rejects path traversal, suppresses only ENOENT (missing file → warn + drop),
|
|
17
|
+
* and re-throws other I/O errors.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
import fs from 'node:fs';
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
import { inlineIncludes } from '../include-utils.js';
|
|
24
|
+
/**
|
|
25
|
+
* Install a skill to the Gemini CLI extensions directory.
|
|
26
|
+
*
|
|
27
|
+
* Writes two files into `<homeDir>/.gemini/extensions/multi-model-agent/`:
|
|
28
|
+
* 1. `gemini-extension.json` — the extension manifest
|
|
29
|
+
* 2. `SKILL.md` — the skill content with @include directives inlined
|
|
30
|
+
*
|
|
31
|
+
* The directory (and any parent directories) are created with mode `0o700`.
|
|
32
|
+
* Calling this function multiple times overwrites the previous installation
|
|
33
|
+
* (idempotent).
|
|
34
|
+
*
|
|
35
|
+
* @param opts Installation options (see `GeminiCliInstallOpts`).
|
|
36
|
+
*/
|
|
37
|
+
export function installGeminiCli(opts) {
|
|
38
|
+
const { skillName: _skillName, content, skillVersion, homeDir, skillsRoot } = opts;
|
|
39
|
+
const extDir = path.join(homeDir, '.gemini', 'extensions', 'multi-model-agent');
|
|
40
|
+
fs.mkdirSync(extDir, { recursive: true, mode: 0o700 });
|
|
41
|
+
// Write the extension manifest.
|
|
42
|
+
// Shape is a minimal reasonable schema; Gemini CLI extension format is not
|
|
43
|
+
// fully standardized, so we document this judgment call.
|
|
44
|
+
const manifest = {
|
|
45
|
+
name: 'multi-model-agent',
|
|
46
|
+
version: skillVersion,
|
|
47
|
+
description: 'multi-model-agent skills for Gemini CLI',
|
|
48
|
+
schemaVersion: '1.0',
|
|
49
|
+
contextFiles: ['SKILL.md'],
|
|
50
|
+
};
|
|
51
|
+
const manifestPath = path.join(extDir, 'gemini-extension.json');
|
|
52
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
|
|
53
|
+
// Write the skill content with @include directives inlined.
|
|
54
|
+
const finalContent = inlineIncludes('Gemini CLI skill writer', content, skillsRoot);
|
|
55
|
+
const skillPath = path.join(extDir, 'SKILL.md');
|
|
56
|
+
fs.writeFileSync(skillPath, finalContent, 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Uninstall the multi-model-agent Gemini CLI extension.
|
|
60
|
+
*
|
|
61
|
+
* Recursively removes `<homeDir>/.gemini/extensions/multi-model-agent/`.
|
|
62
|
+
* This is a no-op when the directory does not exist (no error is thrown).
|
|
63
|
+
*
|
|
64
|
+
* @param homeDir The "home directory" that replaces `os.homedir()`.
|
|
65
|
+
*/
|
|
66
|
+
export function uninstallGeminiCli(homeDir) {
|
|
67
|
+
const extDir = path.join(homeDir, '.gemini', 'extensions', 'multi-model-agent');
|
|
68
|
+
if (fs.existsSync(extDir)) {
|
|
69
|
+
fs.rmSync(extDir, { recursive: true, force: true });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=gemini-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../../src/skill-install/skill-installers/gemini-cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA6BrD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAEnF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAChF,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvD,gCAAgC;IAChC,2EAA2E;IAC3E,yDAAyD;IACzD,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,YAAY;QACrB,WAAW,EAAE,yCAAyC;QACtD,aAAa,EAAE,KAAK;QACpB,YAAY,EAAE,CAAC,UAAU,CAAC;KAC3B,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAChE,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAElF,4DAA4D;IAC5D,MAAM,YAAY,GAAG,cAAc,CAAC,yBAAyB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAChF,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manifest-sync.d.ts","sourceRoot":"","sources":["../../src/skill-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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manifest-sync.js","sourceRoot":"","sources":["../../src/skill-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"}
|
|
@@ -12,7 +12,7 @@ when_to_use: >-
|
|
|
12
12
|
(superpowers:dispatching-parallel-agents, /security-review) points at one AND
|
|
13
13
|
mmagent is running. Audit on PROSE/SPEC docs — use mma-review for source code.
|
|
14
14
|
Audit a CODE-EXECUTION PLAN against the codebase — use subtype=plan.
|
|
15
|
-
version: 4.7.
|
|
15
|
+
version: 4.7.12
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
# 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-debug / mma-investigate.
|
|
14
14
|
Cheaper and faster than inlining the same content N times.
|
|
15
|
-
version: 4.7.
|
|
15
|
+
version: 4.7.12
|
|
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.7.
|
|
13
|
+
version: 4.7.12
|
|
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.7.
|
|
14
|
+
version: 4.7.12
|
|
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.7.
|
|
13
|
+
version: 4.7.12
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
# mma-execute-plan
|
|
@@ -12,7 +12,7 @@ when_to_use: >-
|
|
|
12
12
|
out mma-investigate (internal) + mma-research (external) in parallel and
|
|
13
13
|
synthesise the results yourself. DO NOT use for convergent single-answer
|
|
14
14
|
questions — those are mma-investigate.
|
|
15
|
-
version: 4.7.
|
|
15
|
+
version: 4.7.12
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
# 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.7.
|
|
15
|
+
version: 4.7.12
|
|
16
16
|
---
|
|
17
17
|
|
|
18
18
|
# mma-investigate
|
|
@@ -10,7 +10,7 @@ when_to_use: >-
|
|
|
10
10
|
others do, what published methods exist) AND mmagent is running. Delegate the
|
|
11
11
|
multi-source web/adapter research to a worker so the main context stays on
|
|
12
12
|
judgment. NOT for codebase questions — those are mma-investigate.
|
|
13
|
-
version: 4.7.
|
|
13
|
+
version: 4.7.12
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
# mma-research
|
|
@@ -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.7.
|
|
13
|
+
version: 4.7.12
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
# mma-review
|
|
@@ -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.7.
|
|
14
|
+
version: 4.7.12
|
|
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.7.
|
|
3
|
+
"version": "4.7.12",
|
|
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.",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"@asteasolutions/zod-to-openapi": "^8.5.0",
|
|
56
|
-
"@zhixuan92/multi-model-agent-core": "^4.7.
|
|
56
|
+
"@zhixuan92/multi-model-agent-core": "^4.7.12",
|
|
57
57
|
"gray-matter": "^4.0.3",
|
|
58
58
|
"minimist": "^1.2.8",
|
|
59
59
|
"proper-lockfile": "^4.1.2",
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { RawHandler } from '../../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* GET /tools — serves the OpenAPI 3.0 document describing all server endpoints.
|
|
4
|
-
*
|
|
5
|
-
* Auth is required (checked by the server pipeline) but this endpoint is NOT
|
|
6
|
-
* loopback-gated — LAN clients can fetch the OpenAPI spec.
|
|
7
|
-
*/
|
|
8
|
-
export declare function buildToolsHandler(): RawHandler;
|
|
9
|
-
//# sourceMappingURL=tools-list.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools-list.d.ts","sourceRoot":"","sources":["../../../../src/http/handlers/introspection/tools-list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAejD;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAS9C"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { buildOpenApiDoc, serializeOpenApiDoc } from '@zhixuan92/multi-model-agent-core/tool-surface/openapi-generator';
|
|
2
|
-
// Build the OpenAPI document once at handler-creation time (module-level lazy
|
|
3
|
-
// singleton pattern — no need to rebuild on every request).
|
|
4
|
-
let cachedDoc;
|
|
5
|
-
function getDocBuffer() {
|
|
6
|
-
if (!cachedDoc) {
|
|
7
|
-
const doc = buildOpenApiDoc();
|
|
8
|
-
cachedDoc = Buffer.from(serializeOpenApiDoc(doc), 'utf8');
|
|
9
|
-
}
|
|
10
|
-
return cachedDoc;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* GET /tools — serves the OpenAPI 3.0 document describing all server endpoints.
|
|
14
|
-
*
|
|
15
|
-
* Auth is required (checked by the server pipeline) but this endpoint is NOT
|
|
16
|
-
* loopback-gated — LAN clients can fetch the OpenAPI spec.
|
|
17
|
-
*/
|
|
18
|
-
export function buildToolsHandler() {
|
|
19
|
-
return (_req, res) => {
|
|
20
|
-
const buf = getDocBuffer();
|
|
21
|
-
res.writeHead(200, {
|
|
22
|
-
'content-type': 'application/json',
|
|
23
|
-
'content-length': String(buf.byteLength),
|
|
24
|
-
});
|
|
25
|
-
res.end(buf);
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=tools-list.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tools-list.js","sourceRoot":"","sources":["../../../../src/http/handlers/introspection/tools-list.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,kEAAkE,CAAC;AAExH,8EAA8E;AAC9E,4DAA4D;AAC5D,IAAI,SAA6B,CAAC;AAElC,SAAS,YAAY;IACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,IAAqB,EAAE,GAAmB,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;SACzC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
|