praxis-sec 1.2.0 → 1.2.2
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/assets/praxis-architecture.svg +304 -0
- package/assets/praxis-logo.svg +38 -0
- package/cli/agents/abom-generator.js +1 -1
- package/cli/agents/agent-attestation-agent.js +10 -1
- package/cli/agents/agent-config-scanner.js +1 -1
- package/cli/agents/ai-infra-inventory-agent.js +482 -482
- package/cli/agents/base-agent.js +1 -1
- package/cli/agents/endpoint-agent-abuse-agent.js +1 -1
- package/cli/agents/html-reporter.js +10 -10
- package/cli/agents/index.js +2 -2
- package/cli/agents/injection-tester.js +8 -1
- package/cli/agents/mcp-security-agent.js +600 -594
- package/cli/agents/memory-poisoning-agent.js +1 -1
- package/cli/agents/model-file-scanner.js +1 -1
- package/cli/agents/orchestrator.js +375 -355
- package/cli/agents/prompt-injection-prober.js +228 -228
- package/cli/bin/praxis.js +7 -3
- package/cli/commands/agent-fix.js +1091 -1245
- package/cli/commands/audit.js +1232 -1216
- package/cli/commands/baseline.js +3 -2
- package/cli/commands/benchmark.js +1 -1
- package/cli/commands/ci.js +50 -25
- package/cli/commands/deps.js +11 -5
- package/cli/commands/diff.js +2 -1
- package/cli/commands/env-audit.js +1 -1
- package/cli/commands/fix.js +1 -1
- package/cli/commands/legal.js +2 -1
- package/cli/commands/mcp.js +3 -2
- package/cli/commands/openclaw.js +3 -6
- package/cli/commands/red-team.js +351 -350
- package/cli/commands/remediate.js +1 -1
- package/cli/commands/rotate.js +1 -1
- package/cli/commands/rules.js +1 -1
- package/cli/commands/scan-standard.js +3 -6
- package/cli/commands/scan.js +554 -554
- package/cli/commands/score.js +1 -1
- package/cli/commands/undo.js +22 -77
- package/cli/commands/vibe-check.js +3 -2
- package/cli/commands/watch.js +6 -5
- package/cli/core/fix-plan.js +274 -0
- package/cli/core/fs.js +27 -0
- package/cli/core/git-clone.js +8 -6
- package/cli/core/glob.js +56 -0
- package/cli/core/output/html-theme.js +158 -158
- package/cli/core/output/json.js +56 -48
- package/cli/core/output/sarif.js +2 -2
- package/cli/core/paths.js +91 -0
- package/cli/core/web/jobs.js +2 -2
- package/cli/core/web/server.js +19 -8
- package/cli/data/threatpacks/latest.json +41 -41
- package/cli/integrations/github-action.js +136 -0
- package/cli/utils/cache-manager.js +2 -1
- package/cli/utils/plugin-loader.js +15 -95
- package/cli/utils/rule-import.js +227 -227
- package/cli/utils/rule-registry.js +425 -425
- package/cli/utils/scan-fingerprint.js +1 -1
- package/cli/utils/score-history.js +118 -118
- package/docs/USAGE.md +16 -9
- package/docs/design/WEB-UI.md +4 -5
- package/package.json +81 -71
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="1340" viewBox="0 0 960 1340" role="img" aria-label="Praxis AI Security Architecture and Autonomous Fix Loop Flow">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Background Canvas Gradient -->
|
|
4
|
+
<linearGradient id="bgGrad" x1="0" y1="0" x2="0" y2="1">
|
|
5
|
+
<stop offset="0%" stop-color="#120726"/>
|
|
6
|
+
<stop offset="40%" stop-color="#090314"/>
|
|
7
|
+
<stop offset="100%" stop-color="#030108"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
|
|
10
|
+
<!-- Ambient Top Purple Glow -->
|
|
11
|
+
<radialGradient id="topGlow" cx="50%" cy="0%" r="50%">
|
|
12
|
+
<stop offset="0%" stop-color="#8b5cf6" stop-opacity="0.32"/>
|
|
13
|
+
<stop offset="100%" stop-color="#8b5cf6" stop-opacity="0"/>
|
|
14
|
+
</radialGradient>
|
|
15
|
+
|
|
16
|
+
<!-- Card Backgrounds -->
|
|
17
|
+
<linearGradient id="cardScan" x1="0" y1="0" x2="1" y2="0">
|
|
18
|
+
<stop offset="0%" stop-color="#1f0e38"/>
|
|
19
|
+
<stop offset="100%" stop-color="#130824"/>
|
|
20
|
+
</linearGradient>
|
|
21
|
+
|
|
22
|
+
<linearGradient id="cardNorm" x1="0" y1="0" x2="1" y2="0">
|
|
23
|
+
<stop offset="0%" stop-color="#241042"/>
|
|
24
|
+
<stop offset="100%" stop-color="#140926"/>
|
|
25
|
+
</linearGradient>
|
|
26
|
+
|
|
27
|
+
<linearGradient id="cardLlm" x1="0" y1="0" x2="1" y2="0">
|
|
28
|
+
<stop offset="0%" stop-color="#2a0d4a"/>
|
|
29
|
+
<stop offset="100%" stop-color="#18072c"/>
|
|
30
|
+
</linearGradient>
|
|
31
|
+
|
|
32
|
+
<linearGradient id="cardVerify" x1="0" y1="0" x2="1" y2="0">
|
|
33
|
+
<stop offset="0%" stop-color="#0e2a22"/>
|
|
34
|
+
<stop offset="100%" stop-color="#081813"/>
|
|
35
|
+
</linearGradient>
|
|
36
|
+
|
|
37
|
+
<linearGradient id="cardHitl" x1="0" y1="0" x2="1" y2="0">
|
|
38
|
+
<stop offset="0%" stop-color="#241403"/>
|
|
39
|
+
<stop offset="100%" stop-color="#140a02"/>
|
|
40
|
+
</linearGradient>
|
|
41
|
+
|
|
42
|
+
<linearGradient id="cardSurfaces" x1="0" y1="0" x2="1" y2="0">
|
|
43
|
+
<stop offset="0%" stop-color="#082f49"/>
|
|
44
|
+
<stop offset="100%" stop-color="#04141f"/>
|
|
45
|
+
</linearGradient>
|
|
46
|
+
|
|
47
|
+
<!-- Brand Color Gradients -->
|
|
48
|
+
<linearGradient id="praxisGrad" x1="0" y1="0" x2="1" y2="0">
|
|
49
|
+
<stop offset="0%" stop-color="#c084fc"/>
|
|
50
|
+
<stop offset="50%" stop-color="#8b5cf6"/>
|
|
51
|
+
<stop offset="100%" stop-color="#6d28d9"/>
|
|
52
|
+
</linearGradient>
|
|
53
|
+
|
|
54
|
+
<linearGradient id="emeraldGrad" x1="0" y1="0" x2="1" y2="0">
|
|
55
|
+
<stop offset="0%" stop-color="#6ee7b7"/>
|
|
56
|
+
<stop offset="100%" stop-color="#10b981"/>
|
|
57
|
+
</linearGradient>
|
|
58
|
+
|
|
59
|
+
<linearGradient id="goldGrad" x1="0" y1="0" x2="1" y2="0">
|
|
60
|
+
<stop offset="0%" stop-color="#fde047"/>
|
|
61
|
+
<stop offset="100%" stop-color="#f59e0b"/>
|
|
62
|
+
</linearGradient>
|
|
63
|
+
|
|
64
|
+
<linearGradient id="cyanGrad" x1="0" y1="0" x2="1" y2="0">
|
|
65
|
+
<stop offset="0%" stop-color="#38bdf8"/>
|
|
66
|
+
<stop offset="100%" stop-color="#0284c7"/>
|
|
67
|
+
</linearGradient>
|
|
68
|
+
|
|
69
|
+
<!-- Glowing Filters -->
|
|
70
|
+
<filter id="shadow" x="-10%" y="-10%" width="120%" height="120%">
|
|
71
|
+
<feDropShadow dx="0" dy="6" stdDeviation="6" flood-color="#000000" flood-opacity="0.8"/>
|
|
72
|
+
</filter>
|
|
73
|
+
<filter id="glowPurple" x="-20%" y="-20%" width="140%" height="140%">
|
|
74
|
+
<feDropShadow dx="0" dy="0" stdDeviation="6" flood-color="#c084fc" flood-opacity="0.5"/>
|
|
75
|
+
</filter>
|
|
76
|
+
<filter id="glowGreen" x="-20%" y="-20%" width="140%" height="140%">
|
|
77
|
+
<feDropShadow dx="0" dy="0" stdDeviation="6" flood-color="#10b981" flood-opacity="0.5"/>
|
|
78
|
+
</filter>
|
|
79
|
+
|
|
80
|
+
<!-- Arrow Markers -->
|
|
81
|
+
<marker id="arrDownPurple" markerWidth="10" markerHeight="10" refX="5" refY="7" orient="auto">
|
|
82
|
+
<polygon points="0 0, 10 0, 5 8" fill="#c084fc"/>
|
|
83
|
+
</marker>
|
|
84
|
+
<marker id="arrDownCyan" markerWidth="10" markerHeight="10" refX="5" refY="7" orient="auto">
|
|
85
|
+
<polygon points="0 0, 10 0, 5 8" fill="#38bdf8"/>
|
|
86
|
+
</marker>
|
|
87
|
+
<marker id="arrDownGreen" markerWidth="10" markerHeight="10" refX="5" refY="7" orient="auto">
|
|
88
|
+
<polygon points="0 0, 10 0, 5 8" fill="#34d399"/>
|
|
89
|
+
</marker>
|
|
90
|
+
<marker id="arrDownGold" markerWidth="10" markerHeight="10" refX="5" refY="7" orient="auto">
|
|
91
|
+
<polygon points="0 0, 10 0, 5 8" fill="#f59e0b"/>
|
|
92
|
+
</marker>
|
|
93
|
+
</defs>
|
|
94
|
+
|
|
95
|
+
<!-- Base Canvas Background -->
|
|
96
|
+
<rect width="960" height="1340" fill="url(#bgGrad)"/>
|
|
97
|
+
<rect width="960" height="420" fill="url(#topGlow)"/>
|
|
98
|
+
|
|
99
|
+
<!-- ========================================================================= -->
|
|
100
|
+
<!-- HEADER & LOGO -->
|
|
101
|
+
<!-- ========================================================================= -->
|
|
102
|
+
<g transform="translate(480, 48)">
|
|
103
|
+
<!-- Shield Logo Icon -->
|
|
104
|
+
<g transform="translate(-295, -26) scale(0.38)">
|
|
105
|
+
<path d="M55 0 L110 18 V62 C110 100 86 128 55 145 C24 128 0 100 0 62 V18 Z" fill="url(#praxisGrad)" stroke="#4c1d95" stroke-width="3"/>
|
|
106
|
+
<path d="M55 24 L82 40 V66 C82 92 68 110 55 120 C42 110 28 92 28 66 V40 Z" fill="#ffffff" opacity="0.95"/>
|
|
107
|
+
</g>
|
|
108
|
+
<text x="24" y="8" text-anchor="middle" font-family="'Segoe UI', -apple-system, sans-serif" font-size="32" font-weight="900" letter-spacing="0.5">
|
|
109
|
+
<tspan fill="url(#praxisGrad)">PRAXIS</tspan>
|
|
110
|
+
<tspan fill="#ffffff" font-weight="800"> | ARCHITECTURE FLOW</tspan>
|
|
111
|
+
</text>
|
|
112
|
+
<text x="0" y="38" text-anchor="middle" font-family="'Segoe UI', -apple-system, sans-serif" font-size="15" font-weight="600" fill="#e9d5ff">
|
|
113
|
+
28-Agent Parallel Audit · AST Taint · Remote Git Scanning · 4-Tier Verification · Autonomous Fix
|
|
114
|
+
</text>
|
|
115
|
+
</g>
|
|
116
|
+
|
|
117
|
+
<!-- ========================================================================= -->
|
|
118
|
+
<!-- STEP 1: 28-AGENT CONCURRENT STATIC & AST AUDIT (y=110, h=155) -->
|
|
119
|
+
<!-- ========================================================================= -->
|
|
120
|
+
<g transform="translate(90, 110)" filter="url(#shadow)">
|
|
121
|
+
<rect x="0" y="0" width="780" height="155" rx="14" fill="url(#cardScan)" stroke="#7c3aed" stroke-width="2" filter="url(#glowPurple)"/>
|
|
122
|
+
|
|
123
|
+
<!-- Stage Header Badge -->
|
|
124
|
+
<circle cx="28" cy="28" r="16" fill="#7c3aed"/>
|
|
125
|
+
<text x="28" y="34" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="900" fill="#ffffff">1</text>
|
|
126
|
+
|
|
127
|
+
<text x="56" y="34" font-family="sans-serif" font-size="18.5" font-weight="900" fill="#ffffff">28-AGENT PARALLEL AUDIT & AST TAINT CORE</text>
|
|
128
|
+
<rect x="635" y="14" width="130" height="28" rx="6" fill="#2e1065" stroke="#a855f7" stroke-width="1.2"/>
|
|
129
|
+
<text x="700" y="32" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="800" fill="#c084fc">DETERMINISTIC</text>
|
|
130
|
+
|
|
131
|
+
<!-- Sub-bullets -->
|
|
132
|
+
<g transform="translate(24, 60)">
|
|
133
|
+
<text x="0" y="16" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#f3e8ff">• <tspan font-weight="700">28 Concurrent Agents:</tspan> Prompt Injection · MCP Abuse · Memory Poisoning · RAG · Pickles · Auth</text>
|
|
134
|
+
<text x="0" y="42" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#f3e8ff">• <tspan font-weight="700">AST & Taint Engine:</tspan> Pure ESM Babel (JS/TS) & Python CST with ScopeTree & Source-to-Sink Taint</text>
|
|
135
|
+
<text x="0" y="68" font-family="sans-serif" font-size="14.5" font-weight="700" fill="#34d399">• <tspan font-weight="700">100% Offline & Free:</tspan> 0 token cost, 125 secret & code patterns, 7 cached Threat Intel feeds</text>
|
|
136
|
+
</g>
|
|
137
|
+
</g>
|
|
138
|
+
|
|
139
|
+
<!-- Connector 1 -> 2 -->
|
|
140
|
+
<g transform="translate(480, 265)">
|
|
141
|
+
<line x1="0" y1="0" x2="0" y2="35" stroke="#c084fc" stroke-width="3.5" marker-end="url(#arrDownPurple)"/>
|
|
142
|
+
<rect x="-140" y="8" width="280" height="22" rx="4" fill="#241042" stroke="#7c3aed" stroke-width="1"/>
|
|
143
|
+
<text x="0" y="24" text-anchor="middle" font-family="sans-serif" font-size="11.5" font-weight="800" fill="#e9d5ff">Raw Findings & AST Taint Graphs</text>
|
|
144
|
+
</g>
|
|
145
|
+
|
|
146
|
+
<!-- ========================================================================= -->
|
|
147
|
+
<!-- STEP 2: ACCURACY, STANDARDS & ABOM MATRIX (y=305, h=145) -->
|
|
148
|
+
<!-- ========================================================================= -->
|
|
149
|
+
<g transform="translate(90, 305)" filter="url(#shadow)">
|
|
150
|
+
<rect x="0" y="0" width="780" height="145" rx="14" fill="url(#cardNorm)" stroke="#9333ea" stroke-width="2"/>
|
|
151
|
+
|
|
152
|
+
<!-- Stage Header Badge -->
|
|
153
|
+
<circle cx="28" cy="28" r="16" fill="#9333ea"/>
|
|
154
|
+
<text x="28" y="34" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="900" fill="#ffffff">2</text>
|
|
155
|
+
|
|
156
|
+
<text x="56" y="34" font-family="sans-serif" font-size="18.5" font-weight="900" fill="#ffffff">8-FRAMEWORK STANDARDS MAPPING & ABOM</text>
|
|
157
|
+
<rect x="635" y="14" width="130" height="28" rx="6" fill="#3b0764" stroke="#c084fc" stroke-width="1.2"/>
|
|
158
|
+
<text x="700" y="32" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="800" fill="#e9d5ff">COMPLIANCE</text>
|
|
159
|
+
|
|
160
|
+
<!-- Sub-bullets -->
|
|
161
|
+
<g transform="translate(24, 60)">
|
|
162
|
+
<text x="0" y="16" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#f3e8ff">• <tspan font-weight="700">8 Security Standards:</tspan> OWASP LLM 2025 · MITRE ATLAS · NIST AI 600-1 · EU AI Act (Art 12/14) · ISO 42001</text>
|
|
163
|
+
<text x="0" y="42" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#f3e8ff">• <tspan font-weight="700">CycloneDX 1.5 ABOM:</tspan> Full Agent Bill of Materials (Prompts, Tools, Models, Skills & MCP Trust)</text>
|
|
164
|
+
<text x="0" y="68" font-family="sans-serif" font-size="14.5" font-weight="700" fill="#38bdf8">• <tspan font-weight="700">Scoring Engine:</tspan> Computes 0–100 Health Score & Letter Grade (A–F) with Category Deductions</text>
|
|
165
|
+
</g>
|
|
166
|
+
</g>
|
|
167
|
+
|
|
168
|
+
<!-- Connector 2 -> 3 -->
|
|
169
|
+
<g transform="translate(480, 450)">
|
|
170
|
+
<line x1="0" y1="0" x2="0" y2="35" stroke="#38bdf8" stroke-width="3.5" marker-end="url(#arrDownCyan)"/>
|
|
171
|
+
<rect x="-140" y="8" width="280" height="22" rx="4" fill="#082230" stroke="#0284c7" stroke-width="1"/>
|
|
172
|
+
<text x="0" y="24" text-anchor="middle" font-family="sans-serif" font-size="11.5" font-weight="800" fill="#38bdf8">Deep Analysis / `praxis fix` Trigger</text>
|
|
173
|
+
</g>
|
|
174
|
+
|
|
175
|
+
<!-- ========================================================================= -->
|
|
176
|
+
<!-- STEP 3: COGNITIVE LLM REASONING & REMEDIATION (y=490, h=155) -->
|
|
177
|
+
<!-- ========================================================================= -->
|
|
178
|
+
<g transform="translate(90, 490)" filter="url(#shadow)">
|
|
179
|
+
<rect x="0" y="0" width="780" height="155" rx="14" fill="url(#cardLlm)" stroke="#c084fc" stroke-width="2.2" filter="url(#glowPurple)"/>
|
|
180
|
+
|
|
181
|
+
<!-- Stage Header Badge -->
|
|
182
|
+
<circle cx="28" cy="28" r="16" fill="url(#praxisGrad)"/>
|
|
183
|
+
<text x="28" y="34" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="900" fill="#ffffff">3</text>
|
|
184
|
+
|
|
185
|
+
<text x="56" y="34" font-family="sans-serif" font-size="18.5" font-weight="900" fill="#ffffff">COGNITIVE LLM REASONING & PATCH DRAFTING</text>
|
|
186
|
+
<rect x="635" y="14" width="130" height="28" rx="6" fill="#3b0764" stroke="#c084fc" stroke-width="1.2"/>
|
|
187
|
+
<text x="700" y="32" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="900" fill="#e9d5ff">AGENTIC AI</text>
|
|
188
|
+
|
|
189
|
+
<!-- Sub-bullets -->
|
|
190
|
+
<g transform="translate(24, 60)">
|
|
191
|
+
<text x="0" y="16" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#f3e8ff">• <tspan font-weight="700">Multi-LLM Router:</tspan> Anthropic Claude · OpenAI · DeepSeek · Google Gemini · Local Ollama (`--local`)</text>
|
|
192
|
+
<text x="0" y="42" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#f3e8ff">• <tspan font-weight="700">Exploitability Triage:</tspan> Evaluates call-site reachability & attack vectors to eliminate false alarms</text>
|
|
193
|
+
<text x="0" y="68" font-family="sans-serif" font-size="14.5" font-weight="700" fill="#34d399">• <tspan font-weight="700">Autonomous Code Fix:</tspan> Drafts contextual, multi-file code patches & unit regression tests</text>
|
|
194
|
+
</g>
|
|
195
|
+
</g>
|
|
196
|
+
|
|
197
|
+
<!-- Connector 3 -> 4 -->
|
|
198
|
+
<g transform="translate(480, 645)">
|
|
199
|
+
<line x1="0" y1="0" x2="0" y2="35" stroke="#34d399" stroke-width="3.5" marker-end="url(#arrDownGreen)"/>
|
|
200
|
+
<rect x="-145" y="8" width="290" height="22" rx="4" fill="#09281a" stroke="#10b981" stroke-width="1"/>
|
|
201
|
+
<text x="0" y="24" text-anchor="middle" font-family="sans-serif" font-size="11.5" font-weight="800" fill="#34d399">Draft Diffs to Verification Oracles</text>
|
|
202
|
+
</g>
|
|
203
|
+
|
|
204
|
+
<!-- ========================================================================= -->
|
|
205
|
+
<!-- STEP 4: 4-TIER EXECUTABLE VERIFICATION LADDER (y=685, h=165) -->
|
|
206
|
+
<!-- ========================================================================= -->
|
|
207
|
+
<g transform="translate(90, 685)" filter="url(#shadow)">
|
|
208
|
+
<rect x="0" y="0" width="780" height="165" rx="14" fill="url(#cardVerify)" stroke="#10b981" stroke-width="2.2" filter="url(#glowGreen)"/>
|
|
209
|
+
|
|
210
|
+
<!-- Stage Header Badge -->
|
|
211
|
+
<circle cx="28" cy="28" r="16" fill="url(#emeraldGrad)"/>
|
|
212
|
+
<text x="28" y="34" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="900" fill="#042316">4</text>
|
|
213
|
+
|
|
214
|
+
<text x="56" y="34" font-family="sans-serif" font-size="18.5" font-weight="900" fill="#ffffff">4-TIER EXECUTABLE VERIFICATION LADDER</text>
|
|
215
|
+
<rect x="635" y="14" width="130" height="28" rx="6" fill="#0c2b1e" stroke="#10b981" stroke-width="1.2"/>
|
|
216
|
+
<text x="700" y="32" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="900" fill="#34d399">ORACLES</text>
|
|
217
|
+
|
|
218
|
+
<!-- Sub-bullets -->
|
|
219
|
+
<g transform="translate(24, 60)">
|
|
220
|
+
<text x="0" y="16" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#a7f3d0">• <tspan font-weight="700">Tier 1 (AST Syntax Oracle):</tspan> Validates AST node integrity before any file is touched</text>
|
|
221
|
+
<text x="0" y="42" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#a7f3d0">• <tspan font-weight="700">Tier 2 (Build Oracle):</tspan> Executes project build (`npm run build` / `tsc`) to ensure 0 compiler errors</text>
|
|
222
|
+
<text x="0" y="68" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#a7f3d0">• <tspan font-weight="700">Tier 3 (Test Suite Oracle):</tspan> Runs unit test suite to guarantee zero functionality regressions</text>
|
|
223
|
+
<text x="0" y="92" font-family="sans-serif" font-size="14.5" font-weight="800" fill="#34d399">• <tspan font-weight="700">Tier 4 (Re-scan Oracle):</tspan> Confirms finding resolution — <tspan font-weight="700">Auto-reverts on any oracle failure</tspan></text>
|
|
224
|
+
</g>
|
|
225
|
+
</g>
|
|
226
|
+
|
|
227
|
+
<!-- Connector 4 -> 5 -->
|
|
228
|
+
<g transform="translate(480, 850)">
|
|
229
|
+
<line x1="0" y1="0" x2="0" y2="35" stroke="#f59e0b" stroke-width="3.5" marker-end="url(#arrDownGold)"/>
|
|
230
|
+
<rect x="-140" y="8" width="280" height="22" rx="4" fill="#241403" stroke="#f59e0b" stroke-width="1"/>
|
|
231
|
+
<text x="0" y="24" text-anchor="middle" font-family="sans-serif" font-size="11.5" font-weight="800" fill="#fde047">Verified Diffs to Operator Review</text>
|
|
232
|
+
</g>
|
|
233
|
+
|
|
234
|
+
<!-- ========================================================================= -->
|
|
235
|
+
<!-- STEP 5: HITL APPROVAL & ATOMIC APPLY (y=890, h=165) -->
|
|
236
|
+
<!-- ========================================================================= -->
|
|
237
|
+
<g transform="translate(90, 890)" filter="url(#shadow)">
|
|
238
|
+
<rect x="0" y="0" width="780" height="165" rx="14" fill="url(#cardHitl)" stroke="#f59e0b" stroke-width="2.2"/>
|
|
239
|
+
|
|
240
|
+
<!-- Stage Header Badge -->
|
|
241
|
+
<circle cx="28" cy="28" r="16" fill="url(#goldGrad)"/>
|
|
242
|
+
<text x="28" y="34" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="900" fill="#0c0701">5</text>
|
|
243
|
+
|
|
244
|
+
<text x="56" y="34" font-family="sans-serif" font-size="18.5" font-weight="900" fill="#ffffff">HUMAN APPROVAL, ATOMIC APPLY & REPORT SUITE</text>
|
|
245
|
+
<rect x="635" y="14" width="130" height="28" rx="6" fill="#382006" stroke="#f59e0b" stroke-width="1.2"/>
|
|
246
|
+
<text x="700" y="32" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="900" fill="#fde047">HUMAN-IN-LOOP</text>
|
|
247
|
+
|
|
248
|
+
<!-- Sub-bullets -->
|
|
249
|
+
<g transform="translate(24, 60)">
|
|
250
|
+
<text x="0" y="16" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#fef08a">• <tspan font-weight="700">Interactive Diff Review:</tspan> Developer inspects verified patch before any disk write</text>
|
|
251
|
+
<text x="0" y="42" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#fef08a">• <tspan font-weight="700">Atomic Apply:</tspan> boundary + symlink checks, all-or-nothing rollback, hash-based `praxis undo`</text>
|
|
252
|
+
<text x="0" y="68" font-family="sans-serif" font-size="14.5" font-weight="700" fill="#38bdf8">• <tspan font-weight="700">Assessment Report:</tspan> single-file tabbed HTML — agent coverage, AST taint, ledger, trend</text>
|
|
253
|
+
<text x="0" y="92" font-family="sans-serif" font-size="14.5" font-weight="700" fill="#34d399">• CI/CD Native: Net-new PR gating, SARIF export to GitHub Code Scanning & PR annotations</text>
|
|
254
|
+
</g>
|
|
255
|
+
</g>
|
|
256
|
+
|
|
257
|
+
<!-- ========================================================================= -->
|
|
258
|
+
<!-- LEFT RETURN CONDUIT (Closed Autopilot Loop: Step 5 -> Step 1) -->
|
|
259
|
+
<!-- ========================================================================= -->
|
|
260
|
+
<path d="M 90 975 L 35 975 L 35 185 L 85 185" fill="none" stroke="#8b5cf6" stroke-width="3.5" stroke-dasharray="10 5"/>
|
|
261
|
+
<polygon points="85,185 70,175 70,195" fill="#c084fc"/>
|
|
262
|
+
|
|
263
|
+
<!-- Vertical Feedback Tag -->
|
|
264
|
+
<g transform="translate(25, 580) rotate(-90)">
|
|
265
|
+
<rect x="-160" y="-12" width="320" height="24" rx="4" fill="#1f0e38" stroke="#8b5cf6" stroke-width="1.2"/>
|
|
266
|
+
<text x="0" y="4" text-anchor="middle" font-family="sans-serif" font-size="11.5" font-weight="800" fill="#e9d5ff" letter-spacing="0.5">
|
|
267
|
+
↻ AUTONOMOUS FIX → VERIFY LOOP
|
|
268
|
+
</text>
|
|
269
|
+
</g>
|
|
270
|
+
|
|
271
|
+
<!-- ========================================================================= -->
|
|
272
|
+
<!-- STAGE 6 : OUTPUT SURFACES, PORTABILITY & REPRODUCIBILITY -->
|
|
273
|
+
<!-- ========================================================================= -->
|
|
274
|
+
<path d="M 480 1055 L 480 1087" fill="none" stroke="#38bdf8" stroke-width="3.5" marker-end="url(#arrDownCyan)"/>
|
|
275
|
+
|
|
276
|
+
<g transform="translate(90, 1095)" filter="url(#shadow)">
|
|
277
|
+
<rect x="0" y="0" width="780" height="165" rx="14" fill="url(#cardSurfaces)" stroke="#38bdf8" stroke-width="2.2"/>
|
|
278
|
+
|
|
279
|
+
<!-- Stage Header Badge -->
|
|
280
|
+
<circle cx="28" cy="28" r="16" fill="url(#cyanGrad)"/>
|
|
281
|
+
<text x="28" y="34" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="900" fill="#04141f">6</text>
|
|
282
|
+
|
|
283
|
+
<text x="56" y="34" font-family="sans-serif" font-size="18.5" font-weight="900" fill="#ffffff">OUTPUT SURFACES & REPRODUCIBILITY</text>
|
|
284
|
+
<rect x="635" y="14" width="130" height="28" rx="6" fill="#082f49" stroke="#38bdf8" stroke-width="1.2"/>
|
|
285
|
+
<text x="700" y="32" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="900" fill="#7dd3fc">READ-ONLY</text>
|
|
286
|
+
|
|
287
|
+
<!-- Sub-bullets -->
|
|
288
|
+
<g transform="translate(24, 60)">
|
|
289
|
+
<text x="0" y="16" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#bae6fd">• <tspan font-weight="700">Web UI:</tspan> <tspan fill="#7dd3fc">`praxis web`</tspan> — Security Studio, live SSE, loopback-only, secrets redacted</text>
|
|
290
|
+
<text x="0" y="42" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#bae6fd">• <tspan font-weight="700">Portable Rules:</tspan> <tspan fill="#7dd3fc">`praxis rules export`</tspan> — 411 pattern rules as Semgrep YAML</text>
|
|
291
|
+
<text x="0" y="68" font-family="sans-serif" font-size="14.5" font-weight="600" fill="#bae6fd">• <tspan font-weight="700">Code Scanning:</tspan> SARIF carries numeric <tspan fill="#7dd3fc">`security-severity`</tspan> so alerts rank properly</text>
|
|
292
|
+
<text x="0" y="92" font-family="sans-serif" font-size="14.5" font-weight="700" fill="#34d399">• Reproducible: scan fingerprint + CI determinism gate over <tspan fill="#a7f3d0">`file::rule`</tspan> identities</text>
|
|
293
|
+
</g>
|
|
294
|
+
</g>
|
|
295
|
+
|
|
296
|
+
<!-- ========================================================================= -->
|
|
297
|
+
<!-- FOOTER -->
|
|
298
|
+
<!-- ========================================================================= -->
|
|
299
|
+
<g transform="translate(480, 1300)">
|
|
300
|
+
<text text-anchor="middle" font-family="'Segoe UI', sans-serif" font-size="13.5" font-weight="600" fill="#c084fc">
|
|
301
|
+
Node.js ≥ 18 · Pure ESM · 28 Security Agents · 4-Tier Verification Ladder · Multi-LLM Autopilot
|
|
302
|
+
</text>
|
|
303
|
+
</g>
|
|
304
|
+
</svg>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="620" height="180" viewBox="0 0 620 180" role="img" aria-label="Praxis logo">
|
|
2
|
+
<defs>
|
|
3
|
+
<!-- Base Shield Gradient (Vibrant purple to deep violet) -->
|
|
4
|
+
<linearGradient id="purpleGrad" x1="0" y1="0" x2="1" y2="1">
|
|
5
|
+
<stop offset="0%" stop-color="#c084fc"/>
|
|
6
|
+
<stop offset="55%" stop-color="#7c3aed"/>
|
|
7
|
+
<stop offset="100%" stop-color="#4c1d95"/>
|
|
8
|
+
</linearGradient>
|
|
9
|
+
<!-- Wordmark Gradient (Fuchsia to violet) -->
|
|
10
|
+
<linearGradient id="wordGrad" x1="0" y1="0" x2="1" y2="0">
|
|
11
|
+
<stop offset="0%" stop-color="#e879f9"/>
|
|
12
|
+
<stop offset="100%" stop-color="#7c3aed"/>
|
|
13
|
+
</linearGradient>
|
|
14
|
+
</defs>
|
|
15
|
+
|
|
16
|
+
<!-- Shield icon with find-fix-verify loop and AI sparkle -->
|
|
17
|
+
<g transform="translate(24,28)">
|
|
18
|
+
<!-- Sleek outer shield path -->
|
|
19
|
+
<path d="M55 0 L110 18 V62 C110 100 86 128 55 145 C24 128 0 100 0 62 V18 Z"
|
|
20
|
+
fill="url(#purpleGrad)" stroke="#3b0764" stroke-width="2"/>
|
|
21
|
+
|
|
22
|
+
<!-- Clockwise reload/loop arrow (the "remediation loop") -->
|
|
23
|
+
<path d="M55 35 A35 35 0 1 1 20 70 H32 A23 23 0 1 0 55 47 V60 L75 41 L55 22 V35 Z"
|
|
24
|
+
fill="#ffffff" opacity="0.95"/>
|
|
25
|
+
|
|
26
|
+
<!-- 4-point AI sparkle star (representing autopilot / agent intelligence) -->
|
|
27
|
+
<path d="M55 52 Q55 70 73 70 Q55 70 55 88 Q55 70 37 70 Q55 70 55 52 Z"
|
|
28
|
+
fill="#ffffff" opacity="0.95"/>
|
|
29
|
+
</g>
|
|
30
|
+
|
|
31
|
+
<!-- Wordmark -->
|
|
32
|
+
<text x="160" y="86" font-family="Segoe UI, Helvetica, Arial, sans-serif"
|
|
33
|
+
font-size="56" font-weight="800" fill="url(#wordGrad)" letter-spacing="-1">Praxis</text>
|
|
34
|
+
|
|
35
|
+
<!-- Tagline under the wordmark -->
|
|
36
|
+
<text x="162" y="120" font-family="Segoe UI, Helvetica, Arial, sans-serif"
|
|
37
|
+
font-size="19" font-weight="600" fill="#6b7280" letter-spacing="0.4">Autonomous AI-Security Audit Framework</text>
|
|
38
|
+
</svg>
|
|
@@ -287,11 +287,20 @@ export class AgentAttestationAgent extends BaseAgent {
|
|
|
287
287
|
// This lane bypasses scanFileWithPatterns, so honour the documented
|
|
288
288
|
// suppression comment here too — it was silently ignored before.
|
|
289
289
|
const ruleTable = ruleTableLineMask(lines);
|
|
290
|
+
// In a package manifest every `"url"` is npm metadata — bugs, repository,
|
|
291
|
+
// homepage, funding — pointing at a human, never fetched at runtime, and
|
|
292
|
+
// npm has no `integrity` field that would pin one. Applying ASI-10 there
|
|
293
|
+
// reported a high on essentially every published package that declares
|
|
294
|
+
// `bugs.url`. The rule still applies to agent/manifest configs, which is
|
|
295
|
+
// where a remote resource is actually loaded.
|
|
296
|
+
const patterns = isPackageJson
|
|
297
|
+
? PATTERNS.filter(p => p.rule !== 'AGENT_NO_INTEGRITY_HASH')
|
|
298
|
+
: PATTERNS;
|
|
290
299
|
for (let i = 0; i < lines.length; i++) {
|
|
291
300
|
const line = lines[i];
|
|
292
301
|
if (ruleTable && ruleTable.has(i)) continue;
|
|
293
302
|
if (this.isSuppressed(line)) continue;
|
|
294
|
-
for (const pattern of
|
|
303
|
+
for (const pattern of patterns) {
|
|
295
304
|
pattern.regex.lastIndex = 0;
|
|
296
305
|
if (pattern.regex.test(line)) {
|
|
297
306
|
findings.push(createFinding({
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import fs from 'fs';
|
|
23
23
|
import path from 'path';
|
|
24
24
|
import os from 'os';
|
|
25
|
-
import fg from '
|
|
25
|
+
import fg from '../core/glob.js';
|
|
26
26
|
import { BaseAgent, createFinding } from './base-agent.js';
|
|
27
27
|
|
|
28
28
|
// =============================================================================
|