skill-security-scanner 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,564 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const js_yaml_1 = __importDefault(require("js-yaml"));
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const child_process_1 = require("child_process");
14
+ // ──────────────────────────────────────────────
15
+ // Risk Checks
16
+ // ──────────────────────────────────────────────
17
+ const DANGEROUS_BINS = ['curl', 'wget', 'nc', 'ncat', 'ssh', 'scp', 'rsync', 'python', 'python3', 'bash', 'sh'];
18
+ const SECRET_PATTERNS = [
19
+ /api[_-]?key\s*[:=]\s*["']?[A-Za-z0-9_\-]{16,}/i,
20
+ /secret\s*[:=]\s*["']?[A-Za-z0-9_\-]{16,}/i,
21
+ /token\s*[:=]\s*["']?[A-Za-z0-9_\-]{20,}/i,
22
+ /password\s*[:=]\s*["']?[A-Za-z0-9@#$!%^&*_\-]{8,}/i,
23
+ /sk-[A-Za-z0-9]{32,}/, // OpenAI key
24
+ /ghp_[A-Za-z0-9]{36}/, // GitHub PAT
25
+ /AKIA[0-9A-Z]{16}/, // AWS Access Key
26
+ ];
27
+ const EXEC_PATTERNS = /\b(eval|exec|execSync|spawn|spawnSync|child_process)\s*\(/g;
28
+ const NETWORK_PATTERNS = /\b(fetch|axios|http\.get|http\.request|https\.get|https\.request|got\(|request\()\s*\(/g;
29
+ function checkPermissions(fm) {
30
+ const findings = [];
31
+ const perms = fm.permissions ?? [];
32
+ if (perms.some(p => p.includes('file_system:*') || p === 'file_system:write')) {
33
+ findings.push({ level: 'med', message: 'Broad file_system write permission — verify scope is intentional' });
34
+ }
35
+ if (perms.some(p => p.includes('network:*') || p === 'network:outbound')) {
36
+ findings.push({ level: 'med', message: 'Outbound network permission detected — review data exfiltration risk' });
37
+ }
38
+ if (perms.some(p => p.includes('shell:execute') || p.includes('process:spawn'))) {
39
+ findings.push({ level: 'high', message: 'Shell/process execution permission — high privilege escalation risk' });
40
+ }
41
+ return findings;
42
+ }
43
+ function checkDangerousBins(fm) {
44
+ const bins = fm.requires?.bin ?? [];
45
+ return bins
46
+ .filter(b => DANGEROUS_BINS.includes(b.toLowerCase()))
47
+ .map(b => ({ level: 'high', message: `Requires dangerous binary: ${b} (network/exfil risk)` }));
48
+ }
49
+ function checkExposedEnv(fm) {
50
+ const envVars = fm.requires?.env ?? [];
51
+ const sensitivePatterns = /key|secret|token|password|credential|api/i;
52
+ return envVars
53
+ .filter(e => sensitivePatterns.test(e))
54
+ .map(e => ({ level: 'med', message: `Sensitive env var required: ${e}` }));
55
+ }
56
+ function collectSourceFiles(dir) {
57
+ const exts = ['.ts', '.js', '.py', '.sh', '.bash'];
58
+ const results = [];
59
+ function walk(current) {
60
+ for (const entry of fs_1.default.readdirSync(current, { withFileTypes: true })) {
61
+ const full = path_1.default.join(current, entry.name);
62
+ if (entry.isDirectory() && !['node_modules', '.git', 'dist'].includes(entry.name)) {
63
+ walk(full);
64
+ }
65
+ else if (entry.isFile() && exts.includes(path_1.default.extname(entry.name))) {
66
+ results.push(full);
67
+ }
68
+ }
69
+ }
70
+ walk(dir);
71
+ return results;
72
+ }
73
+ function checkCodeRisks(dir) {
74
+ const findings = [];
75
+ const files = collectSourceFiles(dir);
76
+ for (const file of files) {
77
+ const content = fs_1.default.readFileSync(file, 'utf8');
78
+ const rel = path_1.default.relative(dir, file);
79
+ if (EXEC_PATTERNS.test(content)) {
80
+ findings.push({ level: 'high', message: `eval/exec found in ${rel} — remote code execution risk` });
81
+ }
82
+ if (NETWORK_PATTERNS.test(content)) {
83
+ findings.push({ level: 'med', message: `Network call found in ${rel} — verify destination is safe` });
84
+ }
85
+ for (const pattern of SECRET_PATTERNS) {
86
+ if (pattern.test(content)) {
87
+ findings.push({ level: 'high', message: `Possible hardcoded secret in ${rel}` });
88
+ break;
89
+ }
90
+ }
91
+ // Reset stateful regexes
92
+ EXEC_PATTERNS.lastIndex = 0;
93
+ NETWORK_PATTERNS.lastIndex = 0;
94
+ }
95
+ return findings;
96
+ }
97
+ function checkDependencyVulns(dir, skipAudit = false) {
98
+ const findings = [];
99
+ const pkgPath = path_1.default.join(dir, 'package.json');
100
+ if (!fs_1.default.existsSync(pkgPath) || skipAudit)
101
+ return findings;
102
+ try {
103
+ const auditOutput = (0, child_process_1.execSync)('npm audit --json', { cwd: dir, timeout: 5_000, stdio: ['pipe', 'pipe', 'pipe'] }).toString();
104
+ const audit = JSON.parse(auditOutput);
105
+ const vulnCount = audit?.metadata?.vulnerabilities?.total ?? 0;
106
+ const high = (audit?.metadata?.vulnerabilities?.high ?? 0) + (audit?.metadata?.vulnerabilities?.critical ?? 0);
107
+ if (high > 0)
108
+ findings.push({ level: 'high', message: `${high} high/critical npm vulnerabilities found — run npm audit fix` });
109
+ else if (vulnCount > 0)
110
+ findings.push({ level: 'med', message: `${vulnCount} moderate npm vulnerabilities found` });
111
+ }
112
+ catch {
113
+ // npm not available, no lock file, or timed out — skip silently
114
+ }
115
+ return findings;
116
+ }
117
+ // ──────────────────────────────────────────────
118
+ // Score Calculation
119
+ // ──────────────────────────────────────────────
120
+ function calculateScore(findings) {
121
+ if (findings.some(f => f.level === 'high'))
122
+ return 'high';
123
+ if (findings.some(f => f.level === 'med'))
124
+ return 'med';
125
+ return 'low';
126
+ }
127
+ // ──────────────────────────────────────────────
128
+ // Path Resolution
129
+ // ──────────────────────────────────────────────
130
+ /** Walk up from `startDir` looking for a directory named `folderName`. */
131
+ function findAncestorDir(startDir, folderName) {
132
+ let current = startDir;
133
+ for (let i = 0; i < 8; i++) {
134
+ const candidate = path_1.default.join(current, folderName);
135
+ if (fs_1.default.existsSync(candidate) && fs_1.default.statSync(candidate).isDirectory())
136
+ return candidate;
137
+ const parent = path_1.default.dirname(current);
138
+ if (parent === current)
139
+ break;
140
+ current = parent;
141
+ }
142
+ return null;
143
+ }
144
+ /**
145
+ * Resolve the skill directory from user input.
146
+ * Priority:
147
+ * 1. Exact path (absolute or relative) → use as-is
148
+ * 2. Walk up looking for `.agent/skills/<input>` or `agent/skills/<input>`
149
+ * 3. Walk up looking for any `skills/<input>` folder
150
+ */
151
+ function resolveSkillDir(input) {
152
+ const exact = path_1.default.resolve(input);
153
+ if (fs_1.default.existsSync(exact))
154
+ return exact;
155
+ const name = path_1.default.basename(input); // support "frontend-design" or "skills/frontend-design"
156
+ const agentFolders = ['.agent', 'agent', '_agent', '_agents'];
157
+ for (const agentFolder of agentFolders) {
158
+ const agentDir = findAncestorDir(process.cwd(), agentFolder);
159
+ if (!agentDir)
160
+ continue;
161
+ const candidate = path_1.default.join(agentDir, 'skills', name);
162
+ if (fs_1.default.existsSync(candidate))
163
+ return candidate;
164
+ // also try the input as a sub-path inside agentDir
165
+ const subCandidate = path_1.default.join(agentDir, input);
166
+ if (fs_1.default.existsSync(subCandidate))
167
+ return subCandidate;
168
+ }
169
+ return null;
170
+ }
171
+ function scanSkill(skillDir, skipAudit = false) {
172
+ const skillPath = path_1.default.join(skillDir, 'SKILL.md');
173
+ const content = fs_1.default.existsSync(skillPath) ? fs_1.default.readFileSync(skillPath, 'utf8') : '';
174
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/m);
175
+ let frontmatter = {};
176
+ try {
177
+ frontmatter = (js_yaml_1.default.load(fmMatch?.[1] ?? '') ?? {});
178
+ }
179
+ catch {
180
+ // malformed YAML — treat as unparseable, flag it
181
+ }
182
+ const findings = [
183
+ ...checkPermissions(frontmatter),
184
+ ...checkDangerousBins(frontmatter),
185
+ ...checkExposedEnv(frontmatter),
186
+ ...checkCodeRisks(skillDir),
187
+ ...checkDependencyVulns(skillDir, skipAudit),
188
+ ];
189
+ if (!fmMatch) {
190
+ findings.push({ level: 'low', message: 'No YAML frontmatter found in SKILL.md' });
191
+ }
192
+ return {
193
+ name: frontmatter.name ?? path_1.default.basename(skillDir),
194
+ dir: skillDir,
195
+ score: calculateScore(findings),
196
+ findings,
197
+ };
198
+ }
199
+ /** Find all immediate subdirectories of `skillsDir` that contain a SKILL.md */
200
+ function discoverSkillDirs(skillsDir) {
201
+ if (!fs_1.default.existsSync(skillsDir))
202
+ return [];
203
+ return fs_1.default.readdirSync(skillsDir, { withFileTypes: true })
204
+ .filter(e => e.isDirectory())
205
+ .map(e => path_1.default.join(skillsDir, e.name))
206
+ .filter(d => fs_1.default.existsSync(path_1.default.join(d, 'SKILL.md')));
207
+ }
208
+ // ──────────────────────────────────────────────
209
+ // Lint
210
+ // ──────────────────────────────────────────────
211
+ const SEMVER_RE = /^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$/;
212
+ const PERMISSION_SCOPES = [
213
+ 'file_system:read', 'file_system:write', 'file_system:*',
214
+ 'network:inbound', 'network:outbound', 'network:*',
215
+ 'shell:execute', 'process:spawn', 'memory:read', 'memory:write',
216
+ ];
217
+ function lintSkill(skillDir) {
218
+ const skillPath = path_1.default.join(skillDir, 'SKILL.md');
219
+ const issues = [];
220
+ const skillName = path_1.default.basename(skillDir);
221
+ // ── File existence ──
222
+ if (!fs_1.default.existsSync(skillPath)) {
223
+ return { skill: skillName, passed: false, issues: [{ severity: 'error', field: 'SKILL.md', message: 'File not found' }] };
224
+ }
225
+ const content = fs_1.default.readFileSync(skillPath, 'utf8');
226
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/m);
227
+ if (!fmMatch) {
228
+ return { skill: skillName, passed: false, issues: [{ severity: 'error', field: 'frontmatter', message: 'No YAML frontmatter block found (expected --- ... ---)' }] };
229
+ }
230
+ let fm = {};
231
+ try {
232
+ fm = (js_yaml_1.default.load(fmMatch[1]) ?? {});
233
+ }
234
+ catch (e) {
235
+ const msg = e instanceof Error ? e.message : String(e);
236
+ return { skill: skillName, passed: false, issues: [{ severity: 'error', field: 'frontmatter', message: `YAML parse error: ${msg}` }] };
237
+ }
238
+ // ── Required fields ──
239
+ if (!fm.name) {
240
+ issues.push({ severity: 'error', field: 'name', message: 'Missing required field' });
241
+ }
242
+ else if (typeof fm.name !== 'string') {
243
+ issues.push({ severity: 'error', field: 'name', message: 'Must be a string' });
244
+ }
245
+ else if (fm.name.trim().length < 3) {
246
+ issues.push({ severity: 'error', field: 'name', message: 'Too short (min 3 chars)' });
247
+ }
248
+ if (!fm.description) {
249
+ issues.push({ severity: 'error', field: 'description', message: 'Missing required field' });
250
+ }
251
+ else if (typeof fm.description !== 'string') {
252
+ issues.push({ severity: 'error', field: 'description', message: 'Must be a string' });
253
+ }
254
+ else if (fm.description.trim().length < 10) {
255
+ issues.push({ severity: 'warn', field: 'description', message: 'Very short description (min 10 chars recommended)' });
256
+ }
257
+ if (!fm.version) {
258
+ issues.push({ severity: 'error', field: 'version', message: 'Missing required field' });
259
+ }
260
+ else if (!SEMVER_RE.test(String(fm.version))) {
261
+ issues.push({ severity: 'error', field: 'version', message: `"${fm.version}" is not valid semver (expected x.y.z)` });
262
+ }
263
+ // ── Optional field validation ──
264
+ if (fm.permissions !== undefined) {
265
+ if (!Array.isArray(fm.permissions)) {
266
+ issues.push({ severity: 'error', field: 'permissions', message: 'Must be an array of strings' });
267
+ }
268
+ else {
269
+ fm.permissions.forEach((p, i) => {
270
+ if (typeof p !== 'string') {
271
+ issues.push({ severity: 'error', field: `permissions[${i}]`, message: 'Each permission must be a string' });
272
+ }
273
+ else if (!PERMISSION_SCOPES.includes(p)) {
274
+ issues.push({ severity: 'warn', field: `permissions[${i}]`, message: `Unknown permission scope "${p}" — check OpenClaw docs` });
275
+ }
276
+ });
277
+ }
278
+ }
279
+ if (fm.requires !== undefined) {
280
+ if (typeof fm.requires !== 'object' || Array.isArray(fm.requires)) {
281
+ issues.push({ severity: 'error', field: 'requires', message: 'Must be an object with optional env/config/bin arrays' });
282
+ }
283
+ else {
284
+ for (const key of ['env', 'config', 'bin']) {
285
+ const val = fm.requires[key];
286
+ if (val !== undefined && !Array.isArray(val)) {
287
+ issues.push({ severity: 'error', field: `requires.${key}`, message: 'Must be an array of strings' });
288
+ }
289
+ }
290
+ }
291
+ }
292
+ // ── Description quality hints ──
293
+ const body = content.slice(content.indexOf('---', 3) + 3).trim();
294
+ if (body.length < 50) {
295
+ issues.push({ severity: 'warn', field: 'SKILL.md body', message: 'Skill body is very short — consider adding usage examples or detailed instructions' });
296
+ }
297
+ const errors = issues.filter(i => i.severity === 'error');
298
+ return { skill: fm.name ?? skillName, passed: errors.length === 0, issues };
299
+ }
300
+ // ──────────────────────────────────────────────
301
+ // CLI
302
+ // ──────────────────────────────────────────────
303
+ const program = new commander_1.Command();
304
+ program
305
+ .name('skill-security-scanner')
306
+ .description('Static security scanner for OpenClaw skill directories')
307
+ .version('0.1.0');
308
+ // ── Command: scan (single skill) ──────────────
309
+ program
310
+ .command('scan [dir]', { isDefault: true })
311
+ .description('Scan a single skill directory (default command)')
312
+ .option('--json', 'Output results as JSON (for CI pipelines)')
313
+ .option('--badge', 'Print Markdown badge to stdout')
314
+ .action(async (dir, opts) => {
315
+ if (!dir) {
316
+ console.error(chalk_1.default.red('❌ Missing skill name or path.'));
317
+ console.error(chalk_1.default.gray(' Usage: skill-security-scanner <name>'));
318
+ console.error(chalk_1.default.gray(' Example: skill-security-scanner frontend-design'));
319
+ console.error(chalk_1.default.gray(' Scan all: skill-security-scanner scan-all'));
320
+ process.exit(1);
321
+ }
322
+ const resolvedDir = resolveSkillDir(dir);
323
+ if (!resolvedDir) {
324
+ console.error(chalk_1.default.red(`❌ Skill not found: "${dir}"`));
325
+ console.error(chalk_1.default.gray(' Try: skill-security-scanner frontend-design'));
326
+ console.error(chalk_1.default.gray(' Or: skill-security-scanner .agent/skills/frontend-design'));
327
+ process.exit(1);
328
+ }
329
+ if (!fs_1.default.existsSync(path_1.default.join(resolvedDir, 'SKILL.md'))) {
330
+ console.error(chalk_1.default.red('❌ No SKILL.md found — is this an OpenClaw skill directory?'));
331
+ process.exit(1);
332
+ }
333
+ const spinner = (0, ora_1.default)('Scanning skill...').start();
334
+ const result = scanSkill(resolvedDir);
335
+ spinner.stop();
336
+ const BADGE_COLOR_MAP = { low: 'brightgreen', med: 'yellow', high: 'red' };
337
+ const badgeLabel = result.score.toUpperCase();
338
+ const badge = `![Skill Security: ${badgeLabel}](https://img.shields.io/badge/Skill%20Security-${badgeLabel}-${BADGE_COLOR_MAP[result.score]}?style=flat-square&logo=shield)`;
339
+ const upgrade = 'Full dynamic analysis, GitHub Action & CI dashboards → skill-security.com (7-day free trial)';
340
+ const report = {
341
+ skill: result.name, score: result.score, findings: result.findings, badge,
342
+ upgrade: ''
343
+ };
344
+ if (opts.json) {
345
+ console.log(JSON.stringify(report, null, 2));
346
+ return;
347
+ }
348
+ const scoreColor = { low: chalk_1.default.green, med: chalk_1.default.yellow, high: chalk_1.default.red }[result.score];
349
+ const icon = { low: '✅', med: '⚠️', high: '🚨' }[result.score];
350
+ const printGroup = (level, label, color) => {
351
+ const group = result.findings.filter(f => f.level === level);
352
+ if (!group.length)
353
+ return;
354
+ console.log(color.bold(`${label} (${group.length})`));
355
+ group.forEach(f => console.log(color(` • ${f.message}`)));
356
+ console.log('');
357
+ };
358
+ console.log('');
359
+ console.log(chalk_1.default.bold.white(`🔍 Skill Security Scanner — ${result.name}`));
360
+ console.log(chalk_1.default.gray('─'.repeat(50)));
361
+ console.log(`Risk Score: ${scoreColor(`${icon} ${result.score.toUpperCase()}`)}`);
362
+ console.log('');
363
+ if (!result.findings.length) {
364
+ console.log(chalk_1.default.green('✅ No issues found. Skill looks clean.'));
365
+ }
366
+ else {
367
+ printGroup('high', '🚨 HIGH RISK', chalk_1.default.red);
368
+ printGroup('med', '⚠️ MEDIUM RISK', chalk_1.default.yellow);
369
+ printGroup('low', '💡 LOW RISK', chalk_1.default.gray);
370
+ }
371
+ if (opts.badge) {
372
+ console.log(chalk_1.default.gray('Badge:\n'));
373
+ console.log(badge);
374
+ console.log('');
375
+ }
376
+ console.log(chalk_1.default.blueBright(`💡 ${upgrade}`));
377
+ console.log('');
378
+ if (result.score === 'high')
379
+ process.exit(1);
380
+ });
381
+ // ── Command: lint ────────────────────────────
382
+ program
383
+ .command('lint [dir]')
384
+ .description('Validate SKILL.md frontmatter against the OpenClaw schema')
385
+ .option('--json', 'Output results as JSON')
386
+ .option('--strict', 'Treat warnings as errors (exit 1)')
387
+ .option('--all', 'Lint every skill in the project')
388
+ .action((dir, opts) => {
389
+ // ── lint --all shortcut ──
390
+ if (opts.all || !dir) {
391
+ const agentFolders = ['.agent', 'agent', '_agent', '_agents'];
392
+ let skillsDir = null;
393
+ for (const folder of agentFolders) {
394
+ const agentDir = findAncestorDir(process.cwd(), folder);
395
+ if (agentDir) {
396
+ const c = path_1.default.join(agentDir, 'skills');
397
+ if (fs_1.default.existsSync(c)) {
398
+ skillsDir = c;
399
+ break;
400
+ }
401
+ }
402
+ }
403
+ if (!skillsDir) {
404
+ console.error(chalk_1.default.red('❌ No .agent/skills directory found.'));
405
+ process.exit(1);
406
+ }
407
+ const dirs = discoverSkillDirs(skillsDir);
408
+ const results = dirs.map(d => lintSkill(d));
409
+ if (opts.json) {
410
+ console.log(JSON.stringify(results, null, 2));
411
+ }
412
+ else {
413
+ const passed = results.filter(r => r.passed && !(opts.strict && r.issues.some(i => i.severity === 'warn')));
414
+ const failed = results.filter(r => !r.passed || (opts.strict && r.issues.some(i => i.severity === 'warn')));
415
+ console.log('');
416
+ console.log(chalk_1.default.bold.white(`🔎 Lint — ${results.length} skills`));
417
+ console.log(chalk_1.default.gray('─'.repeat(60)));
418
+ for (const r of [...failed, ...passed]) {
419
+ const ok = !failed.includes(r);
420
+ console.log(ok ? chalk_1.default.green(` ✅ ${r.skill}`) : chalk_1.default.red(` ❌ ${r.skill}`));
421
+ r.issues.forEach(issue => {
422
+ const c = issue.severity === 'error' ? chalk_1.default.red : chalk_1.default.yellow;
423
+ console.log(c(` [${issue.severity.toUpperCase()}] ${issue.field}: ${issue.message}`));
424
+ });
425
+ }
426
+ console.log(chalk_1.default.gray('─'.repeat(60)));
427
+ console.log(` ${chalk_1.default.green(`✅ ${passed.length} passed`)} ${chalk_1.default.red(`❌ ${failed.length} failed`)}`);
428
+ console.log('');
429
+ }
430
+ const anyFailed = results.some(r => !r.passed || (opts.strict && r.issues.some(i => i.severity === 'warn')));
431
+ if (anyFailed)
432
+ process.exit(1);
433
+ return;
434
+ }
435
+ // ── single skill ──
436
+ const resolvedDir = resolveSkillDir(dir);
437
+ if (!resolvedDir) {
438
+ console.error(chalk_1.default.red(`❌ Skill not found: "${dir}"`));
439
+ process.exit(1);
440
+ }
441
+ const result = lintSkill(resolvedDir);
442
+ const hasFail = !result.passed || (opts.strict && result.issues.some(i => i.severity === 'warn'));
443
+ if (opts.json) {
444
+ console.log(JSON.stringify(result, null, 2));
445
+ }
446
+ else {
447
+ const errors = result.issues.filter(i => i.severity === 'error');
448
+ const warns = result.issues.filter(i => i.severity === 'warn');
449
+ const statusIcon = hasFail ? '❌' : '✅';
450
+ const statusText = hasFail ? chalk_1.default.red('FAIL') : chalk_1.default.green('PASS');
451
+ console.log('');
452
+ console.log(chalk_1.default.bold.white(`🔎 Lint — ${result.skill}`));
453
+ console.log(chalk_1.default.gray('─'.repeat(50)));
454
+ console.log(`Status: ${statusIcon} ${statusText}`);
455
+ console.log('');
456
+ if (!result.issues.length) {
457
+ console.log(chalk_1.default.green('✅ All fields valid. Skill looks well-formed.'));
458
+ }
459
+ else {
460
+ if (errors.length) {
461
+ console.log(chalk_1.default.red.bold(`Errors (${errors.length})`));
462
+ errors.forEach(i => console.log(chalk_1.default.red(` • [${i.field}] ${i.message}`)));
463
+ console.log('');
464
+ }
465
+ if (warns.length) {
466
+ console.log(chalk_1.default.yellow.bold(`Warnings (${warns.length})`));
467
+ warns.forEach(i => console.log(chalk_1.default.yellow(` • [${i.field}] ${i.message}`)));
468
+ console.log('');
469
+ }
470
+ }
471
+ }
472
+ if (hasFail)
473
+ process.exit(1);
474
+ });
475
+ // ── Command: scan-all ─────────────────────────
476
+ program
477
+ .command('scan-all')
478
+ .description('Scan every skill in the project and show a summary table')
479
+ .option('--json', 'Output results as JSON array')
480
+ .option('--fail-on <level>', 'Exit code 1 if any skill reaches this level (low|med|high)', 'high')
481
+ .option('--skip-audit', 'Skip npm audit (much faster for large projects)')
482
+ .action(async (opts) => {
483
+ const agentFolders = ['.agent', 'agent', '_agent', '_agents'];
484
+ let skillsDir = null;
485
+ for (const folder of agentFolders) {
486
+ const agentDir = findAncestorDir(process.cwd(), folder);
487
+ if (agentDir) {
488
+ const candidate = path_1.default.join(agentDir, 'skills');
489
+ if (fs_1.default.existsSync(candidate)) {
490
+ skillsDir = candidate;
491
+ break;
492
+ }
493
+ }
494
+ }
495
+ if (!skillsDir) {
496
+ console.error(chalk_1.default.red('❌ No .agent/skills directory found from the current location.'));
497
+ process.exit(1);
498
+ }
499
+ const skillDirs = discoverSkillDirs(skillsDir);
500
+ if (!skillDirs.length) {
501
+ console.error(chalk_1.default.yellow('⚠️ No skill directories with SKILL.md found.'));
502
+ process.exit(0);
503
+ }
504
+ // Auto-skip audit for large projects unless explicitly requested
505
+ const skipAudit = opts.skipAudit ?? skillDirs.length > 5;
506
+ const spinner = (0, ora_1.default)(`Scanning ${skillDirs.length} skills${skipAudit ? ' (audit skipped)' : ''}...`).start();
507
+ const results = skillDirs.map(d => scanSkill(d, skipAudit));
508
+ spinner.stop();
509
+ if (opts.json) {
510
+ console.log(JSON.stringify(results.map(r => ({
511
+ skill: r.name, score: r.score, findingCount: r.findings.length, findings: r.findings,
512
+ })), null, 2));
513
+ const hasFailure = results.some(r => r.score === opts.failOn || (opts.failOn === 'low' && true) || (opts.failOn === 'med' && r.score !== 'low'));
514
+ if (hasFailure)
515
+ process.exit(1);
516
+ return;
517
+ }
518
+ // ── Summary table ──
519
+ const counts = { high: 0, med: 0, low: 0 };
520
+ results.forEach(r => counts[r.score]++);
521
+ const SCORE_COLOR = { low: chalk_1.default.green, med: chalk_1.default.yellow, high: chalk_1.default.red };
522
+ const SCORE_ICON = { low: '✅', med: '⚠️ ', high: '🚨' };
523
+ const FIND_COLOR = { low: chalk_1.default.gray, med: chalk_1.default.yellow, high: chalk_1.default.red };
524
+ // Sort: high first, then med, then low
525
+ const sorted = [...results].sort((a, b) => {
526
+ const order = { high: 0, med: 1, low: 2 };
527
+ return order[a.score] - order[b.score];
528
+ });
529
+ console.log('');
530
+ console.log(chalk_1.default.bold.white(`🔍 Skill Security Scanner — Project Scan (${results.length} skills)`));
531
+ console.log(chalk_1.default.gray('─'.repeat(60)));
532
+ for (const r of sorted) {
533
+ const color = SCORE_COLOR[r.score];
534
+ const icon = SCORE_ICON[r.score];
535
+ if (!r.findings.length) {
536
+ console.log(` ${icon} ${color(r.score.toUpperCase().padEnd(5))} ${r.name}`);
537
+ }
538
+ else {
539
+ // Header row for this skill
540
+ console.log(` ${icon} ${color(r.score.toUpperCase().padEnd(5))} ${chalk_1.default.bold(r.name)}`);
541
+ // Print findings grouped by severity
542
+ for (const level of ['high', 'med', 'low']) {
543
+ const group = r.findings.filter(f => f.level === level);
544
+ group.forEach(f => {
545
+ console.log(` ${FIND_COLOR[level](`→ [${f.level.toUpperCase()}] ${f.message}`)}`);
546
+ });
547
+ }
548
+ console.log('');
549
+ }
550
+ }
551
+ console.log(chalk_1.default.gray('─'.repeat(60)));
552
+ console.log(` ${chalk_1.default.red(`🚨 ${counts.high} HIGH`)} ` +
553
+ `${chalk_1.default.yellow(`⚠️ ${counts.med} MED`)} ` +
554
+ `${chalk_1.default.green(`✅ ${counts.low} LOW`)}`);
555
+ console.log('');
556
+ // console.log(chalk.blueBright('Full dynamic analysis, GitHub Action & CI dashboards → skill-security.com (7-day free trial)'));
557
+ console.log('');
558
+ const LEVEL_ORDER = { low: 0, med: 1, high: 2 };
559
+ const shouldFail = results.some(r => LEVEL_ORDER[r.score] >= LEVEL_ORDER[opts.failOn]);
560
+ if (shouldFail)
561
+ process.exit(1);
562
+ });
563
+ program.parse();
564
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "skill-security-scanner",
3
+ "version": "0.1.0",
4
+ "description": "Static security scanner for OpenClaw skill directories",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "skill-security-scanner": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "ts-node src/index.ts",
12
+ "start": "node dist/index.js",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": [
16
+ "openclaw",
17
+ "security",
18
+ "skill",
19
+ "scanner",
20
+ "ai-agent",
21
+ "cli"
22
+ ],
23
+ "license": "MIT",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "https://github.com/yourorg/skill-security-scanner"
27
+ },
28
+ "dependencies": {
29
+ "chalk": "^5.3.0",
30
+ "commander": "^12.1.0",
31
+ "js-yaml": "^4.1.0",
32
+ "ora": "^8.1.1",
33
+ "semver": "^7.6.2"
34
+ },
35
+ "devDependencies": {
36
+ "@types/js-yaml": "^4.0.9",
37
+ "@types/node": "^20.14.0",
38
+ "@types/semver": "^7.5.8",
39
+ "ts-node": "^10.9.2",
40
+ "typescript": "^5.4.5"
41
+ }
42
+ }