vaspera 2.9.2 → 2.10.0
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.
- package/CHANGELOG.md +68 -0
- package/README.md +58 -1
- package/dist/__tests__/autofix/branch-manager.test.d.ts +2 -0
- package/dist/__tests__/autofix/branch-manager.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/branch-manager.test.js +60 -0
- package/dist/__tests__/autofix/branch-manager.test.js.map +1 -0
- package/dist/__tests__/autofix/commit-generator.test.d.ts +2 -0
- package/dist/__tests__/autofix/commit-generator.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/commit-generator.test.js +147 -0
- package/dist/__tests__/autofix/commit-generator.test.js.map +1 -0
- package/dist/__tests__/autofix/constitution.test.d.ts +9 -0
- package/dist/__tests__/autofix/constitution.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/constitution.test.js +421 -0
- package/dist/__tests__/autofix/constitution.test.js.map +1 -0
- package/dist/__tests__/autofix/pr-generator.test.d.ts +2 -0
- package/dist/__tests__/autofix/pr-generator.test.d.ts.map +1 -0
- package/dist/__tests__/autofix/pr-generator.test.js +152 -0
- package/dist/__tests__/autofix/pr-generator.test.js.map +1 -0
- package/dist/__tests__/property-test-helpers.d.ts +87 -0
- package/dist/__tests__/property-test-helpers.d.ts.map +1 -0
- package/dist/__tests__/property-test-helpers.js +136 -0
- package/dist/__tests__/property-test-helpers.js.map +1 -0
- package/dist/__tests__/scanners/dast/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/index.test.js +183 -0
- package/dist/__tests__/scanners/dast/index.test.js.map +1 -0
- package/dist/__tests__/scanners/dast/nuclei.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/nuclei.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/nuclei.test.js +166 -0
- package/dist/__tests__/scanners/dast/nuclei.test.js.map +1 -0
- package/dist/__tests__/scanners/dast/zap.test.d.ts +2 -0
- package/dist/__tests__/scanners/dast/zap.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/dast/zap.test.js +158 -0
- package/dist/__tests__/scanners/dast/zap.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-feedback.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-feedback.test.js +202 -0
- package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-filter.property.test.d.ts +9 -0
- package/dist/__tests__/scanners/fp-filter.property.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-filter.property.test.js +253 -0
- package/dist/__tests__/scanners/fp-filter.property.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-filter.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-filter.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-filter.test.js +234 -0
- package/dist/__tests__/scanners/fp-filter.test.js.map +1 -0
- package/dist/__tests__/scanners/fp-tracker.test.d.ts +2 -0
- package/dist/__tests__/scanners/fp-tracker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/fp-tracker.test.js +262 -0
- package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts +10 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js +238 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js +55 -0
- package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/index.test.js +165 -0
- package/dist/__tests__/scanners/logic/index.test.js.map +1 -0
- package/dist/__tests__/scanners/logic/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/logic/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/logic/types.test.js +85 -0
- package/dist/__tests__/scanners/logic/types.test.js.map +1 -0
- package/dist/action/pr-comment.test.js +4 -0
- package/dist/action/pr-comment.test.js.map +1 -1
- package/dist/action/sarif-upload.test.js +4 -0
- package/dist/action/sarif-upload.test.js.map +1 -1
- package/dist/autofix/branch-manager.d.ts +115 -0
- package/dist/autofix/branch-manager.d.ts.map +1 -0
- package/dist/autofix/branch-manager.js +308 -0
- package/dist/autofix/branch-manager.js.map +1 -0
- package/dist/autofix/commit-generator.d.ts +55 -0
- package/dist/autofix/commit-generator.d.ts.map +1 -0
- package/dist/autofix/commit-generator.js +277 -0
- package/dist/autofix/commit-generator.js.map +1 -0
- package/dist/autofix/constitution.d.ts +77 -0
- package/dist/autofix/constitution.d.ts.map +1 -0
- package/dist/autofix/constitution.js +261 -0
- package/dist/autofix/constitution.js.map +1 -0
- package/dist/autofix/constitution.schema.d.ts +441 -0
- package/dist/autofix/constitution.schema.d.ts.map +1 -0
- package/dist/autofix/constitution.schema.js +144 -0
- package/dist/autofix/constitution.schema.js.map +1 -0
- package/dist/autofix/index.d.ts +13 -0
- package/dist/autofix/index.d.ts.map +1 -0
- package/dist/autofix/index.js +15 -0
- package/dist/autofix/index.js.map +1 -0
- package/dist/autofix/pr-generator.d.ts +57 -0
- package/dist/autofix/pr-generator.d.ts.map +1 -0
- package/dist/autofix/pr-generator.js +597 -0
- package/dist/autofix/pr-generator.js.map +1 -0
- package/dist/autofix/types.d.ts +151 -0
- package/dist/autofix/types.d.ts.map +1 -0
- package/dist/autofix/types.js +22 -0
- package/dist/autofix/types.js.map +1 -0
- package/dist/eval/fixtures.d.ts +20 -0
- package/dist/eval/fixtures.d.ts.map +1 -1
- package/dist/eval/fixtures.js +430 -0
- package/dist/eval/fixtures.js.map +1 -1
- package/dist/scanners/cache.d.ts.map +1 -1
- package/dist/scanners/cache.js +4 -0
- package/dist/scanners/cache.js.map +1 -1
- package/dist/scanners/dast/index.d.ts +39 -0
- package/dist/scanners/dast/index.d.ts.map +1 -0
- package/dist/scanners/dast/index.js +259 -0
- package/dist/scanners/dast/index.js.map +1 -0
- package/dist/scanners/dast/nuclei.d.ts +26 -0
- package/dist/scanners/dast/nuclei.d.ts.map +1 -0
- package/dist/scanners/dast/nuclei.js +354 -0
- package/dist/scanners/dast/nuclei.js.map +1 -0
- package/dist/scanners/dast/types.d.ts +306 -0
- package/dist/scanners/dast/types.d.ts.map +1 -0
- package/dist/scanners/dast/types.js +52 -0
- package/dist/scanners/dast/types.js.map +1 -0
- package/dist/scanners/dast/zap.d.ts +26 -0
- package/dist/scanners/dast/zap.d.ts.map +1 -0
- package/dist/scanners/dast/zap.js +453 -0
- package/dist/scanners/dast/zap.js.map +1 -0
- package/dist/scanners/fp-feedback.d.ts +140 -0
- package/dist/scanners/fp-feedback.d.ts.map +1 -0
- package/dist/scanners/fp-feedback.js +292 -0
- package/dist/scanners/fp-feedback.js.map +1 -0
- package/dist/scanners/fp-filter.d.ts +94 -0
- package/dist/scanners/fp-filter.d.ts.map +1 -0
- package/dist/scanners/fp-filter.js +397 -0
- package/dist/scanners/fp-filter.js.map +1 -0
- package/dist/scanners/fp-tracker.d.ts +125 -0
- package/dist/scanners/fp-tracker.d.ts.map +1 -0
- package/dist/scanners/fp-tracker.js +330 -0
- package/dist/scanners/fp-tracker.js.map +1 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +56 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/index.test.js +6 -6
- package/dist/scanners/index.test.js.map +1 -1
- package/dist/scanners/logic/auth-flow-analyzer.d.ts +18 -0
- package/dist/scanners/logic/auth-flow-analyzer.d.ts.map +1 -0
- package/dist/scanners/logic/auth-flow-analyzer.js +384 -0
- package/dist/scanners/logic/auth-flow-analyzer.js.map +1 -0
- package/dist/scanners/logic/endpoint-analyzer.d.ts +29 -0
- package/dist/scanners/logic/endpoint-analyzer.d.ts.map +1 -0
- package/dist/scanners/logic/endpoint-analyzer.js +528 -0
- package/dist/scanners/logic/endpoint-analyzer.js.map +1 -0
- package/dist/scanners/logic/index.d.ts +41 -0
- package/dist/scanners/logic/index.d.ts.map +1 -0
- package/dist/scanners/logic/index.js +268 -0
- package/dist/scanners/logic/index.js.map +1 -0
- package/dist/scanners/logic/types.d.ts +254 -0
- package/dist/scanners/logic/types.d.ts.map +1 -0
- package/dist/scanners/logic/types.js +142 -0
- package/dist/scanners/logic/types.js.map +1 -0
- package/dist/scanners/types.d.ts +1 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js +4 -0
- package/dist/scanners/types.js.map +1 -1
- package/package.json +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,73 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.10.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#37](https://github.com/RCOLKITT/hardening-mcp/pull/37) [`f9b8a59`](https://github.com/RCOLKITT/hardening-mcp/commit/f9b8a59f7af6470f90a16c96aa9c6e5e845e2476) Thanks [@RCOLKITT](https://github.com/RCOLKITT)! - ## Property-Based Testing
|
|
8
|
+
|
|
9
|
+
- Added `fast-check` dependency for scanner robustness testing
|
|
10
|
+
- 52 new property tests for `extractPathParams`, `inferResourceType`, `analyzeFilePath`
|
|
11
|
+
|
|
12
|
+
## Expanded Eval Fixtures
|
|
13
|
+
|
|
14
|
+
- 9 new fixtures across 5 categories (22 total, up from 13)
|
|
15
|
+
- command-injection (CWE-78), ssrf (CWE-918), xxe (CWE-611), insecure-deserialization (CWE-502), rls-bypass (CWE-639)
|
|
16
|
+
|
|
17
|
+
## Constitution for Autofix Governance
|
|
18
|
+
|
|
19
|
+
- Risk tolerance levels: conservative | moderate | aggressive
|
|
20
|
+
- Pattern-specific approvals with conditions
|
|
21
|
+
- Directory restrictions (neverAutofix, requireReview)
|
|
22
|
+
- Safety constraints (dryRunDefault, maxFilesPerRun, runTestsAfterFix)
|
|
23
|
+
- 33 new tests for constitution validation
|
|
24
|
+
|
|
25
|
+
## [2.10.0] - 2026-05-26
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
#### Property-Based Testing
|
|
30
|
+
|
|
31
|
+
- Added `fast-check` dependency for property-based tests
|
|
32
|
+
- New `src/__tests__/property-test-helpers.ts` with shared generators
|
|
33
|
+
- PBT for `extractPathParams()` - tests all 4 framework styles (Express, Next.js, Flask, Spring)
|
|
34
|
+
- PBT for `inferResourceType()` - tests singularization invariants
|
|
35
|
+
- PBT for `analyzeFilePath()` - tests file classification rules
|
|
36
|
+
- 52 new property tests ensuring scanner robustness
|
|
37
|
+
|
|
38
|
+
#### Expanded Eval Fixtures
|
|
39
|
+
|
|
40
|
+
- 9 new test fixtures across 5 vulnerability categories (22 total, up from 13)
|
|
41
|
+
- `command-injection` (2 fixtures): CWE-78 - exec/spawn with user input
|
|
42
|
+
- `ssrf` (2 fixtures): CWE-918 - fetch/axios with user-controlled URLs
|
|
43
|
+
- `xxe` (1 fixture): CWE-611 - XML parser without entity restrictions
|
|
44
|
+
- `insecure-deserialization` (2 fixtures): CWE-502 - eval/yaml.load vulnerabilities
|
|
45
|
+
- `rls-bypass` (2 fixtures): CWE-639 - missing ownership filters, service role bypass
|
|
46
|
+
|
|
47
|
+
#### Constitution for Autofix Governance
|
|
48
|
+
|
|
49
|
+
- Added `yaml` dependency for constitution file parsing
|
|
50
|
+
- New `src/autofix/constitution.schema.ts` with Zod validation
|
|
51
|
+
- New `src/autofix/constitution.ts` loader with evaluation logic
|
|
52
|
+
- Constitution integration with PR generator
|
|
53
|
+
- 33 new tests for constitution validation and enforcement
|
|
54
|
+
- Example constitution file in `examples/constitution.yaml`
|
|
55
|
+
|
|
56
|
+
**Constitution Features:**
|
|
57
|
+
|
|
58
|
+
- Risk tolerance levels: `conservative` | `moderate` | `aggressive`
|
|
59
|
+
- Pattern-specific approvals with conditions (path, lines changed, severity)
|
|
60
|
+
- Directory restrictions: `neverAutofix`, `requireReview`
|
|
61
|
+
- Safety constraints: `dryRunDefault`, `maxFilesPerRun`, `runTestsAfterFix`
|
|
62
|
+
- PR rules: required labels, commit prefix, max PRs per run
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
|
|
66
|
+
- Test count increased from 2772 to 2942 (170 new tests)
|
|
67
|
+
- MCP tools increased from 68 to 78
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
3
71
|
## 2.9.2
|
|
4
72
|
|
|
5
73
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -4,9 +4,66 @@ Enterprise-grade security certification for codebases **and AI agent systems** w
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|

|
|
7
|
-

|
|
8
8
|

|
|
9
9
|

|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What's New in v2.10.0
|
|
15
|
+
|
|
16
|
+
### Property-Based Testing
|
|
17
|
+
Robust scanner testing with fast-check property-based tests:
|
|
18
|
+
|
|
19
|
+
| Function | Properties Tested |
|
|
20
|
+
|----------|-------------------|
|
|
21
|
+
| `extractPathParams()` | All 4 framework styles (Express `:id`, Next.js `[id]`, Flask `<id>`, Spring `{id}`) |
|
|
22
|
+
| `inferResourceType()` | Singularization invariants (`-ies` → `-y`, `-ses` → `-s`) |
|
|
23
|
+
| `analyzeFilePath()` | Test/vendor/generated file classification |
|
|
24
|
+
|
|
25
|
+
### Expanded Eval Fixtures
|
|
26
|
+
22 test fixtures across 11 vulnerability categories (up from 13):
|
|
27
|
+
|
|
28
|
+
| Category | CWE | Fixtures |
|
|
29
|
+
|----------|-----|----------|
|
|
30
|
+
| `command-injection` | CWE-78 | 2 |
|
|
31
|
+
| `ssrf` | CWE-918 | 2 |
|
|
32
|
+
| `xxe` | CWE-611 | 1 |
|
|
33
|
+
| `insecure-deserialization` | CWE-502 | 2 |
|
|
34
|
+
| `rls-bypass` | CWE-639 | 2 |
|
|
35
|
+
|
|
36
|
+
### Constitution for Autofix Governance
|
|
37
|
+
Policy-based governance for autonomous autofix operations:
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
# .vaspera/constitution.yaml
|
|
41
|
+
version: "1.0"
|
|
42
|
+
riskTolerance: "conservative" # conservative | moderate | aggressive
|
|
43
|
+
|
|
44
|
+
patterns:
|
|
45
|
+
- patternId: "qual-console-log"
|
|
46
|
+
autoApprove: true
|
|
47
|
+
- patternId: "sec-sql-injection"
|
|
48
|
+
autoApprove: false
|
|
49
|
+
requiredReviewer: "security-team"
|
|
50
|
+
|
|
51
|
+
directories:
|
|
52
|
+
neverAutofix: ["node_modules", "vendor"]
|
|
53
|
+
requireReview: ["src/auth/", "src/crypto/"]
|
|
54
|
+
|
|
55
|
+
safety:
|
|
56
|
+
dryRunDefault: true
|
|
57
|
+
maxFilesPerRun: 20
|
|
58
|
+
runTestsAfterFix: true
|
|
59
|
+
revertOnTestFailure: true
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Constitution Features:**
|
|
63
|
+
- **Risk Tolerance** — Control which patterns auto-apply based on risk level
|
|
64
|
+
- **Pattern Approvals** — Whitelist/blacklist specific fix patterns with conditions
|
|
65
|
+
- **Path Restrictions** — Block autofix in sensitive directories (auth, crypto)
|
|
66
|
+
- **Safety Constraints** — Enforce dry-run, test requirements, backup branches
|
|
10
67
|
|
|
11
68
|
---
|
|
12
69
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-manager.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/autofix/branch-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parseGitHubRemote, generateBranchName, } from "../../autofix/branch-manager.js";
|
|
3
|
+
describe("branch-manager", () => {
|
|
4
|
+
describe("parseGitHubRemote", () => {
|
|
5
|
+
it("parses SSH format URLs", () => {
|
|
6
|
+
const result = parseGitHubRemote("git@github.com:owner/repo.git");
|
|
7
|
+
expect(result).toEqual({ owner: "owner", repo: "repo" });
|
|
8
|
+
});
|
|
9
|
+
it("parses SSH format URLs without .git suffix", () => {
|
|
10
|
+
const result = parseGitHubRemote("git@github.com:owner/repo");
|
|
11
|
+
expect(result).toEqual({ owner: "owner", repo: "repo" });
|
|
12
|
+
});
|
|
13
|
+
it("parses HTTPS format URLs", () => {
|
|
14
|
+
const result = parseGitHubRemote("https://github.com/owner/repo.git");
|
|
15
|
+
expect(result).toEqual({ owner: "owner", repo: "repo" });
|
|
16
|
+
});
|
|
17
|
+
it("parses HTTPS format URLs without .git suffix", () => {
|
|
18
|
+
const result = parseGitHubRemote("https://github.com/owner/repo");
|
|
19
|
+
expect(result).toEqual({ owner: "owner", repo: "repo" });
|
|
20
|
+
});
|
|
21
|
+
it("returns undefined for non-GitHub URLs", () => {
|
|
22
|
+
expect(parseGitHubRemote("https://gitlab.com/owner/repo.git")).toBeUndefined();
|
|
23
|
+
expect(parseGitHubRemote("git@gitlab.com:owner/repo.git")).toBeUndefined();
|
|
24
|
+
});
|
|
25
|
+
it("handles repos with dashes and underscores", () => {
|
|
26
|
+
const result = parseGitHubRemote("git@github.com:my-org/my_repo-name.git");
|
|
27
|
+
expect(result).toEqual({ owner: "my-org", repo: "my_repo-name" });
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("generateBranchName", () => {
|
|
31
|
+
it("generates branch name with prefix and identifier", () => {
|
|
32
|
+
const result = generateBranchName("vaspera/autofix", "critical");
|
|
33
|
+
expect(result).toMatch(/^vaspera\/autofix\/critical-[a-z0-9]+$/);
|
|
34
|
+
});
|
|
35
|
+
it("sanitizes special characters", () => {
|
|
36
|
+
const result = generateBranchName("fix", "SQL Injection!!!");
|
|
37
|
+
// Special characters become dashes, includes timestamp suffix
|
|
38
|
+
expect(result).toMatch(/^fix\/sql-injection/);
|
|
39
|
+
expect(result).toContain("sql-injection");
|
|
40
|
+
});
|
|
41
|
+
it("truncates long identifiers", () => {
|
|
42
|
+
const longId = "a".repeat(50);
|
|
43
|
+
const result = generateBranchName("fix", longId);
|
|
44
|
+
// Identifier should be truncated to 30 chars + timestamp
|
|
45
|
+
const parts = result.split("/");
|
|
46
|
+
const afterPrefix = parts[1];
|
|
47
|
+
const identifierPart = afterPrefix.split("-").slice(0, -1).join("-");
|
|
48
|
+
expect(identifierPart.length).toBeLessThanOrEqual(30);
|
|
49
|
+
});
|
|
50
|
+
it("converts to lowercase", () => {
|
|
51
|
+
const result = generateBranchName("FIX", "XSS-Attack");
|
|
52
|
+
expect(result).toMatch(/^FIX\/xss-attack-[a-z0-9]+$/);
|
|
53
|
+
});
|
|
54
|
+
it("removes consecutive dashes", () => {
|
|
55
|
+
const result = generateBranchName("fix", "foo---bar");
|
|
56
|
+
expect(result).toMatch(/^fix\/foo-bar-[a-z0-9]+$/);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=branch-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branch-manager.test.js","sourceRoot":"","sources":["../../../src/__tests__/autofix/branch-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-generator.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/autofix/commit-generator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateCommitMessage, generateCommitBody, generatePRTitle, generatePRBody, groupFixesBySeverity, groupFixesByFile, groupFixesByPattern, } from "../../autofix/commit-generator.js";
|
|
3
|
+
describe("commit-generator", () => {
|
|
4
|
+
const mockFixResults = [
|
|
5
|
+
{
|
|
6
|
+
findingId: "sec-001",
|
|
7
|
+
file: "src/auth.ts",
|
|
8
|
+
applied: true,
|
|
9
|
+
diff: { before: "old", after: "new", lineNumber: 10 },
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
findingId: "sec-002",
|
|
13
|
+
file: "src/api.ts",
|
|
14
|
+
applied: true,
|
|
15
|
+
diff: { before: "old2", after: "new2", lineNumber: 25 },
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
findingId: "perf-001",
|
|
19
|
+
file: "src/auth.ts",
|
|
20
|
+
applied: true,
|
|
21
|
+
diff: { before: "old3", after: "new3", lineNumber: 50 },
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
describe("generateCommitMessage", () => {
|
|
25
|
+
it("generates message for single fix", () => {
|
|
26
|
+
const result = generateCommitMessage([mockFixResults[0]], "high");
|
|
27
|
+
expect(result).toContain("fix");
|
|
28
|
+
expect(result).toContain("sec-001");
|
|
29
|
+
});
|
|
30
|
+
it("generates message for multiple fixes", () => {
|
|
31
|
+
const result = generateCommitMessage(mockFixResults, "high");
|
|
32
|
+
expect(result).toContain("3 automated fixes");
|
|
33
|
+
});
|
|
34
|
+
it("includes severity when requested", () => {
|
|
35
|
+
const result = generateCommitMessage(mockFixResults, "critical", { includeSeverity: true });
|
|
36
|
+
expect(result).toContain("[critical]");
|
|
37
|
+
});
|
|
38
|
+
it("omits severity when requested", () => {
|
|
39
|
+
const result = generateCommitMessage(mockFixResults, "critical", { includeSeverity: false });
|
|
40
|
+
expect(result).not.toContain("[critical]");
|
|
41
|
+
});
|
|
42
|
+
it("returns fallback for empty fixes", () => {
|
|
43
|
+
const result = generateCommitMessage([], undefined);
|
|
44
|
+
expect(result).toContain("no changes applied");
|
|
45
|
+
});
|
|
46
|
+
it("truncates long messages", () => {
|
|
47
|
+
const result = generateCommitMessage(mockFixResults, "critical", { maxLength: 50 });
|
|
48
|
+
expect(result.length).toBeLessThanOrEqual(50);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("generateCommitBody", () => {
|
|
52
|
+
it("includes file grouping", () => {
|
|
53
|
+
const result = generateCommitBody(mockFixResults, "high");
|
|
54
|
+
expect(result).toContain("src/auth.ts");
|
|
55
|
+
expect(result).toContain("src/api.ts");
|
|
56
|
+
});
|
|
57
|
+
it("includes severity", () => {
|
|
58
|
+
const result = generateCommitBody(mockFixResults, "critical");
|
|
59
|
+
expect(result).toContain("CRITICAL");
|
|
60
|
+
});
|
|
61
|
+
it("returns empty for no fixes", () => {
|
|
62
|
+
const result = generateCommitBody([], undefined);
|
|
63
|
+
expect(result).toBe("");
|
|
64
|
+
});
|
|
65
|
+
it("includes Vaspera attribution", () => {
|
|
66
|
+
const result = generateCommitBody(mockFixResults, "high");
|
|
67
|
+
expect(result).toContain("Vaspera Hardening");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe("generatePRTitle", () => {
|
|
71
|
+
it("generates title with severity", () => {
|
|
72
|
+
const result = generatePRTitle(mockFixResults, "high");
|
|
73
|
+
expect(result).toContain("high");
|
|
74
|
+
expect(result).toContain("3");
|
|
75
|
+
});
|
|
76
|
+
it("handles singular fix correctly", () => {
|
|
77
|
+
const result = generatePRTitle([mockFixResults[0]], "critical");
|
|
78
|
+
expect(result).toContain("1 critical-severity autofix");
|
|
79
|
+
expect(result).not.toContain("autofixes");
|
|
80
|
+
});
|
|
81
|
+
it("uses template when provided", () => {
|
|
82
|
+
const result = generatePRTitle(mockFixResults, "high", "Security: {{count}} fixes for {{severity}} issues");
|
|
83
|
+
expect(result).toBe("Security: 3 fixes for high issues");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe("generatePRBody", () => {
|
|
87
|
+
it("includes summary section", () => {
|
|
88
|
+
const result = generatePRBody(mockFixResults, "high");
|
|
89
|
+
expect(result).toContain("## Summary");
|
|
90
|
+
expect(result).toContain("automated security fixes");
|
|
91
|
+
});
|
|
92
|
+
it("includes review checklist", () => {
|
|
93
|
+
const result = generatePRBody(mockFixResults, "high");
|
|
94
|
+
expect(result).toContain("## Review Checklist");
|
|
95
|
+
expect(result).toContain("semantically correct");
|
|
96
|
+
});
|
|
97
|
+
it("includes certification ID when provided", () => {
|
|
98
|
+
const result = generatePRBody(mockFixResults, "high", { certificationId: "cert-123" });
|
|
99
|
+
expect(result).toContain("cert-123");
|
|
100
|
+
});
|
|
101
|
+
it("includes before/after when requested", () => {
|
|
102
|
+
const result = generatePRBody(mockFixResults, "high", { includeBeforeAfter: true });
|
|
103
|
+
expect(result).toContain("Before:");
|
|
104
|
+
expect(result).toContain("After:");
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe("groupFixesBySeverity", () => {
|
|
108
|
+
it("groups fixes by their severity", () => {
|
|
109
|
+
const severities = new Map([
|
|
110
|
+
["sec-001", "high"],
|
|
111
|
+
["sec-002", "high"],
|
|
112
|
+
["perf-001", "medium"],
|
|
113
|
+
]);
|
|
114
|
+
const result = groupFixesBySeverity(mockFixResults, severities);
|
|
115
|
+
expect(result.get("high")).toHaveLength(2);
|
|
116
|
+
expect(result.get("medium")).toHaveLength(1);
|
|
117
|
+
});
|
|
118
|
+
it("defaults to medium for unknown findings", () => {
|
|
119
|
+
const severities = new Map();
|
|
120
|
+
const result = groupFixesBySeverity(mockFixResults, severities);
|
|
121
|
+
expect(result.get("medium")).toHaveLength(3);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe("groupFixesByFile", () => {
|
|
125
|
+
it("groups fixes by file path", () => {
|
|
126
|
+
const result = groupFixesByFile(mockFixResults);
|
|
127
|
+
expect(result.get("src/auth.ts")).toHaveLength(2);
|
|
128
|
+
expect(result.get("src/api.ts")).toHaveLength(1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe("groupFixesByPattern", () => {
|
|
132
|
+
it("groups fixes by pattern ID", () => {
|
|
133
|
+
const result = groupFixesByPattern(mockFixResults);
|
|
134
|
+
expect(result.has("sec")).toBeTruthy();
|
|
135
|
+
expect(result.has("perf")).toBeTruthy();
|
|
136
|
+
});
|
|
137
|
+
it("extracts pattern from finding ID", () => {
|
|
138
|
+
const fixes = [
|
|
139
|
+
{ findingId: "sec-hardcoded-secret-001", file: "a.ts", applied: true },
|
|
140
|
+
{ findingId: "sec-hardcoded-secret-002", file: "b.ts", applied: true },
|
|
141
|
+
];
|
|
142
|
+
const result = groupFixesByPattern(fixes);
|
|
143
|
+
expect(result.get("sec-hardcoded-secret")).toHaveLength(2);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=commit-generator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-generator.test.js","sourceRoot":"","sources":["../../../src/__tests__/autofix/commit-generator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/autofix/constitution.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|