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.
Files changed (159) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +58 -1
  3. package/dist/__tests__/autofix/branch-manager.test.d.ts +2 -0
  4. package/dist/__tests__/autofix/branch-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/autofix/branch-manager.test.js +60 -0
  6. package/dist/__tests__/autofix/branch-manager.test.js.map +1 -0
  7. package/dist/__tests__/autofix/commit-generator.test.d.ts +2 -0
  8. package/dist/__tests__/autofix/commit-generator.test.d.ts.map +1 -0
  9. package/dist/__tests__/autofix/commit-generator.test.js +147 -0
  10. package/dist/__tests__/autofix/commit-generator.test.js.map +1 -0
  11. package/dist/__tests__/autofix/constitution.test.d.ts +9 -0
  12. package/dist/__tests__/autofix/constitution.test.d.ts.map +1 -0
  13. package/dist/__tests__/autofix/constitution.test.js +421 -0
  14. package/dist/__tests__/autofix/constitution.test.js.map +1 -0
  15. package/dist/__tests__/autofix/pr-generator.test.d.ts +2 -0
  16. package/dist/__tests__/autofix/pr-generator.test.d.ts.map +1 -0
  17. package/dist/__tests__/autofix/pr-generator.test.js +152 -0
  18. package/dist/__tests__/autofix/pr-generator.test.js.map +1 -0
  19. package/dist/__tests__/property-test-helpers.d.ts +87 -0
  20. package/dist/__tests__/property-test-helpers.d.ts.map +1 -0
  21. package/dist/__tests__/property-test-helpers.js +136 -0
  22. package/dist/__tests__/property-test-helpers.js.map +1 -0
  23. package/dist/__tests__/scanners/dast/index.test.d.ts +2 -0
  24. package/dist/__tests__/scanners/dast/index.test.d.ts.map +1 -0
  25. package/dist/__tests__/scanners/dast/index.test.js +183 -0
  26. package/dist/__tests__/scanners/dast/index.test.js.map +1 -0
  27. package/dist/__tests__/scanners/dast/nuclei.test.d.ts +2 -0
  28. package/dist/__tests__/scanners/dast/nuclei.test.d.ts.map +1 -0
  29. package/dist/__tests__/scanners/dast/nuclei.test.js +166 -0
  30. package/dist/__tests__/scanners/dast/nuclei.test.js.map +1 -0
  31. package/dist/__tests__/scanners/dast/zap.test.d.ts +2 -0
  32. package/dist/__tests__/scanners/dast/zap.test.d.ts.map +1 -0
  33. package/dist/__tests__/scanners/dast/zap.test.js +158 -0
  34. package/dist/__tests__/scanners/dast/zap.test.js.map +1 -0
  35. package/dist/__tests__/scanners/fp-feedback.test.d.ts +2 -0
  36. package/dist/__tests__/scanners/fp-feedback.test.d.ts.map +1 -0
  37. package/dist/__tests__/scanners/fp-feedback.test.js +202 -0
  38. package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -0
  39. package/dist/__tests__/scanners/fp-filter.property.test.d.ts +9 -0
  40. package/dist/__tests__/scanners/fp-filter.property.test.d.ts.map +1 -0
  41. package/dist/__tests__/scanners/fp-filter.property.test.js +253 -0
  42. package/dist/__tests__/scanners/fp-filter.property.test.js.map +1 -0
  43. package/dist/__tests__/scanners/fp-filter.test.d.ts +2 -0
  44. package/dist/__tests__/scanners/fp-filter.test.d.ts.map +1 -0
  45. package/dist/__tests__/scanners/fp-filter.test.js +234 -0
  46. package/dist/__tests__/scanners/fp-filter.test.js.map +1 -0
  47. package/dist/__tests__/scanners/fp-tracker.test.d.ts +2 -0
  48. package/dist/__tests__/scanners/fp-tracker.test.d.ts.map +1 -0
  49. package/dist/__tests__/scanners/fp-tracker.test.js +262 -0
  50. package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -0
  51. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts +10 -0
  52. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.d.ts.map +1 -0
  53. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js +238 -0
  54. package/dist/__tests__/scanners/logic/endpoint-analyzer.property.test.js.map +1 -0
  55. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts +2 -0
  56. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.d.ts.map +1 -0
  57. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js +55 -0
  58. package/dist/__tests__/scanners/logic/endpoint-analyzer.test.js.map +1 -0
  59. package/dist/__tests__/scanners/logic/index.test.d.ts +2 -0
  60. package/dist/__tests__/scanners/logic/index.test.d.ts.map +1 -0
  61. package/dist/__tests__/scanners/logic/index.test.js +165 -0
  62. package/dist/__tests__/scanners/logic/index.test.js.map +1 -0
  63. package/dist/__tests__/scanners/logic/types.test.d.ts +2 -0
  64. package/dist/__tests__/scanners/logic/types.test.d.ts.map +1 -0
  65. package/dist/__tests__/scanners/logic/types.test.js +85 -0
  66. package/dist/__tests__/scanners/logic/types.test.js.map +1 -0
  67. package/dist/action/pr-comment.test.js +4 -0
  68. package/dist/action/pr-comment.test.js.map +1 -1
  69. package/dist/action/sarif-upload.test.js +4 -0
  70. package/dist/action/sarif-upload.test.js.map +1 -1
  71. package/dist/autofix/branch-manager.d.ts +115 -0
  72. package/dist/autofix/branch-manager.d.ts.map +1 -0
  73. package/dist/autofix/branch-manager.js +308 -0
  74. package/dist/autofix/branch-manager.js.map +1 -0
  75. package/dist/autofix/commit-generator.d.ts +55 -0
  76. package/dist/autofix/commit-generator.d.ts.map +1 -0
  77. package/dist/autofix/commit-generator.js +277 -0
  78. package/dist/autofix/commit-generator.js.map +1 -0
  79. package/dist/autofix/constitution.d.ts +77 -0
  80. package/dist/autofix/constitution.d.ts.map +1 -0
  81. package/dist/autofix/constitution.js +261 -0
  82. package/dist/autofix/constitution.js.map +1 -0
  83. package/dist/autofix/constitution.schema.d.ts +441 -0
  84. package/dist/autofix/constitution.schema.d.ts.map +1 -0
  85. package/dist/autofix/constitution.schema.js +144 -0
  86. package/dist/autofix/constitution.schema.js.map +1 -0
  87. package/dist/autofix/index.d.ts +13 -0
  88. package/dist/autofix/index.d.ts.map +1 -0
  89. package/dist/autofix/index.js +15 -0
  90. package/dist/autofix/index.js.map +1 -0
  91. package/dist/autofix/pr-generator.d.ts +57 -0
  92. package/dist/autofix/pr-generator.d.ts.map +1 -0
  93. package/dist/autofix/pr-generator.js +597 -0
  94. package/dist/autofix/pr-generator.js.map +1 -0
  95. package/dist/autofix/types.d.ts +151 -0
  96. package/dist/autofix/types.d.ts.map +1 -0
  97. package/dist/autofix/types.js +22 -0
  98. package/dist/autofix/types.js.map +1 -0
  99. package/dist/eval/fixtures.d.ts +20 -0
  100. package/dist/eval/fixtures.d.ts.map +1 -1
  101. package/dist/eval/fixtures.js +430 -0
  102. package/dist/eval/fixtures.js.map +1 -1
  103. package/dist/scanners/cache.d.ts.map +1 -1
  104. package/dist/scanners/cache.js +4 -0
  105. package/dist/scanners/cache.js.map +1 -1
  106. package/dist/scanners/dast/index.d.ts +39 -0
  107. package/dist/scanners/dast/index.d.ts.map +1 -0
  108. package/dist/scanners/dast/index.js +259 -0
  109. package/dist/scanners/dast/index.js.map +1 -0
  110. package/dist/scanners/dast/nuclei.d.ts +26 -0
  111. package/dist/scanners/dast/nuclei.d.ts.map +1 -0
  112. package/dist/scanners/dast/nuclei.js +354 -0
  113. package/dist/scanners/dast/nuclei.js.map +1 -0
  114. package/dist/scanners/dast/types.d.ts +306 -0
  115. package/dist/scanners/dast/types.d.ts.map +1 -0
  116. package/dist/scanners/dast/types.js +52 -0
  117. package/dist/scanners/dast/types.js.map +1 -0
  118. package/dist/scanners/dast/zap.d.ts +26 -0
  119. package/dist/scanners/dast/zap.d.ts.map +1 -0
  120. package/dist/scanners/dast/zap.js +453 -0
  121. package/dist/scanners/dast/zap.js.map +1 -0
  122. package/dist/scanners/fp-feedback.d.ts +140 -0
  123. package/dist/scanners/fp-feedback.d.ts.map +1 -0
  124. package/dist/scanners/fp-feedback.js +292 -0
  125. package/dist/scanners/fp-feedback.js.map +1 -0
  126. package/dist/scanners/fp-filter.d.ts +94 -0
  127. package/dist/scanners/fp-filter.d.ts.map +1 -0
  128. package/dist/scanners/fp-filter.js +397 -0
  129. package/dist/scanners/fp-filter.js.map +1 -0
  130. package/dist/scanners/fp-tracker.d.ts +125 -0
  131. package/dist/scanners/fp-tracker.d.ts.map +1 -0
  132. package/dist/scanners/fp-tracker.js +330 -0
  133. package/dist/scanners/fp-tracker.js.map +1 -0
  134. package/dist/scanners/index.d.ts.map +1 -1
  135. package/dist/scanners/index.js +56 -0
  136. package/dist/scanners/index.js.map +1 -1
  137. package/dist/scanners/index.test.js +6 -6
  138. package/dist/scanners/index.test.js.map +1 -1
  139. package/dist/scanners/logic/auth-flow-analyzer.d.ts +18 -0
  140. package/dist/scanners/logic/auth-flow-analyzer.d.ts.map +1 -0
  141. package/dist/scanners/logic/auth-flow-analyzer.js +384 -0
  142. package/dist/scanners/logic/auth-flow-analyzer.js.map +1 -0
  143. package/dist/scanners/logic/endpoint-analyzer.d.ts +29 -0
  144. package/dist/scanners/logic/endpoint-analyzer.d.ts.map +1 -0
  145. package/dist/scanners/logic/endpoint-analyzer.js +528 -0
  146. package/dist/scanners/logic/endpoint-analyzer.js.map +1 -0
  147. package/dist/scanners/logic/index.d.ts +41 -0
  148. package/dist/scanners/logic/index.d.ts.map +1 -0
  149. package/dist/scanners/logic/index.js +268 -0
  150. package/dist/scanners/logic/index.js.map +1 -0
  151. package/dist/scanners/logic/types.d.ts +254 -0
  152. package/dist/scanners/logic/types.d.ts.map +1 -0
  153. package/dist/scanners/logic/types.js +142 -0
  154. package/dist/scanners/logic/types.js.map +1 -0
  155. package/dist/scanners/types.d.ts +1 -1
  156. package/dist/scanners/types.d.ts.map +1 -1
  157. package/dist/scanners/types.js +4 -0
  158. package/dist/scanners/types.js.map +1 -1
  159. 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
  ![npm version](https://img.shields.io/npm/v/vaspera)
6
6
  ![License](https://img.shields.io/badge/License-MIT-green)
7
- ![Tools](https://img.shields.io/badge/MCP_Tools-68-purple)
7
+ ![Tools](https://img.shields.io/badge/MCP_Tools-78-purple)
8
8
  ![AI Frameworks](https://img.shields.io/badge/AI_Frameworks-5-blue)
9
9
  ![Scanners](https://img.shields.io/badge/Scanners-12-orange)
10
+ ![Tests](https://img.shields.io/badge/Tests-2942-brightgreen)
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=branch-manager.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=commit-generator.test.d.ts.map
@@ -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,9 @@
1
+ /**
2
+ * Constitution Tests
3
+ *
4
+ * Tests for the constitution schema, loader, and evaluation logic.
5
+ *
6
+ * @module __tests__/autofix/constitution
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=constitution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/autofix/constitution.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}