@skillauditor/client 0.1.0 → 0.2.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 +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +174 -0
- package/dist/cli.js.map +1 -0
- package/package.json +6 -2
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SkillAuditor CLI — verify AI skills before loading them into your agent.
|
|
4
|
+
*
|
|
5
|
+
* skillauditor verify ./SKILL.md
|
|
6
|
+
* skillauditor check ./SKILL.md
|
|
7
|
+
*/
|
|
8
|
+
import { readFileSync } from 'fs';
|
|
9
|
+
import { resolve } from 'path';
|
|
10
|
+
import { parseArgs } from 'util';
|
|
11
|
+
import { SkillAuditorClient } from './client.js';
|
|
12
|
+
import { SkillRejectedError, AuditTimeoutError, PaymentError } from './errors.js';
|
|
13
|
+
// ── Help text ────────────────────────────────────────────────────────────────
|
|
14
|
+
const HELP = `
|
|
15
|
+
\x1b[1mSkillAuditor CLI\x1b[0m — verify AI skills before loading them
|
|
16
|
+
|
|
17
|
+
\x1b[1mUSAGE\x1b[0m
|
|
18
|
+
skillauditor verify <file> [options] Audit a skill and wait for verdict
|
|
19
|
+
skillauditor check <file> [options] Check if already verified (no submission)
|
|
20
|
+
|
|
21
|
+
\x1b[1mOPTIONS\x1b[0m
|
|
22
|
+
--tier <free|pro> Audit tier (default: free)
|
|
23
|
+
free — LLM audit only, no onchain stamp
|
|
24
|
+
pro — full audit + onchain stamp + ENS subname
|
|
25
|
+
--key <0x...> EVM private key for World AgentKit signing
|
|
26
|
+
Omit to use dev bypass (local API only)
|
|
27
|
+
--api-url <url> SkillAuditor API base URL
|
|
28
|
+
(default: http://localhost:3001)
|
|
29
|
+
--verbose Show every sandbox tool call in output
|
|
30
|
+
--silent No output — use exit code only
|
|
31
|
+
--no-reject Exit 0 even if skill is unsafe
|
|
32
|
+
--timeout <ms> Abort after N ms (default: 300000)
|
|
33
|
+
--help Show this message
|
|
34
|
+
|
|
35
|
+
\x1b[1mEXIT CODES\x1b[0m
|
|
36
|
+
0 Safe (verdict = safe, score >= 70)
|
|
37
|
+
1 Unsafe (verdict = unsafe | review_required, or audit failed)
|
|
38
|
+
2 Usage error (bad args, file not found, API unreachable)
|
|
39
|
+
|
|
40
|
+
\x1b[1mEXAMPLES\x1b[0m
|
|
41
|
+
# Audit a skill — live pipeline logs streamed to terminal
|
|
42
|
+
skillauditor verify ./SKILL.md
|
|
43
|
+
|
|
44
|
+
# Check if already stamped onchain (fast, no new audit)
|
|
45
|
+
skillauditor check ./SKILL.md
|
|
46
|
+
|
|
47
|
+
# Verbose — see every sandbox tool call the auditor makes
|
|
48
|
+
skillauditor verify ./SKILL.md --verbose
|
|
49
|
+
|
|
50
|
+
# Pro tier — onchain stamp + ENS subname on completion
|
|
51
|
+
skillauditor verify ./SKILL.md --tier pro --key 0xYOUR_PRIVATE_KEY
|
|
52
|
+
|
|
53
|
+
# Silent gate — use in scripts / CI
|
|
54
|
+
skillauditor verify ./SKILL.md --silent && echo "safe to load"
|
|
55
|
+
|
|
56
|
+
# Point at a remote API
|
|
57
|
+
skillauditor verify ./SKILL.md --api-url https://api.skillauditor.xyz
|
|
58
|
+
`;
|
|
59
|
+
// ── Arg parsing ───────────────────────────────────────────────────────────────
|
|
60
|
+
function parseCliArgs(argv) {
|
|
61
|
+
return parseArgs({
|
|
62
|
+
args: argv,
|
|
63
|
+
options: {
|
|
64
|
+
tier: { type: 'string', default: 'free' },
|
|
65
|
+
key: { type: 'string', default: 'dev' },
|
|
66
|
+
'api-url': { type: 'string', default: 'http://localhost:3001' },
|
|
67
|
+
verbose: { type: 'boolean', default: false },
|
|
68
|
+
silent: { type: 'boolean', default: false },
|
|
69
|
+
'no-reject': { type: 'boolean', default: false },
|
|
70
|
+
timeout: { type: 'string', default: '300000' },
|
|
71
|
+
help: { type: 'boolean', default: false },
|
|
72
|
+
},
|
|
73
|
+
allowPositionals: true,
|
|
74
|
+
strict: false,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// ── Main ─────────────────────────────────────────────────────────────────────
|
|
78
|
+
async function main() {
|
|
79
|
+
const rawArgs = process.argv.slice(2);
|
|
80
|
+
if (rawArgs.length === 0 || rawArgs[0] === '--help' || rawArgs[0] === '-h') {
|
|
81
|
+
console.log(HELP);
|
|
82
|
+
process.exit(0);
|
|
83
|
+
}
|
|
84
|
+
const command = rawArgs[0];
|
|
85
|
+
if (command !== 'verify' && command !== 'check') {
|
|
86
|
+
console.error(`\x1b[31mUnknown command:\x1b[0m ${command}\nRun \x1b[1mskillauditor --help\x1b[0m for usage.`);
|
|
87
|
+
process.exit(2);
|
|
88
|
+
}
|
|
89
|
+
const { values, positionals } = parseCliArgs(rawArgs.slice(1));
|
|
90
|
+
if (values.help) {
|
|
91
|
+
console.log(HELP);
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
// ── Resolve file ────────────────────────────────────────────────────────────
|
|
95
|
+
const filePath = positionals[0];
|
|
96
|
+
if (!filePath) {
|
|
97
|
+
console.error('\x1b[31mError:\x1b[0m file path is required\n\n skillauditor verify <file>');
|
|
98
|
+
process.exit(2);
|
|
99
|
+
}
|
|
100
|
+
let skillContent;
|
|
101
|
+
try {
|
|
102
|
+
skillContent = readFileSync(resolve(process.cwd(), filePath), 'utf8');
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
console.error(`\x1b[31mError:\x1b[0m could not read file: ${filePath}`);
|
|
106
|
+
process.exit(2);
|
|
107
|
+
}
|
|
108
|
+
// ── Build client ────────────────────────────────────────────────────────────
|
|
109
|
+
const tier = values.tier === 'pro' ? 'pro' : 'free';
|
|
110
|
+
const silent = values.silent;
|
|
111
|
+
const verbose = values.verbose;
|
|
112
|
+
const logs = silent ? false : verbose ? 'verbose' : true;
|
|
113
|
+
const client = new SkillAuditorClient({
|
|
114
|
+
apiUrl: values['api-url'],
|
|
115
|
+
privateKey: values.key,
|
|
116
|
+
tier,
|
|
117
|
+
logs,
|
|
118
|
+
rejectOnUnsafe: !values['no-reject'],
|
|
119
|
+
timeoutMs: Number(values.timeout),
|
|
120
|
+
});
|
|
121
|
+
// ── check command ────────────────────────────────────────────────────────────
|
|
122
|
+
if (command === 'check') {
|
|
123
|
+
try {
|
|
124
|
+
const result = await client.checkVerified(skillContent);
|
|
125
|
+
if (!silent) {
|
|
126
|
+
if (result.verified) {
|
|
127
|
+
console.log(`\x1b[32m✔ Already verified\x1b[0m — ${result.verdict} score=${result.score}/100`);
|
|
128
|
+
if (result.ensSubname)
|
|
129
|
+
console.log(` ENS: \x1b[2m${result.ensSubname}\x1b[0m`);
|
|
130
|
+
if (result.auditId)
|
|
131
|
+
console.log(` Audit: \x1b[2m${result.auditId}\x1b[0m`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.log('\x1b[33m Not yet audited\x1b[0m — submit with: skillauditor verify <file>');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
process.exit(result.verified ? 0 : 1);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (!silent)
|
|
141
|
+
console.error(`\x1b[31mError:\x1b[0m ${err instanceof Error ? err.message : String(err)}`);
|
|
142
|
+
process.exit(2);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// ── verify command ───────────────────────────────────────────────────────────
|
|
146
|
+
try {
|
|
147
|
+
const result = await client.verifySkill(skillContent);
|
|
148
|
+
process.exit(result.verified ? 0 : 1);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
if (err instanceof SkillRejectedError) {
|
|
152
|
+
// printAuditRejected already called inside verifySkill — just exit
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
if (err instanceof AuditTimeoutError) {
|
|
156
|
+
if (!silent)
|
|
157
|
+
console.error(`\n\x1b[31mTimeout:\x1b[0m audit exceeded ${values.timeout}ms`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
if (err instanceof PaymentError) {
|
|
161
|
+
if (!silent)
|
|
162
|
+
console.error(`\n\x1b[31mPayment failed:\x1b[0m ${err.message}`);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
if (!silent)
|
|
166
|
+
console.error(`\n\x1b[31mError:\x1b[0m ${err instanceof Error ? err.message : String(err)}`);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
main().catch(err => {
|
|
171
|
+
console.error(err);
|
|
172
|
+
process.exit(1);
|
|
173
|
+
});
|
|
174
|
+
//# 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": "@skillauditor/client",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Agent SDK for SkillAuditor — submit, verify, and check skills onchain in one call",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,8 +22,12 @@
|
|
|
22
22
|
},
|
|
23
23
|
"main": "./dist/index.js",
|
|
24
24
|
"types": "./dist/index.d.ts",
|
|
25
|
+
"bin": {
|
|
26
|
+
"skillauditor": "./dist/cli.js",
|
|
27
|
+
"skillauditor-client": "./dist/cli.js"
|
|
28
|
+
},
|
|
25
29
|
"scripts": {
|
|
26
|
-
"build": "tsc",
|
|
30
|
+
"build": "tsc && chmod +x dist/cli.js",
|
|
27
31
|
"dev": "tsc --watch",
|
|
28
32
|
"prepublishOnly": "npm run build"
|
|
29
33
|
},
|