@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,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Pattern Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* Detects AI-generated security anti-patterns:
|
|
5
|
+
* 1. Hardcoded secrets/credentials (CWE-798)
|
|
6
|
+
* 2. eval/Function constructor usage (CWE-95)
|
|
7
|
+
* 3. SQL injection via string concatenation/template literals (CWE-89)
|
|
8
|
+
* 4. Insecure cryptography: Math.random(), MD5/SHA1 for passwords (CWE-328/338)
|
|
9
|
+
* 5. Insecure defaults: cors origin '*', disabled security headers (CWE-942)
|
|
10
|
+
*
|
|
11
|
+
* AI models frequently generate code with these patterns from training data.
|
|
12
|
+
*
|
|
13
|
+
* Implements the unified Detector interface.
|
|
14
|
+
*
|
|
15
|
+
* @since 0.3.0
|
|
16
|
+
*/
|
|
17
|
+
import { AIDefectCategory } from '../types.js';
|
|
18
|
+
// ─── Hardcoded Secret Patterns ───
|
|
19
|
+
const SECRET_NAME_PATTERN = /(?:password|passwd|pwd|api_?key|apikey|secret|token|credential|private_?key|auth_?token|access_?key|client_?secret)\s*[:=]\s*['"`]([^'"`]{4,})['"`]/i;
|
|
20
|
+
const SECRET_ASSIGNMENT_PATTERN = /(?:const|let|var)\s+(?:password|passwd|pwd|apiKey|api_key|secret|token|credential|privateKey|private_key|authToken|auth_token|accessKey|access_key|clientSecret|client_secret)\s*=\s*['"`]([^'"`]{4,})['"`]/i;
|
|
21
|
+
// ─── SQL Patterns ───
|
|
22
|
+
const SQL_CONCAT_PATTERN = /['"`](?:SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE)\s.*?['"`]\s*\+\s*\w+/i;
|
|
23
|
+
const SQL_TEMPLATE_PATTERN = /(?:SELECT|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE)\s.*?\$\{/i;
|
|
24
|
+
// ─── All Security Patterns ───
|
|
25
|
+
const SECURITY_PATTERNS = [
|
|
26
|
+
// 1. Hardcoded secrets
|
|
27
|
+
{
|
|
28
|
+
type: 'hardcoded-secret',
|
|
29
|
+
regex: SECRET_NAME_PATTERN,
|
|
30
|
+
severity: 'critical',
|
|
31
|
+
message: 'Hardcoded secret/credential detected',
|
|
32
|
+
suggestion: 'Use environment variables (process.env.XXX) or a secrets manager instead of hardcoding credentials.',
|
|
33
|
+
cweId: 'CWE-798',
|
|
34
|
+
skipTests: true,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: 'hardcoded-secret',
|
|
38
|
+
regex: SECRET_ASSIGNMENT_PATTERN,
|
|
39
|
+
severity: 'critical',
|
|
40
|
+
message: 'Hardcoded secret assigned to variable with sensitive name',
|
|
41
|
+
suggestion: 'Use environment variables (process.env.XXX) or a secrets manager.',
|
|
42
|
+
cweId: 'CWE-798',
|
|
43
|
+
skipTests: true,
|
|
44
|
+
},
|
|
45
|
+
// 2. eval / Function constructor
|
|
46
|
+
{
|
|
47
|
+
type: 'unsafe-eval',
|
|
48
|
+
regex: /\beval\s*\(/,
|
|
49
|
+
severity: 'high',
|
|
50
|
+
message: 'Use of eval() detected — allows arbitrary code execution',
|
|
51
|
+
suggestion: 'Avoid eval(). Use JSON.parse() for data parsing, or safer alternatives like Function constructors with strict sandboxing.',
|
|
52
|
+
cweId: 'CWE-95',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
type: 'unsafe-eval',
|
|
56
|
+
regex: /new\s+Function\s*\(/,
|
|
57
|
+
severity: 'high',
|
|
58
|
+
message: 'Use of new Function() detected — allows dynamic code execution',
|
|
59
|
+
suggestion: 'Avoid new Function(). Use structured approaches to achieve dynamic behavior.',
|
|
60
|
+
cweId: 'CWE-95',
|
|
61
|
+
},
|
|
62
|
+
// 3. SQL injection
|
|
63
|
+
{
|
|
64
|
+
type: 'sql-injection',
|
|
65
|
+
regex: SQL_CONCAT_PATTERN,
|
|
66
|
+
severity: 'medium',
|
|
67
|
+
message: 'Potential SQL injection: SQL query built with string concatenation',
|
|
68
|
+
suggestion: 'Use parameterized queries or an ORM instead of string concatenation for SQL queries.',
|
|
69
|
+
cweId: 'CWE-89',
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: 'sql-injection',
|
|
73
|
+
regex: SQL_TEMPLATE_PATTERN,
|
|
74
|
+
severity: 'medium',
|
|
75
|
+
message: 'Potential SQL injection: SQL query built with template literal interpolation',
|
|
76
|
+
suggestion: 'Use parameterized queries (e.g., $1 placeholders) instead of template literal interpolation.',
|
|
77
|
+
cweId: 'CWE-89',
|
|
78
|
+
},
|
|
79
|
+
// 4. Insecure crypto
|
|
80
|
+
{
|
|
81
|
+
type: 'insecure-random',
|
|
82
|
+
regex: /Math\.random\s*\(\)/,
|
|
83
|
+
severity: 'medium',
|
|
84
|
+
message: 'Math.random() is not cryptographically secure',
|
|
85
|
+
suggestion: 'Use crypto.randomBytes() or crypto.randomUUID() for security-sensitive random values.',
|
|
86
|
+
cweId: 'CWE-338',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: 'insecure-hash',
|
|
90
|
+
regex: /createHash\s*\(\s*['"]md5['"]\s*\)/,
|
|
91
|
+
severity: 'medium',
|
|
92
|
+
message: 'MD5 is cryptographically broken — should not be used for security purposes',
|
|
93
|
+
suggestion: 'Use SHA-256 or SHA-3 for hashing. Use bcrypt/scrypt/argon2 for password hashing.',
|
|
94
|
+
cweId: 'CWE-328',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
type: 'insecure-hash',
|
|
98
|
+
regex: /createHash\s*\(\s*['"]sha1['"]\s*\)/,
|
|
99
|
+
severity: 'medium',
|
|
100
|
+
message: 'SHA-1 is deprecated for security use — vulnerable to collision attacks',
|
|
101
|
+
suggestion: 'Use SHA-256 or SHA-3 for hashing. Use bcrypt/scrypt/argon2 for password hashing.',
|
|
102
|
+
cweId: 'CWE-328',
|
|
103
|
+
},
|
|
104
|
+
// 5. Insecure defaults
|
|
105
|
+
{
|
|
106
|
+
type: 'insecure-cors',
|
|
107
|
+
regex: /cors\s*\(\s*\{[^}]*origin\s*:\s*['"`]\*['"`]/,
|
|
108
|
+
severity: 'medium',
|
|
109
|
+
message: 'CORS configured with wildcard origin — allows any domain to make requests',
|
|
110
|
+
suggestion: 'Restrict CORS origin to specific trusted domains instead of using wildcard \'*\'.',
|
|
111
|
+
cweId: 'CWE-942',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
type: 'insecure-config',
|
|
115
|
+
regex: /helmet\s*\(\s*\{[^}]*contentSecurityPolicy\s*:\s*false/,
|
|
116
|
+
severity: 'medium',
|
|
117
|
+
message: 'Content Security Policy is disabled in helmet configuration',
|
|
118
|
+
suggestion: 'Enable Content Security Policy. Configure it for your specific needs rather than disabling it.',
|
|
119
|
+
cweId: 'CWE-693',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'insecure-config',
|
|
123
|
+
regex: /rejectUnauthorized\s*:\s*false/,
|
|
124
|
+
severity: 'medium',
|
|
125
|
+
message: 'TLS certificate verification is disabled (rejectUnauthorized: false)',
|
|
126
|
+
suggestion: 'Do not disable TLS certificate verification in production. Fix the certificate chain instead.',
|
|
127
|
+
cweId: 'CWE-295',
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
// ─── Helpers ───
|
|
131
|
+
function isTestFile(filePath) {
|
|
132
|
+
return /\.(test|spec)\.[jt]sx?$/.test(filePath) ||
|
|
133
|
+
filePath.includes('__tests__') ||
|
|
134
|
+
filePath.includes('__mocks__') ||
|
|
135
|
+
/\/tests?\//.test(filePath);
|
|
136
|
+
}
|
|
137
|
+
// ─── Main Detector ───
|
|
138
|
+
/**
|
|
139
|
+
* SecurityPatternDetector — detects common security anti-patterns in AI-generated code.
|
|
140
|
+
*
|
|
141
|
+
* Scans source code with regex patterns for 5 categories:
|
|
142
|
+
* hardcoded secrets, eval usage, SQL injection, insecure crypto, insecure defaults.
|
|
143
|
+
*/
|
|
144
|
+
export class SecurityPatternDetector {
|
|
145
|
+
name = 'security-pattern';
|
|
146
|
+
version = '1.0.0';
|
|
147
|
+
tier = 1;
|
|
148
|
+
// ─── V3 Unified Interface ───
|
|
149
|
+
async detect(files) {
|
|
150
|
+
const allIssues = [];
|
|
151
|
+
let globalIndex = 0;
|
|
152
|
+
for (const file of files) {
|
|
153
|
+
const issues = this.analyzeFile(file.path, file.content);
|
|
154
|
+
for (const issue of issues) {
|
|
155
|
+
issue.id = `security:${globalIndex++}`;
|
|
156
|
+
allIssues.push(issue);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return allIssues;
|
|
160
|
+
}
|
|
161
|
+
// ─── Internal Analysis ───
|
|
162
|
+
analyzeFile(filePath, source) {
|
|
163
|
+
const issues = [];
|
|
164
|
+
const lines = source.split('\n');
|
|
165
|
+
const isTest = isTestFile(filePath);
|
|
166
|
+
for (let i = 0; i < lines.length; i++) {
|
|
167
|
+
const line = lines[i];
|
|
168
|
+
const trimmed = line.trim();
|
|
169
|
+
// Skip comments
|
|
170
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// Skip suppressed lines
|
|
174
|
+
const prevLine = i > 0 ? lines[i - 1] : '';
|
|
175
|
+
if (prevLine.includes('// ai-validator-ignore') || prevLine.includes('// ai-validator-disable')) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
for (const pattern of SECURITY_PATTERNS) {
|
|
179
|
+
// Skip test-file-only patterns in test files
|
|
180
|
+
if (pattern.skipTests && isTest) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// Reset regex state
|
|
184
|
+
const regex = new RegExp(pattern.regex.source, pattern.regex.flags);
|
|
185
|
+
const match = regex.exec(line);
|
|
186
|
+
if (match) {
|
|
187
|
+
// Additional check: for hardcoded secrets, skip env variable references
|
|
188
|
+
if (pattern.type === 'hardcoded-secret') {
|
|
189
|
+
if (line.includes('process.env') || line.includes('env.') ||
|
|
190
|
+
line.includes('config.') || line.includes('Config.')) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// Skip example/placeholder values
|
|
194
|
+
const value = match[1] || '';
|
|
195
|
+
if (value === 'xxx' || value === 'XXX' || value === '***' ||
|
|
196
|
+
value === 'your-' || value.startsWith('your-') ||
|
|
197
|
+
value === 'placeholder' || value === 'changeme') {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// For SQL injection, skip tagged template literals (sql``, Prisma.$queryRaw``)
|
|
202
|
+
if (pattern.type === 'sql-injection') {
|
|
203
|
+
if (/(?:sql|Prisma\.\$queryRaw)\s*`/.test(line)) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
issues.push({
|
|
208
|
+
id: '', // set in detect()
|
|
209
|
+
detector: this.name,
|
|
210
|
+
type: pattern.type,
|
|
211
|
+
category: AIDefectCategory.SECURITY_ANTIPATTERN,
|
|
212
|
+
severity: pattern.severity,
|
|
213
|
+
message: pattern.message,
|
|
214
|
+
file: filePath,
|
|
215
|
+
line: i + 1,
|
|
216
|
+
column: match.index + 1,
|
|
217
|
+
suggestion: pattern.suggestion,
|
|
218
|
+
fix: {
|
|
219
|
+
description: pattern.suggestion,
|
|
220
|
+
autoFixable: false,
|
|
221
|
+
},
|
|
222
|
+
references: pattern.cweId
|
|
223
|
+
? { urls: [`https://cwe.mitre.org/data/definitions/${pattern.cweId.replace('CWE-', '')}.html`], cweId: pattern.cweId }
|
|
224
|
+
: undefined,
|
|
225
|
+
confidence: 0.85,
|
|
226
|
+
detectionSource: 'static',
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return issues;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
export default SecurityPatternDetector;
|
|
235
|
+
//# sourceMappingURL=security-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-pattern.js","sourceRoot":"","sources":["../../src/detectors/security-pattern.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stale API Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* Detects AI-generated code using deprecated/removed APIs.
|
|
5
|
+
* AI models trained on older data frequently suggest outdated APIs
|
|
6
|
+
* (e.g., new Buffer(), fs.exists(), React.createClass()).
|
|
7
|
+
*
|
|
8
|
+
* Uses an embedded JSON database of deprecated APIs for fast regex-based scanning.
|
|
9
|
+
*
|
|
10
|
+
* Implements the unified Detector interface.
|
|
11
|
+
*
|
|
12
|
+
* @since 0.3.0
|
|
13
|
+
*/
|
|
14
|
+
import type { Detector, UnifiedIssue, FileAnalysis } from '../types.js';
|
|
15
|
+
export interface DeprecatedAPIEntry {
|
|
16
|
+
api: string;
|
|
17
|
+
pattern: string;
|
|
18
|
+
replacement: string;
|
|
19
|
+
deprecated_since: string;
|
|
20
|
+
severity: string;
|
|
21
|
+
references: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* StaleAPIDetector — detects deprecated/outdated API usage in AI-generated code.
|
|
25
|
+
*
|
|
26
|
+
* Scans source code using regex patterns from an embedded deprecated API database.
|
|
27
|
+
* Reports matches as UnifiedIssue with category STALE_KNOWLEDGE.
|
|
28
|
+
*/
|
|
29
|
+
export declare class StaleAPIDetector implements Detector {
|
|
30
|
+
readonly name = "stale-api";
|
|
31
|
+
readonly version = "1.0.0";
|
|
32
|
+
readonly tier: 1;
|
|
33
|
+
private entries;
|
|
34
|
+
private compiledPatterns;
|
|
35
|
+
constructor();
|
|
36
|
+
/**
|
|
37
|
+
* Allow injecting custom entries (useful for testing).
|
|
38
|
+
*/
|
|
39
|
+
static withEntries(entries: DeprecatedAPIEntry[]): StaleAPIDetector;
|
|
40
|
+
detect(files: FileAnalysis[]): Promise<UnifiedIssue[]>;
|
|
41
|
+
private analyzeFile;
|
|
42
|
+
}
|
|
43
|
+
export default StaleAPIDetector;
|
|
44
|
+
//# sourceMappingURL=stale-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-api.d.ts","sourceRoot":"","sources":["../../src/detectors/stale-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAY,MAAM,aAAa,CAAC;AAKlF,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AA2DD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAU;IAE3B,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,gBAAgB,CAAsD;;IAU9E;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,gBAAgB;IAY7D,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiB5D,OAAO,CAAC,WAAW;CAoDpB;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stale API Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* Detects AI-generated code using deprecated/removed APIs.
|
|
5
|
+
* AI models trained on older data frequently suggest outdated APIs
|
|
6
|
+
* (e.g., new Buffer(), fs.exists(), React.createClass()).
|
|
7
|
+
*
|
|
8
|
+
* Uses an embedded JSON database of deprecated APIs for fast regex-based scanning.
|
|
9
|
+
*
|
|
10
|
+
* Implements the unified Detector interface.
|
|
11
|
+
*
|
|
12
|
+
* @since 0.3.0
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
import { join, dirname } from 'node:path';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import { AIDefectCategory } from '../types.js';
|
|
18
|
+
// ─── Load Embedded Database ───
|
|
19
|
+
function resolveDataPath() {
|
|
20
|
+
// Try multiple strategies to find the data file
|
|
21
|
+
const candidates = [];
|
|
22
|
+
// Strategy 1: Relative to this source file (works in ESM)
|
|
23
|
+
try {
|
|
24
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
25
|
+
candidates.push(join(dirname(thisFile), '..', 'data', 'deprecated-apis-js.json'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// import.meta.url not available (e.g., vitest transforms)
|
|
29
|
+
}
|
|
30
|
+
// Strategy 2: Relative to CWD (packages/core)
|
|
31
|
+
candidates.push(join(process.cwd(), 'src', 'data', 'deprecated-apis-js.json'));
|
|
32
|
+
// Strategy 3: Relative to CWD (project root)
|
|
33
|
+
candidates.push(join(process.cwd(), 'packages', 'core', 'src', 'data', 'deprecated-apis-js.json'));
|
|
34
|
+
for (const candidate of candidates) {
|
|
35
|
+
try {
|
|
36
|
+
readFileSync(candidate, 'utf-8');
|
|
37
|
+
return candidate;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return candidates[0]; // fallback, will fail gracefully
|
|
44
|
+
}
|
|
45
|
+
function loadDeprecatedAPIs() {
|
|
46
|
+
try {
|
|
47
|
+
const dataPath = resolveDataPath();
|
|
48
|
+
const raw = readFileSync(dataPath, 'utf-8');
|
|
49
|
+
return JSON.parse(raw);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// ─── Helpers ───
|
|
56
|
+
function mapSeverity(sev) {
|
|
57
|
+
switch (sev) {
|
|
58
|
+
case 'critical': return 'critical';
|
|
59
|
+
case 'high': return 'high';
|
|
60
|
+
case 'medium': return 'medium';
|
|
61
|
+
case 'low': return 'low';
|
|
62
|
+
case 'info': return 'info';
|
|
63
|
+
default: return 'high';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ─── Main Detector ───
|
|
67
|
+
/**
|
|
68
|
+
* StaleAPIDetector — detects deprecated/outdated API usage in AI-generated code.
|
|
69
|
+
*
|
|
70
|
+
* Scans source code using regex patterns from an embedded deprecated API database.
|
|
71
|
+
* Reports matches as UnifiedIssue with category STALE_KNOWLEDGE.
|
|
72
|
+
*/
|
|
73
|
+
export class StaleAPIDetector {
|
|
74
|
+
name = 'stale-api';
|
|
75
|
+
version = '1.0.0';
|
|
76
|
+
tier = 1;
|
|
77
|
+
entries;
|
|
78
|
+
compiledPatterns;
|
|
79
|
+
constructor() {
|
|
80
|
+
this.entries = loadDeprecatedAPIs();
|
|
81
|
+
this.compiledPatterns = this.entries.map(entry => ({
|
|
82
|
+
entry,
|
|
83
|
+
regex: new RegExp(entry.pattern, 'g'),
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Allow injecting custom entries (useful for testing).
|
|
88
|
+
*/
|
|
89
|
+
static withEntries(entries) {
|
|
90
|
+
const detector = new StaleAPIDetector();
|
|
91
|
+
detector.entries = entries;
|
|
92
|
+
detector.compiledPatterns = entries.map(entry => ({
|
|
93
|
+
entry,
|
|
94
|
+
regex: new RegExp(entry.pattern, 'g'),
|
|
95
|
+
}));
|
|
96
|
+
return detector;
|
|
97
|
+
}
|
|
98
|
+
// ─── V3 Unified Interface ───
|
|
99
|
+
async detect(files) {
|
|
100
|
+
const allIssues = [];
|
|
101
|
+
let globalIndex = 0;
|
|
102
|
+
for (const file of files) {
|
|
103
|
+
const issues = this.analyzeFile(file.path, file.content);
|
|
104
|
+
for (const issue of issues) {
|
|
105
|
+
issue.id = `stale-api:${globalIndex++}`;
|
|
106
|
+
allIssues.push(issue);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return allIssues;
|
|
110
|
+
}
|
|
111
|
+
// ─── Internal Analysis ───
|
|
112
|
+
analyzeFile(filePath, source) {
|
|
113
|
+
const issues = [];
|
|
114
|
+
const lines = source.split('\n');
|
|
115
|
+
for (const { entry, regex } of this.compiledPatterns) {
|
|
116
|
+
// Reset regex lastIndex for each file
|
|
117
|
+
regex.lastIndex = 0;
|
|
118
|
+
for (let i = 0; i < lines.length; i++) {
|
|
119
|
+
const line = lines[i];
|
|
120
|
+
const trimmed = line.trim();
|
|
121
|
+
// Skip comments
|
|
122
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
// Skip suppressed lines
|
|
126
|
+
const prevLine = i > 0 ? lines[i - 1] : '';
|
|
127
|
+
if (prevLine.includes('// ai-validator-ignore') || prevLine.includes('// ai-validator-disable')) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// Reset regex for each line
|
|
131
|
+
regex.lastIndex = 0;
|
|
132
|
+
const match = regex.exec(line);
|
|
133
|
+
if (match) {
|
|
134
|
+
issues.push({
|
|
135
|
+
id: '', // will be set in detect()
|
|
136
|
+
detector: this.name,
|
|
137
|
+
type: 'deprecated-api',
|
|
138
|
+
category: AIDefectCategory.STALE_KNOWLEDGE,
|
|
139
|
+
severity: mapSeverity(entry.severity),
|
|
140
|
+
message: `Deprecated API usage: '${entry.api}' (deprecated since ${entry.deprecated_since})`,
|
|
141
|
+
file: filePath,
|
|
142
|
+
line: i + 1,
|
|
143
|
+
column: match.index + 1,
|
|
144
|
+
suggestion: `Replace with: ${entry.replacement}`,
|
|
145
|
+
fix: {
|
|
146
|
+
description: `Replace '${entry.api}' with ${entry.replacement}`,
|
|
147
|
+
autoFixable: false,
|
|
148
|
+
},
|
|
149
|
+
references: entry.references,
|
|
150
|
+
confidence: 0.9,
|
|
151
|
+
detectionSource: 'static',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return issues;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
export default StaleAPIDetector;
|
|
160
|
+
//# sourceMappingURL=stale-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stale-api.js","sourceRoot":"","sources":["../../src/detectors/stale-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Safety Detector (V3)
|
|
3
|
+
*
|
|
4
|
+
* TypeScript-specific type safety analysis:
|
|
5
|
+
* 1. Excessive `any` usage (`: any`, `as any`, `<any>`)
|
|
6
|
+
* 2. Missing return types on exported functions
|
|
7
|
+
* 3. Unsafe type assertions (`as unknown as X`)
|
|
8
|
+
* 4. Non-null assertion operator abuse (`!.`)
|
|
9
|
+
*
|
|
10
|
+
* AI models frequently generate TypeScript code with excessive `any` usage,
|
|
11
|
+
* unsafe assertions, and missing type annotations.
|
|
12
|
+
*
|
|
13
|
+
* Only operates on .ts/.tsx files.
|
|
14
|
+
*
|
|
15
|
+
* Implements the unified Detector interface.
|
|
16
|
+
*
|
|
17
|
+
* @since 0.3.0
|
|
18
|
+
*/
|
|
19
|
+
import type { Detector, UnifiedIssue, FileAnalysis } from '../types.js';
|
|
20
|
+
/**
|
|
21
|
+
* TypeSafetyDetector — detects type safety issues in AI-generated TypeScript code.
|
|
22
|
+
*
|
|
23
|
+
* Analyzes:
|
|
24
|
+
* - `any` abuse (: any, as any, <any>)
|
|
25
|
+
* - Missing return type annotations on exported functions
|
|
26
|
+
* - Unsafe type assertions (as unknown as X)
|
|
27
|
+
* - Excessive non-null assertion (!) usage
|
|
28
|
+
*/
|
|
29
|
+
export declare class TypeSafetyDetector implements Detector {
|
|
30
|
+
readonly name = "type-safety";
|
|
31
|
+
readonly version = "1.0.0";
|
|
32
|
+
readonly tier: 1;
|
|
33
|
+
detect(files: FileAnalysis[]): Promise<UnifiedIssue[]>;
|
|
34
|
+
private analyzeFile;
|
|
35
|
+
private detectAnyUsage;
|
|
36
|
+
private detectMissingReturnTypes;
|
|
37
|
+
private detectUnsafeAssertions;
|
|
38
|
+
private detectNonNullAssertions;
|
|
39
|
+
}
|
|
40
|
+
export default TypeSafetyDetector;
|
|
41
|
+
//# sourceMappingURL=type-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-safety.d.ts","sourceRoot":"","sources":["../../src/detectors/type-safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAY,MAAM,aAAa,CAAC;AAWlF;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,YAAW,QAAQ;IACjD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAU;IAIrB,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoB5D,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,cAAc;IAsHtB,OAAO,CAAC,wBAAwB;IAoDhC,OAAO,CAAC,sBAAsB;IAqC9B,OAAO,CAAC,uBAAuB;CA8ChC;AAED,eAAe,kBAAkB,CAAC"}
|