@skillauditor/client 0.1.0 → 0.2.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/cli.d.ts ADDED
@@ -0,0 +1,9 @@
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
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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.0",
3
+ "version": "0.2.0",
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,11 @@
22
22
  },
23
23
  "main": "./dist/index.js",
24
24
  "types": "./dist/index.d.ts",
25
+ "bin": {
26
+ "skillauditor": "./dist/cli.js"
27
+ },
25
28
  "scripts": {
26
- "build": "tsc",
29
+ "build": "tsc && chmod +x dist/cli.js",
27
30
  "dev": "tsc --watch",
28
31
  "prepublishOnly": "npm run build"
29
32
  },