sec-report-kit 0.2.2__tar.gz → 0.2.4__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 (127) hide show
  1. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/.gitignore +10 -0
  2. sec_report_kit-0.2.4/CHANGELOG.md +46 -0
  3. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/PKG-INFO +87 -4
  4. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/README.md +84 -1
  5. sec_report_kit-0.2.4/check_assets.py +63 -0
  6. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/pyproject.toml +3 -3
  7. sec_report_kit-0.2.4/requirements.txt +84 -0
  8. sec_report_kit-0.2.4/scripts/download_safety_db.bat +13 -0
  9. sec_report_kit-0.2.4/scripts/download_safety_db.py +125 -0
  10. sec_report_kit-0.2.4/scripts/download_safety_db.sh +13 -0
  11. sec_report_kit-0.2.4/scripts/install_external_clis.py +342 -0
  12. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/install_tools.bat +12 -3
  13. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/install_tools.sh +2 -2
  14. sec_report_kit-0.2.4/scripts/render_safety_html.bat +27 -0
  15. sec_report_kit-0.2.4/scripts/render_safety_html.sh +36 -0
  16. sec_report_kit-0.2.4/scripts/run_codeql.bat +81 -0
  17. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_codeql.sh +7 -0
  18. sec_report_kit-0.2.4/scripts/run_osv_scanner.bat +80 -0
  19. sec_report_kit-0.2.4/scripts/run_safety.bat +60 -0
  20. sec_report_kit-0.2.4/scripts/run_safety.sh +64 -0
  21. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_tfsec.bat +13 -3
  22. sec_report_kit-0.2.4/scripts/run_trufflehog.bat +53 -0
  23. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_unit_tests_with_coverage.bat +2 -0
  24. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_unit_tests_with_coverage.sh +3 -0
  25. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/cli.py +14 -1
  26. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/mcp/server.py +4 -1
  27. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/__init__.py +14 -2
  28. sec_report_kit-0.2.4/src/sec_report_kit/parsers/safety.py +71 -0
  29. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/tests/test_cli.py +42 -0
  30. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/tests/test_mcp_server.py +23 -0
  31. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/tests/test_parsers.py +39 -0
  32. sec_report_kit-0.2.2/class_index.html +0 -341
  33. sec_report_kit-0.2.2/coverage_html_cb_188fc9a4.js +0 -735
  34. sec_report_kit-0.2.2/favicon_32_cb_c827f16f.png +0 -0
  35. sec_report_kit-0.2.2/function_index.html +0 -821
  36. sec_report_kit-0.2.2/index.html +0 -306
  37. sec_report_kit-0.2.2/keybd_closed_cb_900cfef5.png +0 -0
  38. sec_report_kit-0.2.2/scripts/install_external_clis.py +0 -214
  39. sec_report_kit-0.2.2/scripts/run_codeql.bat +0 -30
  40. sec_report_kit-0.2.2/scripts/run_osv_scanner.bat +0 -27
  41. sec_report_kit-0.2.2/scripts/run_trufflehog.bat +0 -27
  42. sec_report_kit-0.2.2/status.json +0 -1
  43. sec_report_kit-0.2.2/style_cb_5c747636.css +0 -389
  44. sec_report_kit-0.2.2/z_04615a1dd1ce4db0___init___py.html +0 -160
  45. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_bandit_py.html +0 -132
  46. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_checkov_py.html +0 -126
  47. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_codeql_py.html +0 -173
  48. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_gitleaks_py.html +0 -139
  49. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_osv_scanner_py.html +0 -157
  50. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_pip_audit_py.html +0 -161
  51. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_semgrep_py.html +0 -139
  52. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_tfsec_py.html +0 -132
  53. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_trivy_py.html +0 -123
  54. sec_report_kit-0.2.2/z_04615a1dd1ce4db0_trufflehog_py.html +0 -154
  55. sec_report_kit-0.2.2/z_513b94261226dc0a___init___py.html +0 -98
  56. sec_report_kit-0.2.2/z_513b94261226dc0a_normalize_py.html +0 -113
  57. sec_report_kit-0.2.2/z_513b94261226dc0a_summarize_py.html +0 -121
  58. sec_report_kit-0.2.2/z_79d49abff220d1e3___init___py.html +0 -101
  59. sec_report_kit-0.2.2/z_79d49abff220d1e3___main___py.html +0 -102
  60. sec_report_kit-0.2.2/z_79d49abff220d1e3_cli_py.html +0 -317
  61. sec_report_kit-0.2.2/z_79d49abff220d1e3_models_py.html +0 -113
  62. sec_report_kit-0.2.2/z_b5cb2d0622dcf19f___init___py.html +0 -98
  63. sec_report_kit-0.2.2/z_b5cb2d0622dcf19f_html_renderer_py.html +0 -311
  64. sec_report_kit-0.2.2/z_dc88a0f48bfec113___init___py.html +0 -98
  65. sec_report_kit-0.2.2/z_dc88a0f48bfec113_server_py.html +0 -191
  66. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/.gitattributes +0 -0
  67. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/.github/workflows/pip-audit.yml +0 -0
  68. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/.github/workflows/publish-pypi.yml +0 -0
  69. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/.github/workflows/publish-testpypi.yml +0 -0
  70. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/.github/workflows/trivy-fs-audit.yml +0 -0
  71. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/.github/workflows/unit-test-coverage-gate.yml +0 -0
  72. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/bandit-gaps-vs-sast-open-source-tools.md +0 -0
  73. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_bandit_html.bat +0 -0
  74. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_bandit_html.sh +0 -0
  75. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_checkov_html.bat +0 -0
  76. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_checkov_html.sh +0 -0
  77. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_codeql_html.bat +0 -0
  78. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_codeql_html.sh +0 -0
  79. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_gitleaks_html.bat +0 -0
  80. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_gitleaks_html.sh +0 -0
  81. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_osv_scanner_html.bat +0 -0
  82. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_osv_scanner_html.sh +0 -0
  83. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_pip_audit_html.bat +0 -0
  84. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_pip_audit_html.sh +0 -0
  85. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_semgrep_html.bat +0 -0
  86. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_semgrep_html.sh +0 -0
  87. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_tfsec_html.bat +0 -0
  88. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_tfsec_html.sh +0 -0
  89. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_trivy_html.bat +0 -0
  90. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_trivy_html.sh +0 -0
  91. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_trufflehog_html.bat +0 -0
  92. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/render_trufflehog_html.sh +0 -0
  93. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_bandit.bat +0 -0
  94. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_bandit.sh +0 -0
  95. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_checkov.bat +0 -0
  96. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_checkov.sh +0 -0
  97. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_gitleaks.bat +0 -0
  98. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_gitleaks.sh +0 -0
  99. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_osv_scanner.sh +0 -0
  100. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_pip_audit.bat +0 -0
  101. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_pip_audit.sh +0 -0
  102. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_semgrep.bat +0 -0
  103. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_semgrep.sh +0 -0
  104. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_tfsec.sh +0 -0
  105. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_trivy.bat +0 -0
  106. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_trivy.sh +0 -0
  107. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/scripts/run_trufflehog.sh +0 -0
  108. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/__init__.py +0 -0
  109. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/__main__.py +0 -0
  110. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/mcp/__init__.py +0 -0
  111. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/models.py +0 -0
  112. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/bandit.py +0 -0
  113. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/checkov.py +0 -0
  114. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/codeql.py +0 -0
  115. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/gitleaks.py +0 -0
  116. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/osv_scanner.py +0 -0
  117. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/pip_audit.py +0 -0
  118. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/semgrep.py +0 -0
  119. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/tfsec.py +0 -0
  120. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/trivy.py +0 -0
  121. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/parsers/trufflehog.py +0 -0
  122. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/report/__init__.py +0 -0
  123. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/report/html_renderer.py +0 -0
  124. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/services/__init__.py +0 -0
  125. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/services/normalize.py +0 -0
  126. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/src/sec_report_kit/services/summarize.py +0 -0
  127. {sec_report_kit-0.2.2 → sec_report_kit-0.2.4}/tests/test_html_renderer.py +0 -0
@@ -36,6 +36,15 @@ pip-delete-this-directory.txt
36
36
 
37
37
  # Unit test / coverage reports
38
38
  htmlcov/
39
+ class_index.html
40
+ function_index.html
41
+ index.html
42
+ status.json
43
+ coverage_html_*.js
44
+ favicon_32_*.png
45
+ keybd_closed_*.png
46
+ style_*.css
47
+ z_*.html
39
48
  .tox/
40
49
  .nox/
41
50
  .coverage
@@ -84,3 +93,4 @@ data/
84
93
  logs/
85
94
  security_reports/
86
95
  .tools/
96
+ codeql-db/
@@ -0,0 +1,46 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ ## 0.2.4 - 2026-05-14
6
+
7
+ ### Added
8
+ - `scripts/install_external_clis.py` now supports `--tool` for targeted installs.
9
+ - `scripts/install_external_clis.py` now supports `--force` to re-download tools even when already installed.
10
+ - `README.md` now documents external CLI installer options and usage examples.
11
+
12
+ ### Changed
13
+ - External CLI installer now skips already-installed tools by default.
14
+ - CodeQL install handling on Windows now uses staged extraction and merge to avoid directory lock errors during reinstall.
15
+ - `scripts/run_osv_scanner.bat` now auto-generates `requirements.txt` from installed packages when no supported lockfile is present.
16
+
17
+ ### Fixed
18
+ - `scripts/run_codeql.bat` now repairs incomplete local CodeQL installs and validates SARIF output existence.
19
+ - `scripts/run_codeql.sh` now validates SARIF output existence after analysis.
20
+ - `scripts/run_trufflehog.bat` now writes scanner output via temp files to avoid self-scan file locking.
21
+ - `scripts/run_trufflehog.bat` now writes `[]` when no findings are present.
22
+
23
+ ## 0.2.3 - 2026-05-13
24
+
25
+ ### Added
26
+ - Safety CLI parser support and HTML rendering flow.
27
+ - New CLI command: `srk render safety`.
28
+ - MCP support for `source_type="safety"`.
29
+ - Helper scripts for Safety scan and render:
30
+ - `scripts/run_safety.sh`
31
+ - `scripts/run_safety.bat`
32
+ - `scripts/render_safety_html.sh`
33
+ - `scripts/render_safety_html.bat`
34
+ - Offline Safety DB download helpers:
35
+ - `scripts/download_safety_db.py`
36
+ - `scripts/download_safety_db.sh`
37
+ - `scripts/download_safety_db.bat`
38
+
39
+ ### Changed
40
+ - Auto-detection now recognizes Safety JSON payloads.
41
+ - Tool installation scripts now install Safety CLI in the app venv.
42
+ - README updated with Safety usage and offline/local DB workflow guidance.
43
+
44
+ ### Fixed
45
+ - Safety run scripts now avoid false success when network failures occur.
46
+ - JSON output validation improved for Safety execution paths.
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sec-report-kit
3
- Version: 0.2.2
4
- Summary: Generate HTML security reports from Trivy, pip-audit, Bandit, and Gitleaks JSON
3
+ Version: 0.2.4
4
+ Summary: Generate HTML security reports from Trivy, pip-audit, Safety, Bandit, and Gitleaks JSON
5
5
  Author: Ravi Konduru
6
6
  License: MIT
7
- Keywords: cli,mcp,pip-audit,report,security,trivy
7
+ Keywords: cli,mcp,pip-audit,report,safety,security,trivy
8
8
  Classifier: Development Status :: 3 - Alpha
9
9
  Classifier: Intended Audience :: Developers
10
10
  Classifier: License :: OSI Approved :: MIT License
@@ -29,10 +29,13 @@ Description-Content-Type: text/markdown
29
29
 
30
30
  Generate HTML vulnerability reports from multiple security tools (SAST, SCA, IaC, and secrets) with a CLI and MCP server.
31
31
 
32
+ Release history: see `CHANGELOG.md`.
33
+
32
34
  Supported source types:
33
35
 
34
36
  - `trivy`
35
37
  - `pip-audit`
38
+ - `safety`
36
39
  - `bandit`
37
40
  - `gitleaks`
38
41
  - `semgrep`
@@ -73,6 +76,12 @@ Render pip-audit JSON:
73
76
  srk render pip-audit --input pip-audit.json --output security_reports/report-pip-audit.html --target requirements.txt
74
77
  ```
75
78
 
79
+ Render Safety JSON:
80
+
81
+ ```bash
82
+ srk render safety --input security_reports/safety.json --output security_reports/report-safety.html --target requirements.txt
83
+ ```
84
+
76
85
  ## Helper Scripts (bat/sh)
77
86
 
78
87
  Cross-platform helper scripts are available in `scripts/`.
@@ -91,6 +100,31 @@ scripts\install_tools.bat
91
100
 
92
101
  After cloning on a new machine, run the install script above to recreate the local `.tools/` directory and install required external CLI binaries (`codeql`, `tfsec`, `gitleaks`, `trufflehog`, `osv-scanner`) alongside Python dependencies. The `.tools/` folder is intentionally not committed to git.
93
102
 
103
+ Install or update external CLI binaries directly:
104
+
105
+ ```bash
106
+ python scripts/install_external_clis.py --repo-root .
107
+ ```
108
+
109
+ Default behavior skips tools that are already installed locally.
110
+
111
+ Force re-download/reinstall for all supported external tools:
112
+
113
+ ```bash
114
+ python scripts/install_external_clis.py --repo-root . --force
115
+ ```
116
+
117
+ Install only selected tool(s) with `--tool` (can be repeated or comma-separated):
118
+
119
+ ```bash
120
+ python scripts/install_external_clis.py --repo-root . --tool osv-scanner
121
+ python scripts/install_external_clis.py --repo-root . --tool tfsec --tool gitleaks --force
122
+ python scripts/install_external_clis.py --repo-root . --tool tfsec,gitleaks
123
+ ```
124
+
125
+ Supported `--tool` values: `codeql`, `tfsec`, `gitleaks`, `trufflehog`, `osv-scanner`.
126
+ For convenience, `ocs-scanner` is accepted as an alias for `osv-scanner`.
127
+
94
128
  Run all unit tests locally with coverage:
95
129
 
96
130
  ```bash
@@ -115,6 +149,39 @@ scripts\run_pip_audit.bat
115
149
  scripts\run_pip_audit.bat reports requirements.txt
116
150
  ```
117
151
 
152
+ Run Safety CLI and write JSON output:
153
+
154
+ ```bash
155
+ # Linux/macOS (optional args: <report_dir> <requirements_file>)
156
+ bash scripts/run_safety.sh
157
+ bash scripts/run_safety.sh security_reports requirements.txt
158
+
159
+ # Windows (optional args: <report_dir> <requirements_file>)
160
+ scripts\run_safety.bat
161
+ scripts\run_safety.bat security_reports requirements.txt
162
+ ```
163
+
164
+ > **Offline / local DB support**: Safety CLI requires network access by default. To enable offline scanning,
165
+ > download the vulnerability DB while online and cache it locally:
166
+ >
167
+ > ```bash
168
+ > # Linux/macOS — download once, reuse offline
169
+ > bash scripts/download_safety_db.sh
170
+ >
171
+ > # Windows
172
+ > scripts\download_safety_db.bat
173
+ > ```
174
+ >
175
+ > ```bash
176
+ > # Corporate/proxy environments with self-signed certificates
177
+ > bash scripts/download_safety_db.sh .tools/safety-db --no-verify-ssl
178
+ > scripts\download_safety_db.bat .tools\safety-db --no-verify-ssl
179
+ > ```
180
+ >
181
+ > The DB is saved to `.tools/safety-db/`. Both `run_safety.sh` and `run_safety.bat` automatically detect
182
+ > and use it on subsequent runs, skipping the network call. Re-run the download script periodically to
183
+ > refresh the DB with the latest vulnerabilities.
184
+
118
185
  Run Bandit and write JSON output:
119
186
 
120
187
  ```bash
@@ -139,6 +206,18 @@ scripts\render_pip_audit_html.bat
139
206
  scripts\render_pip_audit_html.bat reports requirements.txt
140
207
  ```
141
208
 
209
+ Convert Safety JSON report to HTML:
210
+
211
+ ```bash
212
+ # Linux/macOS (optional args: <report_dir> <target_name>)
213
+ bash scripts/render_safety_html.sh
214
+ bash scripts/render_safety_html.sh security_reports requirements.txt
215
+
216
+ # Windows (optional args: <report_dir> <target_name>)
217
+ scripts\render_safety_html.bat
218
+ scripts\render_safety_html.bat security_reports requirements.txt
219
+ ```
220
+
142
221
  These render helpers generate the HTML file and open it automatically in your default browser.
143
222
 
144
223
  Convert sample Trivy JSON report to HTML:
@@ -189,6 +268,7 @@ The table below reflects what is currently implemented in `scripts/`:
189
268
  | --- | --- | --- | --- |
190
269
  | Trivy | `run_trivy.(sh/bat)` | `render_trivy_html.(sh/bat)` | `security_reports/trivy-image-report-v1.0.21.json` |
191
270
  | pip-audit | `run_pip_audit.(sh/bat)` | `render_pip_audit_html.(sh/bat)` | `reports/pip-audit.json` |
271
+ | Safety | `run_safety.(sh/bat)` | `render_safety_html.(sh/bat)` | `security_reports/safety.json` |
192
272
  | Bandit | `run_bandit.(sh/bat)` | `render_bandit_html.(sh/bat)` | `security_reports/bandit.json` |
193
273
  | Gitleaks | `run_gitleaks.(sh/bat)` | `render_gitleaks_html.(sh/bat)` | `security_reports/gitleaks.json` |
194
274
  | Semgrep | `run_semgrep.(sh/bat)` | `render_semgrep_html.(sh/bat)` | `security_reports/semgrep.json` |
@@ -217,6 +297,7 @@ scripts\render_bandit_html.bat security_reports my-python-project
217
297
  ```bash
218
298
  # Linux/macOS
219
299
  bash scripts/run_trivy.sh security_reports alpine:latest
300
+ bash scripts/run_safety.sh security_reports requirements.txt
220
301
  bash scripts/run_gitleaks.sh security_reports .
221
302
  bash scripts/run_semgrep.sh security_reports .
222
303
  bash scripts/run_codeql.sh security_reports codeql-db codeql/python-queries
@@ -227,6 +308,7 @@ bash scripts/run_trufflehog.sh security_reports .
227
308
 
228
309
  # Windows
229
310
  scripts\run_trivy.bat security_reports alpine:latest
311
+ scripts\run_safety.bat security_reports requirements.txt
230
312
  scripts\run_gitleaks.bat security_reports .
231
313
  scripts\run_semgrep.bat security_reports .
232
314
  scripts\run_codeql.bat security_reports codeql-db codeql/python-queries
@@ -262,6 +344,7 @@ Manual CLI render examples:
262
344
  srk render semgrep --input security_reports/semgrep.json --output security_reports/semgrep-report.html --target my-repo
263
345
  srk render codeql --input security_reports/codeql.sarif.json --output security_reports/codeql-report.html --target my-repo
264
346
  srk render osv-scanner --input security_reports/osv-scanner.json --output security_reports/osv-scanner-report.html --target requirements.txt
347
+ srk render safety --input security_reports/safety.json --output security_reports/safety-report.html --target requirements.txt
265
348
  srk render checkov --input security_reports/checkov.json --output security_reports/checkov-report.html --target terraform
266
349
  srk render tfsec --input security_reports/tfsec.json --output security_reports/tfsec-report.html --target terraform
267
350
  srk render trufflehog --input security_reports/trufflehog.json --output security_reports/trufflehog-report.html --target my-repo
@@ -286,7 +369,7 @@ srk mcp serve --transport stdio
286
369
  | `render_report_from_json` | Parse JSON and render an HTML report to disk |
287
370
  | `validate_input` | Validate that a JSON file is parseable and return finding count |
288
371
 
289
- All tools accept `source_type` (`"trivy"`, `"pip-audit"`, `"bandit"`, `"gitleaks"`, `"semgrep"`, `"codeql"`, `"osv-scanner"`, `"checkov"`, `"tfsec"`, `"trufflehog"`, or `"auto"`) and `input_path` (absolute path to JSON file).
372
+ All tools accept `source_type` (`"trivy"`, `"pip-audit"`, `"safety"`, `"bandit"`, `"gitleaks"`, `"semgrep"`, `"codeql"`, `"osv-scanner"`, `"checkov"`, `"tfsec"`, `"trufflehog"`, or `"auto"`) and `input_path` (absolute path to JSON file).
290
373
 
291
374
  ---
292
375
 
@@ -2,10 +2,13 @@
2
2
 
3
3
  Generate HTML vulnerability reports from multiple security tools (SAST, SCA, IaC, and secrets) with a CLI and MCP server.
4
4
 
5
+ Release history: see `CHANGELOG.md`.
6
+
5
7
  Supported source types:
6
8
 
7
9
  - `trivy`
8
10
  - `pip-audit`
11
+ - `safety`
9
12
  - `bandit`
10
13
  - `gitleaks`
11
14
  - `semgrep`
@@ -46,6 +49,12 @@ Render pip-audit JSON:
46
49
  srk render pip-audit --input pip-audit.json --output security_reports/report-pip-audit.html --target requirements.txt
47
50
  ```
48
51
 
52
+ Render Safety JSON:
53
+
54
+ ```bash
55
+ srk render safety --input security_reports/safety.json --output security_reports/report-safety.html --target requirements.txt
56
+ ```
57
+
49
58
  ## Helper Scripts (bat/sh)
50
59
 
51
60
  Cross-platform helper scripts are available in `scripts/`.
@@ -64,6 +73,31 @@ scripts\install_tools.bat
64
73
 
65
74
  After cloning on a new machine, run the install script above to recreate the local `.tools/` directory and install required external CLI binaries (`codeql`, `tfsec`, `gitleaks`, `trufflehog`, `osv-scanner`) alongside Python dependencies. The `.tools/` folder is intentionally not committed to git.
66
75
 
76
+ Install or update external CLI binaries directly:
77
+
78
+ ```bash
79
+ python scripts/install_external_clis.py --repo-root .
80
+ ```
81
+
82
+ Default behavior skips tools that are already installed locally.
83
+
84
+ Force re-download/reinstall for all supported external tools:
85
+
86
+ ```bash
87
+ python scripts/install_external_clis.py --repo-root . --force
88
+ ```
89
+
90
+ Install only selected tool(s) with `--tool` (can be repeated or comma-separated):
91
+
92
+ ```bash
93
+ python scripts/install_external_clis.py --repo-root . --tool osv-scanner
94
+ python scripts/install_external_clis.py --repo-root . --tool tfsec --tool gitleaks --force
95
+ python scripts/install_external_clis.py --repo-root . --tool tfsec,gitleaks
96
+ ```
97
+
98
+ Supported `--tool` values: `codeql`, `tfsec`, `gitleaks`, `trufflehog`, `osv-scanner`.
99
+ For convenience, `ocs-scanner` is accepted as an alias for `osv-scanner`.
100
+
67
101
  Run all unit tests locally with coverage:
68
102
 
69
103
  ```bash
@@ -88,6 +122,39 @@ scripts\run_pip_audit.bat
88
122
  scripts\run_pip_audit.bat reports requirements.txt
89
123
  ```
90
124
 
125
+ Run Safety CLI and write JSON output:
126
+
127
+ ```bash
128
+ # Linux/macOS (optional args: <report_dir> <requirements_file>)
129
+ bash scripts/run_safety.sh
130
+ bash scripts/run_safety.sh security_reports requirements.txt
131
+
132
+ # Windows (optional args: <report_dir> <requirements_file>)
133
+ scripts\run_safety.bat
134
+ scripts\run_safety.bat security_reports requirements.txt
135
+ ```
136
+
137
+ > **Offline / local DB support**: Safety CLI requires network access by default. To enable offline scanning,
138
+ > download the vulnerability DB while online and cache it locally:
139
+ >
140
+ > ```bash
141
+ > # Linux/macOS — download once, reuse offline
142
+ > bash scripts/download_safety_db.sh
143
+ >
144
+ > # Windows
145
+ > scripts\download_safety_db.bat
146
+ > ```
147
+ >
148
+ > ```bash
149
+ > # Corporate/proxy environments with self-signed certificates
150
+ > bash scripts/download_safety_db.sh .tools/safety-db --no-verify-ssl
151
+ > scripts\download_safety_db.bat .tools\safety-db --no-verify-ssl
152
+ > ```
153
+ >
154
+ > The DB is saved to `.tools/safety-db/`. Both `run_safety.sh` and `run_safety.bat` automatically detect
155
+ > and use it on subsequent runs, skipping the network call. Re-run the download script periodically to
156
+ > refresh the DB with the latest vulnerabilities.
157
+
91
158
  Run Bandit and write JSON output:
92
159
 
93
160
  ```bash
@@ -112,6 +179,18 @@ scripts\render_pip_audit_html.bat
112
179
  scripts\render_pip_audit_html.bat reports requirements.txt
113
180
  ```
114
181
 
182
+ Convert Safety JSON report to HTML:
183
+
184
+ ```bash
185
+ # Linux/macOS (optional args: <report_dir> <target_name>)
186
+ bash scripts/render_safety_html.sh
187
+ bash scripts/render_safety_html.sh security_reports requirements.txt
188
+
189
+ # Windows (optional args: <report_dir> <target_name>)
190
+ scripts\render_safety_html.bat
191
+ scripts\render_safety_html.bat security_reports requirements.txt
192
+ ```
193
+
115
194
  These render helpers generate the HTML file and open it automatically in your default browser.
116
195
 
117
196
  Convert sample Trivy JSON report to HTML:
@@ -162,6 +241,7 @@ The table below reflects what is currently implemented in `scripts/`:
162
241
  | --- | --- | --- | --- |
163
242
  | Trivy | `run_trivy.(sh/bat)` | `render_trivy_html.(sh/bat)` | `security_reports/trivy-image-report-v1.0.21.json` |
164
243
  | pip-audit | `run_pip_audit.(sh/bat)` | `render_pip_audit_html.(sh/bat)` | `reports/pip-audit.json` |
244
+ | Safety | `run_safety.(sh/bat)` | `render_safety_html.(sh/bat)` | `security_reports/safety.json` |
165
245
  | Bandit | `run_bandit.(sh/bat)` | `render_bandit_html.(sh/bat)` | `security_reports/bandit.json` |
166
246
  | Gitleaks | `run_gitleaks.(sh/bat)` | `render_gitleaks_html.(sh/bat)` | `security_reports/gitleaks.json` |
167
247
  | Semgrep | `run_semgrep.(sh/bat)` | `render_semgrep_html.(sh/bat)` | `security_reports/semgrep.json` |
@@ -190,6 +270,7 @@ scripts\render_bandit_html.bat security_reports my-python-project
190
270
  ```bash
191
271
  # Linux/macOS
192
272
  bash scripts/run_trivy.sh security_reports alpine:latest
273
+ bash scripts/run_safety.sh security_reports requirements.txt
193
274
  bash scripts/run_gitleaks.sh security_reports .
194
275
  bash scripts/run_semgrep.sh security_reports .
195
276
  bash scripts/run_codeql.sh security_reports codeql-db codeql/python-queries
@@ -200,6 +281,7 @@ bash scripts/run_trufflehog.sh security_reports .
200
281
 
201
282
  # Windows
202
283
  scripts\run_trivy.bat security_reports alpine:latest
284
+ scripts\run_safety.bat security_reports requirements.txt
203
285
  scripts\run_gitleaks.bat security_reports .
204
286
  scripts\run_semgrep.bat security_reports .
205
287
  scripts\run_codeql.bat security_reports codeql-db codeql/python-queries
@@ -235,6 +317,7 @@ Manual CLI render examples:
235
317
  srk render semgrep --input security_reports/semgrep.json --output security_reports/semgrep-report.html --target my-repo
236
318
  srk render codeql --input security_reports/codeql.sarif.json --output security_reports/codeql-report.html --target my-repo
237
319
  srk render osv-scanner --input security_reports/osv-scanner.json --output security_reports/osv-scanner-report.html --target requirements.txt
320
+ srk render safety --input security_reports/safety.json --output security_reports/safety-report.html --target requirements.txt
238
321
  srk render checkov --input security_reports/checkov.json --output security_reports/checkov-report.html --target terraform
239
322
  srk render tfsec --input security_reports/tfsec.json --output security_reports/tfsec-report.html --target terraform
240
323
  srk render trufflehog --input security_reports/trufflehog.json --output security_reports/trufflehog-report.html --target my-repo
@@ -259,7 +342,7 @@ srk mcp serve --transport stdio
259
342
  | `render_report_from_json` | Parse JSON and render an HTML report to disk |
260
343
  | `validate_input` | Validate that a JSON file is parseable and return finding count |
261
344
 
262
- All tools accept `source_type` (`"trivy"`, `"pip-audit"`, `"bandit"`, `"gitleaks"`, `"semgrep"`, `"codeql"`, `"osv-scanner"`, `"checkov"`, `"tfsec"`, `"trufflehog"`, or `"auto"`) and `input_path` (absolute path to JSON file).
345
+ All tools accept `source_type` (`"trivy"`, `"pip-audit"`, `"safety"`, `"bandit"`, `"gitleaks"`, `"semgrep"`, `"codeql"`, `"osv-scanner"`, `"checkov"`, `"tfsec"`, `"trufflehog"`, or `"auto"`) and `input_path` (absolute path to JSON file).
263
346
 
264
347
  ---
265
348
 
@@ -0,0 +1,63 @@
1
+ import sys
2
+ import os
3
+ import json
4
+ import re
5
+ import urllib.request
6
+
7
+ tool_matrix = {
8
+ "codeql": {
9
+ "repo": "github/codeql-action",
10
+ "patterns": [r"codeql-bundle-win64\.tar\.gz$", r"codeql-bundle-win64\.zip$"],
11
+ },
12
+ "tfsec": {
13
+ "repo": "aquasecurity/tfsec",
14
+ "patterns": [r"tfsec-windows-amd64(?:\.exe)?$"],
15
+ },
16
+ "gitleaks": {
17
+ "repo": "gitleaks/gitleaks",
18
+ "patterns": [r"gitleaks_.*_windows_x64\.zip$"],
19
+ },
20
+ "trufflehog": {
21
+ "repo": "trufflesecurity/trufflehog",
22
+ "patterns": [r"trufflehog_.*_windows_amd64\.tar\.gz$", r"trufflehog_.*_windows_amd64\.zip$"],
23
+ },
24
+ "osv-scanner": {
25
+ "repo": "google/osv-scanner",
26
+ "patterns": [r"osv-scanner_.*_windows_amd64(?:\.exe)?(?:\.zip)?$", r"osv-scanner-windows-amd64(?:\.exe)?$"],
27
+ },
28
+ }
29
+
30
+ def check_tools():
31
+ for tool_name, cfg in tool_matrix.items():
32
+ repo = cfg["repo"]
33
+ patterns = cfg["patterns"]
34
+ try:
35
+ req = urllib.request.Request(
36
+ f"https://api.github.com/repos/{repo}/releases/latest",
37
+ headers={"Accept": "application/vnd.github+json", "User-Agent": "python-check-script"},
38
+ )
39
+ with urllib.request.urlopen(req, timeout=30) as resp:
40
+ release = json.load(resp)
41
+
42
+ assets = [a["name"] for a in release.get("assets", [])]
43
+ match_found = False
44
+ for pattern in patterns:
45
+ regex = re.compile(pattern)
46
+ for asset in assets:
47
+ if regex.search(asset):
48
+ print(f"{tool_name}: PASS (Matched asset: {asset})")
49
+ match_found = True
50
+ break
51
+ if match_found:
52
+ break
53
+
54
+ if not match_found:
55
+ print(f"{tool_name}: FAIL (No asset matched patterns)")
56
+ # Print available assets for debugging if call fails
57
+ # print(f" Available: {assets[:3]}...")
58
+
59
+ except Exception as e:
60
+ print(f"{tool_name}: FAIL (Error: {e})")
61
+
62
+ if __name__ == "__main__":
63
+ check_tools()
@@ -4,13 +4,13 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sec-report-kit"
7
- version = "0.2.2"
8
- description = "Generate HTML security reports from Trivy, pip-audit, Bandit, and Gitleaks JSON"
7
+ version = "0.2.4"
8
+ description = "Generate HTML security reports from Trivy, pip-audit, Safety, Bandit, and Gitleaks JSON"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
11
11
  license = { text = "MIT" }
12
12
  authors = [{ name = "Ravi Konduru" }]
13
- keywords = ["security", "trivy", "pip-audit", "mcp", "cli", "report"]
13
+ keywords = ["security", "trivy", "pip-audit", "safety", "mcp", "cli", "report"]
14
14
  classifiers = [
15
15
  "Development Status :: 3 - Alpha",
16
16
  "Intended Audience :: Developers",
@@ -0,0 +1,84 @@
1
+ annotated-doc==0.0.4
2
+ annotated-types==0.7.0
3
+ anyio==4.13.0
4
+ attrs==26.1.0
5
+ bandit==1.9.4
6
+ boolean.py==5.0
7
+ build==1.5.0
8
+ CacheControl==0.14.4
9
+ certifi==2026.4.22
10
+ cffi==2.0.0
11
+ charset-normalizer==3.4.7
12
+ click==8.3.3
13
+ colorama==0.4.6
14
+ coverage==7.14.0
15
+ cryptography==47.0.0
16
+ cyclonedx-python-lib==11.7.0
17
+ defusedxml==0.7.1
18
+ docutils==0.22.4
19
+ filelock==3.29.0
20
+ h11==0.16.0
21
+ httpcore==1.0.9
22
+ httpx==0.28.1
23
+ httpx-sse==0.4.3
24
+ id==1.6.1
25
+ idna==3.13
26
+ iniconfig==2.3.0
27
+ jaraco.classes==3.4.0
28
+ jaraco.context==6.1.2
29
+ jaraco.functools==4.4.0
30
+ jsonschema==4.26.0
31
+ jsonschema-specifications==2025.9.1
32
+ keyring==25.7.0
33
+ license-expression==30.4.4
34
+ markdown-it-py==4.0.0
35
+ mcp==1.27.0
36
+ mdurl==0.1.2
37
+ more-itertools==11.0.2
38
+ msgpack==1.1.2
39
+ nh3==0.3.5
40
+ packageurl-python==0.17.6
41
+ packaging==26.2
42
+ pip-api==0.0.34
43
+ pip-requirements-parser==32.0.1
44
+ pip_audit==2.10.0
45
+ platformdirs==4.9.6
46
+ pluggy==1.6.0
47
+ py-serializable==2.1.0
48
+ pycparser==3.0
49
+ pydantic==2.13.3
50
+ pydantic-settings==2.14.0
51
+ pydantic_core==2.46.3
52
+ pyfiglet==1.0.4
53
+ Pygments==2.20.0
54
+ PyJWT==2.12.1
55
+ pyparsing==3.3.2
56
+ pyproject_hooks==1.2.0
57
+ pytest==9.0.3
58
+ pytest-cov==7.1.0
59
+ python-dotenv==1.2.2
60
+ python-multipart==0.0.27
61
+ pywin32==311
62
+ pywin32-ctypes==0.2.3
63
+ PyYAML==6.0.3
64
+ readme_renderer==44.0
65
+ referencing==0.37.0
66
+ requests==2.33.1
67
+ requests-toolbelt==1.0.0
68
+ rfc3986==2.0.0
69
+ rich==15.0.0
70
+ rpds-py==0.30.0
71
+ -e git+https://github.com/ShanKonduru/sec-report-kit.git@b6d196bac687e07189e884e2fe25af5c8842da1d#egg=sec_report_kit
72
+ shellingham==1.5.4
73
+ sortedcontainers==2.4.0
74
+ sse-starlette==3.4.1
75
+ starlette==1.0.0
76
+ stevedore==5.7.0
77
+ tomli==2.4.1
78
+ tomli_w==1.2.0
79
+ twine==6.2.0
80
+ typer==0.25.1
81
+ typing-inspection==0.4.2
82
+ typing_extensions==4.15.0
83
+ urllib3==2.6.3
84
+ uvicorn==0.46.0
@@ -0,0 +1,13 @@
1
+ @echo off
2
+ setlocal
3
+
4
+ set "PYTHON_BIN=python"
5
+ if exist "%~dp0..\.venv\Scripts\python.exe" set "PYTHON_BIN=%~dp0..\.venv\Scripts\python.exe"
6
+
7
+ set "OUTPUT_DIR=%~1"
8
+ if "%OUTPUT_DIR%"=="" set "OUTPUT_DIR=.tools\safety-db"
9
+
10
+ rem Pass remaining flags (e.g. --full, --no-verify-ssl) directly to the Python script
11
+ "%PYTHON_BIN%" "%~dp0download_safety_db.py" --output-dir "%OUTPUT_DIR%" %2 %3 %4
12
+
13
+ exit /b %ERRORLEVEL%