@opencodereview/core 1.9.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/dist/ai/anthropic-provider.d.ts +41 -0
- package/dist/ai/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/anthropic-provider.js +139 -0
- package/dist/ai/anthropic-provider.js.map +1 -0
- package/dist/ai/index.d.ts +39 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +41 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/ollama-provider.d.ts +46 -0
- package/dist/ai/ollama-provider.d.ts.map +1 -0
- package/dist/ai/ollama-provider.js +149 -0
- package/dist/ai/ollama-provider.js.map +1 -0
- package/dist/ai/openai-provider.d.ts +44 -0
- package/dist/ai/openai-provider.d.ts.map +1 -0
- package/dist/ai/openai-provider.js +137 -0
- package/dist/ai/openai-provider.js.map +1 -0
- package/dist/ai/orchestrator.d.ts +60 -0
- package/dist/ai/orchestrator.d.ts.map +1 -0
- package/dist/ai/orchestrator.js +188 -0
- package/dist/ai/orchestrator.js.map +1 -0
- package/dist/ai/prompts.d.ts +27 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +112 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/types.d.ts +75 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +10 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/ai/v4/embedding/index.d.ts +10 -0
- package/dist/ai/v4/embedding/index.d.ts.map +1 -0
- package/dist/ai/v4/embedding/index.js +10 -0
- package/dist/ai/v4/embedding/index.js.map +1 -0
- package/dist/ai/v4/embedding/local.d.ts +68 -0
- package/dist/ai/v4/embedding/local.d.ts.map +1 -0
- package/dist/ai/v4/embedding/local.js +167 -0
- package/dist/ai/v4/embedding/local.js.map +1 -0
- package/dist/ai/v4/embedding/ollama.d.ts +58 -0
- package/dist/ai/v4/embedding/ollama.d.ts.map +1 -0
- package/dist/ai/v4/embedding/ollama.js +101 -0
- package/dist/ai/v4/embedding/ollama.js.map +1 -0
- package/dist/ai/v4/embedding/openai.d.ts +36 -0
- package/dist/ai/v4/embedding/openai.d.ts.map +1 -0
- package/dist/ai/v4/embedding/openai.js +76 -0
- package/dist/ai/v4/embedding/openai.js.map +1 -0
- package/dist/ai/v4/embedding/similarity.d.ts +36 -0
- package/dist/ai/v4/embedding/similarity.d.ts.map +1 -0
- package/dist/ai/v4/embedding/similarity.js +60 -0
- package/dist/ai/v4/embedding/similarity.js.map +1 -0
- package/dist/ai/v4/index.d.ts +51 -0
- package/dist/ai/v4/index.d.ts.map +1 -0
- package/dist/ai/v4/index.js +54 -0
- package/dist/ai/v4/index.js.map +1 -0
- package/dist/ai/v4/llm/anthropic.d.ts +38 -0
- package/dist/ai/v4/llm/anthropic.d.ts.map +1 -0
- package/dist/ai/v4/llm/anthropic.js +86 -0
- package/dist/ai/v4/llm/anthropic.js.map +1 -0
- package/dist/ai/v4/llm/index.d.ts +9 -0
- package/dist/ai/v4/llm/index.d.ts.map +1 -0
- package/dist/ai/v4/llm/index.js +9 -0
- package/dist/ai/v4/llm/index.js.map +1 -0
- package/dist/ai/v4/llm/ollama.d.ts +39 -0
- package/dist/ai/v4/llm/ollama.d.ts.map +1 -0
- package/dist/ai/v4/llm/ollama.js +95 -0
- package/dist/ai/v4/llm/ollama.js.map +1 -0
- package/dist/ai/v4/llm/openai.d.ts +38 -0
- package/dist/ai/v4/llm/openai.d.ts.map +1 -0
- package/dist/ai/v4/llm/openai.js +88 -0
- package/dist/ai/v4/llm/openai.js.map +1 -0
- package/dist/ai/v4/patterns/defect-patterns.d.ts +57 -0
- package/dist/ai/v4/patterns/defect-patterns.d.ts.map +1 -0
- package/dist/ai/v4/patterns/defect-patterns.js +331 -0
- package/dist/ai/v4/patterns/defect-patterns.js.map +1 -0
- package/dist/ai/v4/patterns/index.d.ts +8 -0
- package/dist/ai/v4/patterns/index.d.ts.map +1 -0
- package/dist/ai/v4/patterns/index.js +7 -0
- package/dist/ai/v4/patterns/index.js.map +1 -0
- package/dist/ai/v4/pipeline.d.ts +74 -0
- package/dist/ai/v4/pipeline.d.ts.map +1 -0
- package/dist/ai/v4/pipeline.js +381 -0
- package/dist/ai/v4/pipeline.js.map +1 -0
- package/dist/ai/v4/sla.d.ts +62 -0
- package/dist/ai/v4/sla.d.ts.map +1 -0
- package/dist/ai/v4/sla.js +136 -0
- package/dist/ai/v4/sla.js.map +1 -0
- package/dist/ai/v4/types.d.ts +117 -0
- package/dist/ai/v4/types.d.ts.map +1 -0
- package/dist/ai/v4/types.js +16 -0
- package/dist/ai/v4/types.js.map +1 -0
- package/dist/ai-healer/prompt-builder.d.ts +33 -0
- package/dist/ai-healer/prompt-builder.d.ts.map +1 -0
- package/dist/ai-healer/prompt-builder.js +89 -0
- package/dist/ai-healer/prompt-builder.js.map +1 -0
- package/dist/config/defaults.d.ts +14 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +57 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +33 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +245 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +58 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +7 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/v4-config.d.ts +77 -0
- package/dist/config/v4-config.d.ts.map +1 -0
- package/dist/config/v4-config.js +336 -0
- package/dist/config/v4-config.js.map +1 -0
- package/dist/detectors/ai-detector.d.ts +38 -0
- package/dist/detectors/ai-detector.d.ts.map +1 -0
- package/dist/detectors/ai-detector.js +62 -0
- package/dist/detectors/ai-detector.js.map +1 -0
- package/dist/detectors/context-break.d.ts +57 -0
- package/dist/detectors/context-break.d.ts.map +1 -0
- package/dist/detectors/context-break.js +199 -0
- package/dist/detectors/context-break.js.map +1 -0
- package/dist/detectors/deep-hallucination.d.ts +42 -0
- package/dist/detectors/deep-hallucination.d.ts.map +1 -0
- package/dist/detectors/deep-hallucination.js +297 -0
- package/dist/detectors/deep-hallucination.js.map +1 -0
- package/dist/detectors/duplication.d.ts +61 -0
- package/dist/detectors/duplication.d.ts.map +1 -0
- package/dist/detectors/duplication.js +204 -0
- package/dist/detectors/duplication.js.map +1 -0
- package/dist/detectors/hallucination.d.ts +80 -0
- package/dist/detectors/hallucination.d.ts.map +1 -0
- package/dist/detectors/hallucination.js +350 -0
- package/dist/detectors/hallucination.js.map +1 -0
- package/dist/detectors/index.d.ts +35 -0
- package/dist/detectors/index.d.ts.map +1 -0
- package/dist/detectors/index.js +33 -0
- package/dist/detectors/index.js.map +1 -0
- package/dist/detectors/logic-gap.d.ts +58 -0
- package/dist/detectors/logic-gap.d.ts.map +1 -0
- package/dist/detectors/logic-gap.js +284 -0
- package/dist/detectors/logic-gap.js.map +1 -0
- package/dist/detectors/over-engineering.d.ts +44 -0
- package/dist/detectors/over-engineering.d.ts.map +1 -0
- package/dist/detectors/over-engineering.js +257 -0
- package/dist/detectors/over-engineering.js.map +1 -0
- package/dist/detectors/security-pattern.d.ts +43 -0
- package/dist/detectors/security-pattern.d.ts.map +1 -0
- package/dist/detectors/security-pattern.js +235 -0
- package/dist/detectors/security-pattern.js.map +1 -0
- package/dist/detectors/stale-api.d.ts +44 -0
- package/dist/detectors/stale-api.d.ts.map +1 -0
- package/dist/detectors/stale-api.js +160 -0
- package/dist/detectors/stale-api.js.map +1 -0
- package/dist/detectors/type-safety.d.ts +41 -0
- package/dist/detectors/type-safety.d.ts.map +1 -0
- package/dist/detectors/type-safety.js +306 -0
- package/dist/detectors/type-safety.js.map +1 -0
- package/dist/detectors/v4/context-coherence.d.ts +67 -0
- package/dist/detectors/v4/context-coherence.d.ts.map +1 -0
- package/dist/detectors/v4/context-coherence.js +319 -0
- package/dist/detectors/v4/context-coherence.js.map +1 -0
- package/dist/detectors/v4/hallucinated-import.d.ts +52 -0
- package/dist/detectors/v4/hallucinated-import.d.ts.map +1 -0
- package/dist/detectors/v4/hallucinated-import.js +206 -0
- package/dist/detectors/v4/hallucinated-import.js.map +1 -0
- package/dist/detectors/v4/index.d.ts +28 -0
- package/dist/detectors/v4/index.d.ts.map +1 -0
- package/dist/detectors/v4/index.js +40 -0
- package/dist/detectors/v4/index.js.map +1 -0
- package/dist/detectors/v4/over-engineering.d.ts +69 -0
- package/dist/detectors/v4/over-engineering.d.ts.map +1 -0
- package/dist/detectors/v4/over-engineering.js +234 -0
- package/dist/detectors/v4/over-engineering.js.map +1 -0
- package/dist/detectors/v4/security-pattern.d.ts +46 -0
- package/dist/detectors/v4/security-pattern.d.ts.map +1 -0
- package/dist/detectors/v4/security-pattern.js +233 -0
- package/dist/detectors/v4/security-pattern.js.map +1 -0
- package/dist/detectors/v4/stale-api.d.ts +59 -0
- package/dist/detectors/v4/stale-api.d.ts.map +1 -0
- package/dist/detectors/v4/stale-api.js +470 -0
- package/dist/detectors/v4/stale-api.js.map +1 -0
- package/dist/detectors/v4/types.d.ts +74 -0
- package/dist/detectors/v4/types.d.ts.map +1 -0
- package/dist/detectors/v4/types.js +10 -0
- package/dist/detectors/v4/types.js.map +1 -0
- package/dist/diff/filter.d.ts +35 -0
- package/dist/diff/filter.d.ts.map +1 -0
- package/dist/diff/filter.js +65 -0
- package/dist/diff/filter.js.map +1 -0
- package/dist/diff/index.d.ts +9 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +8 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/parser.d.ts +61 -0
- package/dist/diff/parser.d.ts.map +1 -0
- package/dist/diff/parser.js +203 -0
- package/dist/diff/parser.js.map +1 -0
- package/dist/i18n/en.d.ts +18 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +83 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/index.d.ts +13 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +14 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/provider.d.ts +54 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +88 -0
- package/dist/i18n/provider.js.map +1 -0
- package/dist/i18n/types.d.ts +37 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +10 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/i18n/zh.d.ts +14 -0
- package/dist/i18n/zh.d.ts.map +1 -0
- package/dist/i18n/zh.js +83 -0
- package/dist/i18n/zh.js.map +1 -0
- package/dist/index.d.ts +113 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/ir/index.d.ts +10 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +9 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/types.d.ts +126 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/ir/types.js +33 -0
- package/dist/ir/types.js.map +1 -0
- package/dist/languages/go/index.d.ts +7 -0
- package/dist/languages/go/index.d.ts.map +1 -0
- package/dist/languages/go/index.js +7 -0
- package/dist/languages/go/index.js.map +1 -0
- package/dist/languages/go/parser.d.ts +89 -0
- package/dist/languages/go/parser.d.ts.map +1 -0
- package/dist/languages/go/parser.js +509 -0
- package/dist/languages/go/parser.js.map +1 -0
- package/dist/languages/index.d.ts +13 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +14 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/java/index.d.ts +7 -0
- package/dist/languages/java/index.d.ts.map +1 -0
- package/dist/languages/java/index.js +7 -0
- package/dist/languages/java/index.js.map +1 -0
- package/dist/languages/java/parser.d.ts +82 -0
- package/dist/languages/java/parser.d.ts.map +1 -0
- package/dist/languages/java/parser.js +492 -0
- package/dist/languages/java/parser.js.map +1 -0
- package/dist/languages/kotlin/index.d.ts +7 -0
- package/dist/languages/kotlin/index.d.ts.map +1 -0
- package/dist/languages/kotlin/index.js +7 -0
- package/dist/languages/kotlin/index.js.map +1 -0
- package/dist/languages/kotlin/parser.d.ts +84 -0
- package/dist/languages/kotlin/parser.d.ts.map +1 -0
- package/dist/languages/kotlin/parser.js +507 -0
- package/dist/languages/kotlin/parser.js.map +1 -0
- package/dist/languages/python/index.d.ts +7 -0
- package/dist/languages/python/index.d.ts.map +1 -0
- package/dist/languages/python/index.js +7 -0
- package/dist/languages/python/index.js.map +1 -0
- package/dist/languages/python/parser.d.ts +91 -0
- package/dist/languages/python/parser.d.ts.map +1 -0
- package/dist/languages/python/parser.js +375 -0
- package/dist/languages/python/parser.js.map +1 -0
- package/dist/languages/registry.d.ts +81 -0
- package/dist/languages/registry.d.ts.map +1 -0
- package/dist/languages/registry.js +150 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/languages/types.d.ts +137 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/languages/types.js +10 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/languages/typescript/index.d.ts +7 -0
- package/dist/languages/typescript/index.d.ts.map +1 -0
- package/dist/languages/typescript/index.js +7 -0
- package/dist/languages/typescript/index.js.map +1 -0
- package/dist/languages/typescript/parser.d.ts +51 -0
- package/dist/languages/typescript/parser.d.ts.map +1 -0
- package/dist/languages/typescript/parser.js +286 -0
- package/dist/languages/typescript/parser.js.map +1 -0
- package/dist/license/generator.d.ts +43 -0
- package/dist/license/generator.d.ts.map +1 -0
- package/dist/license/generator.js +72 -0
- package/dist/license/generator.js.map +1 -0
- package/dist/license/index.d.ts +11 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +12 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/types.d.ts +85 -0
- package/dist/license/types.d.ts.map +1 -0
- package/dist/license/types.js +10 -0
- package/dist/license/types.js.map +1 -0
- package/dist/license/validator.d.ts +77 -0
- package/dist/license/validator.d.ts.map +1 -0
- package/dist/license/validator.js +275 -0
- package/dist/license/validator.js.map +1 -0
- package/dist/parser/extractor.d.ts +31 -0
- package/dist/parser/extractor.d.ts.map +1 -0
- package/dist/parser/extractor.js +10 -0
- package/dist/parser/extractor.js.map +1 -0
- package/dist/parser/extractors/go.d.ts +21 -0
- package/dist/parser/extractors/go.d.ts.map +1 -0
- package/dist/parser/extractors/go.js +569 -0
- package/dist/parser/extractors/go.js.map +1 -0
- package/dist/parser/extractors/index.d.ts +13 -0
- package/dist/parser/extractors/index.d.ts.map +1 -0
- package/dist/parser/extractors/index.js +13 -0
- package/dist/parser/extractors/index.js.map +1 -0
- package/dist/parser/extractors/java.d.ts +24 -0
- package/dist/parser/extractors/java.d.ts.map +1 -0
- package/dist/parser/extractors/java.js +611 -0
- package/dist/parser/extractors/java.js.map +1 -0
- package/dist/parser/extractors/kotlin.d.ts +25 -0
- package/dist/parser/extractors/kotlin.d.ts.map +1 -0
- package/dist/parser/extractors/kotlin.js +665 -0
- package/dist/parser/extractors/kotlin.js.map +1 -0
- package/dist/parser/extractors/python.d.ts +21 -0
- package/dist/parser/extractors/python.d.ts.map +1 -0
- package/dist/parser/extractors/python.js +514 -0
- package/dist/parser/extractors/python.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts +23 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -0
- package/dist/parser/extractors/typescript.js +664 -0
- package/dist/parser/extractors/typescript.js.map +1 -0
- package/dist/parser/index.d.ts +15 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +14 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/manager.d.ts +50 -0
- package/dist/parser/manager.d.ts.map +1 -0
- package/dist/parser/manager.js +159 -0
- package/dist/parser/manager.js.map +1 -0
- package/dist/registry/builtins/go-builtins.d.ts +13 -0
- package/dist/registry/builtins/go-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/go-builtins.js +63 -0
- package/dist/registry/builtins/go-builtins.js.map +1 -0
- package/dist/registry/builtins/java-builtins.d.ts +10 -0
- package/dist/registry/builtins/java-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/java-builtins.js +59 -0
- package/dist/registry/builtins/java-builtins.js.map +1 -0
- package/dist/registry/builtins/kotlin-builtins.d.ts +10 -0
- package/dist/registry/builtins/kotlin-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/kotlin-builtins.js +38 -0
- package/dist/registry/builtins/kotlin-builtins.js.map +1 -0
- package/dist/registry/builtins/node-builtins.d.ts +10 -0
- package/dist/registry/builtins/node-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/node-builtins.js +36 -0
- package/dist/registry/builtins/node-builtins.js.map +1 -0
- package/dist/registry/builtins/python-builtins.d.ts +10 -0
- package/dist/registry/builtins/python-builtins.d.ts.map +1 -0
- package/dist/registry/builtins/python-builtins.js +43 -0
- package/dist/registry/builtins/python-builtins.js.map +1 -0
- package/dist/registry/cache.d.ts +53 -0
- package/dist/registry/cache.d.ts.map +1 -0
- package/dist/registry/cache.js +147 -0
- package/dist/registry/cache.js.map +1 -0
- package/dist/registry/go-registry.d.ts +52 -0
- package/dist/registry/go-registry.d.ts.map +1 -0
- package/dist/registry/go-registry.js +148 -0
- package/dist/registry/go-registry.js.map +1 -0
- package/dist/registry/index.d.ts +18 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +21 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/maven-registry.d.ts +57 -0
- package/dist/registry/maven-registry.d.ts.map +1 -0
- package/dist/registry/maven-registry.js +155 -0
- package/dist/registry/maven-registry.js.map +1 -0
- package/dist/registry/npm-registry.d.ts +40 -0
- package/dist/registry/npm-registry.d.ts.map +1 -0
- package/dist/registry/npm-registry.js +155 -0
- package/dist/registry/npm-registry.js.map +1 -0
- package/dist/registry/pypi-registry.d.ts +49 -0
- package/dist/registry/pypi-registry.d.ts.map +1 -0
- package/dist/registry/pypi-registry.js +175 -0
- package/dist/registry/pypi-registry.js.map +1 -0
- package/dist/registry/registry-manager.d.ts +45 -0
- package/dist/registry/registry-manager.d.ts.map +1 -0
- package/dist/registry/registry-manager.js +107 -0
- package/dist/registry/registry-manager.js.map +1 -0
- package/dist/registry/types.d.ts +83 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +12 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/reporter/html-reporter.d.ts +20 -0
- package/dist/reporter/html-reporter.d.ts.map +1 -0
- package/dist/reporter/html-reporter.js +612 -0
- package/dist/reporter/html-reporter.js.map +1 -0
- package/dist/reporter/index.d.ts +28 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +48 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/markdown-reporter.d.ts +16 -0
- package/dist/reporter/markdown-reporter.d.ts.map +1 -0
- package/dist/reporter/markdown-reporter.js +182 -0
- package/dist/reporter/markdown-reporter.js.map +1 -0
- package/dist/reporter/sarif-reporter.d.ts +67 -0
- package/dist/reporter/sarif-reporter.d.ts.map +1 -0
- package/dist/reporter/sarif-reporter.js +73 -0
- package/dist/reporter/sarif-reporter.js.map +1 -0
- package/dist/reporter/terminal-reporter.d.ts +14 -0
- package/dist/reporter/terminal-reporter.d.ts.map +1 -0
- package/dist/reporter/terminal-reporter.js +126 -0
- package/dist/reporter/terminal-reporter.js.map +1 -0
- package/dist/reporter/types.d.ts +43 -0
- package/dist/reporter/types.d.ts.map +1 -0
- package/dist/reporter/types.js +10 -0
- package/dist/reporter/types.js.map +1 -0
- package/dist/reporter/v4-html.d.ts +24 -0
- package/dist/reporter/v4-html.d.ts.map +1 -0
- package/dist/reporter/v4-html.js +359 -0
- package/dist/reporter/v4-html.js.map +1 -0
- package/dist/reporter/v4-terminal.d.ts +55 -0
- package/dist/reporter/v4-terminal.d.ts.map +1 -0
- package/dist/reporter/v4-terminal.js +199 -0
- package/dist/reporter/v4-terminal.js.map +1 -0
- package/dist/scanner/index.d.ts +9 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +9 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/v4-scanner.d.ts +162 -0
- package/dist/scanner/v4-scanner.d.ts.map +1 -0
- package/dist/scanner/v4-scanner.js +327 -0
- package/dist/scanner/v4-scanner.js.map +1 -0
- package/dist/scorer/report.d.ts +52 -0
- package/dist/scorer/report.d.ts.map +1 -0
- package/dist/scorer/report.js +347 -0
- package/dist/scorer/report.js.map +1 -0
- package/dist/scorer/scoring-engine.d.ts +170 -0
- package/dist/scorer/scoring-engine.d.ts.map +1 -0
- package/dist/scorer/scoring-engine.js +308 -0
- package/dist/scorer/scoring-engine.js.map +1 -0
- package/dist/scorer/v4-adapter.d.ts +87 -0
- package/dist/scorer/v4-adapter.d.ts.map +1 -0
- package/dist/scorer/v4-adapter.js +145 -0
- package/dist/scorer/v4-adapter.js.map +1 -0
- package/dist/sla/index.d.ts +7 -0
- package/dist/sla/index.d.ts.map +1 -0
- package/dist/sla/index.js +6 -0
- package/dist/sla/index.js.map +1 -0
- package/dist/sla/tracker.d.ts +70 -0
- package/dist/sla/tracker.d.ts.map +1 -0
- package/dist/sla/tracker.js +151 -0
- package/dist/sla/tracker.js.map +1 -0
- package/dist/sla/types.d.ts +67 -0
- package/dist/sla/types.d.ts.map +1 -0
- package/dist/sla/types.js +42 -0
- package/dist/sla/types.js.map +1 -0
- package/dist/types.d.ts +172 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +69 -0
- package/dist/types.js.map +1 -0
- package/package.json +97 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open Code Review V4 — AI Pipeline Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the two-stage AI scan pipeline:
|
|
5
|
+
* - Stage 1 (Embedding): Fast similarity-based defect detection
|
|
6
|
+
* - Stage 2 (LLM): Deep analysis of suspicious code blocks
|
|
7
|
+
*
|
|
8
|
+
* SLA levels control which stages run:
|
|
9
|
+
* - L1 Fast: Structural detectors only (no AI)
|
|
10
|
+
* - L2 Standard: + Embedding recall + Local LLM (Ollama)
|
|
11
|
+
* - L3 Deep: + Remote LLM (OpenAI/Claude)
|
|
12
|
+
*
|
|
13
|
+
* @since 0.4.0
|
|
14
|
+
*/
|
|
15
|
+
import type { DetectorResult } from '../../detectors/v4/types.js';
|
|
16
|
+
/** Service Level Agreement — controls pipeline depth and cost */
|
|
17
|
+
export type SLALevel = 'L1' | 'L2' | 'L3';
|
|
18
|
+
/**
|
|
19
|
+
* Embedding provider interface.
|
|
20
|
+
* Generates vector embeddings from text for similarity comparison.
|
|
21
|
+
*/
|
|
22
|
+
export interface EmbeddingProvider {
|
|
23
|
+
/** Provider name (e.g. 'local-tfidf', 'openai') */
|
|
24
|
+
readonly name: string;
|
|
25
|
+
/** Embedding vector dimension */
|
|
26
|
+
readonly dimension: number;
|
|
27
|
+
/** Generate embeddings for a batch of text chunks */
|
|
28
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* LLM provider interface.
|
|
32
|
+
* Sends prompts to a language model and returns structured responses.
|
|
33
|
+
*/
|
|
34
|
+
export interface LLMProvider {
|
|
35
|
+
/** Provider name (e.g. 'ollama', 'openai', 'anthropic') */
|
|
36
|
+
readonly name: string;
|
|
37
|
+
/** Send a prompt and get a completion */
|
|
38
|
+
complete(prompt: string, options?: LLMOptions): Promise<LLMResponse>;
|
|
39
|
+
/** Check if this provider is available and configured */
|
|
40
|
+
isAvailable(): Promise<boolean>;
|
|
41
|
+
}
|
|
42
|
+
/** Options for LLM completion requests */
|
|
43
|
+
export interface LLMOptions {
|
|
44
|
+
/** Maximum tokens to generate */
|
|
45
|
+
maxTokens?: number;
|
|
46
|
+
/** Sampling temperature (0 = deterministic, 1 = creative) */
|
|
47
|
+
temperature?: number;
|
|
48
|
+
/** System prompt for the model */
|
|
49
|
+
system?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Response from an LLM completion request */
|
|
52
|
+
export interface LLMResponse {
|
|
53
|
+
/** Generated text content */
|
|
54
|
+
content: string;
|
|
55
|
+
/** Token usage statistics */
|
|
56
|
+
usage?: {
|
|
57
|
+
prompt: number;
|
|
58
|
+
completion: number;
|
|
59
|
+
total: number;
|
|
60
|
+
};
|
|
61
|
+
/** Response latency in milliseconds */
|
|
62
|
+
latencyMs: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Configuration for the AI scan pipeline.
|
|
66
|
+
* Controls which stages run and how they're configured.
|
|
67
|
+
*/
|
|
68
|
+
export interface AIConfig {
|
|
69
|
+
/** SLA level determines which stages run */
|
|
70
|
+
sla: SLALevel;
|
|
71
|
+
/** Embedding provider configuration */
|
|
72
|
+
embedding?: {
|
|
73
|
+
provider: 'local' | 'openai' | 'ollama';
|
|
74
|
+
model?: string;
|
|
75
|
+
baseUrl?: string;
|
|
76
|
+
};
|
|
77
|
+
/** Local LLM configuration (Ollama) */
|
|
78
|
+
local?: {
|
|
79
|
+
provider: 'ollama';
|
|
80
|
+
model: string;
|
|
81
|
+
baseUrl?: string;
|
|
82
|
+
};
|
|
83
|
+
/** Remote LLM configuration (OpenAI / Anthropic) */
|
|
84
|
+
remote?: {
|
|
85
|
+
provider: 'openai' | 'anthropic';
|
|
86
|
+
model: string;
|
|
87
|
+
apiKey: string;
|
|
88
|
+
baseUrl?: string;
|
|
89
|
+
};
|
|
90
|
+
/** Maximum code blocks to send to LLM stage (default: 20) */
|
|
91
|
+
maxLLMBlocks?: number;
|
|
92
|
+
/** Embedding similarity threshold for flagging blocks (default: 0.7) */
|
|
93
|
+
similarityThreshold?: number;
|
|
94
|
+
}
|
|
95
|
+
/** Result from a single scan stage */
|
|
96
|
+
export interface ScanStageResult {
|
|
97
|
+
/** Which stage produced these results */
|
|
98
|
+
stage: 'structural' | 'embedding' | 'llm';
|
|
99
|
+
/** Issues detected in this stage */
|
|
100
|
+
issues: DetectorResult[];
|
|
101
|
+
/** Time taken in milliseconds */
|
|
102
|
+
durationMs: number;
|
|
103
|
+
/** Tokens consumed (LLM stages only) */
|
|
104
|
+
tokensUsed?: number;
|
|
105
|
+
}
|
|
106
|
+
/** Aggregate result from all pipeline stages */
|
|
107
|
+
export interface AIPipelineResult {
|
|
108
|
+
/** Results from each stage that ran */
|
|
109
|
+
stages: ScanStageResult[];
|
|
110
|
+
/** Total issues across all stages */
|
|
111
|
+
totalIssues: number;
|
|
112
|
+
/** Total time across all stages in milliseconds */
|
|
113
|
+
totalDurationMs: number;
|
|
114
|
+
/** SLA level that was used */
|
|
115
|
+
slaLevel: SLALevel;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/ai/v4/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open Code Review V4 — AI Pipeline Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the two-stage AI scan pipeline:
|
|
5
|
+
* - Stage 1 (Embedding): Fast similarity-based defect detection
|
|
6
|
+
* - Stage 2 (LLM): Deep analysis of suspicious code blocks
|
|
7
|
+
*
|
|
8
|
+
* SLA levels control which stages run:
|
|
9
|
+
* - L1 Fast: Structural detectors only (no AI)
|
|
10
|
+
* - L2 Standard: + Embedding recall + Local LLM (Ollama)
|
|
11
|
+
* - L3 Deep: + Remote LLM (OpenAI/Claude)
|
|
12
|
+
*
|
|
13
|
+
* @since 0.4.0
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/ai/v4/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Healer — Prompt Builder
|
|
3
|
+
*
|
|
4
|
+
* Converts validation results into structured prompts that can be fed
|
|
5
|
+
* back to AI coding assistants (Copilot, Cursor, Claude) to fix issues.
|
|
6
|
+
*/
|
|
7
|
+
import type { AggregateScore } from '../scorer/scoring-engine.js';
|
|
8
|
+
/** Generated fix prompt */
|
|
9
|
+
export interface FixPrompt {
|
|
10
|
+
file: string;
|
|
11
|
+
prompt: string;
|
|
12
|
+
priority: number;
|
|
13
|
+
categories: string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Build fix prompts from validation results
|
|
17
|
+
*/
|
|
18
|
+
export declare class PromptBuilder {
|
|
19
|
+
/**
|
|
20
|
+
* Generate fix prompts for all files with issues
|
|
21
|
+
*/
|
|
22
|
+
buildPrompts(report: AggregateScore): FixPrompt[];
|
|
23
|
+
/**
|
|
24
|
+
* Build a fix prompt for a single file
|
|
25
|
+
*/
|
|
26
|
+
private buildFilePrompt;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a combined prompt for all files (useful for batch fixes)
|
|
29
|
+
*/
|
|
30
|
+
buildCombinedPrompt(report: AggregateScore): string;
|
|
31
|
+
}
|
|
32
|
+
export default PromptBuilder;
|
|
33
|
+
//# sourceMappingURL=prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/ai-healer/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,6BAA6B,CAAC;AAE7E,2BAA2B;AAC3B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE;IAajD;;OAEG;IACH,OAAO,CAAC,eAAe;IA+CvB;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;CAkBpD;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Healer — Prompt Builder
|
|
3
|
+
*
|
|
4
|
+
* Converts validation results into structured prompts that can be fed
|
|
5
|
+
* back to AI coding assistants (Copilot, Cursor, Claude) to fix issues.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Build fix prompts from validation results
|
|
9
|
+
*/
|
|
10
|
+
export class PromptBuilder {
|
|
11
|
+
/**
|
|
12
|
+
* Generate fix prompts for all files with issues
|
|
13
|
+
*/
|
|
14
|
+
buildPrompts(report) {
|
|
15
|
+
const prompts = [];
|
|
16
|
+
for (const file of report.files) {
|
|
17
|
+
if (file.totalScore >= 95)
|
|
18
|
+
continue;
|
|
19
|
+
const prompt = this.buildFilePrompt(file);
|
|
20
|
+
if (prompt)
|
|
21
|
+
prompts.push(prompt);
|
|
22
|
+
}
|
|
23
|
+
return prompts.sort((a, b) => b.priority - a.priority);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build a fix prompt for a single file
|
|
27
|
+
*/
|
|
28
|
+
buildFilePrompt(file) {
|
|
29
|
+
const sections = [];
|
|
30
|
+
const categories = [];
|
|
31
|
+
sections.push(`## Fix Request: ${file.file}`);
|
|
32
|
+
sections.push(`Current Score: ${file.totalScore}/100 (Grade: ${file.grade})`);
|
|
33
|
+
sections.push('');
|
|
34
|
+
sections.push('Please fix the following issues in this file:');
|
|
35
|
+
sections.push('');
|
|
36
|
+
const dims = [
|
|
37
|
+
{ key: 'completeness', label: 'Hallucination Issues (Code Completeness)', dim: file.dimensions.completeness },
|
|
38
|
+
{ key: 'coherence', label: 'Logic Gaps (Coherence)', dim: file.dimensions.coherence },
|
|
39
|
+
{ key: 'consistency', label: 'Style Inconsistencies (Architecture Consistency)', dim: file.dimensions.consistency },
|
|
40
|
+
{ key: 'conciseness', label: 'Duplication (Code Conciseness)', dim: file.dimensions.conciseness },
|
|
41
|
+
];
|
|
42
|
+
for (const { key, label, dim } of dims) {
|
|
43
|
+
if (dim.issueCount > 0) {
|
|
44
|
+
categories.push(key);
|
|
45
|
+
sections.push(`### ${label}`);
|
|
46
|
+
for (const detail of dim.details) {
|
|
47
|
+
sections.push(`- ${detail}`);
|
|
48
|
+
}
|
|
49
|
+
sections.push('');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (categories.length === 0)
|
|
53
|
+
return null;
|
|
54
|
+
sections.push('### Guidelines');
|
|
55
|
+
sections.push('- Fix each issue while preserving existing functionality');
|
|
56
|
+
sections.push('- Add proper error handling where missing');
|
|
57
|
+
sections.push('- Remove hallucinated imports/variables');
|
|
58
|
+
sections.push('- Standardize coding style to match the project conventions');
|
|
59
|
+
sections.push('- Do NOT introduce new dependencies unless absolutely necessary');
|
|
60
|
+
const priority = 100 - file.totalScore;
|
|
61
|
+
return {
|
|
62
|
+
file: file.file,
|
|
63
|
+
prompt: sections.join('\n'),
|
|
64
|
+
priority,
|
|
65
|
+
categories,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Generate a combined prompt for all files (useful for batch fixes)
|
|
70
|
+
*/
|
|
71
|
+
buildCombinedPrompt(report) {
|
|
72
|
+
const prompts = this.buildPrompts(report);
|
|
73
|
+
if (prompts.length === 0) {
|
|
74
|
+
return 'All files passed validation. No fixes needed.';
|
|
75
|
+
}
|
|
76
|
+
const header = [
|
|
77
|
+
'# Open Code Review — Fix Request',
|
|
78
|
+
'',
|
|
79
|
+
`Overall Score: ${report.overallScore}/100`,
|
|
80
|
+
`Files needing fixes: ${prompts.length}`,
|
|
81
|
+
'',
|
|
82
|
+
'---',
|
|
83
|
+
'',
|
|
84
|
+
].join('\n');
|
|
85
|
+
return header + prompts.map(p => p.prompt).join('\n---\n\n');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export default PromptBuilder;
|
|
89
|
+
//# sourceMappingURL=prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/ai-healer/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Configuration
|
|
3
|
+
*
|
|
4
|
+
* Provides sensible defaults for all configuration options.
|
|
5
|
+
* Priority chain: CLI args > env vars > .aicv.yml > user global > these defaults
|
|
6
|
+
*/
|
|
7
|
+
import type { AICVConfig } from './types.js';
|
|
8
|
+
export declare const DEFAULT_CONFIG: Readonly<AICVConfig>;
|
|
9
|
+
/**
|
|
10
|
+
* Create a complete config by merging partial user config with defaults.
|
|
11
|
+
* Shallow-merges each top-level section.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mergeWithDefaults(partial: Partial<AICVConfig>): AICVConfig;
|
|
14
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,UAAU,CA6B/C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAiB1E"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Configuration
|
|
3
|
+
*
|
|
4
|
+
* Provides sensible defaults for all configuration options.
|
|
5
|
+
* Priority chain: CLI args > env vars > .aicv.yml > user global > these defaults
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_CONFIG = {
|
|
8
|
+
scan: {
|
|
9
|
+
include: [
|
|
10
|
+
'src/**/*.ts',
|
|
11
|
+
'src/**/*.tsx',
|
|
12
|
+
'src/**/*.js',
|
|
13
|
+
'src/**/*.jsx',
|
|
14
|
+
],
|
|
15
|
+
exclude: [
|
|
16
|
+
'**/*.test.*',
|
|
17
|
+
'**/*.spec.*',
|
|
18
|
+
'**/__tests__/**',
|
|
19
|
+
'**/node_modules/**',
|
|
20
|
+
'**/dist/**',
|
|
21
|
+
'**/build/**',
|
|
22
|
+
'**/.git/**',
|
|
23
|
+
],
|
|
24
|
+
languages: [], // auto-detect
|
|
25
|
+
slaLevel: 'L2',
|
|
26
|
+
},
|
|
27
|
+
scoring: {
|
|
28
|
+
threshold: 70,
|
|
29
|
+
failOn: 'critical',
|
|
30
|
+
},
|
|
31
|
+
report: {
|
|
32
|
+
format: ['terminal'],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Create a complete config by merging partial user config with defaults.
|
|
37
|
+
* Shallow-merges each top-level section.
|
|
38
|
+
*/
|
|
39
|
+
export function mergeWithDefaults(partial) {
|
|
40
|
+
return {
|
|
41
|
+
license: partial.license ?? DEFAULT_CONFIG.license,
|
|
42
|
+
scan: {
|
|
43
|
+
...DEFAULT_CONFIG.scan,
|
|
44
|
+
...(partial.scan ?? {}),
|
|
45
|
+
},
|
|
46
|
+
scoring: {
|
|
47
|
+
...DEFAULT_CONFIG.scoring,
|
|
48
|
+
...(partial.scoring ?? {}),
|
|
49
|
+
},
|
|
50
|
+
ai: partial.ai ?? DEFAULT_CONFIG.ai,
|
|
51
|
+
report: {
|
|
52
|
+
...DEFAULT_CONFIG.report,
|
|
53
|
+
...(partial.report ?? {}),
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,cAAc,GAAyB;IAClD,IAAI,EAAE;QACJ,OAAO,EAAE;YACP,aAAa;YACb,cAAc;YACd,aAAa;YACb,cAAc;SACf;QACD,OAAO,EAAE;YACP,aAAa;YACb,aAAa;YACb,iBAAiB;YACjB,oBAAoB;YACpB,YAAY;YACZ,aAAa;YACb,YAAY;SACb;QACD,SAAS,EAAE,EAAE,EAAE,cAAc;QAC7B,QAAQ,EAAE,IAAI;KACf;IAED,OAAO,EAAE;QACP,SAAS,EAAE,EAAE;QACb,MAAM,EAAE,UAAU;KACnB;IAED,MAAM,EAAE;QACN,MAAM,EAAE,CAAC,UAAU,CAAC;KACrB;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAA4B;IAC5D,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO;QAClD,IAAI,EAAE;YACJ,GAAG,cAAc,CAAC,IAAI;YACtB,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;SACxB;QACD,OAAO,EAAE;YACP,GAAG,cAAc,CAAC,OAAO;YACzB,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;SAC3B;QACD,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,cAAc,CAAC,EAAE;QACnC,MAAM,EAAE;YACN,GAAG,cAAc,CAAC,MAAM;YACxB,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;SAC1B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Module — Public API
|
|
3
|
+
*/
|
|
4
|
+
export type { AICVConfig, ScanConfig, ScoringConfig, AIConfig, AILocalConfig, AIRemoteConfig, ReportConfig, ReportFormatType, } from './types.js';
|
|
5
|
+
export { DEFAULT_CONFIG, mergeWithDefaults } from './defaults.js';
|
|
6
|
+
export { loadConfig } from './loader.js';
|
|
7
|
+
export type { CLIConfigOverrides, LoadConfigOptions } from './loader.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads .aicv.yml with the following priority chain:
|
|
5
|
+
* 1. CLI args (passed directly)
|
|
6
|
+
* 2. Environment variables (AICV_*)
|
|
7
|
+
* 3. Project .aicv.yml (cwd)
|
|
8
|
+
* 4. User global ~/.aicv/config.yml
|
|
9
|
+
* 5. Built-in defaults
|
|
10
|
+
*
|
|
11
|
+
* Uses the `yaml` package for YAML parsing.
|
|
12
|
+
*/
|
|
13
|
+
import type { AICVConfig } from './types.js';
|
|
14
|
+
export interface CLIConfigOverrides {
|
|
15
|
+
license?: string;
|
|
16
|
+
threshold?: number;
|
|
17
|
+
format?: string | string[];
|
|
18
|
+
slaLevel?: string;
|
|
19
|
+
failOn?: string;
|
|
20
|
+
output?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface LoadConfigOptions {
|
|
23
|
+
/** Current working directory (default: process.cwd()) */
|
|
24
|
+
cwd?: string;
|
|
25
|
+
/** CLI argument overrides */
|
|
26
|
+
cliOverrides?: CLIConfigOverrides;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load configuration with full priority chain:
|
|
30
|
+
* CLI args > env vars > project .aicv.yml > user global > defaults
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadConfig(options?: LoadConfigOptions): AICVConfig;
|
|
33
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAmJ/D,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAoCD,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CAmCtE"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads .aicv.yml with the following priority chain:
|
|
5
|
+
* 1. CLI args (passed directly)
|
|
6
|
+
* 2. Environment variables (AICV_*)
|
|
7
|
+
* 3. Project .aicv.yml (cwd)
|
|
8
|
+
* 4. User global ~/.aicv/config.yml
|
|
9
|
+
* 5. Built-in defaults
|
|
10
|
+
*
|
|
11
|
+
* Uses the `yaml` package for YAML parsing.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
14
|
+
import { resolve, join } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { parse as parseYaml } from 'yaml';
|
|
17
|
+
import { mergeWithDefaults } from './defaults.js';
|
|
18
|
+
// ─── Config File Discovery ─────────────────────────────────────────
|
|
19
|
+
const CONFIG_FILENAMES = ['.ocrrc.yml', '.ocrrc.yaml', '.aicv.yml', '.aicv.yaml', 'aicv.yml', 'aicv.yaml'];
|
|
20
|
+
/**
|
|
21
|
+
* Search for a config file starting from `startDir` up to the filesystem root.
|
|
22
|
+
*/
|
|
23
|
+
function findConfigFile(startDir) {
|
|
24
|
+
let dir = resolve(startDir);
|
|
25
|
+
const root = resolve('/');
|
|
26
|
+
while (true) {
|
|
27
|
+
for (const name of CONFIG_FILENAMES) {
|
|
28
|
+
const candidate = join(dir, name);
|
|
29
|
+
if (existsSync(candidate)) {
|
|
30
|
+
return candidate;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const parent = resolve(dir, '..');
|
|
34
|
+
if (parent === dir || dir === root)
|
|
35
|
+
break;
|
|
36
|
+
dir = parent;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Read and parse a YAML config file, returning a partial AICVConfig.
|
|
42
|
+
* Returns null if the file cannot be read or parsed.
|
|
43
|
+
*/
|
|
44
|
+
function readYamlConfig(filePath) {
|
|
45
|
+
try {
|
|
46
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
47
|
+
const parsed = parseYaml(raw);
|
|
48
|
+
if (parsed && typeof parsed === 'object') {
|
|
49
|
+
return normalizeRawConfig(parsed);
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Normalize raw YAML object into Partial<AICVConfig>.
|
|
59
|
+
* Handles alternate key names and type coercion.
|
|
60
|
+
*/
|
|
61
|
+
function normalizeRawConfig(raw) {
|
|
62
|
+
const config = {};
|
|
63
|
+
if (typeof raw.license === 'string') {
|
|
64
|
+
config.license = raw.license;
|
|
65
|
+
}
|
|
66
|
+
// Scan section
|
|
67
|
+
if (raw.scan && typeof raw.scan === 'object') {
|
|
68
|
+
const s = raw.scan;
|
|
69
|
+
config.scan = {
|
|
70
|
+
include: toStringArray(s.include ?? s.paths ?? []),
|
|
71
|
+
exclude: toStringArray(s.exclude ?? []),
|
|
72
|
+
languages: toStringArray(s.languages ?? []),
|
|
73
|
+
slaLevel: normalizeSlaLevel(s.slaLevel ?? s.sla_level ?? 'L2'),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Scoring section
|
|
77
|
+
if (raw.scoring && typeof raw.scoring === 'object') {
|
|
78
|
+
const sc = raw.scoring;
|
|
79
|
+
config.scoring = {
|
|
80
|
+
threshold: typeof sc.threshold === 'number' ? sc.threshold : 70,
|
|
81
|
+
failOn: normalizeFailOn(sc.failOn ?? sc.fail_on ?? 'critical'),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
// AI section (type definition only, no runtime behavior yet)
|
|
85
|
+
if (raw.ai && typeof raw.ai === 'object') {
|
|
86
|
+
const ai = raw.ai;
|
|
87
|
+
config.ai = {
|
|
88
|
+
local: ai.local,
|
|
89
|
+
remote: ai.remote,
|
|
90
|
+
strategy: ai.strategy ?? 'local-first',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Report section
|
|
94
|
+
if (raw.report && typeof raw.report === 'object') {
|
|
95
|
+
const r = raw.report;
|
|
96
|
+
config.report = {
|
|
97
|
+
format: normalizeFormats(r.format),
|
|
98
|
+
output: typeof r.output === 'string' ? r.output : undefined,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return config;
|
|
102
|
+
}
|
|
103
|
+
// ─── Env Var Extraction ────────────────────────────────────────────
|
|
104
|
+
/**
|
|
105
|
+
* Extract config overrides from environment variables.
|
|
106
|
+
* Supported vars:
|
|
107
|
+
* AICV_LICENSE
|
|
108
|
+
* AICV_SLA_LEVEL
|
|
109
|
+
* AICV_THRESHOLD
|
|
110
|
+
* AICV_FAIL_ON
|
|
111
|
+
* AICV_FORMAT
|
|
112
|
+
*/
|
|
113
|
+
function configFromEnv() {
|
|
114
|
+
const config = {};
|
|
115
|
+
const env = process.env;
|
|
116
|
+
if (env.AICV_LICENSE) {
|
|
117
|
+
config.license = env.AICV_LICENSE;
|
|
118
|
+
}
|
|
119
|
+
if (env.AICV_SLA_LEVEL || env.AICV_THRESHOLD || env.AICV_FAIL_ON) {
|
|
120
|
+
config.scan = {};
|
|
121
|
+
config.scoring = {};
|
|
122
|
+
if (env.AICV_SLA_LEVEL) {
|
|
123
|
+
config.scan.slaLevel = normalizeSlaLevel(env.AICV_SLA_LEVEL);
|
|
124
|
+
}
|
|
125
|
+
if (env.AICV_THRESHOLD) {
|
|
126
|
+
const num = parseInt(env.AICV_THRESHOLD, 10);
|
|
127
|
+
if (!isNaN(num)) {
|
|
128
|
+
config.scoring.threshold = num;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (env.AICV_FAIL_ON) {
|
|
132
|
+
config.scoring.failOn = normalizeFailOn(env.AICV_FAIL_ON);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (env.AICV_FORMAT) {
|
|
136
|
+
config.report = {
|
|
137
|
+
format: normalizeFormats(env.AICV_FORMAT),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return config;
|
|
141
|
+
}
|
|
142
|
+
function configFromCLI(overrides) {
|
|
143
|
+
const config = {};
|
|
144
|
+
if (overrides.license) {
|
|
145
|
+
config.license = overrides.license;
|
|
146
|
+
}
|
|
147
|
+
if (overrides.threshold !== undefined || overrides.failOn || overrides.slaLevel) {
|
|
148
|
+
config.scan = {};
|
|
149
|
+
config.scoring = {};
|
|
150
|
+
if (overrides.slaLevel) {
|
|
151
|
+
config.scan.slaLevel = normalizeSlaLevel(overrides.slaLevel);
|
|
152
|
+
}
|
|
153
|
+
if (overrides.threshold !== undefined) {
|
|
154
|
+
config.scoring.threshold = overrides.threshold;
|
|
155
|
+
}
|
|
156
|
+
if (overrides.failOn) {
|
|
157
|
+
config.scoring.failOn = normalizeFailOn(overrides.failOn);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (overrides.format || overrides.output) {
|
|
161
|
+
config.report = {
|
|
162
|
+
format: overrides.format ? normalizeFormats(overrides.format) : [],
|
|
163
|
+
output: overrides.output,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
return config;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Load configuration with full priority chain:
|
|
170
|
+
* CLI args > env vars > project .aicv.yml > user global > defaults
|
|
171
|
+
*/
|
|
172
|
+
export function loadConfig(options = {}) {
|
|
173
|
+
const cwd = options.cwd ?? process.cwd();
|
|
174
|
+
// Layer 5: defaults (handled by mergeWithDefaults)
|
|
175
|
+
// Layer 4: user global config
|
|
176
|
+
const globalConfigPath = join(homedir(), '.aicv', 'config.yml');
|
|
177
|
+
const globalConfig = existsSync(globalConfigPath)
|
|
178
|
+
? readYamlConfig(globalConfigPath) ?? {}
|
|
179
|
+
: {};
|
|
180
|
+
// Layer 3: project config
|
|
181
|
+
const projectConfigPath = findConfigFile(cwd);
|
|
182
|
+
const projectConfig = projectConfigPath
|
|
183
|
+
? readYamlConfig(projectConfigPath) ?? {}
|
|
184
|
+
: {};
|
|
185
|
+
// Layer 2: environment variables
|
|
186
|
+
const envConfig = configFromEnv();
|
|
187
|
+
// Layer 1: CLI args
|
|
188
|
+
const cliConfig = options.cliOverrides
|
|
189
|
+
? configFromCLI(options.cliOverrides)
|
|
190
|
+
: {};
|
|
191
|
+
// Merge: defaults < global < project < env < cli
|
|
192
|
+
const merged = deepMergeConfigs({}, globalConfig, projectConfig, envConfig, cliConfig);
|
|
193
|
+
return mergeWithDefaults(merged);
|
|
194
|
+
}
|
|
195
|
+
// ─── Utility Helpers ───────────────────────────────────────────────
|
|
196
|
+
function toStringArray(val) {
|
|
197
|
+
if (Array.isArray(val))
|
|
198
|
+
return val.filter((v) => typeof v === 'string');
|
|
199
|
+
if (typeof val === 'string')
|
|
200
|
+
return [val];
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
function normalizeSlaLevel(val) {
|
|
204
|
+
const s = String(val).toUpperCase();
|
|
205
|
+
if (s === 'L1' || s === 'L2' || s === 'L3')
|
|
206
|
+
return s;
|
|
207
|
+
return 'L2';
|
|
208
|
+
}
|
|
209
|
+
function normalizeFailOn(val) {
|
|
210
|
+
const s = String(val).toLowerCase();
|
|
211
|
+
if (['critical', 'high', 'medium', 'low', 'none'].includes(s)) {
|
|
212
|
+
return s;
|
|
213
|
+
}
|
|
214
|
+
return 'critical';
|
|
215
|
+
}
|
|
216
|
+
const VALID_FORMATS = new Set(['terminal', 'json', 'html', 'markdown', 'sarif']);
|
|
217
|
+
function normalizeFormats(val) {
|
|
218
|
+
const arr = toStringArray(val);
|
|
219
|
+
const result = arr.filter((f) => VALID_FORMATS.has(f));
|
|
220
|
+
return result.length > 0 ? result : ['terminal'];
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Deep-merge multiple partial configs (left to right, later wins).
|
|
224
|
+
*/
|
|
225
|
+
function deepMergeConfigs(...configs) {
|
|
226
|
+
const result = {};
|
|
227
|
+
for (const cfg of configs) {
|
|
228
|
+
if (cfg.license !== undefined)
|
|
229
|
+
result.license = cfg.license;
|
|
230
|
+
if (cfg.scan) {
|
|
231
|
+
result.scan = { ...(result.scan ?? {}), ...cfg.scan };
|
|
232
|
+
}
|
|
233
|
+
if (cfg.scoring) {
|
|
234
|
+
result.scoring = { ...(result.scoring ?? {}), ...cfg.scoring };
|
|
235
|
+
}
|
|
236
|
+
if (cfg.ai) {
|
|
237
|
+
result.ai = { ...(result.ai ?? {}), ...cfg.ai };
|
|
238
|
+
}
|
|
239
|
+
if (cfg.report) {
|
|
240
|
+
result.report = { ...(result.report ?? {}), ...cfg.report };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=loader.js.map
|