@zhixuan92/multi-model-agent 5.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/README.md +14 -23
  2. package/dist/cli/index.d.ts +62 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +345 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/cli/info.d.ts +22 -0
  7. package/dist/cli/info.d.ts.map +1 -0
  8. package/dist/cli/info.js +100 -0
  9. package/dist/cli/info.js.map +1 -0
  10. package/dist/cli/logs.d.ts +15 -0
  11. package/dist/cli/logs.d.ts.map +1 -0
  12. package/dist/cli/logs.js +102 -0
  13. package/dist/cli/logs.js.map +1 -0
  14. package/dist/cli/print-token.d.ts +18 -0
  15. package/dist/cli/print-token.d.ts.map +1 -0
  16. package/dist/cli/print-token.js +60 -0
  17. package/dist/cli/print-token.js.map +1 -0
  18. package/dist/cli/serve.d.ts +28 -0
  19. package/dist/cli/serve.d.ts.map +1 -0
  20. package/dist/cli/serve.js +405 -0
  21. package/dist/cli/serve.js.map +1 -0
  22. package/dist/cli/status.d.ts +49 -0
  23. package/dist/cli/status.d.ts.map +1 -0
  24. package/dist/cli/status.js +155 -0
  25. package/dist/cli/status.js.map +1 -0
  26. package/dist/cli/sync-skills.d.ts +58 -0
  27. package/dist/cli/sync-skills.d.ts.map +1 -0
  28. package/dist/cli/sync-skills.js +266 -0
  29. package/dist/cli/sync-skills.js.map +1 -0
  30. package/dist/cli/telemetry.d.ts +10 -0
  31. package/dist/cli/telemetry.d.ts.map +1 -0
  32. package/dist/cli/telemetry.js +161 -0
  33. package/dist/cli/telemetry.js.map +1 -0
  34. package/dist/cli/toggle.d.ts +26 -0
  35. package/dist/cli/toggle.d.ts.map +1 -0
  36. package/dist/cli/toggle.js +185 -0
  37. package/dist/cli/toggle.js.map +1 -0
  38. package/dist/http/async-dispatch.d.ts +44 -0
  39. package/dist/http/async-dispatch.d.ts.map +1 -0
  40. package/dist/http/async-dispatch.js +175 -0
  41. package/dist/http/async-dispatch.js.map +1 -0
  42. package/dist/http/auth.d.ts +20 -0
  43. package/dist/http/auth.d.ts.map +1 -0
  44. package/dist/http/auth.js +56 -0
  45. package/dist/http/auth.js.map +1 -0
  46. package/dist/http/canonicalize-file-paths.d.ts +8 -0
  47. package/dist/http/canonicalize-file-paths.d.ts.map +1 -0
  48. package/dist/http/canonicalize-file-paths.js +43 -0
  49. package/dist/http/canonicalize-file-paths.js.map +1 -0
  50. package/dist/http/cwd-validator.d.ts +11 -0
  51. package/dist/http/cwd-validator.d.ts.map +1 -0
  52. package/dist/http/cwd-validator.js +130 -0
  53. package/dist/http/cwd-validator.js.map +1 -0
  54. package/dist/http/errors.d.ts +4 -0
  55. package/dist/http/errors.d.ts.map +1 -0
  56. package/dist/http/errors.js +9 -0
  57. package/dist/http/errors.js.map +1 -0
  58. package/dist/http/execution-context.d.ts +18 -0
  59. package/dist/http/execution-context.d.ts.map +1 -0
  60. package/dist/http/execution-context.js +61 -0
  61. package/dist/http/execution-context.js.map +1 -0
  62. package/dist/http/handler-deps.d.ts +19 -0
  63. package/dist/http/handler-deps.d.ts.map +1 -0
  64. package/dist/http/handler-deps.js +2 -0
  65. package/dist/http/handler-deps.js.map +1 -0
  66. package/dist/http/handlers/control/batch-slice.d.ts +4 -0
  67. package/dist/http/handlers/control/batch-slice.d.ts.map +1 -0
  68. package/dist/http/handlers/control/batch-slice.js +40 -0
  69. package/dist/http/handlers/control/batch-slice.js.map +1 -0
  70. package/dist/http/handlers/control/batch.d.ts +23 -0
  71. package/dist/http/handlers/control/batch.d.ts.map +1 -0
  72. package/dist/http/handlers/control/batch.js +332 -0
  73. package/dist/http/handlers/control/batch.js.map +1 -0
  74. package/dist/http/handlers/control/context-blocks.d.ts +22 -0
  75. package/dist/http/handlers/control/context-blocks.d.ts.map +1 -0
  76. package/dist/http/handlers/control/context-blocks.js +111 -0
  77. package/dist/http/handlers/control/context-blocks.js.map +1 -0
  78. package/dist/http/handlers/introspection/health.d.ts +20 -0
  79. package/dist/http/handlers/introspection/health.d.ts.map +1 -0
  80. package/dist/http/handlers/introspection/health.js +18 -0
  81. package/dist/http/handlers/introspection/health.js.map +1 -0
  82. package/dist/http/handlers/introspection/status.d.ts +26 -0
  83. package/dist/http/handlers/introspection/status.d.ts.map +1 -0
  84. package/dist/http/handlers/introspection/status.js +136 -0
  85. package/dist/http/handlers/introspection/status.js.map +1 -0
  86. package/dist/http/handlers/tools/audit.d.ts +4 -0
  87. package/dist/http/handlers/tools/audit.d.ts.map +1 -0
  88. package/dist/http/handlers/tools/audit.js +43 -0
  89. package/dist/http/handlers/tools/audit.js.map +1 -0
  90. package/dist/http/handlers/tools/debug.d.ts +4 -0
  91. package/dist/http/handlers/tools/debug.d.ts.map +1 -0
  92. package/dist/http/handlers/tools/debug.js +43 -0
  93. package/dist/http/handlers/tools/debug.js.map +1 -0
  94. package/dist/http/handlers/tools/delegate.d.ts +4 -0
  95. package/dist/http/handlers/tools/delegate.d.ts.map +1 -0
  96. package/dist/http/handlers/tools/delegate.js +43 -0
  97. package/dist/http/handlers/tools/delegate.js.map +1 -0
  98. package/dist/http/handlers/tools/execute-plan.d.ts +4 -0
  99. package/dist/http/handlers/tools/execute-plan.d.ts.map +1 -0
  100. package/dist/http/handlers/tools/execute-plan.js +45 -0
  101. package/dist/http/handlers/tools/execute-plan.js.map +1 -0
  102. package/dist/http/handlers/tools/investigate.d.ts +4 -0
  103. package/dist/http/handlers/tools/investigate.d.ts.map +1 -0
  104. package/dist/http/handlers/tools/investigate.js +64 -0
  105. package/dist/http/handlers/tools/investigate.js.map +1 -0
  106. package/dist/http/handlers/tools/journal-recall.d.ts +4 -0
  107. package/dist/http/handlers/tools/journal-recall.d.ts.map +1 -0
  108. package/dist/http/handlers/tools/journal-recall.js +40 -0
  109. package/dist/http/handlers/tools/journal-recall.js.map +1 -0
  110. package/dist/http/handlers/tools/journal-record.d.ts +12 -0
  111. package/dist/http/handlers/tools/journal-record.d.ts.map +1 -0
  112. package/dist/http/handlers/tools/journal-record.js +43 -0
  113. package/dist/http/handlers/tools/journal-record.js.map +1 -0
  114. package/dist/http/handlers/tools/research.d.ts +4 -0
  115. package/dist/http/handlers/tools/research.d.ts.map +1 -0
  116. package/dist/http/handlers/tools/research.js +64 -0
  117. package/dist/http/handlers/tools/research.js.map +1 -0
  118. package/dist/http/handlers/tools/retry.d.ts +4 -0
  119. package/dist/http/handlers/tools/retry.d.ts.map +1 -0
  120. package/dist/http/handlers/tools/retry.js +49 -0
  121. package/dist/http/handlers/tools/retry.js.map +1 -0
  122. package/dist/http/handlers/tools/review.d.ts +4 -0
  123. package/dist/http/handlers/tools/review.d.ts.map +1 -0
  124. package/dist/http/handlers/tools/review.js +43 -0
  125. package/dist/http/handlers/tools/review.js.map +1 -0
  126. package/dist/http/middleware/body-reader.d.ts +16 -0
  127. package/dist/http/middleware/body-reader.d.ts.map +1 -0
  128. package/dist/http/middleware/body-reader.js +44 -0
  129. package/dist/http/middleware/body-reader.js.map +1 -0
  130. package/dist/http/middleware/caller-identity.d.ts +16 -0
  131. package/dist/http/middleware/caller-identity.d.ts.map +1 -0
  132. package/dist/http/middleware/caller-identity.js +16 -0
  133. package/dist/http/middleware/caller-identity.js.map +1 -0
  134. package/dist/http/middleware/decompress.d.ts +14 -0
  135. package/dist/http/middleware/decompress.d.ts.map +1 -0
  136. package/dist/http/middleware/decompress.js +51 -0
  137. package/dist/http/middleware/decompress.js.map +1 -0
  138. package/dist/http/project-registry.d.ts +54 -0
  139. package/dist/http/project-registry.d.ts.map +1 -0
  140. package/dist/http/project-registry.js +130 -0
  141. package/dist/http/project-registry.js.map +1 -0
  142. package/dist/http/request-observability.d.ts +8 -0
  143. package/dist/http/request-observability.d.ts.map +1 -0
  144. package/dist/http/request-observability.js +20 -0
  145. package/dist/http/request-observability.js.map +1 -0
  146. package/dist/http/request-pipeline.d.ts +16 -0
  147. package/dist/http/request-pipeline.d.ts.map +1 -0
  148. package/dist/http/request-pipeline.js +144 -0
  149. package/dist/http/request-pipeline.js.map +1 -0
  150. package/dist/http/server.d.ts +17 -0
  151. package/dist/http/server.d.ts.map +1 -0
  152. package/dist/http/server.js +300 -0
  153. package/dist/http/server.js.map +1 -0
  154. package/dist/http/types.d.ts +20 -0
  155. package/dist/http/types.d.ts.map +1 -0
  156. package/dist/http/types.js +2 -0
  157. package/dist/http/types.js.map +1 -0
  158. package/dist/skill-install/disabled-state.d.ts +35 -0
  159. package/dist/skill-install/disabled-state.d.ts.map +1 -0
  160. package/dist/skill-install/disabled-state.js +96 -0
  161. package/dist/skill-install/disabled-state.js.map +1 -0
  162. package/dist/skill-install/discover.d.ts +29 -0
  163. package/dist/skill-install/discover.d.ts.map +1 -0
  164. package/dist/skill-install/discover.js +104 -0
  165. package/dist/skill-install/discover.js.map +1 -0
  166. package/dist/skill-install/include-utils.d.ts +27 -0
  167. package/dist/skill-install/include-utils.d.ts.map +1 -0
  168. package/dist/skill-install/include-utils.js +90 -0
  169. package/dist/skill-install/include-utils.js.map +1 -0
  170. package/dist/skill-install/manifest.d.ts +82 -0
  171. package/dist/skill-install/manifest.d.ts.map +1 -0
  172. package/dist/skill-install/manifest.js +215 -0
  173. package/dist/skill-install/manifest.js.map +1 -0
  174. package/dist/skill-install/skill-installer-common.d.ts +26 -0
  175. package/dist/skill-install/skill-installer-common.d.ts.map +1 -0
  176. package/dist/skill-install/skill-installer-common.js +139 -0
  177. package/dist/skill-install/skill-installer-common.js.map +1 -0
  178. package/dist/skill-install/skill-installers/claude-code.d.ts +43 -0
  179. package/dist/skill-install/skill-installers/claude-code.d.ts.map +1 -0
  180. package/dist/skill-install/skill-installers/claude-code.js +65 -0
  181. package/dist/skill-install/skill-installers/claude-code.js.map +1 -0
  182. package/dist/skill-install/skill-installers/codex-cli.d.ts +27 -0
  183. package/dist/skill-install/skill-installers/codex-cli.d.ts.map +1 -0
  184. package/dist/skill-install/skill-installers/codex-cli.js +84 -0
  185. package/dist/skill-install/skill-installers/codex-cli.js.map +1 -0
  186. package/dist/skill-install/skill-installers/cursor.d.ts +72 -0
  187. package/dist/skill-install/skill-installers/cursor.d.ts.map +1 -0
  188. package/dist/skill-install/skill-installers/cursor.js +81 -0
  189. package/dist/skill-install/skill-installers/cursor.js.map +1 -0
  190. package/dist/skill-install/skill-installers/gemini-cli.d.ts +50 -0
  191. package/dist/skill-install/skill-installers/gemini-cli.d.ts.map +1 -0
  192. package/dist/skill-install/skill-installers/gemini-cli.js +72 -0
  193. package/dist/skill-install/skill-installers/gemini-cli.js.map +1 -0
  194. package/dist/skill-install/skill-manifest-sync.d.ts +11 -0
  195. package/dist/skill-install/skill-manifest-sync.d.ts.map +1 -0
  196. package/dist/skill-install/skill-manifest-sync.js +65 -0
  197. package/dist/skill-install/skill-manifest-sync.js.map +1 -0
  198. package/dist/skills/_shared/auth.md +41 -0
  199. package/dist/skills/_shared/error-handling.md +31 -0
  200. package/dist/skills/_shared/polling.md +88 -0
  201. package/dist/skills/_shared/response-shape.md +55 -0
  202. package/dist/skills/_shared/review-policy.md +15 -0
  203. package/dist/skills/mma-audit/SKILL.md +270 -0
  204. package/dist/skills/mma-context-blocks/SKILL.md +148 -0
  205. package/dist/skills/mma-debug/SKILL.md +208 -0
  206. package/dist/skills/mma-delegate/SKILL.md +216 -0
  207. package/dist/skills/mma-execute-plan/SKILL.md +214 -0
  208. package/dist/skills/mma-explore/SKILL.md +190 -0
  209. package/dist/skills/mma-investigate/SKILL.md +258 -0
  210. package/dist/skills/mma-journal-recall/SKILL.md +242 -0
  211. package/dist/skills/mma-journal-record/SKILL.md +202 -0
  212. package/dist/skills/mma-research/SKILL.md +223 -0
  213. package/dist/skills/mma-retry/SKILL.md +221 -0
  214. package/dist/skills/mma-review/SKILL.md +209 -0
  215. package/dist/skills/multi-model-agent/SKILL.md +206 -0
  216. package/dist/telemetry/consent.d.ts +4 -0
  217. package/dist/telemetry/consent.d.ts.map +1 -0
  218. package/dist/telemetry/consent.js +40 -0
  219. package/dist/telemetry/consent.js.map +1 -0
  220. package/dist/telemetry/flusher.d.ts +19 -0
  221. package/dist/telemetry/flusher.d.ts.map +1 -0
  222. package/dist/telemetry/flusher.js +277 -0
  223. package/dist/telemetry/flusher.js.map +1 -0
  224. package/dist/telemetry/generation.d.ts +9 -0
  225. package/dist/telemetry/generation.d.ts.map +1 -0
  226. package/dist/telemetry/generation.js +33 -0
  227. package/dist/telemetry/generation.js.map +1 -0
  228. package/dist/telemetry/identity.d.ts +9 -0
  229. package/dist/telemetry/identity.d.ts.map +1 -0
  230. package/dist/telemetry/identity.js +35 -0
  231. package/dist/telemetry/identity.js.map +1 -0
  232. package/dist/telemetry/install-id.d.ts +13 -0
  233. package/dist/telemetry/install-id.d.ts.map +1 -0
  234. package/dist/telemetry/install-id.js +49 -0
  235. package/dist/telemetry/install-id.js.map +1 -0
  236. package/dist/telemetry/install-meta.d.ts +10 -0
  237. package/dist/telemetry/install-meta.d.ts.map +1 -0
  238. package/dist/telemetry/install-meta.js +15 -0
  239. package/dist/telemetry/install-meta.js.map +1 -0
  240. package/dist/telemetry/queue.d.ts +35 -0
  241. package/dist/telemetry/queue.d.ts.map +1 -0
  242. package/dist/telemetry/queue.js +287 -0
  243. package/dist/telemetry/queue.js.map +1 -0
  244. package/dist/telemetry/recorder.d.ts +39 -0
  245. package/dist/telemetry/recorder.d.ts.map +1 -0
  246. package/dist/telemetry/recorder.js +173 -0
  247. package/dist/telemetry/recorder.js.map +1 -0
  248. package/package.json +43 -24
  249. package/scripts/postinstall.js +36 -0
  250. package/bin/mmagent.mjs +0 -47
  251. package/postinstall.mjs +0 -8
@@ -0,0 +1,58 @@
1
+ import { type Client } from '../skill-install/manifest.js';
2
+ export declare const ExitCode: Readonly<{
3
+ SUCCESS: 0;
4
+ ERR_PARTIAL: 1;
5
+ ERR_FUTURE_MANIFEST: 2;
6
+ ERR_UNKNOWN_TARGET: 3;
7
+ }>;
8
+ export interface SyncSkillsDeps {
9
+ argv?: string[];
10
+ homeDir?: string;
11
+ /** Override skills root for testing. */
12
+ skillsRoot?: string;
13
+ /** Exit silently with code 0 if no manifest exists yet (postinstall). */
14
+ ifExists?: boolean;
15
+ /** Suppress normal stdout. Errors still go to stderr. */
16
+ silent?: boolean;
17
+ /** Swallow errors and exit 0 (postinstall). */
18
+ bestEffort?: boolean;
19
+ stdout?: (s: string) => boolean;
20
+ stderr?: (s: string) => boolean;
21
+ }
22
+ interface ParsedArgs {
23
+ targets: Client[] | null;
24
+ allTargets: boolean;
25
+ dryRun: boolean;
26
+ json: boolean;
27
+ }
28
+ export declare function parseArgs(argv: string[]): ParsedArgs;
29
+ export declare function resolveTargets(explicit: Client[] | null, allTargets: boolean, homeDir: string): Client[];
30
+ export interface SyncOutcome {
31
+ installed: Array<{
32
+ skill: string;
33
+ target: Client;
34
+ version: string;
35
+ }>;
36
+ updated: Array<{
37
+ skill: string;
38
+ target: Client;
39
+ from: string;
40
+ to: string;
41
+ }>;
42
+ removed: Array<{
43
+ skill: string;
44
+ target: Client;
45
+ }>;
46
+ upToDate: Array<{
47
+ skill: string;
48
+ target: Client;
49
+ }>;
50
+ errors: Array<{
51
+ skill: string;
52
+ target: Client;
53
+ reason: string;
54
+ }>;
55
+ }
56
+ export declare function runSyncSkills(deps?: SyncSkillsDeps): Promise<number>;
57
+ export {};
58
+ //# sourceMappingURL=sync-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-skills.d.ts","sourceRoot":"","sources":["../../src/cli/sync-skills.ts"],"names":[],"mappings":"AA4BA,OAAO,EAOL,KAAK,MAAM,EAEZ,MAAM,8BAA8B,CAAC;AActC,eAAO,MAAM,QAAQ;;;;;EAKnB,CAAC;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,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;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAiBpD;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EACzB,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CASV;AA2BD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyK9E"}
@@ -0,0 +1,266 @@
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 '../skill-install/manifest.js';
30
+ import { SUPPORTED_SKILLS, readSkillContent, getSkillsRoot, } from '../skill-install/discover.js';
31
+ import { writeSkillToClient, removeSkillFromClient, resolveClientInstallDir, UnknownTargetError, } from '../skill-install/skill-installer-common.js';
32
+ import { disabledTargets } from '../skill-install/disabled-state.js';
33
+ export const ExitCode = Object.freeze({
34
+ SUCCESS: 0,
35
+ ERR_PARTIAL: 1,
36
+ ERR_FUTURE_MANIFEST: 2,
37
+ ERR_UNKNOWN_TARGET: 3,
38
+ });
39
+ export function parseArgs(argv) {
40
+ const args = minimist(argv, {
41
+ string: ['target'],
42
+ boolean: ['dry-run', 'json', 'all-targets'],
43
+ alias: { t: 'target', j: 'json' },
44
+ });
45
+ let targets = null;
46
+ if (args.target) {
47
+ const t = Array.isArray(args.target) ? args.target : [args.target];
48
+ targets = t.map((s) => s);
49
+ }
50
+ return {
51
+ targets,
52
+ allTargets: args['all-targets'] === true,
53
+ dryRun: args['dry-run'] === true,
54
+ json: args['json'] === true,
55
+ };
56
+ }
57
+ export function resolveTargets(explicit, allTargets, homeDir) {
58
+ if (allTargets)
59
+ return [...ALL_CLIENTS];
60
+ if (explicit !== null) {
61
+ for (const t of explicit) {
62
+ if (!ALL_CLIENTS.includes(t))
63
+ throw new UnknownTargetError(t, ALL_CLIENTS);
64
+ }
65
+ return Array.from(new Set(explicit));
66
+ }
67
+ return detectClients(homeDir);
68
+ }
69
+ function versionFromContent(content) {
70
+ try {
71
+ const parsed = matter(content);
72
+ const v = parsed.data['version'];
73
+ return typeof v === 'string' && v.length > 0 ? v : 'unknown';
74
+ }
75
+ catch {
76
+ return 'unknown';
77
+ }
78
+ }
79
+ function manifestPresent(homeDir) {
80
+ return fs.existsSync(path.join(homeDir, '.multi-model', 'install-manifest.json'));
81
+ }
82
+ function readInstalledVersion(skillName, target, homeDir) {
83
+ const dir = resolveClientInstallDir(target, homeDir);
84
+ if (!dir)
85
+ return null;
86
+ const skillFile = path.join(dir, skillName, 'SKILL.md');
87
+ try {
88
+ return versionFromContent(fs.readFileSync(skillFile, 'utf8'));
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ export async function runSyncSkills(deps = {}) {
95
+ const argv = deps.argv ?? process.argv.slice(2);
96
+ const homeDir = deps.homeDir ?? os.homedir();
97
+ const skillsRoot = getSkillsRoot(deps.skillsRoot);
98
+ const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
99
+ const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
100
+ const silent = deps.silent ?? false;
101
+ const bestEffort = deps.bestEffort ?? false;
102
+ const log = silent ? (_) => true : stdout;
103
+ if (deps.ifExists && !manifestPresent(homeDir))
104
+ return ExitCode.SUCCESS;
105
+ const parsed = parseArgs(argv);
106
+ let targets;
107
+ try {
108
+ targets = resolveTargets(parsed.targets, parsed.allTargets, homeDir);
109
+ }
110
+ catch (err) {
111
+ if (err instanceof UnknownTargetError) {
112
+ stderr(`mmagent sync-skills: ${err.message}\n`);
113
+ return bestEffort ? 0 : ExitCode.ERR_UNKNOWN_TARGET;
114
+ }
115
+ throw err;
116
+ }
117
+ // Honor the disable sentinel: drop any client the user turned off via
118
+ // `mmagent disable`. This is what makes disable sticky — the npm postinstall
119
+ // hook shells out to this command, so without the filter every upgrade would
120
+ // silently reinstall skills the user deliberately removed. `mmagent enable`
121
+ // clears the sentinel before it calls back in here.
122
+ const disabled = disabledTargets(homeDir);
123
+ if (disabled.length > 0) {
124
+ const active = targets.filter((t) => !disabled.includes(t));
125
+ if (active.length === 0) {
126
+ if (parsed.json) {
127
+ stdout(JSON.stringify({ targets: [], outcome: 'skills-disabled', disabled }) + '\n');
128
+ }
129
+ else {
130
+ log(`MMA skills are disabled for ${disabled.join(', ')}. ` +
131
+ `Run \`mmagent enable\` to restore. Skipping sync.\n`);
132
+ }
133
+ return ExitCode.SUCCESS;
134
+ }
135
+ targets = active;
136
+ }
137
+ if (targets.length === 0) {
138
+ if (parsed.json) {
139
+ stdout(JSON.stringify({ targets: [], outcome: 'no-clients-detected' }) + '\n');
140
+ }
141
+ else {
142
+ log('No clients detected. Use --target=<client> or --all-targets.\n');
143
+ }
144
+ return ExitCode.SUCCESS;
145
+ }
146
+ let manifestEntries;
147
+ try {
148
+ manifestEntries = listEntries(homeDir);
149
+ }
150
+ catch (err) {
151
+ if (err instanceof FutureManifestError) {
152
+ stderr(`mmagent sync-skills: ${err.message}\n`);
153
+ return bestEffort ? 0 : ExitCode.ERR_FUTURE_MANIFEST;
154
+ }
155
+ if (bestEffort)
156
+ return 0;
157
+ throw err;
158
+ }
159
+ const outcome = {
160
+ installed: [],
161
+ updated: [],
162
+ removed: [],
163
+ upToDate: [],
164
+ errors: [],
165
+ };
166
+ // Pass 1: orphan removal — drop skills that disappeared from the bundle.
167
+ for (const entry of manifestEntries) {
168
+ if (SUPPORTED_SKILLS.includes(entry.name))
169
+ continue;
170
+ for (const target of entry.targets) {
171
+ if (parsed.dryRun) {
172
+ outcome.removed.push({ skill: entry.name, target });
173
+ continue;
174
+ }
175
+ try {
176
+ removeSkillFromClient(entry.name, target, homeDir);
177
+ outcome.removed.push({ skill: entry.name, target });
178
+ }
179
+ catch (err) {
180
+ outcome.errors.push({
181
+ skill: entry.name,
182
+ target,
183
+ reason: err instanceof Error ? err.message : String(err),
184
+ });
185
+ }
186
+ }
187
+ if (!parsed.dryRun)
188
+ removeEntry(entry.name, [], homeDir);
189
+ }
190
+ // Pass 2: upsert canonical skills × resolved targets.
191
+ for (const skillName of SUPPORTED_SKILLS) {
192
+ const content = readSkillContent(skillName, skillsRoot);
193
+ if (content === null) {
194
+ outcome.errors.push({
195
+ skill: skillName,
196
+ target: targets[0],
197
+ reason: `Bundled SKILL.md not found at ${path.join(skillsRoot, skillName, 'SKILL.md')}`,
198
+ });
199
+ continue;
200
+ }
201
+ const canonicalVersion = versionFromContent(content);
202
+ for (const target of targets) {
203
+ const installedVersion = readInstalledVersion(skillName, target, homeDir);
204
+ const action = installedVersion === null
205
+ ? 'install'
206
+ : installedVersion !== canonicalVersion
207
+ ? 'update'
208
+ : 'up-to-date';
209
+ if (action === 'up-to-date') {
210
+ outcome.upToDate.push({ skill: skillName, target });
211
+ continue;
212
+ }
213
+ if (parsed.dryRun) {
214
+ if (action === 'install') {
215
+ outcome.installed.push({ skill: skillName, target, version: canonicalVersion });
216
+ }
217
+ else {
218
+ outcome.updated.push({ skill: skillName, target, from: installedVersion, to: canonicalVersion });
219
+ }
220
+ continue;
221
+ }
222
+ try {
223
+ writeSkillToClient(skillName, content, target, homeDir, skillsRoot, canonicalVersion);
224
+ appendEntry(skillName, canonicalVersion, [target], homeDir);
225
+ if (action === 'install') {
226
+ outcome.installed.push({ skill: skillName, target, version: canonicalVersion });
227
+ }
228
+ else {
229
+ outcome.updated.push({ skill: skillName, target, from: installedVersion, to: canonicalVersion });
230
+ }
231
+ }
232
+ catch (err) {
233
+ outcome.errors.push({
234
+ skill: skillName,
235
+ target,
236
+ reason: err instanceof Error ? err.message : String(err),
237
+ });
238
+ }
239
+ }
240
+ }
241
+ if (parsed.json) {
242
+ stdout(JSON.stringify({ dryRun: parsed.dryRun, targets, outcome }) + '\n');
243
+ }
244
+ else {
245
+ const verb = parsed.dryRun ? 'Would sync' : 'Synced';
246
+ const parts = [];
247
+ if (outcome.installed.length > 0)
248
+ parts.push(`${outcome.installed.length} installed`);
249
+ if (outcome.updated.length > 0)
250
+ parts.push(`${outcome.updated.length} updated`);
251
+ if (outcome.removed.length > 0)
252
+ parts.push(`${outcome.removed.length} orphan removed`);
253
+ if (outcome.upToDate.length > 0)
254
+ parts.push(`${outcome.upToDate.length} up-to-date`);
255
+ if (outcome.errors.length > 0)
256
+ parts.push(`${outcome.errors.length} errors`);
257
+ const summary = parts.length > 0 ? parts.join(', ') : 'nothing to do';
258
+ log(`${verb} ${SUPPORTED_SKILLS.length} skill(s) → ${targets.join(', ')} (${summary}).\n`);
259
+ for (const e of outcome.errors)
260
+ stderr(`error: ${e.skill} → ${e.target}: ${e.reason}\n`);
261
+ }
262
+ if (outcome.errors.length > 0)
263
+ return bestEffort ? 0 : ExitCode.ERR_PARTIAL;
264
+ return ExitCode.SUCCESS;
265
+ }
266
+ //# sourceMappingURL=sync-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-skills.js","sourceRoot":"","sources":["../../src/cli/sync-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface TelemetryDeps {
2
+ subcommand: 'status' | 'enable' | 'disable' | 'reset-id' | 'dump-queue';
3
+ homeDir: string;
4
+ /** Write to stdout. */
5
+ stdout?: (s: string) => boolean;
6
+ /** Write to stderr. */
7
+ stderr?: (s: string) => boolean;
8
+ }
9
+ export declare function runTelemetry(deps: TelemetryDeps): Promise<number>;
10
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,uBAAuB;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACjC;AAyJD,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * telemetry.ts — `mmagent telemetry` subcommands.
3
+ *
4
+ * Usage:
5
+ * mmagent telemetry status
6
+ * mmagent telemetry enable
7
+ * mmagent telemetry disable
8
+ * mmagent telemetry reset-id
9
+ * mmagent telemetry dump-queue
10
+ */
11
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync } from 'node:fs';
12
+ import { join, dirname } from 'node:path';
13
+ import { decide } from '../telemetry/consent.js';
14
+ import { deleteInstallId } from '../telemetry/install-id.js';
15
+ import { bumpGeneration } from '../telemetry/generation.js';
16
+ import { Queue } from '../telemetry/queue.js';
17
+ /**
18
+ * Read the raw MMAGENT_TELEMETRY env value (not the parsed decision).
19
+ */
20
+ function readRawEnv() {
21
+ return process.env.MMAGENT_TELEMETRY;
22
+ }
23
+ /**
24
+ * Read the existing config.json as a parsed object, or null if it doesn't exist.
25
+ */
26
+ function readConfigObj(homeDir) {
27
+ const cfgPath = join(homeDir, 'config.json');
28
+ if (!existsSync(cfgPath))
29
+ return null;
30
+ try {
31
+ return JSON.parse(readFileSync(cfgPath, 'utf8'));
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ /**
38
+ * Write config.json, ensuring parent directory exists.
39
+ */
40
+ function writeConfigObj(homeDir, obj) {
41
+ const cfgPath = join(homeDir, 'config.json');
42
+ const parent = dirname(cfgPath);
43
+ if (!existsSync(parent))
44
+ mkdirSync(parent, { recursive: true });
45
+ writeFileSync(cfgPath, JSON.stringify(obj, null, 2) + '\n', { mode: 0o600 });
46
+ }
47
+ async function revokeIdentity(homeDir) {
48
+ await bumpGeneration(homeDir);
49
+ const queuePath = join(homeDir, 'telemetry-queue.ndjson');
50
+ if (existsSync(queuePath))
51
+ unlinkSync(queuePath);
52
+ }
53
+ // ─── status ──────────────────────────────────────────────────────────────────
54
+ async function runStatus(deps) {
55
+ const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
56
+ const d = decide(deps.homeDir);
57
+ const envRaw = readRawEnv();
58
+ const lines = [];
59
+ lines.push(`Telemetry: ${d.enabled ? 'enabled' : 'disabled'}`);
60
+ lines.push(`Source: ${d.source}`);
61
+ if (d.source === 'env_invalid') {
62
+ lines.push(`Warning: MMAGENT_TELEMETRY="${envRaw ?? ''}" is not a recognized value (use 1/true/on/yes or 0/false/off/no)`);
63
+ }
64
+ // Surface set-but-empty env distinction
65
+ if (envRaw !== undefined && envRaw.trim().length === 0) {
66
+ lines.push(`Note: MMAGENT_TELEMETRY is set to '' (no effect — falls through to ${d.source})`);
67
+ }
68
+ stdout(lines.join('\n') + '\n');
69
+ return 0;
70
+ }
71
+ // ─── enable ──────────────────────────────────────────────────────────────────
72
+ async function runEnable(deps) {
73
+ const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
74
+ const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
75
+ let cfg = readConfigObj(deps.homeDir) ?? {};
76
+ // Remove bare top-level `enabled` if present — canonical shape is `telemetry.enabled`
77
+ if (typeof cfg.enabled === 'boolean') {
78
+ delete cfg.enabled;
79
+ }
80
+ const telemetry = (cfg.telemetry ?? {});
81
+ telemetry.enabled = true;
82
+ delete telemetry.consentSchemaVersion;
83
+ cfg.telemetry = telemetry;
84
+ try {
85
+ writeConfigObj(deps.homeDir, cfg);
86
+ stdout('Telemetry enabled (config.telemetry.enabled = true)\n');
87
+ return 0;
88
+ }
89
+ catch (err) {
90
+ stderr(`mmagent telemetry enable: ${err instanceof Error ? err.message : String(err)}\n`);
91
+ return 1;
92
+ }
93
+ }
94
+ // ─── disable ──────────────────────────────────────────────────────────────────
95
+ async function runDisable(deps) {
96
+ const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
97
+ const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
98
+ let cfg = readConfigObj(deps.homeDir) ?? {};
99
+ if (typeof cfg.enabled === 'boolean') {
100
+ delete cfg.enabled;
101
+ }
102
+ const telemetry = (cfg.telemetry ?? {});
103
+ telemetry.enabled = false;
104
+ cfg.telemetry = telemetry;
105
+ try {
106
+ writeConfigObj(deps.homeDir, cfg);
107
+ await revokeIdentity(deps.homeDir);
108
+ stdout('Telemetry disabled (config.telemetry.enabled = false, identity revoked)\n');
109
+ return 0;
110
+ }
111
+ catch (err) {
112
+ stderr(`mmagent telemetry disable: ${err instanceof Error ? err.message : String(err)}\n`);
113
+ return 1;
114
+ }
115
+ }
116
+ // ─── reset-id ─────────────────────────────────────────────────────────────────
117
+ async function runResetId(deps) {
118
+ const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
119
+ const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
120
+ try {
121
+ await revokeIdentity(deps.homeDir);
122
+ deleteInstallId(deps.homeDir);
123
+ stdout('Identity reset (generation bumped, queue deleted, install-id deleted)\n');
124
+ return 0;
125
+ }
126
+ catch (err) {
127
+ stderr(`mmagent telemetry reset-id: ${err instanceof Error ? err.message : String(err)}\n`);
128
+ return 1;
129
+ }
130
+ }
131
+ // ─── dump-queue ───────────────────────────────────────────────────────────────
132
+ async function runDumpQueue(deps) {
133
+ const stdout = deps.stdout ?? process.stdout.write.bind(process.stdout);
134
+ const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
135
+ try {
136
+ const queue = new Queue(deps.homeDir);
137
+ const batch = await queue.readBatch();
138
+ stdout(JSON.stringify(batch.records, null, 2) + '\n');
139
+ return 0;
140
+ }
141
+ catch (err) {
142
+ stderr(`mmagent telemetry dump-queue: ${err instanceof Error ? err.message : String(err)}\n`);
143
+ return 1;
144
+ }
145
+ }
146
+ // ─── dispatch ─────────────────────────────────────────────────────────────────
147
+ export async function runTelemetry(deps) {
148
+ switch (deps.subcommand) {
149
+ case 'status': return runStatus(deps);
150
+ case 'enable': return runEnable(deps);
151
+ case 'disable': return runDisable(deps);
152
+ case 'reset-id': return runResetId(deps);
153
+ case 'dump-queue': return runDumpQueue(deps);
154
+ default: {
155
+ const stderr = deps.stderr ?? process.stderr.write.bind(process.stderr);
156
+ stderr(`mmagent telemetry: unknown subcommand '${deps.subcommand}'\n`);
157
+ return 1;
158
+ }
159
+ }
160
+ }
161
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare const ToggleExitCode: Readonly<{
2
+ SUCCESS: 0;
3
+ ERR_PARTIAL: 1;
4
+ ERR_UNKNOWN_TARGET: 3;
5
+ }>;
6
+ export interface ToggleDeps {
7
+ argv?: string[];
8
+ homeDir?: string;
9
+ /** Override skills root — threaded into runSyncSkills for `enable` in tests. */
10
+ skillsRoot?: string;
11
+ /** Recorded in the sentinel for diagnostics; defaults to 'unknown'. */
12
+ cliVersion?: string;
13
+ stdout?: (s: string) => boolean;
14
+ stderr?: (s: string) => boolean;
15
+ }
16
+ /**
17
+ * `mmagent disable` — remove all MMA skills from the resolved clients and
18
+ * record the sticky sentinel.
19
+ */
20
+ export declare function runDisable(deps?: ToggleDeps): Promise<number>;
21
+ /**
22
+ * `mmagent enable` — clear the sentinel for the resolved clients, then
23
+ * delegate to sync-skills' idempotent upsert to reinstall the skills.
24
+ */
25
+ export declare function runEnable(deps?: ToggleDeps): Promise<number>;
26
+ //# sourceMappingURL=toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../src/cli/toggle.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,cAAc;;;;EAIzB,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACjC;AA4BD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAyEvE;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDtE"}