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.
- {secure_code_agent-0.3.0/src/secure_code_agent.egg-info → secure_code_agent-0.5.0}/PKG-INFO +37 -2
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/README.md +35 -1
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/pyproject.toml +30 -5
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0/src/secure_code_agent.egg-info}/PKG-INFO +37 -2
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/SOURCES.txt +8 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/requires.txt +1 -0
- secure_code_agent-0.5.0/src/secure_code_audit/__init__.py +15 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/cli.py +244 -49
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/config.py +128 -8
- secure_code_agent-0.5.0/src/secure_code_audit/data/semgrep-offline.yaml +396 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/git_tools.py +36 -6
- secure_code_agent-0.5.0/src/secure_code_audit/pillar.py +194 -0
- secure_code_agent-0.5.0/src/secure_code_audit/practice.py +300 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/renderers.py +145 -16
- secure_code_agent-0.5.0/src/secure_code_audit/ruleset.py +97 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/sarif.py +53 -8
- secure_code_agent-0.5.0/src/secure_code_audit/scanner_status.py +197 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/__init__.py +6 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/bandit_scanner.py +7 -30
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/base.py +137 -8
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/builtin_rules.py +3 -2
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/checkov_scanner.py +10 -40
- secure_code_agent-0.5.0/src/secure_code_audit/scanners/floor.py +282 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/gitleaks_scanner.py +21 -30
- secure_code_agent-0.5.0/src/secure_code_audit/scanners/gosec_scanner.py +132 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/hadolint_scanner.py +11 -66
- secure_code_agent-0.5.0/src/secure_code_audit/scanners/njsscan_scanner.py +108 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/npm_audit_scanner.py +21 -49
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/osv_scanner.py +9 -52
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/pip_audit_scanner.py +55 -72
- secure_code_agent-0.5.0/src/secure_code_audit/scanners/rubocop_scanner.py +118 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/scorecard_scanner.py +18 -65
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/semgrep_scanner.py +79 -43
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/trivy_scanner.py +8 -40
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/scanners/trufflehog_scanner.py +23 -39
- secure_code_agent-0.5.0/src/secure_code_audit/scoring.py +542 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/suppressions.py +68 -0
- secure_code_agent-0.3.0/src/secure_code_audit/__init__.py +0 -3
- secure_code_agent-0.3.0/src/secure_code_audit/scanner_status.py +0 -169
- secure_code_agent-0.3.0/src/secure_code_audit/scoring.py +0 -295
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/LICENSE +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/setup.cfg +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/dependency_links.txt +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/entry_points.txt +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/top_level.txt +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/baseline.py +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/findings.py +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/instructions.py +0 -0
- {secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_audit/remediation.py +0 -0
- {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
|
+
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
|
-
├──
|
|
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
|
-
├──
|
|
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
|
-
|
|
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
|
|
54
|
-
#
|
|
55
|
-
#
|
|
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 = [
|
|
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
|
+
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
|
-
├──
|
|
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)
|
{secure_code_agent-0.3.0 → secure_code_agent-0.5.0}/src/secure_code_agent.egg-info/SOURCES.txt
RENAMED
|
@@ -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
|
|
@@ -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"
|