devsecops-radar 0.2.7__tar.gz → 0.3.0__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 (54) hide show
  1. {devsecops_radar-0.2.7/devsecops_radar.egg-info → devsecops_radar-0.3.0}/PKG-INFO +4 -4
  2. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/README.md +4 -4
  3. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/dashboard/routes.py +10 -0
  4. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/summary/routes.py +15 -0
  5. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0/devsecops_radar.egg-info}/PKG-INFO +4 -4
  6. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/pyproject.toml +1 -1
  7. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/LICENSE +0 -0
  8. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/MANIFEST.in +0 -0
  9. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/__init__.py +0 -0
  10. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/cli/__init__.py +0 -0
  11. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/cli/scanner.py +0 -0
  12. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/__init__.py +0 -0
  13. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/analyzer.py +0 -0
  14. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/attack_simulation.py +0 -0
  15. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/database.py +0 -0
  16. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/models.py +0 -0
  17. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/parser.py +0 -0
  18. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/rag.py +0 -0
  19. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/remediation.py +0 -0
  20. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/reporting.py +0 -0
  21. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/rule_fusion.py +0 -0
  22. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/sbom.py +0 -0
  23. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/core/valuation.py +0 -0
  24. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/plugins/__init__.py +0 -0
  25. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/scanners/adapter.py +0 -0
  26. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/scanners/base.py +0 -0
  27. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/scanners/gitleaks.py +0 -0
  28. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/scanners/poutine.py +0 -0
  29. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/scanners/semgrep.py +0 -0
  30. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/scanners/trivy.py +0 -0
  31. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/scanners/zizmor.py +0 -0
  32. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/__init__.py +0 -0
  33. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/app.py +0 -0
  34. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/attack_paths/__init__.py +0 -0
  35. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/attack_paths/routes.py +0 -0
  36. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/dashboard/__init__.py +0 -0
  37. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/sentry/routes.py +0 -0
  38. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/static/css/bootstrap.min.css +0 -0
  39. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/static/css/style.css +0 -0
  40. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/static/js/bootstrap.bundle.min.js +0 -0
  41. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/static/js/chart.umd.min.js +0 -0
  42. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/static/js/dashboard.js +0 -0
  43. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/summary/__init__.py +0 -0
  44. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/templates/index.html +0 -0
  45. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/topology/__init__.py +0 -0
  46. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar/web/topology/routes.py +0 -0
  47. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar.egg-info/SOURCES.txt +0 -0
  48. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar.egg-info/dependency_links.txt +0 -0
  49. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar.egg-info/entry_points.txt +0 -0
  50. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar.egg-info/requires.txt +0 -0
  51. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/devsecops_radar.egg-info/top_level.txt +0 -0
  52. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/setup.cfg +0 -0
  53. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/tests/test_cli.py +0 -0
  54. {devsecops_radar-0.2.7 → devsecops_radar-0.3.0}/tests/test_scanners.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsecops-radar
3
- Version: 0.2.7
3
+ Version: 0.3.0
4
4
  Summary: Unified CI/CD Security Dashboard — Pipeline Sentinel
5
5
  Author-email: Mehrdoost <70381337+Mehrdoost@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -107,8 +107,8 @@ Pipeline Sentinel is designed to be **flexible** — you decide where it fits be
107
107
  [Gitleaks scan] ┘
108
108
  ```
109
109
 
110
- > **📌 Diagram Placeholder:** Add your network flow diagram here as `docs/network_flow.png`.
111
- > `![Network Flow Diagram](docs/network_flow.png)`
110
+ > **📌 Diagram Placeholder:**
111
+ ![Network Flow Diagram](docs/architecture.png)
112
112
 
113
113
  ---
114
114
 
@@ -389,7 +389,7 @@ devsecops_radar/
389
389
  ```
390
390
 
391
391
  > **📌 Diagram Placeholder:**
392
- > `![Architecture Diagram](docs/architecture.png)`
392
+ ![Architecture Diagram](docs/architecture.png)
393
393
 
394
394
  ---
395
395
 
@@ -81,8 +81,8 @@ Pipeline Sentinel is designed to be **flexible** — you decide where it fits be
81
81
  [Gitleaks scan] ┘
82
82
  ```
83
83
 
84
- > **📌 Diagram Placeholder:** Add your network flow diagram here as `docs/network_flow.png`.
85
- > `![Network Flow Diagram](docs/network_flow.png)`
84
+ > **📌 Diagram Placeholder:**
85
+ ![Network Flow Diagram](docs/architecture.png)
86
86
 
87
87
  ---
88
88
 
@@ -363,7 +363,7 @@ devsecops_radar/
363
363
  ```
364
364
 
365
365
  > **📌 Diagram Placeholder:**
366
- > `![Architecture Diagram](docs/architecture.png)`
366
+ ![Architecture Diagram](docs/architecture.png)
367
367
 
368
368
  ---
369
369
 
@@ -440,4 +440,4 @@ MIT — see [LICENSE](LICENSE).
440
440
 
441
441
  <div align="center">
442
442
  ⭐ If this project helps your team ship safer software, drop a star — it makes a real difference.
443
- </div>
443
+ </div>
@@ -221,11 +221,14 @@ DASHBOARD_HTML = r"""
221
221
  renderTable(filtered);
222
222
  }
223
223
 
224
+ // ✅ FIX: use data.items for the array, and use allFindings for charts & stats
224
225
  fetch('/api/findings', { headers: getHeaders() })
225
226
  .then(res => res.json())
226
227
  .then(data => {
227
228
  allFindings = data.items;
228
229
  renderTable(allFindings);
230
+
231
+ // Doughnut chart counts
229
232
  const counts = {CRITICAL:0, HIGH:0, MEDIUM:0, LOW:0};
230
233
  allFindings.forEach(f => {
231
234
  const sev = f.severity.toUpperCase();
@@ -242,6 +245,8 @@ DASHBOARD_HTML = r"""
242
245
  },
243
246
  options: { plugins: { legend: { labels: { color: 'white' } } } }
244
247
  });
248
+
249
+ // Pipeline stats (Poutine + Zizmor)
245
250
  const pipeline = allFindings.filter(f => f.tool === 'Poutine' || f.tool === 'Zizmor');
246
251
  const pCounts = {CRITICAL:0, HIGH:0, MEDIUM:0, LOW:0};
247
252
  pipeline.forEach(f => {
@@ -252,6 +257,8 @@ DASHBOARD_HTML = r"""
252
257
  document.getElementById('pipeline-high').textContent = pCounts.HIGH;
253
258
  document.getElementById('pipeline-medium').textContent = pCounts.MEDIUM;
254
259
  document.getElementById('pipeline-low').textContent = pCounts.LOW;
260
+
261
+ // Attach filter events
255
262
  document.getElementById('searchInput').addEventListener('input', applyFilters);
256
263
  document.getElementById('toolFilter').addEventListener('change', applyFilters);
257
264
  document.getElementById('severityFilter').addEventListener('change', applyFilters);
@@ -290,6 +297,8 @@ DASHBOARD_HTML = r"""
290
297
  }
291
298
  if (!data.nodes || data.nodes.length === 0) return;
292
299
  const container = document.getElementById('attack-graph');
300
+ // ✅ Clean previous SVG before drawing new one
301
+ container.innerHTML = '';
293
302
  const width = container.clientWidth;
294
303
  const height = container.clientHeight;
295
304
  const svg = d3.select('#attack-graph')
@@ -372,6 +381,7 @@ DASHBOARD_HTML = r"""
372
381
  const nodes = topo.servers.map(s => ({ id: s.name, group: s.ip }));
373
382
  const links = topo.connections.map(c => ({ source: c.source, target: c.target, label: c.protocol }));
374
383
  const container = document.getElementById('topology-graph');
384
+ container.innerHTML = '';
375
385
  const width = container.clientWidth;
376
386
  const height = container.clientHeight;
377
387
  const svg = d3.select('#topology-graph')
@@ -1,3 +1,18 @@
1
+ from flask import Blueprint, jsonify
2
+ import json
3
+ import os
4
+
5
+ summary_bp = Blueprint('summary', __name__)
6
+
7
+ AI_SUMMARY_FILE = os.environ.get('AI_SUMMARY_FILE', 'findings_ai_summary.json')
8
+
9
+ @summary_bp.route('/api/summary')
10
+ def api_summary():
11
+ if os.path.exists(AI_SUMMARY_FILE):
12
+ with open(AI_SUMMARY_FILE) as f:
13
+ return jsonify(json.load(f))
14
+ return jsonify({})
15
+
1
16
  @summary_bp.route('/badge/<int:scan_id>.svg')
2
17
  def security_badge(scan_id):
3
18
  from devsecops_radar.core.database import get_scan_by_id
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devsecops-radar
3
- Version: 0.2.7
3
+ Version: 0.3.0
4
4
  Summary: Unified CI/CD Security Dashboard — Pipeline Sentinel
5
5
  Author-email: Mehrdoost <70381337+Mehrdoost@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -107,8 +107,8 @@ Pipeline Sentinel is designed to be **flexible** — you decide where it fits be
107
107
  [Gitleaks scan] ┘
108
108
  ```
109
109
 
110
- > **📌 Diagram Placeholder:** Add your network flow diagram here as `docs/network_flow.png`.
111
- > `![Network Flow Diagram](docs/network_flow.png)`
110
+ > **📌 Diagram Placeholder:**
111
+ ![Network Flow Diagram](docs/architecture.png)
112
112
 
113
113
  ---
114
114
 
@@ -389,7 +389,7 @@ devsecops_radar/
389
389
  ```
390
390
 
391
391
  > **📌 Diagram Placeholder:**
392
- > `![Architecture Diagram](docs/architecture.png)`
392
+ ![Architecture Diagram](docs/architecture.png)
393
393
 
394
394
  ---
395
395
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devsecops-radar"
7
- version = "0.2.7"
7
+ version = "0.3.0"
8
8
  description = "Unified CI/CD Security Dashboard — Pipeline Sentinel"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes