code-auditor-mcp 4.1.1 → 5.0.2
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 +381 -0
- package/README.md +4 -4
- package/configs/hhra-compat.json +0 -8
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts +1 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js +7 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts +2 -8
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js +4 -4
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts +1 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts +2 -2
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.js.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts +1 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts.map +1 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.js.map +1 -1
- package/dist/analyzers/applicability.d.ts +42 -0
- package/dist/analyzers/applicability.d.ts.map +1 -1
- package/dist/analyzers/applicability.js +74 -0
- package/dist/analyzers/applicability.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +18 -24
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +30 -23
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +113 -76
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +2 -0
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +8 -3
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +210 -148
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
- package/dist/analyzers/documentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/documentationAnalyzer.js +23 -28
- package/dist/analyzers/documentationAnalyzer.js.map +1 -1
- package/dist/analyzers/handleIdentification.d.ts +356 -0
- package/dist/analyzers/handleIdentification.d.ts.map +1 -0
- package/dist/analyzers/handleIdentification.js +427 -0
- package/dist/analyzers/handleIdentification.js.map +1 -0
- package/dist/analyzers/manifestStaleness.d.ts +64 -0
- package/dist/analyzers/manifestStaleness.d.ts.map +1 -0
- package/dist/analyzers/manifestStaleness.js +115 -0
- package/dist/analyzers/manifestStaleness.js.map +1 -0
- package/dist/analyzers/orgFilterTiers.d.ts +73 -1
- package/dist/analyzers/orgFilterTiers.d.ts.map +1 -1
- package/dist/analyzers/orgFilterTiers.js +166 -1
- package/dist/analyzers/orgFilterTiers.js.map +1 -1
- package/dist/analyzers/provenance.d.ts +251 -57
- package/dist/analyzers/provenance.d.ts.map +1 -1
- package/dist/analyzers/provenance.js +1109 -429
- package/dist/analyzers/provenance.js.map +1 -1
- package/dist/analyzers/reactAnalyzer.d.ts +2 -0
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +2 -0
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/receiverResolution.d.ts +183 -0
- package/dist/analyzers/receiverResolution.d.ts.map +1 -0
- package/dist/analyzers/receiverResolution.js +540 -0
- package/dist/analyzers/receiverResolution.js.map +1 -0
- package/dist/analyzers/receiverRoot.d.ts +348 -0
- package/dist/analyzers/receiverRoot.d.ts.map +1 -0
- package/dist/analyzers/receiverRoot.js +1032 -0
- package/dist/analyzers/receiverRoot.js.map +1 -0
- package/dist/analyzers/ruleRegistry.d.ts +12 -68
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
- package/dist/analyzers/ruleRegistry.js +32 -342
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/ruleTiming.d.ts +10 -0
- package/dist/analyzers/ruleTiming.d.ts.map +1 -1
- package/dist/analyzers/ruleTiming.js +20 -0
- package/dist/analyzers/ruleTiming.js.map +1 -1
- package/dist/analyzers/sqlLiteral.d.ts +76 -0
- package/dist/analyzers/sqlLiteral.d.ts.map +1 -0
- package/dist/analyzers/sqlLiteral.js +419 -0
- package/dist/analyzers/sqlLiteral.js.map +1 -0
- package/dist/analyzers/tsEcosystem.d.ts +115 -0
- package/dist/analyzers/tsEcosystem.d.ts.map +1 -0
- package/dist/analyzers/tsEcosystem.js +241 -0
- package/dist/analyzers/tsEcosystem.js.map +1 -0
- package/dist/analyzers/tsExpressionDescriptor.d.ts +156 -0
- package/dist/analyzers/tsExpressionDescriptor.d.ts.map +1 -0
- package/dist/analyzers/tsExpressionDescriptor.js +374 -0
- package/dist/analyzers/tsExpressionDescriptor.js.map +1 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts +6 -0
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +107 -44
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +23 -35
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +287 -49
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +2130 -512
- 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 +2 -18
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +0 -33
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +20 -143
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +4 -3
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +36 -13
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSecretsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSecretsAnalyzer.js +6 -0
- package/dist/analyzers/universal/UniversalSecretsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts +15 -0
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.js +25 -0
- package/dist/analyzers/universal/UniversalSecurityAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +21 -32
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +166 -196
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/functionConcerns.d.ts +3 -0
- package/dist/analyzers/universal/functionConcerns.d.ts.map +1 -1
- package/dist/analyzers/universal/functionConcerns.js +4 -1
- package/dist/analyzers/universal/functionConcerns.js.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts +310 -69
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.js +709 -383
- package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
- package/dist/analyzers/universal/schema/config.d.ts +3 -14
- package/dist/analyzers/universal/schema/config.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/config.js +3 -16
- package/dist/analyzers/universal/schema/config.js.map +1 -1
- package/dist/analyzers/universal/schema/discovery.d.ts +22 -1
- package/dist/analyzers/universal/schema/discovery.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/discovery.js +36 -20
- package/dist/analyzers/universal/schema/discovery.js.map +1 -1
- package/dist/analyzers/universal/schema/jsonSchema.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/jsonSchema.js +13 -3
- package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -1
- package/dist/analyzers/universal/schema/migrations.d.ts +187 -27
- package/dist/analyzers/universal/schema/migrations.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/migrations.js +443 -186
- package/dist/analyzers/universal/schema/migrations.js.map +1 -1
- package/dist/analyzers/universal/schema/types.d.ts +17 -3
- package/dist/analyzers/universal/schema/types.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/violations.js +1 -1
- package/dist/analyzers/universal/schema/violations.js.map +1 -1
- package/dist/analyzers/universal/styleScale.d.ts +52 -0
- package/dist/analyzers/universal/styleScale.d.ts.map +1 -0
- package/dist/analyzers/universal/styleScale.js +95 -0
- package/dist/analyzers/universal/styleScale.js.map +1 -0
- package/dist/applyDataDirEnv.js +1 -1
- package/dist/applyDataDirEnv.js.map +1 -1
- package/dist/auditRouter.d.ts +26 -30
- package/dist/auditRouter.d.ts.map +1 -1
- package/dist/auditRouter.js +373 -143
- package/dist/auditRouter.js.map +1 -1
- package/dist/auditRunner.d.ts +66 -1
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +1544 -1034
- package/dist/auditRunner.js.map +1 -1
- package/dist/baseline.d.ts +30 -3
- package/dist/baseline.d.ts.map +1 -1
- package/dist/baseline.js +70 -9
- package/dist/baseline.js.map +1 -1
- package/dist/cli.js +983 -821
- package/dist/cli.js.map +1 -1
- package/dist/codeIndex/analyzerConfig.d.ts +60 -0
- package/dist/codeIndex/analyzerConfig.d.ts.map +1 -0
- package/dist/codeIndex/analyzerConfig.js +98 -0
- package/dist/codeIndex/analyzerConfig.js.map +1 -0
- package/dist/codeIndex/auditResults.d.ts +39 -0
- package/dist/codeIndex/auditResults.d.ts.map +1 -0
- package/dist/codeIndex/auditResults.js +99 -0
- package/dist/codeIndex/auditResults.js.map +1 -0
- package/dist/codeIndex/codeMap.d.ts +59 -0
- package/dist/codeIndex/codeMap.d.ts.map +1 -0
- package/dist/codeIndex/codeMap.js +72 -0
- package/dist/codeIndex/codeMap.js.map +1 -0
- package/dist/codeIndex/conventions.d.ts +33 -0
- package/dist/codeIndex/conventions.d.ts.map +1 -0
- package/dist/codeIndex/conventions.js +84 -0
- package/dist/codeIndex/conventions.js.map +1 -0
- package/dist/codeIndex/coverage.d.ts +78 -0
- package/dist/codeIndex/coverage.d.ts.map +1 -0
- package/dist/codeIndex/coverage.js +164 -0
- package/dist/codeIndex/coverage.js.map +1 -0
- package/dist/codeIndex/dependencyGraph.d.ts +97 -0
- package/dist/codeIndex/dependencyGraph.d.ts.map +1 -0
- package/dist/codeIndex/dependencyGraph.js +241 -0
- package/dist/codeIndex/dependencyGraph.js.map +1 -0
- package/dist/codeIndex/functionIndex.d.ts +111 -0
- package/dist/codeIndex/functionIndex.d.ts.map +1 -0
- package/dist/codeIndex/functionIndex.js +306 -0
- package/dist/codeIndex/functionIndex.js.map +1 -0
- package/dist/codeIndex/inferredReceivers.d.ts +32 -0
- package/dist/codeIndex/inferredReceivers.d.ts.map +1 -0
- package/dist/codeIndex/inferredReceivers.js +41 -0
- package/dist/codeIndex/inferredReceivers.js.map +1 -0
- package/dist/codeIndex/meta.d.ts +30 -0
- package/dist/codeIndex/meta.d.ts.map +1 -0
- package/dist/codeIndex/meta.js +37 -0
- package/dist/codeIndex/meta.js.map +1 -0
- package/dist/codeIndex/migrations.d.ts +96 -0
- package/dist/codeIndex/migrations.d.ts.map +1 -0
- package/dist/codeIndex/migrations.js +1302 -0
- package/dist/codeIndex/migrations.js.map +1 -0
- package/dist/codeIndex/projectTasks.d.ts +54 -0
- package/dist/codeIndex/projectTasks.d.ts.map +1 -0
- package/dist/codeIndex/projectTasks.js +81 -0
- package/dist/codeIndex/projectTasks.js.map +1 -0
- package/dist/codeIndex/provenance.d.ts +47 -0
- package/dist/codeIndex/provenance.d.ts.map +1 -0
- package/dist/codeIndex/provenance.js +48 -0
- package/dist/codeIndex/provenance.js.map +1 -0
- package/dist/codeIndex/rawSql.d.ts +54 -0
- package/dist/codeIndex/rawSql.d.ts.map +1 -0
- package/dist/codeIndex/rawSql.js +71 -0
- package/dist/codeIndex/rawSql.js.map +1 -0
- package/dist/codeIndex/schema.d.ts +99 -0
- package/dist/codeIndex/schema.d.ts.map +1 -0
- package/dist/codeIndex/schema.js +174 -0
- package/dist/codeIndex/schema.js.map +1 -0
- package/dist/codeIndex/search.d.ts +40 -0
- package/dist/codeIndex/search.d.ts.map +1 -0
- package/dist/codeIndex/search.js +316 -0
- package/dist/codeIndex/search.js.map +1 -0
- package/dist/codeIndex/shared.d.ts +27 -0
- package/dist/codeIndex/shared.d.ts.map +1 -0
- package/dist/codeIndex/shared.js +46 -0
- package/dist/codeIndex/shared.js.map +1 -0
- package/dist/codeIndex/sqliteCollection.d.ts +81 -0
- package/dist/codeIndex/sqliteCollection.d.ts.map +1 -0
- package/dist/codeIndex/sqliteCollection.js +250 -0
- package/dist/codeIndex/sqliteCollection.js.map +1 -0
- package/dist/codeIndex/whitelist.d.ts +59 -0
- package/dist/codeIndex/whitelist.d.ts.map +1 -0
- package/dist/codeIndex/whitelist.js +188 -0
- package/dist/codeIndex/whitelist.js.map +1 -0
- package/dist/codeIndexDB.d.ts +132 -271
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +365 -2729
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/codeIndexService.d.ts +87 -12
- package/dist/codeIndexService.d.ts.map +1 -1
- package/dist/codeIndexService.js +110 -34
- package/dist/codeIndexService.js.map +1 -1
- package/dist/componentScanner.d.ts +35 -0
- package/dist/componentScanner.d.ts.map +1 -1
- package/dist/componentScanner.js +114 -80
- package/dist/componentScanner.js.map +1 -1
- package/dist/config/configGeneratePath.d.ts +4 -0
- package/dist/config/configGeneratePath.d.ts.map +1 -1
- package/dist/config/configGeneratePath.js +4 -0
- package/dist/config/configGeneratePath.js.map +1 -1
- package/dist/config/configLoader.d.ts +15 -0
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +15 -16
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +11 -7
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +16 -14
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/effectiveConfig.d.ts +17 -2
- package/dist/config/effectiveConfig.d.ts.map +1 -1
- package/dist/config/effectiveConfig.js +32 -25
- package/dist/config/effectiveConfig.js.map +1 -1
- package/dist/config/lintConfigReader.d.ts +6 -0
- package/dist/config/lintConfigReader.d.ts.map +1 -1
- package/dist/config/lintConfigReader.js +6 -0
- package/dist/config/lintConfigReader.js.map +1 -1
- package/dist/config/staticObjectExtract.d.ts +4 -0
- package/dist/config/staticObjectExtract.d.ts.map +1 -1
- package/dist/config/staticObjectExtract.js +7 -3
- package/dist/config/staticObjectExtract.js.map +1 -1
- package/dist/config/thresholdRationales.d.ts +2 -0
- package/dist/config/thresholdRationales.d.ts.map +1 -1
- package/dist/config/thresholdRationales.js +5 -2
- package/dist/config/thresholdRationales.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/conventions/conventionMiner.d.ts +105 -2
- package/dist/conventions/conventionMiner.d.ts.map +1 -1
- package/dist/conventions/conventionMiner.js +334 -259
- package/dist/conventions/conventionMiner.js.map +1 -1
- package/dist/coverage/coverageService.js +4 -4
- package/dist/coverage/coverageService.js.map +1 -1
- package/dist/daemon/args.d.ts +3 -0
- package/dist/daemon/args.d.ts.map +1 -1
- package/dist/daemon/args.js +3 -0
- package/dist/daemon/args.js.map +1 -1
- package/dist/daemon/core.d.ts +33 -27
- package/dist/daemon/core.d.ts.map +1 -1
- package/dist/daemon/core.js +198 -162
- package/dist/daemon/core.js.map +1 -1
- package/dist/daemon/lspServer.d.ts +8 -0
- package/dist/daemon/lspServer.d.ts.map +1 -1
- package/dist/daemon/lspServer.js +8 -0
- package/dist/daemon/lspServer.js.map +1 -1
- package/dist/daemon/main.d.ts +2 -0
- package/dist/daemon/main.d.ts.map +1 -1
- package/dist/daemon/main.js +22 -4
- package/dist/daemon/main.js.map +1 -1
- package/dist/daemon/resolve.d.ts +18 -3
- package/dist/daemon/resolve.d.ts.map +1 -1
- package/dist/daemon/resolve.js +25 -4
- package/dist/daemon/resolve.js.map +1 -1
- package/dist/daemon/socketClient.d.ts +10 -1
- package/dist/daemon/socketClient.d.ts.map +1 -1
- package/dist/daemon/socketClient.js +10 -1
- package/dist/daemon/socketClient.js.map +1 -1
- package/dist/daemon/socketServer.d.ts +13 -0
- package/dist/daemon/socketServer.d.ts.map +1 -1
- package/dist/daemon/socketServer.js +13 -0
- package/dist/daemon/socketServer.js.map +1 -1
- package/dist/dataPaths.d.ts +17 -8
- package/dist/dataPaths.d.ts.map +1 -1
- package/dist/dataPaths.js +16 -44
- package/dist/dataPaths.js.map +1 -1
- package/dist/dismissals.d.ts +22 -1
- package/dist/dismissals.d.ts.map +1 -1
- package/dist/dismissals.js +22 -1
- package/dist/dismissals.js.map +1 -1
- package/dist/enforcement/gate.d.ts +1 -0
- package/dist/enforcement/gate.d.ts.map +1 -1
- package/dist/enforcement/gate.js +1 -0
- package/dist/enforcement/gate.js.map +1 -1
- package/dist/fingerprint.d.ts +6 -0
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +46 -1
- package/dist/fingerprint.js.map +1 -1
- package/dist/functionScanner.d.ts +30 -1
- package/dist/functionScanner.d.ts.map +1 -1
- package/dist/functionScanner.js +258 -256
- package/dist/functionScanner.js.map +1 -1
- package/dist/generators/AWSQConfigGenerator.d.ts +23 -0
- package/dist/generators/AWSQConfigGenerator.d.ts.map +1 -1
- package/dist/generators/AWSQConfigGenerator.js +23 -0
- package/dist/generators/AWSQConfigGenerator.js.map +1 -1
- package/dist/generators/BaseConfigGenerator.d.ts +7 -0
- package/dist/generators/BaseConfigGenerator.d.ts.map +1 -1
- package/dist/generators/BaseConfigGenerator.js +7 -0
- package/dist/generators/BaseConfigGenerator.js.map +1 -1
- package/dist/generators/ClaudeConfigGenerator.d.ts +23 -0
- package/dist/generators/ClaudeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ClaudeConfigGenerator.js +23 -0
- package/dist/generators/ClaudeConfigGenerator.js.map +1 -1
- package/dist/generators/ClineConfigGenerator.d.ts +23 -0
- package/dist/generators/ClineConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ClineConfigGenerator.js +23 -0
- package/dist/generators/ClineConfigGenerator.js.map +1 -1
- package/dist/generators/CodeiumConfigGenerator.d.ts +23 -0
- package/dist/generators/CodeiumConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CodeiumConfigGenerator.js +23 -0
- package/dist/generators/CodeiumConfigGenerator.js.map +1 -1
- package/dist/generators/CodexConfigGenerator.d.ts +23 -0
- package/dist/generators/CodexConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CodexConfigGenerator.js +23 -0
- package/dist/generators/CodexConfigGenerator.js.map +1 -1
- package/dist/generators/ConfigGeneratorFactory.d.ts +9 -0
- package/dist/generators/ConfigGeneratorFactory.d.ts.map +1 -1
- package/dist/generators/ConfigGeneratorFactory.js +9 -0
- package/dist/generators/ConfigGeneratorFactory.js.map +1 -1
- package/dist/generators/ContinueConfigGenerator.d.ts +23 -0
- package/dist/generators/ContinueConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ContinueConfigGenerator.js +23 -0
- package/dist/generators/ContinueConfigGenerator.js.map +1 -1
- package/dist/generators/CopilotConfigGenerator.d.ts +23 -0
- package/dist/generators/CopilotConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CopilotConfigGenerator.js +23 -0
- package/dist/generators/CopilotConfigGenerator.js.map +1 -1
- package/dist/generators/CursorConfigGenerator.d.ts +23 -0
- package/dist/generators/CursorConfigGenerator.d.ts.map +1 -1
- package/dist/generators/CursorConfigGenerator.js +23 -0
- package/dist/generators/CursorConfigGenerator.js.map +1 -1
- package/dist/generators/GeminiConfigGenerator.d.ts +23 -0
- package/dist/generators/GeminiConfigGenerator.d.ts.map +1 -1
- package/dist/generators/GeminiConfigGenerator.js +23 -0
- package/dist/generators/GeminiConfigGenerator.js.map +1 -1
- package/dist/generators/VSCodeConfigGenerator.d.ts +23 -0
- package/dist/generators/VSCodeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/VSCodeConfigGenerator.js +23 -0
- package/dist/generators/VSCodeConfigGenerator.js.map +1 -1
- package/dist/generators/ZCodeConfigGenerator.d.ts +23 -0
- package/dist/generators/ZCodeConfigGenerator.d.ts.map +1 -1
- package/dist/generators/ZCodeConfigGenerator.js +23 -0
- package/dist/generators/ZCodeConfigGenerator.js.map +1 -1
- package/dist/graph/blastRadius.d.ts.map +1 -1
- package/dist/graph/blastRadius.js +12 -7
- package/dist/graph/blastRadius.js.map +1 -1
- package/dist/graph/callGraph.d.ts +31 -0
- package/dist/graph/callGraph.d.ts.map +1 -1
- package/dist/graph/callGraph.js +62 -32
- package/dist/graph/callGraph.js.map +1 -1
- package/dist/graph/importClassification.d.ts +28 -0
- package/dist/graph/importClassification.d.ts.map +1 -1
- package/dist/graph/importClassification.js +57 -0
- package/dist/graph/importClassification.js.map +1 -1
- package/dist/graph/importGraph.d.ts +38 -0
- package/dist/graph/importGraph.d.ts.map +1 -1
- package/dist/graph/importGraph.js +38 -0
- package/dist/graph/importGraph.js.map +1 -1
- package/dist/graph/outputFormatter.d.ts +12 -4
- package/dist/graph/outputFormatter.d.ts.map +1 -1
- package/dist/graph/outputFormatter.js +12 -62
- package/dist/graph/outputFormatter.js.map +1 -1
- package/dist/graph/resolutionEnvironment.d.ts +61 -0
- package/dist/graph/resolutionEnvironment.d.ts.map +1 -0
- package/dist/graph/resolutionEnvironment.js +57 -0
- package/dist/graph/resolutionEnvironment.js.map +1 -0
- package/dist/hooks/codex.d.ts +8 -1
- package/dist/hooks/codex.d.ts.map +1 -1
- package/dist/hooks/codex.js +7 -0
- package/dist/hooks/codex.js.map +1 -1
- package/dist/hooks/core.d.ts +6 -0
- package/dist/hooks/core.d.ts.map +1 -1
- package/dist/hooks/core.js +6 -1
- package/dist/hooks/core.js.map +1 -1
- package/dist/hooks/cursor.d.ts +11 -1
- package/dist/hooks/cursor.d.ts.map +1 -1
- package/dist/hooks/cursor.js +10 -0
- package/dist/hooks/cursor.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/installConfig.d.ts +23 -5
- package/dist/installConfig.d.ts.map +1 -1
- package/dist/installConfig.js +23 -5
- package/dist/installConfig.js.map +1 -1
- package/dist/installer.d.ts +6 -0
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +6 -0
- package/dist/installer.js.map +1 -1
- package/dist/invariants/ruleEngine.d.ts +3 -0
- package/dist/invariants/ruleEngine.d.ts.map +1 -1
- package/dist/invariants/ruleEngine.js +156 -119
- package/dist/invariants/ruleEngine.js.map +1 -1
- package/dist/invariants/ruleValidator.d.ts +3 -0
- package/dist/invariants/ruleValidator.d.ts.map +1 -1
- package/dist/invariants/ruleValidator.js +185 -178
- package/dist/invariants/ruleValidator.js.map +1 -1
- package/dist/languages/LanguageOrchestrator.d.ts +4 -1
- package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
- package/dist/languages/LanguageOrchestrator.js +8 -19
- package/dist/languages/LanguageOrchestrator.js.map +1 -1
- package/dist/languages/RuntimeManager.d.ts +8 -0
- package/dist/languages/RuntimeManager.d.ts.map +1 -1
- package/dist/languages/RuntimeManager.js +55 -5
- package/dist/languages/RuntimeManager.js.map +1 -1
- package/dist/languages/UniversalAnalyzer.js +1 -1
- package/dist/languages/UniversalAnalyzer.js.map +1 -1
- package/dist/languages/adapterBridge.d.ts +4 -0
- package/dist/languages/adapterBridge.d.ts.map +1 -1
- package/dist/languages/adapterBridge.js +37 -3
- package/dist/languages/adapterBridge.js.map +1 -1
- package/dist/languages/go/GoAdapter.d.ts.map +1 -1
- package/dist/languages/go/GoAdapter.js +11 -14
- package/dist/languages/go/GoAdapter.js.map +1 -1
- package/dist/languages/go/analyzer-darwin-amd64 +0 -0
- package/dist/languages/go/analyzer-darwin-arm64 +0 -0
- package/dist/languages/go/analyzer-linux-amd64 +0 -0
- package/dist/languages/go/analyzer-linux-arm64 +0 -0
- package/dist/languages/go/analyzer-src/analyzer.go +2 -0
- package/dist/languages/go/analyzer-src/dataaccess.go +388 -0
- package/dist/languages/go/analyzer-src/types.go +8 -0
- package/dist/languages/go/analyzer-windows-amd64.exe +0 -0
- package/dist/languages/go/database-packages.json +8 -0
- package/dist/languages/go/goResolution.d.ts +229 -0
- package/dist/languages/go/goResolution.d.ts.map +1 -0
- package/dist/languages/go/goResolution.js +799 -0
- package/dist/languages/go/goResolution.js.map +1 -0
- package/dist/languages/go/stdlib-packages.json +353 -0
- package/dist/languages/go/tenantInputs.d.ts +37 -0
- package/dist/languages/go/tenantInputs.d.ts.map +1 -0
- package/dist/languages/go/tenantInputs.js +121 -0
- package/dist/languages/go/tenantInputs.js.map +1 -0
- package/dist/languages/index.d.ts +1 -0
- package/dist/languages/index.d.ts.map +1 -1
- package/dist/languages/index.js +5 -0
- package/dist/languages/index.js.map +1 -1
- package/dist/languages/json/JsonAdapter.d.ts +177 -0
- package/dist/languages/json/JsonAdapter.d.ts.map +1 -0
- package/dist/languages/json/JsonAdapter.js +531 -0
- package/dist/languages/json/JsonAdapter.js.map +1 -0
- package/dist/languages/locationIndex.d.ts +41 -0
- package/dist/languages/locationIndex.d.ts.map +1 -0
- package/dist/languages/locationIndex.js +42 -0
- package/dist/languages/locationIndex.js.map +1 -0
- package/dist/languages/sql/dialectDetection.d.ts +57 -0
- package/dist/languages/sql/dialectDetection.d.ts.map +1 -0
- package/dist/languages/sql/dialectDetection.js +135 -0
- package/dist/languages/sql/dialectDetection.js.map +1 -0
- package/dist/languages/sql/sqlAst.d.ts +494 -0
- package/dist/languages/sql/sqlAst.d.ts.map +1 -0
- package/dist/languages/sql/sqlAst.js +1817 -0
- package/dist/languages/sql/sqlAst.js.map +1 -0
- package/dist/languages/testConventions.d.ts +12 -1
- package/dist/languages/testConventions.d.ts.map +1 -1
- package/dist/languages/testConventions.js +13 -1
- package/dist/languages/testConventions.js.map +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js +1 -1
- package/dist/languages/tree-sitter/TreeSitterCssAdapter.js.map +1 -1
- package/dist/languages/tree-sitter/converter.js +2 -2
- package/dist/languages/tree-sitter/converter.js.map +1 -1
- package/dist/languages/tree-sitter/parser.d.ts +3 -4
- package/dist/languages/tree-sitter/parser.d.ts.map +1 -1
- package/dist/languages/tree-sitter/parser.js +10 -4
- package/dist/languages/tree-sitter/parser.js.map +1 -1
- package/dist/languages/tree-sitter/rawNode.d.ts +3 -0
- package/dist/languages/tree-sitter/rawNode.d.ts.map +1 -1
- package/dist/languages/tree-sitter/rawNode.js +3 -0
- package/dist/languages/tree-sitter/rawNode.js.map +1 -1
- package/dist/languages/types.d.ts +7 -0
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +36 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +168 -45
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/languages/typescript/database-packages.json +19 -0
- package/dist/ledger.d.ts +118 -2
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +167 -45
- package/dist/ledger.js.map +1 -1
- package/dist/legacyIndexNotice.d.ts +32 -0
- package/dist/legacyIndexNotice.d.ts.map +1 -0
- package/dist/legacyIndexNotice.js +89 -0
- package/dist/legacyIndexNotice.js.map +1 -0
- package/dist/mcp-tools/discoveryQueries.d.ts +55 -0
- package/dist/mcp-tools/discoveryQueries.d.ts.map +1 -0
- package/dist/mcp-tools/discoveryQueries.js +157 -0
- package/dist/mcp-tools/discoveryQueries.js.map +1 -0
- package/dist/mcp-tools/projectTasks.d.ts +9 -123
- package/dist/mcp-tools/projectTasks.d.ts.map +1 -1
- package/dist/mcp-tools/projectTasks.js +180 -170
- package/dist/mcp-tools/projectTasks.js.map +1 -1
- package/dist/mcp-tools/whitelistTools.d.ts +20 -0
- package/dist/mcp-tools/whitelistTools.d.ts.map +1 -1
- package/dist/mcp-tools/whitelistTools.js +20 -0
- package/dist/mcp-tools/whitelistTools.js.map +1 -1
- package/dist/mcp-tools/workflowGuide.d.ts +9 -0
- package/dist/mcp-tools/workflowGuide.d.ts.map +1 -1
- package/dist/mcp-tools/workflowGuide.js +13 -5
- package/dist/mcp-tools/workflowGuide.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts +78 -0
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +203 -340
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp-ui-simple.d.ts +2 -0
- package/dist/mcp-ui-simple.d.ts.map +1 -1
- package/dist/mcp-ui-simple.js +12 -5
- package/dist/mcp-ui-simple.js.map +1 -1
- package/dist/mcp.d.ts +6 -0
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +827 -850
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts +29 -33
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +102 -791
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/mcpAutoIndex.d.ts +5 -0
- package/dist/mcpAutoIndex.d.ts.map +1 -1
- package/dist/mcpAutoIndex.js +7 -2
- package/dist/mcpAutoIndex.js.map +1 -1
- package/dist/mcpDiagnostics.d.ts +7 -0
- package/dist/mcpDiagnostics.d.ts.map +1 -1
- package/dist/mcpDiagnostics.js +34 -9
- package/dist/mcpDiagnostics.js.map +1 -1
- package/dist/mcpToolErrors.d.ts +16 -0
- package/dist/mcpToolErrors.d.ts.map +1 -1
- package/dist/mcpToolErrors.js +16 -0
- package/dist/mcpToolErrors.js.map +1 -1
- package/dist/nextFile.d.ts +6 -0
- package/dist/nextFile.d.ts.map +1 -1
- package/dist/nextFile.js +6 -0
- package/dist/nextFile.js.map +1 -1
- package/dist/nextFileIncremental.d.ts +44 -4
- package/dist/nextFileIncremental.d.ts.map +1 -1
- package/dist/nextFileIncremental.js +47 -7
- package/dist/nextFileIncremental.js.map +1 -1
- package/dist/phase/batchFunctions.d.ts +38 -0
- package/dist/phase/batchFunctions.d.ts.map +1 -0
- package/dist/phase/batchFunctions.js +64 -0
- package/dist/phase/batchFunctions.js.map +1 -0
- package/dist/phase/checks.d.ts +39 -0
- package/dist/phase/checks.d.ts.map +1 -0
- package/dist/phase/checks.js +48 -0
- package/dist/phase/checks.js.map +1 -0
- package/dist/phase/codeBlocks.d.ts +25 -0
- package/dist/phase/codeBlocks.d.ts.map +1 -0
- package/dist/phase/codeBlocks.js +268 -0
- package/dist/phase/codeBlocks.js.map +1 -0
- package/dist/phase/colorMath.d.ts +41 -0
- package/dist/phase/colorMath.d.ts.map +1 -0
- package/dist/phase/colorMath.js +109 -0
- package/dist/phase/colorMath.js.map +1 -0
- package/dist/phase/config.d.ts +29 -0
- package/dist/phase/config.d.ts.map +1 -0
- package/dist/phase/config.js +54 -0
- package/dist/phase/config.js.map +1 -0
- package/dist/phase/consumed.d.ts +47 -0
- package/dist/phase/consumed.d.ts.map +1 -0
- package/dist/phase/consumed.js +22 -0
- package/dist/phase/consumed.js.map +1 -0
- package/dist/phase/conventionMining.d.ts +59 -0
- package/dist/phase/conventionMining.d.ts.map +1 -0
- package/dist/phase/conventionMining.js +152 -0
- package/dist/phase/conventionMining.js.map +1 -0
- package/dist/phase/coverage.d.ts +65 -0
- package/dist/phase/coverage.d.ts.map +1 -0
- package/dist/phase/coverage.js +121 -0
- package/dist/phase/coverage.js.map +1 -0
- package/dist/phase/dag.d.ts +49 -0
- package/dist/phase/dag.d.ts.map +1 -0
- package/dist/phase/dag.js +120 -0
- package/dist/phase/dag.js.map +1 -0
- package/dist/phase/dataAccessCalls.d.ts +33 -0
- package/dist/phase/dataAccessCalls.d.ts.map +1 -0
- package/dist/phase/dataAccessCalls.js +42 -0
- package/dist/phase/dataAccessCalls.js.map +1 -0
- package/dist/phase/dataAccessCallsCandidates.d.ts +25 -0
- package/dist/phase/dataAccessCallsCandidates.d.ts.map +1 -0
- package/dist/phase/dataAccessCallsCandidates.js +27 -0
- package/dist/phase/dataAccessCallsCandidates.js.map +1 -0
- package/dist/phase/dynamicSql.d.ts +18 -0
- package/dist/phase/dynamicSql.d.ts.map +1 -0
- package/dist/phase/dynamicSql.js +20 -0
- package/dist/phase/dynamicSql.js.map +1 -0
- package/dist/phase/exportForm.d.ts +23 -0
- package/dist/phase/exportForm.d.ts.map +1 -0
- package/dist/phase/exportForm.js +29 -0
- package/dist/phase/exportForm.js.map +1 -0
- package/dist/phase/exportSymbols.d.ts +21 -0
- package/dist/phase/exportSymbols.d.ts.map +1 -0
- package/dist/phase/exportSymbols.js +28 -0
- package/dist/phase/exportSymbols.js.map +1 -0
- package/dist/phase/fileHeader.d.ts +15 -0
- package/dist/phase/fileHeader.d.ts.map +1 -0
- package/dist/phase/fileHeader.js +33 -0
- package/dist/phase/fileHeader.js.map +1 -0
- package/dist/phase/fileImports.d.ts +39 -0
- package/dist/phase/fileImports.d.ts.map +1 -0
- package/dist/phase/fileImports.js +138 -0
- package/dist/phase/fileImports.js.map +1 -0
- package/dist/phase/fileSymbols.d.ts +25 -0
- package/dist/phase/fileSymbols.d.ts.map +1 -0
- package/dist/phase/fileSymbols.js +302 -0
- package/dist/phase/fileSymbols.js.map +1 -0
- package/dist/phase/functionBodies.d.ts +28 -0
- package/dist/phase/functionBodies.d.ts.map +1 -0
- package/dist/phase/functionBodies.js +67 -0
- package/dist/phase/functionBodies.js.map +1 -0
- package/dist/phase/functionIndex.d.ts +28 -0
- package/dist/phase/functionIndex.d.ts.map +1 -0
- package/dist/phase/functionIndex.js +152 -0
- package/dist/phase/functionIndex.js.map +1 -0
- package/dist/phase/goFunctionAnalysis.d.ts +47 -0
- package/dist/phase/goFunctionAnalysis.d.ts.map +1 -0
- package/dist/phase/goFunctionAnalysis.js +291 -0
- package/dist/phase/goFunctionAnalysis.js.map +1 -0
- package/dist/phase/goFunctions.d.ts +38 -0
- package/dist/phase/goFunctions.d.ts.map +1 -0
- package/dist/phase/goFunctions.js +154 -0
- package/dist/phase/goFunctions.js.map +1 -0
- package/dist/phase/goImports.d.ts +29 -0
- package/dist/phase/goImports.d.ts.map +1 -0
- package/dist/phase/goImports.js +68 -0
- package/dist/phase/goImports.js.map +1 -0
- package/dist/phase/goPackageBindings.d.ts +22 -0
- package/dist/phase/goPackageBindings.d.ts.map +1 -0
- package/dist/phase/goPackageBindings.js +30 -0
- package/dist/phase/goPackageBindings.js.map +1 -0
- package/dist/phase/goSwitches.d.ts +28 -0
- package/dist/phase/goSwitches.d.ts.map +1 -0
- package/dist/phase/goSwitches.js +52 -0
- package/dist/phase/goSwitches.js.map +1 -0
- package/dist/phase/importForm.d.ts +20 -0
- package/dist/phase/importForm.d.ts.map +1 -0
- package/dist/phase/importForm.js +27 -0
- package/dist/phase/importForm.js.map +1 -0
- package/dist/phase/importSpecifiers.d.ts +20 -0
- package/dist/phase/importSpecifiers.d.ts.map +1 -0
- package/dist/phase/importSpecifiers.js +30 -0
- package/dist/phase/importSpecifiers.js.map +1 -0
- package/dist/phase/imports.d.ts +18 -0
- package/dist/phase/imports.d.ts.map +1 -0
- package/dist/phase/imports.js +25 -0
- package/dist/phase/imports.js.map +1 -0
- package/dist/phase/jsonDocument.d.ts +26 -0
- package/dist/phase/jsonDocument.d.ts.map +1 -0
- package/dist/phase/jsonDocument.js +36 -0
- package/dist/phase/jsonDocument.js.map +1 -0
- package/dist/phase/localBinding.d.ts +33 -0
- package/dist/phase/localBinding.d.ts.map +1 -0
- package/dist/phase/localBinding.js +208 -0
- package/dist/phase/localBinding.js.map +1 -0
- package/dist/phase/loopQueries.d.ts +31 -0
- package/dist/phase/loopQueries.d.ts.map +1 -0
- package/dist/phase/loopQueries.js +44 -0
- package/dist/phase/loopQueries.js.map +1 -0
- package/dist/phase/loopQueryCandidates.d.ts +26 -0
- package/dist/phase/loopQueryCandidates.d.ts.map +1 -0
- package/dist/phase/loopQueryCandidates.js +28 -0
- package/dist/phase/loopQueryCandidates.js.map +1 -0
- package/dist/phase/oracles.d.ts +216 -0
- package/dist/phase/oracles.d.ts.map +1 -0
- package/dist/phase/oracles.js +484 -0
- package/dist/phase/oracles.js.map +1 -0
- package/dist/phase/phaseModel.d.ts +190 -0
- package/dist/phase/phaseModel.d.ts.map +1 -0
- package/dist/phase/phaseModel.js +491 -0
- package/dist/phase/phaseModel.js.map +1 -0
- package/dist/phase/producers.d.ts +450 -0
- package/dist/phase/producers.d.ts.map +1 -0
- package/dist/phase/producers.js +1030 -0
- package/dist/phase/producers.js.map +1 -0
- package/dist/phase/querySiteCandidates.d.ts +27 -0
- package/dist/phase/querySiteCandidates.d.ts.map +1 -0
- package/dist/phase/querySiteCandidates.js +66 -0
- package/dist/phase/querySiteCandidates.js.map +1 -0
- package/dist/phase/querySites.d.ts +30 -0
- package/dist/phase/querySites.d.ts.map +1 -0
- package/dist/phase/querySites.js +93 -0
- package/dist/phase/querySites.js.map +1 -0
- package/dist/phase/reachability.d.ts +61 -0
- package/dist/phase/reachability.d.ts.map +1 -0
- package/dist/phase/reachability.js +104 -0
- package/dist/phase/reachability.js.map +1 -0
- package/dist/phase/reactComponents.d.ts +33 -0
- package/dist/phase/reactComponents.d.ts.map +1 -0
- package/dist/phase/reactComponents.js +47 -0
- package/dist/phase/reactComponents.js.map +1 -0
- package/dist/phase/receiverActivity.d.ts +35 -0
- package/dist/phase/receiverActivity.d.ts.map +1 -0
- package/dist/phase/receiverActivity.js +66 -0
- package/dist/phase/receiverActivity.js.map +1 -0
- package/dist/phase/receiverConsumers.d.ts +207 -0
- package/dist/phase/receiverConsumers.d.ts.map +1 -0
- package/dist/phase/receiverConsumers.js +1063 -0
- package/dist/phase/receiverConsumers.js.map +1 -0
- package/dist/phase/receiverProvenance.d.ts +120 -0
- package/dist/phase/receiverProvenance.d.ts.map +1 -0
- package/dist/phase/receiverProvenance.js +377 -0
- package/dist/phase/receiverProvenance.js.map +1 -0
- package/dist/phase/routing.d.ts +47 -0
- package/dist/phase/routing.d.ts.map +1 -0
- package/dist/phase/routing.js +62 -0
- package/dist/phase/routing.js.map +1 -0
- package/dist/phase/rules/conventions.d.ts +61 -0
- package/dist/phase/rules/conventions.d.ts.map +1 -0
- package/dist/phase/rules/conventions.js +403 -0
- package/dist/phase/rules/conventions.js.map +1 -0
- package/dist/phase/rules/crossDomain.d.ts +102 -0
- package/dist/phase/rules/crossDomain.d.ts.map +1 -0
- package/dist/phase/rules/crossDomain.js +918 -0
- package/dist/phase/rules/crossDomain.js.map +1 -0
- package/dist/phase/rules/dataAccess.d.ts +62 -0
- package/dist/phase/rules/dataAccess.d.ts.map +1 -0
- package/dist/phase/rules/dataAccess.js +480 -0
- package/dist/phase/rules/dataAccess.js.map +1 -0
- package/dist/phase/rules/dependencyGraph.d.ts +44 -0
- package/dist/phase/rules/dependencyGraph.d.ts.map +1 -0
- package/dist/phase/rules/dependencyGraph.js +260 -0
- package/dist/phase/rules/dependencyGraph.js.map +1 -0
- package/dist/phase/rules/documentation.d.ts +45 -0
- package/dist/phase/rules/documentation.d.ts.map +1 -0
- package/dist/phase/rules/documentation.js +340 -0
- package/dist/phase/rules/documentation.js.map +1 -0
- package/dist/phase/rules/dry.d.ts +109 -0
- package/dist/phase/rules/dry.d.ts.map +1 -0
- package/dist/phase/rules/dry.js +803 -0
- package/dist/phase/rules/dry.js.map +1 -0
- package/dist/phase/rules/fileDocumentation.d.ts +36 -0
- package/dist/phase/rules/fileDocumentation.d.ts.map +1 -0
- package/dist/phase/rules/fileDocumentation.js +134 -0
- package/dist/phase/rules/fileDocumentation.js.map +1 -0
- package/dist/phase/rules/functionBodies.d.ts +33 -0
- package/dist/phase/rules/functionBodies.d.ts.map +1 -0
- package/dist/phase/rules/functionBodies.js +71 -0
- package/dist/phase/rules/functionBodies.js.map +1 -0
- package/dist/phase/rules/goRules.d.ts +49 -0
- package/dist/phase/rules/goRules.d.ts.map +1 -0
- package/dist/phase/rules/goRules.js +209 -0
- package/dist/phase/rules/goRules.js.map +1 -0
- package/dist/phase/rules/querySites.d.ts +29 -0
- package/dist/phase/rules/querySites.d.ts.map +1 -0
- package/dist/phase/rules/querySites.js +94 -0
- package/dist/phase/rules/querySites.js.map +1 -0
- package/dist/phase/rules/react.d.ts +38 -0
- package/dist/phase/rules/react.d.ts.map +1 -0
- package/dist/phase/rules/react.js +202 -0
- package/dist/phase/rules/react.js.map +1 -0
- package/dist/phase/rules/registry.d.ts +170 -0
- package/dist/phase/rules/registry.d.ts.map +1 -0
- package/dist/phase/rules/registry.js +103 -0
- package/dist/phase/rules/registry.js.map +1 -0
- package/dist/phase/rules/schema.d.ts +79 -0
- package/dist/phase/rules/schema.d.ts.map +1 -0
- package/dist/phase/rules/schema.js +273 -0
- package/dist/phase/rules/schema.js.map +1 -0
- package/dist/phase/rules/schemaJson.d.ts +32 -0
- package/dist/phase/rules/schemaJson.d.ts.map +1 -0
- package/dist/phase/rules/schemaJson.js +81 -0
- package/dist/phase/rules/schemaJson.js.map +1 -0
- package/dist/phase/rules/schemaValidator.d.ts +38 -0
- package/dist/phase/rules/schemaValidator.d.ts.map +1 -0
- package/dist/phase/rules/schemaValidator.js +107 -0
- package/dist/phase/rules/schemaValidator.js.map +1 -0
- package/dist/phase/rules/secrets.d.ts +34 -0
- package/dist/phase/rules/secrets.d.ts.map +1 -0
- package/dist/phase/rules/secrets.js +208 -0
- package/dist/phase/rules/secrets.js.map +1 -0
- package/dist/phase/rules/security.d.ts +30 -0
- package/dist/phase/rules/security.d.ts.map +1 -0
- package/dist/phase/rules/security.js +85 -0
- package/dist/phase/rules/security.js.map +1 -0
- package/dist/phase/rules/securityDefects.d.ts +37 -0
- package/dist/phase/rules/securityDefects.d.ts.map +1 -0
- package/dist/phase/rules/securityDefects.js +167 -0
- package/dist/phase/rules/securityDefects.js.map +1 -0
- package/dist/phase/rules/solid.d.ts +61 -0
- package/dist/phase/rules/solid.d.ts.map +1 -0
- package/dist/phase/rules/solid.js +562 -0
- package/dist/phase/rules/solid.js.map +1 -0
- package/dist/phase/rules/styles.d.ts +77 -0
- package/dist/phase/rules/styles.d.ts.map +1 -0
- package/dist/phase/rules/styles.js +868 -0
- package/dist/phase/rules/styles.js.map +1 -0
- package/dist/phase/rules/unreferencedModule.d.ts +26 -0
- package/dist/phase/rules/unreferencedModule.d.ts.map +1 -0
- package/dist/phase/rules/unreferencedModule.js +61 -0
- package/dist/phase/rules/unreferencedModule.js.map +1 -0
- package/dist/phase/runner.d.ts +549 -0
- package/dist/phase/runner.d.ts.map +1 -0
- package/dist/phase/runner.js +1098 -0
- package/dist/phase/runner.js.map +1 -0
- package/dist/phase/schemaCode.d.ts +34 -0
- package/dist/phase/schemaCode.d.ts.map +1 -0
- package/dist/phase/schemaCode.js +53 -0
- package/dist/phase/schemaCode.js.map +1 -0
- package/dist/phase/schemaObjects.d.ts +37 -0
- package/dist/phase/schemaObjects.d.ts.map +1 -0
- package/dist/phase/schemaObjects.js +139 -0
- package/dist/phase/schemaObjects.js.map +1 -0
- package/dist/phase/schemaUsage.d.ts +30 -0
- package/dist/phase/schemaUsage.d.ts.map +1 -0
- package/dist/phase/schemaUsage.js +99 -0
- package/dist/phase/schemaUsage.js.map +1 -0
- package/dist/phase/schemaUsageCandidates.d.ts +32 -0
- package/dist/phase/schemaUsageCandidates.d.ts.map +1 -0
- package/dist/phase/schemaUsageCandidates.js +165 -0
- package/dist/phase/schemaUsageCandidates.js.map +1 -0
- package/dist/phase/schemaValidations.d.ts +34 -0
- package/dist/phase/schemaValidations.d.ts.map +1 -0
- package/dist/phase/schemaValidations.js +53 -0
- package/dist/phase/schemaValidations.js.map +1 -0
- package/dist/phase/secretCandidates.d.ts +28 -0
- package/dist/phase/secretCandidates.d.ts.map +1 -0
- package/dist/phase/secretCandidates.js +132 -0
- package/dist/phase/secretCandidates.js.map +1 -0
- package/dist/phase/securityCandidates.d.ts +29 -0
- package/dist/phase/securityCandidates.d.ts.map +1 -0
- package/dist/phase/securityCandidates.js +469 -0
- package/dist/phase/securityCandidates.js.map +1 -0
- package/dist/phase/seeded-defects.d.ts +18 -0
- package/dist/phase/seeded-defects.d.ts.map +1 -0
- package/dist/phase/seeded-defects.js +61 -0
- package/dist/phase/seeded-defects.js.map +1 -0
- package/dist/phase/stringLiterals.d.ts +24 -0
- package/dist/phase/stringLiterals.d.ts.map +1 -0
- package/dist/phase/stringLiterals.js +35 -0
- package/dist/phase/stringLiterals.js.map +1 -0
- package/dist/phase/stylesCss.d.ts +25 -0
- package/dist/phase/stylesCss.d.ts.map +1 -0
- package/dist/phase/stylesCss.js +34 -0
- package/dist/phase/stylesCss.js.map +1 -0
- package/dist/phase/stylesMarkup.d.ts +31 -0
- package/dist/phase/stylesMarkup.d.ts.map +1 -0
- package/dist/phase/stylesMarkup.js +48 -0
- package/dist/phase/stylesMarkup.js.map +1 -0
- package/dist/phase/stylesSource.d.ts +36 -0
- package/dist/phase/stylesSource.d.ts.map +1 -0
- package/dist/phase/stylesSource.js +50 -0
- package/dist/phase/stylesSource.js.map +1 -0
- package/dist/phase/typeDeclarations.d.ts +33 -0
- package/dist/phase/typeDeclarations.d.ts.map +1 -0
- package/dist/phase/typeDeclarations.js +76 -0
- package/dist/phase/typeDeclarations.js.map +1 -0
- package/dist/phase/types.d.ts +2199 -0
- package/dist/phase/types.d.ts.map +1 -0
- package/dist/phase/types.js +27 -0
- package/dist/phase/types.js.map +1 -0
- package/dist/phase/withinFileProvenance.d.ts +50 -0
- package/dist/phase/withinFileProvenance.d.ts.map +1 -0
- package/dist/phase/withinFileProvenance.js +112 -0
- package/dist/phase/withinFileProvenance.js.map +1 -0
- package/dist/pipeline.d.ts +37 -30
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +131 -326
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +104 -21
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +1144 -984
- package/dist/pipelineAdapters.js.map +1 -1
- package/dist/pipelineTypes.d.ts +21 -0
- package/dist/pipelineTypes.d.ts.map +1 -1
- package/dist/pipelineTypes.js +21 -10
- package/dist/pipelineTypes.js.map +1 -1
- package/dist/presets/presets.d.ts +9 -2
- package/dist/presets/presets.d.ts.map +1 -1
- package/dist/presets/presets.js +15 -26
- package/dist/presets/presets.js.map +1 -1
- package/dist/reporting/csvReportGenerator.d.ts +14 -3
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
- package/dist/reporting/csvReportGenerator.js +14 -3
- package/dist/reporting/csvReportGenerator.js.map +1 -1
- package/dist/reporting/htmlReportGenerator.d.ts +5 -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 +9 -2
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.js +19 -5
- package/dist/reporting/jsonReportGenerator.js.map +1 -1
- package/dist/reporting/reportGenerator.d.ts +9 -2
- package/dist/reporting/reportGenerator.d.ts.map +1 -1
- package/dist/reporting/reportGenerator.js +9 -2
- package/dist/reporting/reportGenerator.js.map +1 -1
- package/dist/reporting/sarifReportGenerator.d.ts +14 -0
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
- package/dist/reporting/sarifReportGenerator.js +14 -0
- package/dist/reporting/sarifReportGenerator.js.map +1 -1
- package/dist/reporting/sizeDistribution.d.ts +19 -2
- package/dist/reporting/sizeDistribution.d.ts.map +1 -1
- package/dist/reporting/sizeDistribution.js +23 -5
- package/dist/reporting/sizeDistribution.js.map +1 -1
- package/dist/ruleAliases.d.ts +6 -8
- package/dist/ruleAliases.d.ts.map +1 -1
- package/dist/ruleAliases.js +29 -4
- package/dist/ruleAliases.js.map +1 -1
- package/dist/search/QueryParser.d.ts +1 -0
- package/dist/search/QueryParser.d.ts.map +1 -1
- package/dist/search/QueryParser.js +32 -91
- package/dist/search/QueryParser.js.map +1 -1
- package/dist/services/CodeMapGenerator.d.ts +19 -20
- package/dist/services/CodeMapGenerator.d.ts.map +1 -1
- package/dist/services/CodeMapGenerator.js +214 -194
- package/dist/services/CodeMapGenerator.js.map +1 -1
- package/dist/services/ProjectTaskRepository.d.ts +65 -3
- package/dist/services/ProjectTaskRepository.d.ts.map +1 -1
- package/dist/services/ProjectTaskRepository.js +94 -25
- package/dist/services/ProjectTaskRepository.js.map +1 -1
- package/dist/services/auditJobService.d.ts +17 -1
- package/dist/services/auditJobService.d.ts.map +1 -1
- package/dist/services/auditJobService.js +16 -0
- package/dist/services/auditJobService.js.map +1 -1
- package/dist/services/fileAccounting.d.ts +43 -5
- package/dist/services/fileAccounting.d.ts.map +1 -1
- package/dist/services/fileAccounting.js +48 -9
- package/dist/services/fileAccounting.js.map +1 -1
- package/dist/services/projectTaskHelpers.d.ts +45 -0
- package/dist/services/projectTaskHelpers.d.ts.map +1 -1
- package/dist/services/projectTaskHelpers.js +45 -0
- package/dist/services/projectTaskHelpers.js.map +1 -1
- package/dist/services/whitelistService.d.ts +40 -5
- package/dist/services/whitelistService.d.ts.map +1 -1
- package/dist/services/whitelistService.js +87 -46
- package/dist/services/whitelistService.js.map +1 -1
- package/dist/sqlite/betterSqlite3.d.ts +35 -1
- package/dist/sqlite/betterSqlite3.d.ts.map +1 -1
- package/dist/sqlite/betterSqlite3.js +35 -1
- package/dist/sqlite/betterSqlite3.js.map +1 -1
- package/dist/sqlite/driver.d.ts +23 -0
- package/dist/sqlite/driver.d.ts.map +1 -1
- package/dist/sqlite/driver.js +23 -0
- package/dist/sqlite/driver.js.map +1 -1
- package/dist/sqlite/nodeSqlite.d.ts +35 -1
- package/dist/sqlite/nodeSqlite.d.ts.map +1 -1
- package/dist/sqlite/nodeSqlite.js +35 -1
- package/dist/sqlite/nodeSqlite.js.map +1 -1
- package/dist/structuralSignature.d.ts +9 -0
- package/dist/structuralSignature.d.ts.map +1 -1
- package/dist/structuralSignature.js +9 -0
- package/dist/structuralSignature.js.map +1 -1
- package/dist/styles/cssAstExtractor.d.ts +15 -0
- package/dist/styles/cssAstExtractor.d.ts.map +1 -1
- package/dist/styles/cssAstExtractor.js +15 -0
- package/dist/styles/cssAstExtractor.js.map +1 -1
- package/dist/styles/normalizer.d.ts +6 -0
- package/dist/styles/normalizer.d.ts.map +1 -1
- package/dist/styles/normalizer.js +6 -0
- package/dist/styles/normalizer.js.map +1 -1
- package/dist/styles/styleExtractor.d.ts +29 -2
- package/dist/styles/styleExtractor.d.ts.map +1 -1
- package/dist/styles/styleExtractor.js +67 -48
- package/dist/styles/styleExtractor.js.map +1 -1
- package/dist/styles/styleIndexer.d.ts +8 -0
- package/dist/styles/styleIndexer.d.ts.map +1 -1
- package/dist/styles/styleIndexer.js +135 -138
- package/dist/styles/styleIndexer.js.map +1 -1
- package/dist/styles/tailwindConfigLoader.d.ts +12 -0
- package/dist/styles/tailwindConfigLoader.d.ts.map +1 -1
- package/dist/styles/tailwindConfigLoader.js +12 -0
- package/dist/styles/tailwindConfigLoader.js.map +1 -1
- package/dist/styles/tailwindExpander.d.ts +3 -0
- package/dist/styles/tailwindExpander.d.ts.map +1 -1
- package/dist/styles/tailwindExpander.js +8 -4
- package/dist/styles/tailwindExpander.js.map +1 -1
- package/dist/styles/tailwindProbe.d.ts +9 -0
- package/dist/styles/tailwindProbe.d.ts.map +1 -1
- package/dist/styles/tailwindProbe.js +181 -166
- package/dist/styles/tailwindProbe.js.map +1 -1
- package/dist/styles/tailwindUtilityExpander.d.ts +13 -0
- package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
- package/dist/styles/tailwindUtilityExpander.js +13 -0
- package/dist/styles/tailwindUtilityExpander.js.map +1 -1
- package/dist/symbols.d.ts +13 -11
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +14 -21
- package/dist/symbols.js.map +1 -1
- package/dist/telemetry.d.ts +31 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +31 -3
- package/dist/telemetry.js.map +1 -1
- package/dist/tool-registry.d.ts +37 -1
- package/dist/tool-registry.d.ts.map +1 -1
- package/dist/tool-registry.js +37 -1
- package/dist/tool-registry.js.map +1 -1
- package/dist/types.d.ts +114 -71
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -16
- package/dist/types.js.map +1 -1
- package/dist/ui/InteractivePrompts.d.ts +12 -0
- package/dist/ui/InteractivePrompts.d.ts.map +1 -1
- package/dist/ui/InteractivePrompts.js +12 -0
- package/dist/ui/InteractivePrompts.js.map +1 -1
- package/dist/utils/astParser.d.ts +15 -0
- package/dist/utils/astParser.d.ts.map +1 -1
- package/dist/utils/astParser.js +15 -0
- package/dist/utils/astParser.js.map +1 -1
- package/dist/utils/astUtils.d.ts +60 -0
- package/dist/utils/astUtils.d.ts.map +1 -1
- package/dist/utils/astUtils.js +350 -362
- package/dist/utils/astUtils.js.map +1 -1
- package/dist/utils/contentHash.d.ts +22 -0
- package/dist/utils/contentHash.d.ts.map +1 -0
- package/dist/utils/contentHash.js +26 -0
- package/dist/utils/contentHash.js.map +1 -0
- package/dist/utils/dependencyExtractor.d.ts +28 -0
- package/dist/utils/dependencyExtractor.d.ts.map +1 -1
- package/dist/utils/dependencyExtractor.js +28 -1
- package/dist/utils/dependencyExtractor.js.map +1 -1
- package/dist/utils/errorMessage.d.ts +10 -0
- package/dist/utils/errorMessage.d.ts.map +1 -0
- package/dist/utils/errorMessage.js +12 -0
- package/dist/utils/errorMessage.js.map +1 -0
- package/dist/utils/fileDiscovery.d.ts +61 -2
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +131 -23
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/dist/utils/reactDetection.d.ts +34 -5
- package/dist/utils/reactDetection.d.ts.map +1 -1
- package/dist/utils/reactDetection.js +73 -52
- package/dist/utils/reactDetection.js.map +1 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +1 -1
- package/dist/workers/auditWorker.js +7 -3
- package/dist/workers/auditWorker.js.map +1 -1
- package/examples/.auditrc.example.json +0 -8
- package/examples/.auditrc.json +0 -11
- package/examples/.code-auditor.json +0 -2
- package/examples/nextjs.auditrc.json +0 -8
- package/examples/node-api.auditrc.json +0 -7
- package/examples/react.auditrc.json +0 -6
- package/examples/tolerant-solid.auditrc.json +0 -5
- package/package.json +18 -9
- package/plugin/.claude-plugin/manifest.json +16 -0
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/hooks.json +7 -3
- package/plugin/scripts/hook-audit.sh +46 -16
- package/plugin/scripts/hook-common.sh +81 -12
- package/plugin/scripts/hook-drift-check.sh +76 -0
- package/plugin/scripts/hook-self-audit.sh +22 -14
- package/plugin/scripts/hook-warm.sh +5 -6
- package/plugin/skills/code-auditor/SKILL.md +1 -1
- package/server.json +10 -4
|
@@ -0,0 +1,1302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema migrations + DDL for the code index. Extracted from `CodeIndexDB`;
|
|
3
|
+
* holds only the raw SQLite handle. Also owns the LokiJS source-file migration
|
|
4
|
+
* (`migrateFromLokiJS`) as a free function — it opens its own connection and
|
|
5
|
+
* rewrites files, so it takes the path as a parameter rather than living on
|
|
6
|
+
* the facade.
|
|
7
|
+
*/
|
|
8
|
+
import { openSqlite, DB_BUSY_TIMEOUT_MS } from '../sqlite/driver.js';
|
|
9
|
+
import { statSync, existsSync, readFileSync, renameSync, openSync, readSync, closeSync } from 'fs';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { ContextualError } from '../mcpToolErrors.js';
|
|
12
|
+
const PRAGMA_TABLE_INFO_FINDINGS_LEDGER_RUNS = "PRAGMA table_info('findings_ledger_runs')";
|
|
13
|
+
const PRAGMA_JOURNAL_WAL = 'journal_mode = WAL';
|
|
14
|
+
const PRAGMA_FOREIGN_KEYS_ON = 'foreign_keys = ON';
|
|
15
|
+
/** Leading bytes read from a candidate index file to decide whether it is a
|
|
16
|
+
* LokiJS JSON export. Every LokiJS export begins with `{"filename":`, so the
|
|
17
|
+
* prefix is the only marker checked — a substring search for `"collections":`
|
|
18
|
+
* is deliberately NOT used, because a real SQLite index can legitimately store
|
|
19
|
+
* that exact key inside a function body within the first 64 KiB and would be
|
|
20
|
+
* misread as LokiJS. 64 KiB is a wide margin over a 16-byte SQLite header —
|
|
21
|
+
* and ~1/300th of a real index file, so the sniff stays sub-millisecond. */
|
|
22
|
+
const LOKIJS_SNIFF_BYTES = 64 * 1024;
|
|
23
|
+
/** The full DDL for a fresh index, as a single idempotent script.
|
|
24
|
+
* Split out of `createSchema` so the method stays a driver (is-fresh check →
|
|
25
|
+
* exec → migrate → stamp version) and the schema shape lives as data, not
|
|
26
|
+
* control flow. Every statement is `CREATE ... IF NOT EXISTS`, so re-running is
|
|
27
|
+
* safe and a fresh DB is stamped at the current version without replaying
|
|
28
|
+
* migrations.
|
|
29
|
+
*/
|
|
30
|
+
const SCHEMA_DDL = `
|
|
31
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
32
|
+
key TEXT PRIMARY KEY,
|
|
33
|
+
value TEXT NOT NULL
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE TABLE IF NOT EXISTS functions (
|
|
37
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
38
|
+
name TEXT NOT NULL,
|
|
39
|
+
file_path TEXT NOT NULL,
|
|
40
|
+
line_number INTEGER,
|
|
41
|
+
start_line INTEGER,
|
|
42
|
+
end_line INTEGER,
|
|
43
|
+
language TEXT DEFAULT 'typescript',
|
|
44
|
+
entity_type TEXT DEFAULT 'function',
|
|
45
|
+
component_type TEXT,
|
|
46
|
+
return_type TEXT,
|
|
47
|
+
complexity INTEGER DEFAULT 0,
|
|
48
|
+
is_exported INTEGER DEFAULT 0,
|
|
49
|
+
has_jsdoc INTEGER DEFAULT 0,
|
|
50
|
+
jsdoc_description TEXT,
|
|
51
|
+
jsdoc_tags TEXT,
|
|
52
|
+
parameters TEXT,
|
|
53
|
+
type_info TEXT,
|
|
54
|
+
hooks TEXT,
|
|
55
|
+
props TEXT,
|
|
56
|
+
used_imports TEXT,
|
|
57
|
+
unused_imports TEXT,
|
|
58
|
+
import_usage TEXT,
|
|
59
|
+
has_unused_imports INTEGER DEFAULT 0,
|
|
60
|
+
dependency_depth INTEGER DEFAULT 0,
|
|
61
|
+
purpose TEXT DEFAULT '',
|
|
62
|
+
context TEXT DEFAULT '',
|
|
63
|
+
body TEXT,
|
|
64
|
+
content_hash TEXT,
|
|
65
|
+
file_hash TEXT,
|
|
66
|
+
last_modified TEXT,
|
|
67
|
+
metadata_json TEXT,
|
|
68
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
69
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_functions_name ON functions(name);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_functions_file_path ON functions(file_path);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_functions_language ON functions(language);
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_functions_entity_type ON functions(entity_type);
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_functions_complexity ON functions(complexity);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_functions_content_hash ON functions(content_hash);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_functions_is_exported ON functions(is_exported);
|
|
79
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_functions_name_file_line ON functions(name, file_path, line_number);
|
|
80
|
+
|
|
81
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS functions_fts USING fts5(
|
|
82
|
+
name, jsdoc_description, purpose, context, body,
|
|
83
|
+
content='functions', content_rowid='id',
|
|
84
|
+
tokenize='porter unicode61'
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
CREATE TRIGGER IF NOT EXISTS functions_ai AFTER INSERT ON functions BEGIN
|
|
88
|
+
INSERT INTO functions_fts(rowid, name, jsdoc_description, purpose, context, body)
|
|
89
|
+
VALUES (new.id, new.name, new.jsdoc_description, new.purpose, new.context, new.body);
|
|
90
|
+
END;
|
|
91
|
+
CREATE TRIGGER IF NOT EXISTS functions_ad AFTER DELETE ON functions BEGIN
|
|
92
|
+
INSERT INTO functions_fts(functions_fts, rowid, name, jsdoc_description, purpose, context, body)
|
|
93
|
+
VALUES ('delete', old.id, old.name, old.jsdoc_description, old.purpose, old.context, old.body);
|
|
94
|
+
END;
|
|
95
|
+
CREATE TRIGGER IF NOT EXISTS functions_au AFTER UPDATE ON functions BEGIN
|
|
96
|
+
INSERT INTO functions_fts(functions_fts, rowid, name, jsdoc_description, purpose, context, body)
|
|
97
|
+
VALUES ('delete', old.id, old.name, old.jsdoc_description, old.purpose, old.context, old.body);
|
|
98
|
+
INSERT INTO functions_fts(rowid, name, jsdoc_description, purpose, context, body)
|
|
99
|
+
VALUES (new.id, new.name, new.jsdoc_description, new.purpose, new.context, new.body);
|
|
100
|
+
END;
|
|
101
|
+
|
|
102
|
+
CREATE TABLE IF NOT EXISTS function_calls (
|
|
103
|
+
caller_id INTEGER NOT NULL REFERENCES functions(id) ON DELETE CASCADE,
|
|
104
|
+
callee_name TEXT NOT NULL,
|
|
105
|
+
PRIMARY KEY (caller_id, callee_name)
|
|
106
|
+
);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS idx_function_calls_callee ON function_calls(callee_name);
|
|
108
|
+
|
|
109
|
+
CREATE TABLE IF NOT EXISTS function_dependencies (
|
|
110
|
+
function_id INTEGER NOT NULL REFERENCES functions(id) ON DELETE CASCADE,
|
|
111
|
+
dependency TEXT NOT NULL,
|
|
112
|
+
PRIMARY KEY (function_id, dependency)
|
|
113
|
+
);
|
|
114
|
+
CREATE INDEX IF NOT EXISTS idx_function_dependencies_dep ON function_dependencies(dependency);
|
|
115
|
+
|
|
116
|
+
CREATE TABLE IF NOT EXISTS whitelist (
|
|
117
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
118
|
+
name TEXT NOT NULL,
|
|
119
|
+
type TEXT NOT NULL,
|
|
120
|
+
status TEXT DEFAULT 'Active',
|
|
121
|
+
category TEXT,
|
|
122
|
+
description TEXT,
|
|
123
|
+
patterns TEXT,
|
|
124
|
+
added_by TEXT DEFAULT 'system',
|
|
125
|
+
added_at TEXT DEFAULT (datetime('now')),
|
|
126
|
+
updated_at TEXT,
|
|
127
|
+
metadata_json TEXT
|
|
128
|
+
);
|
|
129
|
+
CREATE INDEX IF NOT EXISTS idx_whitelist_name ON whitelist(name);
|
|
130
|
+
CREATE INDEX IF NOT EXISTS idx_whitelist_type ON whitelist(type);
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_whitelist_status ON whitelist(status);
|
|
132
|
+
|
|
133
|
+
CREATE TABLE IF NOT EXISTS audit_results (
|
|
134
|
+
audit_id TEXT PRIMARY KEY,
|
|
135
|
+
timestamp TEXT NOT NULL,
|
|
136
|
+
project_path TEXT NOT NULL,
|
|
137
|
+
summary_json TEXT NOT NULL,
|
|
138
|
+
analyzer_results_json TEXT NOT NULL,
|
|
139
|
+
violations_json TEXT,
|
|
140
|
+
recommendations_json TEXT,
|
|
141
|
+
metadata_json TEXT,
|
|
142
|
+
expires_at TEXT NOT NULL
|
|
143
|
+
);
|
|
144
|
+
CREATE INDEX IF NOT EXISTS idx_audit_results_timestamp ON audit_results(timestamp);
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_audit_results_project_path ON audit_results(project_path);
|
|
146
|
+
|
|
147
|
+
CREATE TABLE IF NOT EXISTS analyzer_configs (
|
|
148
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
149
|
+
analyzer_name TEXT NOT NULL,
|
|
150
|
+
project_path TEXT,
|
|
151
|
+
is_global INTEGER DEFAULT 0,
|
|
152
|
+
config_json TEXT NOT NULL DEFAULT '{}',
|
|
153
|
+
version TEXT,
|
|
154
|
+
created_by TEXT DEFAULT 'system',
|
|
155
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
156
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
157
|
+
metadata_json TEXT
|
|
158
|
+
);
|
|
159
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_analyzer_configs_key
|
|
160
|
+
ON analyzer_configs(analyzer_name, COALESCE(project_path, '__global__'), is_global);
|
|
161
|
+
|
|
162
|
+
CREATE TABLE IF NOT EXISTS code_maps (
|
|
163
|
+
map_id TEXT NOT NULL,
|
|
164
|
+
section_type TEXT NOT NULL,
|
|
165
|
+
content TEXT NOT NULL,
|
|
166
|
+
metadata_json TEXT DEFAULT '{}',
|
|
167
|
+
timestamp TEXT DEFAULT (datetime('now')),
|
|
168
|
+
size INTEGER DEFAULT 0,
|
|
169
|
+
PRIMARY KEY (map_id, section_type)
|
|
170
|
+
);
|
|
171
|
+
CREATE INDEX IF NOT EXISTS idx_code_maps_timestamp ON code_maps(timestamp);
|
|
172
|
+
|
|
173
|
+
CREATE TABLE IF NOT EXISTS schema_definitions (
|
|
174
|
+
schema_id TEXT PRIMARY KEY,
|
|
175
|
+
schema_name TEXT,
|
|
176
|
+
schema_json TEXT NOT NULL,
|
|
177
|
+
metadata_json TEXT,
|
|
178
|
+
indexed_at TEXT DEFAULT (datetime('now'))
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
CREATE TABLE IF NOT EXISTS schema_usage (
|
|
182
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
183
|
+
schema_id TEXT,
|
|
184
|
+
table_name TEXT NOT NULL,
|
|
185
|
+
file_path TEXT NOT NULL,
|
|
186
|
+
function_name TEXT,
|
|
187
|
+
function_start_line INTEGER,
|
|
188
|
+
function_start_column INTEGER,
|
|
189
|
+
usage_type TEXT NOT NULL,
|
|
190
|
+
line INTEGER,
|
|
191
|
+
"column" INTEGER,
|
|
192
|
+
raw_query TEXT,
|
|
193
|
+
parameters TEXT,
|
|
194
|
+
origin TEXT,
|
|
195
|
+
recorded_at TEXT DEFAULT (datetime('now'))
|
|
196
|
+
);
|
|
197
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_table ON schema_usage(table_name);
|
|
198
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_file ON schema_usage(file_path);
|
|
199
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_function ON schema_usage(function_name);
|
|
200
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_usage_type ON schema_usage(usage_type);
|
|
201
|
+
|
|
202
|
+
-- Spec 60 — import classification at emission (one row per static import
|
|
203
|
+
-- specifier occurrence). classification is free TEXT (no constraint).
|
|
204
|
+
CREATE TABLE IF NOT EXISTS import_specifiers (
|
|
205
|
+
file_path TEXT NOT NULL,
|
|
206
|
+
specifier TEXT NOT NULL,
|
|
207
|
+
classification TEXT NOT NULL,
|
|
208
|
+
resolved_path TEXT,
|
|
209
|
+
line INTEGER,
|
|
210
|
+
PRIMARY KEY (file_path, specifier, line)
|
|
211
|
+
);
|
|
212
|
+
CREATE INDEX IF NOT EXISTS idx_import_specifiers_class ON import_specifiers(classification);
|
|
213
|
+
CREATE INDEX IF NOT EXISTS idx_import_specifiers_resolved ON import_specifiers(resolved_path);
|
|
214
|
+
|
|
215
|
+
CREATE TABLE IF NOT EXISTS coverage_data (
|
|
216
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
217
|
+
function_name TEXT NOT NULL,
|
|
218
|
+
file_path TEXT NOT NULL,
|
|
219
|
+
line_number INTEGER,
|
|
220
|
+
basis TEXT NOT NULL DEFAULT 'static-reach',
|
|
221
|
+
covered INTEGER NOT NULL DEFAULT 0,
|
|
222
|
+
source TEXT,
|
|
223
|
+
imported_at TEXT DEFAULT (datetime('now')),
|
|
224
|
+
UNIQUE(function_name, file_path, line_number)
|
|
225
|
+
);
|
|
226
|
+
CREATE INDEX IF NOT EXISTS idx_cov_basis ON coverage_data(basis);
|
|
227
|
+
CREATE INDEX IF NOT EXISTS idx_cov_covered ON coverage_data(covered);
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_cov_function ON coverage_data(function_name);
|
|
229
|
+
|
|
230
|
+
CREATE TABLE IF NOT EXISTS project_tasks (
|
|
231
|
+
taskId TEXT PRIMARY KEY,
|
|
232
|
+
projectPath TEXT NOT NULL,
|
|
233
|
+
title TEXT NOT NULL,
|
|
234
|
+
description TEXT DEFAULT '',
|
|
235
|
+
status TEXT DEFAULT 'pending',
|
|
236
|
+
priority TEXT DEFAULT 'medium',
|
|
237
|
+
labels TEXT DEFAULT '[]',
|
|
238
|
+
source TEXT DEFAULT 'manual',
|
|
239
|
+
parentTaskId TEXT,
|
|
240
|
+
blockedBy TEXT DEFAULT '[]',
|
|
241
|
+
dueAt TEXT,
|
|
242
|
+
sortOrder INTEGER DEFAULT 0,
|
|
243
|
+
relatedFiles TEXT DEFAULT '[]',
|
|
244
|
+
relatedSymbols TEXT DEFAULT '[]',
|
|
245
|
+
fingerprint TEXT,
|
|
246
|
+
metadata TEXT DEFAULT '{}',
|
|
247
|
+
createdAt TEXT DEFAULT (datetime('now')),
|
|
248
|
+
updatedAt TEXT DEFAULT (datetime('now')),
|
|
249
|
+
completedAt TEXT
|
|
250
|
+
);
|
|
251
|
+
CREATE INDEX IF NOT EXISTS idx_project_tasks_project ON project_tasks(projectPath);
|
|
252
|
+
CREATE INDEX IF NOT EXISTS idx_project_tasks_status ON project_tasks(status);
|
|
253
|
+
CREATE INDEX IF NOT EXISTS idx_project_tasks_source ON project_tasks(source);
|
|
254
|
+
CREATE INDEX IF NOT EXISTS idx_project_tasks_fingerprint ON project_tasks(fingerprint);
|
|
255
|
+
CREATE INDEX IF NOT EXISTS idx_project_tasks_sort ON project_tasks(sortOrder);
|
|
256
|
+
|
|
257
|
+
-- Spec 11 R1 — Findings Ledger: append-only audit history
|
|
258
|
+
CREATE TABLE IF NOT EXISTS findings_ledger_runs (
|
|
259
|
+
run_id TEXT PRIMARY KEY,
|
|
260
|
+
timestamp TEXT NOT NULL,
|
|
261
|
+
git_sha TEXT,
|
|
262
|
+
git_dirty INTEGER NOT NULL DEFAULT 0,
|
|
263
|
+
tool_version TEXT NOT NULL,
|
|
264
|
+
tool_git_sha TEXT,
|
|
265
|
+
command TEXT NOT NULL,
|
|
266
|
+
surface TEXT NOT NULL,
|
|
267
|
+
scope TEXT NOT NULL,
|
|
268
|
+
target TEXT NOT NULL,
|
|
269
|
+
duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
270
|
+
exit_status INTEGER NOT NULL DEFAULT 0,
|
|
271
|
+
metadata_json TEXT DEFAULT '{}',
|
|
272
|
+
status TEXT NOT NULL DEFAULT 'completed',
|
|
273
|
+
project_root TEXT,
|
|
274
|
+
started_at TEXT,
|
|
275
|
+
heartbeat_at TEXT,
|
|
276
|
+
finished_at TEXT,
|
|
277
|
+
error TEXT,
|
|
278
|
+
progress_json TEXT,
|
|
279
|
+
stderr_log TEXT,
|
|
280
|
+
content_hash TEXT,
|
|
281
|
+
files_count INTEGER,
|
|
282
|
+
file_manifest_json TEXT,
|
|
283
|
+
runner_pid INTEGER,
|
|
284
|
+
runner_pid_started_at TEXT,
|
|
285
|
+
runner_host TEXT
|
|
286
|
+
);
|
|
287
|
+
CREATE TABLE IF NOT EXISTS findings_ledger_findings (
|
|
288
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
289
|
+
run_id TEXT NOT NULL REFERENCES findings_ledger_runs(run_id) ON DELETE CASCADE,
|
|
290
|
+
analyzer TEXT NOT NULL,
|
|
291
|
+
rule TEXT NOT NULL,
|
|
292
|
+
severity TEXT NOT NULL,
|
|
293
|
+
message TEXT NOT NULL,
|
|
294
|
+
file TEXT NOT NULL,
|
|
295
|
+
line INTEGER,
|
|
296
|
+
symbol TEXT DEFAULT '',
|
|
297
|
+
fingerprint TEXT NOT NULL
|
|
298
|
+
);
|
|
299
|
+
CREATE TABLE IF NOT EXISTS findings_ledger_coverage (
|
|
300
|
+
run_id TEXT NOT NULL REFERENCES findings_ledger_runs(run_id) ON DELETE CASCADE,
|
|
301
|
+
analyzer TEXT NOT NULL,
|
|
302
|
+
rule_id TEXT NOT NULL,
|
|
303
|
+
state TEXT NOT NULL,
|
|
304
|
+
count INTEGER NOT NULL DEFAULT 0,
|
|
305
|
+
reason TEXT,
|
|
306
|
+
PRIMARY KEY (run_id, analyzer, rule_id)
|
|
307
|
+
);
|
|
308
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_runs_surface ON findings_ledger_runs(surface);
|
|
309
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_runs_timestamp ON findings_ledger_runs(timestamp);
|
|
310
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_coverage_run ON findings_ledger_coverage(run_id);
|
|
311
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_findings_run ON findings_ledger_findings(run_id);
|
|
312
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_findings_fp ON findings_ledger_findings(fingerprint);
|
|
313
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_findings_rule ON findings_ledger_findings(analyzer, rule);
|
|
314
|
+
|
|
315
|
+
-- Spec 10: Style intelligence tables
|
|
316
|
+
CREATE TABLE IF NOT EXISTS style_declarations (
|
|
317
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
318
|
+
property TEXT NOT NULL,
|
|
319
|
+
raw_value TEXT NOT NULL,
|
|
320
|
+
normalized_value TEXT,
|
|
321
|
+
mechanism TEXT NOT NULL,
|
|
322
|
+
file_path TEXT NOT NULL,
|
|
323
|
+
line INTEGER NOT NULL,
|
|
324
|
+
context TEXT,
|
|
325
|
+
variant_context TEXT,
|
|
326
|
+
token_ref TEXT,
|
|
327
|
+
content_hash TEXT,
|
|
328
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
329
|
+
);
|
|
330
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_property ON style_declarations(property);
|
|
331
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_mechanism ON style_declarations(mechanism);
|
|
332
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_file_path ON style_declarations(file_path);
|
|
333
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_token_ref ON style_declarations(token_ref);
|
|
334
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_content_hash ON style_declarations(content_hash);
|
|
335
|
+
|
|
336
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS style_declarations_fts USING fts5(
|
|
337
|
+
property, raw_value, normalized_value,
|
|
338
|
+
content='style_declarations', content_rowid='id',
|
|
339
|
+
tokenize='porter unicode61'
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
CREATE TABLE IF NOT EXISTS style_tokens (
|
|
343
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
344
|
+
name TEXT NOT NULL,
|
|
345
|
+
value TEXT NOT NULL,
|
|
346
|
+
file_path TEXT NOT NULL,
|
|
347
|
+
mechanism TEXT NOT NULL,
|
|
348
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
349
|
+
);
|
|
350
|
+
CREATE INDEX IF NOT EXISTS idx_style_tokens_name ON style_tokens(name);
|
|
351
|
+
|
|
352
|
+
CREATE TABLE IF NOT EXISTS style_class_usage (
|
|
353
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
354
|
+
class_name TEXT NOT NULL,
|
|
355
|
+
file_path TEXT NOT NULL,
|
|
356
|
+
line INTEGER NOT NULL,
|
|
357
|
+
mechanism TEXT NOT NULL,
|
|
358
|
+
unresolvable INTEGER DEFAULT 0,
|
|
359
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
360
|
+
);
|
|
361
|
+
CREATE INDEX IF NOT EXISTS idx_style_class_usage_name ON style_class_usage(class_name);
|
|
362
|
+
CREATE INDEX IF NOT EXISTS idx_style_class_usage_file ON style_class_usage(file_path);
|
|
363
|
+
CREATE INDEX IF NOT EXISTS idx_style_class_usage_unres ON style_class_usage(unresolvable);
|
|
364
|
+
|
|
365
|
+
-- Spec 45 R5: Stylesheet sources the style indexer could not read.
|
|
366
|
+
-- When any rows exist, styles/undefined-class findings carry them as
|
|
367
|
+
-- incomplete-definition context instead of going silent.
|
|
368
|
+
CREATE TABLE IF NOT EXISTS style_unread_sources (
|
|
369
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
370
|
+
file_path TEXT NOT NULL UNIQUE,
|
|
371
|
+
reason TEXT NOT NULL,
|
|
372
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
373
|
+
);
|
|
374
|
+
|
|
375
|
+
-- Spec 45 R5: defined-class catalog (class_name, file_path) so the
|
|
376
|
+
-- undefined-class detector can resolve a class name with an indexed
|
|
377
|
+
-- "class_name IN (...)" lookup. Populated by the style indexer on insert.
|
|
378
|
+
CREATE TABLE IF NOT EXISTS style_defined_classes (
|
|
379
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
380
|
+
class_name TEXT NOT NULL,
|
|
381
|
+
file_path TEXT NOT NULL,
|
|
382
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
383
|
+
UNIQUE(class_name, file_path)
|
|
384
|
+
);
|
|
385
|
+
CREATE INDEX IF NOT EXISTS idx_style_defined_class_name ON style_defined_classes(class_name);
|
|
386
|
+
|
|
387
|
+
-- Spec 12: Convention mining
|
|
388
|
+
CREATE TABLE IF NOT EXISTS conventions (
|
|
389
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
390
|
+
domain TEXT NOT NULL,
|
|
391
|
+
rule_id TEXT NOT NULL,
|
|
392
|
+
antecedent TEXT,
|
|
393
|
+
consequent TEXT,
|
|
394
|
+
pattern TEXT,
|
|
395
|
+
directory TEXT,
|
|
396
|
+
file_path TEXT,
|
|
397
|
+
line INTEGER,
|
|
398
|
+
support INTEGER DEFAULT 0,
|
|
399
|
+
total_cases INTEGER DEFAULT 0,
|
|
400
|
+
confidence REAL DEFAULT 0,
|
|
401
|
+
exemplar_file TEXT,
|
|
402
|
+
exemplar_line INTEGER,
|
|
403
|
+
export_kind TEXT,
|
|
404
|
+
hash TEXT,
|
|
405
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
406
|
+
);
|
|
407
|
+
CREATE INDEX IF NOT EXISTS idx_conv_domain ON conventions(domain);
|
|
408
|
+
CREATE INDEX IF NOT EXISTS idx_conv_rule_id ON conventions(rule_id);
|
|
409
|
+
CREATE INDEX IF NOT EXISTS idx_conv_directory ON conventions(directory);
|
|
410
|
+
CREATE INDEX IF NOT EXISTS idx_conv_file_path ON conventions(file_path);
|
|
411
|
+
CREATE INDEX IF NOT EXISTS idx_conv_hash ON conventions(hash);
|
|
412
|
+
|
|
413
|
+
-- Spec 13: Hotspots & temporal analysis
|
|
414
|
+
CREATE TABLE IF NOT EXISTS file_churn (
|
|
415
|
+
file_path TEXT PRIMARY KEY,
|
|
416
|
+
commit_count INTEGER NOT NULL DEFAULT 0,
|
|
417
|
+
lines_added INTEGER NOT NULL DEFAULT 0,
|
|
418
|
+
lines_deleted INTEGER NOT NULL DEFAULT 0,
|
|
419
|
+
distinct_authors INTEGER NOT NULL DEFAULT 0,
|
|
420
|
+
dominant_author TEXT,
|
|
421
|
+
dominant_author_share REAL DEFAULT 0,
|
|
422
|
+
last_touched TEXT
|
|
423
|
+
);
|
|
424
|
+
CREATE INDEX IF NOT EXISTS idx_file_churn_cc ON file_churn(commit_count);
|
|
425
|
+
|
|
426
|
+
CREATE TABLE IF NOT EXISTS function_churn (
|
|
427
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
428
|
+
function_id INTEGER REFERENCES functions(id) ON DELETE CASCADE,
|
|
429
|
+
function_name TEXT NOT NULL,
|
|
430
|
+
file_path TEXT NOT NULL,
|
|
431
|
+
commit_count INTEGER NOT NULL DEFAULT 0,
|
|
432
|
+
distinct_authors INTEGER NOT NULL DEFAULT 0,
|
|
433
|
+
dominant_author TEXT,
|
|
434
|
+
dominant_author_share REAL DEFAULT 0,
|
|
435
|
+
renamed INTEGER DEFAULT 0,
|
|
436
|
+
confidence REAL DEFAULT 1.0
|
|
437
|
+
);
|
|
438
|
+
CREATE INDEX IF NOT EXISTS idx_func_churn_fid ON function_churn(function_id);
|
|
439
|
+
|
|
440
|
+
CREATE TABLE IF NOT EXISTS hotspot_scores (
|
|
441
|
+
target TEXT PRIMARY KEY,
|
|
442
|
+
type TEXT NOT NULL,
|
|
443
|
+
score REAL NOT NULL DEFAULT 0,
|
|
444
|
+
churn_pct REAL NOT NULL DEFAULT 0,
|
|
445
|
+
complexity_pct REAL NOT NULL DEFAULT 0,
|
|
446
|
+
commit_count INTEGER NOT NULL DEFAULT 0,
|
|
447
|
+
distinct_authors INTEGER NOT NULL DEFAULT 0,
|
|
448
|
+
dominant_author TEXT,
|
|
449
|
+
dominant_author_share REAL DEFAULT 0,
|
|
450
|
+
bus_factor_risk INTEGER DEFAULT 0,
|
|
451
|
+
complexity INTEGER NOT NULL DEFAULT 0,
|
|
452
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
453
|
+
);
|
|
454
|
+
CREATE INDEX IF NOT EXISTS idx_hotspot_scores_score ON hotspot_scores(score DESC);
|
|
455
|
+
|
|
456
|
+
CREATE TABLE IF NOT EXISTS dry_pair_history (
|
|
457
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
458
|
+
pair_fingerprint TEXT NOT NULL,
|
|
459
|
+
file1 TEXT NOT NULL,
|
|
460
|
+
symbol1 TEXT,
|
|
461
|
+
line1 INTEGER NOT NULL,
|
|
462
|
+
content_hash1 TEXT NOT NULL,
|
|
463
|
+
file2 TEXT NOT NULL,
|
|
464
|
+
symbol2 TEXT,
|
|
465
|
+
line2 INTEGER NOT NULL,
|
|
466
|
+
content_hash2 TEXT NOT NULL,
|
|
467
|
+
similarity REAL NOT NULL,
|
|
468
|
+
timestamp TEXT DEFAULT (datetime('now')),
|
|
469
|
+
run_id TEXT NOT NULL
|
|
470
|
+
);
|
|
471
|
+
CREATE INDEX IF NOT EXISTS idx_dph_fingerprint ON dry_pair_history(pair_fingerprint);
|
|
472
|
+
CREATE INDEX IF NOT EXISTS idx_dph_run ON dry_pair_history(run_id);
|
|
473
|
+
|
|
474
|
+
-- Spec 14: graph cache for call/import graph construction
|
|
475
|
+
CREATE TABLE IF NOT EXISTS graph_cache (
|
|
476
|
+
graph_type TEXT NOT NULL,
|
|
477
|
+
node_key TEXT NOT NULL,
|
|
478
|
+
neighbor_key TEXT NOT NULL,
|
|
479
|
+
weight REAL NOT NULL,
|
|
480
|
+
PRIMARY KEY (graph_type, node_key, neighbor_key)
|
|
481
|
+
);
|
|
482
|
+
CREATE INDEX IF NOT EXISTS idx_gc_type_node ON graph_cache(graph_type, node_key);
|
|
483
|
+
CREATE INDEX IF NOT EXISTS idx_gc_type_neighbor ON graph_cache(graph_type, neighbor_key);
|
|
484
|
+
|
|
485
|
+
-- Spec 68 §12: processed-facts store (see migration 17 → 18).
|
|
486
|
+
CREATE TABLE IF NOT EXISTS phase_facts (
|
|
487
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
488
|
+
fact_kind TEXT NOT NULL,
|
|
489
|
+
file_path TEXT,
|
|
490
|
+
payload TEXT NOT NULL,
|
|
491
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
492
|
+
);
|
|
493
|
+
CREATE INDEX IF NOT EXISTS idx_phase_facts_kind_file ON phase_facts(fact_kind, file_path);
|
|
494
|
+
`;
|
|
495
|
+
/** Migration 16 → 17: drop the always-empty `signature` column (Spec 63 R6) and
|
|
496
|
+
* rebuild the FTS surface without it. Kept as a free function (not a method) so
|
|
497
|
+
* the schema-upgrade code stays split into query-budget-sized units.
|
|
498
|
+
* @param db The SQLite database handle to migrate in place.
|
|
499
|
+
* @param currentVersion The stored schema version; migration is a no-op at 17+. */
|
|
500
|
+
export function migrateSchemaUsageToV17(db, currentVersion) {
|
|
501
|
+
if (currentVersion >= 17)
|
|
502
|
+
return;
|
|
503
|
+
// Clear the derived index FIRST, while the existing FTS surface and its
|
|
504
|
+
// triggers are still the ones that match the current schema. `DELETE FROM
|
|
505
|
+
// functions` fires the live `functions_ad` trigger per row, keeping
|
|
506
|
+
// `functions_fts` in step, and cascades to `function_calls` /
|
|
507
|
+
// `function_dependencies`. It must precede the FTS drop: firing the
|
|
508
|
+
// `functions_ad` trigger against a freshly recreated (empty) external-content
|
|
509
|
+
// `functions_fts` while `functions` still holds rows yields
|
|
510
|
+
// SQLITE_CORRUPT, not a clean delete.
|
|
511
|
+
db.exec(`DELETE FROM functions`);
|
|
512
|
+
// Drop the FTS surface — SQLite refuses DROP COLUMN while the FTS triggers
|
|
513
|
+
// reference the column, and the FTS table's column list must shed
|
|
514
|
+
// `signature` too.
|
|
515
|
+
db.exec(`
|
|
516
|
+
DROP TRIGGER IF EXISTS functions_ai;
|
|
517
|
+
DROP TRIGGER IF EXISTS functions_ad;
|
|
518
|
+
DROP TRIGGER IF EXISTS functions_au;
|
|
519
|
+
DROP TABLE IF EXISTS functions_fts;
|
|
520
|
+
`);
|
|
521
|
+
// Drop the column only if it still exists. A fresh DB is created by
|
|
522
|
+
// `createSchema` *without* the column (it already reflects v17), and the
|
|
523
|
+
// migrations then run on top of it with `currentVersion` 0 — so this guard
|
|
524
|
+
// is what lets an old index be upgraded in place without breaking a brand
|
|
525
|
+
// new one (same idempotence as the 14→15 / 15→16 column guards).
|
|
526
|
+
const fnCols = db
|
|
527
|
+
.prepare(`PRAGMA table_info('functions')`)
|
|
528
|
+
.all();
|
|
529
|
+
if (fnCols.some((c) => c.name === 'signature')) {
|
|
530
|
+
db.exec(`ALTER TABLE functions DROP COLUMN signature`);
|
|
531
|
+
}
|
|
532
|
+
// Rebuild the FTS surface without `signature`.
|
|
533
|
+
db.exec(`
|
|
534
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS functions_fts USING fts5(
|
|
535
|
+
name, jsdoc_description, purpose, context, body,
|
|
536
|
+
content='functions', content_rowid='id',
|
|
537
|
+
tokenize='porter unicode61'
|
|
538
|
+
);
|
|
539
|
+
CREATE TRIGGER IF NOT EXISTS functions_ai AFTER INSERT ON functions BEGIN
|
|
540
|
+
INSERT INTO functions_fts(rowid, name, jsdoc_description, purpose, context, body)
|
|
541
|
+
VALUES (new.id, new.name, new.jsdoc_description, new.purpose, new.context, new.body);
|
|
542
|
+
END;
|
|
543
|
+
CREATE TRIGGER IF NOT EXISTS functions_ad AFTER DELETE ON functions BEGIN
|
|
544
|
+
INSERT INTO functions_fts(functions_fts, rowid, name, jsdoc_description, purpose, context, body)
|
|
545
|
+
VALUES ('delete', old.id, old.name, old.jsdoc_description, old.purpose, old.context, old.body);
|
|
546
|
+
END;
|
|
547
|
+
CREATE TRIGGER IF NOT EXISTS functions_au AFTER UPDATE ON functions BEGIN
|
|
548
|
+
INSERT INTO functions_fts(functions_fts, rowid, name, jsdoc_description, purpose, context, body)
|
|
549
|
+
VALUES ('delete', old.id, old.name, old.jsdoc_description, old.purpose, old.context, old.body);
|
|
550
|
+
INSERT INTO functions_fts(rowid, name, jsdoc_description, purpose, context, body)
|
|
551
|
+
VALUES (new.id, new.name, new.jsdoc_description, new.purpose, new.context, new.body);
|
|
552
|
+
END;
|
|
553
|
+
`);
|
|
554
|
+
}
|
|
555
|
+
/** Copy the three user-authored LokiJS collections (tasks, analyzer configs,
|
|
556
|
+
* whitelist) into their SQLite tables, returning the row count of each.
|
|
557
|
+
*
|
|
558
|
+
* @param migDb The fresh SQLite database opened for the migration.
|
|
559
|
+
* @param collections The LokiJS collections keyed by name.
|
|
560
|
+
* @returns The migrated row counts, keyed `tasks` / `configs` / `whitelist`.
|
|
561
|
+
*/
|
|
562
|
+
export function migrateLokiCollections(migDb, collections) {
|
|
563
|
+
let taskCount = 0;
|
|
564
|
+
let configCount = 0;
|
|
565
|
+
let whitelistCount = 0;
|
|
566
|
+
// Migrate tasks
|
|
567
|
+
const tasksData = collections['projectTasks'] ?? [];
|
|
568
|
+
const insertTask = migDb.prepare(`INSERT OR IGNORE INTO project_tasks
|
|
569
|
+
(taskId, projectPath, title, description, status, priority, labels, source,
|
|
570
|
+
parentTaskId, blockedBy, dueAt, sortOrder, relatedFiles, relatedSymbols,
|
|
571
|
+
fingerprint, metadata, createdAt, updatedAt, completedAt)
|
|
572
|
+
VALUES (@taskId, @projectPath, @title, @description, @status, @priority, @labels, @source,
|
|
573
|
+
@parentTaskId, @blockedBy, @dueAt, @sortOrder, @relatedFiles, @relatedSymbols,
|
|
574
|
+
@fingerprint, @metadata, @createdAt, @updatedAt, @completedAt)`);
|
|
575
|
+
for (const t of tasksData) {
|
|
576
|
+
insertTask.run({
|
|
577
|
+
taskId: t.taskId ?? '',
|
|
578
|
+
projectPath: t.projectPath ?? '',
|
|
579
|
+
title: t.title ?? '',
|
|
580
|
+
description: t.description ?? '',
|
|
581
|
+
status: t.status ?? 'pending',
|
|
582
|
+
priority: t.priority ?? 'medium',
|
|
583
|
+
labels: JSON.stringify(t.labels ?? []),
|
|
584
|
+
source: t.source ?? 'manual',
|
|
585
|
+
parentTaskId: t.parentTaskId ?? null,
|
|
586
|
+
blockedBy: JSON.stringify(t.blockedBy ?? []),
|
|
587
|
+
dueAt: t.dueAt ?? null,
|
|
588
|
+
sortOrder: t.sortOrder ?? 0,
|
|
589
|
+
relatedFiles: JSON.stringify(t.relatedFiles ?? []),
|
|
590
|
+
relatedSymbols: JSON.stringify(t.relatedSymbols ?? []),
|
|
591
|
+
fingerprint: t.fingerprint ?? null,
|
|
592
|
+
metadata: JSON.stringify(t.metadata ?? t.metadata_json ?? {}),
|
|
593
|
+
createdAt: t.createdAt ?? t.created_at ?? new Date().toISOString(),
|
|
594
|
+
updatedAt: t.updatedAt ?? t.updated_at ?? new Date().toISOString(),
|
|
595
|
+
completedAt: t.completedAt ?? t.completed_at ?? null,
|
|
596
|
+
});
|
|
597
|
+
taskCount++;
|
|
598
|
+
}
|
|
599
|
+
// Migrate analyzer configs (snake_case columns matching createSchema)
|
|
600
|
+
const configsData = collections['analyzerConfigs'] ?? [];
|
|
601
|
+
const insertConfig = migDb.prepare(`INSERT OR IGNORE INTO analyzer_configs
|
|
602
|
+
(analyzer_name, project_path, is_global, config_json, version, created_by, created_at, updated_at, metadata_json)
|
|
603
|
+
VALUES (@analyzerName, @projectPath, @isGlobal, @configJson, @version, @createdBy, @createdAt, @updatedAt, @metadataJson)`);
|
|
604
|
+
for (const c of configsData) {
|
|
605
|
+
insertConfig.run({
|
|
606
|
+
analyzerName: c.analyzerName ?? '',
|
|
607
|
+
projectPath: c.projectPath ?? null,
|
|
608
|
+
isGlobal: c.isGlobal ? 1 : 0,
|
|
609
|
+
configJson: typeof c.config_json === 'string'
|
|
610
|
+
? c.config_json
|
|
611
|
+
: JSON.stringify(c.config ?? c.config_json ?? {}),
|
|
612
|
+
version: c.version ?? null,
|
|
613
|
+
createdBy: c.createdBy ?? c.created_by ?? 'system',
|
|
614
|
+
createdAt: c.createdAt ?? c.created_at ?? new Date().toISOString(),
|
|
615
|
+
updatedAt: c.updatedAt ?? c.updated_at ?? new Date().toISOString(),
|
|
616
|
+
metadataJson: JSON.stringify(c.metadata ?? c.metadata_json ?? {}),
|
|
617
|
+
});
|
|
618
|
+
configCount++;
|
|
619
|
+
}
|
|
620
|
+
// Migrate whitelist (snake_case columns matching createSchema)
|
|
621
|
+
const whitelistData = collections['whitelist'] ?? [];
|
|
622
|
+
const insertWl = migDb.prepare(`INSERT OR IGNORE INTO whitelist
|
|
623
|
+
(name, type, status, category, description, patterns, added_by, added_at, updated_at, metadata_json)
|
|
624
|
+
VALUES (@name, @type, @status, @category, @description, @patterns, @addedBy, @addedAt, @updatedAt, @metadataJson)`);
|
|
625
|
+
for (const w of whitelistData) {
|
|
626
|
+
insertWl.run({
|
|
627
|
+
name: w.name ?? '',
|
|
628
|
+
type: w.type ?? 'PlatformAPI',
|
|
629
|
+
status: w.status ?? 'Active',
|
|
630
|
+
category: w.category ?? null,
|
|
631
|
+
description: w.description ?? null,
|
|
632
|
+
patterns: JSON.stringify(w.patterns ?? []),
|
|
633
|
+
addedBy: w.addedBy ?? w.added_by ?? 'system',
|
|
634
|
+
addedAt: w.addedAt ?? w.added_at ?? new Date().toISOString(),
|
|
635
|
+
updatedAt: w.updatedAt ?? w.updated_at ?? null,
|
|
636
|
+
metadataJson: JSON.stringify(w.metadata ?? w.metadata_json ?? {}),
|
|
637
|
+
});
|
|
638
|
+
whitelistCount++;
|
|
639
|
+
}
|
|
640
|
+
return { tasks: taskCount, configs: configCount, whitelist: whitelistCount };
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Classify the leading bytes of a candidate index file as a LokiJS JSON export.
|
|
644
|
+
* A LokiJS export always begins with `{"filename":`; a SQLite binary begins with
|
|
645
|
+
* `SQLite format 3\0` and may legitimately store the JSON key `"collections":`
|
|
646
|
+
* inside a function body within the first 64 KiB. Only the prefix is matched —
|
|
647
|
+
* never a `"collections":` substring — so a real SQLite index is not misread as
|
|
648
|
+
* LokiJS.
|
|
649
|
+
* @param header The leading bytes of the candidate file, decoded as UTF-8.
|
|
650
|
+
* @returns true when the header is a LokiJS export.
|
|
651
|
+
*/
|
|
652
|
+
export function isLokiJSHeader(header) {
|
|
653
|
+
return header.startsWith('{"filename":');
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Migrate a legacy LokiJS index file at `dbPath` to SQLite. Returns whether a
|
|
657
|
+
* migration occurred. Extracted from `CodeIndexDB.maybeMigrateFromLokiJS` so the
|
|
658
|
+
* facade no longer carries the 19-branch migration routine; the function opens
|
|
659
|
+
* its own connection and rewrites files, so it takes the path as a parameter.
|
|
660
|
+
* @param dbPath The database file path to inspect and, if it is a LokiJS file, migrate.
|
|
661
|
+
* @returns Whether a migration occurred, and the migrated row counts when it did.
|
|
662
|
+
*/
|
|
663
|
+
export function migrateFromLokiJS(dbPath) {
|
|
664
|
+
if (dbPath === ':memory:')
|
|
665
|
+
return { migrated: false };
|
|
666
|
+
const bakPath = dbPath + '.loki.bak';
|
|
667
|
+
// If backup already exists alongside a valid SQLite db, skip
|
|
668
|
+
try {
|
|
669
|
+
const st = statSync(bakPath);
|
|
670
|
+
if (st.isFile()) {
|
|
671
|
+
// Check if SQLite db exists
|
|
672
|
+
try {
|
|
673
|
+
statSync(dbPath);
|
|
674
|
+
return { migrated: false };
|
|
675
|
+
}
|
|
676
|
+
catch { /* fall through */ }
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
catch { /* no backup */ }
|
|
680
|
+
// Check if dbPath is a LokiJS file. A LokiJS export is a single JSON object
|
|
681
|
+
// that always begins with `{"filename":`; a SQLite binary begins with
|
|
682
|
+
// `SQLite format 3\0`. Matching only the prefix keeps a real SQLite index from
|
|
683
|
+
// being misread as LokiJS when a stored function body happens to contain the
|
|
684
|
+
// JSON key `"collections":` within the first 64 KiB. Reading only a header
|
|
685
|
+
// chunk instead of the whole file avoids slurping a multi-MB index into memory
|
|
686
|
+
// on every process start (measured ~55 ms CPU on a 19.7 MB index) just to
|
|
687
|
+
// decide the answer is "not LokiJS".
|
|
688
|
+
try {
|
|
689
|
+
const fd = openSync(dbPath, 'r');
|
|
690
|
+
let header = '';
|
|
691
|
+
try {
|
|
692
|
+
const buf = Buffer.alloc(LOKIJS_SNIFF_BYTES);
|
|
693
|
+
const n = readSync(fd, buf, 0, LOKIJS_SNIFF_BYTES, 0);
|
|
694
|
+
header = buf.toString('utf-8', 0, n);
|
|
695
|
+
}
|
|
696
|
+
finally {
|
|
697
|
+
closeSync(fd);
|
|
698
|
+
}
|
|
699
|
+
if (!isLokiJSHeader(header)) {
|
|
700
|
+
return { migrated: false };
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
catch {
|
|
704
|
+
return { migrated: false };
|
|
705
|
+
}
|
|
706
|
+
// It's LokiJS — migrate
|
|
707
|
+
try {
|
|
708
|
+
const content = readFileSync(dbPath, 'utf-8');
|
|
709
|
+
const data = JSON.parse(content);
|
|
710
|
+
// LokiJS stores collections as an array of {name, data, ...}
|
|
711
|
+
const collArray = Array.isArray(data.collections)
|
|
712
|
+
? data.collections
|
|
713
|
+
: [];
|
|
714
|
+
const collections = {};
|
|
715
|
+
for (const c of collArray) {
|
|
716
|
+
collections[c.name] = c.data ?? [];
|
|
717
|
+
}
|
|
718
|
+
// Rename old LokiJS file FIRST, then create fresh SQLite DB
|
|
719
|
+
renameSync(dbPath, bakPath);
|
|
720
|
+
const migDb = openSqlite(dbPath, { timeoutMs: DB_BUSY_TIMEOUT_MS });
|
|
721
|
+
migDb.pragma(PRAGMA_JOURNAL_WAL);
|
|
722
|
+
migDb.pragma(PRAGMA_FOREIGN_KEYS_ON);
|
|
723
|
+
// User-authored tables only (function index gets rebuilt by sync).
|
|
724
|
+
// whitelist + analyzer_configs use snake_case (matching raw SQL queries in the main code).
|
|
725
|
+
// project_tasks uses camelCase (matching ProjectTaskRepository document fields).
|
|
726
|
+
migDb.exec(`
|
|
727
|
+
CREATE TABLE IF NOT EXISTS whitelist (
|
|
728
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
729
|
+
name TEXT NOT NULL,
|
|
730
|
+
type TEXT NOT NULL,
|
|
731
|
+
status TEXT DEFAULT 'Active',
|
|
732
|
+
category TEXT,
|
|
733
|
+
description TEXT,
|
|
734
|
+
patterns TEXT,
|
|
735
|
+
added_by TEXT DEFAULT 'system',
|
|
736
|
+
added_at TEXT DEFAULT (datetime('now')),
|
|
737
|
+
updated_at TEXT,
|
|
738
|
+
metadata_json TEXT
|
|
739
|
+
);
|
|
740
|
+
|
|
741
|
+
CREATE TABLE IF NOT EXISTS analyzer_configs (
|
|
742
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
743
|
+
analyzer_name TEXT NOT NULL,
|
|
744
|
+
project_path TEXT,
|
|
745
|
+
is_global INTEGER DEFAULT 0,
|
|
746
|
+
config_json TEXT NOT NULL DEFAULT '{}',
|
|
747
|
+
version TEXT,
|
|
748
|
+
created_by TEXT DEFAULT 'system',
|
|
749
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
750
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
751
|
+
metadata_json TEXT
|
|
752
|
+
);
|
|
753
|
+
|
|
754
|
+
CREATE TABLE IF NOT EXISTS project_tasks (
|
|
755
|
+
taskId TEXT PRIMARY KEY,
|
|
756
|
+
projectPath TEXT NOT NULL,
|
|
757
|
+
title TEXT NOT NULL,
|
|
758
|
+
description TEXT DEFAULT '',
|
|
759
|
+
status TEXT DEFAULT 'pending',
|
|
760
|
+
priority TEXT DEFAULT 'medium',
|
|
761
|
+
labels TEXT DEFAULT '[]',
|
|
762
|
+
source TEXT DEFAULT 'manual',
|
|
763
|
+
parentTaskId TEXT,
|
|
764
|
+
blockedBy TEXT DEFAULT '[]',
|
|
765
|
+
dueAt TEXT,
|
|
766
|
+
sortOrder INTEGER DEFAULT 0,
|
|
767
|
+
relatedFiles TEXT DEFAULT '[]',
|
|
768
|
+
relatedSymbols TEXT DEFAULT '[]',
|
|
769
|
+
fingerprint TEXT,
|
|
770
|
+
metadata TEXT DEFAULT '{}',
|
|
771
|
+
createdAt TEXT DEFAULT (datetime('now')),
|
|
772
|
+
updatedAt TEXT DEFAULT (datetime('now')),
|
|
773
|
+
completedAt TEXT
|
|
774
|
+
);
|
|
775
|
+
CREATE INDEX IF NOT EXISTS idx_project_tasks_fingerprint ON project_tasks(fingerprint);
|
|
776
|
+
`);
|
|
777
|
+
const { tasks: taskCount, configs: configCount, whitelist: whitelistCount } = migrateLokiCollections(migDb, collections);
|
|
778
|
+
migDb.close();
|
|
779
|
+
const countLine = [
|
|
780
|
+
taskCount && `${taskCount} tasks`,
|
|
781
|
+
configCount && `${configCount} analyzer configs`,
|
|
782
|
+
whitelistCount && `${whitelistCount} whitelist entries`,
|
|
783
|
+
].filter(Boolean).join(', ') || '0 entries';
|
|
784
|
+
console.error(`[code-auditor] Migrated ${countLine} from LokiJS to SQLite. Old file saved as ${path.basename(bakPath)}`);
|
|
785
|
+
return { migrated: true, counts: { tasks: taskCount, configs: configCount, whitelist: whitelistCount } };
|
|
786
|
+
}
|
|
787
|
+
catch (err) {
|
|
788
|
+
// Migration failed — try to restore the backup
|
|
789
|
+
console.error('[code-auditor] LokiJS migration failed:', err instanceof Error ? err.message : String(err));
|
|
790
|
+
try {
|
|
791
|
+
if (existsSync(bakPath) && !existsSync(dbPath)) {
|
|
792
|
+
renameSync(bakPath, dbPath);
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
catch { /* best effort */ }
|
|
796
|
+
return { migrated: false };
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* Schema migration runner + DDL owner for the code index. Replays the ordered
|
|
801
|
+
* migration steps (2 → 18) against an existing index, and creates a fresh index
|
|
802
|
+
* at the current shape when no `functions` table exists yet.
|
|
803
|
+
*/
|
|
804
|
+
export class SchemaMigrations {
|
|
805
|
+
db;
|
|
806
|
+
/**
|
|
807
|
+
* Hold the SQLite handle to migrate and stamp with the schema version.
|
|
808
|
+
* @param db The SQLite database handle to migrate.
|
|
809
|
+
*/
|
|
810
|
+
constructor(db) {
|
|
811
|
+
this.db = db;
|
|
812
|
+
}
|
|
813
|
+
// ── Schema migrations ────────────────────────────────────────────────
|
|
814
|
+
runMigrations(currentVersion) {
|
|
815
|
+
this.migrateCoreTables(currentVersion);
|
|
816
|
+
this.migrateConventionsExportKind(currentVersion);
|
|
817
|
+
this.migrateRunLifecycle(currentVersion);
|
|
818
|
+
this.migrateStyleCatalog(currentVersion);
|
|
819
|
+
this.migrateSchemaUsageAndSignature(currentVersion);
|
|
820
|
+
}
|
|
821
|
+
/** Read the stored schema version, or null when the `meta` row is absent. */
|
|
822
|
+
readSchemaVersion() {
|
|
823
|
+
const row = this.db.prepare("SELECT value FROM meta WHERE key = 'schema_version'").get();
|
|
824
|
+
return row ? parseInt(row.value, 10) : null;
|
|
825
|
+
}
|
|
826
|
+
/** Run a schema script only when the stored version precedes the target. */
|
|
827
|
+
migrateFrom(currentVersion, targetVersion, sql) {
|
|
828
|
+
if (currentVersion < targetVersion)
|
|
829
|
+
this.db.exec(sql);
|
|
830
|
+
}
|
|
831
|
+
/** Add missing columns to findings_ledger_runs, batching the ALTERs into one
|
|
832
|
+
* exec (loop-query / N+1). Reused by the two run-lifecycle migrations. */
|
|
833
|
+
addRunColumns(currentVersion, targetVersion, newRunCols) {
|
|
834
|
+
if (currentVersion >= targetVersion)
|
|
835
|
+
return;
|
|
836
|
+
const runCols = this.db
|
|
837
|
+
.prepare(PRAGMA_TABLE_INFO_FINDINGS_LEDGER_RUNS)
|
|
838
|
+
.all();
|
|
839
|
+
const hasRunCol = (name) => runCols.some((c) => c.name === name);
|
|
840
|
+
const missingCols = newRunCols.filter(([name]) => !hasRunCol(name));
|
|
841
|
+
if (missingCols.length > 0) {
|
|
842
|
+
this.db.exec(missingCols
|
|
843
|
+
.map(([name, decl]) => `ALTER TABLE findings_ledger_runs ADD COLUMN ${name} ${decl}`)
|
|
844
|
+
.join(';\n'));
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
/** Migrations 2 → 7 — the pure-DDL table/index additions. */
|
|
848
|
+
migrateCoreTables(currentVersion) {
|
|
849
|
+
// Migration 1 → 2: Unique index on (name, file_path, line_number)
|
|
850
|
+
// Previously the unique index was on (name, file_path) only, which caused
|
|
851
|
+
// same-named functions at different lines in the same file to collide.
|
|
852
|
+
this.migrateFrom(currentVersion, 2, `
|
|
853
|
+
DROP INDEX IF EXISTS idx_functions_name_file;
|
|
854
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_functions_name_file_line ON functions(name, file_path, line_number);
|
|
855
|
+
`);
|
|
856
|
+
// Migration 2 → 3: Style intelligence tables (Spec 10)
|
|
857
|
+
this.migrateFrom(currentVersion, 3, `
|
|
858
|
+
CREATE TABLE IF NOT EXISTS style_declarations (
|
|
859
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
860
|
+
property TEXT NOT NULL,
|
|
861
|
+
raw_value TEXT NOT NULL,
|
|
862
|
+
normalized_value TEXT,
|
|
863
|
+
mechanism TEXT NOT NULL,
|
|
864
|
+
file_path TEXT NOT NULL,
|
|
865
|
+
line INTEGER NOT NULL,
|
|
866
|
+
context TEXT,
|
|
867
|
+
variant_context TEXT,
|
|
868
|
+
token_ref TEXT,
|
|
869
|
+
content_hash TEXT,
|
|
870
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
871
|
+
);
|
|
872
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_property ON style_declarations(property);
|
|
873
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_mechanism ON style_declarations(mechanism);
|
|
874
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_file_path ON style_declarations(file_path);
|
|
875
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_token_ref ON style_declarations(token_ref);
|
|
876
|
+
CREATE INDEX IF NOT EXISTS idx_style_decls_content_hash ON style_declarations(content_hash);
|
|
877
|
+
|
|
878
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS style_declarations_fts USING fts5(
|
|
879
|
+
property, raw_value, normalized_value,
|
|
880
|
+
content='style_declarations', content_rowid='id',
|
|
881
|
+
tokenize='porter unicode61'
|
|
882
|
+
);
|
|
883
|
+
|
|
884
|
+
CREATE TABLE IF NOT EXISTS style_tokens (
|
|
885
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
886
|
+
name TEXT NOT NULL,
|
|
887
|
+
value TEXT NOT NULL,
|
|
888
|
+
file_path TEXT NOT NULL,
|
|
889
|
+
mechanism TEXT NOT NULL,
|
|
890
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
891
|
+
);
|
|
892
|
+
CREATE INDEX IF NOT EXISTS idx_style_tokens_name ON style_tokens(name);
|
|
893
|
+
|
|
894
|
+
CREATE TABLE IF NOT EXISTS style_class_usage (
|
|
895
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
896
|
+
class_name TEXT NOT NULL,
|
|
897
|
+
file_path TEXT NOT NULL,
|
|
898
|
+
line INTEGER NOT NULL,
|
|
899
|
+
mechanism TEXT NOT NULL,
|
|
900
|
+
unresolvable INTEGER DEFAULT 0,
|
|
901
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
902
|
+
);
|
|
903
|
+
CREATE INDEX IF NOT EXISTS idx_style_class_usage_name ON style_class_usage(class_name);
|
|
904
|
+
CREATE INDEX IF NOT EXISTS idx_style_class_usage_file ON style_class_usage(file_path);
|
|
905
|
+
CREATE INDEX IF NOT EXISTS idx_style_class_usage_unres ON style_class_usage(unresolvable);
|
|
906
|
+
`);
|
|
907
|
+
// Migration 3 → 4: Convention mining tables (Spec 12)
|
|
908
|
+
this.migrateFrom(currentVersion, 4, `
|
|
909
|
+
CREATE TABLE IF NOT EXISTS conventions (
|
|
910
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
911
|
+
domain TEXT NOT NULL,
|
|
912
|
+
rule_id TEXT NOT NULL,
|
|
913
|
+
antecedent TEXT,
|
|
914
|
+
consequent TEXT,
|
|
915
|
+
pattern TEXT,
|
|
916
|
+
directory TEXT,
|
|
917
|
+
file_path TEXT,
|
|
918
|
+
line INTEGER,
|
|
919
|
+
support INTEGER DEFAULT 0,
|
|
920
|
+
total_cases INTEGER DEFAULT 0,
|
|
921
|
+
confidence REAL DEFAULT 0,
|
|
922
|
+
exemplar_file TEXT,
|
|
923
|
+
exemplar_line INTEGER,
|
|
924
|
+
hash TEXT,
|
|
925
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
926
|
+
);
|
|
927
|
+
CREATE INDEX IF NOT EXISTS idx_conv_domain ON conventions(domain);
|
|
928
|
+
CREATE INDEX IF NOT EXISTS idx_conv_rule_id ON conventions(rule_id);
|
|
929
|
+
CREATE INDEX IF NOT EXISTS idx_conv_directory ON conventions(directory);
|
|
930
|
+
CREATE INDEX IF NOT EXISTS idx_conv_hash ON conventions(hash);
|
|
931
|
+
`);
|
|
932
|
+
// Migration 4 → 5: Hotspots & temporal analysis (Spec 13)
|
|
933
|
+
this.migrateFrom(currentVersion, 5, `
|
|
934
|
+
CREATE TABLE IF NOT EXISTS file_churn (
|
|
935
|
+
file_path TEXT PRIMARY KEY,
|
|
936
|
+
commit_count INTEGER NOT NULL DEFAULT 0,
|
|
937
|
+
lines_added INTEGER NOT NULL DEFAULT 0,
|
|
938
|
+
lines_deleted INTEGER NOT NULL DEFAULT 0,
|
|
939
|
+
distinct_authors INTEGER NOT NULL DEFAULT 0,
|
|
940
|
+
dominant_author TEXT,
|
|
941
|
+
dominant_author_share REAL DEFAULT 0,
|
|
942
|
+
last_touched TEXT
|
|
943
|
+
);
|
|
944
|
+
CREATE INDEX IF NOT EXISTS idx_file_churn_cc ON file_churn(commit_count);
|
|
945
|
+
|
|
946
|
+
CREATE TABLE IF NOT EXISTS function_churn (
|
|
947
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
948
|
+
function_id INTEGER REFERENCES functions(id) ON DELETE CASCADE,
|
|
949
|
+
function_name TEXT NOT NULL,
|
|
950
|
+
file_path TEXT NOT NULL,
|
|
951
|
+
commit_count INTEGER NOT NULL DEFAULT 0,
|
|
952
|
+
distinct_authors INTEGER NOT NULL DEFAULT 0,
|
|
953
|
+
dominant_author TEXT,
|
|
954
|
+
dominant_author_share REAL DEFAULT 0,
|
|
955
|
+
renamed INTEGER DEFAULT 0,
|
|
956
|
+
confidence REAL DEFAULT 1.0
|
|
957
|
+
);
|
|
958
|
+
CREATE INDEX IF NOT EXISTS idx_func_churn_fid ON function_churn(function_id);
|
|
959
|
+
|
|
960
|
+
CREATE TABLE IF NOT EXISTS hotspot_scores (
|
|
961
|
+
target TEXT PRIMARY KEY,
|
|
962
|
+
type TEXT NOT NULL,
|
|
963
|
+
score REAL NOT NULL DEFAULT 0,
|
|
964
|
+
churn_pct REAL NOT NULL DEFAULT 0,
|
|
965
|
+
complexity_pct REAL NOT NULL DEFAULT 0,
|
|
966
|
+
commit_count INTEGER NOT NULL DEFAULT 0,
|
|
967
|
+
distinct_authors INTEGER NOT NULL DEFAULT 0,
|
|
968
|
+
dominant_author TEXT,
|
|
969
|
+
dominant_author_share REAL DEFAULT 0,
|
|
970
|
+
bus_factor_risk INTEGER DEFAULT 0,
|
|
971
|
+
complexity INTEGER NOT NULL DEFAULT 0,
|
|
972
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
973
|
+
);
|
|
974
|
+
CREATE INDEX IF NOT EXISTS idx_hotspot_scores_score ON hotspot_scores(score DESC);
|
|
975
|
+
|
|
976
|
+
CREATE TABLE IF NOT EXISTS dry_pair_history (
|
|
977
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
978
|
+
pair_fingerprint TEXT NOT NULL,
|
|
979
|
+
file1 TEXT NOT NULL,
|
|
980
|
+
symbol1 TEXT,
|
|
981
|
+
line1 INTEGER NOT NULL,
|
|
982
|
+
content_hash1 TEXT NOT NULL,
|
|
983
|
+
file2 TEXT NOT NULL,
|
|
984
|
+
symbol2 TEXT,
|
|
985
|
+
line2 INTEGER NOT NULL,
|
|
986
|
+
content_hash2 TEXT NOT NULL,
|
|
987
|
+
similarity REAL NOT NULL,
|
|
988
|
+
timestamp TEXT DEFAULT (datetime('now')),
|
|
989
|
+
run_id TEXT NOT NULL
|
|
990
|
+
);
|
|
991
|
+
CREATE INDEX IF NOT EXISTS idx_dph_fingerprint ON dry_pair_history(pair_fingerprint);
|
|
992
|
+
CREATE INDEX IF NOT EXISTS idx_dph_run ON dry_pair_history(run_id);
|
|
993
|
+
`);
|
|
994
|
+
// Migration 5 → 6: Graph cache for call/import graph construction (Spec 14)
|
|
995
|
+
this.migrateFrom(currentVersion, 6, `
|
|
996
|
+
CREATE TABLE IF NOT EXISTS graph_cache (
|
|
997
|
+
graph_type TEXT NOT NULL,
|
|
998
|
+
node_key TEXT NOT NULL,
|
|
999
|
+
neighbor_key TEXT NOT NULL,
|
|
1000
|
+
weight REAL NOT NULL,
|
|
1001
|
+
PRIMARY KEY (graph_type, node_key, neighbor_key)
|
|
1002
|
+
);
|
|
1003
|
+
CREATE INDEX IF NOT EXISTS idx_gc_type_node ON graph_cache(graph_type, node_key);
|
|
1004
|
+
CREATE INDEX IF NOT EXISTS idx_gc_type_neighbor ON graph_cache(graph_type, neighbor_key);
|
|
1005
|
+
`);
|
|
1006
|
+
// Migration 6 → 7: Coverage data for cross-domain analysis (Spec 15)
|
|
1007
|
+
this.migrateFrom(currentVersion, 7, `
|
|
1008
|
+
CREATE TABLE IF NOT EXISTS coverage_data (
|
|
1009
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1010
|
+
function_name TEXT NOT NULL,
|
|
1011
|
+
file_path TEXT NOT NULL,
|
|
1012
|
+
line_number INTEGER,
|
|
1013
|
+
basis TEXT NOT NULL DEFAULT 'static-reach',
|
|
1014
|
+
covered INTEGER NOT NULL DEFAULT 0,
|
|
1015
|
+
source TEXT,
|
|
1016
|
+
imported_at TEXT DEFAULT (datetime('now')),
|
|
1017
|
+
UNIQUE(function_name, file_path, line_number)
|
|
1018
|
+
);
|
|
1019
|
+
CREATE INDEX IF NOT EXISTS idx_cov_basis ON coverage_data(basis);
|
|
1020
|
+
CREATE INDEX IF NOT EXISTS idx_cov_covered ON coverage_data(covered);
|
|
1021
|
+
CREATE INDEX IF NOT EXISTS idx_cov_function ON coverage_data(function_name);
|
|
1022
|
+
`);
|
|
1023
|
+
}
|
|
1024
|
+
/** Migration 7 → 8: export_kind on conventions (Spec 22 R5.1). */
|
|
1025
|
+
migrateConventionsExportKind(currentVersion) {
|
|
1026
|
+
// Migration 7 → 8: export_kind on conventions (Spec 22 R5.1)
|
|
1027
|
+
if (currentVersion < 8) {
|
|
1028
|
+
const cols = this.db
|
|
1029
|
+
.prepare(`PRAGMA table_info('conventions')`)
|
|
1030
|
+
.all();
|
|
1031
|
+
if (!cols.some((c) => c.name === 'export_kind')) {
|
|
1032
|
+
this.db.exec(`ALTER TABLE conventions ADD COLUMN export_kind TEXT`);
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
/** Migration 8 → 9 / 9 → 10 / 10 → 11 — detached-run lifecycle + queryable
|
|
1037
|
+
* coverage (Spec 41), PID-based lease liveness (Spec 41 Amendment B), and
|
|
1038
|
+
* unread stylesheet sources (Spec 45 R5). */
|
|
1039
|
+
migrateRunLifecycle(currentVersion) {
|
|
1040
|
+
// Migration 8 → 9: Detached-run lifecycle + queryable coverage (Spec 41).
|
|
1041
|
+
// `findings_ledger_runs` gains the job-lifecycle columns (status, timing,
|
|
1042
|
+
// provenance, lease heartbeat, progress, stderr log); the one genuinely new
|
|
1043
|
+
// table is `findings_ledger_coverage` (per-rule state + reason rows that
|
|
1044
|
+
// `writeAuditToLedger` previously dropped).
|
|
1045
|
+
this.addRunColumns(currentVersion, 9, [
|
|
1046
|
+
['status', "TEXT NOT NULL DEFAULT 'completed'"],
|
|
1047
|
+
['project_root', 'TEXT'],
|
|
1048
|
+
['started_at', 'TEXT'],
|
|
1049
|
+
['heartbeat_at', 'TEXT'],
|
|
1050
|
+
['finished_at', 'TEXT'],
|
|
1051
|
+
['error', 'TEXT'],
|
|
1052
|
+
['progress_json', 'TEXT'],
|
|
1053
|
+
['stderr_log', 'TEXT'],
|
|
1054
|
+
['content_hash', 'TEXT'],
|
|
1055
|
+
['files_count', 'INTEGER'],
|
|
1056
|
+
['file_manifest_json', 'TEXT'],
|
|
1057
|
+
]);
|
|
1058
|
+
this.migrateFrom(currentVersion, 9, `
|
|
1059
|
+
CREATE TABLE IF NOT EXISTS findings_ledger_coverage (
|
|
1060
|
+
run_id TEXT NOT NULL REFERENCES findings_ledger_runs(run_id) ON DELETE CASCADE,
|
|
1061
|
+
analyzer TEXT NOT NULL,
|
|
1062
|
+
rule_id TEXT NOT NULL,
|
|
1063
|
+
state TEXT NOT NULL,
|
|
1064
|
+
count INTEGER NOT NULL DEFAULT 0,
|
|
1065
|
+
reason TEXT,
|
|
1066
|
+
PRIMARY KEY (run_id, analyzer, rule_id)
|
|
1067
|
+
);
|
|
1068
|
+
CREATE INDEX IF NOT EXISTS idx_ledger_coverage_run ON findings_ledger_coverage(run_id);
|
|
1069
|
+
`);
|
|
1070
|
+
// Migration 9 → 10: PID-based lease liveness (Spec 41 Amendment B).
|
|
1071
|
+
// The heartbeat is no longer the primary liveness signal for the common
|
|
1072
|
+
// case (a healthy child whose synchronous `syncFileIndex` phase starves the
|
|
1073
|
+
// event loop, so its heartbeat interval cannot fire). The child records its
|
|
1074
|
+
// PID + process start time + hostname at lease claim; `reclaimStaleRunning`
|
|
1075
|
+
// then skips any `running` row whose PID is still the same live process, and
|
|
1076
|
+
// only reclaims when the process is genuinely gone (or on a foreign host,
|
|
1077
|
+
// where the PID means nothing and the heartbeat stays the fallback).
|
|
1078
|
+
this.addRunColumns(currentVersion, 10, [
|
|
1079
|
+
['runner_pid', 'INTEGER'],
|
|
1080
|
+
['runner_pid_started_at', 'TEXT'],
|
|
1081
|
+
['runner_host', 'TEXT'],
|
|
1082
|
+
]);
|
|
1083
|
+
// Migration 10 → 11: unread stylesheet sources (Spec 45 R5).
|
|
1084
|
+
// Records stylesheets whose dialect the style indexer cannot read, so
|
|
1085
|
+
// styles/undefined-class findings can carry them as incomplete-definition
|
|
1086
|
+
// context instead of asserting a class is undefined against the whole project.
|
|
1087
|
+
this.migrateFrom(currentVersion, 11, `
|
|
1088
|
+
CREATE TABLE IF NOT EXISTS style_unread_sources (
|
|
1089
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1090
|
+
file_path TEXT NOT NULL UNIQUE,
|
|
1091
|
+
reason TEXT NOT NULL,
|
|
1092
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
1093
|
+
);
|
|
1094
|
+
`);
|
|
1095
|
+
}
|
|
1096
|
+
/** Migration 11 → 12: defined-class catalog (Spec 45 — styles/undefined-class). */
|
|
1097
|
+
migrateStyleCatalog(currentVersion) {
|
|
1098
|
+
// Migration 11 → 12: defined-class catalog (Spec 45 — styles/undefined-class).
|
|
1099
|
+
// A dedicated (class_name, file_path) table so the undefined-class detector
|
|
1100
|
+
// can resolve a class name with an indexed `class_name IN (...)` lookup
|
|
1101
|
+
// instead of loading every style_declarations row and regex-extracting
|
|
1102
|
+
// selectors from `context` in JS. Populated by the style indexer on insert;
|
|
1103
|
+
// backfilled here once so an in-place upgrade does not leave the catalog
|
|
1104
|
+
// empty (unchanged-file hashing would otherwise skip the re-extract).
|
|
1105
|
+
if (currentVersion < 12) {
|
|
1106
|
+
this.db.exec(`
|
|
1107
|
+
CREATE TABLE IF NOT EXISTS style_defined_classes (
|
|
1108
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1109
|
+
class_name TEXT NOT NULL,
|
|
1110
|
+
file_path TEXT NOT NULL,
|
|
1111
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
1112
|
+
UNIQUE(class_name, file_path)
|
|
1113
|
+
);
|
|
1114
|
+
CREATE INDEX IF NOT EXISTS idx_style_defined_class_name ON style_defined_classes(class_name);
|
|
1115
|
+
`);
|
|
1116
|
+
const definedRows = this.db
|
|
1117
|
+
.prepare('SELECT DISTINCT context, file_path FROM style_declarations WHERE context IS NOT NULL')
|
|
1118
|
+
.all();
|
|
1119
|
+
const insertDefined = this.db.prepare('INSERT OR IGNORE INTO style_defined_classes (class_name, file_path) VALUES (?, ?)');
|
|
1120
|
+
const backfill = this.db.transaction(() => {
|
|
1121
|
+
for (const r of definedRows) {
|
|
1122
|
+
for (const m of r.context.matchAll(/\.([a-zA-Z0-9_-]+)/g)) {
|
|
1123
|
+
insertDefined.run(m[1], r.file_path);
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
});
|
|
1127
|
+
backfill();
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
/** Migrations 12 → 18 — import_specifiers, schema_usage identity/origin,
|
|
1131
|
+
* tool_git_sha, the signature-column removal (Spec 63 R6), and phase_facts. */
|
|
1132
|
+
migrateSchemaUsageAndSignature(currentVersion) {
|
|
1133
|
+
// Migration 12 → 13: import_specifiers (Spec 60 — import classification at
|
|
1134
|
+
// emission). One row per static import specifier occurrence, classified
|
|
1135
|
+
// package / unresolved-alias / internal-resolved / internal-broken /
|
|
1136
|
+
// unresolved-virtual (Spec 60.1 widened the three-class scheme to five;
|
|
1137
|
+
// `classification` is free TEXT, no constraint, so no further migration).
|
|
1138
|
+
// Nothing consumes it yet (Spec 61 persists edges; Spec 62 derives coverage).
|
|
1139
|
+
// Flat — resolved_path inline, no lookup table, no join.
|
|
1140
|
+
this.migrateFrom(currentVersion, 13, `
|
|
1141
|
+
CREATE TABLE IF NOT EXISTS import_specifiers (
|
|
1142
|
+
file_path TEXT NOT NULL,
|
|
1143
|
+
specifier TEXT NOT NULL,
|
|
1144
|
+
classification TEXT NOT NULL,
|
|
1145
|
+
resolved_path TEXT,
|
|
1146
|
+
line INTEGER,
|
|
1147
|
+
PRIMARY KEY (file_path, specifier, line)
|
|
1148
|
+
);
|
|
1149
|
+
CREATE INDEX IF NOT EXISTS idx_import_specifiers_class ON import_specifiers(classification);
|
|
1150
|
+
CREATE INDEX IF NOT EXISTS idx_import_specifiers_resolved ON import_specifiers(resolved_path);
|
|
1151
|
+
`);
|
|
1152
|
+
// Migration 13 → 14: schema_usage identity becomes a coordinate (Spec 61
|
|
1153
|
+
// Amendment A). function_name stops holding source text and becomes the
|
|
1154
|
+
// nullable display name (null for anonymous handlers); identity is the
|
|
1155
|
+
// inline (file_path, function_start_line, function_start_column) coordinate.
|
|
1156
|
+
// function_name drops its NOT NULL so anonymous handlers store NULL, distinct
|
|
1157
|
+
// from 'top-level' (function_start_line IS NULL). Old rows keep their
|
|
1158
|
+
// (now-legacy) names but are regenerated on the next per-file sync.
|
|
1159
|
+
if (currentVersion < 14) {
|
|
1160
|
+
const suCols = this.db
|
|
1161
|
+
.prepare(`PRAGMA table_info('schema_usage')`)
|
|
1162
|
+
.all();
|
|
1163
|
+
if (!suCols.some((c) => c.name === 'function_start_line')) {
|
|
1164
|
+
this.db.exec(`
|
|
1165
|
+
ALTER TABLE schema_usage RENAME TO schema_usage_old;
|
|
1166
|
+
CREATE TABLE schema_usage (
|
|
1167
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1168
|
+
schema_id TEXT,
|
|
1169
|
+
table_name TEXT NOT NULL,
|
|
1170
|
+
file_path TEXT NOT NULL,
|
|
1171
|
+
function_name TEXT,
|
|
1172
|
+
function_start_line INTEGER,
|
|
1173
|
+
function_start_column INTEGER,
|
|
1174
|
+
usage_type TEXT NOT NULL,
|
|
1175
|
+
line INTEGER,
|
|
1176
|
+
"column" INTEGER,
|
|
1177
|
+
raw_query TEXT,
|
|
1178
|
+
parameters TEXT,
|
|
1179
|
+
origin TEXT,
|
|
1180
|
+
recorded_at TEXT DEFAULT (datetime('now'))
|
|
1181
|
+
);
|
|
1182
|
+
INSERT INTO schema_usage (id, schema_id, table_name, file_path, function_name, usage_type, line, "column", raw_query, parameters, recorded_at)
|
|
1183
|
+
SELECT id, schema_id, table_name, file_path, function_name, usage_type, line, "column", raw_query, parameters, recorded_at FROM schema_usage_old;
|
|
1184
|
+
DROP TABLE schema_usage_old;
|
|
1185
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_table ON schema_usage(table_name);
|
|
1186
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_file ON schema_usage(file_path);
|
|
1187
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_function ON schema_usage(function_name);
|
|
1188
|
+
CREATE INDEX IF NOT EXISTS idx_schema_usage_usage_type ON schema_usage(usage_type);
|
|
1189
|
+
`);
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
// Migration 14 → 15: tool's own git sha on the run (the second axis next to
|
|
1193
|
+
// tool_version). `git_sha` already records the *audited project* commit; this
|
|
1194
|
+
// records the *code-auditor* commit so a count change is attributable to a
|
|
1195
|
+
// tool commit, not just a version. NULL when running from a published
|
|
1196
|
+
// install (no .git) — best-effort, and tool_version stays always-present.
|
|
1197
|
+
this.addRunColumns(currentVersion, 15, [['tool_git_sha', 'TEXT']]);
|
|
1198
|
+
// Migration 15 → 16: schema_usage gains an `origin` column. Rows produced by
|
|
1199
|
+
// the knex-style fluent-builder read extractor carry `origin = 'query-builder'`;
|
|
1200
|
+
// every other extractor (raw SQL, tagged template, .sql, ORM) leaves it NULL.
|
|
1201
|
+
// The cross-domain lifecycle rules use it to exempt tables whose usage is
|
|
1202
|
+
// entirely query-builder — scratch/test tables built and consumed through the
|
|
1203
|
+
// fluent builder are not one-sided lifecycle defects.
|
|
1204
|
+
if (currentVersion < 16) {
|
|
1205
|
+
const suCols = this.db
|
|
1206
|
+
.prepare(`PRAGMA table_info('schema_usage')`)
|
|
1207
|
+
.all();
|
|
1208
|
+
if (!suCols.some((c) => c.name === 'origin')) {
|
|
1209
|
+
this.db.exec(`ALTER TABLE schema_usage ADD COLUMN origin TEXT`);
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
// Migration 16 → 17: Spec 63 R6 dropped the always-empty `signature` column
|
|
1213
|
+
// and the `signature` term of `computeContentHash`. Two consequences for a
|
|
1214
|
+
// pre-bump index:
|
|
1215
|
+
// 1. Every stored `content_hash` was computed under the old `body|signature`
|
|
1216
|
+
// formula, so it no longer matches what `detectChangedFunctions`
|
|
1217
|
+
// recomputes — a stale index left in place would be *silently consumed*
|
|
1218
|
+
// (a no-edit `changed` run reports the whole file changed and attributes
|
|
1219
|
+
// it to the code, not the index).
|
|
1220
|
+
// 2. The `functions.signature` column (always `''`) and its FTS mirror must
|
|
1221
|
+
// go. SQLite refuses `DROP COLUMN` while the FTS triggers reference the
|
|
1222
|
+
// column, so the triggers and FTS table are dropped first, the column is
|
|
1223
|
+
// dropped, and the FTS surface is rebuilt without `signature`.
|
|
1224
|
+
migrateSchemaUsageToV17(this.db, currentVersion);
|
|
1225
|
+
// Migration 17 → 18: the phase facts store (Spec 68 §12). The index stops
|
|
1226
|
+
// being a function cache and becomes the processed-facts store of record:
|
|
1227
|
+
// per-file workers return serialized fact fragments, the parent writes them
|
|
1228
|
+
// here in batched transactions, and corpus processors + rules read them back
|
|
1229
|
+
// read-only under WAL (§6.2/§6.3). One row per (fact_kind, file_path); corpus
|
|
1230
|
+
// facts (e.g. `resolution`, `reachability`) carry a NULL file_path.
|
|
1231
|
+
this.migrateFrom(currentVersion, 18, `
|
|
1232
|
+
CREATE TABLE IF NOT EXISTS phase_facts (
|
|
1233
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1234
|
+
fact_kind TEXT NOT NULL,
|
|
1235
|
+
file_path TEXT,
|
|
1236
|
+
payload TEXT NOT NULL,
|
|
1237
|
+
created_at TEXT DEFAULT (datetime('now'))
|
|
1238
|
+
);
|
|
1239
|
+
CREATE INDEX IF NOT EXISTS idx_phase_facts_kind_file ON phase_facts(fact_kind, file_path);
|
|
1240
|
+
`);
|
|
1241
|
+
// Migration 18 → 19: functions gains a `file_hash` — the content-hash of the
|
|
1242
|
+
// file's whole normalized source — so `detectChangedFunctions` can skip the
|
|
1243
|
+
// tree-sitter re-scan when a file's content is unchanged since its last
|
|
1244
|
+
// index sync (the warm path for `changed` on an already-indexed file). The
|
|
1245
|
+
// column is NULL until the first sync writes it; a NULL file_hash never
|
|
1246
|
+
// short-circuits, so an in-place-upgraded index degrades to the old always-
|
|
1247
|
+
// scan behavior until its next sync, with no correctness gap.
|
|
1248
|
+
if (currentVersion < 19) {
|
|
1249
|
+
const fnCols = this.db
|
|
1250
|
+
.prepare(`PRAGMA table_info('functions')`)
|
|
1251
|
+
.all();
|
|
1252
|
+
if (!fnCols.some((c) => c.name === 'file_hash')) {
|
|
1253
|
+
this.db.exec(`ALTER TABLE functions ADD COLUMN file_hash TEXT`);
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
// ── SQLite schema ───────────────────────────────────────────────────
|
|
1258
|
+
/** Whether a table already exists in the connected database. */
|
|
1259
|
+
tableExists(name) {
|
|
1260
|
+
const row = this.db.prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`).get(name);
|
|
1261
|
+
return row !== undefined;
|
|
1262
|
+
}
|
|
1263
|
+
/**
|
|
1264
|
+
* Create the index schema, upgrading an existing index in place or stamping a
|
|
1265
|
+
* fresh one at the current version.
|
|
1266
|
+
* @param schemaVersion The schema version to record after creation or upgrade.
|
|
1267
|
+
*/
|
|
1268
|
+
createSchema(schemaVersion) {
|
|
1269
|
+
// A fresh database is created by `CREATE TABLE` in SCHEMA_DDL at the
|
|
1270
|
+
// *current* schema shape — there is no history to replay. Migrations run
|
|
1271
|
+
// only against an existing index being upgraded in place. Stamping a fresh DB
|
|
1272
|
+
// at the current version and skipping the blocks turns "every future migration
|
|
1273
|
+
// author must remember to write an idempotence guard" into "there is nothing
|
|
1274
|
+
// to guard against" — the same structural move as the tier function and the
|
|
1275
|
+
// exhaustiveness assertion. Detected before the exec because `functions` is
|
|
1276
|
+
// created by it.
|
|
1277
|
+
const isFresh = !this.tableExists('functions');
|
|
1278
|
+
// Spec 70 — refuse a *future* index before touching it. An index written by a
|
|
1279
|
+
// newer code-auditor carries a schema_version above this build's; running the
|
|
1280
|
+
// DDL and stamping `schema_version` over it would silently downgrade the index
|
|
1281
|
+
// and then fail with a cryptic column error on the first query against the
|
|
1282
|
+
// unknown shape. Read the stored version first (only an existing index has a
|
|
1283
|
+
// `meta` table to read) and decline cleanly, naming both versions, so a
|
|
1284
|
+
// future-index upgrade is an upgrade, never a corruption.
|
|
1285
|
+
let storedVersion = null;
|
|
1286
|
+
if (!isFresh) {
|
|
1287
|
+
storedVersion = this.readSchemaVersion();
|
|
1288
|
+
if (storedVersion !== null && storedVersion > schemaVersion) {
|
|
1289
|
+
throw new ContextualError(`Code index schema version ${storedVersion} is newer than this build supports (${schemaVersion}). ` +
|
|
1290
|
+
'The index was written by a newer code-auditor; upgrade code-auditor or point it at a different index.', { storedSchemaVersion: storedVersion, supportedSchemaVersion: schemaVersion });
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
this.db.exec(SCHEMA_DDL);
|
|
1294
|
+
// Run schema migrations (only an existing index needs upgrading)
|
|
1295
|
+
if (!isFresh) {
|
|
1296
|
+
this.runMigrations(storedVersion ?? 0);
|
|
1297
|
+
}
|
|
1298
|
+
// Record schema version
|
|
1299
|
+
this.db.prepare(`INSERT OR REPLACE INTO meta (key, value) VALUES ('schema_version', ?)`).run(String(schemaVersion));
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
//# sourceMappingURL=migrations.js.map
|