@zhixuan92/multi-model-agent 5.0.2 → 5.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.
- package/README.md +8 -18
- package/dist/cli/index.d.ts +62 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +345 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/info.d.ts +22 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +100 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/cli/logs.d.ts +15 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +102 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/print-token.d.ts +18 -0
- package/dist/cli/print-token.d.ts.map +1 -0
- package/dist/cli/print-token.js +60 -0
- package/dist/cli/print-token.js.map +1 -0
- package/dist/cli/serve.d.ts +28 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +405 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/status.d.ts +49 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +155 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/sync-skills.d.ts +58 -0
- package/dist/cli/sync-skills.d.ts.map +1 -0
- package/dist/cli/sync-skills.js +266 -0
- package/dist/cli/sync-skills.js.map +1 -0
- package/dist/cli/telemetry.d.ts +10 -0
- package/dist/cli/telemetry.d.ts.map +1 -0
- package/dist/cli/telemetry.js +161 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/toggle.d.ts +26 -0
- package/dist/cli/toggle.d.ts.map +1 -0
- package/dist/cli/toggle.js +185 -0
- package/dist/cli/toggle.js.map +1 -0
- package/dist/http/async-dispatch.d.ts +44 -0
- package/dist/http/async-dispatch.d.ts.map +1 -0
- package/dist/http/async-dispatch.js +175 -0
- package/dist/http/async-dispatch.js.map +1 -0
- package/dist/http/auth.d.ts +20 -0
- package/dist/http/auth.d.ts.map +1 -0
- package/dist/http/auth.js +56 -0
- package/dist/http/auth.js.map +1 -0
- package/dist/http/canonicalize-file-paths.d.ts +8 -0
- package/dist/http/canonicalize-file-paths.d.ts.map +1 -0
- package/dist/http/canonicalize-file-paths.js +43 -0
- package/dist/http/canonicalize-file-paths.js.map +1 -0
- package/dist/http/cwd-validator.d.ts +11 -0
- package/dist/http/cwd-validator.d.ts.map +1 -0
- package/dist/http/cwd-validator.js +130 -0
- package/dist/http/cwd-validator.js.map +1 -0
- package/dist/http/errors.d.ts +4 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +9 -0
- package/dist/http/errors.js.map +1 -0
- package/dist/http/execution-context.d.ts +18 -0
- package/dist/http/execution-context.d.ts.map +1 -0
- package/dist/http/execution-context.js +61 -0
- package/dist/http/execution-context.js.map +1 -0
- package/dist/http/handler-deps.d.ts +19 -0
- package/dist/http/handler-deps.d.ts.map +1 -0
- package/dist/http/handler-deps.js +2 -0
- package/dist/http/handler-deps.js.map +1 -0
- package/dist/http/handlers/control/batch-slice.d.ts +4 -0
- package/dist/http/handlers/control/batch-slice.d.ts.map +1 -0
- package/dist/http/handlers/control/batch-slice.js +40 -0
- package/dist/http/handlers/control/batch-slice.js.map +1 -0
- package/dist/http/handlers/control/batch.d.ts +23 -0
- package/dist/http/handlers/control/batch.d.ts.map +1 -0
- package/dist/http/handlers/control/batch.js +332 -0
- package/dist/http/handlers/control/batch.js.map +1 -0
- package/dist/http/handlers/control/context-blocks.d.ts +22 -0
- package/dist/http/handlers/control/context-blocks.d.ts.map +1 -0
- package/dist/http/handlers/control/context-blocks.js +111 -0
- package/dist/http/handlers/control/context-blocks.js.map +1 -0
- package/dist/http/handlers/introspection/health.d.ts +20 -0
- package/dist/http/handlers/introspection/health.d.ts.map +1 -0
- package/dist/http/handlers/introspection/health.js +18 -0
- package/dist/http/handlers/introspection/health.js.map +1 -0
- package/dist/http/handlers/introspection/status.d.ts +26 -0
- package/dist/http/handlers/introspection/status.d.ts.map +1 -0
- package/dist/http/handlers/introspection/status.js +136 -0
- package/dist/http/handlers/introspection/status.js.map +1 -0
- package/dist/http/handlers/tools/audit.d.ts +4 -0
- package/dist/http/handlers/tools/audit.d.ts.map +1 -0
- package/dist/http/handlers/tools/audit.js +43 -0
- package/dist/http/handlers/tools/audit.js.map +1 -0
- package/dist/http/handlers/tools/debug.d.ts +4 -0
- package/dist/http/handlers/tools/debug.d.ts.map +1 -0
- package/dist/http/handlers/tools/debug.js +43 -0
- package/dist/http/handlers/tools/debug.js.map +1 -0
- package/dist/http/handlers/tools/delegate.d.ts +4 -0
- package/dist/http/handlers/tools/delegate.d.ts.map +1 -0
- package/dist/http/handlers/tools/delegate.js +43 -0
- package/dist/http/handlers/tools/delegate.js.map +1 -0
- package/dist/http/handlers/tools/execute-plan.d.ts +4 -0
- package/dist/http/handlers/tools/execute-plan.d.ts.map +1 -0
- package/dist/http/handlers/tools/execute-plan.js +45 -0
- package/dist/http/handlers/tools/execute-plan.js.map +1 -0
- package/dist/http/handlers/tools/investigate.d.ts +4 -0
- package/dist/http/handlers/tools/investigate.d.ts.map +1 -0
- package/dist/http/handlers/tools/investigate.js +64 -0
- package/dist/http/handlers/tools/investigate.js.map +1 -0
- package/dist/http/handlers/tools/journal-recall.d.ts +4 -0
- package/dist/http/handlers/tools/journal-recall.d.ts.map +1 -0
- package/dist/http/handlers/tools/journal-recall.js +40 -0
- package/dist/http/handlers/tools/journal-recall.js.map +1 -0
- package/dist/http/handlers/tools/journal-record.d.ts +8 -0
- package/dist/http/handlers/tools/journal-record.d.ts.map +1 -0
- package/dist/http/handlers/tools/journal-record.js +40 -0
- package/dist/http/handlers/tools/journal-record.js.map +1 -0
- package/dist/http/handlers/tools/research.d.ts +4 -0
- package/dist/http/handlers/tools/research.d.ts.map +1 -0
- package/dist/http/handlers/tools/research.js +64 -0
- package/dist/http/handlers/tools/research.js.map +1 -0
- package/dist/http/handlers/tools/retry.d.ts +4 -0
- package/dist/http/handlers/tools/retry.d.ts.map +1 -0
- package/dist/http/handlers/tools/retry.js +73 -0
- package/dist/http/handlers/tools/retry.js.map +1 -0
- package/dist/http/handlers/tools/review.d.ts +4 -0
- package/dist/http/handlers/tools/review.d.ts.map +1 -0
- package/dist/http/handlers/tools/review.js +43 -0
- package/dist/http/handlers/tools/review.js.map +1 -0
- package/dist/http/journal-lock.d.ts +4 -0
- package/dist/http/journal-lock.d.ts.map +1 -0
- package/dist/http/journal-lock.js +34 -0
- package/dist/http/journal-lock.js.map +1 -0
- package/dist/http/middleware/body-reader.d.ts +16 -0
- package/dist/http/middleware/body-reader.d.ts.map +1 -0
- package/dist/http/middleware/body-reader.js +44 -0
- package/dist/http/middleware/body-reader.js.map +1 -0
- package/dist/http/middleware/caller-identity.d.ts +16 -0
- package/dist/http/middleware/caller-identity.d.ts.map +1 -0
- package/dist/http/middleware/caller-identity.js +16 -0
- package/dist/http/middleware/caller-identity.js.map +1 -0
- package/dist/http/middleware/decompress.d.ts +14 -0
- package/dist/http/middleware/decompress.d.ts.map +1 -0
- package/dist/http/middleware/decompress.js +51 -0
- package/dist/http/middleware/decompress.js.map +1 -0
- package/dist/http/project-registry.d.ts +54 -0
- package/dist/http/project-registry.d.ts.map +1 -0
- package/dist/http/project-registry.js +130 -0
- package/dist/http/project-registry.js.map +1 -0
- package/dist/http/request-observability.d.ts +8 -0
- package/dist/http/request-observability.d.ts.map +1 -0
- package/dist/http/request-observability.js +20 -0
- package/dist/http/request-observability.js.map +1 -0
- package/dist/http/request-pipeline.d.ts +16 -0
- package/dist/http/request-pipeline.d.ts.map +1 -0
- package/dist/http/request-pipeline.js +144 -0
- package/dist/http/request-pipeline.js.map +1 -0
- package/dist/http/server.d.ts +17 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +300 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/types.d.ts +20 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +2 -0
- package/dist/http/types.js.map +1 -0
- package/dist/skill-install/disabled-state.d.ts +35 -0
- package/dist/skill-install/disabled-state.d.ts.map +1 -0
- package/dist/skill-install/disabled-state.js +96 -0
- package/dist/skill-install/disabled-state.js.map +1 -0
- 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 +104 -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 +82 -0
- package/dist/skill-install/manifest.d.ts.map +1 -0
- package/dist/skill-install/manifest.js +215 -0
- package/dist/skill-install/manifest.js.map +1 -0
- package/dist/skill-install/skill-installer-common.d.ts +26 -0
- package/dist/skill-install/skill-installer-common.d.ts.map +1 -0
- package/dist/skill-install/skill-installer-common.js +139 -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/_shared/auth.md +41 -0
- package/dist/skills/_shared/error-handling.md +31 -0
- package/dist/skills/_shared/polling.md +88 -0
- package/dist/skills/_shared/response-shape.md +55 -0
- package/dist/skills/_shared/review-policy.md +15 -0
- package/dist/skills/mma-audit/SKILL.md +270 -0
- package/dist/skills/mma-context-blocks/SKILL.md +148 -0
- package/dist/skills/mma-debug/SKILL.md +208 -0
- package/dist/skills/mma-delegate/SKILL.md +216 -0
- package/dist/skills/mma-execute-plan/SKILL.md +214 -0
- package/dist/skills/mma-explore/SKILL.md +190 -0
- package/dist/skills/mma-investigate/SKILL.md +258 -0
- package/dist/skills/mma-journal-recall/SKILL.md +242 -0
- package/dist/skills/mma-journal-record/SKILL.md +202 -0
- package/dist/skills/mma-research/SKILL.md +223 -0
- package/dist/skills/mma-retry/SKILL.md +221 -0
- package/dist/skills/mma-review/SKILL.md +209 -0
- package/dist/skills/multi-model-agent/SKILL.md +206 -0
- package/dist/telemetry/consent.d.ts +4 -0
- package/dist/telemetry/consent.d.ts.map +1 -0
- package/dist/telemetry/consent.js +40 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/flusher.d.ts +19 -0
- package/dist/telemetry/flusher.d.ts.map +1 -0
- package/dist/telemetry/flusher.js +277 -0
- package/dist/telemetry/flusher.js.map +1 -0
- package/dist/telemetry/generation.d.ts +9 -0
- package/dist/telemetry/generation.d.ts.map +1 -0
- package/dist/telemetry/generation.js +33 -0
- package/dist/telemetry/generation.js.map +1 -0
- package/dist/telemetry/identity.d.ts +9 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/telemetry/identity.js +35 -0
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/install-id.d.ts +13 -0
- package/dist/telemetry/install-id.d.ts.map +1 -0
- package/dist/telemetry/install-id.js +49 -0
- package/dist/telemetry/install-id.js.map +1 -0
- package/dist/telemetry/install-meta.d.ts +10 -0
- package/dist/telemetry/install-meta.d.ts.map +1 -0
- package/dist/telemetry/install-meta.js +15 -0
- package/dist/telemetry/install-meta.js.map +1 -0
- package/dist/telemetry/queue.d.ts +35 -0
- package/dist/telemetry/queue.d.ts.map +1 -0
- package/dist/telemetry/queue.js +287 -0
- package/dist/telemetry/queue.js.map +1 -0
- package/dist/telemetry/recorder.d.ts +39 -0
- package/dist/telemetry/recorder.d.ts.map +1 -0
- package/dist/telemetry/recorder.js +173 -0
- package/dist/telemetry/recorder.js.map +1 -0
- package/package.json +43 -24
- package/scripts/postinstall.js +36 -0
- package/bin/mmagent.mjs +0 -47
- package/postinstall.mjs +0 -8
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline `@include _shared/<path>` directives in `content`.
|
|
3
|
+
*
|
|
4
|
+
* Each line matching `@include _shared/<path>` (space after `@include`) is
|
|
5
|
+
* replaced with the full content of `<skillsRoot>/_shared/<path>`.
|
|
6
|
+
*
|
|
7
|
+
* Security constraints:
|
|
8
|
+
* - Only paths beginning with `_shared/` are accepted.
|
|
9
|
+
* - The resolved path must stay within `<skillsRoot>/_shared/`.
|
|
10
|
+
* Path traversal attempts are rejected with a warning and the directive
|
|
11
|
+
* line is dropped.
|
|
12
|
+
*
|
|
13
|
+
* If a shared file is missing (ENOENT):
|
|
14
|
+
* - A warning is written to stderr.
|
|
15
|
+
* - The include line is removed from the output (not preserved).
|
|
16
|
+
* - Processing continues for remaining directives.
|
|
17
|
+
*
|
|
18
|
+
* Other I/O errors (permission denied, EISDIR, etc.) are re-thrown so the
|
|
19
|
+
* caller can distinguish them from a simple missing-file case.
|
|
20
|
+
*
|
|
21
|
+
* @param skillContext Used in warning messages to identify the skill context.
|
|
22
|
+
* @param content Raw skill content (may contain @include directives).
|
|
23
|
+
* @param skillsRoot Root directory containing `_shared/` sub-directory.
|
|
24
|
+
* @returns The content with directives inlined.
|
|
25
|
+
*/
|
|
26
|
+
export declare function inlineIncludes(skillContext: string, content: string, skillsRoot: string): string;
|
|
27
|
+
//# sourceMappingURL=include-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include-utils.d.ts","sourceRoot":"","sources":["../../src/skill-install/include-utils.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CA6DR"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared include-inlining utilities for skill writers.
|
|
3
|
+
*
|
|
4
|
+
* Provides a common implementation for `@include _shared/<path>` directive
|
|
5
|
+
* processing, used by all skill writers (Claude Code, Cursor, etc.).
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
/**
|
|
12
|
+
* Regex matching a line that starts with `@include ` (exact space after
|
|
13
|
+
* `@include`) followed by a relative path.
|
|
14
|
+
*/
|
|
15
|
+
const INCLUDE_RE = /^@include\s+(.+)$/;
|
|
16
|
+
/**
|
|
17
|
+
* Inline `@include _shared/<path>` directives in `content`.
|
|
18
|
+
*
|
|
19
|
+
* Each line matching `@include _shared/<path>` (space after `@include`) is
|
|
20
|
+
* replaced with the full content of `<skillsRoot>/_shared/<path>`.
|
|
21
|
+
*
|
|
22
|
+
* Security constraints:
|
|
23
|
+
* - Only paths beginning with `_shared/` are accepted.
|
|
24
|
+
* - The resolved path must stay within `<skillsRoot>/_shared/`.
|
|
25
|
+
* Path traversal attempts are rejected with a warning and the directive
|
|
26
|
+
* line is dropped.
|
|
27
|
+
*
|
|
28
|
+
* If a shared file is missing (ENOENT):
|
|
29
|
+
* - A warning is written to stderr.
|
|
30
|
+
* - The include line is removed from the output (not preserved).
|
|
31
|
+
* - Processing continues for remaining directives.
|
|
32
|
+
*
|
|
33
|
+
* Other I/O errors (permission denied, EISDIR, etc.) are re-thrown so the
|
|
34
|
+
* caller can distinguish them from a simple missing-file case.
|
|
35
|
+
*
|
|
36
|
+
* @param skillContext Used in warning messages to identify the skill context.
|
|
37
|
+
* @param content Raw skill content (may contain @include directives).
|
|
38
|
+
* @param skillsRoot Root directory containing `_shared/` sub-directory.
|
|
39
|
+
* @returns The content with directives inlined.
|
|
40
|
+
*/
|
|
41
|
+
export function inlineIncludes(skillContext, content, skillsRoot) {
|
|
42
|
+
const lines = content.split('\n');
|
|
43
|
+
const result = [];
|
|
44
|
+
for (const line of lines) {
|
|
45
|
+
const match = INCLUDE_RE.exec(line);
|
|
46
|
+
if (!match) {
|
|
47
|
+
result.push(line);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const relativePath = match[1] ?? '';
|
|
51
|
+
// Security: only accept paths beginning with `_shared/`
|
|
52
|
+
if (!relativePath.startsWith('_shared/')) {
|
|
53
|
+
process.stderr.write(`Warning: ${skillContext}: @include path must start with ` +
|
|
54
|
+
`"_shared/": ${relativePath}\n`);
|
|
55
|
+
// Directive line is dropped — do not push anything.
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Security: reject path traversal attempts
|
|
59
|
+
const resolvedPath = path.resolve(skillsRoot, relativePath);
|
|
60
|
+
const sharedDir = path.resolve(skillsRoot, '_shared');
|
|
61
|
+
if (!resolvedPath.startsWith(sharedDir + path.sep) &&
|
|
62
|
+
resolvedPath !== sharedDir) {
|
|
63
|
+
process.stderr.write(`Warning: ${skillContext}: @include path rejected ` +
|
|
64
|
+
`(path traversal): ${relativePath}\n`);
|
|
65
|
+
// Directive line is dropped.
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const sharedFilePath = path.join(skillsRoot, relativePath);
|
|
69
|
+
try {
|
|
70
|
+
const sharedContent = fs.readFileSync(sharedFilePath, 'utf-8');
|
|
71
|
+
result.push(sharedContent);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const nodeErr = err;
|
|
75
|
+
if (nodeErr.code === 'ENOENT') {
|
|
76
|
+
// Missing shared file — warn and drop the directive line.
|
|
77
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
78
|
+
process.stderr.write(`Warning: ${skillContext}: shared file not found: ` +
|
|
79
|
+
`${sharedFilePath} (referenced by @include ${relativePath}) — ${detail}\n`);
|
|
80
|
+
// Line is dropped — do not push anything.
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Permission errors, EISDIR, etc. — re-throw so the caller notices.
|
|
84
|
+
throw err;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result.join('\n');
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=include-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include-utils.js","sourceRoot":"","sources":["../../src/skill-install/include-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,cAAc,CAC5B,YAAoB,EACpB,OAAe,EACf,UAAkB;IAElB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEpC,wDAAwD;QACxD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,YAAY,kCAAkC;gBAC1D,eAAe,YAAY,IAAI,CAChC,CAAC;YACF,oDAAoD;YACpD,SAAS;QACX,CAAC;QAED,2CAA2C;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACtD,IACE,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;YAC9C,YAAY,KAAK,SAAS,EAC1B,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,YAAY,2BAA2B;gBACnD,qBAAqB,YAAY,IAAI,CACtC,CAAC;YACF,6BAA6B;YAC7B,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAA4B,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,0DAA0D;gBAC1D,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,YAAY,2BAA2B;oBACnD,GAAG,cAAc,4BAA4B,YAAY,OAAO,MAAM,IAAI,CAC3E,CAAC;gBACF,0CAA0C;YAC5C,CAAC;iBAAM,CAAC;gBACN,oEAAoE;gBACpE,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Union of all supported AI client targets. */
|
|
3
|
+
export type Client = 'claude-code' | 'gemini' | 'codex' | 'cursor';
|
|
4
|
+
/** All known client values — used for --all-targets and target validation. */
|
|
5
|
+
export declare const ALL_CLIENTS: readonly Client[];
|
|
6
|
+
/**
|
|
7
|
+
* Detect which AI client directories exist in the home directory.
|
|
8
|
+
* Checks for evidence of each known client:
|
|
9
|
+
* - claude-code: ~/.claude/ directory present (installs skills under ~/.claude/skills/)
|
|
10
|
+
* - gemini: ~/.gemini/extensions/ directory present
|
|
11
|
+
* - codex: ~/.codex/ directory present (installs skills under ~/.codex/skills/)
|
|
12
|
+
* - cursor: ~/.cursor/rules/ directory present
|
|
13
|
+
*
|
|
14
|
+
* The claude-code check deliberately accepts ~/.claude/ as sufficient signal
|
|
15
|
+
* even when ~/.claude/skills/ does not yet exist (fresh install with no skills).
|
|
16
|
+
*/
|
|
17
|
+
export declare function detectClients(homeDir: string): Client[];
|
|
18
|
+
declare const manifestEntrySchema: z.ZodObject<{
|
|
19
|
+
name: z.ZodString;
|
|
20
|
+
skillVersion: z.ZodString;
|
|
21
|
+
installedAt: z.ZodNumber;
|
|
22
|
+
targets: z.ZodArray<z.ZodEnum<{
|
|
23
|
+
gemini: "gemini";
|
|
24
|
+
"claude-code": "claude-code";
|
|
25
|
+
cursor: "cursor";
|
|
26
|
+
codex: "codex";
|
|
27
|
+
}>>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
declare const installManifestSchema: z.ZodObject<{
|
|
30
|
+
version: z.ZodLiteral<2>;
|
|
31
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
32
|
+
name: z.ZodString;
|
|
33
|
+
skillVersion: z.ZodString;
|
|
34
|
+
installedAt: z.ZodNumber;
|
|
35
|
+
targets: z.ZodArray<z.ZodEnum<{
|
|
36
|
+
gemini: "gemini";
|
|
37
|
+
"claude-code": "claude-code";
|
|
38
|
+
cursor: "cursor";
|
|
39
|
+
codex: "codex";
|
|
40
|
+
}>>;
|
|
41
|
+
}, z.core.$strip>>;
|
|
42
|
+
}, z.core.$strip>;
|
|
43
|
+
export type InstallManifest = z.infer<typeof installManifestSchema>;
|
|
44
|
+
export type ManifestEntry = z.infer<typeof manifestEntrySchema>;
|
|
45
|
+
/** Thrown when the manifest declares a version newer than this mmagent supports. */
|
|
46
|
+
export declare class FutureManifestError extends Error {
|
|
47
|
+
constructor(version: number);
|
|
48
|
+
}
|
|
49
|
+
/** Thrown when the manifest JSON parses but fails Zod structural validation. */
|
|
50
|
+
export declare class ManifestSchemaValidationError extends Error {
|
|
51
|
+
constructor(manifestPath: string, issues: z.ZodError);
|
|
52
|
+
}
|
|
53
|
+
/** The directory where the manifest file lives. */
|
|
54
|
+
export declare function manifestDir(homeDir?: string): string;
|
|
55
|
+
/** Full path to the manifest file. */
|
|
56
|
+
export declare function manifestPath(homeDir?: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Return all manifest entries, newest-first.
|
|
59
|
+
*/
|
|
60
|
+
export declare function listEntries(homeDir?: string): ManifestEntry[];
|
|
61
|
+
/**
|
|
62
|
+
* Append (or update) the entry for `skillName`.
|
|
63
|
+
*
|
|
64
|
+
* - New entry: creates with de-duplicated `newTargets`.
|
|
65
|
+
* - Existing entry: merges `newTargets` into existing targets (no duplicates),
|
|
66
|
+
* refreshes `version` and `installedAt`.
|
|
67
|
+
*
|
|
68
|
+
* In both paths the stored `targets` array is a fresh copy — caller mutations
|
|
69
|
+
* after the call do not affect the in-memory object or persisted manifest.
|
|
70
|
+
*
|
|
71
|
+
* Returns the resulting entry.
|
|
72
|
+
*/
|
|
73
|
+
export declare function appendEntry(skillName: string, skillVersion: string, newTargets: Client[], homeDir?: string): ManifestEntry;
|
|
74
|
+
/**
|
|
75
|
+
* Remove `targets` from the entry for `skillName`.
|
|
76
|
+
* If `targets` is omitted or empty, removes the entire entry.
|
|
77
|
+
* Returns the removed targets (or all targets for a full removal),
|
|
78
|
+
* or an empty array if the skill wasn't in the manifest.
|
|
79
|
+
*/
|
|
80
|
+
export declare function removeEntry(skillName: string, targets?: Client[], homeDir?: string): Client[];
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/skill-install/manifest.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gDAAgD;AAChD,MAAM,MAAM,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEnE,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAAiD,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAOvD;AAUD,QAAA,MAAM,mBAAmB;;;;;;;;;;iBAKvB,CAAC;AAEH,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;iBAGzB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,oFAAoF;AACpF,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,gFAAgF;AAChF,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ;CAKrD;AAID,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAErD;AAwED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAE7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,CA+Bf;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,MAAM,EAAO,EACtB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,EAAE,CAsBV"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install manifest management.
|
|
3
|
+
*
|
|
4
|
+
* The manifest lives at `<homeDir>/.multi-model/install-manifest.json` and records
|
|
5
|
+
* every skill ever installed so `install-skill --uninstall` can reverse
|
|
6
|
+
* the operation without leaving orphaned files.
|
|
7
|
+
*
|
|
8
|
+
* All functions accept an optional `homeDir` parameter for testability.
|
|
9
|
+
* When omitted, `os.homedir()` is used as the default.
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import os from 'node:os';
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
/** All known client values — used for --all-targets and target validation. */
|
|
16
|
+
export const ALL_CLIENTS = ['claude-code', 'gemini', 'codex', 'cursor'];
|
|
17
|
+
/**
|
|
18
|
+
* Detect which AI client directories exist in the home directory.
|
|
19
|
+
* Checks for evidence of each known client:
|
|
20
|
+
* - claude-code: ~/.claude/ directory present (installs skills under ~/.claude/skills/)
|
|
21
|
+
* - gemini: ~/.gemini/extensions/ directory present
|
|
22
|
+
* - codex: ~/.codex/ directory present (installs skills under ~/.codex/skills/)
|
|
23
|
+
* - cursor: ~/.cursor/rules/ directory present
|
|
24
|
+
*
|
|
25
|
+
* The claude-code check deliberately accepts ~/.claude/ as sufficient signal
|
|
26
|
+
* even when ~/.claude/skills/ does not yet exist (fresh install with no skills).
|
|
27
|
+
*/
|
|
28
|
+
export function detectClients(homeDir) {
|
|
29
|
+
const detected = [];
|
|
30
|
+
if (fs.existsSync(path.join(homeDir, '.claude')))
|
|
31
|
+
detected.push('claude-code');
|
|
32
|
+
if (fs.existsSync(path.join(homeDir, '.gemini', 'extensions')))
|
|
33
|
+
detected.push('gemini');
|
|
34
|
+
if (fs.existsSync(path.join(homeDir, '.codex')))
|
|
35
|
+
detected.push('codex');
|
|
36
|
+
if (fs.existsSync(path.join(homeDir, '.cursor', 'rules')))
|
|
37
|
+
detected.push('cursor');
|
|
38
|
+
return detected;
|
|
39
|
+
}
|
|
40
|
+
const MANIFEST_NAME = 'install-manifest.json';
|
|
41
|
+
// ─── Zod schema ──────────────────────────────────────────────────────────────
|
|
42
|
+
/** Zod schema for a single client target value. */
|
|
43
|
+
const clientSchema = z.enum(['claude-code', 'gemini', 'codex', 'cursor']);
|
|
44
|
+
const manifestEntrySchema = z.object({
|
|
45
|
+
name: z.string().min(1),
|
|
46
|
+
skillVersion: z.string().min(1),
|
|
47
|
+
installedAt: z.number().int().nonnegative(),
|
|
48
|
+
targets: z.array(clientSchema),
|
|
49
|
+
});
|
|
50
|
+
const installManifestSchema = z.object({
|
|
51
|
+
version: z.literal(2),
|
|
52
|
+
entries: z.array(manifestEntrySchema),
|
|
53
|
+
});
|
|
54
|
+
/** Thrown when the manifest declares a version newer than this mmagent supports. */
|
|
55
|
+
export class FutureManifestError extends Error {
|
|
56
|
+
constructor(version) {
|
|
57
|
+
super(`install-manifest.json was written by a newer mmagent (version ${version}); upgrade mmagent or remove the file to continue`);
|
|
58
|
+
this.name = 'FutureManifestError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Thrown when the manifest JSON parses but fails Zod structural validation. */
|
|
62
|
+
export class ManifestSchemaValidationError extends Error {
|
|
63
|
+
constructor(manifestPath, issues) {
|
|
64
|
+
super(`Manifest file has invalid structure (${manifestPath}): ${issues.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ─── Path helpers ────────────────────────────────────────────────────────────
|
|
68
|
+
/** The directory where the manifest file lives. */
|
|
69
|
+
export function manifestDir(homeDir) {
|
|
70
|
+
return path.join(homeDir ?? os.homedir(), '.multi-model');
|
|
71
|
+
}
|
|
72
|
+
/** Full path to the manifest file. */
|
|
73
|
+
export function manifestPath(homeDir) {
|
|
74
|
+
return path.join(manifestDir(homeDir), MANIFEST_NAME);
|
|
75
|
+
}
|
|
76
|
+
// ─── Low-level I/O ───────────────────────────────────────────────────────────
|
|
77
|
+
function backupCorrupted(p) {
|
|
78
|
+
const backup = `${p}.bak-${Date.now()}`;
|
|
79
|
+
try {
|
|
80
|
+
fs.renameSync(p, backup);
|
|
81
|
+
}
|
|
82
|
+
catch { /* ignore — best effort */ }
|
|
83
|
+
return backup;
|
|
84
|
+
}
|
|
85
|
+
function readManifest(homeDir) {
|
|
86
|
+
const p = manifestPath(homeDir);
|
|
87
|
+
if (!fs.existsSync(p))
|
|
88
|
+
return emptyManifest();
|
|
89
|
+
let raw;
|
|
90
|
+
try {
|
|
91
|
+
raw = fs.readFileSync(p, 'utf-8');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return emptyManifest();
|
|
95
|
+
}
|
|
96
|
+
let parsed;
|
|
97
|
+
try {
|
|
98
|
+
parsed = JSON.parse(raw);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
const backup = backupCorrupted(p);
|
|
102
|
+
process.stderr.write(`[mmagent] manifest corrupt; rebuilt empty v2 (previous copy at ${backup})\n`);
|
|
103
|
+
const empty = emptyManifest();
|
|
104
|
+
writeManifest(empty, homeDir);
|
|
105
|
+
return empty;
|
|
106
|
+
}
|
|
107
|
+
const parsedVersion = parsed !== null && typeof parsed === 'object' && 'version' in parsed
|
|
108
|
+
? parsed.version
|
|
109
|
+
: undefined;
|
|
110
|
+
if (typeof parsedVersion === 'number' && parsedVersion > 2) {
|
|
111
|
+
throw new FutureManifestError(parsedVersion);
|
|
112
|
+
}
|
|
113
|
+
// v2 — validate strictly
|
|
114
|
+
if (parsedVersion === 2) {
|
|
115
|
+
const result = installManifestSchema.safeParse(parsed);
|
|
116
|
+
if (!result.success) {
|
|
117
|
+
throw new ManifestSchemaValidationError(p, result.error);
|
|
118
|
+
}
|
|
119
|
+
return result.data;
|
|
120
|
+
}
|
|
121
|
+
// Unrecognized shape (or pre-v2 manifest from an older mmagent) — back up and rebuild empty.
|
|
122
|
+
const backup = backupCorrupted(p);
|
|
123
|
+
process.stderr.write(`[mmagent] manifest unrecognized; rebuilt empty v2 (previous copy at ${backup})\n`);
|
|
124
|
+
const empty = emptyManifest();
|
|
125
|
+
writeManifest(empty, homeDir);
|
|
126
|
+
return empty;
|
|
127
|
+
}
|
|
128
|
+
function writeManifest(manifest, homeDir) {
|
|
129
|
+
fs.mkdirSync(manifestDir(homeDir), { recursive: true, mode: 0o700 });
|
|
130
|
+
fs.writeFileSync(manifestPath(homeDir), JSON.stringify(manifest, null, 2) + '\n', {
|
|
131
|
+
encoding: 'utf-8',
|
|
132
|
+
mode: 0o600,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function emptyManifest() {
|
|
136
|
+
return { version: 2, entries: [] };
|
|
137
|
+
}
|
|
138
|
+
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
139
|
+
/**
|
|
140
|
+
* Return all manifest entries, newest-first.
|
|
141
|
+
*/
|
|
142
|
+
export function listEntries(homeDir) {
|
|
143
|
+
return readManifest(homeDir).entries;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Append (or update) the entry for `skillName`.
|
|
147
|
+
*
|
|
148
|
+
* - New entry: creates with de-duplicated `newTargets`.
|
|
149
|
+
* - Existing entry: merges `newTargets` into existing targets (no duplicates),
|
|
150
|
+
* refreshes `version` and `installedAt`.
|
|
151
|
+
*
|
|
152
|
+
* In both paths the stored `targets` array is a fresh copy — caller mutations
|
|
153
|
+
* after the call do not affect the in-memory object or persisted manifest.
|
|
154
|
+
*
|
|
155
|
+
* Returns the resulting entry.
|
|
156
|
+
*/
|
|
157
|
+
export function appendEntry(skillName, skillVersion, newTargets, homeDir) {
|
|
158
|
+
const manifest = readManifest(homeDir);
|
|
159
|
+
// De-duplicate incoming targets once, preserving order of first occurrence.
|
|
160
|
+
const seen = new Set();
|
|
161
|
+
const dedupedNewTargets = newTargets.filter((t) => {
|
|
162
|
+
if (seen.has(t))
|
|
163
|
+
return false;
|
|
164
|
+
seen.add(t);
|
|
165
|
+
return true;
|
|
166
|
+
});
|
|
167
|
+
const existing = manifest.entries.find((e) => e.name === skillName);
|
|
168
|
+
if (existing) {
|
|
169
|
+
for (const t of dedupedNewTargets) {
|
|
170
|
+
if (!existing.targets.includes(t))
|
|
171
|
+
existing.targets.push(t);
|
|
172
|
+
}
|
|
173
|
+
existing.skillVersion = skillVersion;
|
|
174
|
+
existing.installedAt = Date.now();
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Clone the array so the caller cannot mutate the stored entry.
|
|
178
|
+
manifest.entries.push({
|
|
179
|
+
name: skillName,
|
|
180
|
+
skillVersion,
|
|
181
|
+
installedAt: Date.now(),
|
|
182
|
+
targets: [...dedupedNewTargets],
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
writeManifest(manifest, homeDir);
|
|
186
|
+
return existing ?? manifest.entries[manifest.entries.length - 1];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Remove `targets` from the entry for `skillName`.
|
|
190
|
+
* If `targets` is omitted or empty, removes the entire entry.
|
|
191
|
+
* Returns the removed targets (or all targets for a full removal),
|
|
192
|
+
* or an empty array if the skill wasn't in the manifest.
|
|
193
|
+
*/
|
|
194
|
+
export function removeEntry(skillName, targets = [], homeDir) {
|
|
195
|
+
const manifest = readManifest(homeDir);
|
|
196
|
+
const idx = manifest.entries.findIndex((e) => e.name === skillName);
|
|
197
|
+
if (idx === -1)
|
|
198
|
+
return [];
|
|
199
|
+
const entry = manifest.entries[idx];
|
|
200
|
+
if (targets.length === 0) {
|
|
201
|
+
// Full removal
|
|
202
|
+
manifest.entries.splice(idx, 1);
|
|
203
|
+
writeManifest(manifest, homeDir);
|
|
204
|
+
return [...entry.targets];
|
|
205
|
+
}
|
|
206
|
+
// Partial removal: only remove specified targets
|
|
207
|
+
const removed = entry.targets.filter((t) => targets.includes(t));
|
|
208
|
+
entry.targets = entry.targets.filter((t) => !removed.includes(t));
|
|
209
|
+
if (entry.targets.length === 0) {
|
|
210
|
+
manifest.entries.splice(idx, 1);
|
|
211
|
+
}
|
|
212
|
+
writeManifest(manifest, homeDir);
|
|
213
|
+
return removed;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/skill-install/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Client, ManifestEntry } from './manifest.js';
|
|
2
|
+
export type HeaderClientName = 'claude-code' | 'cursor' | 'codex-cli' | 'gemini-cli';
|
|
3
|
+
export declare function clientHeaders(client: HeaderClientName): {
|
|
4
|
+
'X-MMA-Client': HeaderClientName;
|
|
5
|
+
};
|
|
6
|
+
export declare function toHeaderClientName(client: Client): HeaderClientName;
|
|
7
|
+
export declare function notifySkillInstalled(opts: {
|
|
8
|
+
skillId: string;
|
|
9
|
+
client: string;
|
|
10
|
+
fetch?: typeof globalThis.fetch;
|
|
11
|
+
}): void;
|
|
12
|
+
export interface MissingSkill {
|
|
13
|
+
name: string;
|
|
14
|
+
targets: Client[];
|
|
15
|
+
}
|
|
16
|
+
export declare function findMissingSkills(manifestEntries: ManifestEntry[], supportedSkills: readonly string[]): MissingSkill[];
|
|
17
|
+
export declare function findOrphanedSkills(manifestEntries: ManifestEntry[], supportedSkills: readonly string[]): ManifestEntry[];
|
|
18
|
+
export declare function resolveClientInstallDir(target: Client, homeDir: string): string | null;
|
|
19
|
+
export declare class UnknownTargetError extends Error {
|
|
20
|
+
readonly code: "unknown_target";
|
|
21
|
+
constructor(target: string, valid: readonly string[]);
|
|
22
|
+
}
|
|
23
|
+
export declare function writeSkillToClient(skillName: string, content: string, target: Client, homeDir: string, skillsRoot: string, version?: string, cwd?: string, force?: boolean): void;
|
|
24
|
+
export declare function removeSkillFromClient(skillName: string, target: Client, homeDir: string, cwd?: string): void;
|
|
25
|
+
export declare function activeCleanup(installDir: string, canonicalSkills: readonly string[]): string[];
|
|
26
|
+
//# sourceMappingURL=skill-installer-common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installer-common.d.ts","sourceRoot":"","sources":["../../src/skill-install/skill-installer-common.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAc3D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAErF,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB;;EAErD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAOnE;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC,GAAG,IAAI,CAQP;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,aAAa,EAAE,EAChC,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,YAAY,EAAE,CAQhB;AAED,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,aAAa,EAAE,EAChC,eAAe,EAAE,SAAS,MAAM,EAAE,GACjC,aAAa,EAAE,CAEjB;AAkBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAStF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;gBAC9B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE;CAGrD;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAgB,EACzB,GAAG,GAAE,MAAsB,EAC3B,KAAK,GAAE,OAAe,GACrB,IAAI,CAuBN;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAsB,GAC1B,IAAI,CAmBN;AAID,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAc9F"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Shared skill-install utilities. Per architecture.md:188-194, each client
|
|
2
|
+
// gets its own writer under skill-installers/; this file holds the dispatch
|
|
3
|
+
// layer, orchestration, missing-skill detection, and outbound headers/notify
|
|
4
|
+
// code that was previously scattered across packages/server/src/install/.
|
|
5
|
+
//
|
|
6
|
+
// @module
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { installClaudeCode, uninstallClaudeCode } from './skill-installers/claude-code.js';
|
|
10
|
+
import { installGeminiCli, uninstallGeminiCli } from './skill-installers/gemini-cli.js';
|
|
11
|
+
import { installCodexCli, uninstallCodexCli } from './skill-installers/codex-cli.js';
|
|
12
|
+
import { installCursor, uninstallCursor } from './skill-installers/cursor.js';
|
|
13
|
+
export function clientHeaders(client) {
|
|
14
|
+
return { 'X-MMA-Client': client };
|
|
15
|
+
}
|
|
16
|
+
export function toHeaderClientName(client) {
|
|
17
|
+
switch (client) {
|
|
18
|
+
case 'claude-code': return 'claude-code';
|
|
19
|
+
case 'cursor': return 'cursor';
|
|
20
|
+
case 'codex': return 'codex-cli';
|
|
21
|
+
case 'gemini': return 'gemini-cli';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// ── Notify (was server/src/install/notify.ts) ──────────────────────────────
|
|
25
|
+
export function notifySkillInstalled(opts) {
|
|
26
|
+
const headerClient = toHeaderClientName(opts.client);
|
|
27
|
+
const _fetch = opts.fetch ?? globalThis.fetch;
|
|
28
|
+
_fetch('http://localhost:7331/v1/events', {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: { 'X-MMA-Client': headerClient, 'Content-Type': 'application/json' },
|
|
31
|
+
body: JSON.stringify({ event: 'skill_installed', skillId: opts.skillId, client: opts.client }),
|
|
32
|
+
}).catch(() => { });
|
|
33
|
+
}
|
|
34
|
+
export function findMissingSkills(manifestEntries, supportedSkills) {
|
|
35
|
+
if (manifestEntries.length === 0)
|
|
36
|
+
return [];
|
|
37
|
+
const targets = unionTargets(manifestEntries);
|
|
38
|
+
if (targets.length === 0)
|
|
39
|
+
return [];
|
|
40
|
+
const installedNames = new Set(manifestEntries.map((e) => e.name));
|
|
41
|
+
return supportedSkills
|
|
42
|
+
.filter((name) => !installedNames.has(name))
|
|
43
|
+
.map((name) => ({ name, targets: [...targets] }));
|
|
44
|
+
}
|
|
45
|
+
export function findOrphanedSkills(manifestEntries, supportedSkills) {
|
|
46
|
+
return manifestEntries.filter((e) => !supportedSkills.includes(e.name));
|
|
47
|
+
}
|
|
48
|
+
function unionTargets(entries) {
|
|
49
|
+
const seen = new Set();
|
|
50
|
+
const out = [];
|
|
51
|
+
for (const e of entries) {
|
|
52
|
+
for (const t of e.targets) {
|
|
53
|
+
if (!seen.has(t)) {
|
|
54
|
+
seen.add(t);
|
|
55
|
+
out.push(t);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
// ── Per-client dispatch (was server/src/install/manifest-resolve.ts) ────────
|
|
62
|
+
export function resolveClientInstallDir(target, homeDir) {
|
|
63
|
+
switch (target) {
|
|
64
|
+
case 'claude-code':
|
|
65
|
+
return path.join(homeDir, '.claude', 'skills');
|
|
66
|
+
case 'codex':
|
|
67
|
+
return path.join(homeDir, '.codex', 'skills');
|
|
68
|
+
default:
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export class UnknownTargetError extends Error {
|
|
73
|
+
code = 'unknown_target';
|
|
74
|
+
constructor(target, valid) {
|
|
75
|
+
super(`Unknown target '${target}'. Valid: ${valid.join(', ')}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export function writeSkillToClient(skillName, content, target, homeDir, skillsRoot, version = '0.0.0', cwd = process.cwd(), force = false) {
|
|
79
|
+
switch (target) {
|
|
80
|
+
case 'claude-code':
|
|
81
|
+
installClaudeCode({ skillName, content, homeDir, skillsRoot });
|
|
82
|
+
notifySkillInstalled({ skillId: skillName, client: target });
|
|
83
|
+
break;
|
|
84
|
+
case 'gemini':
|
|
85
|
+
installGeminiCli({ skillName, content, skillVersion: version, homeDir, skillsRoot });
|
|
86
|
+
notifySkillInstalled({ skillId: skillName, client: target });
|
|
87
|
+
break;
|
|
88
|
+
case 'codex':
|
|
89
|
+
installCodexCli({ skillName, content, homeDir, skillsRoot });
|
|
90
|
+
notifySkillInstalled({ skillId: skillName, client: target });
|
|
91
|
+
break;
|
|
92
|
+
case 'cursor':
|
|
93
|
+
installCursor({ content, cwd, homeDir, skillsRoot, force });
|
|
94
|
+
notifySkillInstalled({ skillId: skillName, client: target });
|
|
95
|
+
break;
|
|
96
|
+
default: {
|
|
97
|
+
const _exhaustive = target;
|
|
98
|
+
throw new Error(`install-skill: unknown target: ${_exhaustive}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function removeSkillFromClient(skillName, target, homeDir, cwd = process.cwd()) {
|
|
103
|
+
switch (target) {
|
|
104
|
+
case 'claude-code':
|
|
105
|
+
uninstallClaudeCode(skillName, homeDir);
|
|
106
|
+
break;
|
|
107
|
+
case 'gemini':
|
|
108
|
+
uninstallGeminiCli(homeDir);
|
|
109
|
+
break;
|
|
110
|
+
case 'codex':
|
|
111
|
+
uninstallCodexCli(skillName, homeDir);
|
|
112
|
+
break;
|
|
113
|
+
case 'cursor':
|
|
114
|
+
uninstallCursor(cwd);
|
|
115
|
+
break;
|
|
116
|
+
default: {
|
|
117
|
+
const _exhaustive = target;
|
|
118
|
+
throw new Error(`install-skill: unknown target: ${_exhaustive}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ── Orchestration (was server/src/install/orchestrate.ts) ───────────────────
|
|
123
|
+
export function activeCleanup(installDir, canonicalSkills) {
|
|
124
|
+
let entries;
|
|
125
|
+
try {
|
|
126
|
+
entries = fs.readdirSync(installDir);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
const present = entries.filter((name) => name.startsWith('mma-'));
|
|
132
|
+
const orphaned = present.filter((name) => !canonicalSkills.includes(name));
|
|
133
|
+
for (const orphan of orphaned) {
|
|
134
|
+
const dirPath = path.join(installDir, orphan);
|
|
135
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
136
|
+
}
|
|
137
|
+
return orphaned;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=skill-installer-common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installer-common.js","sourceRoot":"","sources":["../../src/skill-install/skill-installer-common.ts"],"names":[],"mappings":"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"}
|