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/README.md +189 -0
- package/TODO.md +57 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +564 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
- package/src/index.ts +660 -0
- package/tsconfig.json +25 -0
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 = ``;
|
|
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
|
+
}
|