@zhixuan92/multi-model-agent 4.0.1 → 4.0.3

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 (174) hide show
  1. package/README.md +31 -21
  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 +16 -58
  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/cli/telemetry.js +2 -2
  15. package/dist/cli/telemetry.js.map +1 -1
  16. package/dist/http/async-dispatch.d.ts +11 -0
  17. package/dist/http/async-dispatch.d.ts.map +1 -1
  18. package/dist/http/async-dispatch.js +112 -7
  19. package/dist/http/async-dispatch.js.map +1 -1
  20. package/dist/http/execution-context.d.ts +4 -1
  21. package/dist/http/execution-context.d.ts.map +1 -1
  22. package/dist/http/execution-context.js +14 -6
  23. package/dist/http/execution-context.js.map +1 -1
  24. package/dist/http/handlers/control/batch.d.ts.map +1 -1
  25. package/dist/http/handlers/control/batch.js +74 -6
  26. package/dist/http/handlers/control/batch.js.map +1 -1
  27. package/dist/http/handlers/control/retry.d.ts.map +1 -1
  28. package/dist/http/handlers/control/retry.js +1 -0
  29. package/dist/http/handlers/control/retry.js.map +1 -1
  30. package/dist/http/handlers/introspection/status.js +1 -1
  31. package/dist/http/handlers/tools/audit.d.ts.map +1 -1
  32. package/dist/http/handlers/tools/audit.js +1 -0
  33. package/dist/http/handlers/tools/audit.js.map +1 -1
  34. package/dist/http/handlers/tools/debug.d.ts.map +1 -1
  35. package/dist/http/handlers/tools/debug.js +1 -0
  36. package/dist/http/handlers/tools/debug.js.map +1 -1
  37. package/dist/http/handlers/tools/delegate.d.ts.map +1 -1
  38. package/dist/http/handlers/tools/delegate.js +1 -0
  39. package/dist/http/handlers/tools/delegate.js.map +1 -1
  40. package/dist/http/handlers/tools/execute-plan.d.ts.map +1 -1
  41. package/dist/http/handlers/tools/execute-plan.js +1 -0
  42. package/dist/http/handlers/tools/execute-plan.js.map +1 -1
  43. package/dist/http/handlers/tools/explore.d.ts.map +1 -1
  44. package/dist/http/handlers/tools/explore.js +1 -0
  45. package/dist/http/handlers/tools/explore.js.map +1 -1
  46. package/dist/http/handlers/tools/investigate.d.ts.map +1 -1
  47. package/dist/http/handlers/tools/investigate.js +1 -0
  48. package/dist/http/handlers/tools/investigate.js.map +1 -1
  49. package/dist/http/handlers/tools/retry.d.ts.map +1 -1
  50. package/dist/http/handlers/tools/retry.js +1 -0
  51. package/dist/http/handlers/tools/retry.js.map +1 -1
  52. package/dist/http/handlers/tools/review.d.ts.map +1 -1
  53. package/dist/http/handlers/tools/review.js +1 -0
  54. package/dist/http/handlers/tools/review.js.map +1 -1
  55. package/dist/http/handlers/tools/verify.d.ts.map +1 -1
  56. package/dist/http/handlers/tools/verify.js +1 -0
  57. package/dist/http/handlers/tools/verify.js.map +1 -1
  58. package/dist/http/middleware/caller-identity.d.ts +6 -3
  59. package/dist/http/middleware/caller-identity.d.ts.map +1 -1
  60. package/dist/http/middleware/caller-identity.js +5 -16
  61. package/dist/http/middleware/caller-identity.js.map +1 -1
  62. package/dist/http/project-registry.d.ts +9 -0
  63. package/dist/http/project-registry.d.ts.map +1 -1
  64. package/dist/http/project-registry.js +6 -2
  65. package/dist/http/project-registry.js.map +1 -1
  66. package/dist/http/request-pipeline.d.ts +3 -0
  67. package/dist/http/request-pipeline.d.ts.map +1 -1
  68. package/dist/http/request-pipeline.js +11 -1
  69. package/dist/http/request-pipeline.js.map +1 -1
  70. package/dist/http/server.d.ts.map +1 -1
  71. package/dist/http/server.js +30 -3
  72. package/dist/http/server.js.map +1 -1
  73. package/dist/http/types.d.ts +3 -2
  74. package/dist/http/types.d.ts.map +1 -1
  75. package/dist/skills/_shared/auth.md +25 -12
  76. package/dist/skills/mma-audit/SKILL.md +3 -1
  77. package/dist/skills/mma-context-blocks/SKILL.md +5 -1
  78. package/dist/skills/mma-debug/SKILL.md +3 -1
  79. package/dist/skills/mma-delegate/SKILL.md +3 -1
  80. package/dist/skills/mma-execute-plan/SKILL.md +3 -1
  81. package/dist/skills/mma-explore/SKILL.md +3 -1
  82. package/dist/skills/mma-investigate/SKILL.md +3 -1
  83. package/dist/skills/mma-retry/SKILL.md +3 -1
  84. package/dist/skills/mma-review/SKILL.md +3 -1
  85. package/dist/skills/mma-verify/SKILL.md +3 -1
  86. package/dist/skills/multi-model-agent/SKILL.md +1 -1
  87. package/dist/telemetry/recorder.js +3 -0
  88. package/dist/telemetry/recorder.js.map +1 -1
  89. package/package.json +3 -2
  90. package/scripts/postinstall.js +2 -2
  91. package/dist/cli/install-skill.d.ts +0 -78
  92. package/dist/cli/install-skill.d.ts.map +0 -1
  93. package/dist/cli/install-skill.js +0 -304
  94. package/dist/cli/install-skill.js.map +0 -1
  95. package/dist/cli/update-skills.d.ts +0 -16
  96. package/dist/cli/update-skills.d.ts.map +0 -1
  97. package/dist/cli/update-skills.js +0 -158
  98. package/dist/cli/update-skills.js.map +0 -1
  99. package/dist/http/loopback.d.ts +0 -17
  100. package/dist/http/loopback.d.ts.map +0 -1
  101. package/dist/http/loopback.js +0 -43
  102. package/dist/http/loopback.js.map +0 -1
  103. package/dist/http/router.d.ts +0 -19
  104. package/dist/http/router.d.ts.map +0 -1
  105. package/dist/http/router.js +0 -51
  106. package/dist/http/router.js.map +0 -1
  107. package/dist/http/wire/delegate-wire.d.ts +0 -4
  108. package/dist/http/wire/delegate-wire.d.ts.map +0 -1
  109. package/dist/http/wire/delegate-wire.js +0 -16
  110. package/dist/http/wire/delegate-wire.js.map +0 -1
  111. package/dist/http/wire/execute-plan-wire.d.ts +0 -18
  112. package/dist/http/wire/execute-plan-wire.d.ts.map +0 -1
  113. package/dist/http/wire/execute-plan-wire.js +0 -26
  114. package/dist/http/wire/execute-plan-wire.js.map +0 -1
  115. package/dist/http/wire/registry.d.ts +0 -3
  116. package/dist/http/wire/registry.d.ts.map +0 -1
  117. package/dist/http/wire/registry.js +0 -20
  118. package/dist/http/wire/registry.js.map +0 -1
  119. package/dist/install/claude-code.d.ts +0 -43
  120. package/dist/install/claude-code.d.ts.map +0 -1
  121. package/dist/install/claude-code.js +0 -65
  122. package/dist/install/claude-code.js.map +0 -1
  123. package/dist/install/codex-cli.d.ts +0 -27
  124. package/dist/install/codex-cli.d.ts.map +0 -1
  125. package/dist/install/codex-cli.js +0 -84
  126. package/dist/install/codex-cli.js.map +0 -1
  127. package/dist/install/cursor.d.ts +0 -72
  128. package/dist/install/cursor.d.ts.map +0 -1
  129. package/dist/install/cursor.js +0 -81
  130. package/dist/install/cursor.js.map +0 -1
  131. package/dist/install/discover.d.ts +0 -27
  132. package/dist/install/discover.d.ts.map +0 -1
  133. package/dist/install/discover.js +0 -67
  134. package/dist/install/discover.js.map +0 -1
  135. package/dist/install/gemini-cli.d.ts +0 -66
  136. package/dist/install/gemini-cli.d.ts.map +0 -1
  137. package/dist/install/gemini-cli.js +0 -111
  138. package/dist/install/gemini-cli.js.map +0 -1
  139. package/dist/install/headers.d.ts +0 -17
  140. package/dist/install/headers.d.ts.map +0 -1
  141. package/dist/install/headers.js +0 -22
  142. package/dist/install/headers.js.map +0 -1
  143. package/dist/install/include-utils.d.ts +0 -27
  144. package/dist/install/include-utils.d.ts.map +0 -1
  145. package/dist/install/include-utils.js +0 -90
  146. package/dist/install/include-utils.js.map +0 -1
  147. package/dist/install/manifest-resolve.d.ts +0 -17
  148. package/dist/install/manifest-resolve.d.ts.map +0 -1
  149. package/dist/install/manifest-resolve.js +0 -78
  150. package/dist/install/manifest-resolve.js.map +0 -1
  151. package/dist/install/manifest.d.ts +0 -94
  152. package/dist/install/manifest.d.ts.map +0 -1
  153. package/dist/install/manifest.js +0 -234
  154. package/dist/install/manifest.js.map +0 -1
  155. package/dist/install/missing-skills.d.ts +0 -20
  156. package/dist/install/missing-skills.d.ts.map +0 -1
  157. package/dist/install/missing-skills.js +0 -42
  158. package/dist/install/missing-skills.js.map +0 -1
  159. package/dist/install/notify.d.ts +0 -6
  160. package/dist/install/notify.d.ts.map +0 -1
  161. package/dist/install/notify.js +0 -13
  162. package/dist/install/notify.js.map +0 -1
  163. package/dist/install/orchestrate.d.ts +0 -47
  164. package/dist/install/orchestrate.d.ts.map +0 -1
  165. package/dist/install/orchestrate.js +0 -98
  166. package/dist/install/orchestrate.js.map +0 -1
  167. package/dist/install/skill-manifest-sync.d.ts +0 -11
  168. package/dist/install/skill-manifest-sync.d.ts.map +0 -1
  169. package/dist/install/skill-manifest-sync.js +0 -65
  170. package/dist/install/skill-manifest-sync.js.map +0 -1
  171. package/dist/openapi.d.ts +0 -15
  172. package/dist/openapi.d.ts.map +0 -1
  173. package/dist/openapi.js +0 -286
  174. package/dist/openapi.js.map +0 -1
@@ -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"}
@@ -1,304 +0,0 @@
1
- /**
2
- * `mmagent install-skill` CLI command.
3
- *
4
- * Syntax:
5
- * mmagent install-skill [--uninstall] [--dry-run] [--json]
6
- * [--target=claude-code|gemini|codex|cursor]
7
- * [--all-targets] [skill-name]
8
- *
9
- * Skills are sourced from packages/server/src/skills/<skill-name>/SKILL.md.
10
- * install-skill copies the SKILL.md to the appropriate per-client location
11
- * and records the installation in the manifest (~/.multi-model/install-manifest.json).
12
- *
13
- * Task 9.4 scope: CLI scaffolding, manifest read/append-entry/remove-entry,
14
- * auto-detection scaffolding, dry-run mode.
15
- * Tasks 9.5–9.8: Individual client writers.
16
- * Task 9.9: Uninstall wires all removers.
17
- */
18
- import fs from 'node:fs';
19
- import path from 'node:path';
20
- import os from 'node:os';
21
- import { fileURLToPath } from 'node:url';
22
- import minimist from 'minimist';
23
- import * as manifest from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
24
- import { ALL_CLIENTS, detectClients } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
25
- import { SUPPORTED_SKILLS, SkillNotFoundError, } from '@zhixuan92/multi-model-agent-core/tool-surface/discover';
26
- import { UnknownTargetError, } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
27
- export { ALL_CLIENTS, detectClients } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
28
- export { SUPPORTED_SKILLS, SkillNotFoundError, getSkillsRoot, readSkillContent, } from '@zhixuan92/multi-model-agent-core/tool-surface/discover';
29
- export { UnknownTargetError, writeSkillToClient, removeSkillFromClient, } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
30
- export { doInstall, doUninstall } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
31
- import { doInstall, doUninstall, activeCleanup } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
32
- import { resolveClientInstallDir } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
33
- /**
34
- * Return codes for `main()`.
35
- * Exported so callers (e.g. the CLI dispatcher in cli/index.ts) can pass the
36
- * code to `exit()` without calling `process.exit()` directly.
37
- */
38
- export const ExitCode = Object.freeze({
39
- SUCCESS: 0,
40
- ERR_INVALID_ARGS: 1,
41
- ERR_SKILL_NOT_FOUND: 2,
42
- ERR_UNKNOWN_SKILL: 3,
43
- ERR_NO_TARGETS: 4,
44
- ERR_WRITER_NOT_IMPLEMENTED: 5,
45
- ERR_UNKNOWN_TARGET: 7,
46
- ERR_UNKNOWN: 8,
47
- });
48
- /**
49
- * Parse CLI arguments for `install-skill`.
50
- *
51
- * NOTE: `stopEarly` is deliberately NOT set on minimist. `stopEarly: true`
52
- * causes options after the first positional argument to be treated as positional
53
- * tail, which would misparse a call like:
54
- * mmagent install-skill mma-delegate --json
55
- * (--json would be captured in `_` instead of setting the `json` flag).
56
- * Instead we let minimist consume all arguments normally.
57
- */
58
- export function parseArgs(argv) {
59
- const args = minimist(argv, {
60
- string: ['target', 'skill', 'config'],
61
- boolean: ['uninstall', 'dry-run', 'json', 'all-targets'],
62
- alias: {
63
- u: 'uninstall',
64
- j: 'json',
65
- t: 'target',
66
- c: 'config',
67
- },
68
- // stopEarly is NOT set — see note above.
69
- });
70
- const skill = args._[0] ?? null;
71
- const configPath = typeof args['config'] === 'string' && args['config'].length > 0
72
- ? args['config']
73
- : null;
74
- const uninstall = args['uninstall'] === true;
75
- const dryRun = args['dry-run'] === true;
76
- const json = args['json'] === true;
77
- const allTargets = args['all-targets'] === true;
78
- let targets = null;
79
- if (args.target) {
80
- const t = Array.isArray(args.target) ? args.target : [args.target];
81
- targets = t.map((s) => s);
82
- }
83
- return { skill, configPath, uninstall, dryRun, json, targets, allTargets };
84
- }
85
- /**
86
- * Resolve the target client list.
87
- * Priority:
88
- * 1. explicit `--target` arguments (validated against known clients)
89
- * 2. `--all-targets` → all four known clients
90
- * 3. auto-detect based on `homeDir`
91
- *
92
- * Explicit targets are de-duplicated while preserving order of first occurrence.
93
- *
94
- * @throws UnknownTargetError if an explicit target is not a known client.
95
- */
96
- export function resolveTargets(explicitTargets, allTargets, homeDir) {
97
- if (allTargets)
98
- return [...ALL_CLIENTS];
99
- if (explicitTargets !== null) {
100
- const seen = new Set();
101
- const deduped = [];
102
- for (const t of explicitTargets) {
103
- if (!ALL_CLIENTS.includes(t)) {
104
- throw new UnknownTargetError(t, ALL_CLIENTS);
105
- }
106
- if (!seen.has(t)) {
107
- seen.add(t);
108
- deduped.push(t);
109
- }
110
- }
111
- return deduped;
112
- }
113
- return detectClients(homeDir);
114
- }
115
- // ─── Output helpers ─────────────────────────────────────────────────────────
116
- /**
117
- * Print an error message.
118
- * Both branches write through the injectable `stderr` writer for testability.
119
- */
120
- function printError(stderr, json, code, message, stdout) {
121
- if (json) {
122
- // JSON error output goes to stdout so callers can parse it
123
- const out = stdout ?? process.stdout.write.bind(process.stdout);
124
- out(JSON.stringify({ error: code, message }) + '\n');
125
- }
126
- else {
127
- stderr(message + '\n');
128
- }
129
- }
130
- /**
131
- * Print a success result.
132
- * All output goes through the injectable `stdout` writer for testability.
133
- */
134
- function printResult(stdout, result, json, manifestUpdated) {
135
- if (json) {
136
- stdout(JSON.stringify(result) + '\n');
137
- }
138
- else if (result.dryRun) {
139
- const verb = result.action === 'installed' ? 'Would install' : 'Would uninstall';
140
- const destinations = result.targets.length > 0 ? result.targets : result.skipped;
141
- const targetStr = destinations.length > 0 ? ` to: ${destinations.join(', ')}` : '';
142
- stdout(`${verb} '${result.skill}'${targetStr}\n`);
143
- }
144
- else {
145
- const verb = result.action === 'installed' ? 'Installed' : 'Uninstalled';
146
- const targetStr = result.targets.length > 0 ? ` → ${result.targets.join(', ')}` : '';
147
- let line = `${verb} '${result.skill}'${targetStr}\n`;
148
- if (manifestUpdated) {
149
- line += 'Manifest updated.\n';
150
- }
151
- stdout(line);
152
- }
153
- }
154
- /**
155
- * Scan an install directory for mma-* subdirectories that are not in the
156
- * canonical SUPPORTED_SKILLS list. Returns the list of orphaned skill names
157
- * without modifying the filesystem — used for --dry-run preview.
158
- */
159
- function previewOrphanedSkills(installDir) {
160
- let entries;
161
- try {
162
- entries = fs.readdirSync(installDir);
163
- }
164
- catch {
165
- return [];
166
- }
167
- return entries.filter((name) => name.startsWith('mma-') && !SUPPORTED_SKILLS.includes(name));
168
- }
169
- /**
170
- * Main entry point for `mmagent install-skill`.
171
- *
172
- * Returns an exit code (one of `ExitCode.*`) instead of calling `process.exit()`
173
- * directly, so the CLI dispatcher in `cli/index.ts` can control the exit
174
- * decision and make the function fully unit-testable.
175
- */
176
- export async function main(deps = {}) {
177
- const argv = deps.argv ?? process.argv.slice(2);
178
- const homeDir = deps.homeDir ?? os.homedir();
179
- const version = deps.version ?? '0.0.0';
180
- const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
181
- const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
182
- const { skill, uninstall, dryRun, json, targets: explicitTargets, allTargets } = parseArgs(argv);
183
- // ── 1. Validate skill selection ────────────────────────────────────────────
184
- // Default: install every shipped skill. Specify a positional skill name to
185
- // scope to a single skill.
186
- if (skill && !SUPPORTED_SKILLS.includes(skill)) {
187
- const msg = `Unknown skill '${skill}'. Available: ${SUPPORTED_SKILLS.join(', ')}`;
188
- printError(stderr, json, 'unknown_skill', msg, stdout);
189
- return ExitCode.ERR_UNKNOWN_SKILL;
190
- }
191
- const skillsToRun = skill ? [skill] : SUPPORTED_SKILLS;
192
- // ── 2. Resolve targets (may throw UnknownTargetError) ──────────────────────
193
- let resolvedTargets;
194
- try {
195
- resolvedTargets = resolveTargets(explicitTargets, allTargets, homeDir);
196
- }
197
- catch (err) {
198
- if (err instanceof UnknownTargetError) {
199
- printError(stderr, json, err.code, err.message, stdout);
200
- return ExitCode.ERR_UNKNOWN_TARGET;
201
- }
202
- throw err;
203
- }
204
- // ── 3. Check that at least one target is available ─────────────────────────
205
- if (resolvedTargets.length === 0) {
206
- if (json) {
207
- stdout(JSON.stringify({ skills: skillsToRun, action: uninstall ? 'uninstalled' : 'installed', targets: [], skipped: [] }) + '\n');
208
- }
209
- else {
210
- stdout('No clients detected. Use --target or --all-targets to specify targets.\n');
211
- }
212
- return ExitCode.ERR_NO_TARGETS;
213
- }
214
- // ── 4. Run install/uninstall (loops over skillsToRun; same logic per skill) ─
215
- const opts = { dryRun, homeDir, version, skillsRoot: deps.skillsRoot };
216
- let firstError = null;
217
- let manifestUpdated = false;
218
- for (const s of skillsToRun) {
219
- let result;
220
- try {
221
- result = uninstall
222
- ? doUninstall(s, resolvedTargets, opts)
223
- : doInstall(s, resolvedTargets, opts);
224
- }
225
- catch (err) {
226
- if (err instanceof SkillNotFoundError) {
227
- printError(stderr, json, err.code, err.message, stdout);
228
- if (firstError === null)
229
- firstError = ExitCode.ERR_SKILL_NOT_FOUND;
230
- continue;
231
- }
232
- const msg = err instanceof Error ? err.message : String(err);
233
- if (msg.includes('client writers are not yet implemented') ||
234
- msg.includes('client removers are not yet implemented')) {
235
- printError(stderr, json, 'writer_not_implemented', msg, stdout);
236
- if (firstError === null)
237
- firstError = ExitCode.ERR_WRITER_NOT_IMPLEMENTED;
238
- continue;
239
- }
240
- printError(stderr, json, 'unknown', msg, stdout);
241
- if (firstError === null)
242
- firstError = ExitCode.ERR_UNKNOWN;
243
- continue;
244
- }
245
- if (!dryRun) {
246
- if (uninstall) {
247
- manifest.removeEntry(s, resolvedTargets, homeDir);
248
- }
249
- else {
250
- manifest.appendEntry(s, version, resolvedTargets, homeDir);
251
- }
252
- manifestUpdated = true;
253
- }
254
- printResult(stdout, result, json, manifestUpdated);
255
- }
256
- // Active cleanup: after a bulk install (all skills, not uninstall),
257
- // scan per-client install dirs for orphaned mma-* skills.
258
- // - dry-run: preview orphaned skills without removing them.
259
- // - real run: remove orphaned skills.
260
- if (!skill && !uninstall) {
261
- for (const target of resolvedTargets) {
262
- const installDir = resolveClientInstallDir(target, homeDir);
263
- if (installDir !== null) {
264
- if (dryRun) {
265
- const orphaned = previewOrphanedSkills(installDir);
266
- if (orphaned.length > 0 && !json) {
267
- stdout(`Would clean up orphaned skills for ${target}: ${orphaned.join(', ')}\n`);
268
- }
269
- }
270
- else {
271
- const removed = activeCleanup(installDir, SUPPORTED_SKILLS);
272
- if (removed.length > 0 && !json) {
273
- stdout(`Cleaned up orphaned skills for ${target}: ${removed.join(', ')}\n`);
274
- }
275
- }
276
- }
277
- }
278
- }
279
- return firstError ?? ExitCode.SUCCESS;
280
- }
281
- // ── Bootstrap ──────────────────────────────────────────────────────────────
282
- /**
283
- * Robust main-module detection (matching the pattern used in cli/index.ts).
284
- * Tests import main() directly and pass MainDeps; this function only gates
285
- * the direct-execution bootstrap so the CLI binary can call main().
286
- */
287
- function isMain() {
288
- try {
289
- const argv1 = process.argv[1];
290
- if (!argv1)
291
- return false;
292
- const thisFile = import.meta.url.startsWith('file://')
293
- ? fileURLToPath(import.meta.url)
294
- : path.resolve(import.meta.url);
295
- return path.resolve(argv1) === thisFile;
296
- }
297
- catch {
298
- return false;
299
- }
300
- }
301
- if (isMain()) {
302
- main().then((code) => process.exit(code));
303
- }
304
- //# sourceMappingURL=install-skill.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/cli/install-skill.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- export interface UpdateSkillsDeps {
2
- homeDir?: string;
3
- skillsRoot?: string;
4
- dryRun?: boolean;
5
- json?: boolean;
6
- /** Exit silently with code 0 if no manifest exists. Used by postinstall. */
7
- ifExists?: boolean;
8
- /** Suppress normal stdout logging (errors still go to stderr). */
9
- silent?: boolean;
10
- /** Swallow any thrown error and exit 0. Used by postinstall. */
11
- bestEffort?: boolean;
12
- stdout?: (s: string) => boolean;
13
- stderr?: (s: string) => boolean;
14
- }
15
- export declare function runUpdateSkills(deps?: UpdateSkillsDeps): Promise<number>;
16
- //# sourceMappingURL=update-skills.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-skills.d.ts","sourceRoot":"","sources":["../../src/cli/update-skills.ts"],"names":[],"mappings":"AAsCA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACjC;AAsBD,wBAAsB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqHlF"}
@@ -1,158 +0,0 @@
1
- /**
2
- * update-skills.ts — `mmagent update-skills` subcommand.
3
- *
4
- * Iterates over every entry in the install manifest and re-copies the
5
- * shipped SKILL.md for that skill to each of its installed targets,
6
- * updating `skillVersion` from the current bundle. Skills that have
7
- * disappeared from the bundle since a previous install are removed from
8
- * every target and dropped from the manifest.
9
- *
10
- * Exit codes:
11
- * 0 — success (possibly with no manifest entries)
12
- * 1 — one or more targets failed to update
13
- * 2 — manifest was written by a newer mmagent (FutureManifestError)
14
- *
15
- * Usage:
16
- * mmagent update-skills [--dry-run] [--json] [--if-exists] [--silent] [--best-effort]
17
- */
18
- import * as os from 'node:os';
19
- import * as path from 'node:path';
20
- import * as fs from 'node:fs';
21
- import matter from 'gray-matter';
22
- import { FutureManifestError, listEntries, removeEntry, appendEntry, } from '@zhixuan92/multi-model-agent-core/tool-surface/manifest';
23
- import { readSkillContent, writeSkillToClient, removeSkillFromClient, getSkillsRoot, } from './install-skill.js';
24
- import { findMissingSkills } from '@zhixuan92/multi-model-agent-core/tool-surface/skill-installer';
25
- import { SUPPORTED_SKILLS } from '@zhixuan92/multi-model-agent-core/tool-surface/discover';
26
- function versionFromSkillContent(content) {
27
- try {
28
- const parsed = matter(content);
29
- const v = parsed.data['version'];
30
- return typeof v === 'string' && v.length > 0 ? v : 'unknown';
31
- }
32
- catch {
33
- return 'unknown';
34
- }
35
- }
36
- function manifestPresent(homeDir) {
37
- return fs.existsSync(path.join(homeDir, '.multi-model', 'install-manifest.json'));
38
- }
39
- export async function runUpdateSkills(deps = {}) {
40
- const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
41
- const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
42
- const homeDir = deps.homeDir ?? os.homedir();
43
- const skillsRoot = getSkillsRoot(deps.skillsRoot);
44
- const dryRun = deps.dryRun ?? false;
45
- const json = deps.json ?? false;
46
- const silent = deps.silent ?? false;
47
- const bestEffort = deps.bestEffort ?? false;
48
- const logInfo = silent ? (_) => true : stdout;
49
- if (deps.ifExists && !manifestPresent(homeDir)) {
50
- return 0;
51
- }
52
- let entries;
53
- try {
54
- entries = listEntries(homeDir);
55
- }
56
- catch (err) {
57
- if (err instanceof FutureManifestError) {
58
- stderr(`mmagent update-skills: ${err.message}\n`);
59
- return bestEffort ? 0 : 2;
60
- }
61
- if (bestEffort)
62
- return 0;
63
- throw err;
64
- }
65
- const summary = { updated: [], removed: [], errors: [] };
66
- for (const entry of entries) {
67
- const content = readSkillContent(entry.name, skillsRoot);
68
- if (content === null) {
69
- // Skill has been removed from the shipped bundle — remove from every
70
- // target and drop the manifest entry.
71
- if (!dryRun) {
72
- for (const target of entry.targets) {
73
- try {
74
- removeSkillFromClient(entry.name, target, homeDir);
75
- }
76
- catch (err) {
77
- summary.errors.push({
78
- skill: entry.name,
79
- target,
80
- reason: err instanceof Error ? err.message : String(err),
81
- });
82
- }
83
- }
84
- removeEntry(entry.name, [], homeDir);
85
- }
86
- summary.removed.push(entry.name);
87
- continue;
88
- }
89
- const newSkillVersion = versionFromSkillContent(content);
90
- for (const target of entry.targets) {
91
- if (dryRun) {
92
- logInfo(`Would update: ${entry.name} → ${target} (${entry.skillVersion} → ${newSkillVersion})\n`);
93
- continue;
94
- }
95
- try {
96
- writeSkillToClient(entry.name, content, target, homeDir, skillsRoot, newSkillVersion);
97
- }
98
- catch (err) {
99
- summary.errors.push({
100
- skill: entry.name,
101
- target,
102
- reason: err instanceof Error ? err.message : String(err),
103
- });
104
- }
105
- }
106
- if (!dryRun) {
107
- appendEntry(entry.name, newSkillVersion, entry.targets, homeDir);
108
- }
109
- summary.updated.push(entry.name);
110
- }
111
- // Backfill: install skills that are in SUPPORTED_SKILLS but missing from the
112
- // manifest (e.g. mma-investigate added in a later release). Targets are the
113
- // union of all client targets already opted into.
114
- const postEntries = listEntries(homeDir);
115
- const missing = findMissingSkills(postEntries, SUPPORTED_SKILLS);
116
- for (const m of missing) {
117
- const content = readSkillContent(m.name, skillsRoot);
118
- if (content === null)
119
- continue;
120
- const skillVersion = versionFromSkillContent(content);
121
- if (!silent)
122
- logInfo(`[mmagent] installing missing skill: ${m.name} → ${m.targets.join(', ')}\n`);
123
- for (const target of m.targets) {
124
- try {
125
- writeSkillToClient(m.name, content, target, homeDir, skillsRoot, skillVersion);
126
- }
127
- catch (err) {
128
- summary.errors.push({
129
- skill: m.name,
130
- target,
131
- reason: err instanceof Error ? err.message : String(err),
132
- });
133
- }
134
- }
135
- if (!dryRun) {
136
- appendEntry(m.name, skillVersion, m.targets, homeDir);
137
- }
138
- summary.updated.push(m.name);
139
- }
140
- if (json) {
141
- stdout(JSON.stringify(summary) + '\n');
142
- }
143
- else {
144
- for (const name of summary.updated)
145
- logInfo(`Updated: ${name}\n`);
146
- for (const name of summary.removed)
147
- logInfo(`Removed: ${name} (no longer shipped)\n`);
148
- for (const e of summary.errors)
149
- stderr(`error: ${e.skill} → ${e.target}: ${e.reason}\n`);
150
- if (!silent)
151
- logInfo(`Manifest updated (${summary.updated.length} updated, ${summary.removed.length} removed, ${summary.errors.length} errors).\n`);
152
- }
153
- if (summary.errors.length > 0) {
154
- return bestEffort ? 0 : 1;
155
- }
156
- return 0;
157
- }
158
- //# sourceMappingURL=update-skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-skills.js","sourceRoot":"","sources":["../../src/cli/update-skills.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Returns true iff the given address string refers to the loopback interface.
3
- * Accepts all forms Node's socket layer surfaces:
4
- * - IPv4 loopback (any 127.0.0.0/8 address): 127.0.0.1, 127.0.1.1, etc.
5
- * - IPv6 loopback: ::1
6
- * - IPv4-mapped IPv6 loopback: ::ffff:127.0.0.1 (and other 127/8 mapped forms)
7
- * - Hostname: localhost
8
- */
9
- export declare function isLoopbackAddress(addr: string | undefined): boolean;
10
- /**
11
- * Returns true iff the request should be rejected because it came from a
12
- * non-loopback address on a loopback-only endpoint.
13
- *
14
- * @param remoteAddress The socket remote address (req.socket?.remoteAddress)
15
- */
16
- export declare function shouldRejectNonLoopback(remoteAddress: string | undefined): boolean;
17
- //# sourceMappingURL=loopback.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loopback.d.ts","sourceRoot":"","sources":["../../src/http/loopback.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAoBnE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElF"}
@@ -1,43 +0,0 @@
1
- import * as net from 'node:net';
2
- /**
3
- * Returns true iff the given address string refers to the loopback interface.
4
- * Accepts all forms Node's socket layer surfaces:
5
- * - IPv4 loopback (any 127.0.0.0/8 address): 127.0.0.1, 127.0.1.1, etc.
6
- * - IPv6 loopback: ::1
7
- * - IPv4-mapped IPv6 loopback: ::ffff:127.0.0.1 (and other 127/8 mapped forms)
8
- * - Hostname: localhost
9
- */
10
- export function isLoopbackAddress(addr) {
11
- if (!addr)
12
- return false;
13
- if (addr === 'localhost')
14
- return true;
15
- // Strip any scope ID (fe80::1%lo0 style) — rare for loopback but cheap to handle.
16
- const clean = addr.split('%')[0];
17
- const kind = net.isIP(clean);
18
- if (kind === 4) {
19
- return clean.startsWith('127.');
20
- }
21
- if (kind === 6) {
22
- if (clean === '::1')
23
- return true;
24
- // IPv4-mapped IPv6: ::ffff:A.B.C.D
25
- const mappedPrefix = '::ffff:';
26
- if (clean.toLowerCase().startsWith(mappedPrefix)) {
27
- const v4 = clean.slice(mappedPrefix.length);
28
- return net.isIPv4(v4) && v4.startsWith('127.');
29
- }
30
- return false;
31
- }
32
- return false;
33
- }
34
- /**
35
- * Returns true iff the request should be rejected because it came from a
36
- * non-loopback address on a loopback-only endpoint.
37
- *
38
- * @param remoteAddress The socket remote address (req.socket?.remoteAddress)
39
- */
40
- export function shouldRejectNonLoopback(remoteAddress) {
41
- return !isLoopbackAddress(remoteAddress);
42
- }
43
- //# sourceMappingURL=loopback.js.map