@guava-parity/guard-scanner 15.0.0 → 16.0.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.
Files changed (61) hide show
  1. package/README.md +208 -42
  2. package/README_ja.md +252 -0
  3. package/SKILL.md +40 -11
  4. package/dist/cli.cjs +5997 -0
  5. package/dist/cli.d.mts +1 -0
  6. package/dist/cli.d.ts +1 -0
  7. package/dist/cli.mjs +6003 -0
  8. package/dist/index.cjs +4825 -0
  9. package/dist/index.d.mts +17 -0
  10. package/dist/index.d.ts +17 -0
  11. package/dist/index.mjs +4798 -0
  12. package/dist/mcp-server.cjs +4756 -0
  13. package/dist/mcp-server.d.mts +1 -0
  14. package/dist/mcp-server.d.ts +1 -0
  15. package/dist/mcp-server.mjs +4767 -0
  16. package/dist/openclaw-plugin.cjs +4863 -0
  17. package/dist/openclaw-plugin.d.mts +11 -0
  18. package/dist/openclaw-plugin.d.ts +11 -0
  19. package/dist/openclaw-plugin.mjs +4847 -34
  20. package/dist/types.cjs +18 -0
  21. package/dist/types.d.mts +215 -0
  22. package/dist/types.d.ts +215 -0
  23. package/dist/types.mjs +1 -0
  24. package/docs/data/benchmark-ledger.json +1428 -0
  25. package/docs/data/corpus-metrics.json +3 -3
  26. package/docs/data/fp-ledger.json +18 -0
  27. package/docs/data/quality-contract.json +36 -0
  28. package/docs/generated/openclaw-upstream-status.json +13 -13
  29. package/docs/openclaw-compatibility-audit.md +3 -2
  30. package/docs/openclaw-continuous-compatibility-plan.md +2 -1
  31. package/docs/spec/capabilities.json +137 -5
  32. package/docs/spec/plugin-trust.json +11 -0
  33. package/hooks/{context.js → context.ts} +1 -0
  34. package/openclaw-plugin.mts +21 -5
  35. package/openclaw.plugin.json +2 -2
  36. package/package.json +58 -20
  37. package/src/asset-auditor.js +0 -508
  38. package/src/ci-reporter.js +0 -135
  39. package/src/cli.js +0 -434
  40. package/src/core/content-loader.js +0 -42
  41. package/src/core/inventory.js +0 -73
  42. package/src/core/report-adapters.js +0 -171
  43. package/src/core/risk-engine.js +0 -93
  44. package/src/core/rule-registry.js +0 -73
  45. package/src/core/semantic-validators.js +0 -85
  46. package/src/finding-schema.js +0 -191
  47. package/src/hooks/context.ts +0 -49
  48. package/src/html-template.js +0 -239
  49. package/src/ioc-db.js +0 -54
  50. package/src/mcp-server.js +0 -653
  51. package/src/openclaw-upstream.js +0 -128
  52. package/src/patterns.js +0 -629
  53. package/src/policy-engine.js +0 -32
  54. package/src/quarantine.js +0 -41
  55. package/src/runtime-guard.js +0 -384
  56. package/src/scanner.js +0 -1042
  57. package/src/skill-crawler.js +0 -254
  58. package/src/threat-model.js +0 -50
  59. package/src/validation-layer.js +0 -39
  60. package/src/vt-client.js +0 -202
  61. package/src/watcher.js +0 -170
package/dist/types.cjs ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+
16
+ // src/types.ts
17
+ var types_exports = {};
18
+ module.exports = __toCommonJS(types_exports);
@@ -0,0 +1,215 @@
1
+ type Severity = "LOW" | "MEDIUM" | "HIGH" | "CRITICAL";
2
+ type GuardMode = "monitor" | "enforce" | "strict";
3
+ type RuntimeAction = "blocked" | "warned";
4
+ interface EvidenceSpan {
5
+ file?: string;
6
+ start_line: number;
7
+ end_line: number;
8
+ }
9
+ interface FindingEvidence {
10
+ file?: string;
11
+ line?: number | null;
12
+ sample?: string;
13
+ match_count?: number;
14
+ tool_name?: string;
15
+ params_preview?: string;
16
+ layer?: number;
17
+ layer_name?: string;
18
+ owasp_asi?: string[];
19
+ protocol_surface?: string[];
20
+ }
21
+ interface Finding {
22
+ schema_version?: string;
23
+ source?: "static" | "runtime";
24
+ id: string;
25
+ rule_id?: string;
26
+ cat?: string;
27
+ category: string;
28
+ severity: Severity;
29
+ desc?: string;
30
+ description: string;
31
+ file?: string;
32
+ line?: number | null;
33
+ matchCount?: number;
34
+ sample?: string;
35
+ rationale: string;
36
+ preconditions: string;
37
+ remediation_hint: string;
38
+ false_positive_scenarios: string[];
39
+ validation_state: string;
40
+ validation_status: string;
41
+ confidence: number;
42
+ attack_chain_id: string | null;
43
+ evidence: FindingEvidence;
44
+ evidence_spans: EvidenceSpan[];
45
+ layer?: number;
46
+ layer_name?: string;
47
+ owasp_asi?: string[];
48
+ protocol_surface?: string[];
49
+ action?: RuntimeAction;
50
+ }
51
+ interface SkillFindingResult {
52
+ skill: string;
53
+ risk: number;
54
+ verdict: string;
55
+ findings: Finding[];
56
+ }
57
+ interface ThresholdBand {
58
+ suspicious: number;
59
+ malicious: number;
60
+ }
61
+ interface ScanStats {
62
+ scanned: number;
63
+ clean: number;
64
+ low: number;
65
+ suspicious: number;
66
+ malicious: number;
67
+ }
68
+ interface Recommendation {
69
+ skill: string;
70
+ actions: string[];
71
+ }
72
+ interface ScanReport {
73
+ schema_version: string;
74
+ timestamp: string;
75
+ scanner: string;
76
+ finding_schema_version: string;
77
+ mode: "normal" | "strict";
78
+ compliance_mode?: "owasp-asi" | null;
79
+ stats: ScanStats;
80
+ thresholds: ThresholdBand;
81
+ findings: SkillFindingResult[];
82
+ recommendations: Recommendation[];
83
+ layer_summary?: Array<Record<string, unknown>>;
84
+ owasp_asi_coverage?: Array<Record<string, unknown>>;
85
+ threat_model?: Record<string, unknown>;
86
+ iocVersion: string;
87
+ }
88
+ interface TextScanResult {
89
+ safe: boolean;
90
+ risk: number;
91
+ detections: Finding[];
92
+ }
93
+ interface ScannerOptions {
94
+ verbose?: boolean;
95
+ selfExclude?: boolean;
96
+ strict?: boolean;
97
+ summaryOnly?: boolean;
98
+ quiet?: boolean;
99
+ checkDeps?: boolean;
100
+ soulLock?: boolean;
101
+ plugins?: string[];
102
+ rulesFile?: string;
103
+ compliance?: "owasp-asi";
104
+ }
105
+ interface CustomRule {
106
+ id: string;
107
+ cat: string;
108
+ regex: RegExp;
109
+ severity: Severity;
110
+ desc: string;
111
+ codeOnly?: boolean;
112
+ docOnly?: boolean;
113
+ all?: boolean;
114
+ soulLock?: boolean;
115
+ }
116
+ interface PluginConfig {
117
+ mode?: GuardMode;
118
+ auditLog?: boolean;
119
+ customRules?: string;
120
+ }
121
+ interface RuntimeDecision {
122
+ blocked: boolean;
123
+ blockReason: string | null;
124
+ detections: Finding[];
125
+ mode: GuardMode;
126
+ toolName?: string;
127
+ matchedPolicyId?: string | null;
128
+ policyRationale?: string | null;
129
+ riskAmplificationReasons?: string[];
130
+ remediationSuggestion?: string | null;
131
+ policyDecision?: RuntimePolicyDecision | null;
132
+ }
133
+ interface McpRequest {
134
+ method: string;
135
+ params?: Record<string, unknown>;
136
+ id?: string | number | null;
137
+ }
138
+ interface SarifReport {
139
+ version: string;
140
+ $schema?: string;
141
+ runs: Array<Record<string, unknown>>;
142
+ }
143
+ interface CapabilityMetrics {
144
+ static_pattern_count: number;
145
+ runtime_check_count?: number;
146
+ threat_category_count: number;
147
+ runtime_layer_count?: number;
148
+ runtime_layers?: number;
149
+ benchmark_corpus_version?: string;
150
+ explainability_completeness_rate?: number;
151
+ runtime_check_latency_budget_ms?: number;
152
+ quality_targets?: QualityTargets;
153
+ [key: string]: unknown;
154
+ }
155
+ interface RuntimeCheckStats {
156
+ total: number;
157
+ byLayer: Record<number, number>;
158
+ bySeverity: Partial<Record<Severity, number>>;
159
+ }
160
+ interface QualityTargets {
161
+ precision_min: number;
162
+ recall_min: number;
163
+ false_positive_rate_max: number;
164
+ false_negative_rate_max: number;
165
+ explainability_completeness_rate_min: number;
166
+ runtime_check_latency_budget_ms: number;
167
+ false_positive_budget_by_category: Record<string, number>;
168
+ }
169
+ interface RuntimePolicyContract {
170
+ id?: string;
171
+ allowed_tools?: string[];
172
+ blocked_tools?: string[];
173
+ max_network_scope?: "none" | "internal-only" | "external-ok";
174
+ secret_bearing_context?: boolean;
175
+ memory_write_permission?: boolean;
176
+ }
177
+ interface RuntimePolicyDecision {
178
+ action: "allow" | "block";
179
+ reason: string;
180
+ policyId: string;
181
+ amplificationReasons: string[];
182
+ remediationSuggestion: string;
183
+ }
184
+ interface ThreatModel {
185
+ timestamp: string;
186
+ surface: Record<string, boolean>;
187
+ summary: string;
188
+ owasp_asi?: string[];
189
+ layer_summary?: Array<Record<string, unknown>>;
190
+ protocol_surfaces?: string[];
191
+ }
192
+ interface GuardScannerInstance {
193
+ verbose: boolean;
194
+ strict: boolean;
195
+ summaryOnly: boolean;
196
+ quiet: boolean;
197
+ checkDeps: boolean;
198
+ soulLock: boolean;
199
+ thresholds: ThresholdBand;
200
+ findings: SkillFindingResult[];
201
+ stats: ScanStats;
202
+ scanText(text: string): TextScanResult;
203
+ scanDirectory(dir: string): SkillFindingResult[];
204
+ scanTarget(targetPath: string): ScanReport;
205
+ toJSON(): ScanReport;
206
+ toSARIF(scanDir: string): SarifReport;
207
+ toHTML(): string;
208
+ generateThreatModel(findings: Finding[]): ThreatModel;
209
+ }
210
+ interface GuardScannerConstructor {
211
+ new (options?: ScannerOptions): GuardScannerInstance;
212
+ }
213
+ type ScanResult = SkillFindingResult;
214
+
215
+ export type { CapabilityMetrics, CustomRule, EvidenceSpan, Finding, FindingEvidence, GuardMode, GuardScannerConstructor, GuardScannerInstance, McpRequest, PluginConfig, QualityTargets, Recommendation, RuntimeAction, RuntimeCheckStats, RuntimeDecision, RuntimePolicyContract, RuntimePolicyDecision, SarifReport, ScanReport, ScanResult, ScanStats, ScannerOptions, Severity, SkillFindingResult, TextScanResult, ThreatModel, ThresholdBand };
@@ -0,0 +1,215 @@
1
+ type Severity = "LOW" | "MEDIUM" | "HIGH" | "CRITICAL";
2
+ type GuardMode = "monitor" | "enforce" | "strict";
3
+ type RuntimeAction = "blocked" | "warned";
4
+ interface EvidenceSpan {
5
+ file?: string;
6
+ start_line: number;
7
+ end_line: number;
8
+ }
9
+ interface FindingEvidence {
10
+ file?: string;
11
+ line?: number | null;
12
+ sample?: string;
13
+ match_count?: number;
14
+ tool_name?: string;
15
+ params_preview?: string;
16
+ layer?: number;
17
+ layer_name?: string;
18
+ owasp_asi?: string[];
19
+ protocol_surface?: string[];
20
+ }
21
+ interface Finding {
22
+ schema_version?: string;
23
+ source?: "static" | "runtime";
24
+ id: string;
25
+ rule_id?: string;
26
+ cat?: string;
27
+ category: string;
28
+ severity: Severity;
29
+ desc?: string;
30
+ description: string;
31
+ file?: string;
32
+ line?: number | null;
33
+ matchCount?: number;
34
+ sample?: string;
35
+ rationale: string;
36
+ preconditions: string;
37
+ remediation_hint: string;
38
+ false_positive_scenarios: string[];
39
+ validation_state: string;
40
+ validation_status: string;
41
+ confidence: number;
42
+ attack_chain_id: string | null;
43
+ evidence: FindingEvidence;
44
+ evidence_spans: EvidenceSpan[];
45
+ layer?: number;
46
+ layer_name?: string;
47
+ owasp_asi?: string[];
48
+ protocol_surface?: string[];
49
+ action?: RuntimeAction;
50
+ }
51
+ interface SkillFindingResult {
52
+ skill: string;
53
+ risk: number;
54
+ verdict: string;
55
+ findings: Finding[];
56
+ }
57
+ interface ThresholdBand {
58
+ suspicious: number;
59
+ malicious: number;
60
+ }
61
+ interface ScanStats {
62
+ scanned: number;
63
+ clean: number;
64
+ low: number;
65
+ suspicious: number;
66
+ malicious: number;
67
+ }
68
+ interface Recommendation {
69
+ skill: string;
70
+ actions: string[];
71
+ }
72
+ interface ScanReport {
73
+ schema_version: string;
74
+ timestamp: string;
75
+ scanner: string;
76
+ finding_schema_version: string;
77
+ mode: "normal" | "strict";
78
+ compliance_mode?: "owasp-asi" | null;
79
+ stats: ScanStats;
80
+ thresholds: ThresholdBand;
81
+ findings: SkillFindingResult[];
82
+ recommendations: Recommendation[];
83
+ layer_summary?: Array<Record<string, unknown>>;
84
+ owasp_asi_coverage?: Array<Record<string, unknown>>;
85
+ threat_model?: Record<string, unknown>;
86
+ iocVersion: string;
87
+ }
88
+ interface TextScanResult {
89
+ safe: boolean;
90
+ risk: number;
91
+ detections: Finding[];
92
+ }
93
+ interface ScannerOptions {
94
+ verbose?: boolean;
95
+ selfExclude?: boolean;
96
+ strict?: boolean;
97
+ summaryOnly?: boolean;
98
+ quiet?: boolean;
99
+ checkDeps?: boolean;
100
+ soulLock?: boolean;
101
+ plugins?: string[];
102
+ rulesFile?: string;
103
+ compliance?: "owasp-asi";
104
+ }
105
+ interface CustomRule {
106
+ id: string;
107
+ cat: string;
108
+ regex: RegExp;
109
+ severity: Severity;
110
+ desc: string;
111
+ codeOnly?: boolean;
112
+ docOnly?: boolean;
113
+ all?: boolean;
114
+ soulLock?: boolean;
115
+ }
116
+ interface PluginConfig {
117
+ mode?: GuardMode;
118
+ auditLog?: boolean;
119
+ customRules?: string;
120
+ }
121
+ interface RuntimeDecision {
122
+ blocked: boolean;
123
+ blockReason: string | null;
124
+ detections: Finding[];
125
+ mode: GuardMode;
126
+ toolName?: string;
127
+ matchedPolicyId?: string | null;
128
+ policyRationale?: string | null;
129
+ riskAmplificationReasons?: string[];
130
+ remediationSuggestion?: string | null;
131
+ policyDecision?: RuntimePolicyDecision | null;
132
+ }
133
+ interface McpRequest {
134
+ method: string;
135
+ params?: Record<string, unknown>;
136
+ id?: string | number | null;
137
+ }
138
+ interface SarifReport {
139
+ version: string;
140
+ $schema?: string;
141
+ runs: Array<Record<string, unknown>>;
142
+ }
143
+ interface CapabilityMetrics {
144
+ static_pattern_count: number;
145
+ runtime_check_count?: number;
146
+ threat_category_count: number;
147
+ runtime_layer_count?: number;
148
+ runtime_layers?: number;
149
+ benchmark_corpus_version?: string;
150
+ explainability_completeness_rate?: number;
151
+ runtime_check_latency_budget_ms?: number;
152
+ quality_targets?: QualityTargets;
153
+ [key: string]: unknown;
154
+ }
155
+ interface RuntimeCheckStats {
156
+ total: number;
157
+ byLayer: Record<number, number>;
158
+ bySeverity: Partial<Record<Severity, number>>;
159
+ }
160
+ interface QualityTargets {
161
+ precision_min: number;
162
+ recall_min: number;
163
+ false_positive_rate_max: number;
164
+ false_negative_rate_max: number;
165
+ explainability_completeness_rate_min: number;
166
+ runtime_check_latency_budget_ms: number;
167
+ false_positive_budget_by_category: Record<string, number>;
168
+ }
169
+ interface RuntimePolicyContract {
170
+ id?: string;
171
+ allowed_tools?: string[];
172
+ blocked_tools?: string[];
173
+ max_network_scope?: "none" | "internal-only" | "external-ok";
174
+ secret_bearing_context?: boolean;
175
+ memory_write_permission?: boolean;
176
+ }
177
+ interface RuntimePolicyDecision {
178
+ action: "allow" | "block";
179
+ reason: string;
180
+ policyId: string;
181
+ amplificationReasons: string[];
182
+ remediationSuggestion: string;
183
+ }
184
+ interface ThreatModel {
185
+ timestamp: string;
186
+ surface: Record<string, boolean>;
187
+ summary: string;
188
+ owasp_asi?: string[];
189
+ layer_summary?: Array<Record<string, unknown>>;
190
+ protocol_surfaces?: string[];
191
+ }
192
+ interface GuardScannerInstance {
193
+ verbose: boolean;
194
+ strict: boolean;
195
+ summaryOnly: boolean;
196
+ quiet: boolean;
197
+ checkDeps: boolean;
198
+ soulLock: boolean;
199
+ thresholds: ThresholdBand;
200
+ findings: SkillFindingResult[];
201
+ stats: ScanStats;
202
+ scanText(text: string): TextScanResult;
203
+ scanDirectory(dir: string): SkillFindingResult[];
204
+ scanTarget(targetPath: string): ScanReport;
205
+ toJSON(): ScanReport;
206
+ toSARIF(scanDir: string): SarifReport;
207
+ toHTML(): string;
208
+ generateThreatModel(findings: Finding[]): ThreatModel;
209
+ }
210
+ interface GuardScannerConstructor {
211
+ new (options?: ScannerOptions): GuardScannerInstance;
212
+ }
213
+ type ScanResult = SkillFindingResult;
214
+
215
+ export type { CapabilityMetrics, CustomRule, EvidenceSpan, Finding, FindingEvidence, GuardMode, GuardScannerConstructor, GuardScannerInstance, McpRequest, PluginConfig, QualityTargets, Recommendation, RuntimeAction, RuntimeCheckStats, RuntimeDecision, RuntimePolicyContract, RuntimePolicyDecision, SarifReport, ScanReport, ScanResult, ScanStats, ScannerOptions, Severity, SkillFindingResult, TextScanResult, ThreatModel, ThresholdBand };
package/dist/types.mjs ADDED
@@ -0,0 +1 @@
1
+ import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);