vaspera 2.9.2 → 2.10.1
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/ai-code/ai-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js +188 -0
- package/dist/__tests__/scanners/ai-code/ai-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js +363 -0
- package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js +226 -0
- package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/ai-code/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/ai-code/index.test.js +214 -0
- package/dist/__tests__/scanners/ai-code/index.test.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/deploy/health-checker.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js +67 -0
- package/dist/__tests__/scanners/deploy/health-checker.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/index.test.js +84 -0
- package/dist/__tests__/scanners/deploy/index.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js +88 -0
- package/dist/__tests__/scanners/deploy/provider-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/deploy/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/deploy/types.test.js +126 -0
- package/dist/__tests__/scanners/deploy/types.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/__tests__/scanners/runtime/app-launcher.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js +94 -0
- package/dist/__tests__/scanners/runtime/app-launcher.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +195 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/index.test.js +120 -0
- package/dist/__tests__/scanners/runtime/index.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/runtime/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/runtime/types.test.js +126 -0
- package/dist/__tests__/scanners/runtime/types.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js +187 -0
- package/dist/__tests__/scanners/scale/bottleneck-detector.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/index.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/index.test.js +87 -0
- package/dist/__tests__/scanners/scale/index.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js +122 -0
- package/dist/__tests__/scanners/scale/load-profiler.test.js.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts +2 -0
- package/dist/__tests__/scanners/scale/types.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/scale/types.test.js +129 -0
- package/dist/__tests__/scanners/scale/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/index.d.ts.map +1 -1
- package/dist/index.js +874 -0
- package/dist/index.js.map +1 -1
- package/dist/install-skills.d.ts +11 -0
- package/dist/install-skills.d.ts.map +1 -0
- package/dist/install-skills.js +81 -0
- package/dist/install-skills.js.map +1 -0
- package/dist/scanners/ai-code/ai-detector.d.ts +25 -0
- package/dist/scanners/ai-code/ai-detector.d.ts.map +1 -0
- package/dist/scanners/ai-code/ai-detector.js +192 -0
- package/dist/scanners/ai-code/ai-detector.js.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts +40 -0
- package/dist/scanners/ai-code/confidence-scorer.d.ts.map +1 -0
- package/dist/scanners/ai-code/confidence-scorer.js +148 -0
- package/dist/scanners/ai-code/confidence-scorer.js.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts +36 -0
- package/dist/scanners/ai-code/hallucination-checker.d.ts.map +1 -0
- package/dist/scanners/ai-code/hallucination-checker.js +298 -0
- package/dist/scanners/ai-code/hallucination-checker.js.map +1 -0
- package/dist/scanners/ai-code/index.d.ts +30 -0
- package/dist/scanners/ai-code/index.d.ts.map +1 -0
- package/dist/scanners/ai-code/index.js +224 -0
- package/dist/scanners/ai-code/index.js.map +1 -0
- package/dist/scanners/ai-code/types.d.ts +192 -0
- package/dist/scanners/ai-code/types.d.ts.map +1 -0
- package/dist/scanners/ai-code/types.js +37 -0
- package/dist/scanners/ai-code/types.js.map +1 -0
- 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/deploy/health-checker.d.ts +38 -0
- package/dist/scanners/deploy/health-checker.d.ts.map +1 -0
- package/dist/scanners/deploy/health-checker.js +272 -0
- package/dist/scanners/deploy/health-checker.js.map +1 -0
- package/dist/scanners/deploy/index.d.ts +44 -0
- package/dist/scanners/deploy/index.d.ts.map +1 -0
- package/dist/scanners/deploy/index.js +208 -0
- package/dist/scanners/deploy/index.js.map +1 -0
- package/dist/scanners/deploy/provider-detector.d.ts +25 -0
- package/dist/scanners/deploy/provider-detector.d.ts.map +1 -0
- package/dist/scanners/deploy/provider-detector.js +177 -0
- package/dist/scanners/deploy/provider-detector.js.map +1 -0
- package/dist/scanners/deploy/types.d.ts +406 -0
- package/dist/scanners/deploy/types.d.ts.map +1 -0
- package/dist/scanners/deploy/types.js +58 -0
- package/dist/scanners/deploy/types.js.map +1 -0
- package/dist/scanners/deploy/vercel-integration.d.ts +52 -0
- package/dist/scanners/deploy/vercel-integration.d.ts.map +1 -0
- package/dist/scanners/deploy/vercel-integration.js +280 -0
- package/dist/scanners/deploy/vercel-integration.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/runtime/app-launcher.d.ts +33 -0
- package/dist/scanners/runtime/app-launcher.d.ts.map +1 -0
- package/dist/scanners/runtime/app-launcher.js +419 -0
- package/dist/scanners/runtime/app-launcher.js.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts +48 -0
- package/dist/scanners/runtime/golden-path-runner.d.ts.map +1 -0
- package/dist/scanners/runtime/golden-path-runner.js +373 -0
- package/dist/scanners/runtime/golden-path-runner.js.map +1 -0
- package/dist/scanners/runtime/index.d.ts +41 -0
- package/dist/scanners/runtime/index.d.ts.map +1 -0
- package/dist/scanners/runtime/index.js +164 -0
- package/dist/scanners/runtime/index.js.map +1 -0
- package/dist/scanners/runtime/playwright-executor.d.ts +50 -0
- package/dist/scanners/runtime/playwright-executor.d.ts.map +1 -0
- package/dist/scanners/runtime/playwright-executor.js +387 -0
- package/dist/scanners/runtime/playwright-executor.js.map +1 -0
- package/dist/scanners/runtime/types.d.ts +215 -0
- package/dist/scanners/runtime/types.d.ts.map +1 -0
- package/dist/scanners/runtime/types.js +40 -0
- package/dist/scanners/runtime/types.js.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts +17 -0
- package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -0
- package/dist/scanners/scale/bottleneck-detector.js +250 -0
- package/dist/scanners/scale/bottleneck-detector.js.map +1 -0
- package/dist/scanners/scale/capacity-estimator.d.ts +17 -0
- package/dist/scanners/scale/capacity-estimator.d.ts.map +1 -0
- package/dist/scanners/scale/capacity-estimator.js +197 -0
- package/dist/scanners/scale/capacity-estimator.js.map +1 -0
- package/dist/scanners/scale/index.d.ts +37 -0
- package/dist/scanners/scale/index.d.ts.map +1 -0
- package/dist/scanners/scale/index.js +101 -0
- package/dist/scanners/scale/index.js.map +1 -0
- package/dist/scanners/scale/load-profiler.d.ts +48 -0
- package/dist/scanners/scale/load-profiler.d.ts.map +1 -0
- package/dist/scanners/scale/load-profiler.js +377 -0
- package/dist/scanners/scale/load-profiler.js.map +1 -0
- package/dist/scanners/scale/types.d.ts +529 -0
- package/dist/scanners/scale/types.d.ts.map +1 -0
- package/dist/scanners/scale/types.js +57 -0
- package/dist/scanners/scale/types.js.map +1 -0
- package/dist/scanners/secrets.d.ts.map +1 -1
- package/dist/scanners/secrets.js +13 -2
- package/dist/scanners/secrets.js.map +1 -1
- 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 +8 -4
- package/skills/vaspera-add-tests/SKILL.md +102 -0
- package/skills/vaspera-ai-verify/SKILL.md +166 -0
- package/skills/vaspera-audit/SKILL.md +67 -0
- package/skills/vaspera-certify/SKILL.md +130 -0
- package/skills/vaspera-deploy/SKILL.md +152 -0
- package/skills/vaspera-fix-critical/SKILL.md +52 -0
- package/skills/vaspera-fix-high/SKILL.md +81 -0
- package/skills/vaspera-fix-medium/SKILL.md +56 -0
- package/skills/vaspera-fix-rls/SKILL.md +85 -0
- package/skills/vaspera-harden/SKILL.md +102 -0
- package/skills/vaspera-help/SKILL.md +61 -0
- package/skills/vaspera-load-test/SKILL.md +167 -0
- package/skills/vaspera-verify/SKILL.md +70 -0
- package/skills/vaspera-verify-e2e/SKILL.md +117 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commit Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates conventional commit messages for autofix PRs.
|
|
5
|
+
*
|
|
6
|
+
* @module autofix/commit-generator
|
|
7
|
+
*/
|
|
8
|
+
import { git, getStagedFiles } from "./branch-manager.js";
|
|
9
|
+
import { logger } from "../logger.js";
|
|
10
|
+
/**
|
|
11
|
+
* Map severity to commit urgency indicators
|
|
12
|
+
*/
|
|
13
|
+
const SEVERITY_INDICATORS = {
|
|
14
|
+
critical: "🚨",
|
|
15
|
+
high: "⚠️",
|
|
16
|
+
medium: "🔧",
|
|
17
|
+
low: "📝",
|
|
18
|
+
info: "ℹ️",
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Map pattern categories to commit types
|
|
22
|
+
*/
|
|
23
|
+
function getCommitType(patternId) {
|
|
24
|
+
if (patternId.startsWith("sec-")) {
|
|
25
|
+
return "security";
|
|
26
|
+
}
|
|
27
|
+
if (patternId.startsWith("perf-")) {
|
|
28
|
+
return "perf";
|
|
29
|
+
}
|
|
30
|
+
if (patternId.startsWith("type-") || patternId.startsWith("qual-")) {
|
|
31
|
+
return "refactor";
|
|
32
|
+
}
|
|
33
|
+
return "fix";
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate a commit message for a batch of fixes
|
|
37
|
+
*/
|
|
38
|
+
export function generateCommitMessage(fixes, severity, options) {
|
|
39
|
+
const { includeEmoji = false, includeSeverity = true, maxLength = 72, } = options ?? {};
|
|
40
|
+
const appliedFixes = fixes.filter((f) => f.applied || f.diff);
|
|
41
|
+
if (appliedFixes.length === 0) {
|
|
42
|
+
return "chore: attempted autofix (no changes applied)";
|
|
43
|
+
}
|
|
44
|
+
// Group by pattern type
|
|
45
|
+
const patterns = new Map();
|
|
46
|
+
const files = new Set();
|
|
47
|
+
for (const fix of appliedFixes) {
|
|
48
|
+
files.add(fix.file);
|
|
49
|
+
// Extract pattern from findingId (e.g., "sec-001" -> "sec")
|
|
50
|
+
const parts = fix.findingId.split("-");
|
|
51
|
+
if (parts.length >= 1) {
|
|
52
|
+
const prefix = parts[0];
|
|
53
|
+
patterns.set(prefix, (patterns.get(prefix) || 0) + 1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Determine primary commit type
|
|
57
|
+
const patternEntries = Array.from(patterns.entries());
|
|
58
|
+
const primaryPattern = patternEntries.sort((a, b) => b[1] - a[1])[0]?.[0] ?? "fix";
|
|
59
|
+
const commitType = primaryPattern === "sec" ? "security" : "fix";
|
|
60
|
+
// Build message parts
|
|
61
|
+
const parts = [];
|
|
62
|
+
// Emoji prefix
|
|
63
|
+
if (includeEmoji && severity) {
|
|
64
|
+
parts.push(SEVERITY_INDICATORS[severity]);
|
|
65
|
+
}
|
|
66
|
+
// Commit type and scope
|
|
67
|
+
const scope = commitType === "security" ? "security" : undefined;
|
|
68
|
+
const typeScope = scope ? `fix(${scope})` : "fix";
|
|
69
|
+
parts.push(`${typeScope}:`);
|
|
70
|
+
// Summary
|
|
71
|
+
if (appliedFixes.length === 1) {
|
|
72
|
+
parts.push(`Apply autofix for ${appliedFixes[0].findingId}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
parts.push(`Apply ${appliedFixes.length} automated fixes`);
|
|
76
|
+
}
|
|
77
|
+
// Severity tag
|
|
78
|
+
if (includeSeverity && severity) {
|
|
79
|
+
parts.push(`[${severity}]`);
|
|
80
|
+
}
|
|
81
|
+
let message = parts.join(" ");
|
|
82
|
+
// Truncate if needed
|
|
83
|
+
if (message.length > maxLength) {
|
|
84
|
+
message = message.slice(0, maxLength - 3) + "...";
|
|
85
|
+
}
|
|
86
|
+
return message;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate extended commit body with details
|
|
90
|
+
*/
|
|
91
|
+
export function generateCommitBody(fixes, severity) {
|
|
92
|
+
const lines = [];
|
|
93
|
+
const appliedFixes = fixes.filter((f) => f.applied || f.diff);
|
|
94
|
+
if (appliedFixes.length === 0) {
|
|
95
|
+
return "";
|
|
96
|
+
}
|
|
97
|
+
// Summary
|
|
98
|
+
lines.push("## Automated Security Fixes\n");
|
|
99
|
+
if (severity) {
|
|
100
|
+
lines.push(`Severity: **${severity.toUpperCase()}**\n`);
|
|
101
|
+
}
|
|
102
|
+
// Group fixes by file
|
|
103
|
+
const byFile = new Map();
|
|
104
|
+
for (const fix of appliedFixes) {
|
|
105
|
+
const existing = byFile.get(fix.file) || [];
|
|
106
|
+
existing.push(fix);
|
|
107
|
+
byFile.set(fix.file, existing);
|
|
108
|
+
}
|
|
109
|
+
lines.push("### Changes\n");
|
|
110
|
+
for (const [file, fileFixes] of byFile) {
|
|
111
|
+
lines.push(`- **${file}**`);
|
|
112
|
+
for (const fix of fileFixes) {
|
|
113
|
+
lines.push(` - ${fix.findingId}: Line ${fix.diff?.lineNumber || "unknown"}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
lines.push("\n---");
|
|
117
|
+
lines.push("Generated by Vaspera Hardening MCP");
|
|
118
|
+
return lines.join("\n");
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create a commit with the staged changes
|
|
122
|
+
*/
|
|
123
|
+
export async function createCommit(cwd, message, body, options) {
|
|
124
|
+
const stagedFiles = await getStagedFiles(cwd);
|
|
125
|
+
if (stagedFiles.length === 0) {
|
|
126
|
+
return { error: "No staged files to commit" };
|
|
127
|
+
}
|
|
128
|
+
// Build full commit message
|
|
129
|
+
const fullMessage = body ? `${message}\n\n${body}` : message;
|
|
130
|
+
// Add co-authors
|
|
131
|
+
let finalMessage = fullMessage;
|
|
132
|
+
const coAuthors = options?.coAuthors ?? ["Claude <noreply@anthropic.com>"];
|
|
133
|
+
if (coAuthors.length > 0) {
|
|
134
|
+
const coAuthorLines = coAuthors
|
|
135
|
+
.map((author) => `Co-Authored-By: ${author}`)
|
|
136
|
+
.join("\n");
|
|
137
|
+
finalMessage = `${finalMessage}\n\n${coAuthorLines}`;
|
|
138
|
+
}
|
|
139
|
+
// Build commit args
|
|
140
|
+
const args = ["commit", "-m", finalMessage];
|
|
141
|
+
if (options?.signOff) {
|
|
142
|
+
args.push("--signoff");
|
|
143
|
+
}
|
|
144
|
+
logger.info("git.commit", {
|
|
145
|
+
files: stagedFiles.length,
|
|
146
|
+
messagePreview: message.slice(0, 50),
|
|
147
|
+
});
|
|
148
|
+
const result = await git(args, { cwd });
|
|
149
|
+
if (!result.success) {
|
|
150
|
+
logger.error("git.commit_failed", {
|
|
151
|
+
error: result.stderr,
|
|
152
|
+
exitCode: result.exitCode,
|
|
153
|
+
});
|
|
154
|
+
return { error: result.stderr || "Commit failed" };
|
|
155
|
+
}
|
|
156
|
+
// Get the commit SHA
|
|
157
|
+
const shaResult = await git(["rev-parse", "HEAD"], { cwd });
|
|
158
|
+
const sha = shaResult.success ? shaResult.stdout : undefined;
|
|
159
|
+
logger.info("git.commit_success", { sha, files: stagedFiles.length });
|
|
160
|
+
return {
|
|
161
|
+
message,
|
|
162
|
+
sha,
|
|
163
|
+
files: stagedFiles,
|
|
164
|
+
author: "vaspera-hardening",
|
|
165
|
+
coAuthors,
|
|
166
|
+
signed: false,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Generate PR title based on fixes
|
|
171
|
+
*/
|
|
172
|
+
export function generatePRTitle(fixes, severity, template) {
|
|
173
|
+
const appliedFixes = fixes.filter((f) => f.applied || f.diff);
|
|
174
|
+
const count = appliedFixes.length;
|
|
175
|
+
const files = new Set(appliedFixes.map((f) => f.file)).size;
|
|
176
|
+
if (template) {
|
|
177
|
+
return template
|
|
178
|
+
.replace("{{count}}", String(count))
|
|
179
|
+
.replace("{{severity}}", severity ?? "mixed")
|
|
180
|
+
.replace("{{files}}", String(files));
|
|
181
|
+
}
|
|
182
|
+
if (severity) {
|
|
183
|
+
return `fix(security): Apply ${count} ${severity}-severity autofix${count !== 1 ? "es" : ""}`;
|
|
184
|
+
}
|
|
185
|
+
return `fix(security): Apply ${count} automated security fix${count !== 1 ? "es" : ""}`;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Generate PR body/description
|
|
189
|
+
*/
|
|
190
|
+
export function generatePRBody(fixes, severity, options) {
|
|
191
|
+
const lines = [];
|
|
192
|
+
const appliedFixes = fixes.filter((f) => f.applied || f.diff);
|
|
193
|
+
lines.push("## Summary\n");
|
|
194
|
+
lines.push("This PR contains automated security fixes generated by Vaspera Hardening MCP.\n");
|
|
195
|
+
if (severity) {
|
|
196
|
+
lines.push(`**Severity Level:** ${severity.toUpperCase()}\n`);
|
|
197
|
+
}
|
|
198
|
+
if (options?.certificationId) {
|
|
199
|
+
lines.push(`**Certification ID:** \`${options.certificationId}\`\n`);
|
|
200
|
+
}
|
|
201
|
+
lines.push("## Fixes Applied\n");
|
|
202
|
+
// Group by file
|
|
203
|
+
const byFile = new Map();
|
|
204
|
+
for (const fix of appliedFixes) {
|
|
205
|
+
const existing = byFile.get(fix.file) || [];
|
|
206
|
+
existing.push(fix);
|
|
207
|
+
byFile.set(fix.file, existing);
|
|
208
|
+
}
|
|
209
|
+
for (const [file, fileFixes] of byFile) {
|
|
210
|
+
lines.push(`### \`${file}\`\n`);
|
|
211
|
+
for (const fix of fileFixes) {
|
|
212
|
+
lines.push(`- **${fix.findingId}** (line ${fix.diff?.lineNumber || "?"})`);
|
|
213
|
+
if (options?.includeBeforeAfter && fix.diff) {
|
|
214
|
+
lines.push("");
|
|
215
|
+
lines.push("<details>");
|
|
216
|
+
lines.push("<summary>View changes</summary>\n");
|
|
217
|
+
lines.push("**Before:**");
|
|
218
|
+
lines.push("```");
|
|
219
|
+
lines.push(fix.diff.before);
|
|
220
|
+
lines.push("```\n");
|
|
221
|
+
lines.push("**After:**");
|
|
222
|
+
lines.push("```");
|
|
223
|
+
lines.push(fix.diff.after);
|
|
224
|
+
lines.push("```");
|
|
225
|
+
lines.push("</details>\n");
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
lines.push("\n## Review Checklist\n");
|
|
230
|
+
lines.push("- [ ] Changes are semantically correct");
|
|
231
|
+
lines.push("- [ ] No regressions introduced");
|
|
232
|
+
lines.push("- [ ] Tests pass");
|
|
233
|
+
lines.push("\n---");
|
|
234
|
+
lines.push("🤖 Generated with [Vaspera Hardening MCP](https://github.com/RCOLKITT/hardening-mcp)");
|
|
235
|
+
return lines.join("\n");
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Categorize fixes by severity
|
|
239
|
+
*/
|
|
240
|
+
export function groupFixesBySeverity(fixes, findingSeverities) {
|
|
241
|
+
const groups = new Map();
|
|
242
|
+
for (const fix of fixes) {
|
|
243
|
+
const severity = findingSeverities.get(fix.findingId) ?? "medium";
|
|
244
|
+
const existing = groups.get(severity) || [];
|
|
245
|
+
existing.push(fix);
|
|
246
|
+
groups.set(severity, existing);
|
|
247
|
+
}
|
|
248
|
+
return groups;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Categorize fixes by file
|
|
252
|
+
*/
|
|
253
|
+
export function groupFixesByFile(fixes) {
|
|
254
|
+
const groups = new Map();
|
|
255
|
+
for (const fix of fixes) {
|
|
256
|
+
const existing = groups.get(fix.file) || [];
|
|
257
|
+
existing.push(fix);
|
|
258
|
+
groups.set(fix.file, existing);
|
|
259
|
+
}
|
|
260
|
+
return groups;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Categorize fixes by pattern
|
|
264
|
+
*/
|
|
265
|
+
export function groupFixesByPattern(fixes) {
|
|
266
|
+
const groups = new Map();
|
|
267
|
+
for (const fix of fixes) {
|
|
268
|
+
// Extract pattern from findingId (e.g., "sec-hardcoded-secret-001" -> "sec-hardcoded-secret")
|
|
269
|
+
const parts = fix.findingId.split("-");
|
|
270
|
+
const patternId = parts.slice(0, -1).join("-") || fix.findingId;
|
|
271
|
+
const existing = groups.get(patternId) || [];
|
|
272
|
+
existing.push(fix);
|
|
273
|
+
groups.set(patternId, existing);
|
|
274
|
+
}
|
|
275
|
+
return groups;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=commit-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-generator.js","sourceRoot":"","sources":["../../src/autofix/commit-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constitution Loader and Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Loads constitution files and evaluates pattern approval
|
|
5
|
+
* based on risk tolerance and conditions.
|
|
6
|
+
*
|
|
7
|
+
* @module autofix/constitution
|
|
8
|
+
*/
|
|
9
|
+
import { type Constitution, type Severity } from "./constitution.schema.js";
|
|
10
|
+
import type { FixPattern } from "../certification/autofix.js";
|
|
11
|
+
/**
|
|
12
|
+
* Default constitution file locations (checked in order)
|
|
13
|
+
*/
|
|
14
|
+
export declare const CONSTITUTION_PATHS: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Load constitution from project directory
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadConstitution(projectPath: string, constitutionPath?: string): Promise<Constitution>;
|
|
19
|
+
/**
|
|
20
|
+
* Result of pattern approval check
|
|
21
|
+
*/
|
|
22
|
+
export interface ApprovalResult {
|
|
23
|
+
/** Whether the pattern is approved for auto-application */
|
|
24
|
+
approved: boolean;
|
|
25
|
+
/** Reason for the decision */
|
|
26
|
+
reason?: string;
|
|
27
|
+
/** Required reviewer if not auto-approved */
|
|
28
|
+
requiredReviewer?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Context for evaluating pattern approval
|
|
32
|
+
*/
|
|
33
|
+
export interface ApprovalContext {
|
|
34
|
+
/** File path being fixed */
|
|
35
|
+
filePath: string;
|
|
36
|
+
/** Severity of the finding */
|
|
37
|
+
severity: Severity;
|
|
38
|
+
/** Number of lines changed (optional) */
|
|
39
|
+
linesChanged?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a pattern is approved for auto-application
|
|
43
|
+
*/
|
|
44
|
+
export declare function isPatternApproved(constitution: Constitution, pattern: FixPattern, context: ApprovalContext): ApprovalResult;
|
|
45
|
+
/**
|
|
46
|
+
* Result of path check
|
|
47
|
+
*/
|
|
48
|
+
export interface PathCheckResult {
|
|
49
|
+
/** Whether the path is allowed for autofix */
|
|
50
|
+
allowed: boolean;
|
|
51
|
+
/** Reason for the decision */
|
|
52
|
+
reason?: string;
|
|
53
|
+
/** Whether additional review is required */
|
|
54
|
+
requiresReview: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if file path is allowed for autofix
|
|
58
|
+
*/
|
|
59
|
+
export declare function isPathAllowed(constitution: Constitution, filePath: string): PathCheckResult;
|
|
60
|
+
/**
|
|
61
|
+
* Get effective safeToAutoApply status for patterns based on constitution
|
|
62
|
+
*/
|
|
63
|
+
export declare function getEffectivePatterns(constitution: Constitution, patterns: FixPattern[]): FixPattern[];
|
|
64
|
+
/**
|
|
65
|
+
* Validate a constitution file
|
|
66
|
+
*/
|
|
67
|
+
export declare function validateConstitution(content: unknown): {
|
|
68
|
+
valid: boolean;
|
|
69
|
+
errors?: string[];
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Generate a default constitution file content
|
|
73
|
+
*/
|
|
74
|
+
export declare function generateDefaultConstitution(): string;
|
|
75
|
+
export { ConstitutionSchema, DEFAULT_CONSTITUTION } from "./constitution.schema.js";
|
|
76
|
+
export type { Constitution, RiskTolerance, Severity, PatternApproval, PRRules, DirectoryRules, SafetyConstraints, } from "./constitution.schema.js";
|
|
77
|
+
//# sourceMappingURL=constitution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution.d.ts","sourceRoot":"","sources":["../../src/autofix/constitution.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAGL,KAAK,YAAY,EAEjB,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D;;GAEG;AACH,eAAO,MAAM,kBAAkB,UAM9B,CAAC;AAEF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAuBvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,CAAC;IAClB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,eAAe,GACvB,cAAc,CA0EhB;AAoCD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,GACf,eAAe,CAwBjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,UAAU,EAAE,GACrB,UAAU,EAAE,CAwBd;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,GACf;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAWvC;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAyDpD;AAGD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACpF,YAAY,EACV,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,eAAe,EACf,OAAO,EACP,cAAc,EACd,iBAAiB,GAClB,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constitution Loader and Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Loads constitution files and evaluates pattern approval
|
|
5
|
+
* based on risk tolerance and conditions.
|
|
6
|
+
*
|
|
7
|
+
* @module autofix/constitution
|
|
8
|
+
*/
|
|
9
|
+
import { readFile } from "fs/promises";
|
|
10
|
+
import { join } from "path";
|
|
11
|
+
import { parse as parseYaml } from "yaml";
|
|
12
|
+
import { ConstitutionSchema, DEFAULT_CONSTITUTION, } from "./constitution.schema.js";
|
|
13
|
+
import { logger } from "../logger.js";
|
|
14
|
+
/**
|
|
15
|
+
* Default constitution file locations (checked in order)
|
|
16
|
+
*/
|
|
17
|
+
export const CONSTITUTION_PATHS = [
|
|
18
|
+
".vaspera/constitution.yaml",
|
|
19
|
+
".vaspera/constitution.yml",
|
|
20
|
+
".vaspera/constitution.json",
|
|
21
|
+
"vaspera.constitution.yaml",
|
|
22
|
+
"vaspera.constitution.json",
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Load constitution from project directory
|
|
26
|
+
*/
|
|
27
|
+
export async function loadConstitution(projectPath, constitutionPath) {
|
|
28
|
+
const pathsToTry = constitutionPath
|
|
29
|
+
? [constitutionPath]
|
|
30
|
+
: CONSTITUTION_PATHS.map((p) => join(projectPath, p));
|
|
31
|
+
for (const path of pathsToTry) {
|
|
32
|
+
try {
|
|
33
|
+
const content = await readFile(path, "utf-8");
|
|
34
|
+
const parsed = path.endsWith(".json")
|
|
35
|
+
? JSON.parse(content)
|
|
36
|
+
: parseYaml(content);
|
|
37
|
+
const validated = ConstitutionSchema.parse(parsed);
|
|
38
|
+
logger.info("constitution.loaded", { path });
|
|
39
|
+
return validated;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Continue to next path
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Return default constitution if none found
|
|
46
|
+
logger.info("constitution.using_defaults", { projectPath });
|
|
47
|
+
return DEFAULT_CONSTITUTION;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if a pattern is approved for auto-application
|
|
51
|
+
*/
|
|
52
|
+
export function isPatternApproved(constitution, pattern, context) {
|
|
53
|
+
// Find pattern-specific rule
|
|
54
|
+
const patternRule = constitution.patterns.find((p) => p.patternId === pattern.patternId);
|
|
55
|
+
// If no specific rule, use risk tolerance
|
|
56
|
+
if (!patternRule) {
|
|
57
|
+
return evaluateByRiskTolerance(constitution.riskTolerance, pattern);
|
|
58
|
+
}
|
|
59
|
+
// Check explicit approval
|
|
60
|
+
if (!patternRule.autoApprove) {
|
|
61
|
+
return {
|
|
62
|
+
approved: false,
|
|
63
|
+
reason: `Pattern ${pattern.patternId} requires manual review`,
|
|
64
|
+
requiredReviewer: patternRule.requiredReviewer,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
// Check conditions
|
|
68
|
+
if (patternRule.conditions) {
|
|
69
|
+
const { allowedPaths, excludedPaths, maxLinesChanged, minSeverity } = patternRule.conditions;
|
|
70
|
+
// Check allowed paths
|
|
71
|
+
if (allowedPaths && allowedPaths.length > 0) {
|
|
72
|
+
const inAllowed = allowedPaths.some((p) => context.filePath.includes(p));
|
|
73
|
+
if (!inAllowed) {
|
|
74
|
+
return {
|
|
75
|
+
approved: false,
|
|
76
|
+
reason: `File path ${context.filePath} not in allowed paths`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Check excluded paths
|
|
81
|
+
if (excludedPaths && excludedPaths.length > 0) {
|
|
82
|
+
const inExcluded = excludedPaths.some((p) => context.filePath.includes(p));
|
|
83
|
+
if (inExcluded) {
|
|
84
|
+
return {
|
|
85
|
+
approved: false,
|
|
86
|
+
reason: `File path ${context.filePath} is in excluded paths`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Check max lines changed
|
|
91
|
+
if (maxLinesChanged !== undefined &&
|
|
92
|
+
context.linesChanged !== undefined &&
|
|
93
|
+
context.linesChanged > maxLinesChanged) {
|
|
94
|
+
return {
|
|
95
|
+
approved: false,
|
|
96
|
+
reason: `Change affects ${context.linesChanged} lines, exceeds max ${maxLinesChanged}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Check min severity
|
|
100
|
+
if (minSeverity) {
|
|
101
|
+
const severityOrder = ["info", "low", "medium", "high", "critical"];
|
|
102
|
+
const minIdx = severityOrder.indexOf(minSeverity);
|
|
103
|
+
const actualIdx = severityOrder.indexOf(context.severity);
|
|
104
|
+
if (actualIdx < minIdx) {
|
|
105
|
+
return {
|
|
106
|
+
approved: false,
|
|
107
|
+
reason: `Severity ${context.severity} below minimum ${minSeverity}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { approved: true };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Evaluate pattern approval by risk tolerance
|
|
116
|
+
*/
|
|
117
|
+
function evaluateByRiskTolerance(tolerance, pattern) {
|
|
118
|
+
switch (tolerance) {
|
|
119
|
+
case "conservative":
|
|
120
|
+
// Only auto-apply patterns marked as safe with low risk
|
|
121
|
+
if (pattern.safeToAutoApply && pattern.risk === "low") {
|
|
122
|
+
return { approved: true };
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
approved: false,
|
|
126
|
+
reason: "Conservative mode: only low-risk safe patterns auto-applied",
|
|
127
|
+
};
|
|
128
|
+
case "moderate":
|
|
129
|
+
// Auto-apply safe patterns and low/medium risk
|
|
130
|
+
if (pattern.safeToAutoApply || pattern.risk !== "high") {
|
|
131
|
+
return { approved: true };
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
approved: false,
|
|
135
|
+
reason: "Moderate mode: high-risk patterns require review",
|
|
136
|
+
};
|
|
137
|
+
case "aggressive":
|
|
138
|
+
// Auto-apply all patterns
|
|
139
|
+
return { approved: true };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if file path is allowed for autofix
|
|
144
|
+
*/
|
|
145
|
+
export function isPathAllowed(constitution, filePath) {
|
|
146
|
+
const { neverAutofix, requireReview } = constitution.directories;
|
|
147
|
+
// Check never-autofix directories
|
|
148
|
+
const inNeverAutofix = neverAutofix.some((dir) => filePath.includes(dir));
|
|
149
|
+
if (inNeverAutofix) {
|
|
150
|
+
return {
|
|
151
|
+
allowed: false,
|
|
152
|
+
reason: `Path ${filePath} is in never-autofix directory`,
|
|
153
|
+
requiresReview: false,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Check require-review directories (allowed but flagged)
|
|
157
|
+
const inRequireReview = requireReview.some((dir) => filePath.includes(dir));
|
|
158
|
+
if (inRequireReview) {
|
|
159
|
+
return {
|
|
160
|
+
allowed: true,
|
|
161
|
+
reason: `Path ${filePath} requires additional review`,
|
|
162
|
+
requiresReview: true,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return { allowed: true, requiresReview: false };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get effective safeToAutoApply status for patterns based on constitution
|
|
169
|
+
*/
|
|
170
|
+
export function getEffectivePatterns(constitution, patterns) {
|
|
171
|
+
return patterns.map((pattern) => {
|
|
172
|
+
const rule = constitution.patterns.find((p) => p.patternId === pattern.patternId);
|
|
173
|
+
if (rule) {
|
|
174
|
+
return {
|
|
175
|
+
...pattern,
|
|
176
|
+
safeToAutoApply: rule.autoApprove,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Apply risk tolerance
|
|
180
|
+
const { approved } = evaluateByRiskTolerance(constitution.riskTolerance, pattern);
|
|
181
|
+
return {
|
|
182
|
+
...pattern,
|
|
183
|
+
safeToAutoApply: approved,
|
|
184
|
+
};
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Validate a constitution file
|
|
189
|
+
*/
|
|
190
|
+
export function validateConstitution(content) {
|
|
191
|
+
const result = ConstitutionSchema.safeParse(content);
|
|
192
|
+
if (result.success) {
|
|
193
|
+
return { valid: true };
|
|
194
|
+
}
|
|
195
|
+
const errors = result.error.errors.map((e) => `${e.path.join(".")}: ${e.message}`);
|
|
196
|
+
return { valid: false, errors };
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Generate a default constitution file content
|
|
200
|
+
*/
|
|
201
|
+
export function generateDefaultConstitution() {
|
|
202
|
+
return `# Vaspera Autofix Constitution
|
|
203
|
+
# This file governs which patterns can be automatically applied
|
|
204
|
+
# and under what conditions.
|
|
205
|
+
|
|
206
|
+
version: "1.0"
|
|
207
|
+
|
|
208
|
+
# Risk tolerance: conservative | moderate | aggressive
|
|
209
|
+
# - conservative: Only auto-apply safe patterns with low risk
|
|
210
|
+
# - moderate: Auto-apply safe patterns and low/medium risk
|
|
211
|
+
# - aggressive: Auto-apply all patterns
|
|
212
|
+
riskTolerance: "conservative"
|
|
213
|
+
|
|
214
|
+
# Pattern-specific approvals
|
|
215
|
+
patterns:
|
|
216
|
+
# Example: Auto-approve console.log removal
|
|
217
|
+
- patternId: "qual-console-log"
|
|
218
|
+
autoApprove: true
|
|
219
|
+
|
|
220
|
+
# Example: Require security review for SQL fixes
|
|
221
|
+
- patternId: "sec-sql-injection"
|
|
222
|
+
autoApprove: false
|
|
223
|
+
requiredReviewer: "security-team"
|
|
224
|
+
|
|
225
|
+
# PR creation rules
|
|
226
|
+
prRules:
|
|
227
|
+
requireApproval: true
|
|
228
|
+
minApprovers: 1
|
|
229
|
+
requiredLabels:
|
|
230
|
+
- autofix
|
|
231
|
+
- security
|
|
232
|
+
commitPrefix: "fix(security):"
|
|
233
|
+
maxPRsPerRun: 10
|
|
234
|
+
groupBy: "severity"
|
|
235
|
+
|
|
236
|
+
# Directory restrictions
|
|
237
|
+
directories:
|
|
238
|
+
neverAutofix:
|
|
239
|
+
- node_modules
|
|
240
|
+
- vendor
|
|
241
|
+
- .git
|
|
242
|
+
- dist
|
|
243
|
+
requireReview:
|
|
244
|
+
- src/auth/
|
|
245
|
+
- src/crypto/
|
|
246
|
+
- src/payment/
|
|
247
|
+
|
|
248
|
+
# Safety constraints
|
|
249
|
+
safety:
|
|
250
|
+
requireCleanWorkingTree: true
|
|
251
|
+
createBackupBranch: true
|
|
252
|
+
runTestsAfterFix: true
|
|
253
|
+
testCommand: "npm test"
|
|
254
|
+
revertOnTestFailure: true
|
|
255
|
+
maxFilesPerRun: 20
|
|
256
|
+
dryRunDefault: true
|
|
257
|
+
`;
|
|
258
|
+
}
|
|
259
|
+
// Re-export types and schema
|
|
260
|
+
export { ConstitutionSchema, DEFAULT_CONSTITUTION } from "./constitution.schema.js";
|
|
261
|
+
//# sourceMappingURL=constitution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution.js","sourceRoot":"","sources":["../../src/autofix/constitution.ts"],"names":[],"mappings":"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"}
|