@zhixuan92/multi-model-agent 4.0.1 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -7
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +9 -24
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +15 -16
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/status.js +1 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/sync-skills.d.ts +62 -0
- package/dist/cli/sync-skills.d.ts.map +1 -0
- package/dist/cli/sync-skills.js +251 -0
- package/dist/cli/sync-skills.js.map +1 -0
- package/dist/http/async-dispatch.d.ts.map +1 -1
- package/dist/http/async-dispatch.js +30 -6
- package/dist/http/async-dispatch.js.map +1 -1
- package/dist/http/handlers/introspection/status.js +1 -1
- package/dist/skills/mma-audit/SKILL.md +1 -1
- package/dist/skills/mma-context-blocks/SKILL.md +1 -1
- package/dist/skills/mma-debug/SKILL.md +1 -1
- package/dist/skills/mma-delegate/SKILL.md +1 -1
- package/dist/skills/mma-execute-plan/SKILL.md +1 -1
- package/dist/skills/mma-explore/SKILL.md +1 -1
- package/dist/skills/mma-investigate/SKILL.md +1 -1
- package/dist/skills/mma-retry/SKILL.md +1 -1
- package/dist/skills/mma-review/SKILL.md +1 -1
- package/dist/skills/mma-verify/SKILL.md +1 -1
- package/dist/skills/multi-model-agent/SKILL.md +1 -1
- package/package.json +3 -2
- package/scripts/postinstall.js +2 -2
- package/dist/cli/install-skill.d.ts +0 -78
- package/dist/cli/install-skill.d.ts.map +0 -1
- package/dist/cli/install-skill.js +0 -304
- package/dist/cli/install-skill.js.map +0 -1
- package/dist/cli/update-skills.d.ts +0 -16
- package/dist/cli/update-skills.d.ts.map +0 -1
- package/dist/cli/update-skills.js +0 -158
- package/dist/cli/update-skills.js.map +0 -1
- package/dist/http/loopback.d.ts +0 -17
- package/dist/http/loopback.d.ts.map +0 -1
- package/dist/http/loopback.js +0 -43
- package/dist/http/loopback.js.map +0 -1
- package/dist/http/router.d.ts +0 -19
- package/dist/http/router.d.ts.map +0 -1
- package/dist/http/router.js +0 -51
- package/dist/http/router.js.map +0 -1
- package/dist/http/wire/delegate-wire.d.ts +0 -4
- package/dist/http/wire/delegate-wire.d.ts.map +0 -1
- package/dist/http/wire/delegate-wire.js +0 -16
- package/dist/http/wire/delegate-wire.js.map +0 -1
- package/dist/http/wire/execute-plan-wire.d.ts +0 -18
- package/dist/http/wire/execute-plan-wire.d.ts.map +0 -1
- package/dist/http/wire/execute-plan-wire.js +0 -26
- package/dist/http/wire/execute-plan-wire.js.map +0 -1
- package/dist/http/wire/registry.d.ts +0 -3
- package/dist/http/wire/registry.d.ts.map +0 -1
- package/dist/http/wire/registry.js +0 -20
- package/dist/http/wire/registry.js.map +0 -1
- package/dist/install/claude-code.d.ts +0 -43
- package/dist/install/claude-code.d.ts.map +0 -1
- package/dist/install/claude-code.js +0 -65
- package/dist/install/claude-code.js.map +0 -1
- package/dist/install/codex-cli.d.ts +0 -27
- package/dist/install/codex-cli.d.ts.map +0 -1
- package/dist/install/codex-cli.js +0 -84
- package/dist/install/codex-cli.js.map +0 -1
- package/dist/install/cursor.d.ts +0 -72
- package/dist/install/cursor.d.ts.map +0 -1
- package/dist/install/cursor.js +0 -81
- package/dist/install/cursor.js.map +0 -1
- package/dist/install/discover.d.ts +0 -27
- package/dist/install/discover.d.ts.map +0 -1
- package/dist/install/discover.js +0 -67
- package/dist/install/discover.js.map +0 -1
- package/dist/install/gemini-cli.d.ts +0 -66
- package/dist/install/gemini-cli.d.ts.map +0 -1
- package/dist/install/gemini-cli.js +0 -111
- package/dist/install/gemini-cli.js.map +0 -1
- package/dist/install/headers.d.ts +0 -17
- package/dist/install/headers.d.ts.map +0 -1
- package/dist/install/headers.js +0 -22
- package/dist/install/headers.js.map +0 -1
- package/dist/install/include-utils.d.ts +0 -27
- package/dist/install/include-utils.d.ts.map +0 -1
- package/dist/install/include-utils.js +0 -90
- package/dist/install/include-utils.js.map +0 -1
- package/dist/install/manifest-resolve.d.ts +0 -17
- package/dist/install/manifest-resolve.d.ts.map +0 -1
- package/dist/install/manifest-resolve.js +0 -78
- package/dist/install/manifest-resolve.js.map +0 -1
- package/dist/install/manifest.d.ts +0 -94
- package/dist/install/manifest.d.ts.map +0 -1
- package/dist/install/manifest.js +0 -234
- package/dist/install/manifest.js.map +0 -1
- package/dist/install/missing-skills.d.ts +0 -20
- package/dist/install/missing-skills.d.ts.map +0 -1
- package/dist/install/missing-skills.js +0 -42
- package/dist/install/missing-skills.js.map +0 -1
- package/dist/install/notify.d.ts +0 -6
- package/dist/install/notify.d.ts.map +0 -1
- package/dist/install/notify.js +0 -13
- package/dist/install/notify.js.map +0 -1
- package/dist/install/orchestrate.d.ts +0 -47
- package/dist/install/orchestrate.d.ts.map +0 -1
- package/dist/install/orchestrate.js +0 -98
- package/dist/install/orchestrate.js.map +0 -1
- package/dist/install/skill-manifest-sync.d.ts +0 -11
- package/dist/install/skill-manifest-sync.d.ts.map +0 -1
- package/dist/install/skill-manifest-sync.js +0 -65
- package/dist/install/skill-manifest-sync.js.map +0 -1
- package/dist/openapi.d.ts +0 -15
- package/dist/openapi.d.ts.map +0 -1
- package/dist/openapi.js +0 -286
- package/dist/openapi.js.map +0 -1
package/dist/http/router.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/http/router.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,MAAM;IACT,MAAM,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE5D,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,OAAmB;QACxD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;YAC3D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,MAAc,EAAE,GAAW;QAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAsB,EAAE,CAAC;YACjF,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,MAAM,GAA2B,EAAE,CAAC;gBAC1C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wFAAwF;IACxF,UAAU,CAAC,GAAW;QACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uEAAuE;IACvE,UAAU;QACR,MAAM,QAAQ,GAA4C,EAAE,CAAC;QAC7D,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delegate-wire.d.ts","sourceRoot":"","sources":["../../../src/http/wire/delegate-wire.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,cAAc,EAKf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAErE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAOvE"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// packages/server/src/http/wire/delegate-wire.ts
|
|
2
|
-
// IMPORTANT: server code MUST import core via the workspace package name (`@zhixuan92/multi-model-agent-core`),
|
|
3
|
-
// NOT deep relative paths like `../../../packages/core/src/...`. Deep relative imports cross the
|
|
4
|
-
// workspace boundary, break TypeScript's project-references graph, and bake an internal-path
|
|
5
|
-
// dependency into the npm-published artifact. The workspace alias resolves at build time to the
|
|
6
|
-
// same target and survives the publish step.
|
|
7
|
-
import { ReviewerEngine, ReviewerPromptBuilder, specTemplate, qualityAPTemplate, diffTemplate, } from '@zhixuan92/multi-model-agent-core';
|
|
8
|
-
export function makeDelegateReviewer(shell) {
|
|
9
|
-
const builder = new ReviewerPromptBuilder({ spec: specTemplate, qualityForAP: qualityAPTemplate, diff: diffTemplate });
|
|
10
|
-
// ReviewerEngine receives the full ReviewerPromptBuilder facade, not a wrapped single-template adapter.
|
|
11
|
-
// Stage handlers (Phase 4 rows 4.1, 4.6, 4.11) call builder.buildSpec / .buildQualityAP / .buildDiff
|
|
12
|
-
// respectively — never collapse to a single buildSpec wrapper or rows 4.6 and 4.11 will silently
|
|
13
|
-
// emit spec-template prompts at quality-review and diff-review stages.
|
|
14
|
-
return new ReviewerEngine(shell, builder);
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=delegate-wire.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delegate-wire.js","sourceRoot":"","sources":["../../../src/http/wire/delegate-wire.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,gHAAgH;AAChH,iGAAiG;AACjG,6FAA6F;AAC7F,gGAAgG;AAChG,6CAA6C;AAC7C,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,mCAAmC,CAAC;AAG3C,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IACvH,wGAAwG;IACxG,qGAAqG;IACrG,iGAAiG;IACjG,uEAAuE;IACvE,OAAO,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { ToolSurfaceRegistry, ReviewerEngine } from '@zhixuan92/multi-model-agent-core';
|
|
3
|
-
import type { RunnerShell } from '@zhixuan92/multi-model-agent-core';
|
|
4
|
-
export declare const executePlanInputSchema: z.ZodObject<{
|
|
5
|
-
filePaths: z.ZodArray<z.ZodString>;
|
|
6
|
-
taskDescriptors: z.ZodArray<z.ZodString>;
|
|
7
|
-
cwd: z.ZodOptional<z.ZodString>;
|
|
8
|
-
perTaskReviewPolicy: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
9
|
-
none: "none";
|
|
10
|
-
full: "full";
|
|
11
|
-
quality_only: "quality_only";
|
|
12
|
-
diff_only: "diff_only";
|
|
13
|
-
}>>>;
|
|
14
|
-
}, z.core.$strict>;
|
|
15
|
-
export type ExecutePlanWireInput = z.infer<typeof executePlanInputSchema>;
|
|
16
|
-
export declare function registerExecutePlan(registry: ToolSurfaceRegistry): void;
|
|
17
|
-
export declare function makeExecutePlanReviewer(shell: RunnerShell): ReviewerEngine;
|
|
18
|
-
//# sourceMappingURL=execute-plan-wire.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-plan-wire.d.ts","sourceRoot":"","sources":["../../../src/http/wire/execute-plan-wire.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,cAAc,EAKf,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAErE,eAAO,MAAM,sBAAsB;;;;;;;;;;kBAOxB,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE1E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CASvE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAG1E"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
// packages/server/src/http/wire/execute-plan-wire.ts
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { ReviewerEngine, ReviewerPromptBuilder, specTemplate, qualityAPTemplate, diffTemplate, } from '@zhixuan92/multi-model-agent-core';
|
|
4
|
-
export const executePlanInputSchema = z.object({
|
|
5
|
-
filePaths: z.array(z.string()).length(1, { message: "execute_plan requires exactly one plan filePath" }),
|
|
6
|
-
taskDescriptors: z.array(z.string()).min(1),
|
|
7
|
-
cwd: z.string().optional(),
|
|
8
|
-
perTaskReviewPolicy: z.record(z.string(), z.enum(['full', 'quality_only', 'diff_only', 'none'])).optional(),
|
|
9
|
-
// NOTE: no `agentType` field. .strict() below makes any caller-supplied
|
|
10
|
-
// agentType a Zod parse failure → HTTP 400 with `error: 'invalid_request'`.
|
|
11
|
-
}).strict();
|
|
12
|
-
export function registerExecutePlan(registry) {
|
|
13
|
-
registry.register({
|
|
14
|
-
routeName: 'execute_plan',
|
|
15
|
-
schema: executePlanInputSchema,
|
|
16
|
-
toolCategory: 'artifact_producing',
|
|
17
|
-
agentTypeDefault: 'standard',
|
|
18
|
-
agentTypeOverridable: false, // locked-standard per spec C8
|
|
19
|
-
responseShapeName: 'BatchResponse',
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
export function makeExecutePlanReviewer(shell) {
|
|
23
|
-
const builder = new ReviewerPromptBuilder({ spec: specTemplate, qualityForAP: qualityAPTemplate, diff: diffTemplate });
|
|
24
|
-
return new ReviewerEngine(shell, builder);
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=execute-plan-wire.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"execute-plan-wire.js","sourceRoot":"","sources":["../../../src/http/wire/execute-plan-wire.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAEL,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,mCAAmC,CAAC;AAG3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAAC;IACxG,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3G,wEAAwE;IACxE,4EAA4E;CAC7E,CAAC,CAAC,MAAM,EAAE,CAAC;AAIZ,MAAM,UAAU,mBAAmB,CAAC,QAA6B;IAC/D,QAAQ,CAAC,QAAQ,CAAC;QAChB,SAAS,EAAE,cAAc;QACzB,MAAM,EAAE,sBAAsB;QAC9B,YAAY,EAAE,oBAAoB;QAClC,gBAAgB,EAAE,UAAU;QAC5B,oBAAoB,EAAE,KAAK,EAAI,8BAA8B;QAC7D,iBAAiB,EAAE,eAAe;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAkB;IACxD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IACvH,OAAO,IAAI,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/http/wire/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAiBpE"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export function registerDelegate(registry) {
|
|
3
|
-
registry.register({
|
|
4
|
-
routeName: 'delegate',
|
|
5
|
-
schema: z.object({
|
|
6
|
-
tasks: z.array(z.object({
|
|
7
|
-
brief: z.string(),
|
|
8
|
-
cwd: z.string().optional(),
|
|
9
|
-
agentType: z.enum(['standard', 'complex']).optional(),
|
|
10
|
-
reviewPolicy: z.enum(['full', 'quality_only', 'diff_only', 'none']).optional(),
|
|
11
|
-
contextBlockIds: z.array(z.string()).optional(),
|
|
12
|
-
})),
|
|
13
|
-
}),
|
|
14
|
-
toolCategory: 'artifact_producing',
|
|
15
|
-
agentTypeDefault: 'standard',
|
|
16
|
-
agentTypeOverridable: true,
|
|
17
|
-
responseShapeName: 'BatchResponse',
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/http/wire/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,gBAAgB,CAAC,QAA6B;IAC5D,QAAQ,CAAC,QAAQ,CAAC;QAChB,SAAS,EAAE,UAAU;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;gBACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC1B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACrD,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC9E,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;aAChD,CAAC,CAAC;SACJ,CAAC;QACF,YAAY,EAAE,oBAAoB;QAClC,gBAAgB,EAAE,UAAU;QAC5B,oBAAoB,EAAE,IAAI;QAC1B,iBAAiB,EAAE,eAAe;KACnC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Options for installing a Claude Code skill.
|
|
3
|
-
*/
|
|
4
|
-
export interface ClaudeCodeInstallOpts {
|
|
5
|
-
/** Human-readable name of the skill (used in file path). */
|
|
6
|
-
skillName: string;
|
|
7
|
-
/**
|
|
8
|
-
* Raw skill content. May contain `@include _shared/<file>.md` directives
|
|
9
|
-
* which are inlined before writing.
|
|
10
|
-
*/
|
|
11
|
-
content: string;
|
|
12
|
-
/**
|
|
13
|
-
* Home directory — replaces `os.homedir()` in all file operations.
|
|
14
|
-
* Must NOT default to `os.homedir()`.
|
|
15
|
-
*/
|
|
16
|
-
homeDir: string;
|
|
17
|
-
/** Root of the skills directory for @include resolution. */
|
|
18
|
-
skillsRoot: string;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Write (or overwrite) the SKILL.md file for a Claude Code skill.
|
|
22
|
-
*
|
|
23
|
-
* Target path: `<homeDir>/.claude/skills/<skillName>/SKILL.md`
|
|
24
|
-
*
|
|
25
|
-
* @param opts Installation options (see `ClaudeCodeInstallOpts`).
|
|
26
|
-
*/
|
|
27
|
-
export declare function installClaudeCode(opts: ClaudeCodeInstallOpts): void;
|
|
28
|
-
/**
|
|
29
|
-
* Uninstall a Claude Code skill by removing its directory.
|
|
30
|
-
*
|
|
31
|
-
* Target: `<homeDir>/.claude/skills/<skillName>/`
|
|
32
|
-
*
|
|
33
|
-
* Security: `skillName` is validated against the expected skills directory
|
|
34
|
-
* boundary to prevent path traversal (e.g. `../other-dir`). If `skillName`
|
|
35
|
-
* resolves outside the skills directory, the function is a no-op.
|
|
36
|
-
*
|
|
37
|
-
* This is also a no-op when the directory does not exist (no error is thrown).
|
|
38
|
-
*
|
|
39
|
-
* @param skillName Name of the skill to uninstall.
|
|
40
|
-
* @param homeDir Home directory where the skill directory lives.
|
|
41
|
-
*/
|
|
42
|
-
export declare function uninstallClaudeCode(skillName: string, homeDir: string): void;
|
|
43
|
-
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/install/claude-code.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAUnE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAe5E"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Code skill writer for install-skill.
|
|
3
|
-
*
|
|
4
|
-
* Writes each skill's SKILL.md to `<homeDir>/.claude/skills/<skillName>/SKILL.md`.
|
|
5
|
-
*
|
|
6
|
-
* Before writing, inlines any `@include _shared/<file>.md` directives found in
|
|
7
|
-
* the content. The directive line is replaced with the full content of the
|
|
8
|
-
* corresponding shared file sourced from `<skillsRoot>/_shared/<file>.md`.
|
|
9
|
-
* The `@include` directive is NOT preserved in the written file.
|
|
10
|
-
*
|
|
11
|
-
* If a referenced shared file is missing (ENOENT):
|
|
12
|
-
* - A warning is logged to stderr.
|
|
13
|
-
* - The include line is removed from the output (not preserved).
|
|
14
|
-
* - Processing continues for remaining content.
|
|
15
|
-
*
|
|
16
|
-
* @module
|
|
17
|
-
*/
|
|
18
|
-
import fs from 'node:fs';
|
|
19
|
-
import path from 'node:path';
|
|
20
|
-
import { inlineIncludes } from './include-utils.js';
|
|
21
|
-
/**
|
|
22
|
-
* Write (or overwrite) the SKILL.md file for a Claude Code skill.
|
|
23
|
-
*
|
|
24
|
-
* Target path: `<homeDir>/.claude/skills/<skillName>/SKILL.md`
|
|
25
|
-
*
|
|
26
|
-
* @param opts Installation options (see `ClaudeCodeInstallOpts`).
|
|
27
|
-
*/
|
|
28
|
-
export function installClaudeCode(opts) {
|
|
29
|
-
const { skillName, content, homeDir, skillsRoot } = opts;
|
|
30
|
-
// Inline @include directives before writing
|
|
31
|
-
const inlinedContent = inlineIncludes('Claude Code skill writer', content, skillsRoot);
|
|
32
|
-
// Determine target path: <homeDir>/.claude/skills/<skillName>/SKILL.md
|
|
33
|
-
const skillDir = path.join(homeDir, '.claude', 'skills', skillName);
|
|
34
|
-
fs.mkdirSync(skillDir, { recursive: true });
|
|
35
|
-
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), inlinedContent, 'utf-8');
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Uninstall a Claude Code skill by removing its directory.
|
|
39
|
-
*
|
|
40
|
-
* Target: `<homeDir>/.claude/skills/<skillName>/`
|
|
41
|
-
*
|
|
42
|
-
* Security: `skillName` is validated against the expected skills directory
|
|
43
|
-
* boundary to prevent path traversal (e.g. `../other-dir`). If `skillName`
|
|
44
|
-
* resolves outside the skills directory, the function is a no-op.
|
|
45
|
-
*
|
|
46
|
-
* This is also a no-op when the directory does not exist (no error is thrown).
|
|
47
|
-
*
|
|
48
|
-
* @param skillName Name of the skill to uninstall.
|
|
49
|
-
* @param homeDir Home directory where the skill directory lives.
|
|
50
|
-
*/
|
|
51
|
-
export function uninstallClaudeCode(skillName, homeDir) {
|
|
52
|
-
const skillsBase = path.resolve(homeDir, '.claude', 'skills');
|
|
53
|
-
// Security: validate skillName does not escape the skills directory.
|
|
54
|
-
// Normalize skillName and verify the resolved path stays within the base.
|
|
55
|
-
const normalizedName = path.normalize(skillName);
|
|
56
|
-
const resolvedSkillDir = path.resolve(skillsBase, normalizedName);
|
|
57
|
-
const baseResolved = skillsBase + path.sep;
|
|
58
|
-
if (!resolvedSkillDir.startsWith(baseResolved)) {
|
|
59
|
-
// skillName traversal attempt — no-op rather than throwing, matching
|
|
60
|
-
// the "no error when directory does not exist" behaviour.
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
fs.rmSync(resolvedSkillDir, { recursive: true, force: true });
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/install/claude-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAsBpD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA2B;IAC3D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAEzD,4CAA4C;IAC5C,MAAM,cAAc,GAAG,cAAc,CAAC,0BAA0B,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAEvF,uEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,OAAe;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE9D,qEAAqE;IACrE,0EAA0E;IAC1E,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,qEAAqE;QACrE,0DAA0D;QAC1D,OAAO;IACT,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export interface CodexCliInstallOpts {
|
|
2
|
-
/** Human-readable name of the skill (used in file path). */
|
|
3
|
-
skillName: string;
|
|
4
|
-
/** Raw skill content, possibly containing @include directives. */
|
|
5
|
-
content: string;
|
|
6
|
-
/**
|
|
7
|
-
* Home directory — replaces `os.homedir()` in all file operations.
|
|
8
|
-
* Must NOT default to `os.homedir()`.
|
|
9
|
-
*/
|
|
10
|
-
homeDir: string;
|
|
11
|
-
/** Root of the skills directory for @include resolution. */
|
|
12
|
-
skillsRoot: string;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Write (or overwrite) the SKILL.md file for a Codex CLI skill.
|
|
16
|
-
*
|
|
17
|
-
* Target path: `<homeDir>/.codex/skills/<skillName>/SKILL.md`
|
|
18
|
-
*/
|
|
19
|
-
export declare function installCodexCli(opts: CodexCliInstallOpts): void;
|
|
20
|
-
/**
|
|
21
|
-
* Uninstall a Codex CLI skill by removing its directory.
|
|
22
|
-
*
|
|
23
|
-
* This is a no-op when the directory does not exist or when `skillName` would
|
|
24
|
-
* escape the Codex skills directory.
|
|
25
|
-
*/
|
|
26
|
-
export declare function uninstallCodexCli(skillName: string, homeDir: string): void;
|
|
27
|
-
//# sourceMappingURL=codex-cli.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-cli.d.ts","sourceRoot":"","sources":["../../src/install/codex-cli.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAuCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAW/D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAK1E"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codex CLI skill writer for install-skill.
|
|
3
|
-
*
|
|
4
|
-
* Writes each skill's SKILL.md to `<homeDir>/.codex/skills/<skillName>/SKILL.md`.
|
|
5
|
-
* Codex discovers skills from that directory on the next session start. Existing
|
|
6
|
-
* `AGENTS.md` instructions are user-owned and are not modified by this writer.
|
|
7
|
-
*
|
|
8
|
-
* Before writing, any `@include _shared/<file>.md` directives are inlined using
|
|
9
|
-
* the shared include utility. Missing shared files are warned about and omitted,
|
|
10
|
-
* matching the other client writers.
|
|
11
|
-
*
|
|
12
|
-
* @module
|
|
13
|
-
*/
|
|
14
|
-
import fs from 'node:fs';
|
|
15
|
-
import path from 'node:path';
|
|
16
|
-
import { inlineIncludes } from './include-utils.js';
|
|
17
|
-
const LEGACY_MANAGED_BEGIN = '<!-- multi-model-agent:BEGIN -->';
|
|
18
|
-
const LEGACY_MANAGED_END = '<!-- multi-model-agent:END -->';
|
|
19
|
-
function codexSkillsBase(homeDir) {
|
|
20
|
-
return path.resolve(homeDir, '.codex', 'skills');
|
|
21
|
-
}
|
|
22
|
-
function resolveSkillDir(homeDir, skillName) {
|
|
23
|
-
const base = codexSkillsBase(homeDir);
|
|
24
|
-
const resolved = path.resolve(base, path.normalize(skillName));
|
|
25
|
-
if (!resolved.startsWith(base + path.sep))
|
|
26
|
-
return null;
|
|
27
|
-
return resolved;
|
|
28
|
-
}
|
|
29
|
-
function removeLegacyManagedAgentsBlock(homeDir) {
|
|
30
|
-
const agentsPath = path.join(homeDir, '.codex', 'AGENTS.md');
|
|
31
|
-
let content;
|
|
32
|
-
try {
|
|
33
|
-
content = fs.readFileSync(agentsPath, 'utf-8');
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
if (err.code === 'ENOENT')
|
|
37
|
-
return;
|
|
38
|
-
throw err;
|
|
39
|
-
}
|
|
40
|
-
const beginIdx = content.indexOf(LEGACY_MANAGED_BEGIN);
|
|
41
|
-
const endIdx = content.indexOf(LEGACY_MANAGED_END);
|
|
42
|
-
if (beginIdx === -1 || endIdx === -1 || beginIdx > endIdx)
|
|
43
|
-
return;
|
|
44
|
-
const suffixStart = endIdx + LEGACY_MANAGED_END.length;
|
|
45
|
-
const prefix = content.slice(0, beginIdx);
|
|
46
|
-
const suffix = content.slice(suffixStart).replace(/^\n+/, '');
|
|
47
|
-
const nextContent = `${prefix}${suffix}`;
|
|
48
|
-
if (nextContent.trim() === '') {
|
|
49
|
-
fs.unlinkSync(agentsPath);
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
fs.writeFileSync(agentsPath, nextContent, 'utf-8');
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Write (or overwrite) the SKILL.md file for a Codex CLI skill.
|
|
57
|
-
*
|
|
58
|
-
* Target path: `<homeDir>/.codex/skills/<skillName>/SKILL.md`
|
|
59
|
-
*/
|
|
60
|
-
export function installCodexCli(opts) {
|
|
61
|
-
const { skillName, content, homeDir, skillsRoot } = opts;
|
|
62
|
-
const skillDir = resolveSkillDir(homeDir, skillName);
|
|
63
|
-
if (skillDir === null) {
|
|
64
|
-
throw new Error(`Invalid Codex CLI skill name: ${skillName}`);
|
|
65
|
-
}
|
|
66
|
-
removeLegacyManagedAgentsBlock(homeDir);
|
|
67
|
-
const inlinedContent = inlineIncludes('Codex CLI skill writer', content, skillsRoot);
|
|
68
|
-
fs.mkdirSync(skillDir, { recursive: true });
|
|
69
|
-
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), inlinedContent, 'utf-8');
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Uninstall a Codex CLI skill by removing its directory.
|
|
73
|
-
*
|
|
74
|
-
* This is a no-op when the directory does not exist or when `skillName` would
|
|
75
|
-
* escape the Codex skills directory.
|
|
76
|
-
*/
|
|
77
|
-
export function uninstallCodexCli(skillName, homeDir) {
|
|
78
|
-
removeLegacyManagedAgentsBlock(homeDir);
|
|
79
|
-
const skillDir = resolveSkillDir(homeDir, skillName);
|
|
80
|
-
if (skillDir === null)
|
|
81
|
-
return;
|
|
82
|
-
fs.rmSync(skillDir, { recursive: true, force: true });
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=codex-cli.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-cli.js","sourceRoot":"","sources":["../../src/install/codex-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/install/cursor.d.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Options for installing a Cursor skill.
|
|
3
|
-
*
|
|
4
|
-
* NOTE: `homeDir` is accepted for API parity with other skill writers
|
|
5
|
-
* (Claude Code, Gemini CLI, etc.) but is intentionally not used by this
|
|
6
|
-
* writer. The Cursor rules target path is always CWD-relative under
|
|
7
|
-
* `<cwd>/.cursor/rules/`, not homeDir-relative. This is intentional to
|
|
8
|
-
* keep Cursor rules scoped to the project directory.
|
|
9
|
-
*/
|
|
10
|
-
export interface CursorInstallOpts {
|
|
11
|
-
/**
|
|
12
|
-
* Raw skill content. May contain `@include _shared/<file>.md` directives
|
|
13
|
-
* which are inlined before writing.
|
|
14
|
-
*/
|
|
15
|
-
content: string;
|
|
16
|
-
/**
|
|
17
|
-
* Working directory — replaces `process.cwd()`.
|
|
18
|
-
* Used to construct the CWD-relative target path:
|
|
19
|
-
* `<cwd>/.cursor/rules/multi-model-agent.mdc`
|
|
20
|
-
*/
|
|
21
|
-
cwd: string;
|
|
22
|
-
/**
|
|
23
|
-
* Home directory. Accepted for API signature compatibility with other
|
|
24
|
-
* skill writers, but NOT used by this writer. Cursor rules are always
|
|
25
|
-
* written relative to `cwd`, not `homeDir`.
|
|
26
|
-
*/
|
|
27
|
-
homeDir: string;
|
|
28
|
-
/**
|
|
29
|
-
* Where shared files live. The writer reads `<skillsRoot>/_shared/<path>`
|
|
30
|
-
* when inlining `@include` directives.
|
|
31
|
-
*/
|
|
32
|
-
skillsRoot: string;
|
|
33
|
-
/**
|
|
34
|
-
* If true, overwrite the existing file. If false (default), skip writing
|
|
35
|
-
* when the file already exists.
|
|
36
|
-
*/
|
|
37
|
-
force?: boolean;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Result of `installCursor`.
|
|
41
|
-
*/
|
|
42
|
-
export interface CursorInstallResult {
|
|
43
|
-
/**
|
|
44
|
-
* `true` if the file was written, `false` if it was skipped because it
|
|
45
|
-
* already exists and `force` was not set.
|
|
46
|
-
*/
|
|
47
|
-
written: boolean;
|
|
48
|
-
/** The full path that was (or would have been) written. */
|
|
49
|
-
targetPath: string;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Install the multi-model-agent skill for Cursor.
|
|
53
|
-
*
|
|
54
|
-
* - Target path is `<cwd>/.cursor/rules/multi-model-agent.mdc` (CWD-relative).
|
|
55
|
-
* - Creates `<cwd>/.cursor/rules/` if it does not exist.
|
|
56
|
-
* - Inlines `@include` directives before writing (see `inlineIncludes`).
|
|
57
|
-
* - If the file already exists and `force` is not set, skips writing and
|
|
58
|
-
* returns `written: false`.
|
|
59
|
-
*
|
|
60
|
-
* @param opts Installation options (see `CursorInstallOpts`).
|
|
61
|
-
*/
|
|
62
|
-
export declare function installCursor(opts: CursorInstallOpts): CursorInstallResult;
|
|
63
|
-
/**
|
|
64
|
-
* Uninstall the multi-model-agent Cursor skill.
|
|
65
|
-
*
|
|
66
|
-
* Removes `<cwd>/.cursor/rules/multi-model-agent.mdc`.
|
|
67
|
-
* This is a no-op when the file does not exist (no error is thrown).
|
|
68
|
-
*
|
|
69
|
-
* @param cwd Working directory (replaces `process.cwd()`).
|
|
70
|
-
*/
|
|
71
|
-
export declare function uninstallCursor(cwd: string): void;
|
|
72
|
-
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/install/cursor.ts"],"names":[],"mappings":"AA8BA;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAmB1E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAmBjD"}
|
package/dist/install/cursor.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cursor skill writer.
|
|
3
|
-
*
|
|
4
|
-
* Writes the skill content to `<cwd>/.cursor/rules/multi-model-agent.mdc`.
|
|
5
|
-
*
|
|
6
|
-
* Before writing, inlines any `@include _shared/<file>.md` directives found in
|
|
7
|
-
* the content. The directive line is replaced with the full content of
|
|
8
|
-
* the corresponding shared file sourced from `<skillsRoot>/_shared/<path>`.
|
|
9
|
-
* The `@include` directive is NOT preserved in the written file.
|
|
10
|
-
*
|
|
11
|
-
* If a referenced shared file is missing (ENOENT):
|
|
12
|
-
* - A warning is logged to stderr.
|
|
13
|
-
* - The include line is removed from the output (not preserved).
|
|
14
|
-
* - Processing continues for remaining directives.
|
|
15
|
-
*
|
|
16
|
-
* Security constraints on `@include` directives:
|
|
17
|
-
* - Only paths beginning with `_shared/` are accepted.
|
|
18
|
-
* - The resolved path must stay within `<skillsRoot>/_shared/`.
|
|
19
|
-
* Path traversal attempts (e.g. `_shared/../secrets.txt`) are rejected
|
|
20
|
-
* with a warning and the directive line is dropped.
|
|
21
|
-
* - Non-`_shared/` paths are rejected with a warning and the directive
|
|
22
|
-
* line is dropped.
|
|
23
|
-
*
|
|
24
|
-
* @module
|
|
25
|
-
*/
|
|
26
|
-
import fs from 'node:fs';
|
|
27
|
-
import path from 'node:path';
|
|
28
|
-
import { inlineIncludes } from './include-utils.js';
|
|
29
|
-
/**
|
|
30
|
-
* Install the multi-model-agent skill for Cursor.
|
|
31
|
-
*
|
|
32
|
-
* - Target path is `<cwd>/.cursor/rules/multi-model-agent.mdc` (CWD-relative).
|
|
33
|
-
* - Creates `<cwd>/.cursor/rules/` if it does not exist.
|
|
34
|
-
* - Inlines `@include` directives before writing (see `inlineIncludes`).
|
|
35
|
-
* - If the file already exists and `force` is not set, skips writing and
|
|
36
|
-
* returns `written: false`.
|
|
37
|
-
*
|
|
38
|
-
* @param opts Installation options (see `CursorInstallOpts`).
|
|
39
|
-
*/
|
|
40
|
-
export function installCursor(opts) {
|
|
41
|
-
const { content, cwd, skillsRoot, force } = opts;
|
|
42
|
-
const targetPath = path.join(cwd, '.cursor', 'rules', 'multi-model-agent.mdc');
|
|
43
|
-
if (!force && fs.existsSync(targetPath)) {
|
|
44
|
-
process.stderr.write(`Warning: Cursor skill writer: file already exists: ${targetPath} — skipping (use force: true to overwrite)\n`);
|
|
45
|
-
return { written: false, targetPath };
|
|
46
|
-
}
|
|
47
|
-
const rulesDir = path.join(cwd, '.cursor', 'rules');
|
|
48
|
-
fs.mkdirSync(rulesDir, { recursive: true, mode: 0o700 });
|
|
49
|
-
const finalContent = inlineIncludes('Cursor skill writer', content, skillsRoot);
|
|
50
|
-
fs.writeFileSync(targetPath, finalContent, 'utf-8');
|
|
51
|
-
return { written: true, targetPath };
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Uninstall the multi-model-agent Cursor skill.
|
|
55
|
-
*
|
|
56
|
-
* Removes `<cwd>/.cursor/rules/multi-model-agent.mdc`.
|
|
57
|
-
* This is a no-op when the file does not exist (no error is thrown).
|
|
58
|
-
*
|
|
59
|
-
* @param cwd Working directory (replaces `process.cwd()`).
|
|
60
|
-
*/
|
|
61
|
-
export function uninstallCursor(cwd) {
|
|
62
|
-
const targetPath = path.join(cwd, '.cursor', 'rules', 'multi-model-agent.mdc');
|
|
63
|
-
// Only remove the file if it exists and is a file (not a directory).
|
|
64
|
-
// This is a no-op when the path does not exist.
|
|
65
|
-
try {
|
|
66
|
-
const stat = fs.statSync(targetPath);
|
|
67
|
-
if (stat.isFile()) {
|
|
68
|
-
fs.unlinkSync(targetPath);
|
|
69
|
-
}
|
|
70
|
-
// If it's a directory or symlink to directory, do nothing — the brief
|
|
71
|
-
// specifies removing a file, not a directory tree.
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
const nodeErr = err;
|
|
75
|
-
// ENOENT means the file doesn't exist — that's fine, we were asked to remove it
|
|
76
|
-
if (nodeErr.code !== 'ENOENT') {
|
|
77
|
-
throw err;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=cursor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/install/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAsDpD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,IAAuB;IACnD,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAE/E,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sDAAsD,UAAU,8CAA8C,CAC/G,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACpD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEzD,MAAM,YAAY,GAAG,cAAc,CAAC,qBAAqB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAChF,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAE/E,qEAAqE;IACrE,gDAAgD;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QACD,sEAAsE;QACtE,mDAAmD;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAA4B,CAAC;QAC7C,gFAAgF;QAChF,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { Client } from './manifest.js';
|
|
2
|
-
export declare const SUPPORTED_SKILLS: readonly ["multi-model-agent", "mma-delegate", "mma-audit", "mma-review", "mma-verify", "mma-debug", "mma-execute-plan", "mma-retry", "mma-context-blocks", "mma-investigate", "mma-explore"];
|
|
3
|
-
/** Thrown when a skill's SKILL.md cannot be read from the bundled skills directory. */
|
|
4
|
-
export declare class SkillNotFoundError extends Error {
|
|
5
|
-
readonly code: "skill_not_found";
|
|
6
|
-
constructor(skillName: string, checkedPath: string);
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Return the absolute path to the skills root directory. Production: the
|
|
10
|
-
* bundled `packages/server/src/skills/` (or its dist mirror). Tests pass
|
|
11
|
-
* a fixture path explicitly.
|
|
12
|
-
*/
|
|
13
|
-
export declare function getSkillsRoot(skillsRoot?: string): string;
|
|
14
|
-
/**
|
|
15
|
-
* Read the content of a skill's SKILL.md file. Returns null if the file
|
|
16
|
-
* does not exist; propagates other I/O errors so callers can distinguish
|
|
17
|
-
* "skill not found" from "can't access skill".
|
|
18
|
-
*/
|
|
19
|
-
export declare function readSkillContent(skillName: string, skillsRoot?: string): string | null;
|
|
20
|
-
/**
|
|
21
|
-
* Return the per-client install directories where skills are written as
|
|
22
|
-
* subdirectories. Only includes clients that use the per-skill directory
|
|
23
|
-
* model (claude-code and codex). Gemini and Cursor bundle skills into a
|
|
24
|
-
* single file/extension and are not included.
|
|
25
|
-
*/
|
|
26
|
-
export declare function discoverPerClientInstallDirs(homeDir?: string): Partial<Record<Client, string>>;
|
|
27
|
-
//# sourceMappingURL=discover.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/install/discover.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,gBAAgB,+LAYnB,CAAC;AAEX,uFAAuF;AACvF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;gBAC/B,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAOnD;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQtF;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAM9F"}
|
package/dist/install/discover.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
// Skill discovery — locates packaged SKILL.md files on disk and reads them.
|
|
2
|
-
// Extracted from cli/install-skill.ts as part of Ch 7 Task 39.
|
|
3
|
-
import fs from 'node:fs';
|
|
4
|
-
import os from 'node:os';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
export const SUPPORTED_SKILLS = [
|
|
8
|
-
'multi-model-agent',
|
|
9
|
-
'mma-delegate',
|
|
10
|
-
'mma-audit',
|
|
11
|
-
'mma-review',
|
|
12
|
-
'mma-verify',
|
|
13
|
-
'mma-debug',
|
|
14
|
-
'mma-execute-plan',
|
|
15
|
-
'mma-retry',
|
|
16
|
-
'mma-context-blocks',
|
|
17
|
-
'mma-investigate',
|
|
18
|
-
'mma-explore',
|
|
19
|
-
];
|
|
20
|
-
/** Thrown when a skill's SKILL.md cannot be read from the bundled skills directory. */
|
|
21
|
-
export class SkillNotFoundError extends Error {
|
|
22
|
-
code = 'skill_not_found';
|
|
23
|
-
constructor(skillName, checkedPath) {
|
|
24
|
-
super(`Skill '${skillName}' not found. ` +
|
|
25
|
-
`Checked: ${checkedPath}. ` +
|
|
26
|
-
`Available skills: ${SUPPORTED_SKILLS.join(', ')}`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
const DEFAULT_SKILLS_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'skills');
|
|
30
|
-
/**
|
|
31
|
-
* Return the absolute path to the skills root directory. Production: the
|
|
32
|
-
* bundled `packages/server/src/skills/` (or its dist mirror). Tests pass
|
|
33
|
-
* a fixture path explicitly.
|
|
34
|
-
*/
|
|
35
|
-
export function getSkillsRoot(skillsRoot) {
|
|
36
|
-
return skillsRoot ?? DEFAULT_SKILLS_ROOT;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Read the content of a skill's SKILL.md file. Returns null if the file
|
|
40
|
-
* does not exist; propagates other I/O errors so callers can distinguish
|
|
41
|
-
* "skill not found" from "can't access skill".
|
|
42
|
-
*/
|
|
43
|
-
export function readSkillContent(skillName, skillsRoot) {
|
|
44
|
-
const skillFile = path.join(getSkillsRoot(skillsRoot), skillName, 'SKILL.md');
|
|
45
|
-
try {
|
|
46
|
-
return fs.readFileSync(skillFile, 'utf-8');
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
if (err.code === 'ENOENT')
|
|
50
|
-
return null;
|
|
51
|
-
throw err;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Return the per-client install directories where skills are written as
|
|
56
|
-
* subdirectories. Only includes clients that use the per-skill directory
|
|
57
|
-
* model (claude-code and codex). Gemini and Cursor bundle skills into a
|
|
58
|
-
* single file/extension and are not included.
|
|
59
|
-
*/
|
|
60
|
-
export function discoverPerClientInstallDirs(homeDir) {
|
|
61
|
-
const h = homeDir ?? os.homedir();
|
|
62
|
-
return {
|
|
63
|
-
'claude-code': path.join(h, '.claude', 'skills'),
|
|
64
|
-
'codex': path.join(h, '.codex', 'skills'),
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=discover.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/install/discover.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,+DAA+D;AAC/D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mBAAmB;IACnB,cAAc;IACd,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,kBAAkB;IAClB,WAAW;IACX,oBAAoB;IACpB,iBAAiB;IACjB,aAAa;CACL,CAAC;AAEX,uFAAuF;AACvF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,iBAA0B,CAAC;IAC3C,YAAY,SAAiB,EAAE,WAAmB;QAChD,KAAK,CACH,UAAU,SAAS,eAAe;YAClC,YAAY,WAAW,IAAI;YAC3B,qBAAqB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnD,CAAC;IACJ,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CACtC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,EACJ,QAAQ,CACT,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,UAAmB;IAC/C,OAAO,UAAU,IAAI,mBAAmB,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,UAAmB;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,OAAgB;IAC3D,MAAM,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAClC,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;QAChD,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC;KAC1C,CAAC;AACJ,CAAC"}
|