code-auditor-mcp 3.1.1 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +665 -1
- package/README.md +85 -11
- package/dist/__test_tmp__/spec18_test.d.ts +2 -0
- package/dist/__test_tmp__/spec18_test.d.ts.map +1 -0
- package/dist/__test_tmp__/spec18_test.js +5 -0
- package/dist/__test_tmp__/spec18_test.js.map +1 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts +6 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts.map +1 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js +12 -0
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js.map +1 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts +7 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts.map +1 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js +13 -0
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js.map +1 -0
- package/dist/analyzers/analyzerUtils.js +2 -2
- package/dist/analyzers/analyzerUtils.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +2 -2
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts +3 -0
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js +3 -3
- package/dist/analyzers/cross-language/CrossLanguageSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +2 -2
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +83 -0
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +611 -0
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -0
- package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/documentationAnalyzer.js +8 -4
- package/dist/analyzers/documentationAnalyzer.js.map +1 -1
- package/dist/analyzers/orm/adapterRegistry.d.ts +41 -0
- package/dist/analyzers/orm/adapterRegistry.d.ts.map +1 -0
- package/dist/analyzers/orm/adapterRegistry.js +73 -0
- package/dist/analyzers/orm/adapterRegistry.js.map +1 -0
- package/dist/analyzers/orm/drizzleAdapter.d.ts +42 -0
- package/dist/analyzers/orm/drizzleAdapter.d.ts.map +1 -0
- package/dist/analyzers/orm/drizzleAdapter.js +166 -0
- package/dist/analyzers/orm/drizzleAdapter.js.map +1 -0
- package/dist/analyzers/orm/index.d.ts +14 -0
- package/dist/analyzers/orm/index.d.ts.map +1 -0
- package/dist/analyzers/orm/index.js +24 -0
- package/dist/analyzers/orm/index.js.map +1 -0
- package/dist/analyzers/orm/prismaAdapter.d.ts +45 -0
- package/dist/analyzers/orm/prismaAdapter.d.ts.map +1 -0
- package/dist/analyzers/orm/prismaAdapter.js +170 -0
- package/dist/analyzers/orm/prismaAdapter.js.map +1 -0
- package/dist/analyzers/orm/types.d.ts +63 -0
- package/dist/analyzers/orm/types.d.ts.map +1 -0
- package/dist/analyzers/orm/types.js +10 -0
- package/dist/analyzers/orm/types.js.map +1 -0
- package/dist/analyzers/provenance.d.ts +133 -0
- package/dist/analyzers/provenance.d.ts.map +1 -0
- package/dist/analyzers/provenance.js +1041 -0
- package/dist/analyzers/provenance.js.map +1 -0
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +117 -1
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/ruleRegistry.d.ts +38 -0
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -0
- package/dist/analyzers/ruleRegistry.js +123 -0
- package/dist/analyzers/ruleRegistry.js.map +1 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +58 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +445 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +52 -0
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +108 -26
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +64 -0
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +259 -53
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +5 -15
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +10 -10
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +25 -0
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +250 -59
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +103 -0
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +750 -0
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +483 -3
- package/dist/auditRunner.js.map +1 -1
- package/dist/baseline.d.ts +98 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +184 -0
- package/dist/baseline.js.map +1 -0
- package/dist/churn/churnExtractor.d.ts +32 -0
- package/dist/churn/churnExtractor.d.ts.map +1 -0
- package/dist/churn/churnExtractor.js +261 -0
- package/dist/churn/churnExtractor.js.map +1 -0
- package/dist/cli.js +1215 -11
- package/dist/cli.js.map +1 -1
- package/dist/codeIndexDB-enhanced.js +1 -1
- package/dist/codeIndexDB-enhanced.js.map +1 -1
- package/dist/codeIndexDB.d.ts +101 -0
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +661 -5
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +95 -1
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +72 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +146 -15
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/pathProfiles.d.ts +38 -0
- package/dist/config/pathProfiles.d.ts.map +1 -0
- package/dist/config/pathProfiles.js +47 -0
- package/dist/config/pathProfiles.js.map +1 -0
- package/dist/conventions/conventionMiner.d.ts +63 -0
- package/dist/conventions/conventionMiner.d.ts.map +1 -0
- package/dist/conventions/conventionMiner.js +696 -0
- package/dist/conventions/conventionMiner.js.map +1 -0
- package/dist/coverage/coverageService.d.ts +49 -0
- package/dist/coverage/coverageService.d.ts.map +1 -0
- package/dist/coverage/coverageService.js +117 -0
- package/dist/coverage/coverageService.js.map +1 -0
- package/dist/coverage/istanbulParser.d.ts +84 -0
- package/dist/coverage/istanbulParser.d.ts.map +1 -0
- package/dist/coverage/istanbulParser.js +120 -0
- package/dist/coverage/istanbulParser.js.map +1 -0
- package/dist/coverage/lcovParser.d.ts +40 -0
- package/dist/coverage/lcovParser.d.ts.map +1 -0
- package/dist/coverage/lcovParser.js +168 -0
- package/dist/coverage/lcovParser.js.map +1 -0
- package/dist/fingerprint.d.ts +17 -0
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +42 -0
- package/dist/fingerprint.js.map +1 -1
- package/dist/grammars/tree-sitter-css.wasm +0 -0
- package/dist/graph/blastRadius.d.ts +27 -0
- package/dist/graph/blastRadius.d.ts.map +1 -0
- package/dist/graph/blastRadius.js +150 -0
- package/dist/graph/blastRadius.js.map +1 -0
- package/dist/graph/callGraph.d.ts +78 -0
- package/dist/graph/callGraph.d.ts.map +1 -0
- package/dist/graph/callGraph.js +484 -0
- package/dist/graph/callGraph.js.map +1 -0
- package/dist/graph/importGraph.d.ts +91 -0
- package/dist/graph/importGraph.d.ts.map +1 -0
- package/dist/graph/importGraph.js +602 -0
- package/dist/graph/importGraph.js.map +1 -0
- package/dist/graph/outputFormatter.d.ts +55 -0
- package/dist/graph/outputFormatter.d.ts.map +1 -0
- package/dist/graph/outputFormatter.js +283 -0
- package/dist/graph/outputFormatter.js.map +1 -0
- package/dist/hooks/codex.d.ts +36 -1
- package/dist/hooks/codex.d.ts.map +1 -1
- package/dist/hooks/codex.js +88 -54
- package/dist/hooks/codex.js.map +1 -1
- package/dist/hotspots/hotspotScorer.d.ts +20 -0
- package/dist/hotspots/hotspotScorer.d.ts.map +1 -0
- package/dist/hotspots/hotspotScorer.js +202 -0
- package/dist/hotspots/hotspotScorer.js.map +1 -0
- package/dist/invariants/invariant-rules.schema.json +42 -1
- package/dist/invariants/ruleEngine.d.ts +4 -1
- package/dist/invariants/ruleEngine.d.ts.map +1 -1
- package/dist/invariants/ruleEngine.js +141 -5
- package/dist/invariants/ruleEngine.js.map +1 -1
- package/dist/invariants/ruleValidator.d.ts.map +1 -1
- package/dist/invariants/ruleValidator.js +62 -1
- package/dist/invariants/ruleValidator.js.map +1 -1
- package/dist/invariants/types.d.ts +23 -2
- package/dist/invariants/types.d.ts.map +1 -1
- package/dist/languages/UniversalAnalyzer.d.ts +1 -1
- package/dist/languages/UniversalAnalyzer.d.ts.map +1 -1
- package/dist/languages/UniversalAnalyzer.js +61 -4
- package/dist/languages/UniversalAnalyzer.js.map +1 -1
- package/dist/languages/index.d.ts +1 -0
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +3 -0
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts +59 -0
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.d.ts.map +1 -0
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +236 -0
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -0
- package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
- package/dist/languages/tree-sitter/parser.js +2 -0
- package/dist/languages/tree-sitter/parser.js.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +61 -10
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/ledger.d.ts +128 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +345 -0
- package/dist/ledger.js.map +1 -0
- package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
- package/dist/mcp-tools/projectTasks.js +9 -14
- package/dist/mcp-tools/projectTasks.js.map +1 -1
- package/dist/mcp.js +0 -0
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +3 -0
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
- package/dist/reporting/csvReportGenerator.js +7 -1
- package/dist/reporting/csvReportGenerator.js.map +1 -1
- package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
- package/dist/reporting/htmlReportGenerator.js +5 -1
- package/dist/reporting/htmlReportGenerator.js.map +1 -1
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.js +10 -2
- package/dist/reporting/jsonReportGenerator.js.map +1 -1
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
- package/dist/reporting/sarifReportGenerator.js +17 -17
- package/dist/reporting/sarifReportGenerator.js.map +1 -1
- package/dist/scripts/runBench.d.ts +94 -0
- package/dist/scripts/runBench.d.ts.map +1 -0
- package/dist/scripts/runBench.js +1559 -0
- package/dist/scripts/runBench.js.map +1 -0
- package/dist/search/QueryParser.d.ts.map +1 -1
- package/dist/search/QueryParser.js +51 -4
- package/dist/search/QueryParser.js.map +1 -1
- package/dist/services/CodeMapGenerator.d.ts +33 -0
- package/dist/services/CodeMapGenerator.d.ts.map +1 -1
- package/dist/services/CodeMapGenerator.js +404 -0
- package/dist/services/CodeMapGenerator.js.map +1 -1
- package/dist/styles/normalizer.d.ts +37 -0
- package/dist/styles/normalizer.d.ts.map +1 -0
- package/dist/styles/normalizer.js +301 -0
- package/dist/styles/normalizer.js.map +1 -0
- package/dist/styles/styleExtractor.d.ts +38 -0
- package/dist/styles/styleExtractor.d.ts.map +1 -0
- package/dist/styles/styleExtractor.js +630 -0
- package/dist/styles/styleExtractor.js.map +1 -0
- package/dist/styles/styleIndexer.d.ts +35 -0
- package/dist/styles/styleIndexer.d.ts.map +1 -0
- package/dist/styles/styleIndexer.js +266 -0
- package/dist/styles/styleIndexer.js.map +1 -0
- package/dist/styles/tailwindConfigLoader.d.ts +38 -0
- package/dist/styles/tailwindConfigLoader.d.ts.map +1 -0
- package/dist/styles/tailwindConfigLoader.js +374 -0
- package/dist/styles/tailwindConfigLoader.js.map +1 -0
- package/dist/styles/tailwindExpander.d.ts +38 -0
- package/dist/styles/tailwindExpander.d.ts.map +1 -0
- package/dist/styles/tailwindExpander.js +637 -0
- package/dist/styles/tailwindExpander.js.map +1 -0
- package/dist/styles/types.d.ts +92 -0
- package/dist/styles/types.d.ts.map +1 -0
- package/dist/styles/types.js +10 -0
- package/dist/styles/types.js.map +1 -0
- package/dist/symbols.d.ts +21 -0
- package/dist/symbols.d.ts.map +1 -0
- package/dist/symbols.js +31 -0
- package/dist/symbols.js.map +1 -0
- package/dist/types.d.ts +326 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +9 -5
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/scripts/hook-audit.sh +5 -1
- package/plugin/skills/code-auditor/SKILL.md +51 -0
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts +0 -21
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js +0 -21
- package/dist/analyzers/__tests__/fixtures/spec-17/anonymous-callback-map.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js +0 -12
- package/dist/analyzers/__tests__/fixtures/spec-17/barrel-test-migration.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js +0 -22
- package/dist/analyzers/__tests__/fixtures/spec-17/direct-access-allow-config.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts +0 -9
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/exported-undocumented.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/for-loop-query.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js +0 -16
- package/dist/analyzers/__tests__/fixtures/spec-17/import-node-builtin.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts +0 -14
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/jsx-event-handler.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js +0 -22
- package/dist/analyzers/__tests__/fixtures/spec-17/nested-loops-query.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js +0 -20
- package/dist/analyzers/__tests__/fixtures/spec-17/nine-line-repeated.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js +0 -28
- package/dist/analyzers/__tests__/fixtures/spec-17/private-methods.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js +0 -31
- package/dist/analyzers/__tests__/fixtures/spec-17/scope-all-config.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js +0 -18
- package/dist/analyzers/__tests__/fixtures/spec-17/sql-tagged-template.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts +0 -13
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js +0 -61
- package/dist/analyzers/__tests__/fixtures/spec-17/structural-similar-methods.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js +0 -15
- package/dist/analyzers/__tests__/fixtures/spec-17/template-prefix-table.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts +0 -11
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js +0 -49
- package/dist/analyzers/__tests__/fixtures/spec-17/token-identical-20-lines.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js +0 -19
- package/dist/analyzers/__tests__/fixtures/spec-17/tsx-no-db-usage.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts +0 -37
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js +0 -73
- package/dist/analyzers/__tests__/fixtures/spec-17/twenty-methods-vs-complex.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts +0 -12
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js +0 -82
- package/dist/analyzers/__tests__/fixtures/spec-17/unique-method-74-lines.js.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts +0 -10
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.d.ts.map +0 -1
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js +0 -15
- package/dist/analyzers/__tests__/fixtures/spec-17/word-the-in-comment.js.map +0 -1
- package/dist/analyzers/dataAccessAnalyzer.d.ts +0 -46
- package/dist/analyzers/dataAccessAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/dataAccessAnalyzer.js +0 -474
- package/dist/analyzers/dataAccessAnalyzer.js.map +0 -1
- package/dist/analyzers/dryAnalyzer.d.ts +0 -31
- package/dist/analyzers/dryAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/dryAnalyzer.js +0 -734
- package/dist/analyzers/dryAnalyzer.js.map +0 -1
- package/dist/analyzers/schemaAnalyzer.d.ts +0 -23
- package/dist/analyzers/schemaAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/schemaAnalyzer.js +0 -564
- package/dist/analyzers/schemaAnalyzer.js.map +0 -1
- package/dist/analyzers/solidAnalyzer.d.ts +0 -33
- package/dist/analyzers/solidAnalyzer.d.ts.map +0 -1
- package/dist/analyzers/solidAnalyzer.js +0 -847
- package/dist/analyzers/solidAnalyzer.js.map +0 -1
|
@@ -0,0 +1,611 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Domain Analyzer — Spec 15.
|
|
3
|
+
*
|
|
4
|
+
* Post-analysis analyzer that queries the SQLite database for cross-domain
|
|
5
|
+
* findings no single per-file analyzer can produce:
|
|
6
|
+
*
|
|
7
|
+
* R1 — Schema Lifecycle:
|
|
8
|
+
* cross-domain/written-never-read — Table written but never read
|
|
9
|
+
* cross-domain/read-never-written — Table read but never written
|
|
10
|
+
* cross-domain/transaction-boundary — Function writes to too many tables
|
|
11
|
+
*
|
|
12
|
+
* R3 — Validation Bypass (future):
|
|
13
|
+
* cross-domain/validation-bypass — Writer doesn't reach a validator
|
|
14
|
+
*
|
|
15
|
+
* R4 — Coverage by Importance:
|
|
16
|
+
* cross-domain/uncovered-risk — Top-risk function with no test coverage
|
|
17
|
+
*
|
|
18
|
+
* All findings enter at suggestion severity per the entry rule.
|
|
19
|
+
* Higher tiers require Spec 11 R5 recalibration bars (precision ≥ 0.95
|
|
20
|
+
* AND judged-true ≥ 0.90) on real-corpus evidence.
|
|
21
|
+
*/
|
|
22
|
+
import * as path from 'node:path';
|
|
23
|
+
import { UniversalAnalyzer } from '../../languages/UniversalAnalyzer.js';
|
|
24
|
+
import { CodeIndexDB } from '../../codeIndexDB.js';
|
|
25
|
+
import { VALIDATOR_PACKAGES } from '../provenance.js';
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Analyzer
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
export class CrossDomainAnalyzer extends UniversalAnalyzer {
|
|
30
|
+
name = 'cross-domain';
|
|
31
|
+
description = 'Detects cross-domain issues (schema lifecycle, validation bypass, coverage gaps)';
|
|
32
|
+
category = 'architecture';
|
|
33
|
+
/**
|
|
34
|
+
* Full override: query the code index DB for cross-domain findings.
|
|
35
|
+
* The base-class per-file AST loop is bypassed — all detection is
|
|
36
|
+
* post-analysis across the indexed data.
|
|
37
|
+
*/
|
|
38
|
+
async analyze(files, config = {}, options = {}) {
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
const violations = [];
|
|
41
|
+
let rawDb = null;
|
|
42
|
+
try {
|
|
43
|
+
const db = CodeIndexDB.getInstance();
|
|
44
|
+
await db.initialize();
|
|
45
|
+
rawDb = db.rawDb;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return {
|
|
49
|
+
violations: [],
|
|
50
|
+
errors: [{ file: '', error: 'Failed to open code index database' }],
|
|
51
|
+
filesProcessed: 0,
|
|
52
|
+
executionTime: Date.now() - startTime,
|
|
53
|
+
metrics: { filesAnalyzed: 0, totalViolations: 0, executionTime: Date.now() - startTime },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (!rawDb) {
|
|
57
|
+
return {
|
|
58
|
+
violations: [],
|
|
59
|
+
errors: [],
|
|
60
|
+
filesProcessed: 0,
|
|
61
|
+
executionTime: Date.now() - startTime,
|
|
62
|
+
metrics: { filesAnalyzed: 0, totalViolations: 0, executionTime: Date.now() - startTime },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Project root scoping: in test environments the in-memory DB singleton
|
|
66
|
+
// is shared across tests, so schema_usage entries from previous test
|
|
67
|
+
// cases leak into subsequent queries. Filter to the current project root.
|
|
68
|
+
const projectRoot = config.projectRoot;
|
|
69
|
+
const filePathClause = projectRoot
|
|
70
|
+
? { prefix: projectRoot, clause: 'AND file_path LIKE ?', param: `${projectRoot}%` }
|
|
71
|
+
: undefined;
|
|
72
|
+
// R1 — Schema lifecycle detectors
|
|
73
|
+
const lifecycle = config.schemaLifecycle ?? {};
|
|
74
|
+
if (lifecycle.enableWrittenNeverRead !== false) {
|
|
75
|
+
violations.push(...this.detectWrittenNeverRead(rawDb, filePathClause));
|
|
76
|
+
}
|
|
77
|
+
if (lifecycle.enableReadNeverWritten !== false) {
|
|
78
|
+
violations.push(...this.detectReadNeverWritten(rawDb, filePathClause));
|
|
79
|
+
}
|
|
80
|
+
if (lifecycle.enableTransactionBoundaryRisk !== false) {
|
|
81
|
+
const txnTableMax = lifecycle.txnTableMax ?? 4;
|
|
82
|
+
violations.push(...this.detectTransactionBoundaryRisk(rawDb, txnTableMax, filePathClause));
|
|
83
|
+
}
|
|
84
|
+
// R3 — Validation-bypass detection
|
|
85
|
+
const bypass = config.validatorBypass;
|
|
86
|
+
if (bypass) {
|
|
87
|
+
violations.push(...this.detectValidationBypass(rawDb, bypass, filePathClause));
|
|
88
|
+
}
|
|
89
|
+
// R4 — Coverage by importance
|
|
90
|
+
const coverage = config.coverage;
|
|
91
|
+
if (coverage) {
|
|
92
|
+
violations.push(...this.detectUncoveredRisk(rawDb, coverage, filePathClause));
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
violations,
|
|
96
|
+
errors: [],
|
|
97
|
+
filesProcessed: files.length,
|
|
98
|
+
executionTime: Date.now() - startTime,
|
|
99
|
+
metrics: {
|
|
100
|
+
filesAnalyzed: files.length,
|
|
101
|
+
totalViolations: violations.length,
|
|
102
|
+
executionTime: Date.now() - startTime,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** No-op — all detection is DB-based. */
|
|
107
|
+
async analyzeAST() {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
// ── R1: Written-Never-Read ──────────────────────────────────────────────
|
|
111
|
+
/**
|
|
112
|
+
* Detect tables that are written to (INSERT/UPDATE/DELETE/CREATE) but
|
|
113
|
+
* never read from (SELECT). These might be dead writes or missed read paths.
|
|
114
|
+
*/
|
|
115
|
+
detectWrittenNeverRead(rawDb, filePath) {
|
|
116
|
+
const violations = [];
|
|
117
|
+
const fpWhere = filePath ? filePath.clause : '';
|
|
118
|
+
const rows = rawDb
|
|
119
|
+
.prepare(`SELECT DISTINCT table_name, file_path, function_name, line, usage_type
|
|
120
|
+
FROM schema_usage
|
|
121
|
+
WHERE usage_type IN ('insert', 'update', 'delete', 'create')
|
|
122
|
+
${fpWhere}
|
|
123
|
+
AND table_name NOT IN (
|
|
124
|
+
SELECT DISTINCT table_name FROM schema_usage WHERE usage_type = 'select' ${fpWhere}
|
|
125
|
+
)
|
|
126
|
+
ORDER BY table_name, file_path`)
|
|
127
|
+
.all(...(filePath ? [filePath.param, filePath.param] : []));
|
|
128
|
+
// Deduplicate by table_name — one violation per table, anchored to
|
|
129
|
+
// the first writing file encountered.
|
|
130
|
+
const seen = new Set();
|
|
131
|
+
for (const row of rows) {
|
|
132
|
+
if (seen.has(row.table_name))
|
|
133
|
+
continue;
|
|
134
|
+
seen.add(row.table_name);
|
|
135
|
+
violations.push({
|
|
136
|
+
file: row.file_path,
|
|
137
|
+
line: row.line,
|
|
138
|
+
column: 0,
|
|
139
|
+
severity: 'suggestion',
|
|
140
|
+
message: `Table '${row.table_name}' is written (${row.usage_type}) but never read (SELECT). Consider removing unused writes or adding read paths.`,
|
|
141
|
+
rule: 'cross-domain/written-never-read',
|
|
142
|
+
analyzer: this.name,
|
|
143
|
+
functionName: row.function_name,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
return violations;
|
|
147
|
+
}
|
|
148
|
+
// ── R1: Read-Never-Written ──────────────────────────────────────────────
|
|
149
|
+
/**
|
|
150
|
+
* Detect tables that are read from (SELECT) but never written to
|
|
151
|
+
* (INSERT/UPDATE/DELETE/CREATE). These may be external/managed tables
|
|
152
|
+
* or indicate missing write coverage.
|
|
153
|
+
*/
|
|
154
|
+
detectReadNeverWritten(rawDb, filePath) {
|
|
155
|
+
const violations = [];
|
|
156
|
+
const fpWhere = filePath ? filePath.clause : '';
|
|
157
|
+
const rows = rawDb
|
|
158
|
+
.prepare(`SELECT DISTINCT table_name, file_path, function_name, line, usage_type
|
|
159
|
+
FROM schema_usage
|
|
160
|
+
WHERE usage_type = 'select'
|
|
161
|
+
${fpWhere}
|
|
162
|
+
AND table_name NOT IN (
|
|
163
|
+
SELECT DISTINCT table_name FROM schema_usage
|
|
164
|
+
WHERE usage_type IN ('insert', 'update', 'delete', 'create') ${fpWhere}
|
|
165
|
+
)
|
|
166
|
+
ORDER BY table_name, file_path`)
|
|
167
|
+
.all(...(filePath ? [filePath.param, filePath.param] : []));
|
|
168
|
+
const seen = new Set();
|
|
169
|
+
for (const row of rows) {
|
|
170
|
+
if (seen.has(row.table_name))
|
|
171
|
+
continue;
|
|
172
|
+
seen.add(row.table_name);
|
|
173
|
+
violations.push({
|
|
174
|
+
file: row.file_path,
|
|
175
|
+
line: row.line,
|
|
176
|
+
column: 0,
|
|
177
|
+
severity: 'suggestion',
|
|
178
|
+
message: `Table '${row.table_name}' is read (SELECT) but never written (INSERT/UPDATE/DELETE). This may be an external/managed table, or indicate missing write coverage.`,
|
|
179
|
+
rule: 'cross-domain/read-never-written',
|
|
180
|
+
analyzer: this.name,
|
|
181
|
+
functionName: row.function_name,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return violations;
|
|
185
|
+
}
|
|
186
|
+
// ── R1: Transaction-Boundary Risk ───────────────────────────────────────
|
|
187
|
+
/**
|
|
188
|
+
* Detect functions that write to ≥ txnTableMax distinct tables, including
|
|
189
|
+
* tables written by depth-1 callees via the call graph (graph_cache).
|
|
190
|
+
*
|
|
191
|
+
* This surfaces functions that may have transaction-boundary risk:
|
|
192
|
+
* writing to too many tables in a single logical operation can lead to
|
|
193
|
+
* long-running transactions, lock contention, and partial-failure complexity.
|
|
194
|
+
*/
|
|
195
|
+
detectTransactionBoundaryRisk(rawDb, txnTableMax, filePath) {
|
|
196
|
+
const violations = [];
|
|
197
|
+
const fpSu = filePath ? `su.${filePath.clause.slice(4)}` : ''; // "AND file_path LIKE ?" → "AND su.file_path LIKE ?"
|
|
198
|
+
const fpSuClause = filePath ? `AND su.file_path LIKE ?` : '';
|
|
199
|
+
// Find all functions that perform writes, joined to functions table for
|
|
200
|
+
// the function ID needed by graph_cache lookups.
|
|
201
|
+
const writerRows = rawDb
|
|
202
|
+
.prepare(`SELECT DISTINCT su.function_name, su.file_path, su.table_name, su.line,
|
|
203
|
+
f.id as function_id
|
|
204
|
+
FROM schema_usage su
|
|
205
|
+
JOIN functions f ON f.name = su.function_name
|
|
206
|
+
AND f.file_path = su.file_path
|
|
207
|
+
WHERE su.usage_type IN ('insert', 'update', 'delete', 'create')
|
|
208
|
+
${fpSuClause}
|
|
209
|
+
ORDER BY su.function_name, su.file_path`)
|
|
210
|
+
.all(...(filePath ? [filePath.param] : []));
|
|
211
|
+
if (writerRows.length === 0)
|
|
212
|
+
return violations;
|
|
213
|
+
const funcWrites = new Map();
|
|
214
|
+
for (const row of writerRows) {
|
|
215
|
+
const key = `${row.file_path}::${row.function_name}`;
|
|
216
|
+
const entry = funcWrites.get(key);
|
|
217
|
+
if (entry) {
|
|
218
|
+
entry.tables.add(row.table_name);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
funcWrites.set(key, {
|
|
222
|
+
filePath: row.file_path,
|
|
223
|
+
line: row.line,
|
|
224
|
+
functionId: row.function_id,
|
|
225
|
+
tables: new Set([row.table_name]),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// For each writing function, expand to depth-1 callees via graph_cache
|
|
230
|
+
// and union their written tables.
|
|
231
|
+
for (const [key, funcData] of funcWrites) {
|
|
232
|
+
const allTables = new Set(funcData.tables);
|
|
233
|
+
// Depth-1 callees: graph_cache stores node_key=caller_function_id,
|
|
234
|
+
// neighbor_key=callee_function_id for graph_type='call'.
|
|
235
|
+
const calleeRows = rawDb
|
|
236
|
+
.prepare(`SELECT neighbor_key FROM graph_cache
|
|
237
|
+
WHERE graph_type = 'call' AND node_key = ?`)
|
|
238
|
+
.all(String(funcData.functionId));
|
|
239
|
+
for (const callee of calleeRows) {
|
|
240
|
+
// Get callee function details and their written tables
|
|
241
|
+
const calleeFuncs = rawDb
|
|
242
|
+
.prepare(`SELECT name, file_path FROM functions WHERE id = ?`)
|
|
243
|
+
.all(parseInt(callee.neighbor_key, 10));
|
|
244
|
+
for (const cf of calleeFuncs) {
|
|
245
|
+
const calleeTables = rawDb
|
|
246
|
+
.prepare(`SELECT DISTINCT table_name FROM schema_usage
|
|
247
|
+
WHERE usage_type IN ('insert', 'update', 'delete', 'create')
|
|
248
|
+
AND function_name = ? AND file_path = ?`)
|
|
249
|
+
.all(cf.name, cf.file_path);
|
|
250
|
+
for (const ct of calleeTables) {
|
|
251
|
+
allTables.add(ct.table_name);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (allTables.size >= txnTableMax) {
|
|
256
|
+
const tableList = [...allTables].sort().join(', ');
|
|
257
|
+
violations.push({
|
|
258
|
+
file: funcData.filePath,
|
|
259
|
+
line: funcData.line,
|
|
260
|
+
column: 0,
|
|
261
|
+
severity: 'suggestion',
|
|
262
|
+
message: `Function writes to ${allTables.size} distinct tables (threshold: ${txnTableMax}): ${tableList}. This may indicate transaction-boundary risk — consider splitting writes across smaller transactional scopes.`,
|
|
263
|
+
rule: 'cross-domain/transaction-boundary',
|
|
264
|
+
analyzer: this.name,
|
|
265
|
+
functionName: key.split('::')[1],
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return violations;
|
|
270
|
+
}
|
|
271
|
+
// ── R3: Validation-Bypass ────────────────────────────────────────────────
|
|
272
|
+
/**
|
|
273
|
+
* Detect write functions that don't reach a validator, when a majority of
|
|
274
|
+
* peer writers in the same directory do (BFS ≤ configurable depth).
|
|
275
|
+
*
|
|
276
|
+
* Validator identification (priority order):
|
|
277
|
+
* 1. User-configured validators list
|
|
278
|
+
* 2. Provenanced: exported functions in files importing VALIDATOR_PACKAGES
|
|
279
|
+
* 3. Heuristic fallback: name GLOB 'validate*' OR 'assert*' (when both
|
|
280
|
+
* above are silent)
|
|
281
|
+
*/
|
|
282
|
+
detectValidationBypass(rawDb, config, filePath) {
|
|
283
|
+
const violations = [];
|
|
284
|
+
const { validators: userValidators = [], modeShare = 0.8, minCorpus = 20, depth = 3, } = config;
|
|
285
|
+
// ── 1. Build the validator function ID set ─────────────────────────────
|
|
286
|
+
const validatorIds = new Set();
|
|
287
|
+
// 1a. User-configured validators (format: "funcName" or "path#funcName")
|
|
288
|
+
for (const v of userValidators) {
|
|
289
|
+
const hashIdx = v.indexOf('#');
|
|
290
|
+
if (hashIdx >= 0) {
|
|
291
|
+
const vPath = v.substring(0, hashIdx);
|
|
292
|
+
const vName = v.substring(hashIdx + 1);
|
|
293
|
+
const rows = rawDb
|
|
294
|
+
.prepare('SELECT id FROM functions WHERE name = ? AND file_path = ?')
|
|
295
|
+
.all(vName, vPath);
|
|
296
|
+
for (const r of rows)
|
|
297
|
+
validatorIds.add(r.id);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
const rows = rawDb
|
|
301
|
+
.prepare('SELECT id FROM functions WHERE name = ?')
|
|
302
|
+
.all(v);
|
|
303
|
+
for (const r of rows)
|
|
304
|
+
validatorIds.add(r.id);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// 1b. Provenanced validators: exported functions whose OWN used_imports
|
|
308
|
+
// includes a validator package. Per-identifier check — a function in
|
|
309
|
+
// a zod-importing file only qualifies if its own body uses the
|
|
310
|
+
// validator package, not just because it cohabits the file.
|
|
311
|
+
if (validatorIds.size === 0) {
|
|
312
|
+
const likeClauses = [...VALIDATOR_PACKAGES].map(() => 'used_imports LIKE ?');
|
|
313
|
+
const likeParams = [...VALIDATOR_PACKAGES].map((pkg) => `%"${pkg}"%`);
|
|
314
|
+
const validatorFuncs = rawDb
|
|
315
|
+
.prepare(`SELECT id FROM functions
|
|
316
|
+
WHERE used_imports IS NOT NULL
|
|
317
|
+
AND (${likeClauses.join(' OR ')})
|
|
318
|
+
AND is_exported = 1`)
|
|
319
|
+
.all(...likeParams);
|
|
320
|
+
for (const f of validatorFuncs)
|
|
321
|
+
validatorIds.add(f.id);
|
|
322
|
+
}
|
|
323
|
+
// 1c. Heuristic fallback: name-based matching (only when provenance
|
|
324
|
+
// found nothing AND no user-configured validators exist).
|
|
325
|
+
if (validatorIds.size === 0 && userValidators.length === 0) {
|
|
326
|
+
const heuristicFuncs = rawDb
|
|
327
|
+
.prepare(`SELECT id FROM functions
|
|
328
|
+
WHERE (name GLOB 'validate*' OR name GLOB 'assert*')
|
|
329
|
+
AND is_exported = 1`)
|
|
330
|
+
.all();
|
|
331
|
+
for (const f of heuristicFuncs)
|
|
332
|
+
validatorIds.add(f.id);
|
|
333
|
+
}
|
|
334
|
+
if (validatorIds.size === 0)
|
|
335
|
+
return violations;
|
|
336
|
+
// ── 2. Find all writer functions from schema_usage ─────────────────────
|
|
337
|
+
const fpAliasWhere = filePath
|
|
338
|
+
? `AND su.${filePath.clause.slice(4)}`
|
|
339
|
+
: '';
|
|
340
|
+
const writers = rawDb
|
|
341
|
+
.prepare(`SELECT DISTINCT su.function_name, su.file_path, su.line, f.id as function_id
|
|
342
|
+
FROM schema_usage su
|
|
343
|
+
JOIN functions f ON f.name = su.function_name
|
|
344
|
+
AND f.file_path = su.file_path
|
|
345
|
+
WHERE su.usage_type IN ('insert', 'update', 'delete', 'create')
|
|
346
|
+
${fpAliasWhere}
|
|
347
|
+
ORDER BY su.file_path, su.function_name`)
|
|
348
|
+
.all(...(filePath ? [filePath.param] : []));
|
|
349
|
+
if (writers.length === 0)
|
|
350
|
+
return violations;
|
|
351
|
+
const writerCoverage = new Map();
|
|
352
|
+
for (const w of writers) {
|
|
353
|
+
const key = `${w.file_path}::${w.function_name}`;
|
|
354
|
+
if (writerCoverage.has(key))
|
|
355
|
+
continue; // deduplicate
|
|
356
|
+
const covered = this.bfsReachesValidator(rawDb, w.function_id, validatorIds, depth);
|
|
357
|
+
writerCoverage.set(key, {
|
|
358
|
+
covered,
|
|
359
|
+
line: w.line,
|
|
360
|
+
funcName: w.function_name,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
const dirWriters = new Map();
|
|
364
|
+
const dirSeen = new Set(); // deduplicate writers with multiple schema_usage rows
|
|
365
|
+
for (const w of writers) {
|
|
366
|
+
const dir = path.dirname(w.file_path);
|
|
367
|
+
const key = `${w.file_path}::${w.function_name}`;
|
|
368
|
+
const dirKey = `${dir}::${key}`;
|
|
369
|
+
if (dirSeen.has(dirKey))
|
|
370
|
+
continue;
|
|
371
|
+
dirSeen.add(dirKey);
|
|
372
|
+
const cov = writerCoverage.get(key);
|
|
373
|
+
if (!cov)
|
|
374
|
+
continue;
|
|
375
|
+
if (!dirWriters.has(dir))
|
|
376
|
+
dirWriters.set(dir, []);
|
|
377
|
+
dirWriters.get(dir).push({
|
|
378
|
+
key,
|
|
379
|
+
covered: cov.covered,
|
|
380
|
+
line: cov.line,
|
|
381
|
+
funcName: cov.funcName,
|
|
382
|
+
filePath: w.file_path,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
// ── 5. Flag uncovered writers in validator-dense directories ───────────
|
|
386
|
+
for (const [dir, dirWriterList] of dirWriters) {
|
|
387
|
+
if (dirWriterList.length < minCorpus)
|
|
388
|
+
continue;
|
|
389
|
+
const coveredCount = dirWriterList.filter((w) => w.covered).length;
|
|
390
|
+
const ratio = coveredCount / dirWriterList.length;
|
|
391
|
+
if (ratio >= modeShare) {
|
|
392
|
+
for (const w of dirWriterList) {
|
|
393
|
+
if (w.covered)
|
|
394
|
+
continue;
|
|
395
|
+
violations.push({
|
|
396
|
+
file: w.filePath,
|
|
397
|
+
line: w.line,
|
|
398
|
+
column: 0,
|
|
399
|
+
severity: 'suggestion',
|
|
400
|
+
message: `Function '${w.funcName}' is not validated. ` +
|
|
401
|
+
`${coveredCount}/${dirWriterList.length} peer writers in '${dir}' ` +
|
|
402
|
+
`reach a validator but this function does not (BFS depth ≤ ${depth}). ` +
|
|
403
|
+
`Consider adding input validation.`,
|
|
404
|
+
rule: 'cross-domain/validation-bypass',
|
|
405
|
+
analyzer: this.name,
|
|
406
|
+
functionName: w.funcName,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return violations;
|
|
412
|
+
}
|
|
413
|
+
// ── R4: Coverage by Importance ──────────────────────────────────────────
|
|
414
|
+
/**
|
|
415
|
+
* Detect exported, high-risk functions with no test coverage.
|
|
416
|
+
* Uses the getUntestedTopDecile() query that joins functions with
|
|
417
|
+
* hotspot_scores and coverage_data to find untested high-risk functions.
|
|
418
|
+
*
|
|
419
|
+
* Static-reach fallback: when no measured coverage exists, falls back
|
|
420
|
+
* to static reach analysis from test files (BFS from test-file functions
|
|
421
|
+
* into the call graph).
|
|
422
|
+
*/
|
|
423
|
+
detectUncoveredRisk(rawDb, coverage, filePath) {
|
|
424
|
+
const violations = [];
|
|
425
|
+
const db = CodeIndexDB.getInstance();
|
|
426
|
+
const topRiskDecile = coverage.topRiskDecile ?? 0.1;
|
|
427
|
+
// Check if any measured coverage exists
|
|
428
|
+
const measuredCount = rawDb
|
|
429
|
+
.prepare("SELECT COUNT(*) AS cnt FROM coverage_data WHERE basis = 'measured'")
|
|
430
|
+
.get().cnt;
|
|
431
|
+
if (measuredCount > 0) {
|
|
432
|
+
// Use measured coverage data from lcov/istanbul imports
|
|
433
|
+
const untested = db.getUntestedTopDecile(topRiskDecile);
|
|
434
|
+
// Determine source format from existing coverage entries
|
|
435
|
+
const sourceRow = rawDb
|
|
436
|
+
.prepare("SELECT source, imported_at FROM coverage_data WHERE basis = 'measured' LIMIT 1")
|
|
437
|
+
.get();
|
|
438
|
+
const sourceFormat = sourceRow?.source ?? 'unknown';
|
|
439
|
+
const importedAt = sourceRow?.imported_at ?? null;
|
|
440
|
+
// Stale-import detection: measured coverage predates last full index sync
|
|
441
|
+
let staleWarning = null;
|
|
442
|
+
if (importedAt) {
|
|
443
|
+
const lastSync = db.getMeta?.('last_full_sync_timestamp') ?? null;
|
|
444
|
+
if (lastSync && importedAt < lastSync) {
|
|
445
|
+
staleWarning =
|
|
446
|
+
` — WARNING: this coverage data may be stale (imported ${importedAt}, ` +
|
|
447
|
+
`last index sync was ${lastSync}). ` +
|
|
448
|
+
`Re-import with 'code-audit coverage --import <path>' for accurate results.`;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
for (const fn of untested) {
|
|
452
|
+
violations.push({
|
|
453
|
+
file: fn.filePath,
|
|
454
|
+
line: 0, // Risk-based finding; no single line anchors this
|
|
455
|
+
column: 0,
|
|
456
|
+
severity: 'suggestion',
|
|
457
|
+
message: `Exported function '${fn.functionName}' (risk ${fn.riskScore.toFixed(3)}) has no measured test coverage. ` +
|
|
458
|
+
`Top imported functions should have test coverage. Import coverage data with 'code-audit coverage --import <path>'.` +
|
|
459
|
+
(staleWarning ?? ''),
|
|
460
|
+
rule: 'cross-domain/uncovered-risk',
|
|
461
|
+
analyzer: this.name,
|
|
462
|
+
functionName: fn.functionName,
|
|
463
|
+
basis: fn.basis,
|
|
464
|
+
sourceFormat,
|
|
465
|
+
...(staleWarning ? { staleImport: true } : {}),
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
// Static-reach fallback: use the call graph to determine which
|
|
471
|
+
// exported high-risk functions are reachable from test files
|
|
472
|
+
const fpWhere = filePath ? 'AND f.file_path LIKE ?' : '';
|
|
473
|
+
const params = [topRiskDecile];
|
|
474
|
+
if (filePath)
|
|
475
|
+
params.push(filePath.param);
|
|
476
|
+
const highRiskFns = rawDb
|
|
477
|
+
.prepare(`WITH ranked AS (
|
|
478
|
+
SELECT
|
|
479
|
+
f.name,
|
|
480
|
+
f.file_path,
|
|
481
|
+
f.line_number,
|
|
482
|
+
f.id,
|
|
483
|
+
COALESCE(hs.score, 0.0) as risk_score,
|
|
484
|
+
PERCENT_RANK() OVER (ORDER BY COALESCE(hs.score, 0.0) DESC) as pct
|
|
485
|
+
FROM functions f
|
|
486
|
+
LEFT JOIN hotspot_scores hs ON hs.target = (f.file_path || ':' || f.name)
|
|
487
|
+
AND hs.type = 'function'
|
|
488
|
+
WHERE f.is_exported = 1
|
|
489
|
+
${fpWhere}
|
|
490
|
+
)
|
|
491
|
+
SELECT id, name, file_path, line_number, risk_score
|
|
492
|
+
FROM ranked
|
|
493
|
+
WHERE pct <= ?
|
|
494
|
+
ORDER BY risk_score DESC`)
|
|
495
|
+
.all(...params);
|
|
496
|
+
if (highRiskFns.length === 0)
|
|
497
|
+
return violations;
|
|
498
|
+
// Find test-file functions to use as BFS starting points.
|
|
499
|
+
const testGlobs = coverage.testGlobs ?? ['**/*.test.*', '**/*.spec.*', '**/__tests__/**'];
|
|
500
|
+
const testGlobPatterns = testGlobs.map((g) => g.replace(/\*\*/g, '%').replace(/\*/g, '%'));
|
|
501
|
+
let testFileClause = '';
|
|
502
|
+
const testFileParams = [];
|
|
503
|
+
if (testGlobPatterns.length > 0) {
|
|
504
|
+
testFileClause = testGlobPatterns
|
|
505
|
+
.map((_p, i) => `file_path LIKE ?`)
|
|
506
|
+
.join(' OR ');
|
|
507
|
+
for (const p of testGlobPatterns)
|
|
508
|
+
testFileParams.push(p);
|
|
509
|
+
}
|
|
510
|
+
const testFuncIds = new Set();
|
|
511
|
+
if (testFileClause) {
|
|
512
|
+
const testFunctions = rawDb
|
|
513
|
+
.prepare(`SELECT id FROM functions WHERE ${testFileClause}`)
|
|
514
|
+
.all(...testFileParams);
|
|
515
|
+
for (const tf of testFunctions)
|
|
516
|
+
testFuncIds.add(tf.id);
|
|
517
|
+
}
|
|
518
|
+
// BFS from each test-file function through call graph (reverse: test
|
|
519
|
+
// calls code under test). We traverse the call edges: if testFunc → X,
|
|
520
|
+
// then X is reachable.
|
|
521
|
+
const reachableIds = new Set();
|
|
522
|
+
const maxDepth = coverage.staticReachDepth ?? 2;
|
|
523
|
+
if (testFuncIds.size > 0) {
|
|
524
|
+
for (const startId of testFuncIds) {
|
|
525
|
+
const visited = new Set();
|
|
526
|
+
let currentLevel = [startId];
|
|
527
|
+
for (let d = 0; d < maxDepth; d++) {
|
|
528
|
+
const nextLevel = [];
|
|
529
|
+
for (const funcId of currentLevel) {
|
|
530
|
+
if (visited.has(funcId))
|
|
531
|
+
continue;
|
|
532
|
+
visited.add(funcId);
|
|
533
|
+
reachableIds.add(funcId);
|
|
534
|
+
const callees = rawDb
|
|
535
|
+
.prepare(`SELECT neighbor_key FROM graph_cache
|
|
536
|
+
WHERE graph_type = 'call' AND node_key = ?`)
|
|
537
|
+
.all(String(funcId));
|
|
538
|
+
for (const callee of callees) {
|
|
539
|
+
const calleeId = parseInt(callee.neighbor_key, 10);
|
|
540
|
+
if (!isNaN(calleeId) && !visited.has(calleeId)) {
|
|
541
|
+
nextLevel.push(calleeId);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
currentLevel = nextLevel;
|
|
546
|
+
}
|
|
547
|
+
// Check last level
|
|
548
|
+
for (const funcId of currentLevel) {
|
|
549
|
+
if (!reachableIds.has(funcId))
|
|
550
|
+
reachableIds.add(funcId);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
// Flag high-risk functions not in the reachable set
|
|
555
|
+
for (const fn of highRiskFns) {
|
|
556
|
+
if (!reachableIds.has(fn.id)) {
|
|
557
|
+
violations.push({
|
|
558
|
+
file: fn.file_path,
|
|
559
|
+
line: fn.line_number,
|
|
560
|
+
column: 0,
|
|
561
|
+
severity: 'suggestion',
|
|
562
|
+
message: `Exported function '${fn.name}' (risk ${fn.risk_score.toFixed(3)}) is not reachable from known test files. ` +
|
|
563
|
+
`Add test coverage or import measured coverage with 'code-audit coverage --import <path>'.`,
|
|
564
|
+
rule: 'cross-domain/uncovered-risk',
|
|
565
|
+
analyzer: this.name,
|
|
566
|
+
functionName: fn.name,
|
|
567
|
+
basis: 'static-reach',
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
return violations;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* BFS through the call graph (graph_cache) up to maxDepth to check if
|
|
576
|
+
* any path from startFuncId reaches a validator function ID.
|
|
577
|
+
*/
|
|
578
|
+
bfsReachesValidator(rawDb, startFuncId, validatorIds, maxDepth) {
|
|
579
|
+
const visited = new Set();
|
|
580
|
+
let currentLevel = [startFuncId];
|
|
581
|
+
for (let d = 0; d < maxDepth; d++) {
|
|
582
|
+
const nextLevel = [];
|
|
583
|
+
for (const funcId of currentLevel) {
|
|
584
|
+
if (validatorIds.has(funcId))
|
|
585
|
+
return true;
|
|
586
|
+
if (visited.has(funcId))
|
|
587
|
+
continue;
|
|
588
|
+
visited.add(funcId);
|
|
589
|
+
// Get callees from graph_cache call edges
|
|
590
|
+
const callees = rawDb
|
|
591
|
+
.prepare(`SELECT neighbor_key FROM graph_cache
|
|
592
|
+
WHERE graph_type = 'call' AND node_key = ?`)
|
|
593
|
+
.all(String(funcId));
|
|
594
|
+
for (const callee of callees) {
|
|
595
|
+
const calleeId = parseInt(callee.neighbor_key, 10);
|
|
596
|
+
if (!isNaN(calleeId) && !visited.has(calleeId)) {
|
|
597
|
+
nextLevel.push(calleeId);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
currentLevel = nextLevel;
|
|
602
|
+
}
|
|
603
|
+
// Check any remaining nodes at the final level
|
|
604
|
+
for (const funcId of currentLevel) {
|
|
605
|
+
if (validatorIds.has(funcId))
|
|
606
|
+
return true;
|
|
607
|
+
}
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
//# sourceMappingURL=CrossDomainAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossDomainAnalyzer.js","sourceRoot":"","sources":["../../../src/analyzers/crossDomain/CrossDomainAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentationAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/documentationAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAEL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,gBAAgB,EACjB,MAAM,aAAa,CAAC;AA8GrB;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,4BAA4B,EAAE,2BAW1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"documentationAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/documentationAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAEL,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,gBAAgB,EACjB,MAAM,aAAa,CAAC;AA8GrB;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,eAAO,MAAM,4BAA4B,EAAE,2BAW1C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAkQD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,GAAE,OAAO,CAAC,2BAA2B,CAAM,EACjD,OAAO,GAAE,YAAiB,EAC1B,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,cAAc,CAAC,CAiHzB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,kBAKnC,CAAC"}
|