vskill 0.1.25 → 0.1.27
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/dist/agents/agents-registry.js +30 -30
- package/dist/agents/agents-registry.js.map +1 -1
- package/dist/agents/agents-registry.test.js +8 -9
- package/dist/agents/agents-registry.test.js.map +1 -1
- package/dist/commands/add-wizard.test.js +49 -33
- package/dist/commands/add-wizard.test.js.map +1 -1
- package/dist/commands/add.js +149 -44
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/add.test.js +275 -30
- package/dist/commands/add.test.js.map +1 -1
- package/dist/installer/canonical.d.ts +10 -1
- package/dist/installer/canonical.js +55 -7
- package/dist/installer/canonical.js.map +1 -1
- package/dist/installer/canonical.test.js +28 -9
- package/dist/installer/canonical.test.js.map +1 -1
- package/dist/marketplace/index.d.ts +1 -1
- package/dist/marketplace/index.js +1 -1
- package/dist/marketplace/index.js.map +1 -1
- package/dist/marketplace/marketplace.d.ts +8 -0
- package/dist/marketplace/marketplace.js +16 -0
- package/dist/marketplace/marketplace.js.map +1 -1
- package/dist/marketplace/marketplace.test.js +19 -1
- package/dist/marketplace/marketplace.test.js.map +1 -1
- package/dist/utils/claude-cli.d.ts +23 -0
- package/dist/utils/claude-cli.js +68 -0
- package/dist/utils/claude-cli.js.map +1 -0
- package/dist/utils/claude-cli.test.d.ts +1 -0
- package/dist/utils/claude-cli.test.js +82 -0
- package/dist/utils/claude-cli.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,6 +1,34 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync, symlinkSync, lstatSync, rmSync } from "node:fs";
|
|
2
2
|
import { join, relative, dirname } from "node:path";
|
|
3
|
-
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
/**
|
|
5
|
+
* Resolve tilde in a path to the user's home directory.
|
|
6
|
+
*/
|
|
7
|
+
function expandTilde(p) {
|
|
8
|
+
if (p === "~")
|
|
9
|
+
return os.homedir();
|
|
10
|
+
if (p.startsWith("~/"))
|
|
11
|
+
return os.homedir() + p.slice(1);
|
|
12
|
+
return p;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the skills directory for an agent given the install scope.
|
|
16
|
+
*
|
|
17
|
+
* Global: uses agent.globalSkillsDir (e.g. ~/.claude/skills)
|
|
18
|
+
* Local: uses projectRoot + agent.localSkillsDir (e.g. ./project/.claude/skills)
|
|
19
|
+
*/
|
|
20
|
+
function resolveAgentSkillsDir(agent, opts) {
|
|
21
|
+
if (opts.global) {
|
|
22
|
+
return expandTilde(agent.globalSkillsDir);
|
|
23
|
+
}
|
|
24
|
+
return join(opts.projectRoot, agent.localSkillsDir);
|
|
25
|
+
}
|
|
26
|
+
export function ensureCanonicalDir(base, global) {
|
|
27
|
+
if (global) {
|
|
28
|
+
const dir = join(os.homedir(), ".agents", "skills");
|
|
29
|
+
mkdirSync(dir, { recursive: true });
|
|
30
|
+
return dir;
|
|
31
|
+
}
|
|
4
32
|
const dir = join(base, ".agents", "skills");
|
|
5
33
|
mkdirSync(dir, { recursive: true });
|
|
6
34
|
return dir;
|
|
@@ -25,22 +53,40 @@ export function createRelativeSymlink(target, linkPath) {
|
|
|
25
53
|
return false;
|
|
26
54
|
}
|
|
27
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Agents known to have unreliable symlink support.
|
|
58
|
+
* These always get a direct copy even in symlink mode.
|
|
59
|
+
* See: https://github.com/anthropics/claude-code/issues/14836
|
|
60
|
+
*/
|
|
61
|
+
const COPY_FALLBACK_AGENTS = new Set(["claude-code"]);
|
|
62
|
+
/**
|
|
63
|
+
* Install a skill using the canonical symlink approach:
|
|
64
|
+
* 1. Write SKILL.md to .agents/skills/{name}/ (canonical source of truth)
|
|
65
|
+
* 2. Create relative symlinks from each agent dir to the canonical dir
|
|
66
|
+
* 3. For agents with known symlink issues, fall back to direct copy
|
|
67
|
+
*/
|
|
28
68
|
export function installSymlink(skillName, content, agents, opts) {
|
|
29
|
-
const
|
|
30
|
-
const canonicalSkillDir = join(ensureCanonicalDir(base), skillName);
|
|
69
|
+
const canonicalSkillDir = join(ensureCanonicalDir(opts.projectRoot, opts.global), skillName);
|
|
31
70
|
mkdirSync(canonicalSkillDir, { recursive: true });
|
|
32
71
|
writeFileSync(join(canonicalSkillDir, "SKILL.md"), content);
|
|
33
72
|
const installed = [];
|
|
34
73
|
for (const agent of agents) {
|
|
35
|
-
const agentSkillsDir =
|
|
74
|
+
const agentSkillsDir = resolveAgentSkillsDir(agent, opts);
|
|
36
75
|
mkdirSync(agentSkillsDir, { recursive: true });
|
|
37
76
|
const linkPath = join(agentSkillsDir, skillName);
|
|
77
|
+
// Agents with known symlink issues get direct copy
|
|
78
|
+
if (COPY_FALLBACK_AGENTS.has(agent.id)) {
|
|
79
|
+
mkdirSync(linkPath, { recursive: true });
|
|
80
|
+
writeFileSync(join(linkPath, "SKILL.md"), content);
|
|
81
|
+
installed.push(linkPath);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
38
84
|
const ok = createRelativeSymlink(canonicalSkillDir, linkPath);
|
|
39
85
|
if (ok) {
|
|
40
86
|
installed.push(linkPath);
|
|
41
87
|
}
|
|
42
88
|
else {
|
|
43
|
-
// Fallback to copy
|
|
89
|
+
// Fallback to copy on symlink failure
|
|
44
90
|
mkdirSync(linkPath, { recursive: true });
|
|
45
91
|
writeFileSync(join(linkPath, "SKILL.md"), content);
|
|
46
92
|
installed.push(linkPath);
|
|
@@ -48,11 +94,13 @@ export function installSymlink(skillName, content, agents, opts) {
|
|
|
48
94
|
}
|
|
49
95
|
return installed;
|
|
50
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Install a skill by copying SKILL.md directly to each agent directory.
|
|
99
|
+
*/
|
|
51
100
|
export function installCopy(skillName, content, agents, opts) {
|
|
52
|
-
const base = opts.projectRoot;
|
|
53
101
|
const installed = [];
|
|
54
102
|
for (const agent of agents) {
|
|
55
|
-
const agentSkillsDir =
|
|
103
|
+
const agentSkillsDir = resolveAgentSkillsDir(agent, opts);
|
|
56
104
|
const skillDir = join(agentSkillsDir, skillName);
|
|
57
105
|
mkdirSync(skillDir, { recursive: true });
|
|
58
106
|
writeFileSync(join(skillDir, "SKILL.md"), content);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/installer/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/installer/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,13 +31,13 @@ describe("canonical installer", () => {
|
|
|
31
31
|
});
|
|
32
32
|
describe("ensureCanonicalDir", () => {
|
|
33
33
|
it("creates .agents/skills/ directory under base", () => {
|
|
34
|
-
const dir = ensureCanonicalDir(tempDir);
|
|
34
|
+
const dir = ensureCanonicalDir(tempDir, false);
|
|
35
35
|
expect(dir).toBe(join(tempDir, ".agents", "skills"));
|
|
36
36
|
expect(lstatSync(dir).isDirectory()).toBe(true);
|
|
37
37
|
});
|
|
38
38
|
it("is idempotent - does not throw if dir exists", () => {
|
|
39
|
-
ensureCanonicalDir(tempDir);
|
|
40
|
-
expect(() => ensureCanonicalDir(tempDir)).not.toThrow();
|
|
39
|
+
ensureCanonicalDir(tempDir, false);
|
|
40
|
+
expect(() => ensureCanonicalDir(tempDir, false)).not.toThrow();
|
|
41
41
|
});
|
|
42
42
|
});
|
|
43
43
|
describe("createRelativeSymlink", () => {
|
|
@@ -59,10 +59,10 @@ describe("canonical installer", () => {
|
|
|
59
59
|
});
|
|
60
60
|
});
|
|
61
61
|
describe("installSymlink", () => {
|
|
62
|
-
it("creates canonical dir with SKILL.md and symlinks for
|
|
62
|
+
it("creates canonical dir with SKILL.md and symlinks for non-fallback agents", () => {
|
|
63
63
|
const agents = [
|
|
64
|
-
makeAgent({ id: "claude-code", localSkillsDir: ".claude/commands" }),
|
|
65
64
|
makeAgent({ id: "cursor", localSkillsDir: ".cursor/skills" }),
|
|
65
|
+
makeAgent({ id: "windsurf", localSkillsDir: ".windsurf/skills" }),
|
|
66
66
|
];
|
|
67
67
|
const result = installSymlink("my-skill", "# My Skill\nContent here", agents, {
|
|
68
68
|
global: false,
|
|
@@ -72,17 +72,36 @@ describe("canonical installer", () => {
|
|
|
72
72
|
const canonicalPath = join(tempDir, ".agents", "skills", "my-skill", "SKILL.md");
|
|
73
73
|
expect(readFileSync(canonicalPath, "utf-8")).toBe("# My Skill\nContent here");
|
|
74
74
|
// Each agent dir has a symlink
|
|
75
|
-
const claudeLink = join(tempDir, ".claude", "commands", "my-skill");
|
|
76
|
-
expect(lstatSync(claudeLink).isSymbolicLink()).toBe(true);
|
|
77
75
|
const cursorLink = join(tempDir, ".cursor", "skills", "my-skill");
|
|
78
76
|
expect(lstatSync(cursorLink).isSymbolicLink()).toBe(true);
|
|
77
|
+
const windsurfLink = join(tempDir, ".windsurf", "skills", "my-skill");
|
|
78
|
+
expect(lstatSync(windsurfLink).isSymbolicLink()).toBe(true);
|
|
79
79
|
// Returned paths include all locations
|
|
80
80
|
expect(result).toHaveLength(2);
|
|
81
81
|
});
|
|
82
|
+
it("uses copy fallback for Claude Code (known symlink issues)", () => {
|
|
83
|
+
const agents = [
|
|
84
|
+
makeAgent({ id: "claude-code", localSkillsDir: ".claude/skills" }),
|
|
85
|
+
makeAgent({ id: "cursor", localSkillsDir: ".cursor/skills" }),
|
|
86
|
+
];
|
|
87
|
+
const result = installSymlink("my-skill", "# My Skill\nContent here", agents, {
|
|
88
|
+
global: false,
|
|
89
|
+
projectRoot: tempDir,
|
|
90
|
+
});
|
|
91
|
+
// Claude Code gets a direct copy (not a symlink)
|
|
92
|
+
const claudePath = join(tempDir, ".claude", "skills", "my-skill");
|
|
93
|
+
expect(lstatSync(claudePath).isDirectory()).toBe(true);
|
|
94
|
+
expect(lstatSync(claudePath).isSymbolicLink()).toBe(false);
|
|
95
|
+
expect(readFileSync(join(claudePath, "SKILL.md"), "utf-8")).toBe("# My Skill\nContent here");
|
|
96
|
+
// Cursor gets a symlink
|
|
97
|
+
const cursorLink = join(tempDir, ".cursor", "skills", "my-skill");
|
|
98
|
+
expect(lstatSync(cursorLink).isSymbolicLink()).toBe(true);
|
|
99
|
+
expect(result).toHaveLength(2);
|
|
100
|
+
});
|
|
82
101
|
it("overwrites existing symlink or directory at target", () => {
|
|
83
|
-
const agents = [makeAgent()];
|
|
102
|
+
const agents = [makeAgent({ id: "cursor", localSkillsDir: ".cursor/skills" })];
|
|
84
103
|
// Pre-create a regular directory at the target
|
|
85
|
-
const existingDir = join(tempDir, ".
|
|
104
|
+
const existingDir = join(tempDir, ".cursor", "skills", "my-skill");
|
|
86
105
|
mkdirSync(existingDir, { recursive: true });
|
|
87
106
|
installSymlink("my-skill", "# Content", agents, {
|
|
88
107
|
global: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.test.js","sourceRoot":"","sources":["../../src/installer/canonical.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAM,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EACL,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,SAAS,SAAS,CAAC,YAAsC,EAAE;IACzD,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,WAAW,EAAE,aAAa;QAC1B,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,oBAAoB;QACrC,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,cAAc;QAC/B,aAAa,EAAE,WAAW;QAC1B,cAAc,EAAE;YACd,aAAa,EAAE,IAAI;YACnB,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAI;YACT,kBAAkB,EAAE,IAAI;SACzB;QACD,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"canonical.test.js","sourceRoot":"","sources":["../../src/installer/canonical.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export type { MarketplacePlugin, MarketplaceManifest } from "./marketplace.js";
|
|
2
|
-
export { getAvailablePlugins, getPluginSource, getPluginVersion, } from "./marketplace.js";
|
|
2
|
+
export { getAvailablePlugins, getPluginSource, getPluginVersion, getMarketplaceName, } from "./marketplace.js";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { getAvailablePlugins, getPluginSource, getPluginVersion, } from "./marketplace.js";
|
|
1
|
+
export { getAvailablePlugins, getPluginSource, getPluginVersion, getMarketplaceName, } from "./marketplace.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC"}
|
|
@@ -32,3 +32,11 @@ export declare function getPluginSource(name: string, content: string): string |
|
|
|
32
32
|
* @returns Version string or null if not found
|
|
33
33
|
*/
|
|
34
34
|
export declare function getPluginVersion(name: string, content: string): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* Get the marketplace name (top-level "name" field) from marketplace.json.
|
|
37
|
+
* Used as the marketplace identifier in `claude plugin install <plugin>@<marketplace>`.
|
|
38
|
+
*
|
|
39
|
+
* @param content - Raw JSON string from marketplace.json
|
|
40
|
+
* @returns Marketplace name (e.g. "specweave") or null
|
|
41
|
+
*/
|
|
42
|
+
export declare function getMarketplaceName(content: string): string | null;
|
|
@@ -48,4 +48,20 @@ export function getPluginVersion(name, content) {
|
|
|
48
48
|
const found = plugins.find((p) => p.name === name);
|
|
49
49
|
return found?.version ?? null;
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the marketplace name (top-level "name" field) from marketplace.json.
|
|
53
|
+
* Used as the marketplace identifier in `claude plugin install <plugin>@<marketplace>`.
|
|
54
|
+
*
|
|
55
|
+
* @param content - Raw JSON string from marketplace.json
|
|
56
|
+
* @returns Marketplace name (e.g. "specweave") or null
|
|
57
|
+
*/
|
|
58
|
+
export function getMarketplaceName(content) {
|
|
59
|
+
try {
|
|
60
|
+
const manifest = JSON.parse(content);
|
|
61
|
+
return manifest.name || null;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
51
67
|
//# sourceMappingURL=marketplace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/marketplace/marketplace.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAiB9E,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,OAAe;IAEf,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnD,OAAO,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,OAAe;IAEf,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnD,OAAO,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;AAChC,CAAC"}
|
|
1
|
+
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/marketplace/marketplace.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAiB9E,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC;QAChD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,OAAe;IAEf,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnD,OAAO,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,OAAe;IAEf,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnD,OAAO,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { describe, it, expect } from "vitest";
|
|
|
3
3
|
// Import module under test
|
|
4
4
|
// We import from the index barrel to test the public API
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
6
|
-
const { getAvailablePlugins, getPluginSource, getPluginVersion, } = await import("./index.js");
|
|
6
|
+
const { getAvailablePlugins, getPluginSource, getPluginVersion, getMarketplaceName, } = await import("./index.js");
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
// Helpers
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
@@ -99,5 +99,23 @@ describe("marketplace.json parser", () => {
|
|
|
99
99
|
expect(version).toBeNull();
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// getMarketplaceName
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
describe("getMarketplaceName", () => {
|
|
106
|
+
it("returns the top-level name from valid marketplace.json", () => {
|
|
107
|
+
const content = makeMarketplaceJson();
|
|
108
|
+
expect(getMarketplaceName(content)).toBe("specweave");
|
|
109
|
+
});
|
|
110
|
+
it("returns null for invalid JSON", () => {
|
|
111
|
+
expect(getMarketplaceName("not json")).toBeNull();
|
|
112
|
+
});
|
|
113
|
+
it("returns null when name field is missing", () => {
|
|
114
|
+
expect(getMarketplaceName('{"plugins": []}')).toBeNull();
|
|
115
|
+
});
|
|
116
|
+
it("returns null when name field is empty string", () => {
|
|
117
|
+
expect(getMarketplaceName('{"name": "", "plugins": []}')).toBeNull();
|
|
118
|
+
});
|
|
119
|
+
});
|
|
102
120
|
});
|
|
103
121
|
//# sourceMappingURL=marketplace.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"marketplace.test.js","sourceRoot":"","sources":["../../src/marketplace/marketplace.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,8EAA8E;AAC9E,2BAA2B;AAC3B,yDAAyD;AACzD,8EAA8E;AAC9E,MAAM,EACJ,mBAAmB,EACnB,eAAe,EACf,gBAAgB,
|
|
1
|
+
{"version":3,"file":"marketplace.test.js","sourceRoot":"","sources":["../../src/marketplace/marketplace.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if `claude` CLI binary is available in PATH.
|
|
3
|
+
*/
|
|
4
|
+
export declare function isClaudeCliAvailable(): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Register a local directory as a Claude Code plugin marketplace.
|
|
7
|
+
*
|
|
8
|
+
* @param marketplacePath - Absolute path to the repo root containing .claude-plugin/marketplace.json
|
|
9
|
+
* @returns true on success, false on failure
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerMarketplace(marketplacePath: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Install a plugin from a registered marketplace.
|
|
14
|
+
*
|
|
15
|
+
* @param pluginName - Plugin name (e.g. "sw-frontend")
|
|
16
|
+
* @param marketplaceName - Marketplace name from marketplace.json (e.g. "specweave")
|
|
17
|
+
* @returns true on success, false on failure
|
|
18
|
+
*/
|
|
19
|
+
export declare function installNativePlugin(pluginName: string, marketplaceName: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Uninstall a plugin from Claude Code's native system.
|
|
22
|
+
*/
|
|
23
|
+
export declare function uninstallNativePlugin(pluginName: string, marketplaceName: string): boolean;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Check if `claude` CLI binary is available in PATH.
|
|
4
|
+
*/
|
|
5
|
+
export function isClaudeCliAvailable() {
|
|
6
|
+
try {
|
|
7
|
+
execSync("claude --version", { stdio: "ignore", timeout: 5_000 });
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Register a local directory as a Claude Code plugin marketplace.
|
|
16
|
+
*
|
|
17
|
+
* @param marketplacePath - Absolute path to the repo root containing .claude-plugin/marketplace.json
|
|
18
|
+
* @returns true on success, false on failure
|
|
19
|
+
*/
|
|
20
|
+
export function registerMarketplace(marketplacePath) {
|
|
21
|
+
try {
|
|
22
|
+
execSync(`claude plugin marketplace add "${marketplacePath}"`, {
|
|
23
|
+
stdio: "ignore",
|
|
24
|
+
timeout: 15_000,
|
|
25
|
+
});
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Install a plugin from a registered marketplace.
|
|
34
|
+
*
|
|
35
|
+
* @param pluginName - Plugin name (e.g. "sw-frontend")
|
|
36
|
+
* @param marketplaceName - Marketplace name from marketplace.json (e.g. "specweave")
|
|
37
|
+
* @returns true on success, false on failure
|
|
38
|
+
*/
|
|
39
|
+
export function installNativePlugin(pluginName, marketplaceName) {
|
|
40
|
+
const pluginKey = `${pluginName}@${marketplaceName}`;
|
|
41
|
+
try {
|
|
42
|
+
execSync(`claude plugin install "${pluginKey}"`, {
|
|
43
|
+
stdio: "ignore",
|
|
44
|
+
timeout: 30_000,
|
|
45
|
+
});
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Uninstall a plugin from Claude Code's native system.
|
|
54
|
+
*/
|
|
55
|
+
export function uninstallNativePlugin(pluginName, marketplaceName) {
|
|
56
|
+
const pluginKey = `${pluginName}@${marketplaceName}`;
|
|
57
|
+
try {
|
|
58
|
+
execSync(`claude plugin uninstall "${pluginKey}"`, {
|
|
59
|
+
stdio: "ignore",
|
|
60
|
+
timeout: 10_000,
|
|
61
|
+
});
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=claude-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/utils/claude-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,eAAuB;IACzD,IAAI,CAAC;QACH,QAAQ,CAAC,kCAAkC,eAAe,GAAG,EAAE;YAC7D,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,eAAuB;IAC7E,MAAM,SAAS,GAAG,GAAG,UAAU,IAAI,eAAe,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,QAAQ,CAAC,0BAA0B,SAAS,GAAG,EAAE;YAC/C,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,eAAuB;IAC/E,MAAM,SAAS,GAAG,GAAG,UAAU,IAAI,eAAe,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,QAAQ,CAAC,4BAA4B,SAAS,GAAG,EAAE;YACjD,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
const mockExecSync = vi.fn();
|
|
3
|
+
vi.mock("node:child_process", () => ({
|
|
4
|
+
execSync: (...args) => mockExecSync(...args),
|
|
5
|
+
}));
|
|
6
|
+
const { isClaudeCliAvailable, registerMarketplace, installNativePlugin, uninstallNativePlugin, } = await import("./claude-cli.js");
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
vi.clearAllMocks();
|
|
9
|
+
});
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// isClaudeCliAvailable
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
describe("isClaudeCliAvailable", () => {
|
|
14
|
+
it("returns true when claude binary exists", () => {
|
|
15
|
+
mockExecSync.mockReturnValue(Buffer.from("1.0.0"));
|
|
16
|
+
expect(isClaudeCliAvailable()).toBe(true);
|
|
17
|
+
expect(mockExecSync).toHaveBeenCalledWith("claude --version", {
|
|
18
|
+
stdio: "ignore",
|
|
19
|
+
timeout: 5_000,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
it("returns false when claude binary is not found", () => {
|
|
23
|
+
mockExecSync.mockImplementation(() => {
|
|
24
|
+
throw new Error("not found");
|
|
25
|
+
});
|
|
26
|
+
expect(isClaudeCliAvailable()).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// registerMarketplace
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
describe("registerMarketplace", () => {
|
|
33
|
+
it("calls claude plugin marketplace add with correct path", () => {
|
|
34
|
+
mockExecSync.mockReturnValue(Buffer.from(""));
|
|
35
|
+
expect(registerMarketplace("/path/to/repo")).toBe(true);
|
|
36
|
+
expect(mockExecSync).toHaveBeenCalledWith('claude plugin marketplace add "/path/to/repo"', { stdio: "ignore", timeout: 15_000 });
|
|
37
|
+
});
|
|
38
|
+
it("returns false when command fails", () => {
|
|
39
|
+
mockExecSync.mockImplementation(() => {
|
|
40
|
+
throw new Error("failed");
|
|
41
|
+
});
|
|
42
|
+
expect(registerMarketplace("/path/to/repo")).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
it("quotes paths with spaces", () => {
|
|
45
|
+
mockExecSync.mockReturnValue(Buffer.from(""));
|
|
46
|
+
registerMarketplace("/path/with spaces/repo");
|
|
47
|
+
expect(mockExecSync).toHaveBeenCalledWith('claude plugin marketplace add "/path/with spaces/repo"', expect.any(Object));
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// installNativePlugin
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
describe("installNativePlugin", () => {
|
|
54
|
+
it("calls claude plugin install with plugin@marketplace format", () => {
|
|
55
|
+
mockExecSync.mockReturnValue(Buffer.from(""));
|
|
56
|
+
expect(installNativePlugin("sw-frontend", "specweave")).toBe(true);
|
|
57
|
+
expect(mockExecSync).toHaveBeenCalledWith('claude plugin install "sw-frontend@specweave"', { stdio: "ignore", timeout: 30_000 });
|
|
58
|
+
});
|
|
59
|
+
it("returns false when command fails", () => {
|
|
60
|
+
mockExecSync.mockImplementation(() => {
|
|
61
|
+
throw new Error("failed");
|
|
62
|
+
});
|
|
63
|
+
expect(installNativePlugin("sw-frontend", "specweave")).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// uninstallNativePlugin
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
describe("uninstallNativePlugin", () => {
|
|
70
|
+
it("calls claude plugin uninstall with plugin@marketplace format", () => {
|
|
71
|
+
mockExecSync.mockReturnValue(Buffer.from(""));
|
|
72
|
+
expect(uninstallNativePlugin("sw-frontend", "specweave")).toBe(true);
|
|
73
|
+
expect(mockExecSync).toHaveBeenCalledWith('claude plugin uninstall "sw-frontend@specweave"', { stdio: "ignore", timeout: 10_000 });
|
|
74
|
+
});
|
|
75
|
+
it("returns false when command fails", () => {
|
|
76
|
+
mockExecSync.mockImplementation(() => {
|
|
77
|
+
throw new Error("failed");
|
|
78
|
+
});
|
|
79
|
+
expect(uninstallNativePlugin("sw-frontend", "specweave")).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=claude-cli.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli.test.js","sourceRoot":"","sources":["../../src/utils/claude-cli.test.ts"],"names":[],"mappings":"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"}
|