devsecops-radar 0.2.3__tar.gz → 0.2.5__tar.gz

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 (56) hide show
  1. devsecops_radar-0.2.5/PKG-INFO +398 -0
  2. devsecops_radar-0.2.5/README.md +373 -0
  3. devsecops_radar-0.2.5/devsecops_radar/cli/scanner.py +134 -0
  4. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/core/analyzer.py +57 -51
  5. devsecops_radar-0.2.5/devsecops_radar/core/database.py +92 -0
  6. devsecops_radar-0.2.5/devsecops_radar/core/models.py +51 -0
  7. devsecops_radar-0.2.5/devsecops_radar/core/remediation.py +59 -0
  8. devsecops_radar-0.2.5/devsecops_radar/core/sbom.py +27 -0
  9. devsecops_radar-0.2.5/devsecops_radar/core/valuation.py +10 -0
  10. devsecops_radar-0.2.5/devsecops_radar/plugins/__init__.py +20 -0
  11. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/scanners/poutine.py +6 -5
  12. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/scanners/semgrep.py +6 -5
  13. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/scanners/trivy.py +9 -4
  14. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/scanners/zizmor.py +6 -5
  15. devsecops_radar-0.2.5/devsecops_radar/web/app.py +22 -0
  16. devsecops_radar-0.2.5/devsecops_radar/web/attack_paths/routes.py +42 -0
  17. devsecops_radar-0.2.5/devsecops_radar/web/dashboard/__init__.py +0 -0
  18. devsecops_radar-0.2.3/devsecops_radar/web/app.py → devsecops_radar-0.2.5/devsecops_radar/web/dashboard/routes.py +7 -135
  19. devsecops_radar-0.2.5/devsecops_radar/web/sentry/routes.py +17 -0
  20. devsecops_radar-0.2.5/devsecops_radar/web/summary/__init__.py +0 -0
  21. devsecops_radar-0.2.5/devsecops_radar/web/topology/__init__.py +0 -0
  22. devsecops_radar-0.2.5/devsecops_radar/web/topology/routes.py +13 -0
  23. devsecops_radar-0.2.5/devsecops_radar.egg-info/PKG-INFO +398 -0
  24. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar.egg-info/SOURCES.txt +12 -0
  25. devsecops_radar-0.2.5/devsecops_radar.egg-info/entry_points.txt +9 -0
  26. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar.egg-info/requires.txt +1 -0
  27. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/pyproject.toml +23 -5
  28. devsecops_radar-0.2.5/tests/test_cli.py +0 -0
  29. devsecops_radar-0.2.3/PKG-INFO +0 -337
  30. devsecops_radar-0.2.3/README.md +0 -312
  31. devsecops_radar-0.2.3/devsecops_radar/cli/scanner.py +0 -138
  32. devsecops_radar-0.2.3/devsecops_radar/core/database.py +0 -117
  33. devsecops_radar-0.2.3/devsecops_radar/core/remediation.py +0 -50
  34. devsecops_radar-0.2.3/devsecops_radar.egg-info/PKG-INFO +0 -337
  35. devsecops_radar-0.2.3/devsecops_radar.egg-info/entry_points.txt +0 -3
  36. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/LICENSE +0 -0
  37. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/MANIFEST.in +0 -0
  38. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/__init__.py +0 -0
  39. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/cli/__init__.py +0 -0
  40. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/core/__init__.py +0 -0
  41. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/core/parser.py +0 -0
  42. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/core/reporting.py +0 -0
  43. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/core/rule_fusion.py +0 -0
  44. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/scanners/base.py +0 -0
  45. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/web/__init__.py +0 -0
  46. /devsecops_radar-0.2.3/tests/test_cli.py → /devsecops_radar-0.2.5/devsecops_radar/web/attack_paths/__init__.py +0 -0
  47. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/web/static/css/bootstrap.min.css +0 -0
  48. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/web/static/css/style.css +0 -0
  49. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/web/static/js/bootstrap.bundle.min.js +0 -0
  50. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/web/static/js/chart.umd.min.js +0 -0
  51. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/web/static/js/dashboard.js +0 -0
  52. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar/web/templates/index.html +0 -0
  53. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar.egg-info/dependency_links.txt +0 -0
  54. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/devsecops_radar.egg-info/top_level.txt +0 -0
  55. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/setup.cfg +0 -0
  56. {devsecops_radar-0.2.3 → devsecops_radar-0.2.5}/tests/test_scanners.py +0 -0
@@ -0,0 +1,398 @@
1
+ Metadata-Version: 2.4
2
+ Name: devsecops-radar
3
+ Version: 0.2.5
4
+ Summary: Unified CI/CD Security Dashboard — Pipeline Sentinel
5
+ Author-email: Mehrdoost <70381337+Mehrdoost@users.noreply.github.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Mehrdoost/devsecops-radar
8
+ Project-URL: Source, https://github.com/Mehrdoost/devsecops-radar
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Topic :: Security
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: flask>=3.0
17
+ Requires-Dist: semgrep>=1.0
18
+ Requires-Dist: pyyaml>=6.0
19
+ Requires-Dist: requests>=2.31
20
+ Requires-Dist: loguru>=0.7
21
+ Requires-Dist: reportlab>=4.0
22
+ Requires-Dist: litellm>=1.50
23
+ Requires-Dist: sqlalchemy>=2.0
24
+ Dynamic: license-file
25
+
26
+ <!-- markdownlint-disable MD033 MD041 -->
27
+ <div align="center">
28
+
29
+ # 🛡️ Pipeline Sentinel
30
+ **The Open‑Source DevSecOps Command Center — Unify, Analyse, Remediate.**
31
+
32
+ [![PyPI version](https://img.shields.io/pypi/v/devsecops-radar?style=flat-square&color=blue)](https://pypi.org/project/devsecops-radar/)
33
+ [![License](https://img.shields.io/github/license/Mehrdoost/devsecops-radar?style=flat-square)](LICENSE)
34
+ [![GitHub release](https://img.shields.io/github/v/release/Mehrdoost/devsecops-radar?include_prereleases&style=flat-square)](https://github.com/Mehrdoost/devsecops-radar/releases)
35
+ [![CI](https://img.shields.io/github/actions/workflow/status/Mehrdoost/devsecops-radar/test-action.yml?branch=main&style=flat-square)](https://github.com/Mehrdoost/devsecops-radar/actions)
36
+ [![Stars](https://img.shields.io/github/stars/Mehrdoost/devsecops-radar?style=flat-square)](https://github.com/Mehrdoost/devsecops-radar/stargazers)
37
+
38
+ </div>
39
+
40
+ ---
41
+
42
+ ## 📖 Table of Contents
43
+ 1. [What Is Pipeline Sentinel?](#-what-is-pipeline-sentinel)
44
+ 2. [Roadmap](#️-roadmap)
45
+ 3. [Quick Start](#-quick-start)
46
+ 4. [Installation](#-installation)
47
+ 5. [How to Use](#-how-to-use)
48
+ 6. [Complete Command Reference](#-complete-command-reference)
49
+ 7. [Core Capabilities](#-core-capabilities)
50
+ 8. [Architecture](#️-architecture)
51
+ 9. [Security](#-security)
52
+ 10. [GitHub Action](#-github-action)
53
+ 11. [Contributing](#-contributing)
54
+ 12. [Author](#-author)
55
+ 13. [License](#-license)
56
+
57
+ ---
58
+
59
+ ## 📸 What Is Pipeline Sentinel?
60
+
61
+ **Pipeline Sentinel** is a security observability platform built for **CI/CD pipelines**. It takes the fragmented JSON output from popular open‑source scanners — **Trivy** (containers), **Semgrep** (SAST), **Poutine** (GitLab CI), and **Zizmor** (GitHub Actions) — and merges them into a **single, beautiful, offline‑ready dashboard**.
62
+
63
+ > Think of it as **Nuclei for CI/CD security**: define your own rules, feed it JSON, and let it map your attack surface.
64
+
65
+ ### 🎯 Who Is This For?
66
+
67
+ | Persona | How Pipeline Sentinel Helps |
68
+ | :--- | :--- |
69
+ | **DevSecOps Engineers** | One dashboard instead of four. Merge scanner reports and see the full picture instantly. |
70
+ | **Penetration Testers** | Feed custom tool JSON, generate AI‑powered attack graphs with MITRE ATT&CK. |
71
+ | **Security Teams (air‑gapped)** | Works 100% offline. No CDN, no external API calls. |
72
+ | **Compliance Officers** | Generate PDF reports aligned to CIS, PCI‑DSS, or ISO 27001. |
73
+ | **CI/CD Pipeline Owners** | Integrate via GitHub Action to get a security summary on every PR. |
74
+
75
+ ### 📊 Dashboard Preview
76
+
77
+ ![Dashboard Demo](docs/Demo.gif)
78
+
79
+ ---
80
+
81
+ ## 🗺️ Roadmap
82
+
83
+ Pipeline Sentinel evolves rapidly. Here is the public roadmap:
84
+
85
+ | Phase | Feature | Status |
86
+ | :--- | :--- | :--- |
87
+ | ✅ **Phase 1** | Multi‑scanner plugin engine (Trivy, Semgrep, Poutine, Zizmor) | Done |
88
+ | ✅ **Phase 1** | LLM‑powered analysis (Ollama + LiteLLM) | Done |
89
+ | ✅ **Phase 1** | Scan history, trend chart, scan diff | Done |
90
+ | ✅ **Phase 1** | GitHub Action (composite) | Done |
91
+ | ✅ **Phase 1** | Docker image (multi‑stage, non‑root) | Done |
92
+ | ✅ **Phase 2** | Attack‑path visualisation with MITRE ATT&CK & topology | Done |
93
+ | ✅ **Phase 2** | Policy‑as‑Code engine (`--policy`) | Done |
94
+ | ✅ **Phase 2** | Auto‑remediation engine (`--fix`) | Done |
95
+ | ✅ **Phase 2** | Compliance reports (PDF) | Done |
96
+ | ✅ **Phase 2** | Hybrid RuleFusion engine (local + community rules) | Done |
97
+ | ✅ **Phase 3** | Web dashboard Blueprint refactor (modular Flask) | Done |
98
+ | ✅ **Phase 3** | Real scanner plugin system with entry points | Done |
99
+ | ✅ **Phase 3** | SQLAlchemy ORM for scan history | Done |
100
+ | ✅ **Phase 3** | SBOM health reports | Done |
101
+ | ✅ **Phase 3** | Pipeline Sentry (live webhook agent) | Done |
102
+ | 🔲 **Phase 4** | Jira / Slack integration | Planned |
103
+ | 🔲 **Phase 4** | SARIF & CycloneDX support | Planned |
104
+ | 🔲 **Phase 4** | Rule Marketplace (community YAML rules) | Planned |
105
+
106
+ > See the [open issues](https://github.com/Mehrdoost/devsecops-radar/issues) for a full list of proposed features.
107
+
108
+ ---
109
+
110
+ ## 🚀 Quick Start
111
+
112
+ ```bash
113
+ # 1. Install from PyPI
114
+ pip install devsecops-radar
115
+
116
+ # 2. Feed scanner data (sample data is included in the repo)
117
+ devsecops-radar --trivy sample_trivy.json --semgrep sample_semgrep.json
118
+
119
+ # 3. Launch the dashboard
120
+ devsecops-radar-web
121
+ ```
122
+ Open http://localhost:8080 — your unified dashboard is live with sample findings.
123
+
124
+ ---
125
+
126
+ ## 📦 Installation
127
+
128
+ ### Option 1 — PyPI (Recommended)
129
+ ```bash
130
+ pip install devsecops-radar
131
+ ```
132
+
133
+ ### Option 2 — From Source
134
+ ```bash
135
+ git clone [https://github.com/Mehrdoost/devsecops-radar.git](https://github.com/Mehrdoost/devsecops-radar.git)
136
+ cd devsecops-radar
137
+ pip install -e .
138
+ ```
139
+
140
+ ### Option 3 — Docker
141
+ ```bash
142
+ docker pull ghcr.io/mehrdoost/devsecops-radar:latest
143
+ docker run -p 8080:8080 ghcr.io/mehrdoost/devsecops-radar:latest
144
+ ```
145
+
146
+ **Mount your own findings file:**
147
+ ```bash
148
+ docker run -p 8080:8080 -v $(pwd)/findings.json:/data/findings.json ghcr.io/mehrdoost/devsecops-radar:latest
149
+ ```
150
+
151
+ **Or use Docker Compose:**
152
+ ```bash
153
+ docker compose up
154
+ ```
155
+
156
+ ---
157
+
158
+ ## 🧭 How to Use
159
+
160
+ ### Step 1 — Run Your Security Scanners
161
+ Generate JSON output from your tools:
162
+
163
+ ```bash
164
+ trivy image --format json -o trivy.json nginx:latest
165
+ semgrep --config=auto --json --output semgrep.json .
166
+ poutine scan ./repo --format json --output poutine.json
167
+ zizmor scan ./repo --output zizmor.json --format json
168
+ ```
169
+
170
+ ### Step 2 — Merge Findings with the CLI
171
+ ```bash
172
+ devsecops-radar --trivy trivy.json --semgrep semgrep.json --poutine poutine.json --zizmor zizmor.json
173
+ ```
174
+ This produces a single `findings.json` file with all findings merged and normalised.
175
+
176
+ ### Step 3 — View the Dashboard
177
+ ```bash
178
+ devsecops-radar-web
179
+ ```
180
+ The dashboard shows:
181
+ * **Severity Breakdown** — Doughnut chart of CRITICAL, HIGH, MEDIUM, LOW counts
182
+ * **Trend Over Time** — Line chart showing how severity counts evolve across scans
183
+ * **Pipeline Security** — Dedicated Poutine + Zizmor statistics card
184
+ * **Attack Path Graph** — Interactive D3.js force graph (when AI analysis is enabled)
185
+ * **Executive Summary** — Risk score and AI‑generated summary
186
+ * **Findings Table** — Searchable, filterable table of all findings
187
+
188
+ ### Step 4 — Enable AI Analysis (Optional)
189
+ ```bash
190
+ ollama pull llama3.2:latest
191
+ devsecops-radar --trivy trivy.json --analyze
192
+ devsecops-radar-web
193
+ ```
194
+ The LLM generates `findings_ai_summary.json` containing:
195
+ * `executive_summary`, `risk_score`
196
+ * `attack_paths` with MITRE ATT&CK tactics
197
+ * `top_remediations` (some with `fix_diff`)
198
+ * `false_positives_likely`
199
+
200
+ ### Step 5 — Auto‑Remediation
201
+ ```bash
202
+ devsecops-radar --trivy trivy.json --analyze --fix
203
+ ```
204
+ The tool will apply AI‑suggested fixes, create a new git branch `auto-fix`, and push it for review.
205
+
206
+ ### Step 6 — Policy Enforcement
207
+ Create a `policy.json` file:
208
+ ```json
209
+ {
210
+ "max_critical": 5,
211
+ "on_violation": "fail"
212
+ }
213
+ ```
214
+
215
+ ```bash
216
+ devsecops-radar --trivy trivy.json --policy policy.json
217
+ ```
218
+ If critical findings exceed 5, the command exits with code 1 — suitable for CI/CD gates.
219
+
220
+ ### Step 7 — Generate Compliance Reports
221
+ ```bash
222
+ devsecops-radar --trivy trivy.json --analyze --compliance CIS --report cis-report.pdf
223
+ ```
224
+ A PDF report is created with an executive summary, risk score, findings table, and compliance mapping.
225
+
226
+ ---
227
+
228
+ ## 📋 Complete Command Reference
229
+
230
+ ### `devsecops-radar` — CLI Flags
231
+
232
+ | Flag | Description | Example |
233
+ | :--- | :--- | :--- |
234
+ | `--trivy` | Trivy JSON file or image name | `--trivy results.json` or `--trivy nginx:latest` |
235
+ | `--semgrep` | Semgrep JSON file or directory | `--semgrep results.json` or `--semgrep ./src` |
236
+ | `--poutine` | Poutine JSON file or repo path | `--poutine results.json` or `--poutine ./repo` |
237
+ | `--zizmor` | Zizmor JSON file or repo path | `--zizmor results.json` or `--zizmor ./repo` |
238
+ | `--rules` | Directory with custom JSON rule files | `--rules ~/my-security-rules/` |
239
+ | `--policy` | Policy JSON file for gating | `--policy policy.json` |
240
+ | `--analyze` | Enable LLM analysis (Ollama required) | `--analyze` |
241
+ | `--llm-backend` | `ollama` (default) or `litellm` | `--llm-backend litellm` |
242
+ | `--llm-model` | Model name | `--llm-model gpt-4o-mini` |
243
+ | `--fix` | Auto‑apply AI‑suggested fixes | `--fix` |
244
+ | `--topology` | Path to topology JSON file | `--topology topology.json` |
245
+ | `--compliance` | Framework: `CIS`, `PCI-DSS`, `ISO27001` | `--compliance CIS` |
246
+ | `--report` | Generate PDF report (output filename) | `--report security_report.pdf` |
247
+ | `--output` | Output JSON file (default: findings.json) | `--output merged.json` |
248
+
249
+ ### `devsecops-radar-web` — Web Server
250
+
251
+ ```bash
252
+ devsecops-radar-web # Launch on http://localhost:8080
253
+ FINDINGS_FILE=my.json devsecops-radar-web # Use a custom findings file
254
+ PIPELINE_API_KEY=secret devsecops-radar-web # Enable API authentication
255
+ ```
256
+
257
+ ### Usage Examples
258
+
259
+ ```bash
260
+ # Merge multiple scanner outputs
261
+ devsecops-radar --trivy trivy_scan.json --semgrep semgrep_scan.json
262
+
263
+ # Scan directly (if tools are installed)
264
+ devsecops-radar --trivy nginx:latest --semgrep ./src --poutine ./repo
265
+
266
+ # Merge built‑in scanners with custom rules
267
+ devsecops-radar --trivy trivy_scan.json --rules ~/my-security-rules/
268
+
269
+ # Enable AI analysis (Ollama must be running)
270
+ ollama pull llama3.2:latest
271
+ devsecops-radar --trivy trivy_scan.json --semgrep semgrep_scan.json --analyze
272
+
273
+ # Use OpenAI via LiteLLM
274
+ export OPENAI_API_KEY=sk-...
275
+ devsecops-radar --trivy trivy_scan.json --analyze --llm-backend litellm --llm-model gpt-4o-mini
276
+
277
+ # Build scan history and view trends
278
+ devsecops-radar --trivy sample_trivy.json --semgrep sample_semgrep.json
279
+ devsecops-radar --trivy sample_trivy.json --poutine sample_poutine.json
280
+ devsecops-radar-web # Trend chart now shows multiple data points
281
+ ```
282
+
283
+ ---
284
+
285
+ ## ✨ Core Capabilities
286
+
287
+ ### 🔌 Multi‑Scanner Plugin Architecture
288
+ Built‑in support for four scanners with a real plugin system based on `ScannerPlugin` abstract class. Third‑party scanners can be installed as separate packages and discovered automatically via Python entry points.
289
+
290
+ | Scanner | What It Scans | Flag |
291
+ | :--- | :--- | :--- |
292
+ | **Trivy** | Container images & dependencies | `--trivy` |
293
+ | **Semgrep** | Static Code Analysis (SAST) | `--semgrep` |
294
+ | **Poutine** | GitLab CI/CD configuration security | `--poutine` |
295
+ | **Zizmor** | GitHub Actions workflow security | `--zizmor` |
296
+
297
+ ### 🧩 Hybrid RuleFusion Engine
298
+ * **Offline** — Load custom JSON rules from any local directory (`--rules ~/my-rules/`)
299
+ * **Online** — Pull community‑curated rules with `--update-rules`
300
+ * Auto‑detects Trivy, Semgrep, Poutine, Zizmor, and plain‑list formats
301
+ * Policy evaluation built directly into the engine
302
+
303
+ ### 🧠 LLM‑Powered Analysis
304
+ * Ollama (local, offline) and LiteLLM (OpenAI, Anthropic, etc.) support
305
+ * Engineered few‑shot prompts with structured JSON output
306
+ * Token‑aware finding selection for large datasets
307
+ * Produces executive summaries, risk scores, attack paths with MITRE ATT&CK mapping, and remediation guidance
308
+
309
+ ### 🕸️ Attack Path Visualization
310
+ Interactive D3.js force graph showing how separate vulnerabilities can be chained into an attack scenario. Accepts a topology file to map findings onto your actual infrastructure.
311
+
312
+ ### 🛡️ Policy‑as‑Code
313
+ Define security gates as JSON:
314
+ ```json
315
+ {
316
+ "max_critical": 5,
317
+ "on_violation": "fail"
318
+ }
319
+ ```
320
+
321
+ ### 🛠️ Auto‑Remediation
322
+ AI‑suggested fixes are applied automatically. The tool creates a new git branch and pushes it for review.
323
+
324
+ ### 📊 Compliance Reports
325
+ Generate PDF reports with executive summary, risk score, findings table, and mapping to CIS, PCI‑DSS, or ISO 27001 controls.
326
+
327
+ ### 📈 Scan History & Trends
328
+ SQLite‑backed (with SQLAlchemy ORM) history with trend line chart and scan diff API.
329
+
330
+ ---
331
+
332
+ ## 🏗️ Architecture
333
+
334
+ ```text
335
+ devsecops_radar/
336
+ ├── cli/ # CLI entry point — plugin discovery, policy, remediation
337
+ ├── core/ # RuleFusion engine, DB (SQLAlchemy), LLM analysers
338
+ ├── scanners/ # Pluggable scanner classes (extend ScannerPlugin)
339
+ ├── plugins/ # ScannerPlugin abstract base class
340
+ └── web/ # Flask dashboard (modular Blueprints)
341
+ ├── dashboard/ # Main dashboard routes & embedded HTML
342
+ ├── attack_paths/
343
+ ├── topology/
344
+ ├── summary/
345
+ └── sentry/ # Live webhook agent for CI/CD
346
+ ```
347
+
348
+ ---
349
+
350
+ ## 🔒 Security
351
+
352
+ * **Input validation** — All scanner targets are sanitised against command injection.
353
+ * **Offline‑first** — No data leaves your network.
354
+ * **LLM privacy** — Ollama runs locally; optional LiteLLM for cloud models.
355
+ * **API authentication** — Optional API key for dashboard access.
356
+ * **Non‑root Docker** — Container runs as unprivileged user.
357
+ * **Policy‑as‑Code** — Enforce gates before deployment.
358
+
359
+ ---
360
+
361
+ ## 🤖 GitHub Action
362
+
363
+ ```yaml
364
+ - name: Pipeline Sentinel
365
+ uses: Mehrdoost/devsecops-radar/action@main
366
+ with:
367
+ trivy_report: trivy-results.json
368
+ semgrep_report: semgrep-results.json
369
+ poutine_report: poutine-results.json
370
+ zizmor_report: zizmor-results.json
371
+ ```
372
+ *The action merges findings, creates a job summary, and outputs CRITICAL/HIGH counts.*
373
+
374
+ ---
375
+
376
+ ## 🤝 Contributing
377
+
378
+ Pull requests and issues are warmly welcome!
379
+ If you would like to integrate a new scanner, open an issue with a sample of its JSON output.
380
+ For permanent scanner plugins, extend the `ScannerPlugin` class and register it via entry points.
381
+
382
+ ---
383
+
384
+ ## 👨‍💻 Author
385
+
386
+ **Mehrdoost**
387
+
388
+ [![GitHub](https://img.shields.io/badge/GitHub-Mehrdoost-181717?logo=github)](https://github.com/Mehrdoost)
389
+
390
+ ---
391
+
392
+ ## 📜 License
393
+
394
+ MIT — see [LICENSE](LICENSE).
395
+
396
+ <div align="center">
397
+ ⭐ If this project helps your team ship safer software, drop a star — it makes a real difference.
398
+ </div>