ai-trust 0.1.2 → 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/README.md +25 -2
- package/dist/api/client.d.ts +30 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +20 -0
- package/dist/api/client.js.map +1 -1
- package/dist/commands/audit.d.ts +2 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +101 -4
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/batch.d.ts.map +1 -1
- package/dist/commands/batch.js +17 -2
- package/dist/commands/batch.js.map +1 -1
- package/dist/commands/check.d.ts +4 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +154 -10
- package/dist/commands/check.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/output/formatter.d.ts +2 -0
- package/dist/output/formatter.d.ts.map +1 -1
- package/dist/output/formatter.js +41 -3
- package/dist/output/formatter.js.map +1 -1
- package/dist/scanner/downloader.d.ts +15 -0
- package/dist/scanner/downloader.d.ts.map +1 -0
- package/dist/scanner/downloader.js +63 -0
- package/dist/scanner/downloader.js.map +1 -0
- package/dist/scanner/hma.d.ts +37 -0
- package/dist/scanner/hma.d.ts.map +1 -0
- package/dist/scanner/hma.js +90 -0
- package/dist/scanner/hma.js.map +1 -0
- package/dist/scanner/index.d.ts +24 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +55 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/utils/parser.d.ts.map +1 -1
- package/dist/utils/parser.js +11 -3
- package/dist/utils/parser.js.map +1 -1
- package/dist/utils/prompt.d.ts +9 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +31 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/resolve.d.ts +22 -0
- package/dist/utils/resolve.d.ts.map +1 -0
- package/dist/utils/resolve.js +50 -0
- package/dist/utils/resolve.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -41,13 +41,29 @@ Specify the package type explicitly:
|
|
|
41
41
|
ai-trust check my-agent --type a2a_agent
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
#### Scan on demand
|
|
45
|
+
|
|
46
|
+
When a package isn't in the registry, ai-trust can download and scan it locally using [HackMyAgent](https://github.com/opena2a-org/hackmyagent). In interactive mode, you'll be prompted. In CI, use flags:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Auto-scan unknown packages, contribute results to the community registry
|
|
50
|
+
ai-trust check mcp-server-xyz --scan-if-missing --contribute
|
|
51
|
+
|
|
52
|
+
# Force re-scan even if registry data exists
|
|
53
|
+
ai-trust check server-filesystem --rescan
|
|
54
|
+
|
|
55
|
+
# Disable scanning entirely (registry lookup only)
|
|
56
|
+
ai-trust check server-filesystem --no-scan
|
|
57
|
+
```
|
|
58
|
+
|
|
44
59
|
### audit
|
|
45
60
|
|
|
46
|
-
Parse `package.json
|
|
61
|
+
Parse dependency files and batch-query all dependencies. Supports any `.json` file (package.json format) or `.txt` file (requirements.txt format). Unknown extensions are auto-detected.
|
|
47
62
|
|
|
48
63
|
```bash
|
|
49
64
|
ai-trust audit package.json
|
|
50
65
|
ai-trust audit requirements.txt
|
|
66
|
+
ai-trust audit deps/prod-deps.json
|
|
51
67
|
```
|
|
52
68
|
|
|
53
69
|
Set a minimum trust level threshold (default: 3):
|
|
@@ -56,6 +72,12 @@ Set a minimum trust level threshold (default: 3):
|
|
|
56
72
|
ai-trust audit package.json --min-trust 2
|
|
57
73
|
```
|
|
58
74
|
|
|
75
|
+
Scan dependencies not found in the registry:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
ai-trust audit package.json --scan-missing --contribute
|
|
79
|
+
```
|
|
80
|
+
|
|
59
81
|
### batch
|
|
60
82
|
|
|
61
83
|
Look up trust verdicts for multiple packages at once.
|
|
@@ -64,7 +86,7 @@ Look up trust verdicts for multiple packages at once.
|
|
|
64
86
|
ai-trust batch express lodash chalk commander
|
|
65
87
|
```
|
|
66
88
|
|
|
67
|
-
|
|
89
|
+
Filter by package type (packages that don't match are excluded):
|
|
68
90
|
|
|
69
91
|
```bash
|
|
70
92
|
ai-trust batch my-server-a my-server-b --type mcp_server
|
|
@@ -112,6 +134,7 @@ ai-trust check express --no-color
|
|
|
112
134
|
## Requirements
|
|
113
135
|
|
|
114
136
|
- Node.js 18 or later
|
|
137
|
+
- [HackMyAgent](https://github.com/opena2a-org/hackmyagent) (optional, required for local scanning)
|
|
115
138
|
|
|
116
139
|
## Development
|
|
117
140
|
|
package/dist/api/client.d.ts
CHANGED
|
@@ -43,6 +43,32 @@ export interface PackageQuery {
|
|
|
43
43
|
name: string;
|
|
44
44
|
type?: string;
|
|
45
45
|
}
|
|
46
|
+
export interface ScanSubmission {
|
|
47
|
+
name: string;
|
|
48
|
+
type?: string;
|
|
49
|
+
score: number;
|
|
50
|
+
maxScore: number;
|
|
51
|
+
findings: ScanFinding[];
|
|
52
|
+
projectType?: string;
|
|
53
|
+
scanTimestamp: string;
|
|
54
|
+
/** Ed25519 signature (hex) if user has an opena2a identity */
|
|
55
|
+
signature?: string;
|
|
56
|
+
/** Public key (hex) of the signer */
|
|
57
|
+
publicKey?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ScanFinding {
|
|
60
|
+
checkId: string;
|
|
61
|
+
name: string;
|
|
62
|
+
severity: string;
|
|
63
|
+
passed: boolean;
|
|
64
|
+
message: string;
|
|
65
|
+
category?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface PublishResponse {
|
|
68
|
+
accepted: boolean;
|
|
69
|
+
packageId?: string;
|
|
70
|
+
message?: string;
|
|
71
|
+
}
|
|
46
72
|
export declare class PackageNotFoundError extends Error {
|
|
47
73
|
readonly packageName: string;
|
|
48
74
|
constructor(name: string);
|
|
@@ -52,5 +78,9 @@ export declare class RegistryClient {
|
|
|
52
78
|
constructor(registryUrl: string);
|
|
53
79
|
checkTrust(name: string, type?: string): Promise<TrustAnswer>;
|
|
54
80
|
batchQuery(packages: PackageQuery[]): Promise<BatchResponse>;
|
|
81
|
+
/**
|
|
82
|
+
* Publish scan results to the community registry.
|
|
83
|
+
*/
|
|
84
|
+
publishScan(submission: ScanSubmission): Promise<PublishResponse>;
|
|
55
85
|
}
|
|
56
86
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,cAAc,CAAC;IAE9B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAQD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,MAAM;IAIzB,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC;IAmCjB,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,cAAc,CAAC;IAE9B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAQD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,WAAW,EAAE,MAAM;IAIzB,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC;IAmCjB,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAmClE;;OAEG;IACG,WAAW,CACf,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,eAAe,CAAC;CAqB5B"}
|
package/dist/api/client.js
CHANGED
|
@@ -76,5 +76,25 @@ export class RegistryClient {
|
|
|
76
76
|
},
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Publish scan results to the community registry.
|
|
81
|
+
*/
|
|
82
|
+
async publishScan(submission) {
|
|
83
|
+
const url = `${this.baseUrl}/api/v1/trust/publish`;
|
|
84
|
+
const response = await fetch(url, {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers: {
|
|
87
|
+
"Content-Type": "application/json",
|
|
88
|
+
"Accept": "application/json",
|
|
89
|
+
"User-Agent": USER_AGENT,
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify(submission),
|
|
92
|
+
});
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
const body = await response.text();
|
|
95
|
+
throw new Error(`Registry publish failed (${response.status}): ${body}`);
|
|
96
|
+
}
|
|
97
|
+
return (await response.json());
|
|
98
|
+
}
|
|
79
99
|
}
|
|
80
100
|
//# sourceMappingURL=client.js.map
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAC1C,MAAM,UAAU,GAAG,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/audit.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* ai-trust audit - Parse dependency files and batch query trust.
|
|
3
|
+
* Supports scanning missing packages locally with HMA.
|
|
3
4
|
*/
|
|
4
5
|
import type { Command } from "commander";
|
|
5
6
|
export declare function registerAuditCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiH3D"}
|
package/dist/commands/audit.js
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* ai-trust audit - Parse dependency files and batch query trust.
|
|
3
|
+
* Supports scanning missing packages locally with HMA.
|
|
3
4
|
*/
|
|
5
|
+
import chalk from "chalk";
|
|
4
6
|
import { RegistryClient } from "../api/client.js";
|
|
5
7
|
import { parseDependencyFile } from "../utils/parser.js";
|
|
6
|
-
import { formatBatchResults, formatJson } from "../output/formatter.js";
|
|
8
|
+
import { formatBatchResults, formatJson, } from "../output/formatter.js";
|
|
9
|
+
import { isHmaAvailable, scanPackage } from "../scanner/index.js";
|
|
10
|
+
import { confirm } from "../utils/prompt.js";
|
|
7
11
|
export function registerAuditCommand(program) {
|
|
8
12
|
program
|
|
9
13
|
.command("audit <file>")
|
|
10
14
|
.description("Audit dependencies from package.json or requirements.txt")
|
|
11
15
|
.option("--min-trust <level>", "minimum trust level threshold", "3")
|
|
16
|
+
.option("--scan-missing", "scan packages not found in registry using HMA")
|
|
17
|
+
.option("--contribute", "contribute scan results to community registry")
|
|
12
18
|
.action(async (file, opts) => {
|
|
13
19
|
const globalOpts = program.opts();
|
|
14
20
|
const minTrust = parseInt(opts.minTrust, 10);
|
|
@@ -30,14 +36,32 @@ export function registerAuditCommand(program) {
|
|
|
30
36
|
}
|
|
31
37
|
const client = new RegistryClient(globalOpts.registryUrl);
|
|
32
38
|
const response = await client.batchQuery(packages);
|
|
39
|
+
// Scan missing packages if requested
|
|
40
|
+
const notFound = response.results.filter((r) => !r.found);
|
|
41
|
+
if (notFound.length > 0 && opts.scanMissing) {
|
|
42
|
+
await scanMissingPackages(notFound, response.results, client, opts);
|
|
43
|
+
}
|
|
44
|
+
else if (notFound.length > 0 &&
|
|
45
|
+
!opts.scanMissing &&
|
|
46
|
+
process.stdin.isTTY) {
|
|
47
|
+
// Interactive: offer to scan
|
|
48
|
+
const shouldScan = await confirm(`${notFound.length} package(s) not in registry. Scan locally?`, false);
|
|
49
|
+
if (shouldScan) {
|
|
50
|
+
if (!(await isHmaAvailable())) {
|
|
51
|
+
console.error("HMA (HackMyAgent) is required for scanning. Install it with:");
|
|
52
|
+
console.error(" npm install -g hackmyagent");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
await scanMissingPackages(notFound, response.results, client, opts);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
33
59
|
if (globalOpts.json) {
|
|
34
60
|
console.log(formatJson(response));
|
|
35
61
|
}
|
|
36
62
|
else {
|
|
37
63
|
console.log(formatBatchResults(response, minTrust));
|
|
38
64
|
}
|
|
39
|
-
// Exit code 2 for policy violation (below threshold).
|
|
40
|
-
// Exit code 1 is reserved for actual errors (network, server).
|
|
41
65
|
const belowThreshold = response.results.some((r) => r.found && r.trustLevel < minTrust);
|
|
42
66
|
if (belowThreshold) {
|
|
43
67
|
process.exitCode = 2;
|
|
@@ -57,4 +81,77 @@ export function registerAuditCommand(program) {
|
|
|
57
81
|
}
|
|
58
82
|
});
|
|
59
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Scan packages not found in registry and update the results array in-place.
|
|
86
|
+
*/
|
|
87
|
+
async function scanMissingPackages(notFound, allResults, client, opts) {
|
|
88
|
+
const available = await isHmaAvailable();
|
|
89
|
+
if (!available) {
|
|
90
|
+
console.error("HMA (HackMyAgent) is required for scanning. Install it with:");
|
|
91
|
+
console.error(" npm install -g hackmyagent");
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
console.error(chalk.gray(`Scanning ${notFound.length} missing package(s)...`));
|
|
95
|
+
for (const pkg of notFound) {
|
|
96
|
+
try {
|
|
97
|
+
console.error(chalk.gray(` Scanning ${pkg.name}...`));
|
|
98
|
+
const scanResult = await scanPackage(pkg.name);
|
|
99
|
+
// Update the result in-place
|
|
100
|
+
const idx = allResults.findIndex((r) => r.name === pkg.name);
|
|
101
|
+
if (idx !== -1) {
|
|
102
|
+
allResults[idx] = {
|
|
103
|
+
...allResults[idx],
|
|
104
|
+
found: true,
|
|
105
|
+
trustLevel: scanResult.trustLevel,
|
|
106
|
+
trustScore: scanResult.trustScore,
|
|
107
|
+
verdict: scanResult.verdict,
|
|
108
|
+
scanStatus: "local",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Contribute if requested
|
|
112
|
+
if (opts.contribute) {
|
|
113
|
+
await contributeResult(pkg.name, scanResult, client);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
118
|
+
console.error(chalk.yellow(` Could not scan ${pkg.name}: ${message}`));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Ask to contribute if interactive and not already auto-contributing
|
|
122
|
+
if (!opts.contribute && process.stdin.isTTY) {
|
|
123
|
+
const shouldContribute = await confirm("Contribute scan results to community registry?", false);
|
|
124
|
+
if (shouldContribute) {
|
|
125
|
+
// Results already contributed inline when --contribute is set,
|
|
126
|
+
// but here we'd need to re-submit. For simplicity, note this.
|
|
127
|
+
console.error(chalk.gray("Use --contribute flag to auto-contribute results in future runs."));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async function contributeResult(name, scanResult, client) {
|
|
132
|
+
try {
|
|
133
|
+
await client.publishScan({
|
|
134
|
+
name,
|
|
135
|
+
score: scanResult.scan.score,
|
|
136
|
+
maxScore: scanResult.scan.maxScore,
|
|
137
|
+
findings: scanResult.scan.findings
|
|
138
|
+
.filter((f) => !f.passed)
|
|
139
|
+
.map((f) => ({
|
|
140
|
+
checkId: f.checkId,
|
|
141
|
+
name: f.name,
|
|
142
|
+
severity: f.severity,
|
|
143
|
+
passed: f.passed,
|
|
144
|
+
message: f.message,
|
|
145
|
+
category: f.category,
|
|
146
|
+
})),
|
|
147
|
+
projectType: scanResult.scan.projectType,
|
|
148
|
+
scanTimestamp: scanResult.scan.timestamp,
|
|
149
|
+
});
|
|
150
|
+
console.error(chalk.green(` Contributed: ${name}`));
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
154
|
+
console.error(chalk.yellow(` Could not publish ${name}: ${message}`));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
60
157
|
//# sourceMappingURL=audit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/commands/batch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/commands/batch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqF3D"}
|
package/dist/commands/batch.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { RegistryClient } from "../api/client.js";
|
|
5
5
|
import { formatBatchResults, formatJson } from "../output/formatter.js";
|
|
6
|
+
import { resolveAndLog } from "../utils/resolve.js";
|
|
6
7
|
export function registerBatchCommand(program) {
|
|
7
8
|
program
|
|
8
9
|
.command("batch <names...>")
|
|
@@ -22,13 +23,27 @@ export function registerBatchCommand(program) {
|
|
|
22
23
|
process.exitCode = 1;
|
|
23
24
|
return;
|
|
24
25
|
}
|
|
25
|
-
const packages = names.map((
|
|
26
|
-
name,
|
|
26
|
+
const packages = names.map((rawName) => ({
|
|
27
|
+
name: resolveAndLog(rawName),
|
|
27
28
|
...(opts.type ? { type: opts.type } : {}),
|
|
28
29
|
}));
|
|
29
30
|
const client = new RegistryClient(globalOpts.registryUrl);
|
|
30
31
|
try {
|
|
31
32
|
const response = await client.batchQuery(packages);
|
|
33
|
+
// When --type is set, filter out packages that don't match
|
|
34
|
+
if (opts.type) {
|
|
35
|
+
for (const r of response.results) {
|
|
36
|
+
if (r.found &&
|
|
37
|
+
r.packageType &&
|
|
38
|
+
r.packageType !== opts.type) {
|
|
39
|
+
r.found = false;
|
|
40
|
+
r.verdict = "unknown";
|
|
41
|
+
r.trustLevel = 0;
|
|
42
|
+
response.meta.found--;
|
|
43
|
+
response.meta.notFound++;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
32
47
|
if (globalOpts.json) {
|
|
33
48
|
console.log(formatJson(response));
|
|
34
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/commands/batch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/commands/batch.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/check.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* ai-trust check - Single package trust lookup with scan-on-demand.
|
|
3
|
+
*
|
|
4
|
+
* When a package isn't in the registry, offers to scan it locally with HMA
|
|
5
|
+
* and optionally contribute results to the community registry.
|
|
3
6
|
*/
|
|
4
7
|
import type { Command } from "commander";
|
|
5
8
|
export declare function registerCheckCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2E3D"}
|
package/dist/commands/check.js
CHANGED
|
@@ -1,34 +1,178 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* ai-trust check - Single package trust lookup with scan-on-demand.
|
|
3
|
+
*
|
|
4
|
+
* When a package isn't in the registry, offers to scan it locally with HMA
|
|
5
|
+
* and optionally contribute results to the community registry.
|
|
3
6
|
*/
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { RegistryClient, PackageNotFoundError } from "../api/client.js";
|
|
9
|
+
import { formatCheckResult, formatScanResult, formatJson, } from "../output/formatter.js";
|
|
10
|
+
import { resolveAndLog } from "../utils/resolve.js";
|
|
11
|
+
import { isHmaAvailable, scanPackage } from "../scanner/index.js";
|
|
12
|
+
import { confirm } from "../utils/prompt.js";
|
|
6
13
|
export function registerCheckCommand(program) {
|
|
7
14
|
program
|
|
8
15
|
.command("check <name>")
|
|
9
16
|
.description("Look up trust information for a single package")
|
|
10
|
-
.option("-t, --type <type>", "package type filter (mcp_server, a2a_agent, ai_tool, etc.)
|
|
11
|
-
.
|
|
17
|
+
.option("-t, --type <type>", "package type filter (mcp_server, a2a_agent, ai_tool, etc.)")
|
|
18
|
+
.option("--scan-if-missing", "auto-scan packages not in registry (non-interactive)")
|
|
19
|
+
.option("--contribute", "auto-contribute scan results to community registry")
|
|
20
|
+
.option("--no-scan", "never scan, only query registry")
|
|
21
|
+
.option("--rescan", "force re-scan even if data exists")
|
|
22
|
+
.option("--stale-days <n>", "consider data stale after N days", "90")
|
|
23
|
+
.action(async (rawName, opts) => {
|
|
12
24
|
const globalOpts = program.opts();
|
|
25
|
+
const name = resolveAndLog(rawName);
|
|
13
26
|
const client = new RegistryClient(globalOpts.registryUrl);
|
|
14
27
|
try {
|
|
15
28
|
const result = await client.checkTrust(name, opts.type);
|
|
29
|
+
// Check for stale data
|
|
30
|
+
if (result.found && opts.rescan) {
|
|
31
|
+
await handleScanFlow(name, client, globalOpts, opts, "Re-scanning...");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
16
34
|
if (globalOpts.json) {
|
|
17
35
|
console.log(formatJson(result));
|
|
18
36
|
}
|
|
19
37
|
else {
|
|
20
38
|
console.log(formatCheckResult(result));
|
|
21
39
|
}
|
|
22
|
-
|
|
23
|
-
|
|
40
|
+
if (result.found &&
|
|
41
|
+
(result.verdict === "blocked" || result.verdict === "warning")) {
|
|
24
42
|
process.exitCode = 1;
|
|
25
43
|
}
|
|
26
44
|
}
|
|
27
45
|
catch (err) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
46
|
+
if (err instanceof PackageNotFoundError && opts.scan !== false) {
|
|
47
|
+
await handleNotFound(name, client, globalOpts, opts);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
51
|
+
if (globalOpts.json) {
|
|
52
|
+
console.log(formatJson({ name, found: false, error: message }));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.error(`Error: ${message}`);
|
|
56
|
+
}
|
|
57
|
+
process.exitCode = 1;
|
|
58
|
+
}
|
|
31
59
|
}
|
|
32
60
|
});
|
|
33
61
|
}
|
|
62
|
+
async function handleNotFound(name, client, globalOpts, opts) {
|
|
63
|
+
// Non-interactive mode with --scan-if-missing
|
|
64
|
+
if (opts.scanIfMissing) {
|
|
65
|
+
await handleScanFlow(name, client, globalOpts, opts, `Package "${name}" not found in registry. Scanning...`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
// Non-TTY: just report not found (scan must be opt-in via --scan-if-missing)
|
|
69
|
+
if (!process.stdin.isTTY) {
|
|
70
|
+
const msg = `Package "${name}" not found in the OpenA2A Registry. Use --scan-if-missing to scan locally.`;
|
|
71
|
+
if (globalOpts.json) {
|
|
72
|
+
console.log(formatJson({ name, found: false, error: msg }));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.error(msg);
|
|
76
|
+
}
|
|
77
|
+
process.exitCode = 1;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Interactive mode: ask the user
|
|
81
|
+
console.error(chalk.gray(`Package "${name}" not found in the OpenA2A Registry.`));
|
|
82
|
+
if (!(await checkHmaReady()))
|
|
83
|
+
return;
|
|
84
|
+
const shouldScan = await confirm("No trust data yet. Scan it now?", false);
|
|
85
|
+
if (!shouldScan) {
|
|
86
|
+
process.exitCode = 1;
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
await handleScanFlow(name, client, globalOpts, opts, "Scanning...");
|
|
90
|
+
}
|
|
91
|
+
async function handleScanFlow(name, client, globalOpts, opts, statusMessage) {
|
|
92
|
+
if (!(await checkHmaReady()))
|
|
93
|
+
return;
|
|
94
|
+
console.error(chalk.gray(statusMessage));
|
|
95
|
+
let scanResult;
|
|
96
|
+
try {
|
|
97
|
+
scanResult = await scanPackage(name);
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
101
|
+
if (globalOpts.json) {
|
|
102
|
+
console.log(formatJson({ name, found: false, error: message }));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.error(`Error: ${message}`);
|
|
106
|
+
}
|
|
107
|
+
process.exitCode = 1;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Output scan results
|
|
111
|
+
if (globalOpts.json) {
|
|
112
|
+
console.log(formatJson(scanResult));
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
console.log(formatScanResult(scanResult));
|
|
116
|
+
}
|
|
117
|
+
// Set exit code based on verdict
|
|
118
|
+
if (scanResult.verdict === "blocked" || scanResult.verdict === "warning") {
|
|
119
|
+
process.exitCode = 1;
|
|
120
|
+
}
|
|
121
|
+
// Contribute results to community registry
|
|
122
|
+
await handleContribute(name, scanResult, client, opts);
|
|
123
|
+
}
|
|
124
|
+
async function handleContribute(name, scanResult, client, opts) {
|
|
125
|
+
let shouldContribute = false;
|
|
126
|
+
if (opts.contribute) {
|
|
127
|
+
// Non-interactive: auto-contribute
|
|
128
|
+
shouldContribute = true;
|
|
129
|
+
}
|
|
130
|
+
else if (process.stdin.isTTY) {
|
|
131
|
+
// Interactive: ask
|
|
132
|
+
shouldContribute = await confirm("Contribute results to community registry?", false);
|
|
133
|
+
}
|
|
134
|
+
if (!shouldContribute)
|
|
135
|
+
return;
|
|
136
|
+
try {
|
|
137
|
+
const submission = {
|
|
138
|
+
name,
|
|
139
|
+
score: scanResult.scan.score,
|
|
140
|
+
maxScore: scanResult.scan.maxScore,
|
|
141
|
+
findings: scanResult.scan.findings
|
|
142
|
+
.filter((f) => !f.passed)
|
|
143
|
+
.map((f) => ({
|
|
144
|
+
checkId: f.checkId,
|
|
145
|
+
name: f.name,
|
|
146
|
+
severity: f.severity,
|
|
147
|
+
passed: f.passed,
|
|
148
|
+
message: f.message,
|
|
149
|
+
category: f.category,
|
|
150
|
+
})),
|
|
151
|
+
projectType: scanResult.scan.projectType,
|
|
152
|
+
scanTimestamp: scanResult.scan.timestamp,
|
|
153
|
+
};
|
|
154
|
+
const publishResult = await client.publishScan(submission);
|
|
155
|
+
if (publishResult.accepted) {
|
|
156
|
+
console.error(chalk.green("Scan results contributed to community registry."));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.error(chalk.yellow(`Registry did not accept submission: ${publishResult.message || "unknown reason"}`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
164
|
+
console.error(chalk.yellow(`Could not publish results: ${message}`));
|
|
165
|
+
// Non-fatal: scan results are still shown locally
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function checkHmaReady() {
|
|
169
|
+
const available = await isHmaAvailable();
|
|
170
|
+
if (!available) {
|
|
171
|
+
console.error("HMA (HackMyAgent) is required for scanning. Install it with:");
|
|
172
|
+
console.error(" npm install -g hackmyagent");
|
|
173
|
+
process.exitCode = 1;
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
34
178
|
//# sourceMappingURL=check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -16,7 +16,7 @@ const program = new Command();
|
|
|
16
16
|
program
|
|
17
17
|
.name("ai-trust")
|
|
18
18
|
.description("Trust verification CLI for AI packages")
|
|
19
|
-
.version(pkg.version)
|
|
19
|
+
.version(pkg.version, "-v, --version")
|
|
20
20
|
.option("--registry-url <url>", "registry base URL", "https://api.oa2a.org")
|
|
21
21
|
.option("--json", "output raw JSON", false)
|
|
22
22
|
.option("--no-color", "disable colored output");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC;KACrC,MAAM,CACL,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,CACvB;KACA,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,CAAC;KAC1C,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;AAElD,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* Supports colored terminal output and raw JSON.
|
|
4
4
|
*/
|
|
5
5
|
import type { TrustAnswer, BatchResponse } from "../api/client.js";
|
|
6
|
+
import type { ScanResult } from "../scanner/index.js";
|
|
6
7
|
export declare function formatCheckResult(answer: TrustAnswer): string;
|
|
7
8
|
export declare function formatBatchResults(response: BatchResponse, minTrust: number): string;
|
|
9
|
+
export declare function formatScanResult(result: ScanResult): string;
|
|
8
10
|
export declare function formatJson(data: unknown): string;
|
|
9
11
|
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAsCtD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAiC7D;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,MAAM,GACf,MAAM,CA4FR;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CA8C3D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD"}
|