code-auditor-mcp 4.1.1 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +338 -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 +424 -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 +328 -0
- package/dist/analyzers/receiverRoot.d.ts.map +1 -0
- package/dist/analyzers/receiverRoot.js +990 -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 +231 -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 +64 -1
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +1538 -1033
- 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 +969 -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 +2 -0
- 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/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 +468 -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 +1027 -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 +200 -0
- package/dist/phase/receiverConsumers.d.ts.map +1 -0
- package/dist/phase/receiverConsumers.js +1025 -0
- package/dist/phase/receiverConsumers.js.map +1 -0
- package/dist/phase/receiverProvenance.d.ts +97 -0
- package/dist/phase/receiverProvenance.d.ts.map +1 -0
- package/dist/phase/receiverProvenance.js +337 -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 +2191 -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 +101 -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 +11 -5
- package/plugin/.claude-plugin/manifest.json +16 -0
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/hooks.json +6 -2
- package/plugin/scripts/hook-audit.sh +41 -14
- package/plugin/scripts/hook-common.sh +50 -5
- package/plugin/scripts/hook-drift-check.sh +72 -0
- package/plugin/scripts/hook-self-audit.sh +17 -12
- package/plugin/skills/code-auditor/SKILL.md +1 -1
- package/server.json +2 -2
package/dist/mcp.js
CHANGED
|
@@ -66,8 +66,9 @@ import chalk from 'chalk';
|
|
|
66
66
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
67
67
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
68
68
|
import { CallToolRequestSchema, ListToolsRequestSchema, InitializeRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
69
|
-
import { createWriteStream, mkdirSync } from 'node:fs';
|
|
69
|
+
import { createWriteStream, mkdirSync, realpathSync } from 'node:fs';
|
|
70
70
|
import fs from 'node:fs/promises';
|
|
71
|
+
import { fileURLToPath } from 'node:url';
|
|
71
72
|
import { createAuditRunner } from './auditRunner.js';
|
|
72
73
|
import { searchFunctions, findDefinition, syncFileIndex, getDatabase } from './codeIndexService.js';
|
|
73
74
|
import { CodeMapGenerator } from './services/CodeMapGenerator.js';
|
|
@@ -75,17 +76,21 @@ import { analyzeDocumentation } from './analyzers/documentationAnalyzer.js';
|
|
|
75
76
|
import { ConfigGeneratorFactory } from './generators/ConfigGeneratorFactory.js';
|
|
76
77
|
import { resolveConfigGenerateDir } from './config/configGeneratePath.js';
|
|
77
78
|
import { getInstallId, getTelemetryOptIn, setTelemetryOptIn, PRIVACY_MESSAGE, resolveTelemetryEndpoint } from './installConfig.js';
|
|
78
|
-
import { MCP_DEFAULT_ANALYZERS } from './analyzers/ruleRegistry.js';
|
|
79
79
|
import { DEFAULT_SERVER_URL, IS_DEV_MODE, PACKAGE_VERSION } from './constants.js';
|
|
80
80
|
import { resolveMcpDevLogPath } from './dataPaths.js';
|
|
81
81
|
import { getAuditJobStatus, getAuditResultsPage, getAuditResultsAsSarif, startAuditJob } from './mcpAuditJobs.js';
|
|
82
82
|
import { CodeIndexDB } from './codeIndexDB.js';
|
|
83
|
+
import { errorMessage } from './utils/errorMessage.js';
|
|
83
84
|
import { logMcpDebug, logMcpInfo, mcpDebugStderr, mcpTraceStderr } from './mcpDiagnostics.js';
|
|
84
85
|
import { assertAuditPathExists, formatMcpToolErrorPayload } from './mcpToolErrors.js';
|
|
85
86
|
import { ToolRegistry } from './tool-registry.js';
|
|
86
87
|
import { initParsers } from './languages/index.js';
|
|
87
88
|
// ── Console / logging setup ──────────────────────────────────────────────────
|
|
88
89
|
const originalConsoleError = console.error;
|
|
90
|
+
// Tool input-schema descriptions, hoisted so the repeated schema entries
|
|
91
|
+
// share one source.
|
|
92
|
+
const OPTION_ANALYZER_OVERRIDES = 'Analyzer-specific configuration overrides.';
|
|
93
|
+
const PROJECT_ROOT_DESCRIPTION = 'Project root.';
|
|
89
94
|
let logStream = null;
|
|
90
95
|
if (IS_DEV_MODE) {
|
|
91
96
|
// Dev mode is opt-in (`--dev`); even so, the log lives in the OS cache, never
|
|
@@ -134,10 +139,17 @@ async function withAbortSignal(signal, phase, op) {
|
|
|
134
139
|
return new Promise((resolve, reject) => {
|
|
135
140
|
const onAbort = () => reject(new RequestAbortedError(`Request aborted during ${phase}`));
|
|
136
141
|
signal.addEventListener('abort', onAbort, { once: true });
|
|
137
|
-
void
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
142
|
+
void (async () => {
|
|
143
|
+
try {
|
|
144
|
+
resolve(await op());
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
reject(err);
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
signal.removeEventListener('abort', onAbort);
|
|
151
|
+
}
|
|
152
|
+
})();
|
|
141
153
|
});
|
|
142
154
|
}
|
|
143
155
|
function serializeForMcp(value) {
|
|
@@ -209,469 +221,386 @@ function registerProcessReliabilityHandlers() {
|
|
|
209
221
|
}
|
|
210
222
|
}
|
|
211
223
|
// ── Tool registration ────────────────────────────────────────────────────────
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
description: 'File or directory path to audit (defaults to current directory).',
|
|
225
|
-
default: process.cwd(),
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
name: 'analyzers',
|
|
229
|
-
type: 'array',
|
|
230
|
-
required: false,
|
|
231
|
-
description: `Analyzers to run (default: ${DEFAULT_ANALYZERS.join(', ')}).`,
|
|
232
|
-
default: DEFAULT_ANALYZERS,
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
name: 'minSeverity',
|
|
236
|
-
type: 'string',
|
|
237
|
-
required: false,
|
|
238
|
-
description: 'Minimum severity level to report (high included by default).',
|
|
239
|
-
default: 'high',
|
|
240
|
-
enum: ['high', 'severe', 'critical'],
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
name: 'indexFunctions',
|
|
244
|
-
type: 'boolean',
|
|
245
|
-
required: false,
|
|
246
|
-
description: 'Index functions during audit (default: true).',
|
|
247
|
-
default: true,
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
name: 'analyzerConfigs',
|
|
251
|
-
type: 'object',
|
|
252
|
-
required: false,
|
|
253
|
-
description: 'Analyzer-specific configuration overrides.',
|
|
254
|
-
},
|
|
255
|
-
{
|
|
256
|
-
name: 'scope',
|
|
257
|
-
type: 'string',
|
|
258
|
-
required: false,
|
|
259
|
-
description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
|
|
260
|
-
default: 'all',
|
|
261
|
-
},
|
|
262
|
-
],
|
|
263
|
-
handler: async (args, signal) => {
|
|
264
|
-
return withAbortSignal(signal, 'audit.run', async () => {
|
|
265
|
-
const auditPath = path.resolve(args.path || process.cwd());
|
|
266
|
-
await assertAuditPathExists(auditPath);
|
|
267
|
-
const analyzers = args.analyzers ?? DEFAULT_ANALYZERS;
|
|
268
|
-
const minSeverity = (args.minSeverity || 'high');
|
|
269
|
-
const indexFunctions = args.indexFunctions !== false;
|
|
270
|
-
const db = CodeIndexDB.getInstance();
|
|
271
|
-
await db.initialize();
|
|
272
|
-
const storedConfigs = await db.getAllAnalyzerConfigs(auditPath);
|
|
273
|
-
const analyzerConfigs = {
|
|
274
|
-
...storedConfigs,
|
|
275
|
-
...(args.analyzerConfigs || {}),
|
|
276
|
-
};
|
|
277
|
-
const scope = args.scope || 'all';
|
|
278
|
-
const runner = createAuditRunner({
|
|
279
|
-
projectRoot: auditPath,
|
|
280
|
-
enabledAnalyzers: analyzers,
|
|
281
|
-
minSeverity,
|
|
282
|
-
verbose: false,
|
|
283
|
-
indexFunctions,
|
|
284
|
-
scope: scope !== 'all' ? scope : undefined,
|
|
285
|
-
...(Object.keys(analyzerConfigs).length > 0 && { analyzerConfigs }),
|
|
286
|
-
});
|
|
287
|
-
const auditResult = await runner.run();
|
|
288
|
-
if (indexFunctions && auditResult.metadata.fileToFunctionsMap) {
|
|
289
|
-
try {
|
|
290
|
-
for (const [filePath, functions] of Object.entries(auditResult.metadata.fileToFunctionsMap)) {
|
|
291
|
-
await syncFileIndex(filePath, functions);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
catch {
|
|
295
|
-
// indexing is best-effort for sync audit
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
return {
|
|
299
|
-
success: true,
|
|
300
|
-
summary: auditResult.summary,
|
|
301
|
-
violations: auditResult.analyzerResults,
|
|
302
|
-
metadata: auditResult.metadata,
|
|
303
|
-
guidance: 'The audit takes readings, not verdicts. Severity is urgency — how fast a defect bites, never whether you may ignore it; there is no "noise" tier. Work criticals first, then severe, then high. The coverage panel tells you what was actually measured. Documentation readings (missing JSDoc) are maintainability gaps. If you decline a reading, record why instead of silently dismissing it.',
|
|
304
|
-
};
|
|
305
|
-
});
|
|
224
|
+
// ── audit ──────────────────────────────────────────────────────────────────
|
|
225
|
+
const auditActions = [
|
|
226
|
+
{
|
|
227
|
+
name: 'run',
|
|
228
|
+
description: 'Run a synchronous audit on the specified path. Returns a full audit result with violations.',
|
|
229
|
+
parameters: [
|
|
230
|
+
{
|
|
231
|
+
name: 'path',
|
|
232
|
+
type: 'string',
|
|
233
|
+
required: false,
|
|
234
|
+
description: 'File or directory path to audit (defaults to current directory).',
|
|
235
|
+
default: process.cwd(),
|
|
306
236
|
},
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
type: 'string',
|
|
315
|
-
required: false,
|
|
316
|
-
description: 'File or directory path to audit (defaults to current directory).',
|
|
317
|
-
default: process.cwd(),
|
|
318
|
-
},
|
|
319
|
-
{
|
|
320
|
-
name: 'analyzers',
|
|
321
|
-
type: 'array',
|
|
322
|
-
required: false,
|
|
323
|
-
description: `Analyzers to run (default: ${DEFAULT_ANALYZERS.join(', ')}).`,
|
|
324
|
-
default: DEFAULT_ANALYZERS,
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
name: 'minSeverity',
|
|
328
|
-
type: 'string',
|
|
329
|
-
required: false,
|
|
330
|
-
description: 'Minimum severity level to report (high included by default).',
|
|
331
|
-
default: 'high',
|
|
332
|
-
enum: ['high', 'severe', 'critical'],
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
name: 'indexFunctions',
|
|
336
|
-
type: 'boolean',
|
|
337
|
-
required: false,
|
|
338
|
-
description: 'Index functions during audit (default: true).',
|
|
339
|
-
default: true,
|
|
340
|
-
},
|
|
341
|
-
{
|
|
342
|
-
name: 'analyzerConfigs',
|
|
343
|
-
type: 'object',
|
|
344
|
-
required: false,
|
|
345
|
-
description: 'Analyzer-specific configuration overrides.',
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
name: 'scope',
|
|
349
|
-
type: 'string',
|
|
350
|
-
required: false,
|
|
351
|
-
description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
|
|
352
|
-
default: 'all',
|
|
353
|
-
},
|
|
354
|
-
{
|
|
355
|
-
name: 'analyzerConcurrency',
|
|
356
|
-
type: 'number',
|
|
357
|
-
required: false,
|
|
358
|
-
description: 'Max analyzers to run in parallel (default: 1).',
|
|
359
|
-
default: 1,
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
name: 'partitionStrategy',
|
|
363
|
-
type: 'string',
|
|
364
|
-
required: false,
|
|
365
|
-
description: 'Partition mode: none | auto | top-level.',
|
|
366
|
-
default: 'auto',
|
|
367
|
-
enum: ['none', 'auto', 'top-level'],
|
|
368
|
-
},
|
|
369
|
-
{
|
|
370
|
-
name: 'maxPartitions',
|
|
371
|
-
type: 'number',
|
|
372
|
-
required: false,
|
|
373
|
-
description: 'Maximum number of folder partitions (default: 4).',
|
|
374
|
-
default: 4,
|
|
375
|
-
},
|
|
376
|
-
{
|
|
377
|
-
name: 'partitionThresholdFiles',
|
|
378
|
-
type: 'number',
|
|
379
|
-
required: false,
|
|
380
|
-
description: 'Minimum files before auto partitioning (default: 250).',
|
|
381
|
-
default: 250,
|
|
382
|
-
},
|
|
383
|
-
{
|
|
384
|
-
name: 'workerCount',
|
|
385
|
-
type: 'number',
|
|
386
|
-
required: false,
|
|
387
|
-
description: 'Number of worker processes (default: min(4, CPU-1)).',
|
|
388
|
-
},
|
|
389
|
-
{
|
|
390
|
-
name: 'maxRetries',
|
|
391
|
-
type: 'number',
|
|
392
|
-
required: false,
|
|
393
|
-
description: 'Retry attempts per shard (default: 1).',
|
|
394
|
-
default: 1,
|
|
395
|
-
},
|
|
396
|
-
{
|
|
397
|
-
name: 'shardTimeoutMs',
|
|
398
|
-
type: 'number',
|
|
399
|
-
required: false,
|
|
400
|
-
description: 'Per-shard timeout in ms (default: 180000).',
|
|
401
|
-
default: 180000,
|
|
402
|
-
},
|
|
403
|
-
{
|
|
404
|
-
name: 'retryBackoffMs',
|
|
405
|
-
type: 'number',
|
|
406
|
-
required: false,
|
|
407
|
-
description: 'Base retry backoff in ms (default: 500).',
|
|
408
|
-
default: 500,
|
|
409
|
-
},
|
|
410
|
-
{
|
|
411
|
-
name: 'jobTimeoutMs',
|
|
412
|
-
type: 'number',
|
|
413
|
-
required: false,
|
|
414
|
-
description: 'Max wall time for the audit job (default 30m, cap 4h).',
|
|
415
|
-
},
|
|
416
|
-
{
|
|
417
|
-
name: 'maxFilesPerRun',
|
|
418
|
-
type: 'number',
|
|
419
|
-
required: false,
|
|
420
|
-
description: 'Per worker chunk size for file processing.',
|
|
421
|
-
},
|
|
422
|
-
{
|
|
423
|
-
name: 'shardSoftBudgetMs',
|
|
424
|
-
type: 'number',
|
|
425
|
-
required: false,
|
|
426
|
-
description: 'Per worker soft wall-clock budget.',
|
|
427
|
-
},
|
|
428
|
-
{
|
|
429
|
-
name: 'generateCodeMap',
|
|
430
|
-
type: 'boolean',
|
|
431
|
-
required: false,
|
|
432
|
-
description: 'Generate code map artifacts during audit (default: false).',
|
|
433
|
-
default: false,
|
|
434
|
-
},
|
|
435
|
-
],
|
|
436
|
-
handler: async (args, signal) => {
|
|
437
|
-
return withAbortSignal(signal, 'audit.start', () => startAuditJob(args, {
|
|
438
|
-
defaultAnalyzers: DEFAULT_ANALYZERS,
|
|
439
|
-
defaultMinSeverity: 'high',
|
|
440
|
-
defaultGenerateCodeMap: false,
|
|
441
|
-
}));
|
|
237
|
+
{
|
|
238
|
+
name: 'minSeverity',
|
|
239
|
+
type: 'string',
|
|
240
|
+
required: false,
|
|
241
|
+
description: 'Minimum severity level to report (high included by default).',
|
|
242
|
+
default: 'high',
|
|
243
|
+
enum: ['high', 'severe', 'critical'],
|
|
442
244
|
},
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
name: 'jobId',
|
|
450
|
-
type: 'string',
|
|
451
|
-
required: true,
|
|
452
|
-
description: 'Job ID returned by `audit start`.',
|
|
453
|
-
},
|
|
454
|
-
],
|
|
455
|
-
handler: async (args) => {
|
|
456
|
-
const jobId = args.jobId;
|
|
457
|
-
if (!jobId)
|
|
458
|
-
throw new Error('audit.status requires jobId');
|
|
459
|
-
return await getAuditJobStatus(jobId);
|
|
245
|
+
{
|
|
246
|
+
name: 'indexFunctions',
|
|
247
|
+
type: 'boolean',
|
|
248
|
+
required: false,
|
|
249
|
+
description: 'Index functions during audit (default: true).',
|
|
250
|
+
default: true,
|
|
460
251
|
},
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
{
|
|
467
|
-
name: 'resultId',
|
|
468
|
-
type: 'string',
|
|
469
|
-
required: false,
|
|
470
|
-
description: 'Result ID returned by `audit status` when completed. Also accepts legacy `auditId`.',
|
|
471
|
-
},
|
|
472
|
-
{
|
|
473
|
-
name: 'auditId',
|
|
474
|
-
type: 'string',
|
|
475
|
-
required: false,
|
|
476
|
-
description: 'Backward-compatible alias for resultId.',
|
|
477
|
-
},
|
|
478
|
-
{
|
|
479
|
-
name: 'limit',
|
|
480
|
-
type: 'number',
|
|
481
|
-
required: false,
|
|
482
|
-
description: 'Maximum violations per page (default: 50, max: 100).',
|
|
483
|
-
default: 50,
|
|
484
|
-
},
|
|
485
|
-
{
|
|
486
|
-
name: 'offset',
|
|
487
|
-
type: 'number',
|
|
488
|
-
required: false,
|
|
489
|
-
description: 'Violation offset for pagination (default: 0).',
|
|
490
|
-
default: 0,
|
|
491
|
-
},
|
|
492
|
-
{
|
|
493
|
-
name: 'format',
|
|
494
|
-
type: 'string',
|
|
495
|
-
required: false,
|
|
496
|
-
description: 'Output format. "json" (default, structured data) or "sarif" (SARIF 2.1.0 JSON string).',
|
|
497
|
-
},
|
|
498
|
-
],
|
|
499
|
-
handler: async (args, signal) => {
|
|
500
|
-
const format = args.format || 'json';
|
|
501
|
-
if (format === 'sarif') {
|
|
502
|
-
return withAbortSignal(signal, 'audit.results', () => getAuditResultsAsSarif(args));
|
|
503
|
-
}
|
|
504
|
-
return withAbortSignal(signal, 'audit.results', () => getAuditResultsPage(args));
|
|
252
|
+
{
|
|
253
|
+
name: 'analyzerConfigs',
|
|
254
|
+
type: 'object',
|
|
255
|
+
required: false,
|
|
256
|
+
description: OPTION_ANALYZER_OVERRIDES,
|
|
505
257
|
},
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
default: process.cwd(),
|
|
517
|
-
},
|
|
518
|
-
{
|
|
519
|
-
name: 'threshold',
|
|
520
|
-
type: 'number',
|
|
521
|
-
required: false,
|
|
522
|
-
description: 'Health score threshold (0-100) for pass/fail.',
|
|
523
|
-
default: 70,
|
|
524
|
-
},
|
|
525
|
-
{
|
|
526
|
-
name: 'indexFunctions',
|
|
527
|
-
type: 'boolean',
|
|
528
|
-
required: false,
|
|
529
|
-
description: 'Automatically index functions during health check.',
|
|
530
|
-
default: true,
|
|
531
|
-
},
|
|
532
|
-
{
|
|
533
|
-
name: 'analyzerConfigs',
|
|
534
|
-
type: 'object',
|
|
535
|
-
required: false,
|
|
536
|
-
description: 'Analyzer-specific configuration overrides.',
|
|
537
|
-
},
|
|
538
|
-
{
|
|
539
|
-
name: 'generateCodeMap',
|
|
540
|
-
type: 'boolean',
|
|
541
|
-
required: false,
|
|
542
|
-
description: 'Generate and return a human-readable code map.',
|
|
543
|
-
default: true,
|
|
544
|
-
},
|
|
545
|
-
],
|
|
546
|
-
handler: async (args) => {
|
|
258
|
+
{
|
|
259
|
+
name: 'scope',
|
|
260
|
+
type: 'string',
|
|
261
|
+
required: false,
|
|
262
|
+
description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
|
|
263
|
+
default: 'all',
|
|
264
|
+
},
|
|
265
|
+
],
|
|
266
|
+
handler: async (args, signal) => {
|
|
267
|
+
return withAbortSignal(signal, 'audit.run', async () => {
|
|
547
268
|
const auditPath = path.resolve(args.path || process.cwd());
|
|
548
269
|
await assertAuditPathExists(auditPath);
|
|
549
|
-
const
|
|
270
|
+
const minSeverity = (args.minSeverity || 'high');
|
|
550
271
|
const indexFunctions = args.indexFunctions !== false;
|
|
551
|
-
const generateCodeMap = args.generateCodeMap !== false;
|
|
552
272
|
const db = CodeIndexDB.getInstance();
|
|
553
273
|
await db.initialize();
|
|
554
|
-
const storedConfigs = await db.getAllAnalyzerConfigs(auditPath);
|
|
274
|
+
const storedConfigs = await db.analyzerConfig.getAllAnalyzerConfigs(auditPath);
|
|
555
275
|
const analyzerConfigs = {
|
|
556
276
|
...storedConfigs,
|
|
557
277
|
...(args.analyzerConfigs || {}),
|
|
558
278
|
};
|
|
559
|
-
const
|
|
279
|
+
const scope = args.scope || 'all';
|
|
280
|
+
// Route through the single audit entry point shared with the CLI, so
|
|
281
|
+
// `.go` files dispatch to the Go phase rules instead of being silently
|
|
282
|
+
// skipped (task #255 — the stdio MCP server bypassed per-language
|
|
283
|
+
// dispatch and left every Go rule `notApplicable`).
|
|
284
|
+
const auditResult = await createAuditRunner({
|
|
560
285
|
projectRoot: auditPath,
|
|
561
|
-
|
|
562
|
-
minSeverity: 'high',
|
|
286
|
+
minSeverity,
|
|
563
287
|
verbose: false,
|
|
564
288
|
indexFunctions,
|
|
289
|
+
scope: scope !== 'all' ? scope : undefined,
|
|
565
290
|
...(Object.keys(analyzerConfigs).length > 0 && { analyzerConfigs }),
|
|
566
|
-
|
|
567
|
-
if (p.phase === 'function-indexing' &&
|
|
568
|
-
typeof p.current === 'number' &&
|
|
569
|
-
typeof p.total === 'number' &&
|
|
570
|
-
p.total > 0 &&
|
|
571
|
-
p.current % 50 !== 0 &&
|
|
572
|
-
p.current !== p.total)
|
|
573
|
-
return;
|
|
574
|
-
logMcpDebug('audit.health', p.message ?? p.phase ?? 'progress', {
|
|
575
|
-
phase: p.phase,
|
|
576
|
-
analyzer: p.analyzer,
|
|
577
|
-
current: p.current,
|
|
578
|
-
total: p.total,
|
|
579
|
-
});
|
|
580
|
-
},
|
|
581
|
-
});
|
|
582
|
-
const auditResult = await runner.run();
|
|
583
|
-
const healthScore = calculateHealthScore(auditResult);
|
|
584
|
-
let indexingResult = null;
|
|
291
|
+
}).run();
|
|
585
292
|
if (indexFunctions && auditResult.metadata.fileToFunctionsMap) {
|
|
586
293
|
try {
|
|
587
|
-
const syncStats = { added: 0, updated: 0, removed: 0 };
|
|
588
294
|
for (const [filePath, functions] of Object.entries(auditResult.metadata.fileToFunctionsMap)) {
|
|
589
|
-
|
|
590
|
-
syncStats.added += fileStats.added;
|
|
591
|
-
syncStats.updated += fileStats.updated;
|
|
592
|
-
syncStats.removed += fileStats.removed;
|
|
295
|
+
await syncFileIndex(filePath, functions);
|
|
593
296
|
}
|
|
594
|
-
indexingResult = {
|
|
595
|
-
success: true,
|
|
596
|
-
registered: syncStats.added + syncStats.updated,
|
|
597
|
-
failed: 0,
|
|
598
|
-
syncStats,
|
|
599
|
-
};
|
|
600
297
|
}
|
|
601
298
|
catch {
|
|
602
|
-
// best-effort
|
|
299
|
+
// indexing is best-effort for sync audit
|
|
603
300
|
}
|
|
604
301
|
}
|
|
605
|
-
|
|
606
|
-
|
|
302
|
+
return {
|
|
303
|
+
success: true,
|
|
304
|
+
summary: auditResult.summary,
|
|
305
|
+
violations: auditResult.analyzerResults,
|
|
306
|
+
metadata: auditResult.metadata,
|
|
307
|
+
guidance: 'The audit takes readings, not verdicts. Severity is urgency — how fast a defect bites, never whether you may ignore it; there is no "noise" tier. Work criticals first, then severe, then high. The coverage panel tells you what was actually measured. Documentation readings (missing JSDoc) are maintainability gaps. If you decline a reading, record why instead of silently dismissing it.',
|
|
308
|
+
};
|
|
309
|
+
});
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
name: 'start',
|
|
314
|
+
description: 'Start a background audit job. Returns immediately with a jobId. Poll `audit.status` until completed, then fetch pages with `audit.results`.',
|
|
315
|
+
parameters: [
|
|
316
|
+
{
|
|
317
|
+
name: 'path',
|
|
318
|
+
type: 'string',
|
|
319
|
+
required: false,
|
|
320
|
+
description: 'File or directory path to audit (defaults to current directory).',
|
|
321
|
+
default: process.cwd(),
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
name: 'minSeverity',
|
|
325
|
+
type: 'string',
|
|
326
|
+
required: false,
|
|
327
|
+
description: 'Minimum severity level to report (high included by default).',
|
|
328
|
+
default: 'high',
|
|
329
|
+
enum: ['high', 'severe', 'critical'],
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
name: 'indexFunctions',
|
|
333
|
+
type: 'boolean',
|
|
334
|
+
required: false,
|
|
335
|
+
description: 'Index functions during audit (default: true).',
|
|
336
|
+
default: true,
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
name: 'analyzerConfigs',
|
|
340
|
+
type: 'object',
|
|
341
|
+
required: false,
|
|
342
|
+
description: OPTION_ANALYZER_OVERRIDES,
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
name: 'scope',
|
|
346
|
+
type: 'string',
|
|
347
|
+
required: false,
|
|
348
|
+
description: 'Audit scope: "all" (default), "changed" (files differing from index), "git:<ref>" (diff against a git ref), or a comma-separated list of file paths.',
|
|
349
|
+
default: 'all',
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
name: 'jobTimeoutMs',
|
|
353
|
+
type: 'number',
|
|
354
|
+
required: false,
|
|
355
|
+
description: 'Max wall time for the audit job (default 30m, cap 4h).',
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: 'generateCodeMap',
|
|
359
|
+
type: 'boolean',
|
|
360
|
+
required: false,
|
|
361
|
+
description: 'Generate code map artifacts during audit (default: false).',
|
|
362
|
+
default: false,
|
|
363
|
+
},
|
|
364
|
+
],
|
|
365
|
+
handler: async (args, signal) => {
|
|
366
|
+
return withAbortSignal(signal, 'audit.start', () => startAuditJob(args, {
|
|
367
|
+
defaultMinSeverity: 'high',
|
|
368
|
+
defaultGenerateCodeMap: false,
|
|
369
|
+
}));
|
|
370
|
+
},
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
name: 'status',
|
|
374
|
+
description: 'Get current status for a previously started background audit job.',
|
|
375
|
+
parameters: [
|
|
376
|
+
{
|
|
377
|
+
name: 'jobId',
|
|
378
|
+
type: 'string',
|
|
379
|
+
required: true,
|
|
380
|
+
description: 'Job ID returned by `audit start`.',
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
handler: async (args) => {
|
|
384
|
+
const jobId = args.jobId;
|
|
385
|
+
if (!jobId)
|
|
386
|
+
throw new Error('audit.status requires jobId');
|
|
387
|
+
return await getAuditJobStatus(jobId);
|
|
388
|
+
},
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
name: 'results',
|
|
392
|
+
description: 'Fetch paginated violations for a completed audit result by resultId.',
|
|
393
|
+
parameters: [
|
|
394
|
+
{
|
|
395
|
+
name: 'resultId',
|
|
396
|
+
type: 'string',
|
|
397
|
+
required: false,
|
|
398
|
+
description: 'Result ID returned by `audit status` when completed. Also accepts legacy `auditId`.',
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
name: 'auditId',
|
|
402
|
+
type: 'string',
|
|
403
|
+
required: false,
|
|
404
|
+
description: 'Backward-compatible alias for resultId.',
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
name: 'limit',
|
|
408
|
+
type: 'number',
|
|
409
|
+
required: false,
|
|
410
|
+
description: 'Maximum violations per page (default: 50, max: 100).',
|
|
411
|
+
default: 50,
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: 'offset',
|
|
415
|
+
type: 'number',
|
|
416
|
+
required: false,
|
|
417
|
+
description: 'Violation offset for pagination (default: 0).',
|
|
418
|
+
default: 0,
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
name: 'format',
|
|
422
|
+
type: 'string',
|
|
423
|
+
required: false,
|
|
424
|
+
description: 'Output format. "json" (default, structured data) or "sarif" (SARIF 2.1.0 JSON string).',
|
|
425
|
+
},
|
|
426
|
+
],
|
|
427
|
+
handler: async (args, signal) => {
|
|
428
|
+
const format = args.format || 'json';
|
|
429
|
+
if (format === 'sarif') {
|
|
430
|
+
return withAbortSignal(signal, 'audit.results', () => getAuditResultsAsSarif(args));
|
|
431
|
+
}
|
|
432
|
+
return withAbortSignal(signal, 'audit.results', () => getAuditResultsPage(args));
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
name: 'health',
|
|
437
|
+
description: 'Quick health check of a codebase with key metrics and optional code map generation.',
|
|
438
|
+
parameters: [
|
|
439
|
+
{
|
|
440
|
+
name: 'path',
|
|
441
|
+
type: 'string',
|
|
442
|
+
required: false,
|
|
443
|
+
description: 'The directory path to check.',
|
|
444
|
+
default: process.cwd(),
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
name: 'threshold',
|
|
448
|
+
type: 'number',
|
|
449
|
+
required: false,
|
|
450
|
+
description: 'Health score threshold (0-100) for pass/fail.',
|
|
451
|
+
default: 70,
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
name: 'indexFunctions',
|
|
455
|
+
type: 'boolean',
|
|
456
|
+
required: false,
|
|
457
|
+
description: 'Automatically index functions during health check.',
|
|
458
|
+
default: true,
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
name: 'analyzerConfigs',
|
|
462
|
+
type: 'object',
|
|
463
|
+
required: false,
|
|
464
|
+
description: OPTION_ANALYZER_OVERRIDES,
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
name: 'generateCodeMap',
|
|
468
|
+
type: 'boolean',
|
|
469
|
+
required: false,
|
|
470
|
+
description: 'Generate and return a human-readable code map.',
|
|
471
|
+
default: true,
|
|
472
|
+
},
|
|
473
|
+
],
|
|
474
|
+
handler: async (args) => {
|
|
475
|
+
const auditPath = path.resolve(args.path || process.cwd());
|
|
476
|
+
await assertAuditPathExists(auditPath);
|
|
477
|
+
const threshold = args.threshold || 70;
|
|
478
|
+
const indexFunctions = args.indexFunctions !== false;
|
|
479
|
+
const generateCodeMap = args.generateCodeMap !== false;
|
|
480
|
+
const db = CodeIndexDB.getInstance();
|
|
481
|
+
await db.initialize();
|
|
482
|
+
const storedConfigs = await db.analyzerConfig.getAllAnalyzerConfigs(auditPath);
|
|
483
|
+
const analyzerConfigs = {
|
|
484
|
+
...storedConfigs,
|
|
485
|
+
...(args.analyzerConfigs || {}),
|
|
486
|
+
};
|
|
487
|
+
const auditResult = await createAuditRunner({
|
|
488
|
+
projectRoot: auditPath,
|
|
489
|
+
minSeverity: 'high',
|
|
490
|
+
verbose: false,
|
|
491
|
+
indexFunctions,
|
|
492
|
+
...(Object.keys(analyzerConfigs).length > 0 && { analyzerConfigs }),
|
|
493
|
+
progressCallback: (p) => {
|
|
494
|
+
if (p.phase === 'function-indexing' &&
|
|
495
|
+
typeof p.current === 'number' &&
|
|
496
|
+
typeof p.total === 'number' &&
|
|
497
|
+
p.total > 0 &&
|
|
498
|
+
p.current % 50 !== 0 &&
|
|
499
|
+
p.current !== p.total)
|
|
500
|
+
return;
|
|
501
|
+
logMcpDebug('audit.health', p.message ?? p.phase ?? 'progress', {
|
|
502
|
+
phase: p.phase,
|
|
503
|
+
analyzer: p.analyzer,
|
|
504
|
+
current: p.current,
|
|
505
|
+
total: p.total,
|
|
506
|
+
});
|
|
507
|
+
},
|
|
508
|
+
}).run();
|
|
509
|
+
const healthScore = calculateHealthScore(auditResult);
|
|
510
|
+
let indexingResult = null;
|
|
511
|
+
if (indexFunctions && auditResult.metadata.fileToFunctionsMap) {
|
|
512
|
+
try {
|
|
513
|
+
const syncStats = { added: 0, updated: 0, removed: 0 };
|
|
514
|
+
for (const [filePath, functions] of Object.entries(auditResult.metadata.fileToFunctionsMap)) {
|
|
515
|
+
const fileStats = await syncFileIndex(filePath, functions);
|
|
516
|
+
syncStats.added += fileStats.added;
|
|
517
|
+
syncStats.updated += fileStats.updated;
|
|
518
|
+
syncStats.removed += fileStats.removed;
|
|
519
|
+
}
|
|
520
|
+
indexingResult = {
|
|
521
|
+
success: true,
|
|
522
|
+
registered: syncStats.added + syncStats.updated,
|
|
523
|
+
failed: 0,
|
|
524
|
+
syncStats,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// best-effort
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
let codeMapResult = null;
|
|
532
|
+
if (generateCodeMap && indexingResult && indexingResult.success) {
|
|
533
|
+
try {
|
|
534
|
+
const mapGenerator = new CodeMapGenerator();
|
|
535
|
+
const mapOptions = {
|
|
536
|
+
includeComplexity: true,
|
|
537
|
+
includeDocumentation: true,
|
|
538
|
+
includeDependencies: true,
|
|
539
|
+
includeUsage: false,
|
|
540
|
+
groupByDirectory: true,
|
|
541
|
+
maxDepth: 8,
|
|
542
|
+
showUnusedImports: true,
|
|
543
|
+
minComplexity: 7,
|
|
544
|
+
};
|
|
545
|
+
let documentation;
|
|
607
546
|
try {
|
|
608
|
-
const
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
includeDependencies: true,
|
|
613
|
-
includeUsage: false,
|
|
614
|
-
groupByDirectory: true,
|
|
615
|
-
maxDepth: 8,
|
|
616
|
-
showUnusedImports: true,
|
|
617
|
-
minComplexity: 7,
|
|
618
|
-
};
|
|
619
|
-
let documentation;
|
|
620
|
-
try {
|
|
621
|
-
const files = Object.keys(auditResult.metadata.fileToFunctionsMap || {});
|
|
622
|
-
if (files.length > 0) {
|
|
623
|
-
const docResult = await analyzeDocumentation(files);
|
|
624
|
-
documentation = docResult.metrics;
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
catch {
|
|
628
|
-
// best-effort
|
|
547
|
+
const files = Object.keys(auditResult.metadata.fileToFunctionsMap || {});
|
|
548
|
+
if (files.length > 0) {
|
|
549
|
+
const docResult = await analyzeDocumentation(files);
|
|
550
|
+
documentation = docResult.metrics;
|
|
629
551
|
}
|
|
630
|
-
const paginatedResult = await mapGenerator.generatePaginatedCodeMap(auditPath, {
|
|
631
|
-
...mapOptions,
|
|
632
|
-
includeDocumentation: !!documentation,
|
|
633
|
-
});
|
|
634
|
-
codeMapResult = {
|
|
635
|
-
success: true,
|
|
636
|
-
mapId: paginatedResult.mapId,
|
|
637
|
-
summary: paginatedResult.summary,
|
|
638
|
-
quickPreview: paginatedResult.quickPreview,
|
|
639
|
-
sections: paginatedResult.summary.sectionsAvailable,
|
|
640
|
-
documentationCoverage: documentation?.coverageScore,
|
|
641
|
-
};
|
|
642
552
|
}
|
|
643
|
-
catch
|
|
644
|
-
|
|
645
|
-
success: false,
|
|
646
|
-
error: error instanceof Error ? error.message : 'Failed to generate code map',
|
|
647
|
-
};
|
|
553
|
+
catch {
|
|
554
|
+
// best-effort
|
|
648
555
|
}
|
|
556
|
+
const paginatedResult = await mapGenerator.generatePaginatedCodeMap(auditPath, {
|
|
557
|
+
...mapOptions,
|
|
558
|
+
includeDocumentation: !!documentation,
|
|
559
|
+
});
|
|
560
|
+
codeMapResult = {
|
|
561
|
+
success: true,
|
|
562
|
+
mapId: paginatedResult.mapId,
|
|
563
|
+
summary: paginatedResult.summary,
|
|
564
|
+
quickPreview: paginatedResult.quickPreview,
|
|
565
|
+
sections: paginatedResult.summary.sectionsAvailable,
|
|
566
|
+
documentationCoverage: documentation?.coverageScore,
|
|
567
|
+
};
|
|
649
568
|
}
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
569
|
+
catch (error) {
|
|
570
|
+
codeMapResult = {
|
|
571
|
+
success: false,
|
|
572
|
+
error: error instanceof Error ? error.message : 'Failed to generate code map',
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return {
|
|
577
|
+
healthScore,
|
|
578
|
+
threshold,
|
|
579
|
+
passed: healthScore >= threshold,
|
|
580
|
+
status: healthScore >= threshold ? 'healthy' : 'needs-attention',
|
|
581
|
+
metrics: {
|
|
582
|
+
filesAnalyzed: auditResult.metadata.filesAnalyzed,
|
|
583
|
+
totalViolations: auditResult.summary.totalViolations,
|
|
584
|
+
criticalViolations: auditResult.summary.criticalIssues,
|
|
585
|
+
severeViolations: auditResult.summary.severe,
|
|
586
|
+
highViolations: auditResult.summary.high,
|
|
587
|
+
},
|
|
588
|
+
recommendation: getHealthRecommendation(healthScore, auditResult),
|
|
589
|
+
...(indexingResult && { functionIndexing: indexingResult }),
|
|
590
|
+
...(codeMapResult && { codeMap: codeMapResult }),
|
|
591
|
+
};
|
|
667
592
|
},
|
|
668
|
-
|
|
593
|
+
},
|
|
594
|
+
];
|
|
595
|
+
function registerAuditTool(registry) {
|
|
669
596
|
registry.register({
|
|
670
597
|
name: 'audit',
|
|
671
598
|
description: 'Run code quality audits (synchronous or background), check status, fetch paginated results, and get health checks. Actions: run (sync audit, returns full results), start (background job), status (poll a job), results (paginated violations), health (score + code map).',
|
|
672
599
|
actions: auditActions,
|
|
673
600
|
});
|
|
674
|
-
|
|
601
|
+
}
|
|
602
|
+
// ── search ─────────────────────────────────────────────────────────────────
|
|
603
|
+
function registerSearchTool(registry) {
|
|
675
604
|
registry.register({
|
|
676
605
|
name: 'search',
|
|
677
606
|
description: 'Search indexed functions and components. Actions: query (natural language + operators like entity:, component:, hook:, dep:, calls:, lang:, complexity:, exported:, jsdoc:, file:, unused-imports, name:), definition (exact function/component lookup).',
|
|
@@ -745,7 +674,9 @@ function registerAllTools(registry) {
|
|
|
745
674
|
},
|
|
746
675
|
],
|
|
747
676
|
});
|
|
748
|
-
|
|
677
|
+
}
|
|
678
|
+
// ── index ──────────────────────────────────────────────────────────────────
|
|
679
|
+
function registerIndexTool(registry) {
|
|
749
680
|
registry.register({
|
|
750
681
|
name: 'index',
|
|
751
682
|
description: 'Manage the code index. Actions: sync (update from files with optional auto-whitelist), cleanup (remove deleted files), reset (clear analysis data, preserve tasks/config/whitelist), status (index statistics).',
|
|
@@ -861,7 +792,7 @@ function registerAllTools(registry) {
|
|
|
861
792
|
handler: async () => {
|
|
862
793
|
const db = CodeIndexDB.getInstance();
|
|
863
794
|
await db.initialize();
|
|
864
|
-
const functionCount = await db.getFunctionCount();
|
|
795
|
+
const functionCount = await db.functionIndex.getFunctionCount();
|
|
865
796
|
return {
|
|
866
797
|
success: true,
|
|
867
798
|
functionCount,
|
|
@@ -870,426 +801,431 @@ function registerAllTools(registry) {
|
|
|
870
801
|
},
|
|
871
802
|
],
|
|
872
803
|
});
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
804
|
+
}
|
|
805
|
+
// ── config ─────────────────────────────────────────────────────────────────
|
|
806
|
+
const configActions = [
|
|
807
|
+
{
|
|
808
|
+
name: 'get',
|
|
809
|
+
description: 'Get current configuration for an analyzer (or all).',
|
|
810
|
+
parameters: [
|
|
878
811
|
{
|
|
879
|
-
name: '
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
name: 'analyzerName',
|
|
884
|
-
type: 'string',
|
|
885
|
-
required: false,
|
|
886
|
-
description: 'Specific analyzer name, or omit to get all configs.',
|
|
887
|
-
},
|
|
888
|
-
{
|
|
889
|
-
name: 'projectPath',
|
|
890
|
-
type: 'string',
|
|
891
|
-
required: false,
|
|
892
|
-
description: 'Optional project path for project-specific config.',
|
|
893
|
-
},
|
|
894
|
-
],
|
|
895
|
-
handler: async (args) => {
|
|
896
|
-
const analyzerName = args.analyzerName;
|
|
897
|
-
const projectPath = args.projectPath;
|
|
898
|
-
const db = CodeIndexDB.getInstance();
|
|
899
|
-
await db.initialize();
|
|
900
|
-
if (analyzerName) {
|
|
901
|
-
const config = await db.getAnalyzerConfig(analyzerName, projectPath);
|
|
902
|
-
return {
|
|
903
|
-
success: true,
|
|
904
|
-
analyzer: analyzerName,
|
|
905
|
-
config: config || null,
|
|
906
|
-
scope: projectPath ? 'project' : 'global',
|
|
907
|
-
message: config ? 'Configuration found' : 'No custom configuration found, using defaults',
|
|
908
|
-
};
|
|
909
|
-
}
|
|
910
|
-
const configs = await db.getAllAnalyzerConfigs(projectPath);
|
|
911
|
-
return {
|
|
912
|
-
success: true,
|
|
913
|
-
configs,
|
|
914
|
-
scope: projectPath ? 'project' : 'global',
|
|
915
|
-
message: `Found ${Object.keys(configs).length} analyzer configurations`,
|
|
916
|
-
};
|
|
917
|
-
},
|
|
812
|
+
name: 'analyzerName',
|
|
813
|
+
type: 'string',
|
|
814
|
+
required: false,
|
|
815
|
+
description: 'Specific analyzer name, or omit to get all configs.',
|
|
918
816
|
},
|
|
919
817
|
{
|
|
920
|
-
name: '
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
name: 'analyzerName',
|
|
925
|
-
type: 'string',
|
|
926
|
-
required: true,
|
|
927
|
-
description: 'The analyzer to configure (solid, dry, security, etc.).',
|
|
928
|
-
},
|
|
929
|
-
{
|
|
930
|
-
name: 'config',
|
|
931
|
-
type: 'object',
|
|
932
|
-
required: true,
|
|
933
|
-
description: 'Configuration object for the analyzer (e.g., thresholds, rules).',
|
|
934
|
-
},
|
|
935
|
-
{
|
|
936
|
-
name: 'projectPath',
|
|
937
|
-
type: 'string',
|
|
938
|
-
required: false,
|
|
939
|
-
description: 'Optional project path for project-specific config.',
|
|
940
|
-
},
|
|
941
|
-
],
|
|
942
|
-
handler: async (args) => {
|
|
943
|
-
const analyzerName = args.analyzerName;
|
|
944
|
-
const config = args.config;
|
|
945
|
-
const projectPath = args.projectPath;
|
|
946
|
-
const db = CodeIndexDB.getInstance();
|
|
947
|
-
await db.initialize();
|
|
948
|
-
await db.storeAnalyzerConfig(analyzerName, config, {
|
|
949
|
-
projectPath,
|
|
950
|
-
isGlobal: !projectPath,
|
|
951
|
-
});
|
|
952
|
-
return {
|
|
953
|
-
success: true,
|
|
954
|
-
message: `Configuration for ${analyzerName} analyzer has been saved${projectPath ? ` for project ${projectPath}` : ' globally'}`,
|
|
955
|
-
analyzer: analyzerName,
|
|
956
|
-
scope: projectPath ? 'project' : 'global',
|
|
957
|
-
config,
|
|
958
|
-
};
|
|
959
|
-
},
|
|
818
|
+
name: 'projectPath',
|
|
819
|
+
type: 'string',
|
|
820
|
+
required: false,
|
|
821
|
+
description: 'Optional project path for project-specific config.',
|
|
960
822
|
},
|
|
823
|
+
],
|
|
824
|
+
handler: async (args) => {
|
|
825
|
+
const analyzerName = args.analyzerName;
|
|
826
|
+
const projectPath = args.projectPath;
|
|
827
|
+
const db = CodeIndexDB.getInstance();
|
|
828
|
+
await db.initialize();
|
|
829
|
+
if (analyzerName) {
|
|
830
|
+
const config = await db.analyzerConfig.getAnalyzerConfig(analyzerName, projectPath);
|
|
831
|
+
return {
|
|
832
|
+
success: true,
|
|
833
|
+
analyzer: analyzerName,
|
|
834
|
+
config: config || null,
|
|
835
|
+
scope: projectPath ? 'project' : 'global',
|
|
836
|
+
message: config ? 'Configuration found' : 'No custom configuration found, using defaults',
|
|
837
|
+
};
|
|
838
|
+
}
|
|
839
|
+
const configs = await db.analyzerConfig.getAllAnalyzerConfigs(projectPath);
|
|
840
|
+
return {
|
|
841
|
+
success: true,
|
|
842
|
+
configs,
|
|
843
|
+
scope: projectPath ? 'project' : 'global',
|
|
844
|
+
message: `Found ${Object.keys(configs).length} analyzer configurations`,
|
|
845
|
+
};
|
|
846
|
+
},
|
|
847
|
+
},
|
|
848
|
+
{
|
|
849
|
+
name: 'set',
|
|
850
|
+
description: 'Set or update analyzer configuration that persists across audit runs.',
|
|
851
|
+
parameters: [
|
|
961
852
|
{
|
|
962
|
-
name: '
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
name: 'analyzerName',
|
|
967
|
-
type: 'string',
|
|
968
|
-
required: false,
|
|
969
|
-
description: 'Specific analyzer to reset, or omit to reset all.',
|
|
970
|
-
},
|
|
971
|
-
{
|
|
972
|
-
name: 'projectPath',
|
|
973
|
-
type: 'string',
|
|
974
|
-
required: false,
|
|
975
|
-
description: 'Optional project path to reset only project-specific config.',
|
|
976
|
-
},
|
|
977
|
-
],
|
|
978
|
-
handler: async (args) => {
|
|
979
|
-
const analyzerName = args.analyzerName;
|
|
980
|
-
const projectPath = args.projectPath;
|
|
981
|
-
const db = CodeIndexDB.getInstance();
|
|
982
|
-
await db.initialize();
|
|
983
|
-
if (analyzerName) {
|
|
984
|
-
const deleted = await db.deleteAnalyzerConfig(analyzerName, {
|
|
985
|
-
projectPath,
|
|
986
|
-
isGlobal: !projectPath,
|
|
987
|
-
});
|
|
988
|
-
return {
|
|
989
|
-
success: deleted,
|
|
990
|
-
message: deleted
|
|
991
|
-
? `Configuration for ${analyzerName} analyzer has been reset${projectPath ? ` for project ${projectPath}` : ' globally'}`
|
|
992
|
-
: `No configuration found for ${analyzerName} analyzer`,
|
|
993
|
-
analyzer: analyzerName,
|
|
994
|
-
scope: projectPath ? 'project' : 'global',
|
|
995
|
-
};
|
|
996
|
-
}
|
|
997
|
-
await db.resetAnalyzerConfigs(projectPath);
|
|
998
|
-
return {
|
|
999
|
-
success: true,
|
|
1000
|
-
message: projectPath
|
|
1001
|
-
? `All project-specific configurations for ${projectPath} have been reset`
|
|
1002
|
-
: 'All analyzer configurations have been reset to defaults',
|
|
1003
|
-
scope: projectPath ? 'project' : 'global',
|
|
1004
|
-
};
|
|
1005
|
-
},
|
|
853
|
+
name: 'analyzerName',
|
|
854
|
+
type: 'string',
|
|
855
|
+
required: true,
|
|
856
|
+
description: 'The analyzer to configure (solid, dry, security, etc.).',
|
|
1006
857
|
},
|
|
1007
858
|
{
|
|
1008
|
-
name: '
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
name: 'tools',
|
|
1013
|
-
type: 'array',
|
|
1014
|
-
required: true,
|
|
1015
|
-
description: 'AI tools to configure (claude, codex, cursor, gemini, copilot, continue, awsq, codeium, vscode, cline, zcode).',
|
|
1016
|
-
},
|
|
1017
|
-
{
|
|
1018
|
-
name: 'outputDir',
|
|
1019
|
-
type: 'string',
|
|
1020
|
-
required: false,
|
|
1021
|
-
description: 'Output directory for configuration files.',
|
|
1022
|
-
default: '.',
|
|
1023
|
-
},
|
|
1024
|
-
{
|
|
1025
|
-
name: 'serverUrl',
|
|
1026
|
-
type: 'string',
|
|
1027
|
-
required: false,
|
|
1028
|
-
description: 'MCP server URL (default: auto-detected).',
|
|
1029
|
-
default: DEFAULT_SERVER_URL,
|
|
1030
|
-
},
|
|
1031
|
-
{
|
|
1032
|
-
name: 'overwrite',
|
|
1033
|
-
type: 'boolean',
|
|
1034
|
-
required: false,
|
|
1035
|
-
description: 'Overwrite existing files (default: false).',
|
|
1036
|
-
default: false,
|
|
1037
|
-
},
|
|
1038
|
-
],
|
|
1039
|
-
handler: async (args) => {
|
|
1040
|
-
const tools = args.tools;
|
|
1041
|
-
const serverUrl = args.serverUrl || DEFAULT_SERVER_URL;
|
|
1042
|
-
const rawOutputDir = args.outputDir || '.';
|
|
1043
|
-
// Containment (Spec 61 R5.1): generated configs land only inside the
|
|
1044
|
-
// working directory. `~` expansion still resolves (so a project under
|
|
1045
|
-
// `~` keeps working), but it is no longer a way to escape cwd.
|
|
1046
|
-
const outputDir = resolveConfigGenerateDir(rawOutputDir, process.cwd());
|
|
1047
|
-
const overwrite = args.overwrite || false;
|
|
1048
|
-
if (!Array.isArray(tools) || tools.length === 0)
|
|
1049
|
-
throw new Error('tools parameter must be a non-empty array');
|
|
1050
|
-
const factory = new ConfigGeneratorFactory(serverUrl);
|
|
1051
|
-
const generatedFiles = [];
|
|
1052
|
-
const errors = [];
|
|
1053
|
-
for (const tool of tools) {
|
|
1054
|
-
try {
|
|
1055
|
-
const generator = factory.createGenerator(tool);
|
|
1056
|
-
if (!generator) {
|
|
1057
|
-
errors.push(`Unknown tool: ${tool}`);
|
|
1058
|
-
continue;
|
|
1059
|
-
}
|
|
1060
|
-
const config = generator.generateConfig();
|
|
1061
|
-
const outputPath = path.resolve(outputDir, config.filename);
|
|
1062
|
-
let fileExists = false;
|
|
1063
|
-
try {
|
|
1064
|
-
await fs.access(outputPath);
|
|
1065
|
-
fileExists = true;
|
|
1066
|
-
}
|
|
1067
|
-
catch {
|
|
1068
|
-
// doesn't exist
|
|
1069
|
-
}
|
|
1070
|
-
if (fileExists && !overwrite) {
|
|
1071
|
-
errors.push(`File already exists: ${config.filename} (use overwrite: true to replace)`);
|
|
1072
|
-
continue;
|
|
1073
|
-
}
|
|
1074
|
-
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
1075
|
-
await fs.writeFile(outputPath, config.content);
|
|
1076
|
-
generatedFiles.push(config.filename);
|
|
1077
|
-
if (config.additionalFiles) {
|
|
1078
|
-
for (const additionalFile of config.additionalFiles) {
|
|
1079
|
-
const additionalPath = path.resolve(outputDir, additionalFile.filename);
|
|
1080
|
-
await fs.mkdir(path.dirname(additionalPath), { recursive: true });
|
|
1081
|
-
await fs.writeFile(additionalPath, additionalFile.content);
|
|
1082
|
-
generatedFiles.push(additionalFile.filename);
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
catch (error) {
|
|
1087
|
-
errors.push(`Failed to generate config for ${tool}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
1088
|
-
}
|
|
1089
|
-
}
|
|
1090
|
-
return {
|
|
1091
|
-
success: errors.length === 0,
|
|
1092
|
-
generatedFiles,
|
|
1093
|
-
errors: errors.length > 0 ? errors : undefined,
|
|
1094
|
-
totalRequested: tools.length,
|
|
1095
|
-
totalGenerated: generatedFiles.length,
|
|
1096
|
-
};
|
|
1097
|
-
},
|
|
859
|
+
name: 'config',
|
|
860
|
+
type: 'object',
|
|
861
|
+
required: true,
|
|
862
|
+
description: 'Configuration object for the analyzer (e.g., thresholds, rules).',
|
|
1098
863
|
},
|
|
1099
864
|
{
|
|
1100
|
-
name: '
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
name: 'type',
|
|
1105
|
-
type: 'string',
|
|
1106
|
-
required: false,
|
|
1107
|
-
description: 'Filter by type: platform-api, framework-class, project-dep, shared-library, node-builtin.',
|
|
1108
|
-
enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
|
|
1109
|
-
},
|
|
1110
|
-
{
|
|
1111
|
-
name: 'status',
|
|
1112
|
-
type: 'string',
|
|
1113
|
-
required: false,
|
|
1114
|
-
description: 'Filter by status: active, pending, rejected, disabled.',
|
|
1115
|
-
enum: ['active', 'pending', 'rejected', 'disabled'],
|
|
1116
|
-
},
|
|
1117
|
-
],
|
|
1118
|
-
handler: async (args) => {
|
|
1119
|
-
const { handleWhitelistGet } = await import('./mcp-tools/whitelistTools.js');
|
|
1120
|
-
return handleWhitelistGet(args);
|
|
1121
|
-
},
|
|
865
|
+
name: 'projectPath',
|
|
866
|
+
type: 'string',
|
|
867
|
+
required: false,
|
|
868
|
+
description: 'Optional project path for project-specific config.',
|
|
1122
869
|
},
|
|
870
|
+
],
|
|
871
|
+
handler: async (args) => {
|
|
872
|
+
const analyzerName = args.analyzerName;
|
|
873
|
+
const config = args.config;
|
|
874
|
+
const projectPath = args.projectPath;
|
|
875
|
+
const db = CodeIndexDB.getInstance();
|
|
876
|
+
await db.initialize();
|
|
877
|
+
await db.analyzerConfig.storeAnalyzerConfig(analyzerName, config, {
|
|
878
|
+
projectPath,
|
|
879
|
+
isGlobal: !projectPath,
|
|
880
|
+
});
|
|
881
|
+
return {
|
|
882
|
+
success: true,
|
|
883
|
+
message: `Configuration for ${analyzerName} analyzer has been saved${projectPath ? ` for project ${projectPath}` : ' globally'}`,
|
|
884
|
+
analyzer: analyzerName,
|
|
885
|
+
scope: projectPath ? 'project' : 'global',
|
|
886
|
+
config,
|
|
887
|
+
};
|
|
888
|
+
},
|
|
889
|
+
},
|
|
890
|
+
{
|
|
891
|
+
name: 'reset',
|
|
892
|
+
description: 'Reset analyzer configuration to defaults.',
|
|
893
|
+
parameters: [
|
|
1123
894
|
{
|
|
1124
|
-
name: '
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
name: 'name',
|
|
1129
|
-
type: 'string',
|
|
1130
|
-
required: true,
|
|
1131
|
-
description: 'Class name or import path to whitelist.',
|
|
1132
|
-
},
|
|
1133
|
-
{
|
|
1134
|
-
name: 'type',
|
|
1135
|
-
type: 'string',
|
|
1136
|
-
required: true,
|
|
1137
|
-
description: 'Type of whitelist entry.',
|
|
1138
|
-
enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
|
|
1139
|
-
},
|
|
1140
|
-
{
|
|
1141
|
-
name: 'description',
|
|
1142
|
-
type: 'string',
|
|
1143
|
-
required: false,
|
|
1144
|
-
description: 'Explanation of why this is whitelisted.',
|
|
1145
|
-
},
|
|
1146
|
-
{
|
|
1147
|
-
name: 'patterns',
|
|
1148
|
-
type: 'array',
|
|
1149
|
-
required: false,
|
|
1150
|
-
description: 'Additional patterns to match (e.g., ["fs/*", "node:fs"]).',
|
|
1151
|
-
},
|
|
1152
|
-
],
|
|
1153
|
-
handler: async (args) => {
|
|
1154
|
-
const { handleWhitelistAdd } = await import('./mcp-tools/whitelistTools.js');
|
|
1155
|
-
return handleWhitelistAdd(args);
|
|
1156
|
-
},
|
|
895
|
+
name: 'analyzerName',
|
|
896
|
+
type: 'string',
|
|
897
|
+
required: false,
|
|
898
|
+
description: 'Specific analyzer to reset, or omit to reset all.',
|
|
1157
899
|
},
|
|
1158
900
|
{
|
|
1159
|
-
name: '
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
name: 'name',
|
|
1164
|
-
type: 'string',
|
|
1165
|
-
required: true,
|
|
1166
|
-
description: 'Name of the whitelist entry to update.',
|
|
1167
|
-
},
|
|
1168
|
-
{
|
|
1169
|
-
name: 'status',
|
|
1170
|
-
type: 'string',
|
|
1171
|
-
required: true,
|
|
1172
|
-
description: 'New status for the entry.',
|
|
1173
|
-
enum: ['active', 'pending', 'rejected', 'disabled'],
|
|
1174
|
-
},
|
|
1175
|
-
],
|
|
1176
|
-
handler: async (args) => {
|
|
1177
|
-
const { handleWhitelistUpdateStatus } = await import('./mcp-tools/whitelistTools.js');
|
|
1178
|
-
return handleWhitelistUpdateStatus(args);
|
|
1179
|
-
},
|
|
901
|
+
name: 'projectPath',
|
|
902
|
+
type: 'string',
|
|
903
|
+
required: false,
|
|
904
|
+
description: 'Optional project path to reset only project-specific config.',
|
|
1180
905
|
},
|
|
906
|
+
],
|
|
907
|
+
handler: async (args) => {
|
|
908
|
+
const analyzerName = args.analyzerName;
|
|
909
|
+
const projectPath = args.projectPath;
|
|
910
|
+
const db = CodeIndexDB.getInstance();
|
|
911
|
+
await db.initialize();
|
|
912
|
+
if (analyzerName) {
|
|
913
|
+
const deleted = await db.analyzerConfig.deleteAnalyzerConfig(analyzerName, {
|
|
914
|
+
projectPath,
|
|
915
|
+
isGlobal: !projectPath,
|
|
916
|
+
});
|
|
917
|
+
return {
|
|
918
|
+
success: deleted,
|
|
919
|
+
message: deleted
|
|
920
|
+
? `Configuration for ${analyzerName} analyzer has been reset${projectPath ? ` for project ${projectPath}` : ' globally'}`
|
|
921
|
+
: `No configuration found for ${analyzerName} analyzer`,
|
|
922
|
+
analyzer: analyzerName,
|
|
923
|
+
scope: projectPath ? 'project' : 'global',
|
|
924
|
+
};
|
|
925
|
+
}
|
|
926
|
+
await db.analyzerConfig.resetAnalyzerConfigs(projectPath);
|
|
927
|
+
return {
|
|
928
|
+
success: true,
|
|
929
|
+
message: projectPath
|
|
930
|
+
? `All project-specific configurations for ${projectPath} have been reset`
|
|
931
|
+
: 'All analyzer configurations have been reset to defaults',
|
|
932
|
+
scope: projectPath ? 'project' : 'global',
|
|
933
|
+
};
|
|
934
|
+
},
|
|
935
|
+
},
|
|
936
|
+
{
|
|
937
|
+
name: 'generate',
|
|
938
|
+
description: 'Generate configuration files for AI coding assistants (Cursor, Claude, Copilot, etc.).',
|
|
939
|
+
parameters: [
|
|
1181
940
|
{
|
|
1182
|
-
name: '
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
name: 'path',
|
|
1187
|
-
type: 'string',
|
|
1188
|
-
required: false,
|
|
1189
|
-
description: 'Project path to analyze (defaults to current directory).',
|
|
1190
|
-
default: process.cwd(),
|
|
1191
|
-
},
|
|
1192
|
-
{
|
|
1193
|
-
name: 'includePackageJson',
|
|
1194
|
-
type: 'boolean',
|
|
1195
|
-
required: false,
|
|
1196
|
-
description: 'Include dependencies from package.json.',
|
|
1197
|
-
default: true,
|
|
1198
|
-
},
|
|
1199
|
-
{
|
|
1200
|
-
name: 'autoPopulate',
|
|
1201
|
-
type: 'boolean',
|
|
1202
|
-
required: false,
|
|
1203
|
-
description: 'Automatically add high-confidence entries.',
|
|
1204
|
-
default: false,
|
|
1205
|
-
},
|
|
1206
|
-
],
|
|
1207
|
-
handler: async (args) => {
|
|
1208
|
-
const { handleWhitelistDetect } = await import('./mcp-tools/whitelistTools.js');
|
|
1209
|
-
return handleWhitelistDetect(args);
|
|
1210
|
-
},
|
|
941
|
+
name: 'tools',
|
|
942
|
+
type: 'array',
|
|
943
|
+
required: true,
|
|
944
|
+
description: 'AI tools to configure (claude, codex, cursor, gemini, copilot, continue, awsq, codeium, vscode, cline, zcode).',
|
|
1211
945
|
},
|
|
1212
946
|
{
|
|
1213
|
-
name: '
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
type: 'string',
|
|
1219
|
-
required: false,
|
|
1220
|
-
description: 'Path to .codeauditor.json (defaults to auto-detect in current working tree).',
|
|
1221
|
-
},
|
|
1222
|
-
],
|
|
1223
|
-
handler: async (args) => {
|
|
1224
|
-
const { readFileSync } = await import('fs');
|
|
1225
|
-
const path = await import('path');
|
|
1226
|
-
const configPath = args.configPath ||
|
|
1227
|
-
path.join(process.cwd(), '.codeauditor.json');
|
|
1228
|
-
try {
|
|
1229
|
-
const raw = readFileSync(configPath, 'utf-8');
|
|
1230
|
-
const config = JSON.parse(raw);
|
|
1231
|
-
const rules = config?.rules ?? [];
|
|
1232
|
-
return {
|
|
1233
|
-
rules: rules.map((r) => ({
|
|
1234
|
-
id: r.id,
|
|
1235
|
-
kind: r.kind,
|
|
1236
|
-
severity: r.severity,
|
|
1237
|
-
message: r.message || null,
|
|
1238
|
-
})),
|
|
1239
|
-
count: rules.length,
|
|
1240
|
-
configPath,
|
|
1241
|
-
};
|
|
1242
|
-
}
|
|
1243
|
-
catch (err) {
|
|
1244
|
-
return {
|
|
1245
|
-
error: `Failed to read rules: ${err.message}`,
|
|
1246
|
-
configPath,
|
|
1247
|
-
rules: [],
|
|
1248
|
-
count: 0,
|
|
1249
|
-
};
|
|
1250
|
-
}
|
|
1251
|
-
},
|
|
947
|
+
name: 'outputDir',
|
|
948
|
+
type: 'string',
|
|
949
|
+
required: false,
|
|
950
|
+
description: 'Output directory for configuration files.',
|
|
951
|
+
default: '.',
|
|
1252
952
|
},
|
|
1253
953
|
{
|
|
1254
|
-
name: '
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
954
|
+
name: 'serverUrl',
|
|
955
|
+
type: 'string',
|
|
956
|
+
required: false,
|
|
957
|
+
description: 'MCP server URL (default: auto-detected).',
|
|
958
|
+
default: DEFAULT_SERVER_URL,
|
|
959
|
+
},
|
|
960
|
+
{
|
|
961
|
+
name: 'overwrite',
|
|
962
|
+
type: 'boolean',
|
|
963
|
+
required: false,
|
|
964
|
+
description: 'Overwrite existing files (default: false).',
|
|
965
|
+
default: false,
|
|
966
|
+
},
|
|
967
|
+
],
|
|
968
|
+
handler: async (args) => {
|
|
969
|
+
const tools = args.tools;
|
|
970
|
+
const serverUrl = args.serverUrl || DEFAULT_SERVER_URL;
|
|
971
|
+
const rawOutputDir = args.outputDir || '.';
|
|
972
|
+
// Containment (Spec 61 R5.1): generated configs land only inside the
|
|
973
|
+
// working directory. `~` expansion still resolves (so a project under
|
|
974
|
+
// `~` keeps working), but it is no longer a way to escape cwd.
|
|
975
|
+
const outputDir = resolveConfigGenerateDir(rawOutputDir, process.cwd());
|
|
976
|
+
const overwrite = args.overwrite || false;
|
|
977
|
+
if (!Array.isArray(tools) || tools.length === 0)
|
|
978
|
+
throw new Error('tools parameter must be a non-empty array');
|
|
979
|
+
const factory = new ConfigGeneratorFactory(serverUrl);
|
|
980
|
+
const generatedFiles = [];
|
|
981
|
+
const errors = [];
|
|
982
|
+
for (const tool of tools) {
|
|
983
|
+
try {
|
|
984
|
+
const generator = factory.createGenerator(tool);
|
|
985
|
+
if (!generator) {
|
|
986
|
+
errors.push(`Unknown tool: ${tool}`);
|
|
987
|
+
continue;
|
|
988
|
+
}
|
|
989
|
+
const config = generator.generateConfig();
|
|
990
|
+
const outputPath = path.resolve(outputDir, config.filename);
|
|
991
|
+
let fileExists = false;
|
|
1270
992
|
try {
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
const rulesArray = config?.rules;
|
|
1274
|
-
const errors = validateRulesConfig({ rules: rulesArray ?? [] });
|
|
1275
|
-
return {
|
|
1276
|
-
valid: errors.length === 0,
|
|
1277
|
-
errors: errors.map(e => ({ ruleId: e.ruleId || null, message: e.message })),
|
|
1278
|
-
configPath,
|
|
1279
|
-
};
|
|
993
|
+
await fs.access(outputPath);
|
|
994
|
+
fileExists = true;
|
|
1280
995
|
}
|
|
1281
|
-
catch
|
|
1282
|
-
|
|
1283
|
-
valid: false,
|
|
1284
|
-
errors: [{ message: `Failed to read/parse config: ${err.message}` }],
|
|
1285
|
-
configPath,
|
|
1286
|
-
};
|
|
996
|
+
catch {
|
|
997
|
+
// doesn't exist
|
|
1287
998
|
}
|
|
1288
|
-
|
|
999
|
+
if (fileExists && !overwrite) {
|
|
1000
|
+
errors.push(`File already exists: ${config.filename} (use overwrite: true to replace)`);
|
|
1001
|
+
continue;
|
|
1002
|
+
}
|
|
1003
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
1004
|
+
await fs.writeFile(outputPath, config.content);
|
|
1005
|
+
generatedFiles.push(config.filename);
|
|
1006
|
+
if (config.additionalFiles) {
|
|
1007
|
+
for (const additionalFile of config.additionalFiles) {
|
|
1008
|
+
const additionalPath = path.resolve(outputDir, additionalFile.filename);
|
|
1009
|
+
await fs.mkdir(path.dirname(additionalPath), { recursive: true });
|
|
1010
|
+
await fs.writeFile(additionalPath, additionalFile.content);
|
|
1011
|
+
generatedFiles.push(additionalFile.filename);
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
catch (error) {
|
|
1016
|
+
errors.push(`Failed to generate config for ${tool}: ${errorMessage(error)}`);
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
return {
|
|
1020
|
+
success: errors.length === 0,
|
|
1021
|
+
generatedFiles,
|
|
1022
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
1023
|
+
totalRequested: tools.length,
|
|
1024
|
+
totalGenerated: generatedFiles.length,
|
|
1025
|
+
};
|
|
1026
|
+
},
|
|
1027
|
+
},
|
|
1028
|
+
{
|
|
1029
|
+
name: 'whitelist_list',
|
|
1030
|
+
description: 'Get current whitelist entries for dependency and class instantiation checks.',
|
|
1031
|
+
parameters: [
|
|
1032
|
+
{
|
|
1033
|
+
name: 'type',
|
|
1034
|
+
type: 'string',
|
|
1035
|
+
required: false,
|
|
1036
|
+
description: 'Filter by type: platform-api, framework-class, project-dep, shared-library, node-builtin.',
|
|
1037
|
+
enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
name: 'status',
|
|
1041
|
+
type: 'string',
|
|
1042
|
+
required: false,
|
|
1043
|
+
description: 'Filter by status: active, pending, rejected, disabled.',
|
|
1044
|
+
enum: ['active', 'pending', 'rejected', 'disabled'],
|
|
1045
|
+
},
|
|
1046
|
+
],
|
|
1047
|
+
handler: async (args) => {
|
|
1048
|
+
const { handleWhitelistGet } = await import('./mcp-tools/whitelistTools.js');
|
|
1049
|
+
return handleWhitelistGet(args);
|
|
1050
|
+
},
|
|
1051
|
+
},
|
|
1052
|
+
{
|
|
1053
|
+
name: 'whitelist_add',
|
|
1054
|
+
description: 'Add a new entry to the whitelist.',
|
|
1055
|
+
parameters: [
|
|
1056
|
+
{
|
|
1057
|
+
name: 'name',
|
|
1058
|
+
type: 'string',
|
|
1059
|
+
required: true,
|
|
1060
|
+
description: 'Class name or import path to whitelist.',
|
|
1061
|
+
},
|
|
1062
|
+
{
|
|
1063
|
+
name: 'type',
|
|
1064
|
+
type: 'string',
|
|
1065
|
+
required: true,
|
|
1066
|
+
description: 'Type of whitelist entry.',
|
|
1067
|
+
enum: ['platform-api', 'framework-class', 'project-dep', 'shared-library', 'node-builtin'],
|
|
1068
|
+
},
|
|
1069
|
+
{
|
|
1070
|
+
name: 'description',
|
|
1071
|
+
type: 'string',
|
|
1072
|
+
required: false,
|
|
1073
|
+
description: 'Explanation of why this is whitelisted.',
|
|
1074
|
+
},
|
|
1075
|
+
{
|
|
1076
|
+
name: 'patterns',
|
|
1077
|
+
type: 'array',
|
|
1078
|
+
required: false,
|
|
1079
|
+
description: 'Additional patterns to match (e.g., ["fs/*", "node:fs"]).',
|
|
1080
|
+
},
|
|
1081
|
+
],
|
|
1082
|
+
handler: async (args) => {
|
|
1083
|
+
const { handleWhitelistAdd } = await import('./mcp-tools/whitelistTools.js');
|
|
1084
|
+
return handleWhitelistAdd(args);
|
|
1085
|
+
},
|
|
1086
|
+
},
|
|
1087
|
+
{
|
|
1088
|
+
name: 'whitelist_update',
|
|
1089
|
+
description: 'Update the status of a whitelist entry.',
|
|
1090
|
+
parameters: [
|
|
1091
|
+
{
|
|
1092
|
+
name: 'name',
|
|
1093
|
+
type: 'string',
|
|
1094
|
+
required: true,
|
|
1095
|
+
description: 'Name of the whitelist entry to update.',
|
|
1096
|
+
},
|
|
1097
|
+
{
|
|
1098
|
+
name: 'status',
|
|
1099
|
+
type: 'string',
|
|
1100
|
+
required: true,
|
|
1101
|
+
description: 'New status for the entry.',
|
|
1102
|
+
enum: ['active', 'pending', 'rejected', 'disabled'],
|
|
1289
1103
|
},
|
|
1290
1104
|
],
|
|
1105
|
+
handler: async (args) => {
|
|
1106
|
+
const { handleWhitelistUpdateStatus } = await import('./mcp-tools/whitelistTools.js');
|
|
1107
|
+
return handleWhitelistUpdateStatus(args);
|
|
1108
|
+
},
|
|
1109
|
+
},
|
|
1110
|
+
{
|
|
1111
|
+
name: 'whitelist_detect',
|
|
1112
|
+
description: 'Detect potential whitelist candidates from package.json and usage patterns.',
|
|
1113
|
+
parameters: [
|
|
1114
|
+
{
|
|
1115
|
+
name: 'path',
|
|
1116
|
+
type: 'string',
|
|
1117
|
+
required: false,
|
|
1118
|
+
description: 'Project path to analyze (defaults to current directory).',
|
|
1119
|
+
default: process.cwd(),
|
|
1120
|
+
},
|
|
1121
|
+
{
|
|
1122
|
+
name: 'includePackageJson',
|
|
1123
|
+
type: 'boolean',
|
|
1124
|
+
required: false,
|
|
1125
|
+
description: 'Include dependencies from package.json.',
|
|
1126
|
+
default: true,
|
|
1127
|
+
},
|
|
1128
|
+
{
|
|
1129
|
+
name: 'autoPopulate',
|
|
1130
|
+
type: 'boolean',
|
|
1131
|
+
required: false,
|
|
1132
|
+
description: 'Automatically add high-confidence entries.',
|
|
1133
|
+
default: false,
|
|
1134
|
+
},
|
|
1135
|
+
],
|
|
1136
|
+
handler: async (args) => {
|
|
1137
|
+
const { handleWhitelistDetect } = await import('./mcp-tools/whitelistTools.js');
|
|
1138
|
+
return handleWhitelistDetect(args);
|
|
1139
|
+
},
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
name: 'rules_list',
|
|
1143
|
+
description: 'List all configured invariant rules from .codeauditor.json. Shows rule IDs, kinds, severity, and messages.',
|
|
1144
|
+
parameters: [
|
|
1145
|
+
{
|
|
1146
|
+
name: 'configPath',
|
|
1147
|
+
type: 'string',
|
|
1148
|
+
required: false,
|
|
1149
|
+
description: 'Path to .codeauditor.json (defaults to auto-detect in current working tree).',
|
|
1150
|
+
},
|
|
1151
|
+
],
|
|
1152
|
+
handler: async (args) => {
|
|
1153
|
+
const { readFileSync } = await import('fs');
|
|
1154
|
+
const path = await import('path');
|
|
1155
|
+
const configPath = args.configPath ||
|
|
1156
|
+
path.join(process.cwd(), '.codeauditor.json');
|
|
1157
|
+
try {
|
|
1158
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
1159
|
+
const config = JSON.parse(raw);
|
|
1160
|
+
const rules = config?.rules ?? [];
|
|
1161
|
+
return {
|
|
1162
|
+
rules: rules.map((r) => ({
|
|
1163
|
+
id: r.id,
|
|
1164
|
+
kind: r.kind,
|
|
1165
|
+
severity: r.severity,
|
|
1166
|
+
message: r.message || null,
|
|
1167
|
+
})),
|
|
1168
|
+
count: rules.length,
|
|
1169
|
+
configPath,
|
|
1170
|
+
};
|
|
1171
|
+
}
|
|
1172
|
+
catch (err) {
|
|
1173
|
+
return {
|
|
1174
|
+
error: `Failed to read rules: ${err.message}`,
|
|
1175
|
+
configPath,
|
|
1176
|
+
rules: [],
|
|
1177
|
+
count: 0,
|
|
1178
|
+
};
|
|
1179
|
+
}
|
|
1180
|
+
},
|
|
1181
|
+
},
|
|
1182
|
+
{
|
|
1183
|
+
name: 'rules_check',
|
|
1184
|
+
description: 'Validate the current .codeauditor.json rules (schema, duplicate IDs, valid globs/regex, mutual exclusivity). Returns any config errors.',
|
|
1185
|
+
parameters: [
|
|
1186
|
+
{
|
|
1187
|
+
name: 'configPath',
|
|
1188
|
+
type: 'string',
|
|
1189
|
+
required: false,
|
|
1190
|
+
description: 'Path to .codeauditor.json (defaults to auto-detect in current working tree).',
|
|
1191
|
+
},
|
|
1192
|
+
],
|
|
1193
|
+
handler: async (args) => {
|
|
1194
|
+
const { validateRulesConfig } = await import('./invariants/ruleValidator.js');
|
|
1195
|
+
const { readFileSync } = await import('fs');
|
|
1196
|
+
const path = await import('path');
|
|
1197
|
+
const configPath = args.configPath ||
|
|
1198
|
+
path.join(process.cwd(), '.codeauditor.json');
|
|
1199
|
+
try {
|
|
1200
|
+
const raw = readFileSync(configPath, 'utf-8');
|
|
1201
|
+
const config = JSON.parse(raw);
|
|
1202
|
+
const rulesArray = config?.rules;
|
|
1203
|
+
const errors = validateRulesConfig({ rules: rulesArray ?? [] });
|
|
1204
|
+
return {
|
|
1205
|
+
valid: errors.length === 0,
|
|
1206
|
+
errors: errors.map(e => ({ ruleId: e.ruleId || null, message: e.message })),
|
|
1207
|
+
configPath,
|
|
1208
|
+
};
|
|
1209
|
+
}
|
|
1210
|
+
catch (err) {
|
|
1211
|
+
return {
|
|
1212
|
+
valid: false,
|
|
1213
|
+
errors: [{ message: `Failed to read/parse config: ${err.message}` }],
|
|
1214
|
+
configPath,
|
|
1215
|
+
};
|
|
1216
|
+
}
|
|
1217
|
+
},
|
|
1218
|
+
},
|
|
1219
|
+
];
|
|
1220
|
+
function registerConfigTool(registry) {
|
|
1221
|
+
registry.register({
|
|
1222
|
+
name: 'config',
|
|
1223
|
+
description: 'Manage analyzer configurations, generate AI tool configs, manage whitelists, and manage invariant rules. Actions: get, set, reset (analyzer configs), generate (AI tool config files), whitelist_list, whitelist_add, whitelist_update, whitelist_detect, rules_list, rules_check.',
|
|
1224
|
+
actions: configActions,
|
|
1291
1225
|
});
|
|
1292
|
-
|
|
1226
|
+
}
|
|
1227
|
+
// ── telemetry ──────────────────────────────────────────────────────────────
|
|
1228
|
+
function registerTelemetryTool(registry) {
|
|
1293
1229
|
registry.register({
|
|
1294
1230
|
name: 'telemetry',
|
|
1295
1231
|
description: 'Manage anonymous dismissal feedback opt-in (default OFF). Actions: status, enable, disable. When enabled, a dismissal and its reason are sent to the feedback endpoint, grouped by an anonymous install ID generated locally.',
|
|
@@ -1342,7 +1278,9 @@ function registerAllTools(registry) {
|
|
|
1342
1278
|
},
|
|
1343
1279
|
],
|
|
1344
1280
|
});
|
|
1345
|
-
|
|
1281
|
+
}
|
|
1282
|
+
// ── code_map ───────────────────────────────────────────────────────────────
|
|
1283
|
+
function registerCodeMapTool(registry) {
|
|
1346
1284
|
registry.register({
|
|
1347
1285
|
name: 'code_map',
|
|
1348
1286
|
description: 'Retrieve sections of previously generated code maps. Actions: get (retrieve a specific section), list (list all available sections for a map).',
|
|
@@ -1370,7 +1308,7 @@ function registerAllTools(registry) {
|
|
|
1370
1308
|
if (!mapId || !sectionType)
|
|
1371
1309
|
return { success: false, error: 'Both mapId and sectionType are required' };
|
|
1372
1310
|
const db = await getDatabase();
|
|
1373
|
-
const section = await db.getCodeMapSection(mapId, sectionType);
|
|
1311
|
+
const section = await db.codeMap.getCodeMapSection(mapId, sectionType);
|
|
1374
1312
|
if (section) {
|
|
1375
1313
|
return { success: true, mapId, sectionType, content: section.content, metadata: section.metadata };
|
|
1376
1314
|
}
|
|
@@ -1393,13 +1331,15 @@ function registerAllTools(registry) {
|
|
|
1393
1331
|
if (!mapId)
|
|
1394
1332
|
return { success: false, error: 'mapId is required' };
|
|
1395
1333
|
const db = await getDatabase();
|
|
1396
|
-
const sections = await db.listCodeMapSections(mapId);
|
|
1334
|
+
const sections = await db.codeMap.listCodeMapSections(mapId);
|
|
1397
1335
|
return { success: true, mapId, sections, totalSections: sections.length };
|
|
1398
1336
|
},
|
|
1399
1337
|
},
|
|
1400
1338
|
],
|
|
1401
1339
|
});
|
|
1402
|
-
|
|
1340
|
+
}
|
|
1341
|
+
// ── tasks ──────────────────────────────────────────────────────────────────
|
|
1342
|
+
function registerTasksTool(registry) {
|
|
1403
1343
|
registry.register({
|
|
1404
1344
|
name: 'tasks',
|
|
1405
1345
|
description: 'Manage a persistent per-project task queue. Tasks survive index resets. Actions: create, list, list_tree, get, update, complete, delete, from_audit (create tasks from audit violations with deduplication).',
|
|
@@ -1408,7 +1348,7 @@ function registerAllTools(registry) {
|
|
|
1408
1348
|
name: 'create',
|
|
1409
1349
|
description: 'Create a new task.',
|
|
1410
1350
|
parameters: [
|
|
1411
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1351
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1412
1352
|
{ name: 'title', type: 'string', required: true, description: 'Task title.' },
|
|
1413
1353
|
{ name: 'description', type: 'string', required: false, description: 'Longer description.' },
|
|
1414
1354
|
{ name: 'status', type: 'string', required: false, description: 'Initial status.', enum: ['pending', 'in_progress', 'blocked', 'done', 'cancelled'] },
|
|
@@ -1432,7 +1372,7 @@ function registerAllTools(registry) {
|
|
|
1432
1372
|
name: 'list',
|
|
1433
1373
|
description: 'List tasks (flat). Supports filtering by status, priority, labels, source, query text search.',
|
|
1434
1374
|
parameters: [
|
|
1435
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1375
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1436
1376
|
{ name: 'status', type: 'string', required: false, description: 'Filter by status.', enum: ['pending', 'in_progress', 'blocked', 'done', 'cancelled'] },
|
|
1437
1377
|
{ name: 'priority', type: 'string', required: false, description: 'Filter by priority.', enum: ['low', 'medium', 'high'] },
|
|
1438
1378
|
{ name: 'label', type: 'string', required: false, description: 'Filter by label.' },
|
|
@@ -1452,7 +1392,7 @@ function registerAllTools(registry) {
|
|
|
1452
1392
|
name: 'list_tree',
|
|
1453
1393
|
description: 'List tasks as a tree (parent-child hierarchy).',
|
|
1454
1394
|
parameters: [
|
|
1455
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1395
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1456
1396
|
{ name: 'status', type: 'string', required: false, description: 'Filter by status.', enum: ['pending', 'in_progress', 'blocked', 'done', 'cancelled'] },
|
|
1457
1397
|
{ name: 'limit', type: 'number', required: false, description: 'Max tasks (default 500).' },
|
|
1458
1398
|
],
|
|
@@ -1465,7 +1405,7 @@ function registerAllTools(registry) {
|
|
|
1465
1405
|
name: 'get',
|
|
1466
1406
|
description: 'Get a single task by ID.',
|
|
1467
1407
|
parameters: [
|
|
1468
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1408
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1469
1409
|
{ name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
|
|
1470
1410
|
],
|
|
1471
1411
|
handler: async (args, signal) => {
|
|
@@ -1477,7 +1417,7 @@ function registerAllTools(registry) {
|
|
|
1477
1417
|
name: 'update',
|
|
1478
1418
|
description: 'Update a task with a patch of partial fields.',
|
|
1479
1419
|
parameters: [
|
|
1480
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1420
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1481
1421
|
{ name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
|
|
1482
1422
|
{ name: 'patch', type: 'object', required: true, description: 'Partial fields to update.' },
|
|
1483
1423
|
],
|
|
@@ -1490,7 +1430,7 @@ function registerAllTools(registry) {
|
|
|
1490
1430
|
name: 'complete',
|
|
1491
1431
|
description: 'Mark a task as completed.',
|
|
1492
1432
|
parameters: [
|
|
1493
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1433
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1494
1434
|
{ name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
|
|
1495
1435
|
],
|
|
1496
1436
|
handler: async (args, signal) => {
|
|
@@ -1502,7 +1442,7 @@ function registerAllTools(registry) {
|
|
|
1502
1442
|
name: 'delete',
|
|
1503
1443
|
description: 'Delete a task. Mode: reject (default, refuse if subtasks exist), detach (move subtasks up), cascade (delete subtree).',
|
|
1504
1444
|
parameters: [
|
|
1505
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1445
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1506
1446
|
{ name: 'taskId', type: 'string', required: true, description: 'Task ID.' },
|
|
1507
1447
|
{ name: 'mode', type: 'string', required: false, description: 'Delete mode.', enum: ['reject', 'detach', 'cascade'] },
|
|
1508
1448
|
],
|
|
@@ -1515,10 +1455,9 @@ function registerAllTools(registry) {
|
|
|
1515
1455
|
name: 'from_audit',
|
|
1516
1456
|
description: 'Create tasks from audit violations with deduplication. Each violation gets a stable fingerprint; violations matching existing open tasks are skipped.',
|
|
1517
1457
|
parameters: [
|
|
1518
|
-
{ name: 'projectPath', type: 'string', required: false, description:
|
|
1458
|
+
{ name: 'projectPath', type: 'string', required: false, description: PROJECT_ROOT_DESCRIPTION },
|
|
1519
1459
|
{ name: 'auditJobId', type: 'string', required: false, description: 'Audit job ID. Omit to use most recent completed audit.' },
|
|
1520
1460
|
{ name: 'severities', type: 'array', required: false, description: 'Severities to include (default: critical, severe).' },
|
|
1521
|
-
{ name: 'analyzers', type: 'array', required: false, description: 'Filter violations by analyzer name.' },
|
|
1522
1461
|
{ name: 'paths', type: 'array', required: false, description: 'Filter violations by file path globs.' },
|
|
1523
1462
|
],
|
|
1524
1463
|
handler: async (args, signal) => {
|
|
@@ -1528,7 +1467,9 @@ function registerAllTools(registry) {
|
|
|
1528
1467
|
},
|
|
1529
1468
|
],
|
|
1530
1469
|
});
|
|
1531
|
-
|
|
1470
|
+
}
|
|
1471
|
+
// ── guide ──────────────────────────────────────────────────────────────────
|
|
1472
|
+
function registerGuideTool(registry) {
|
|
1532
1473
|
registry.register({
|
|
1533
1474
|
name: 'guide',
|
|
1534
1475
|
description: 'Get recommended workflows and best practices for using the code auditor tools effectively. Single action: get.',
|
|
@@ -1559,7 +1500,7 @@ function registerAllTools(registry) {
|
|
|
1559
1500
|
catch (error) {
|
|
1560
1501
|
return {
|
|
1561
1502
|
success: false,
|
|
1562
|
-
error: error
|
|
1503
|
+
error: errorMessage(error),
|
|
1563
1504
|
availableScenarios: [
|
|
1564
1505
|
'initial-setup',
|
|
1565
1506
|
'react-development',
|
|
@@ -1575,6 +1516,20 @@ function registerAllTools(registry) {
|
|
|
1575
1516
|
],
|
|
1576
1517
|
});
|
|
1577
1518
|
}
|
|
1519
|
+
/**
|
|
1520
|
+
* Register every MCP tool and its actions on the given registry.
|
|
1521
|
+
* @param registry - The tool registry to register tools on.
|
|
1522
|
+
*/
|
|
1523
|
+
export function registerAllTools(registry) {
|
|
1524
|
+
registerAuditTool(registry);
|
|
1525
|
+
registerSearchTool(registry);
|
|
1526
|
+
registerIndexTool(registry);
|
|
1527
|
+
registerConfigTool(registry);
|
|
1528
|
+
registerTelemetryTool(registry);
|
|
1529
|
+
registerCodeMapTool(registry);
|
|
1530
|
+
registerTasksTool(registry);
|
|
1531
|
+
registerGuideTool(registry);
|
|
1532
|
+
}
|
|
1578
1533
|
// ── MCP Server ───────────────────────────────────────────────────────────────
|
|
1579
1534
|
async function startMcpServer() {
|
|
1580
1535
|
logMcpInfo('startup', `code-auditor-mcp ${PACKAGE_VERSION} (stdio)`, {
|
|
@@ -1731,9 +1686,31 @@ async function main() {
|
|
|
1731
1686
|
// --stdio (default): start the MCP server
|
|
1732
1687
|
await startMcpServer();
|
|
1733
1688
|
}
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1689
|
+
// Start the server only when this file is the entry point (mirrors mcp-ui-simple).
|
|
1690
|
+
// Guarding `main()` lets tests import `registerAllTools` without booting the stdio
|
|
1691
|
+
// server (Spec 66 follow-up R5 — the entry-point conformance test must enumerate
|
|
1692
|
+
// the real `audit.run` / `audit.health` handlers, not a fake).
|
|
1693
|
+
//
|
|
1694
|
+
// Compare realpaths, not string-built URLs: `import.meta.url` is symlink-resolved
|
|
1695
|
+
// by Node, while `process.argv[1]` under a pnpm/npm `.bin` shim is the shim path
|
|
1696
|
+
// (or a symlinked path) that Node does not resolve. The two string forms diverge
|
|
1697
|
+
// on a symlinked install, so the naive `file://${argv[1]}` comparison never matches
|
|
1698
|
+
// and the published `code-auditor-mcp` bin boots to an immediate silent exit.
|
|
1699
|
+
function isMainModule() {
|
|
1700
|
+
if (!process.argv[1])
|
|
1701
|
+
return false;
|
|
1702
|
+
try {
|
|
1703
|
+
return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(process.argv[1]);
|
|
1704
|
+
}
|
|
1705
|
+
catch {
|
|
1706
|
+
return false;
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
if (isMainModule()) {
|
|
1710
|
+
main().catch((error) => {
|
|
1711
|
+
console.error(chalk.red('[ERROR]'), 'Failed to start:', error);
|
|
1712
|
+
console.error(chalk.red('[ERROR]'), 'Stack:', error.stack);
|
|
1713
|
+
process.exitCode = 1;
|
|
1714
|
+
});
|
|
1715
|
+
}
|
|
1739
1716
|
//# sourceMappingURL=mcp.js.map
|