vskill 0.1.1 → 0.1.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.
Files changed (110) hide show
  1. package/dist/agents/agents-registry.d.ts +48 -37
  2. package/dist/agents/agents-registry.js +206 -261
  3. package/dist/agents/agents-registry.js.map +1 -1
  4. package/dist/agents/agents-registry.test.d.ts +1 -0
  5. package/dist/agents/agents-registry.test.js +203 -0
  6. package/dist/agents/agents-registry.test.js.map +1 -0
  7. package/dist/api/client.test.d.ts +1 -0
  8. package/dist/api/client.test.js +204 -0
  9. package/dist/api/client.test.js.map +1 -0
  10. package/dist/blocklist/blocklist.d.ts +23 -0
  11. package/dist/blocklist/blocklist.js +116 -0
  12. package/dist/blocklist/blocklist.js.map +1 -0
  13. package/dist/blocklist/blocklist.test.d.ts +1 -0
  14. package/dist/blocklist/blocklist.test.js +259 -0
  15. package/dist/blocklist/blocklist.test.js.map +1 -0
  16. package/dist/blocklist/types.d.ts +18 -0
  17. package/dist/blocklist/types.js +5 -0
  18. package/dist/blocklist/types.js.map +1 -0
  19. package/dist/commands/add.d.ts +2 -0
  20. package/dist/commands/add.js +221 -6
  21. package/dist/commands/add.js.map +1 -1
  22. package/dist/commands/add.test.d.ts +1 -0
  23. package/dist/commands/add.test.js +682 -0
  24. package/dist/commands/add.test.js.map +1 -0
  25. package/dist/commands/blocklist.d.ts +1 -0
  26. package/dist/commands/blocklist.js +87 -0
  27. package/dist/commands/blocklist.js.map +1 -0
  28. package/dist/commands/blocklist.test.d.ts +1 -0
  29. package/dist/commands/blocklist.test.js +158 -0
  30. package/dist/commands/blocklist.test.js.map +1 -0
  31. package/dist/commands/remove.d.ts +7 -0
  32. package/dist/commands/remove.js +91 -0
  33. package/dist/commands/remove.js.map +1 -0
  34. package/dist/commands/remove.test.d.ts +1 -0
  35. package/dist/commands/remove.test.js +164 -0
  36. package/dist/commands/remove.test.js.map +1 -0
  37. package/dist/commands/submit.d.ts +1 -1
  38. package/dist/commands/submit.js +26 -16
  39. package/dist/commands/submit.js.map +1 -1
  40. package/dist/commands/submit.test.d.ts +1 -0
  41. package/dist/commands/submit.test.js +74 -0
  42. package/dist/commands/submit.test.js.map +1 -0
  43. package/dist/index.js +21 -2
  44. package/dist/index.js.map +1 -1
  45. package/dist/lockfile/lockfile.test.d.ts +1 -0
  46. package/dist/lockfile/lockfile.test.js +196 -0
  47. package/dist/lockfile/lockfile.test.js.map +1 -0
  48. package/dist/lockfile/types.d.ts +8 -0
  49. package/dist/marketplace/index.d.ts +2 -0
  50. package/dist/marketplace/index.js +2 -0
  51. package/dist/marketplace/index.js.map +1 -0
  52. package/dist/marketplace/marketplace.d.ts +34 -0
  53. package/dist/marketplace/marketplace.js +51 -0
  54. package/dist/marketplace/marketplace.js.map +1 -0
  55. package/dist/marketplace/marketplace.test.d.ts +1 -0
  56. package/dist/marketplace/marketplace.test.js +103 -0
  57. package/dist/marketplace/marketplace.test.js.map +1 -0
  58. package/dist/scanner/index.d.ts +4 -0
  59. package/dist/scanner/index.js +4 -0
  60. package/dist/scanner/index.js.map +1 -1
  61. package/dist/scanner/patterns.test.d.ts +1 -0
  62. package/dist/scanner/patterns.test.js +353 -0
  63. package/dist/scanner/patterns.test.js.map +1 -0
  64. package/dist/scanner/repo-scanner.d.ts +30 -0
  65. package/dist/scanner/repo-scanner.js +190 -0
  66. package/dist/scanner/repo-scanner.js.map +1 -0
  67. package/dist/scanner/tier1.test.d.ts +1 -0
  68. package/dist/scanner/tier1.test.js +182 -0
  69. package/dist/scanner/tier1.test.js.map +1 -0
  70. package/dist/scanner/tier2-llm.d.ts +28 -0
  71. package/dist/scanner/tier2-llm.js +130 -0
  72. package/dist/scanner/tier2-llm.js.map +1 -0
  73. package/dist/scanner/types.d.ts +58 -0
  74. package/dist/scanner/types.js +5 -0
  75. package/dist/scanner/types.js.map +1 -0
  76. package/dist/security/index.d.ts +2 -0
  77. package/dist/security/index.js +2 -0
  78. package/dist/security/index.js.map +1 -0
  79. package/dist/security/platform-security.d.ts +17 -0
  80. package/dist/security/platform-security.js +34 -0
  81. package/dist/security/platform-security.js.map +1 -0
  82. package/dist/security/platform-security.test.d.ts +1 -0
  83. package/dist/security/platform-security.test.js +92 -0
  84. package/dist/security/platform-security.test.js.map +1 -0
  85. package/dist/settings/index.d.ts +2 -0
  86. package/dist/settings/index.js +2 -0
  87. package/dist/settings/index.js.map +1 -0
  88. package/dist/settings/settings.d.ts +16 -0
  89. package/dist/settings/settings.js +73 -0
  90. package/dist/settings/settings.js.map +1 -0
  91. package/dist/settings/settings.test.d.ts +1 -0
  92. package/dist/settings/settings.test.js +103 -0
  93. package/dist/settings/settings.test.js.map +1 -0
  94. package/dist/utils/__tests__/paths.test.d.ts +1 -0
  95. package/dist/utils/__tests__/paths.test.js +22 -0
  96. package/dist/utils/__tests__/paths.test.js.map +1 -0
  97. package/dist/utils/__tests__/validation.test.d.ts +1 -0
  98. package/dist/utils/__tests__/validation.test.js +49 -0
  99. package/dist/utils/__tests__/validation.test.js.map +1 -0
  100. package/dist/utils/browser.d.ts +6 -0
  101. package/dist/utils/browser.js +37 -0
  102. package/dist/utils/browser.js.map +1 -0
  103. package/dist/utils/paths.d.ts +5 -0
  104. package/dist/utils/paths.js +13 -0
  105. package/dist/utils/paths.js.map +1 -0
  106. package/dist/utils/validation.d.ts +14 -0
  107. package/dist/utils/validation.js +34 -0
  108. package/dist/utils/validation.js.map +1 -0
  109. package/package.json +5 -2
  110. package/scripts/preuninstall.cjs +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocklist.js","sourceRoot":"","sources":["../../src/blocklist/blocklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,259 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ // ---------------------------------------------------------------------------
3
+ // Mocks — vi.hoisted for ESM compatibility
4
+ // ---------------------------------------------------------------------------
5
+ const mocks = vi.hoisted(() => ({
6
+ readFileSync: vi.fn(),
7
+ writeFileSync: vi.fn(),
8
+ mkdirSync: vi.fn(),
9
+ existsSync: vi.fn(),
10
+ fetch: vi.fn(),
11
+ }));
12
+ vi.mock("node:fs", () => ({
13
+ readFileSync: mocks.readFileSync,
14
+ writeFileSync: mocks.writeFileSync,
15
+ mkdirSync: mocks.mkdirSync,
16
+ existsSync: mocks.existsSync,
17
+ }));
18
+ // Mock global fetch
19
+ const originalFetch = globalThis.fetch;
20
+ // ---------------------------------------------------------------------------
21
+ // Import module under test AFTER mocks
22
+ // ---------------------------------------------------------------------------
23
+ const { checkBlocklist, syncBlocklist, getCachedBlocklist, isBlocklistStale, } = await import("./blocklist.js");
24
+ // ---------------------------------------------------------------------------
25
+ // Helpers
26
+ // ---------------------------------------------------------------------------
27
+ function makeEntry(overrides = {}) {
28
+ return {
29
+ skillName: "evil-skill",
30
+ threatType: "credential-theft",
31
+ severity: "critical",
32
+ reason: "Steals AWS credentials",
33
+ evidenceUrls: ["https://example.com/report"],
34
+ discoveredAt: "2026-02-01T00:00:00Z",
35
+ ...overrides,
36
+ };
37
+ }
38
+ function makeCache(overrides = {}) {
39
+ return {
40
+ entries: [makeEntry()],
41
+ count: 1,
42
+ lastUpdated: "2026-02-01T00:00:00Z",
43
+ fetchedAt: new Date().toISOString(),
44
+ ...overrides,
45
+ };
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Tests
49
+ // ---------------------------------------------------------------------------
50
+ beforeEach(() => {
51
+ vi.clearAllMocks();
52
+ globalThis.fetch = mocks.fetch;
53
+ });
54
+ afterEach(() => {
55
+ globalThis.fetch = originalFetch;
56
+ delete process.env.VSKILL_API_URL;
57
+ });
58
+ describe("getCachedBlocklist", () => {
59
+ it("returns null when cache file does not exist", () => {
60
+ mocks.existsSync.mockReturnValue(false);
61
+ expect(getCachedBlocklist()).toBeNull();
62
+ });
63
+ it("returns parsed cache when file exists", () => {
64
+ const cache = makeCache();
65
+ mocks.existsSync.mockReturnValue(true);
66
+ mocks.readFileSync.mockReturnValue(JSON.stringify(cache));
67
+ const result = getCachedBlocklist();
68
+ expect(result).toEqual(cache);
69
+ });
70
+ it("returns null when cache file is corrupted", () => {
71
+ mocks.existsSync.mockReturnValue(true);
72
+ mocks.readFileSync.mockReturnValue("not json{{{");
73
+ expect(getCachedBlocklist()).toBeNull();
74
+ });
75
+ });
76
+ describe("isBlocklistStale", () => {
77
+ it("returns true when cache is older than 1 hour", () => {
78
+ const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString();
79
+ const cache = makeCache({ fetchedAt: twoHoursAgo });
80
+ expect(isBlocklistStale(cache)).toBe(true);
81
+ });
82
+ it("returns false when cache is less than 1 hour old", () => {
83
+ const tenMinutesAgo = new Date(Date.now() - 10 * 60 * 1000).toISOString();
84
+ const cache = makeCache({ fetchedAt: tenMinutesAgo });
85
+ expect(isBlocklistStale(cache)).toBe(false);
86
+ });
87
+ it("returns true when fetchedAt is invalid", () => {
88
+ const cache = makeCache({ fetchedAt: "invalid-date" });
89
+ expect(isBlocklistStale(cache)).toBe(true);
90
+ });
91
+ });
92
+ describe("syncBlocklist", () => {
93
+ it("fetches from API and writes cache file", async () => {
94
+ const apiResponse = {
95
+ entries: [makeEntry()],
96
+ count: 1,
97
+ lastUpdated: "2026-02-01T00:00:00Z",
98
+ };
99
+ mocks.fetch.mockResolvedValue({
100
+ ok: true,
101
+ headers: { get: () => null },
102
+ json: async () => apiResponse,
103
+ });
104
+ mocks.existsSync.mockReturnValue(true);
105
+ const result = await syncBlocklist();
106
+ expect(mocks.fetch).toHaveBeenCalledWith("https://verified-skill.com/api/v1/blocklist", expect.any(Object));
107
+ expect(mocks.writeFileSync).toHaveBeenCalled();
108
+ expect(result.entries).toEqual(apiResponse.entries);
109
+ expect(result.count).toBe(1);
110
+ expect(result.fetchedAt).toBeDefined();
111
+ });
112
+ it("uses VSKILL_API_URL environment variable when set", async () => {
113
+ process.env.VSKILL_API_URL = "https://custom-api.example.com";
114
+ const apiResponse = {
115
+ entries: [],
116
+ count: 0,
117
+ lastUpdated: "2026-02-01T00:00:00Z",
118
+ };
119
+ mocks.fetch.mockResolvedValue({
120
+ ok: true,
121
+ headers: { get: () => null },
122
+ json: async () => apiResponse,
123
+ });
124
+ mocks.existsSync.mockReturnValue(true);
125
+ await syncBlocklist();
126
+ expect(mocks.fetch).toHaveBeenCalledWith("https://custom-api.example.com/api/v1/blocklist", expect.any(Object));
127
+ });
128
+ it("creates ~/.vskill directory if it doesn't exist", async () => {
129
+ const apiResponse = {
130
+ entries: [],
131
+ count: 0,
132
+ lastUpdated: "2026-02-01T00:00:00Z",
133
+ };
134
+ mocks.fetch.mockResolvedValue({
135
+ ok: true,
136
+ headers: { get: () => null },
137
+ json: async () => apiResponse,
138
+ });
139
+ mocks.existsSync.mockReturnValue(false);
140
+ await syncBlocklist();
141
+ expect(mocks.mkdirSync).toHaveBeenCalledWith(expect.stringContaining(".vskill"), { recursive: true });
142
+ });
143
+ it("stores etag from response headers", async () => {
144
+ const apiResponse = {
145
+ entries: [],
146
+ count: 0,
147
+ lastUpdated: "2026-02-01T00:00:00Z",
148
+ };
149
+ mocks.fetch.mockResolvedValue({
150
+ ok: true,
151
+ headers: { get: (h) => (h === "etag" ? '"abc123"' : null) },
152
+ json: async () => apiResponse,
153
+ });
154
+ mocks.existsSync.mockReturnValue(true);
155
+ const result = await syncBlocklist();
156
+ expect(result.etag).toBe('"abc123"');
157
+ });
158
+ it("throws when API returns non-ok response", async () => {
159
+ mocks.fetch.mockResolvedValue({
160
+ ok: false,
161
+ status: 500,
162
+ statusText: "Internal Server Error",
163
+ });
164
+ await expect(syncBlocklist()).rejects.toThrow("Blocklist API error: 500");
165
+ });
166
+ });
167
+ describe("checkBlocklist", () => {
168
+ it("returns matching entry from fresh cache", async () => {
169
+ const entry = makeEntry({ skillName: "evil-skill" });
170
+ const cache = makeCache({
171
+ entries: [entry],
172
+ fetchedAt: new Date().toISOString(),
173
+ });
174
+ mocks.existsSync.mockReturnValue(true);
175
+ mocks.readFileSync.mockReturnValue(JSON.stringify(cache));
176
+ const result = await checkBlocklist("evil-skill");
177
+ expect(result).toEqual(entry);
178
+ });
179
+ it("returns null when skill is not in blocklist", async () => {
180
+ const cache = makeCache({
181
+ entries: [makeEntry({ skillName: "evil-skill" })],
182
+ fetchedAt: new Date().toISOString(),
183
+ });
184
+ mocks.existsSync.mockReturnValue(true);
185
+ mocks.readFileSync.mockReturnValue(JSON.stringify(cache));
186
+ const result = await checkBlocklist("safe-skill");
187
+ expect(result).toBeNull();
188
+ });
189
+ it("refreshes cache when stale and API is available", async () => {
190
+ const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString();
191
+ const staleCache = makeCache({
192
+ entries: [makeEntry({ skillName: "old-evil" })],
193
+ fetchedAt: twoHoursAgo,
194
+ });
195
+ const freshEntry = makeEntry({ skillName: "new-evil" });
196
+ mocks.existsSync.mockReturnValue(true);
197
+ mocks.readFileSync.mockReturnValue(JSON.stringify(staleCache));
198
+ mocks.fetch.mockResolvedValue({
199
+ ok: true,
200
+ headers: { get: () => null },
201
+ json: async () => ({
202
+ entries: [freshEntry],
203
+ count: 1,
204
+ lastUpdated: "2026-02-19T00:00:00Z",
205
+ }),
206
+ });
207
+ const result = await checkBlocklist("new-evil");
208
+ expect(result).toEqual(freshEntry);
209
+ expect(mocks.fetch).toHaveBeenCalled();
210
+ });
211
+ it("falls back to stale cache when API is unreachable", async () => {
212
+ const twoHoursAgo = new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString();
213
+ const entry = makeEntry({ skillName: "evil-skill" });
214
+ const staleCache = makeCache({
215
+ entries: [entry],
216
+ fetchedAt: twoHoursAgo,
217
+ });
218
+ mocks.existsSync.mockReturnValue(true);
219
+ mocks.readFileSync.mockReturnValue(JSON.stringify(staleCache));
220
+ mocks.fetch.mockRejectedValue(new Error("Network error"));
221
+ const result = await checkBlocklist("evil-skill");
222
+ expect(result).toEqual(entry);
223
+ });
224
+ it("returns null when no cache exists and API is unreachable", async () => {
225
+ mocks.existsSync.mockReturnValue(false);
226
+ mocks.fetch.mockRejectedValue(new Error("Network error"));
227
+ const result = await checkBlocklist("evil-skill");
228
+ expect(result).toBeNull();
229
+ });
230
+ it("matches by contentHash when provided", async () => {
231
+ const entry = makeEntry({
232
+ skillName: "evil-skill",
233
+ contentHash: "sha256:abc123",
234
+ });
235
+ const cache = makeCache({
236
+ entries: [entry],
237
+ fetchedAt: new Date().toISOString(),
238
+ });
239
+ mocks.existsSync.mockReturnValue(true);
240
+ mocks.readFileSync.mockReturnValue(JSON.stringify(cache));
241
+ const result = await checkBlocklist("different-name", "sha256:abc123");
242
+ expect(result).toEqual(entry);
243
+ });
244
+ it("matches by name even when contentHash doesn't match", async () => {
245
+ const entry = makeEntry({
246
+ skillName: "evil-skill",
247
+ contentHash: "sha256:different",
248
+ });
249
+ const cache = makeCache({
250
+ entries: [entry],
251
+ fetchedAt: new Date().toISOString(),
252
+ });
253
+ mocks.existsSync.mockReturnValue(true);
254
+ mocks.readFileSync.mockReturnValue(JSON.stringify(cache));
255
+ const result = await checkBlocklist("evil-skill", "sha256:nomatch");
256
+ expect(result).toEqual(entry);
257
+ });
258
+ });
259
+ //# sourceMappingURL=blocklist.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocklist.test.js","sourceRoot":"","sources":["../../src/blocklist/blocklist.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface BlocklistEntry {
2
+ skillName: string;
3
+ sourceUrl?: string;
4
+ sourceRegistry?: string;
5
+ contentHash?: string;
6
+ threatType: string;
7
+ severity: string;
8
+ reason: string;
9
+ evidenceUrls: string[];
10
+ discoveredAt: string;
11
+ }
12
+ export interface BlocklistCache {
13
+ entries: BlocklistEntry[];
14
+ count: number;
15
+ lastUpdated: string;
16
+ fetchedAt: string;
17
+ etag?: string;
18
+ }
@@ -0,0 +1,5 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Blocklist types — malicious skills registry
3
+ // ---------------------------------------------------------------------------
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/blocklist/types.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E"}
@@ -1,5 +1,7 @@
1
1
  interface AddOptions {
2
2
  skill?: string;
3
+ plugin?: string;
4
+ pluginDir?: string;
3
5
  global?: boolean;
4
6
  force?: boolean;
5
7
  }
@@ -1,12 +1,16 @@
1
1
  // ---------------------------------------------------------------------------
2
- // vskill add -- install a skill from GitHub with security scanning
2
+ // vskill add -- install a skill from GitHub or local plugin directory
3
3
  // ---------------------------------------------------------------------------
4
- import { mkdirSync, writeFileSync } from "node:fs";
5
- import { join } from "node:path";
4
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, cpSync, chmodSync, readdirSync, } from "node:fs";
5
+ import { join, resolve } from "node:path";
6
6
  import { createHash } from "node:crypto";
7
+ import { resolveTilde } from "../utils/paths.js";
7
8
  import { detectInstalledAgents } from "../agents/agents-registry.js";
8
9
  import { ensureLockfile, writeLockfile } from "../lockfile/index.js";
9
10
  import { runTier1Scan } from "../scanner/index.js";
11
+ import { getPluginSource, getPluginVersion } from "../marketplace/index.js";
12
+ import { checkBlocklist } from "../blocklist/blocklist.js";
13
+ import { checkPlatformSecurity } from "../security/index.js";
10
14
  import { bold, green, red, yellow, dim, cyan, spinner, } from "../utils/output.js";
11
15
  async function fetchSkillContent(url) {
12
16
  const spin = spinner("Fetching skill");
@@ -33,8 +37,187 @@ async function fetchSkillContent(url) {
33
37
  return process.exit(1);
34
38
  }
35
39
  }
40
+ // ---------------------------------------------------------------------------
41
+ // Blocklist enforcement
42
+ // ---------------------------------------------------------------------------
43
+ function printBlockedError(entry) {
44
+ console.error(red(bold("\n BLOCKED: Known-malicious skill")));
45
+ console.error(red(` Skill: "${entry.skillName}"`));
46
+ console.error(red(` Threat: ${entry.threatType} (${entry.severity})`));
47
+ console.error(red(` Reason: ${entry.reason}`));
48
+ console.error(dim("\n Use --force to override (NOT recommended)"));
49
+ }
50
+ function printBlockedWarning(entry) {
51
+ const line = (s) => console.error(red(s));
52
+ line("");
53
+ line(" +-------------------------------------------------+");
54
+ line(" | WARNING: Installing a known-malicious skill! |");
55
+ line(" | |");
56
+ line(` | Skill: "${entry.skillName}"`);
57
+ line(` | Threat: ${entry.threatType} (${entry.severity})`);
58
+ line(` | Reason: ${entry.reason}`);
59
+ line(" | |");
60
+ line(" | This skill is on the malicious skills blocklist. |");
61
+ line(" | Proceeding because --force was specified. |");
62
+ line(" +-------------------------------------------------+");
63
+ line("");
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Plugin directory installation (local path)
67
+ // ---------------------------------------------------------------------------
68
+ /**
69
+ * Resolve the plugin subdirectory from marketplace.json.
70
+ * Returns the absolute path to the plugin's source directory.
71
+ */
72
+ function resolvePluginDir(basePath, pluginName) {
73
+ const marketplacePath = join(basePath, ".claude-plugin", "marketplace.json");
74
+ if (!existsSync(marketplacePath))
75
+ return null;
76
+ const content = readFileSync(marketplacePath, "utf-8");
77
+ const source = getPluginSource(pluginName, content);
78
+ if (!source)
79
+ return null;
80
+ return resolve(basePath, source);
81
+ }
82
+ /**
83
+ * Collect all file contents from a plugin directory for security scanning.
84
+ * Concatenates content from all readable files.
85
+ */
86
+ function collectPluginContent(pluginDir) {
87
+ const files = readdirSync(pluginDir, { recursive: true });
88
+ const parts = [];
89
+ for (const file of files) {
90
+ const fullPath = join(pluginDir, file);
91
+ try {
92
+ const content = readFileSync(fullPath, "utf-8");
93
+ parts.push(`--- ${file} ---\n${content}`);
94
+ }
95
+ catch {
96
+ // Skip unreadable files (directories, binary, etc.)
97
+ }
98
+ }
99
+ return parts.join("\n");
100
+ }
101
+ /**
102
+ * Fix permissions on hook scripts (.sh files) in the installed directory.
103
+ */
104
+ function fixHookPermissions(targetDir) {
105
+ const files = readdirSync(targetDir, { recursive: true });
106
+ for (const file of files) {
107
+ if (file.endsWith(".sh")) {
108
+ chmodSync(join(targetDir, file), 0o755);
109
+ }
110
+ }
111
+ }
112
+ /**
113
+ * Install a plugin from a local directory.
114
+ */
115
+ async function installPluginDir(basePath, pluginName, opts) {
116
+ // Resolve the plugin subdirectory from marketplace.json
117
+ const pluginDir = resolvePluginDir(basePath, pluginName);
118
+ if (!pluginDir) {
119
+ console.error(red(`Plugin "${pluginName}" not found in marketplace.json\n`) +
120
+ dim(`Checked: ${join(basePath, ".claude-plugin", "marketplace.json")}`));
121
+ process.exit(1);
122
+ }
123
+ // Blocklist check (before scanning)
124
+ const blocked = await checkBlocklist(pluginName);
125
+ if (blocked && !opts.force) {
126
+ printBlockedError(blocked);
127
+ process.exit(1);
128
+ }
129
+ if (blocked && opts.force) {
130
+ printBlockedWarning(blocked);
131
+ }
132
+ // Collect all file content for scanning
133
+ console.log(dim("\nCollecting plugin files for security scan..."));
134
+ const content = collectPluginContent(pluginDir);
135
+ // Run tier1 scan on all plugin content
136
+ console.log(dim("Running security scan..."));
137
+ const scanResult = runTier1Scan(content);
138
+ const verdictColor = scanResult.verdict === "PASS"
139
+ ? green
140
+ : scanResult.verdict === "CONCERNS"
141
+ ? yellow
142
+ : red;
143
+ console.log(`${bold("Score:")} ${verdictColor(String(scanResult.score))}/100 ` +
144
+ `${bold("Verdict:")} ${verdictColor(scanResult.verdict)}\n`);
145
+ if (scanResult.findings.length > 0) {
146
+ console.log(dim(`Found ${scanResult.findings.length} issue${scanResult.findings.length === 1 ? "" : "s"}: ` +
147
+ `${scanResult.criticalCount} critical, ${scanResult.highCount} high, ${scanResult.mediumCount} medium`));
148
+ }
149
+ // Decision based on verdict
150
+ if (scanResult.verdict === "FAIL" && !opts.force) {
151
+ console.error(red("\nScan FAILED. Refusing to install.\n") +
152
+ dim("Use --force to install anyway (not recommended)."));
153
+ process.exit(1);
154
+ }
155
+ if (scanResult.verdict === "CONCERNS" && !opts.force) {
156
+ console.error(yellow("\nScan found CONCERNS. Refusing to install.\n") +
157
+ dim("Use --force to install anyway."));
158
+ process.exit(1);
159
+ }
160
+ if (scanResult.verdict === "FAIL" && opts.force) {
161
+ console.log(yellow("\n--force: installing despite FAIL verdict.\n"));
162
+ }
163
+ if (scanResult.verdict === "CONCERNS" && opts.force) {
164
+ console.log(yellow("\n--force: installing despite CONCERNS.\n"));
165
+ }
166
+ // Detect installed agents
167
+ const agents = await detectInstalledAgents();
168
+ if (agents.length === 0) {
169
+ console.error(red("No AI agents detected. Run ") +
170
+ cyan("vskill init") +
171
+ red(" first."));
172
+ process.exit(1);
173
+ }
174
+ // Read version from marketplace.json
175
+ const marketplacePath = join(basePath, ".claude-plugin", "marketplace.json");
176
+ const marketplaceContent = readFileSync(marketplacePath, "utf-8");
177
+ const version = getPluginVersion(pluginName, marketplaceContent) || "0.0.0";
178
+ // Install: recursively copy plugin directory to cache
179
+ const sha = createHash("sha256").update(content).digest("hex").slice(0, 12);
180
+ const locations = [];
181
+ for (const agent of agents) {
182
+ const cacheDir = join(opts.global ? resolveTilde(agent.globalSkillsDir) : join(process.cwd(), agent.localSkillsDir), pluginName);
183
+ try {
184
+ mkdirSync(cacheDir, { recursive: true });
185
+ cpSync(pluginDir, cacheDir, { recursive: true });
186
+ fixHookPermissions(cacheDir);
187
+ locations.push(`${agent.displayName}: ${cacheDir}`);
188
+ }
189
+ catch (err) {
190
+ console.error(yellow(`Failed to install to ${agent.displayName}: `) +
191
+ dim(err.message));
192
+ }
193
+ }
194
+ // Update lockfile
195
+ const lock = ensureLockfile();
196
+ lock.skills[pluginName] = {
197
+ version,
198
+ sha,
199
+ tier: "SCANNED",
200
+ installedAt: new Date().toISOString(),
201
+ source: `local:${basePath}`,
202
+ };
203
+ lock.agents = agents.map((a) => a.id);
204
+ writeLockfile(lock);
205
+ // Print summary
206
+ console.log(green(`\nInstalled ${bold(pluginName)} to ${locations.length} agent${locations.length === 1 ? "" : "s"}:\n`));
207
+ for (const loc of locations) {
208
+ console.log(` ${dim(">")} ${loc}`);
209
+ }
210
+ console.log(dim(`\nSHA: ${sha} | Version: ${version}`));
211
+ }
212
+ // ---------------------------------------------------------------------------
213
+ // Main entry point
214
+ // ---------------------------------------------------------------------------
36
215
  export async function addCommand(source, opts) {
37
- // Parse owner/repo
216
+ // Plugin directory mode: local path with --plugin
217
+ if (opts.pluginDir && opts.plugin) {
218
+ return installPluginDir(opts.pluginDir, opts.plugin, opts);
219
+ }
220
+ // GitHub mode: owner/repo
38
221
  const parts = source.split("/");
39
222
  if (parts.length !== 2) {
40
223
  console.error(red("Invalid source format. Use: ") + cyan("owner/repo"));
@@ -47,6 +230,39 @@ export async function addCommand(source, opts) {
47
230
  const url = `https://raw.githubusercontent.com/${owner}/${repo}/main/${skillSubpath}`;
48
231
  // Fetch SKILL.md
49
232
  const content = await fetchSkillContent(url);
233
+ // Blocklist check (before scanning)
234
+ const skillName = opts.skill || repo;
235
+ const blocked = await checkBlocklist(skillName, undefined);
236
+ if (blocked && !opts.force) {
237
+ printBlockedError(blocked);
238
+ process.exit(1);
239
+ }
240
+ if (blocked && opts.force) {
241
+ printBlockedWarning(blocked);
242
+ }
243
+ // Platform security check (best-effort, non-blocking on network error)
244
+ const platformSecurity = await checkPlatformSecurity(skillName);
245
+ if (platformSecurity && platformSecurity.hasCritical && !opts.force) {
246
+ const criticalProviders = platformSecurity.providers
247
+ .filter((p) => p.status === "FAIL" && p.criticalCount > 0)
248
+ .map((p) => p.provider);
249
+ console.error(red("\n BLOCKED: External security scan found CRITICAL findings"));
250
+ console.error(red(` Providers: ${criticalProviders.join(", ")}`));
251
+ console.error(red(` Report: https://verified-skill.com${platformSecurity.reportUrl}`));
252
+ console.error(dim("\n Use --force to override (NOT recommended)"));
253
+ return process.exit(1);
254
+ }
255
+ if (platformSecurity && platformSecurity.hasCritical && opts.force) {
256
+ console.error(yellow("\n WARNING: External scans found CRITICAL findings"));
257
+ const criticalProviders = platformSecurity.providers
258
+ .filter((p) => p.status === "FAIL" && p.criticalCount > 0)
259
+ .map((p) => p.provider);
260
+ console.error(yellow(` Providers: ${criticalProviders.join(", ")}`));
261
+ console.error(yellow(" --force: proceeding despite CRITICAL findings\n"));
262
+ }
263
+ if (platformSecurity && platformSecurity.overallVerdict === "PENDING") {
264
+ console.log(dim("\n External scans are pending. Proceeding with install.\n"));
265
+ }
50
266
  // Run tier1 scan
51
267
  console.log(dim("\nRunning security scan..."));
52
268
  const scanResult = runTier1Scan(content);
@@ -87,12 +303,11 @@ export async function addCommand(source, opts) {
87
303
  process.exit(1);
88
304
  }
89
305
  // Install to each agent
90
- const skillName = opts.skill || repo;
91
306
  const sha = createHash("sha256").update(content).digest("hex").slice(0, 12);
92
307
  const locations = [];
93
308
  for (const agent of agents) {
94
309
  const baseDir = opts.global
95
- ? agent.globalSkillsDir
310
+ ? resolveTilde(agent.globalSkillsDir)
96
311
  : join(process.cwd(), agent.localSkillsDir);
97
312
  const skillDir = join(baseDir, skillName);
98
313
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};