secure-code-agent 0.3.0__tar.gz → 0.5.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 (50) hide show
  1. {secure_code_agent-0.3.0/src/secure_code_agent.egg-info → secure_code_agent-0.5.0}/PKG-INFO +37 -2
  2. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/README.md +35 -1
  3. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/pyproject.toml +30 -5
  4. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0/src/secure_code_agent.egg-info}/PKG-INFO +37 -2
  5. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/SOURCES.txt +8 -0
  6. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/requires.txt +1 -0
  7. secure_code_agent-0.5.0/src/secure_code_audit/__init__.py +15 -0
  8. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/cli.py +244 -49
  9. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/config.py +128 -8
  10. secure_code_agent-0.5.0/src/secure_code_audit/data/semgrep-offline.yaml +396 -0
  11. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/git_tools.py +36 -6
  12. secure_code_agent-0.5.0/src/secure_code_audit/pillar.py +194 -0
  13. secure_code_agent-0.5.0/src/secure_code_audit/practice.py +300 -0
  14. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/renderers.py +145 -16
  15. secure_code_agent-0.5.0/src/secure_code_audit/ruleset.py +97 -0
  16. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/sarif.py +53 -8
  17. secure_code_agent-0.5.0/src/secure_code_audit/scanner_status.py +197 -0
  18. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/__init__.py +6 -0
  19. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/bandit_scanner.py +7 -30
  20. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/base.py +137 -8
  21. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/builtin_rules.py +3 -2
  22. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/checkov_scanner.py +10 -40
  23. secure_code_agent-0.5.0/src/secure_code_audit/scanners/floor.py +282 -0
  24. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/gitleaks_scanner.py +21 -30
  25. secure_code_agent-0.5.0/src/secure_code_audit/scanners/gosec_scanner.py +132 -0
  26. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/hadolint_scanner.py +11 -66
  27. secure_code_agent-0.5.0/src/secure_code_audit/scanners/njsscan_scanner.py +108 -0
  28. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/npm_audit_scanner.py +21 -49
  29. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/osv_scanner.py +9 -52
  30. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/pip_audit_scanner.py +55 -72
  31. secure_code_agent-0.5.0/src/secure_code_audit/scanners/rubocop_scanner.py +118 -0
  32. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/scorecard_scanner.py +18 -65
  33. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/semgrep_scanner.py +79 -43
  34. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/trivy_scanner.py +8 -40
  35. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/trufflehog_scanner.py +23 -39
  36. secure_code_agent-0.5.0/src/secure_code_audit/scoring.py +542 -0
  37. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/suppressions.py +68 -0
  38. secure_code_agent-0.3.0/src/secure_code_audit/__init__.py +0 -3
  39. secure_code_agent-0.3.0/src/secure_code_audit/scanner_status.py +0 -169
  40. secure_code_agent-0.3.0/src/secure_code_audit/scoring.py +0 -295
  41. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/LICENSE +0 -0
  42. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/setup.cfg +0 -0
  43. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/dependency_links.txt +0 -0
  44. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/entry_points.txt +0 -0
  45. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/top_level.txt +0 -0
  46. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/baseline.py +0 -0
  47. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/findings.py +0 -0
  48. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/instructions.py +0 -0
  49. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/remediation.py +0 -0
  50. {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/standards.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secure-code-agent
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Summary: Deterministic security gate + bounded AI remediation prompt generator. NIST SSDF / OWASP ASVS / CWE Top 25 anchored.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -32,6 +32,7 @@ Requires-Dist: PyYAML<7,>=6.0.2
32
32
  Provides-Extra: required-scanners
33
33
  Requires-Dist: bandit==1.9.4; extra == "required-scanners"
34
34
  Requires-Dist: pip-audit==2.10.1; extra == "required-scanners"
35
+ Requires-Dist: njsscan==1.0.0; extra == "required-scanners"
35
36
  Provides-Extra: python-scanners
36
37
  Requires-Dist: secure-code-agent[required-scanners]; extra == "python-scanners"
37
38
  Requires-Dist: semgrep<2,>=1.172; extra == "python-scanners"
@@ -173,7 +174,9 @@ collapsed before scoring; reports preserve the original scanner evidence.
173
174
  ├── Hadolint (Dockerfile lint)
174
175
  ├── OSV-Scanner (multi-ecosystem SCA via osv.dev)
175
176
  ├── OpenSSF Scorecard (repo hygiene + supply chain)
176
- ├── eslint-plugin-security (JS/TS SAST) [v0.3]
177
+ ├── njsscan (JS/TS SAST, offline, no Node needed)
178
+ ├── RuboCop (Ruby security cops, --only Security)
179
+ ├── gosec (Go SAST — opt-in; needs the Go toolchain)
177
180
  ├── CodeQL SARIF (ingest GitHub-hosted analysis)
178
181
  └── Built-in regex rules (high-confidence, low-FP)
179
182
  ```
@@ -287,6 +290,10 @@ for repositories whose `pyproject.toml` is their authoritative audit input.
287
290
  reason: "Slated for rewrite Q3 2026 — gated by initiative INV-44."
288
291
  expires: "2026-09-30"
289
292
 
293
+ fingerprint: 0aaa689f8a967d8c # optional: pin to ONE finding (16 hex, from the report)
294
+
295
+ line: 18 # optional: with fingerprint, pins the exact location
296
+
290
297
  - rule_id: "B101"
291
298
  paths: ["tests/"]
292
299
  reason: "assert statements are legitimate in test code."
@@ -368,6 +375,31 @@ SARIF upload. Pin production usage to a full commit SHA; the version tag above
368
375
  is shown for readability. See [`action.yml`](action.yml) and
369
376
  [`examples/github-actions/`](examples/github-actions/) for full workflows.
370
377
 
378
+ ## maintainability-agent integration
379
+
380
+ `maintainability-agent` declares Security a **delegated** pillar naming this
381
+ tool, and reports it as `NotApplicable` so silence is never read as safety.
382
+ This tool emits the artifact that completes the picture:
383
+
384
+ ```bash
385
+ secure-code-agent . --security-pillar security-pillar.json
386
+ maintainability-agent . --security-pillar security-pillar.json
387
+ ```
388
+
389
+ Standalone use is unaffected — without the flag nothing is written and every
390
+ other output is identical. MA never executes this tool, and this tool never
391
+ imports MA; two independently releasable packages exchanging one document.
392
+
393
+ The artifact carries **two values that are never averaged**: a practice level
394
+ read from configuration and CI (*is anything preventing the next
395
+ vulnerability?*) and a code condition read from the scanners (*what did they
396
+ find?*). `condition` is `null` whenever scanner coverage is incomplete — this
397
+ tool's score is a rate over findings, so removing scanners makes the raw number
398
+ go **up**, and an unscanned repository must not arrive at MA looking measured.
399
+
400
+ Full contract, invariants and the practice rubric:
401
+ [`docs/ma-integration.md`](docs/ma-integration.md).
402
+
371
403
  ## What this is NOT
372
404
 
373
405
  - ❌ **Not a SAST engine.** We delegate to Semgrep / Bandit / CodeQL / etc. — we don't write yet another AST analyzer.
@@ -390,6 +422,9 @@ Full design philosophy in [`docs/design.md`](docs/design.md).
390
422
  ## Documentation
391
423
 
392
424
  - [`docs/product-intent.md`](docs/product-intent.md) — Why this exists, who it serves, what it refuses to become
425
+ - [`docs/decisions.md`](docs/decisions.md) — Decision register: rulings the code alone cannot answer
426
+ - [`docs/ma-integration.md`](docs/ma-integration.md) — The `security-pillar.json` contract maintainability-agent reads
427
+ - [`docs/calibration.md`](docs/calibration.md) — The calibration study, its corpus, and what it found
393
428
  - [`docs/design.md`](docs/design.md) — Architecture + non-goals + scanner protocol
394
429
  - [`docs/architecture.md`](docs/architecture.md) — Audit of the system as built + remediation sequence
395
430
  - [`docs/release-blockers.md`](docs/release-blockers.md) — Open v0.3.0 release blockers (do not tag until closed)
@@ -128,7 +128,9 @@ collapsed before scoring; reports preserve the original scanner evidence.
128
128
  ├── Hadolint (Dockerfile lint)
129
129
  ├── OSV-Scanner (multi-ecosystem SCA via osv.dev)
130
130
  ├── OpenSSF Scorecard (repo hygiene + supply chain)
131
- ├── eslint-plugin-security (JS/TS SAST) [v0.3]
131
+ ├── njsscan (JS/TS SAST, offline, no Node needed)
132
+ ├── RuboCop (Ruby security cops, --only Security)
133
+ ├── gosec (Go SAST — opt-in; needs the Go toolchain)
132
134
  ├── CodeQL SARIF (ingest GitHub-hosted analysis)
133
135
  └── Built-in regex rules (high-confidence, low-FP)
134
136
  ```
@@ -242,6 +244,10 @@ for repositories whose `pyproject.toml` is their authoritative audit input.
242
244
  reason: "Slated for rewrite Q3 2026 — gated by initiative INV-44."
243
245
  expires: "2026-09-30"
244
246
 
247
+ fingerprint: 0aaa689f8a967d8c # optional: pin to ONE finding (16 hex, from the report)
248
+
249
+ line: 18 # optional: with fingerprint, pins the exact location
250
+
245
251
  - rule_id: "B101"
246
252
  paths: ["tests/"]
247
253
  reason: "assert statements are legitimate in test code."
@@ -323,6 +329,31 @@ SARIF upload. Pin production usage to a full commit SHA; the version tag above
323
329
  is shown for readability. See [`action.yml`](action.yml) and
324
330
  [`examples/github-actions/`](examples/github-actions/) for full workflows.
325
331
 
332
+ ## maintainability-agent integration
333
+
334
+ `maintainability-agent` declares Security a **delegated** pillar naming this
335
+ tool, and reports it as `NotApplicable` so silence is never read as safety.
336
+ This tool emits the artifact that completes the picture:
337
+
338
+ ```bash
339
+ secure-code-agent . --security-pillar security-pillar.json
340
+ maintainability-agent . --security-pillar security-pillar.json
341
+ ```
342
+
343
+ Standalone use is unaffected — without the flag nothing is written and every
344
+ other output is identical. MA never executes this tool, and this tool never
345
+ imports MA; two independently releasable packages exchanging one document.
346
+
347
+ The artifact carries **two values that are never averaged**: a practice level
348
+ read from configuration and CI (*is anything preventing the next
349
+ vulnerability?*) and a code condition read from the scanners (*what did they
350
+ find?*). `condition` is `null` whenever scanner coverage is incomplete — this
351
+ tool's score is a rate over findings, so removing scanners makes the raw number
352
+ go **up**, and an unscanned repository must not arrive at MA looking measured.
353
+
354
+ Full contract, invariants and the practice rubric:
355
+ [`docs/ma-integration.md`](docs/ma-integration.md).
356
+
326
357
  ## What this is NOT
327
358
 
328
359
  - ❌ **Not a SAST engine.** We delegate to Semgrep / Bandit / CodeQL / etc. — we don't write yet another AST analyzer.
@@ -345,6 +376,9 @@ Full design philosophy in [`docs/design.md`](docs/design.md).
345
376
  ## Documentation
346
377
 
347
378
  - [`docs/product-intent.md`](docs/product-intent.md) — Why this exists, who it serves, what it refuses to become
379
+ - [`docs/decisions.md`](docs/decisions.md) — Decision register: rulings the code alone cannot answer
380
+ - [`docs/ma-integration.md`](docs/ma-integration.md) — The `security-pillar.json` contract maintainability-agent reads
381
+ - [`docs/calibration.md`](docs/calibration.md) — The calibration study, its corpus, and what it found
348
382
  - [`docs/design.md`](docs/design.md) — Architecture + non-goals + scanner protocol
349
383
  - [`docs/architecture.md`](docs/architecture.md) — Audit of the system as built + remediation sequence
350
384
  - [`docs/release-blockers.md`](docs/release-blockers.md) — Open v0.3.0 release blockers (do not tag until closed)
@@ -4,7 +4,15 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "secure-code-agent"
7
- version = "0.3.0"
7
+ # Derived from `secure_code_audit.__version__`, which is the only place the
8
+ # number is written. It used to be duplicated here, and the two drifted: this
9
+ # file said 0.4.0 while the package said 0.3.0, so the released v0.4.0 wheel
10
+ # stamped 0.3.0 into every SARIF document, JSON report, Markdown header,
11
+ # `--version` and the pillar artifact handed to maintainability-agent. The
12
+ # release workflow compared the tag against *this* line and never looked at the
13
+ # package, so nothing caught it. A test asserting the two agree would only
14
+ # police the duplication; removing it is the fix.
15
+ dynamic = ["version"]
8
16
  description = "Deterministic security gate + bounded AI remediation prompt generator. NIST SSDF / OWASP ASVS / CWE Top 25 anchored."
9
17
  readme = "README.md"
10
18
  requires-python = ">=3.10"
@@ -47,12 +55,18 @@ dependencies = [
47
55
  required-scanners = [
48
56
  "bandit==1.9.4",
49
57
  "pip-audit==2.10.1",
58
+ # njsscan is in the floor (D12) and is a Python package carrying its own
59
+ # rules, so a JavaScript repository can be scanned on a host with no Node.
60
+ # Pinned for the same reason as the rest: the floor is a claim about what
61
+ # ran, and an unpinned ruleset makes that claim unreproducible.
62
+ "njsscan==1.0.0",
50
63
  ]
51
64
  # The remaining Python-packaged scanners. Bounded rather than pinned because
52
65
  # they are optional; the coverage gate does not require them by default.
53
- # Scanners distributed as standalone binaries (gitleaks, hadolint, npm,
54
- # osv-scanner, scorecard, trivy, trufflehog) cannot be installed from PyPI —
55
- # see docs/scanners.md for their install commands and the SARIF-import route.
66
+ # Scanners distributed as standalone binaries or through another language's
67
+ # package manager (gitleaks, gosec, hadolint, npm, osv-scanner, rubocop,
68
+ # scorecard, trivy, trufflehog) cannot be installed from PyPI see
69
+ # docs/scanners.md for their install commands and the SARIF-import route.
56
70
  python-scanners = [
57
71
  "secure-code-agent[required-scanners]",
58
72
  "semgrep>=1.172,<2",
@@ -80,6 +94,12 @@ Documentation = "https://github.com/marshallguillory86/secure-code-agent/tree/ma
80
94
  Issues = "https://github.com/marshallguillory86/secure-code-agent/issues"
81
95
  Changelog = "https://github.com/marshallguillory86/secure-code-agent/blob/main/CHANGELOG.md"
82
96
 
97
+ [tool.setuptools.dynamic]
98
+ # The single source of truth for the version. `src/secure_code_audit/__init__.py`
99
+ # holds the literal; this reads it. The two cannot drift because there is only
100
+ # one of them.
101
+ version = { attr = "secure_code_audit.__version__" }
102
+
83
103
  [tool.setuptools.packages.find]
84
104
  where = ["src"]
85
105
 
@@ -92,7 +112,12 @@ target-version = "py310"
92
112
  # Ruff 0.16 formats Python blocks embedded in Markdown. Our docs use those
93
113
  # blocks illustratively — excerpted statements, aligned-comment schemas — and
94
114
  # reformatting them damages the documentation without improving any code.
95
- extend-exclude = ["**/*.md"]
115
+ extend-exclude = [
116
+ "**/*.md",
117
+ # Scanner fixtures are deliberately vulnerable sample code. Linting them
118
+ # would demand we fix the very patterns the rules exist to detect.
119
+ "tests/fixtures/**",
120
+ ]
96
121
 
97
122
  [tool.ruff.lint]
98
123
  select = ["E", "F", "I", "B", "UP", "SIM", "C4"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: secure-code-agent
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Summary: Deterministic security gate + bounded AI remediation prompt generator. NIST SSDF / OWASP ASVS / CWE Top 25 anchored.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -32,6 +32,7 @@ Requires-Dist: PyYAML<7,>=6.0.2
32
32
  Provides-Extra: required-scanners
33
33
  Requires-Dist: bandit==1.9.4; extra == "required-scanners"
34
34
  Requires-Dist: pip-audit==2.10.1; extra == "required-scanners"
35
+ Requires-Dist: njsscan==1.0.0; extra == "required-scanners"
35
36
  Provides-Extra: python-scanners
36
37
  Requires-Dist: secure-code-agent[required-scanners]; extra == "python-scanners"
37
38
  Requires-Dist: semgrep<2,>=1.172; extra == "python-scanners"
@@ -173,7 +174,9 @@ collapsed before scoring; reports preserve the original scanner evidence.
173
174
  ├── Hadolint (Dockerfile lint)
174
175
  ├── OSV-Scanner (multi-ecosystem SCA via osv.dev)
175
176
  ├── OpenSSF Scorecard (repo hygiene + supply chain)
176
- ├── eslint-plugin-security (JS/TS SAST) [v0.3]
177
+ ├── njsscan (JS/TS SAST, offline, no Node needed)
178
+ ├── RuboCop (Ruby security cops, --only Security)
179
+ ├── gosec (Go SAST — opt-in; needs the Go toolchain)
177
180
  ├── CodeQL SARIF (ingest GitHub-hosted analysis)
178
181
  └── Built-in regex rules (high-confidence, low-FP)
179
182
  ```
@@ -287,6 +290,10 @@ for repositories whose `pyproject.toml` is their authoritative audit input.
287
290
  reason: "Slated for rewrite Q3 2026 — gated by initiative INV-44."
288
291
  expires: "2026-09-30"
289
292
 
293
+ fingerprint: 0aaa689f8a967d8c # optional: pin to ONE finding (16 hex, from the report)
294
+
295
+ line: 18 # optional: with fingerprint, pins the exact location
296
+
290
297
  - rule_id: "B101"
291
298
  paths: ["tests/"]
292
299
  reason: "assert statements are legitimate in test code."
@@ -368,6 +375,31 @@ SARIF upload. Pin production usage to a full commit SHA; the version tag above
368
375
  is shown for readability. See [`action.yml`](action.yml) and
369
376
  [`examples/github-actions/`](examples/github-actions/) for full workflows.
370
377
 
378
+ ## maintainability-agent integration
379
+
380
+ `maintainability-agent` declares Security a **delegated** pillar naming this
381
+ tool, and reports it as `NotApplicable` so silence is never read as safety.
382
+ This tool emits the artifact that completes the picture:
383
+
384
+ ```bash
385
+ secure-code-agent . --security-pillar security-pillar.json
386
+ maintainability-agent . --security-pillar security-pillar.json
387
+ ```
388
+
389
+ Standalone use is unaffected — without the flag nothing is written and every
390
+ other output is identical. MA never executes this tool, and this tool never
391
+ imports MA; two independently releasable packages exchanging one document.
392
+
393
+ The artifact carries **two values that are never averaged**: a practice level
394
+ read from configuration and CI (*is anything preventing the next
395
+ vulnerability?*) and a code condition read from the scanners (*what did they
396
+ find?*). `condition` is `null` whenever scanner coverage is incomplete — this
397
+ tool's score is a rate over findings, so removing scanners makes the raw number
398
+ go **up**, and an unscanned repository must not arrive at MA looking measured.
399
+
400
+ Full contract, invariants and the practice rubric:
401
+ [`docs/ma-integration.md`](docs/ma-integration.md).
402
+
371
403
  ## What this is NOT
372
404
 
373
405
  - ❌ **Not a SAST engine.** We delegate to Semgrep / Bandit / CodeQL / etc. — we don't write yet another AST analyzer.
@@ -390,6 +422,9 @@ Full design philosophy in [`docs/design.md`](docs/design.md).
390
422
  ## Documentation
391
423
 
392
424
  - [`docs/product-intent.md`](docs/product-intent.md) — Why this exists, who it serves, what it refuses to become
425
+ - [`docs/decisions.md`](docs/decisions.md) — Decision register: rulings the code alone cannot answer
426
+ - [`docs/ma-integration.md`](docs/ma-integration.md) — The `security-pillar.json` contract maintainability-agent reads
427
+ - [`docs/calibration.md`](docs/calibration.md) — The calibration study, its corpus, and what it found
393
428
  - [`docs/design.md`](docs/design.md) — Architecture + non-goals + scanner protocol
394
429
  - [`docs/architecture.md`](docs/architecture.md) — Audit of the system as built + remediation sequence
395
430
  - [`docs/release-blockers.md`](docs/release-blockers.md) — Open v0.3.0 release blockers (do not tag until closed)
@@ -14,23 +14,31 @@ src/secure_code_audit/config.py
14
14
  src/secure_code_audit/findings.py
15
15
  src/secure_code_audit/git_tools.py
16
16
  src/secure_code_audit/instructions.py
17
+ src/secure_code_audit/pillar.py
18
+ src/secure_code_audit/practice.py
17
19
  src/secure_code_audit/remediation.py
18
20
  src/secure_code_audit/renderers.py
21
+ src/secure_code_audit/ruleset.py
19
22
  src/secure_code_audit/sarif.py
20
23
  src/secure_code_audit/scanner_status.py
21
24
  src/secure_code_audit/scoring.py
22
25
  src/secure_code_audit/standards.py
23
26
  src/secure_code_audit/suppressions.py
27
+ src/secure_code_audit/data/semgrep-offline.yaml
24
28
  src/secure_code_audit/scanners/__init__.py
25
29
  src/secure_code_audit/scanners/bandit_scanner.py
26
30
  src/secure_code_audit/scanners/base.py
27
31
  src/secure_code_audit/scanners/builtin_rules.py
28
32
  src/secure_code_audit/scanners/checkov_scanner.py
33
+ src/secure_code_audit/scanners/floor.py
29
34
  src/secure_code_audit/scanners/gitleaks_scanner.py
35
+ src/secure_code_audit/scanners/gosec_scanner.py
30
36
  src/secure_code_audit/scanners/hadolint_scanner.py
37
+ src/secure_code_audit/scanners/njsscan_scanner.py
31
38
  src/secure_code_audit/scanners/npm_audit_scanner.py
32
39
  src/secure_code_audit/scanners/osv_scanner.py
33
40
  src/secure_code_audit/scanners/pip_audit_scanner.py
41
+ src/secure_code_audit/scanners/rubocop_scanner.py
34
42
  src/secure_code_audit/scanners/scorecard_scanner.py
35
43
  src/secure_code_audit/scanners/semgrep_scanner.py
36
44
  src/secure_code_audit/scanners/trivy_scanner.py
@@ -14,3 +14,4 @@ checkov<4,>=3.3
14
14
  [required-scanners]
15
15
  bandit==1.9.4
16
16
  pip-audit==2.10.1
17
+ njsscan==1.0.0
@@ -0,0 +1,15 @@
1
+ """secure-code-agent — deterministic security gate + bounded AI remediation prompts."""
2
+
3
+ #: The only place the version is written. `pyproject.toml` derives it via
4
+ #: `[tool.setuptools.dynamic]`, so the two cannot drift.
5
+ #:
6
+ #: They did drift once, and it shipped: pyproject said 0.4.0 while this said
7
+ #: 0.3.0, so the released v0.4.0 wheel stamped 0.3.0 into every SARIF document,
8
+ #: every JSON report, the Markdown header, `--version`, and the
9
+ #: `security-pillar.json` handed to maintainability-agent. The release workflow
10
+ #: compared the tag against pyproject's line and never looked here — it
11
+ #: verified the half that was right and shipped the half that was wrong.
12
+ #:
13
+ #: PyPI is immutable, so 0.4.0 stays wrong. 0.5.0 is the first build whose
14
+ #: artifacts name their own producer correctly.
15
+ __version__ = "0.5.0"