@panguard-ai/panguard-skill-auditor 1.5.6 → 1.6.1
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/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +173 -0
- package/dist/cli.js.map +1 -0
- package/package.json +9 -6
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* panguard-skill-audit CLI
|
|
4
|
+
*
|
|
5
|
+
* Bug 4 fix (2026-05-19): package previously shipped library only, no
|
|
6
|
+
* `bin` entry. SKU A delivery couldn't demonstrate skill-audit step
|
|
7
|
+
* without a wrapper script. This adds a thin CLI: audit a single skill
|
|
8
|
+
* directory or scan a fleet of skill dirs and emit JSON / text / non-zero
|
|
9
|
+
* exit on findings.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* panguard-skill-audit CLI
|
|
4
|
+
*
|
|
5
|
+
* Bug 4 fix (2026-05-19): package previously shipped library only, no
|
|
6
|
+
* `bin` entry. SKU A delivery couldn't demonstrate skill-audit step
|
|
7
|
+
* without a wrapper script. This adds a thin CLI: audit a single skill
|
|
8
|
+
* directory or scan a fleet of skill dirs and emit JSON / text / non-zero
|
|
9
|
+
* exit on findings.
|
|
10
|
+
*/
|
|
11
|
+
import { auditSkill } from './index.js';
|
|
12
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
13
|
+
import { join, resolve } from 'node:path';
|
|
14
|
+
import { existsSync } from 'node:fs';
|
|
15
|
+
function parseArgs(argv) {
|
|
16
|
+
const opts = {
|
|
17
|
+
dir: '.',
|
|
18
|
+
json: false,
|
|
19
|
+
failOn: null,
|
|
20
|
+
fleet: false,
|
|
21
|
+
};
|
|
22
|
+
for (let i = 0; i < argv.length; i++) {
|
|
23
|
+
const a = argv[i];
|
|
24
|
+
if (a === '--dir' && argv[i + 1]) {
|
|
25
|
+
opts.dir = argv[++i];
|
|
26
|
+
}
|
|
27
|
+
else if (a === '--json') {
|
|
28
|
+
opts.json = true;
|
|
29
|
+
}
|
|
30
|
+
else if (a === '--fail-on' && argv[i + 1]) {
|
|
31
|
+
const v = argv[++i];
|
|
32
|
+
if (v === 'critical' || v === 'high' || v === 'medium' || v === 'low') {
|
|
33
|
+
opts.failOn = v;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else if (a === '--fleet') {
|
|
37
|
+
opts.fleet = true;
|
|
38
|
+
}
|
|
39
|
+
else if (a === '-h' || a === '--help') {
|
|
40
|
+
printHelp();
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
else if (a === '--version' || a === '-v') {
|
|
44
|
+
console.log('panguard-skill-audit (workspace)');
|
|
45
|
+
process.exit(0);
|
|
46
|
+
}
|
|
47
|
+
else if (a && a.startsWith('--')) {
|
|
48
|
+
console.error(`Unknown option: ${a}`);
|
|
49
|
+
process.exit(2);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return opts;
|
|
53
|
+
}
|
|
54
|
+
function printHelp() {
|
|
55
|
+
console.log(`panguard-skill-audit — Static security audit for AI agent skill bundles
|
|
56
|
+
|
|
57
|
+
Usage:
|
|
58
|
+
panguard-skill-audit --dir <skill-dir> [--json] [--fail-on critical|high|medium|low]
|
|
59
|
+
panguard-skill-audit --dir <parent-dir> --fleet [--json]
|
|
60
|
+
|
|
61
|
+
Options:
|
|
62
|
+
--dir <path> Single skill directory, or parent directory with --fleet
|
|
63
|
+
--fleet Treat --dir as parent; audit every subdirectory containing SKILL.md
|
|
64
|
+
--json Emit machine-readable JSON to stdout (no human text)
|
|
65
|
+
--fail-on <severity> Exit 1 if any finding at or above this severity exists
|
|
66
|
+
-h, --help Show this help
|
|
67
|
+
-v, --version Show version
|
|
68
|
+
|
|
69
|
+
Exit codes:
|
|
70
|
+
0 — audit completed; no failing findings (or no --fail-on)
|
|
71
|
+
1 — at least one finding at or above --fail-on threshold
|
|
72
|
+
2 — invalid args / no skill directory found
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
const SEVERITY_ORDER = ['critical', 'high', 'medium', 'low', 'info'];
|
|
76
|
+
function severityBelowThreshold(found, threshold) {
|
|
77
|
+
if (!threshold)
|
|
78
|
+
return true;
|
|
79
|
+
const f = SEVERITY_ORDER.indexOf(found);
|
|
80
|
+
const t = SEVERITY_ORDER.indexOf(threshold);
|
|
81
|
+
if (f === -1 || t === -1)
|
|
82
|
+
return true;
|
|
83
|
+
return f > t;
|
|
84
|
+
}
|
|
85
|
+
async function findSkillDirs(parent) {
|
|
86
|
+
const entries = await readdir(parent);
|
|
87
|
+
const result = [];
|
|
88
|
+
for (const e of entries) {
|
|
89
|
+
const full = join(parent, e);
|
|
90
|
+
try {
|
|
91
|
+
const s = await stat(full);
|
|
92
|
+
if (s.isDirectory() && existsSync(join(full, 'SKILL.md'))) {
|
|
93
|
+
result.push(full);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Skip unreadable entries.
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
async function main() {
|
|
103
|
+
const opts = parseArgs(process.argv.slice(2));
|
|
104
|
+
const dir = resolve(opts.dir);
|
|
105
|
+
if (!existsSync(dir)) {
|
|
106
|
+
console.error(`Directory not found: ${dir}`);
|
|
107
|
+
process.exit(2);
|
|
108
|
+
}
|
|
109
|
+
const targets = opts.fleet ? await findSkillDirs(dir) : [dir];
|
|
110
|
+
if (targets.length === 0) {
|
|
111
|
+
console.error(opts.fleet
|
|
112
|
+
? `No skill directories (containing SKILL.md) found under ${dir}`
|
|
113
|
+
: `Directory has no SKILL.md: ${dir}`);
|
|
114
|
+
process.exit(2);
|
|
115
|
+
}
|
|
116
|
+
const reports = [];
|
|
117
|
+
for (const t of targets) {
|
|
118
|
+
try {
|
|
119
|
+
const report = await auditSkill(t);
|
|
120
|
+
reports.push(report);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
124
|
+
reports.push({
|
|
125
|
+
skillPath: t,
|
|
126
|
+
manifest: null,
|
|
127
|
+
riskScore: 0,
|
|
128
|
+
riskLevel: 'unknown',
|
|
129
|
+
checks: [],
|
|
130
|
+
findings: [
|
|
131
|
+
{
|
|
132
|
+
checkId: 'audit-error',
|
|
133
|
+
severity: 'high',
|
|
134
|
+
title: 'Audit failed',
|
|
135
|
+
description: msg,
|
|
136
|
+
evidence: '',
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
auditedAt: new Date().toISOString(),
|
|
140
|
+
durationMs: 0,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (opts.json) {
|
|
145
|
+
process.stdout.write(JSON.stringify({ reports }, null, 2));
|
|
146
|
+
process.stdout.write('\n');
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
for (const r of reports) {
|
|
150
|
+
console.log(`\n=== ${r.skillPath} ===`);
|
|
151
|
+
console.log(`Risk: ${r.riskLevel} (score: ${r.riskScore})`);
|
|
152
|
+
console.log(`Checks: ${r.checks.length} Findings: ${r.findings.length}`);
|
|
153
|
+
for (const f of r.findings.slice(0, 10)) {
|
|
154
|
+
console.log(` [${f.severity.toUpperCase()}] ${f.title}`);
|
|
155
|
+
if (f.description)
|
|
156
|
+
console.log(` ${f.description}`);
|
|
157
|
+
}
|
|
158
|
+
if (r.findings.length > 10) {
|
|
159
|
+
console.log(` ... and ${r.findings.length - 10} more`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (opts.failOn) {
|
|
164
|
+
const hasFailing = reports.some((r) => r.findings.some((f) => !severityBelowThreshold(f.severity, opts.failOn)));
|
|
165
|
+
if (hasFailing)
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
main().catch((err) => {
|
|
170
|
+
console.error('Fatal error:', err instanceof Error ? err.message : err);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@panguard-ai/panguard-skill-auditor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,12 +29,12 @@
|
|
|
29
29
|
"README.md"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"agent-threat-rules": "^
|
|
32
|
+
"agent-threat-rules": "^3.4.0",
|
|
33
33
|
"js-yaml": "^4.1.0",
|
|
34
|
-
"@panguard-ai/atr": "1.
|
|
35
|
-
"@panguard-ai/
|
|
36
|
-
"@panguard-ai/core": "1.
|
|
37
|
-
"@panguard-ai/scan
|
|
34
|
+
"@panguard-ai/atr": "1.6.1",
|
|
35
|
+
"@panguard-ai/core": "1.6.1",
|
|
36
|
+
"@panguard-ai/scan-core": "1.6.1",
|
|
37
|
+
"@panguard-ai/panguard-scan": "1.6.1"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/js-yaml": "^4.0.9",
|
|
@@ -42,6 +42,9 @@
|
|
|
42
42
|
"typescript": "~5.7.3",
|
|
43
43
|
"vitest": "^3.0.0"
|
|
44
44
|
},
|
|
45
|
+
"bin": {
|
|
46
|
+
"panguard-skill-audit": "./dist/cli.js"
|
|
47
|
+
},
|
|
45
48
|
"scripts": {
|
|
46
49
|
"build": "tsc --build",
|
|
47
50
|
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|