code-auditor-mcp 5.0.2 → 5.3.3
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 +326 -3
- package/README.md +24 -2
- package/configs/hhra-compat.json +12 -118
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +11 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +57 -52
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
- package/dist/analyzers/provenance.d.ts +9 -4
- package/dist/analyzers/provenance.d.ts.map +1 -1
- package/dist/analyzers/provenance.js +8 -25
- package/dist/analyzers/provenance.js.map +1 -1
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +35 -14
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/ruleRegistry.js +4 -4
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/ruleTiming.d.ts +1 -1
- package/dist/analyzers/ruleTiming.js +2 -2
- package/dist/analyzers/ruleTiming.js.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +22 -26
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +0 -2
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +4 -5
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts +32 -15
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +189 -115
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +0 -2
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +0 -5
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +2 -10
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +7 -49
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.js +51 -3
- package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
- package/dist/analyzers/universal/schema/config.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/config.js +0 -2
- package/dist/analyzers/universal/schema/config.js.map +1 -1
- package/dist/analyzers/universal/schema/types.d.ts +0 -2
- package/dist/analyzers/universal/schema/types.d.ts.map +1 -1
- package/dist/analyzers/vendorSurfaces.d.ts +126 -0
- package/dist/analyzers/vendorSurfaces.d.ts.map +1 -0
- package/dist/analyzers/vendorSurfaces.js +580 -0
- package/dist/analyzers/vendorSurfaces.js.map +1 -0
- package/dist/auditRunner.d.ts +9 -1
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +198 -146
- package/dist/auditRunner.js.map +1 -1
- package/dist/cacheGc.d.ts +88 -0
- package/dist/cacheGc.d.ts.map +1 -0
- package/dist/cacheGc.js +196 -0
- package/dist/cacheGc.js.map +1 -0
- package/dist/churn/churnExtractor.d.ts +0 -1
- package/dist/churn/churnExtractor.d.ts.map +1 -1
- package/dist/churn/churnExtractor.js +2 -4
- package/dist/churn/churnExtractor.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +260 -47
- package/dist/cli.js.map +1 -1
- package/dist/codeIndex/migrations.d.ts.map +1 -1
- package/dist/codeIndex/migrations.js +4 -3
- package/dist/codeIndex/migrations.js.map +1 -1
- package/dist/codeIndexDB.d.ts +11 -2
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +27 -2
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/config/configLoader.d.ts +60 -7
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +252 -60
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +137 -43
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +174 -101
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/effectiveConfig.d.ts +1 -1
- package/dist/config/effectiveConfig.d.ts.map +1 -1
- package/dist/config/effectiveConfig.js +4 -6
- package/dist/config/effectiveConfig.js.map +1 -1
- package/dist/config/pathProfiles.d.ts +4 -3
- package/dist/config/pathProfiles.d.ts.map +1 -1
- package/dist/config/pathProfiles.js +3 -2
- package/dist/config/pathProfiles.js.map +1 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/daemon/main.d.ts +0 -1
- package/dist/daemon/main.d.ts.map +1 -1
- package/dist/daemon/main.js +11 -4
- package/dist/daemon/main.js.map +1 -1
- package/dist/dataPaths.d.ts +32 -9
- package/dist/dataPaths.d.ts.map +1 -1
- package/dist/dataPaths.js +69 -16
- package/dist/dataPaths.js.map +1 -1
- package/dist/hookLog.d.ts +54 -0
- package/dist/hookLog.d.ts.map +1 -0
- package/dist/hookLog.js +105 -0
- package/dist/hookLog.js.map +1 -0
- package/dist/hookLogPath.generated.d.ts +3 -0
- package/dist/hookLogPath.generated.d.ts.map +1 -0
- package/dist/hookLogPath.generated.js +8 -0
- package/dist/hookLogPath.generated.js.map +1 -0
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +1 -1
- package/dist/installConfig.d.ts +15 -2
- package/dist/installConfig.d.ts.map +1 -1
- package/dist/installConfig.js +17 -2
- package/dist/installConfig.js.map +1 -1
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +2 -1
- package/dist/installer.js.map +1 -1
- package/dist/languages/adapterBridge.d.ts +11 -0
- package/dist/languages/adapterBridge.d.ts.map +1 -1
- package/dist/languages/adapterBridge.js +11 -0
- package/dist/languages/adapterBridge.js.map +1 -1
- package/dist/languages/types.d.ts +8 -0
- package/dist/languages/types.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +13 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +135 -18
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/ledger.d.ts +7 -0
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +7 -0
- package/dist/ledger.js.map +1 -1
- package/dist/mcp-tools/workflowGuide.js +8 -8
- package/dist/mcp-tools/workflowGuide.js.map +1 -1
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +5 -2
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp-ui-simple.d.ts +5 -0
- package/dist/mcp-ui-simple.d.ts.map +1 -1
- package/dist/mcp-ui-simple.js +9 -2
- package/dist/mcp-ui-simple.js.map +1 -1
- package/dist/mcp.d.ts +0 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +36 -33
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts +10 -0
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +10 -1
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/mcpAutoIndex.d.ts.map +1 -1
- package/dist/mcpAutoIndex.js +2 -1
- package/dist/mcpAutoIndex.js.map +1 -1
- package/dist/mcpDiagnostics.d.ts +2 -0
- package/dist/mcpDiagnostics.d.ts.map +1 -1
- package/dist/mcpDiagnostics.js +2 -0
- package/dist/mcpDiagnostics.js.map +1 -1
- package/dist/phase/candidates.d.ts +53 -0
- package/dist/phase/candidates.d.ts.map +1 -0
- package/dist/phase/candidates.js +67 -0
- package/dist/phase/candidates.js.map +1 -0
- package/dist/phase/colorMath.d.ts +18 -5
- package/dist/phase/colorMath.d.ts.map +1 -1
- package/dist/phase/colorMath.js +88 -5
- package/dist/phase/colorMath.js.map +1 -1
- package/dist/phase/dataAccessCallsCandidates.js +1 -1
- package/dist/phase/dataAccessCallsCandidates.js.map +1 -1
- package/dist/phase/goFunctionAnalysis.d.ts +2 -2
- package/dist/phase/goFunctionAnalysis.js +2 -2
- package/dist/phase/goFunctions.d.ts +2 -2
- package/dist/phase/goFunctions.js +2 -2
- package/dist/phase/goImports.d.ts +2 -2
- package/dist/phase/goImports.js +2 -2
- package/dist/phase/goSwitches.d.ts +2 -2
- package/dist/phase/goSwitches.js +2 -2
- package/dist/phase/imports.d.ts.map +1 -1
- package/dist/phase/imports.js +1 -0
- package/dist/phase/imports.js.map +1 -1
- package/dist/phase/loopQueryCandidates.js +1 -1
- package/dist/phase/loopQueryCandidates.js.map +1 -1
- package/dist/phase/oracles.d.ts +28 -0
- package/dist/phase/oracles.d.ts.map +1 -1
- package/dist/phase/oracles.js +28 -0
- package/dist/phase/oracles.js.map +1 -1
- package/dist/phase/phaseModel.d.ts +47 -8
- package/dist/phase/phaseModel.d.ts.map +1 -1
- package/dist/phase/phaseModel.js +44 -8
- package/dist/phase/phaseModel.js.map +1 -1
- package/dist/phase/producers.d.ts.map +1 -1
- package/dist/phase/producers.js +24 -17
- package/dist/phase/producers.js.map +1 -1
- package/dist/phase/reachability.d.ts +44 -1
- package/dist/phase/reachability.d.ts.map +1 -1
- package/dist/phase/reachability.js +79 -0
- package/dist/phase/reachability.js.map +1 -1
- package/dist/phase/rules/conventions.d.ts.map +1 -1
- package/dist/phase/rules/conventions.js +6 -2
- package/dist/phase/rules/conventions.js.map +1 -1
- package/dist/phase/rules/crossDomain.d.ts.map +1 -1
- package/dist/phase/rules/crossDomain.js +16 -6
- package/dist/phase/rules/crossDomain.js.map +1 -1
- package/dist/phase/rules/dataAccess.d.ts.map +1 -1
- package/dist/phase/rules/dataAccess.js +13 -0
- package/dist/phase/rules/dataAccess.js.map +1 -1
- package/dist/phase/rules/documentation.d.ts.map +1 -1
- package/dist/phase/rules/documentation.js +11 -1
- package/dist/phase/rules/documentation.js.map +1 -1
- package/dist/phase/rules/dry.d.ts +16 -7
- package/dist/phase/rules/dry.d.ts.map +1 -1
- package/dist/phase/rules/dry.js +51 -32
- package/dist/phase/rules/dry.js.map +1 -1
- package/dist/phase/rules/goRules.d.ts +2 -2
- package/dist/phase/rules/goRules.js +2 -2
- package/dist/phase/rules/secrets.d.ts +22 -8
- package/dist/phase/rules/secrets.d.ts.map +1 -1
- package/dist/phase/rules/secrets.js +75 -69
- package/dist/phase/rules/secrets.js.map +1 -1
- package/dist/phase/rules/styles.d.ts +23 -9
- package/dist/phase/rules/styles.d.ts.map +1 -1
- package/dist/phase/rules/styles.js +61 -15
- package/dist/phase/rules/styles.js.map +1 -1
- package/dist/phase/rules/unreferencedModule.d.ts.map +1 -1
- package/dist/phase/rules/unreferencedModule.js +32 -10
- package/dist/phase/rules/unreferencedModule.js.map +1 -1
- package/dist/phase/runner.d.ts +16 -7
- package/dist/phase/runner.d.ts.map +1 -1
- package/dist/phase/runner.js +32 -20
- package/dist/phase/runner.js.map +1 -1
- package/dist/phase/stringLiterals.d.ts.map +1 -1
- package/dist/phase/stringLiterals.js +16 -7
- package/dist/phase/stringLiterals.js.map +1 -1
- package/dist/phase/stylesCss.d.ts.map +1 -1
- package/dist/phase/stylesCss.js +4 -0
- package/dist/phase/stylesCss.js.map +1 -1
- package/dist/phase/stylesMarkup.d.ts.map +1 -1
- package/dist/phase/stylesMarkup.js +4 -0
- package/dist/phase/stylesMarkup.js.map +1 -1
- package/dist/phase/stylesSource.d.ts.map +1 -1
- package/dist/phase/stylesSource.js +6 -0
- package/dist/phase/stylesSource.js.map +1 -1
- package/dist/phase/testProgram.d.ts +57 -0
- package/dist/phase/testProgram.d.ts.map +1 -0
- package/dist/phase/testProgram.js +244 -0
- package/dist/phase/testProgram.js.map +1 -0
- package/dist/phase/typeDeclarations.d.ts +2 -2
- package/dist/phase/typeDeclarations.js +2 -2
- package/dist/phase/types.d.ts +104 -0
- package/dist/phase/types.d.ts.map +1 -1
- package/dist/pipeline.d.ts +4 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +4 -0
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +1 -171
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +47 -1281
- package/dist/pipelineAdapters.js.map +1 -1
- package/dist/reporting/csvReportGenerator.d.ts.map +1 -1
- package/dist/reporting/csvReportGenerator.js +0 -6
- package/dist/reporting/csvReportGenerator.js.map +1 -1
- package/dist/reporting/htmlReportGenerator.d.ts.map +1 -1
- package/dist/reporting/htmlReportGenerator.js +0 -4
- package/dist/reporting/htmlReportGenerator.js.map +1 -1
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.js +0 -1
- package/dist/reporting/jsonReportGenerator.js.map +1 -1
- package/dist/reporting/sarifReportGenerator.d.ts.map +1 -1
- package/dist/reporting/sarifReportGenerator.js +0 -7
- package/dist/reporting/sarifReportGenerator.js.map +1 -1
- package/dist/services/auditJobService.d.ts +15 -0
- package/dist/services/auditJobService.d.ts.map +1 -1
- package/dist/services/auditJobService.js +15 -0
- package/dist/services/auditJobService.js.map +1 -1
- package/dist/services/projectTaskHelpers.d.ts +7 -0
- package/dist/services/projectTaskHelpers.d.ts.map +1 -1
- package/dist/services/projectTaskHelpers.js +7 -0
- package/dist/services/projectTaskHelpers.js.map +1 -1
- package/dist/services/whitelistService.d.ts +28 -0
- package/dist/services/whitelistService.d.ts.map +1 -1
- package/dist/services/whitelistService.js +28 -0
- package/dist/services/whitelistService.js.map +1 -1
- package/dist/sqlite/driver.d.ts +17 -1
- package/dist/sqlite/driver.d.ts.map +1 -1
- package/dist/sqlite/driver.js +28 -5
- package/dist/sqlite/driver.js.map +1 -1
- package/dist/styles/cssInJsHarvest.d.ts +36 -0
- package/dist/styles/cssInJsHarvest.d.ts.map +1 -0
- package/dist/styles/cssInJsHarvest.js +78 -0
- package/dist/styles/cssInJsHarvest.js.map +1 -0
- package/dist/styles/definedClasses.d.ts +95 -0
- package/dist/styles/definedClasses.d.ts.map +1 -0
- package/dist/styles/definedClasses.js +129 -0
- package/dist/styles/definedClasses.js.map +1 -0
- package/dist/styles/markupStyleHarvest.d.ts +33 -0
- package/dist/styles/markupStyleHarvest.d.ts.map +1 -0
- package/dist/styles/markupStyleHarvest.js +73 -0
- package/dist/styles/markupStyleHarvest.js.map +1 -0
- package/dist/styles/styleExtractor.d.ts +37 -0
- package/dist/styles/styleExtractor.d.ts.map +1 -1
- package/dist/styles/styleExtractor.js +89 -33
- package/dist/styles/styleExtractor.js.map +1 -1
- package/dist/styles/styleIndexer.d.ts.map +1 -1
- package/dist/styles/styleIndexer.js +11 -10
- package/dist/styles/styleIndexer.js.map +1 -1
- package/dist/styles/tailwindExpander.d.ts.map +1 -1
- package/dist/styles/tailwindExpander.js +31 -10
- package/dist/styles/tailwindExpander.js.map +1 -1
- package/dist/styles/tailwindUtilityExpander.d.ts +4 -0
- package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
- package/dist/styles/tailwindUtilityExpander.js +4 -0
- package/dist/styles/tailwindUtilityExpander.js.map +1 -1
- package/dist/telemetry.d.ts +67 -1
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +100 -20
- package/dist/telemetry.js.map +1 -1
- package/dist/types/crossLanguage.d.ts +1 -0
- package/dist/types/crossLanguage.d.ts.map +1 -1
- package/dist/types.d.ts +73 -56
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -4
- package/dist/types.js.map +1 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +1 -1
- package/examples/.auditrc.example.json +7 -22
- package/examples/.auditrc.json +12 -155
- package/examples/.code-auditor.json +8 -51
- package/examples/nextjs.auditrc.json +7 -34
- package/examples/node-api.auditrc.json +6 -46
- package/examples/react.auditrc.json +8 -25
- package/examples/tolerant-solid.auditrc.json +12 -44
- package/package.json +8 -5
- package/plugin/.claude-plugin/manifest.json +10 -9
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/hooks.json +4 -4
- package/plugin/scripts/hook-audit.sh +25 -10
- package/plugin/scripts/hook-common.sh +12 -7
- package/plugin/scripts/hook-drift-check.sh +10 -1
- package/plugin/scripts/hook-log-path.sh +7 -0
- package/plugin/scripts/hook-self-audit.sh +21 -6
- package/plugin/scripts/hook-warm.sh +17 -11
- package/plugin/skills/code-auditor/SKILL.md +26 -3
- package/server.json +2 -2
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts +0 -6
- package/dist/__tests__/fixtures/spec-20/scripts/tool.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js +0 -12
- package/dist/__tests__/fixtures/spec-20/scripts/tool.js.map +0 -1
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts +0 -7
- package/dist/__tests__/fixtures/spec-20/src/demo-module.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js +0 -13
- package/dist/__tests__/fixtures/spec-20/src/demo-module.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.d.ts +0 -14
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.js +0 -16
- package/dist/__tests__/fixtures/spec-52/item-01-prepare-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.d.ts +0 -15
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.js +0 -17
- package/dist/__tests__/fixtures/spec-52/item-02-prepare-bind-accumulate-batch.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts +0 -14
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-03-exec-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts +0 -18
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-04-storage-sql-exec-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.d.ts +0 -19
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-05-upsert-forms.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts +0 -17
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-06-chained-prepare-run-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts +0 -25
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.js +0 -21
- package/dist/__tests__/fixtures/spec-52/item-07-chained-prepare-bind-first-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.d.ts +0 -15
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.js +0 -19
- package/dist/__tests__/fixtures/spec-52/item-08-promise-all-of-statements-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.d.ts +0 -14
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.js +0 -14
- package/dist/__tests__/fixtures/spec-52/item-09-promise-all-map-of-statements-in-loop.js.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts +0 -15
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.d.ts.map +0 -1
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.js +0 -16
- package/dist/__tests__/fixtures/spec-52/item-10-promise-all-map-of-eager-all-in-loop.js.map +0 -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 +0 -643
- package/dist/languages/go/analyzer-src/dataaccess.go +0 -388
- package/dist/languages/go/analyzer-src/go.mod +0 -3
- package/dist/languages/go/analyzer-src/indexer.go +0 -268
- package/dist/languages/go/analyzer-src/parser.go +0 -461
- package/dist/languages/go/analyzer-src/solid.go +0 -311
- package/dist/languages/go/analyzer-src/testconventions.go +0 -25
- package/dist/languages/go/analyzer-src/types.go +0 -156
- package/dist/languages/go/analyzer-windows-amd64.exe +0 -0
- package/dist/languages/go/go.mod +0 -7
- package/dist/languages/go/main.go +0 -203
- package/dist/native/ast-grep-napi.darwin-arm64.node +0 -0
- package/dist/native/ast-grep-napi.darwin-x64.node +0 -0
- package/dist/native/ast-grep-napi.linux-arm64-gnu.node +0 -0
- package/dist/native/ast-grep-napi.linux-arm64-musl.node +0 -0
- package/dist/native/ast-grep-napi.linux-x64-gnu.node +0 -0
- package/dist/native/ast-grep-napi.linux-x64-musl.node +0 -0
- package/dist/native/ast-grep-napi.win32-x64-msvc.node +0 -0
- package/dist/native-bootstrap.d.ts +0 -15
- package/dist/native-bootstrap.d.ts.map +0 -1
- package/dist/native-bootstrap.js +0 -75
- package/dist/native-bootstrap.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"churnExtractor.js","sourceRoot":"","sources":["../../src/churn/churnExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"churnExtractor.js","sourceRoot":"","sources":["../../src/churn/churnExtractor.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|
package/dist/cli.js
CHANGED
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Code Auditor CLI - Enhanced with AI Tool Integration
|
|
4
4
|
*/
|
|
5
|
-
// MUST be first import: sets NAPI_RS_NATIVE_LIBRARY_PATH before @ast-grep/napi loads
|
|
6
|
-
import './native-bootstrap.js';
|
|
7
5
|
import { Command } from 'commander';
|
|
8
6
|
import chalk from 'chalk';
|
|
9
7
|
import { createAuditRunner } from './auditRunner.js';
|
|
8
|
+
import { readHookNotice } from './hookLog.js';
|
|
10
9
|
import { promises as fs } from 'fs';
|
|
11
10
|
import { createInterface } from 'readline';
|
|
12
11
|
import { dirname, isAbsolute, join, relative, resolve } from 'path';
|
|
13
|
-
import { PACKAGE_VERSION } from './constants.js';
|
|
12
|
+
import { PACKAGE_VERSION, DEFAULT_RULE_REQUEST_BASE_URL } from './constants.js';
|
|
14
13
|
import inquirer from 'inquirer';
|
|
15
14
|
import { CodeMapGenerator } from './services/CodeMapGenerator.js';
|
|
16
15
|
import { initParsers } from './languages/index.js';
|
|
@@ -20,13 +19,16 @@ import { getFilesProcessed, getFactsConsumed, isVisitorStatus, isReducerStatus }
|
|
|
20
19
|
import { createBaselineFromFindings, saveBaseline, loadBaseline, diffBaselines } from './baseline.js';
|
|
21
20
|
import { fingerprint, buildFingerprintInput } from './fingerprint.js';
|
|
22
21
|
import { buildDismissalEntry, upsertDismissal } from './dismissals.js';
|
|
23
|
-
import { resolveTelemetryConfig, signatureForFinding, buildTelemetryPayload, formatTelemetryPreview, sendTelemetry, languageHint } from './telemetry.js';
|
|
22
|
+
import { resolveTelemetryConfig, signatureForFinding, buildTelemetryPayload, formatTelemetryPreview, sendTelemetry, languageHint, telemetryStatus, telemetryEnable, telemetryDisable, postJson } from './telemetry.js';
|
|
24
23
|
import { getInstallId } from './installConfig.js';
|
|
25
24
|
import { computeGatingDecision } from './enforcement/gate.js';
|
|
26
25
|
import { BLOCKING_SEVERITIES, SEVERITIES } from './types.js';
|
|
27
26
|
import { rankFilesByPriority, orderFindingsWithinFile } from './nextFile.js';
|
|
28
27
|
import { runNextFile } from './nextFileIncremental.js';
|
|
29
28
|
import { describeSqliteBackend } from './sqlite/driver.js';
|
|
29
|
+
import { isRuleTimingEnabled } from './analyzers/ruleTiming.js';
|
|
30
|
+
import { gateBudgetResolutions } from './config/defaults.js';
|
|
31
|
+
import { buildCandidatesArtifact } from './phase/candidates.js';
|
|
30
32
|
const program = new Command();
|
|
31
33
|
// Legacy severity names that were renamed off Spec-54's "advisory" back to "high"
|
|
32
34
|
// (Spec-54's third tier rendered as "advisory", which read as optional — the very
|
|
@@ -142,17 +144,6 @@ function printAuditDiagnostics(result) {
|
|
|
142
144
|
`${covCannotFire} cannot-fire · ${unprovenSiteCount} unproven sites · ` +
|
|
143
145
|
`${heldOutByProfile} held out by profile`));
|
|
144
146
|
}
|
|
145
|
-
// ── Skipped analyzers (Spec 61) ──────────────────────────────
|
|
146
|
-
const skippedAnalyzers = (result.metadata?.diagnostics ?? []).filter((d) => d.kind === 'go-toolchain-missing' ||
|
|
147
|
-
d.kind === 'go-analyzer-wrong-arch' ||
|
|
148
|
-
d.kind === 'go-analyzer-build-failed');
|
|
149
|
-
if (skippedAnalyzers.length > 0) {
|
|
150
|
-
console.log(chalk.yellow(`── Skipped analyzers ── ${skippedAnalyzers.length}`));
|
|
151
|
-
for (const d of skippedAnalyzers) {
|
|
152
|
-
const name = d.analyzerName || 'go';
|
|
153
|
-
console.log(chalk.yellow(` ${name} [${d.kind}] — ${d.message}`));
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
147
|
// ── Ignored config keys (Spec 61 R1.4) ─────────────────────────
|
|
157
148
|
const ignoredConfigKeys = (result.metadata?.diagnostics ?? []).filter((d) => d.kind === 'config-key-rejected');
|
|
158
149
|
if (ignoredConfigKeys.length > 0) {
|
|
@@ -192,6 +183,27 @@ function printAuditDiagnostics(result) {
|
|
|
192
183
|
console.log(chalk.yellow(` ${file} — ${entry.lines.length} site(s)${loc}: ${shown}${more}`));
|
|
193
184
|
}
|
|
194
185
|
}
|
|
186
|
+
// ── Per-rule unproven breakdown (K9) ──────────────────────────
|
|
187
|
+
// The raw unproven-site total answers "which analyzer produced these?"
|
|
188
|
+
// (`schema`); this answers the question the finding actually asks — "which
|
|
189
|
+
// rule may have under-reported?" One unproven site blanks every rule in its
|
|
190
|
+
// `affectedRules` set, so a rule's `count` is the number of sites that could
|
|
191
|
+
// have produced a finding under it, with `causes` naming the emission path
|
|
192
|
+
// that drove each (parse-failure / dialect-undetermined / unresolved-import /
|
|
193
|
+
// unproven-receiver). This is the missing discriminant: it surfaces the 465
|
|
194
|
+
// sites as *per-rule under-report risk*, not a single opaque analyzer total.
|
|
195
|
+
const unprovenByRule = result.summary?.unprovenSitesByRule;
|
|
196
|
+
if (unprovenByRule && Object.keys(unprovenByRule).length > 0) {
|
|
197
|
+
console.log(chalk.yellow(`── Unproven sites by rule ──`));
|
|
198
|
+
const ruleRows = Object.entries(unprovenByRule).sort(([, a], [, b]) => b.count - a.count);
|
|
199
|
+
for (const [rule, entry] of ruleRows) {
|
|
200
|
+
const causes = Object.entries(entry.causes)
|
|
201
|
+
.sort(([, a], [, b]) => b - a)
|
|
202
|
+
.map(([cause, n]) => `${n} ${cause}`)
|
|
203
|
+
.join(' · ');
|
|
204
|
+
console.log(chalk.yellow(` ${rule} — ${entry.count} site(s): ${causes}`));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
195
207
|
// ── Coverage gaps (Spec 58 follow-up) ─────────────────────────
|
|
196
208
|
const otherCoverageGaps = allDiagnostics.filter((d) => d.kind === 'unresolved-query' || d.kind === 'unresolved-dynamic-import' || d.kind === 'undefined-class-not-found');
|
|
197
209
|
if (otherCoverageGaps.length > 0) {
|
|
@@ -248,6 +260,19 @@ function printAuditDiagnostics(result) {
|
|
|
248
260
|
console.log(chalk.gray(` … and ${deadClusters.length - 10} more clusters`));
|
|
249
261
|
}
|
|
250
262
|
}
|
|
263
|
+
// ── Directive K10 — cache GC ─────────────────────────────────
|
|
264
|
+
// State what the GC collected so a silent delete of operator cache is visible.
|
|
265
|
+
const cacheGc = result.metadata?.cacheGc;
|
|
266
|
+
if (cacheGc && (cacheGc.removedCliVersions.length > 0 || cacheGc.removedProjects.length > 0)) {
|
|
267
|
+
const parts = [];
|
|
268
|
+
if (cacheGc.removedCliVersions.length > 0) {
|
|
269
|
+
parts.push(`${cacheGc.removedCliVersions.length} superseded CLI cop${cacheGc.removedCliVersions.length === 1 ? 'y' : 'ies'}`);
|
|
270
|
+
}
|
|
271
|
+
if (cacheGc.removedProjects.length > 0) {
|
|
272
|
+
parts.push(`${cacheGc.removedProjects.length} abandoned project index${cacheGc.removedProjects.length === 1 ? '' : 'es'}`);
|
|
273
|
+
}
|
|
274
|
+
console.log(chalk.gray(`── Cache GC ── collected ${parts.join(' and ')}`));
|
|
275
|
+
}
|
|
251
276
|
}
|
|
252
277
|
/**
|
|
253
278
|
* Print the findings summary: the delta view when a baseline exists, or the
|
|
@@ -563,6 +588,7 @@ program
|
|
|
563
588
|
.option('--preset <id>', 'Apply a shareable preset (repeatable)', (v, prev) => prev.concat([v]), [])
|
|
564
589
|
.option('--detach', 'Run the audit in a detached background process and print the job ID')
|
|
565
590
|
.option('--explain-skipped', 'Print a per-reason breakdown of files dropped from analysis')
|
|
591
|
+
.option('--emit-candidates <path>', 'Write the sampled-audit candidates artifact (rule dispositions + candidate sites) to this file')
|
|
566
592
|
.action(async (options) => {
|
|
567
593
|
console.log(chalk.blue('🔍 Code Quality Audit Tool'));
|
|
568
594
|
console.log(chalk.gray('══════════════════════════════════════════════════'));
|
|
@@ -600,6 +626,13 @@ program
|
|
|
600
626
|
outputDirectory: options.output,
|
|
601
627
|
presets: presetIds
|
|
602
628
|
}).run();
|
|
629
|
+
// Hook-liveness notice — a top-level notice, not a per-file finding. A live
|
|
630
|
+
// "hook not running" condition means the PostToolUse hook is not enqueueing
|
|
631
|
+
// changes, so cached findings may be stale.
|
|
632
|
+
const hookNotice = readHookNotice();
|
|
633
|
+
if (hookNotice) {
|
|
634
|
+
console.log(chalk.yellow(`\n⚠️ ${hookNotice.message}`));
|
|
635
|
+
}
|
|
603
636
|
const violations = Object.values(result.analyzerResults).flatMap((r) => r.violations || []);
|
|
604
637
|
const baseline = result.metadata?.baseline;
|
|
605
638
|
printAuditDiagnostics(result);
|
|
@@ -608,16 +641,18 @@ program
|
|
|
608
641
|
printFileAccounting(result, !!options.explainSkipped);
|
|
609
642
|
printUnparsedAndSkipped(result);
|
|
610
643
|
printPipelineStages(result, options);
|
|
611
|
-
// Spec-20 R4: built-in profile visibility — silent behavior changes
|
|
612
|
-
// are never acceptable. Notify when scripts-and-tests excludes findings
|
|
613
|
-
// from the blocking gate.
|
|
614
|
-
const builtinCapped = Object.values(result.analyzerResults)
|
|
615
|
-
.reduce((count, ar) => count + ar.violations.filter(v => v.profile === 'scripts-and-tests').length, 0);
|
|
616
|
-
if (builtinCapped > 0) {
|
|
617
|
-
console.log(chalk.blue(`\nℹ️ ${builtinCapped.toLocaleString()} readings excluded from the blocking gate by built-in profile "scripts-and-tests" (scripts/tests/fixtures).`));
|
|
618
|
-
console.log(chalk.gray(` Set ${chalk.cyan('"builtin": false')} in .codeauditor.json to disable.`));
|
|
619
|
-
}
|
|
620
644
|
await writeReport(result, options);
|
|
645
|
+
// Directive H item 2 — emit the sampled-audit candidates artifact when
|
|
646
|
+
// `--emit-candidates` names a destination. The artifact is the audit's
|
|
647
|
+
// only dependency on app/: rule disposition vocabularies (read from the
|
|
648
|
+
// rules) + candidate sites with their source line text. Nothing here
|
|
649
|
+
// reaches a model; it only serializes what the deterministic matchers
|
|
650
|
+
// emitted.
|
|
651
|
+
if (options.emitCandidates) {
|
|
652
|
+
const artifact = await buildCandidatesArtifact(result);
|
|
653
|
+
await fs.writeFile(resolve(options.emitCandidates), JSON.stringify(artifact, null, 2), 'utf8');
|
|
654
|
+
console.log(chalk.gray(`Candidates artifact written to ${options.emitCandidates} (${artifact.rules.reduce((n, r) => n + r.sites.length, 0)} sites across ${artifact.rules.length} rules)`));
|
|
655
|
+
}
|
|
621
656
|
applyFailOnGates(result, violations, baseline, options, failOnSeverity);
|
|
622
657
|
}
|
|
623
658
|
catch (error) {
|
|
@@ -728,20 +763,29 @@ program
|
|
|
728
763
|
// blocks; there is no configurable gate.
|
|
729
764
|
const { blocking, resolutionGaps } = computeGatingDecision(violations, BLOCKING_SEVERITIES);
|
|
730
765
|
await emitChangedOutput(result, violations, blocking, dismissedCount, options);
|
|
731
|
-
// Spec 38 R2/R3 — per-rule timing + gate
|
|
766
|
+
// Spec 38 R2/R3 — per-rule timing + gate work count, opt-in by env var.
|
|
732
767
|
// Emitted to stderr so it never corrupts --json stdout. Slowest rule first.
|
|
733
|
-
//
|
|
734
|
-
//
|
|
735
|
-
|
|
768
|
+
// Directive J: the gate budget is now a deterministic-work count
|
|
769
|
+
// (receiverResolutions), not CPU time — the count moves only when the work
|
|
770
|
+
// does, where CPU time jitters with machine load. The wall/CPU times are
|
|
771
|
+
// still printed as a measurement for bench/gate-timing.ts, but they are no
|
|
772
|
+
// longer what the budget asserts on.
|
|
773
|
+
if (isRuleTimingEnabled()) {
|
|
736
774
|
const ruleTiming = result.metadata?.ruleTiming;
|
|
737
775
|
const gateMs = result.metadata?.auditCpuMs;
|
|
738
776
|
const gateWallMs = result.metadata?.auditDuration;
|
|
777
|
+
const gateWork = result.metadata?.receiverResolutions;
|
|
778
|
+
const budget = gateBudgetResolutions();
|
|
739
779
|
const lines = [];
|
|
740
780
|
lines.push('');
|
|
741
|
-
//
|
|
742
|
-
//
|
|
781
|
+
// Directive J — the asserted metric: deterministic receiver-resolution
|
|
782
|
+
// count vs the single-source budget (gateBudgetResolutions()). The
|
|
783
|
+
// verifier parses this line, so the CLI is the one source of the budget.
|
|
784
|
+
lines.push(`⏱ gate work: ${gateWork ?? 0} receiver resolutions (budget ${budget})`);
|
|
785
|
+
// Measurement, not assertion — wall-clock (what the hook's user feels)
|
|
786
|
+
// and CPU (what the rule actually burned); consumed by bench/gate-timing.ts.
|
|
743
787
|
lines.push(`⏱ gate wall-clock: ${(gateWallMs ?? 0).toFixed(1)} ms`);
|
|
744
|
-
lines.push(`⏱ gate cpu-time: ${(gateMs ?? 0).toFixed(1)} ms
|
|
788
|
+
lines.push(`⏱ gate cpu-time: ${(gateMs ?? 0).toFixed(1)} ms`);
|
|
745
789
|
lines.push('── per-rule timing (slowest first) ──');
|
|
746
790
|
if (ruleTiming && ruleTiming.length > 0) {
|
|
747
791
|
for (const t of ruleTiming) {
|
|
@@ -889,7 +933,18 @@ async function emitChangedOutput(result, violations, blocking, dismissedCount, o
|
|
|
889
933
|
}
|
|
890
934
|
}
|
|
891
935
|
else {
|
|
892
|
-
|
|
936
|
+
// A bare `changed` scope that found no baseline to diff against must not
|
|
937
|
+
// report a false clean. The diagnostic names both causes (never indexed,
|
|
938
|
+
// or the index was discarded) so the agent sees "cannot determine what
|
|
939
|
+
// changed", never "nothing changed".
|
|
940
|
+
const noBaseline = (result.metadata?.diagnostics ?? []).find((d) => d.kind === 'no-baseline');
|
|
941
|
+
if (noBaseline) {
|
|
942
|
+
console.log(chalk.yellow('\n⚠ Cannot determine what changed.'));
|
|
943
|
+
console.log(chalk.yellow(noBaseline.message));
|
|
944
|
+
}
|
|
945
|
+
else {
|
|
946
|
+
console.log(chalk.green('\n✓ No readings.'));
|
|
947
|
+
}
|
|
893
948
|
}
|
|
894
949
|
}
|
|
895
950
|
}
|
|
@@ -1306,7 +1361,7 @@ program
|
|
|
1306
1361
|
.description('Dismiss one finding by fingerprint — a written reason is required')
|
|
1307
1362
|
.requiredOption('--reason <reason>', 'Why this finding is dismissed (required — a dismissal without a reason is a config error)')
|
|
1308
1363
|
.option('-p, --path <path>', OPTION_PROJECT_PATH, process.cwd())
|
|
1309
|
-
.option('--telemetry-endpoint <url>', 'Feedback service endpoint override (defaults to the opt-in endpoint recorded by the telemetry
|
|
1364
|
+
.option('--telemetry-endpoint <url>', 'Feedback service endpoint override (defaults to the opt-in endpoint recorded by the `code-audit telemetry` command)')
|
|
1310
1365
|
.option('--json', OPTION_OUTPUT_AS_JSON)
|
|
1311
1366
|
.action(async (fingerprintArg, options) => {
|
|
1312
1367
|
try {
|
|
@@ -1334,9 +1389,9 @@ program
|
|
|
1334
1389
|
const entry = buildDismissalEntry(match, reason, PACKAGE_VERSION);
|
|
1335
1390
|
const dismissals = upsertDismissal(projectRoot, entry);
|
|
1336
1391
|
// Spec 57 — opt-in telemetry. Nothing is sent unless the user opted in via
|
|
1337
|
-
// the `telemetry`
|
|
1338
|
-
// payload is printed for review before sending; any send
|
|
1339
|
-
// and never affects the dismissal or the exit code.
|
|
1392
|
+
// the `code-audit telemetry enable` command (default OFF) AND an endpoint is
|
|
1393
|
+
// configured. The payload is printed for review before sending; any send
|
|
1394
|
+
// failure is silent and never affects the dismissal or the exit code.
|
|
1340
1395
|
const telemetry = resolveTelemetryConfig({ endpoint: options.telemetryEndpoint });
|
|
1341
1396
|
if (telemetry.enabled && telemetry.endpoint) {
|
|
1342
1397
|
const signature = signatureForFinding(match.file, match.line ?? match.start?.line ?? 1, match.column ?? match.start?.column ?? 1) ?? 'unknown';
|
|
@@ -1384,6 +1439,153 @@ program
|
|
|
1384
1439
|
process.exit(1);
|
|
1385
1440
|
}
|
|
1386
1441
|
});
|
|
1442
|
+
// Telemetry opt-in (Spec 57) — status/enable/disable call the same three
|
|
1443
|
+
// functions as the telemetry MCP tool (telemetry.ts), so the CLI and the MCP
|
|
1444
|
+
// tool can never disagree about what is enabled or what a submission contains.
|
|
1445
|
+
const telemetry = program
|
|
1446
|
+
.command('telemetry')
|
|
1447
|
+
.description('Manage anonymous dismissal feedback opt-in (default OFF). Actions: status, enable, disable.');
|
|
1448
|
+
telemetry
|
|
1449
|
+
.command('status')
|
|
1450
|
+
.description('Show whether anonymous dismissal feedback is enabled, its endpoint, and the anonymous install ID.')
|
|
1451
|
+
.option('--json', OPTION_OUTPUT_AS_JSON)
|
|
1452
|
+
.action(async (options) => {
|
|
1453
|
+
const s = telemetryStatus();
|
|
1454
|
+
if (options.json) {
|
|
1455
|
+
process.stdout.write(JSON.stringify(s, null, 2) + '\n');
|
|
1456
|
+
}
|
|
1457
|
+
else {
|
|
1458
|
+
console.log(chalk.bold(s.enabled ? 'Telemetry: enabled' : 'Telemetry: disabled'));
|
|
1459
|
+
if (s.enabled) {
|
|
1460
|
+
console.log(chalk.gray(` endpoint: ${s.endpoint}`));
|
|
1461
|
+
console.log(chalk.gray(` install ID: ${s.installId}`));
|
|
1462
|
+
}
|
|
1463
|
+
else {
|
|
1464
|
+
console.log(chalk.gray(' endpoint: (none — enable with `code-audit telemetry enable`)'));
|
|
1465
|
+
}
|
|
1466
|
+
console.log(chalk.gray(`\n${s.message}`));
|
|
1467
|
+
}
|
|
1468
|
+
});
|
|
1469
|
+
telemetry
|
|
1470
|
+
.command('enable')
|
|
1471
|
+
.description('Opt in to anonymous dismissal feedback. Defaults to the built-in service endpoint. Generates the anonymous install ID on first use.')
|
|
1472
|
+
.option('--endpoint <url>', 'Optional ingest URL. Defaults to the built-in service endpoint.')
|
|
1473
|
+
.option('--json', OPTION_OUTPUT_AS_JSON)
|
|
1474
|
+
.action(async (options) => {
|
|
1475
|
+
try {
|
|
1476
|
+
const s = telemetryEnable(options.endpoint);
|
|
1477
|
+
if (options.json) {
|
|
1478
|
+
process.stdout.write(JSON.stringify(s, null, 2) + '\n');
|
|
1479
|
+
}
|
|
1480
|
+
else {
|
|
1481
|
+
console.log(chalk.green('✓ Telemetry enabled.'));
|
|
1482
|
+
console.log(chalk.gray(` endpoint: ${s.endpoint}`));
|
|
1483
|
+
console.log(chalk.gray(` install ID: ${s.installId}`));
|
|
1484
|
+
console.log(chalk.gray(`\n${s.message}`));
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1487
|
+
catch (error) {
|
|
1488
|
+
console.error(chalk.red('Error:'), error);
|
|
1489
|
+
process.exit(1);
|
|
1490
|
+
}
|
|
1491
|
+
});
|
|
1492
|
+
telemetry
|
|
1493
|
+
.command('disable')
|
|
1494
|
+
.description('Turn off anonymous dismissal feedback. The endpoint is remembered; nothing further is sent.')
|
|
1495
|
+
.option('--json', OPTION_OUTPUT_AS_JSON)
|
|
1496
|
+
.action(async (options) => {
|
|
1497
|
+
const s = telemetryDisable();
|
|
1498
|
+
if (options.json) {
|
|
1499
|
+
process.stdout.write(JSON.stringify(s, null, 2) + '\n');
|
|
1500
|
+
}
|
|
1501
|
+
else {
|
|
1502
|
+
console.log(chalk.green('✓ Telemetry disabled.'));
|
|
1503
|
+
console.log(chalk.gray(s.message));
|
|
1504
|
+
}
|
|
1505
|
+
});
|
|
1506
|
+
// Accumulate a repeatable option (commander's default keeps only the last value).
|
|
1507
|
+
function collectOption(value, previous) {
|
|
1508
|
+
return [...(previous ?? []), value];
|
|
1509
|
+
}
|
|
1510
|
+
// Request a new rule (rule-request intake). POSTs to the docs site's HTTP tool
|
|
1511
|
+
// API, which validates and forwards to the shared feedback service. The CLI does
|
|
1512
|
+
// no own validation: it reads the example files, sends them with the client
|
|
1513
|
+
// surface, and prints whatever the server decides (receipt id, or field errors).
|
|
1514
|
+
program
|
|
1515
|
+
.command('request-rule')
|
|
1516
|
+
.description('Submit a request for a new Code Auditor rule (an unflagged defect class)')
|
|
1517
|
+
.requiredOption('--title <title>', 'Short rule title (10-120 chars)')
|
|
1518
|
+
.requiredOption('--symptom <text>', 'Symptom this rule should catch (40-2000 chars)')
|
|
1519
|
+
.requiredOption('--signal <text>', 'Signal/pattern the rule should look for (40-2000 chars)')
|
|
1520
|
+
.option('--language <lang>', 'Language the rule applies to (repeatable)', collectOption, [])
|
|
1521
|
+
.option('--fires <path>', 'Example file that SHOULD be flagged (repeatable)', collectOption, [])
|
|
1522
|
+
.option('--clean <path>', 'Example file that should NOT be flagged (repeatable)', collectOption, [])
|
|
1523
|
+
.option('--endpoint <url>', `Docs API base URL (default ${DEFAULT_RULE_REQUEST_BASE_URL})`)
|
|
1524
|
+
.option('--json', OPTION_OUTPUT_AS_JSON)
|
|
1525
|
+
.action(async (options) => {
|
|
1526
|
+
try {
|
|
1527
|
+
const readFiles = async (paths) => {
|
|
1528
|
+
const out = [];
|
|
1529
|
+
for (const p of paths) {
|
|
1530
|
+
out.push({ path: p, content: await fs.readFile(resolve(p), 'utf-8') });
|
|
1531
|
+
}
|
|
1532
|
+
return out;
|
|
1533
|
+
};
|
|
1534
|
+
const [firingExample, cleanExample] = await Promise.all([
|
|
1535
|
+
readFiles(options.fires ?? []),
|
|
1536
|
+
readFiles(options.clean ?? []),
|
|
1537
|
+
]);
|
|
1538
|
+
const body = {
|
|
1539
|
+
title: options.title,
|
|
1540
|
+
symptom: options.symptom,
|
|
1541
|
+
signal: options.signal,
|
|
1542
|
+
languages: options.language ?? [],
|
|
1543
|
+
firingExample,
|
|
1544
|
+
cleanExample,
|
|
1545
|
+
toolVersion: PACKAGE_VERSION,
|
|
1546
|
+
};
|
|
1547
|
+
const base = (options.endpoint ?? DEFAULT_RULE_REQUEST_BASE_URL).replace(/\/+$/, '');
|
|
1548
|
+
const url = `${base}/api/tools/request_rule`;
|
|
1549
|
+
const result = await postJson(url, body, {
|
|
1550
|
+
timeoutMs: 5000,
|
|
1551
|
+
headers: { 'x-code-auditor-client': 'cli' },
|
|
1552
|
+
});
|
|
1553
|
+
if (result.error) {
|
|
1554
|
+
console.error(chalk.red('Error:'), result.error);
|
|
1555
|
+
process.exit(1);
|
|
1556
|
+
}
|
|
1557
|
+
if (!result.ok) {
|
|
1558
|
+
const res = result.body;
|
|
1559
|
+
if (res?.fields) {
|
|
1560
|
+
console.error(chalk.red(`Error: request rejected (${res.error ?? 'validation failed'})`));
|
|
1561
|
+
for (const [field, msgs] of Object.entries(res.fields)) {
|
|
1562
|
+
console.error(chalk.gray(` ${field}: ${msgs.join('; ')}`));
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
else if (res?.retryAfterSeconds !== undefined) {
|
|
1566
|
+
console.error(chalk.red(`Error: rate limited — retry in ${res.retryAfterSeconds}s`));
|
|
1567
|
+
}
|
|
1568
|
+
else {
|
|
1569
|
+
console.error(chalk.red(`Error: ${res?.message ?? res?.error ?? `HTTP ${result.status}`}`));
|
|
1570
|
+
}
|
|
1571
|
+
process.exit(1);
|
|
1572
|
+
}
|
|
1573
|
+
const out = result.body;
|
|
1574
|
+
if (options.json) {
|
|
1575
|
+
process.stdout.write(JSON.stringify(out, null, 2) + '\n');
|
|
1576
|
+
}
|
|
1577
|
+
else {
|
|
1578
|
+
console.log(chalk.green(`✓ Rule request submitted${out.duplicateSubmission ? ' (duplicate — already received)' : ''}`));
|
|
1579
|
+
console.log(chalk.gray(` receipt id: ${out.id}`));
|
|
1580
|
+
const matches = out.existingRuleMatches ?? [];
|
|
1581
|
+
console.log(chalk.gray(` existingRuleMatches: ${matches.length ? matches.join(', ') : '(none)'}`));
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
catch (error) {
|
|
1585
|
+
console.error(chalk.red('Error:'), error);
|
|
1586
|
+
process.exit(1);
|
|
1587
|
+
}
|
|
1588
|
+
});
|
|
1387
1589
|
// Generate configuration command
|
|
1388
1590
|
program
|
|
1389
1591
|
.command('generate-config')
|
|
@@ -1729,9 +1931,7 @@ configCmd
|
|
|
1729
1931
|
else {
|
|
1730
1932
|
console.log(chalk.bold(`Profiles matching: ${options.file}`));
|
|
1731
1933
|
for (const name of resolved.matchedProfileNames) {
|
|
1732
|
-
|
|
1733
|
-
const builtinTag = profile?.builtin !== false && profiles.some(p => p.name === name) ? '' : '';
|
|
1734
|
-
console.log(` ${chalk.cyan(name)}${builtinTag ? chalk.gray(' (built-in)') : ''}`);
|
|
1934
|
+
console.log(` ${chalk.cyan(name)}`);
|
|
1735
1935
|
}
|
|
1736
1936
|
if (resolved.excludeFromGate) {
|
|
1737
1937
|
console.log(chalk.yellow(` excludeFromGate: true`));
|
|
@@ -1754,7 +1954,6 @@ configCmd
|
|
|
1754
1954
|
name: p.name,
|
|
1755
1955
|
paths: p.paths,
|
|
1756
1956
|
overrides: p.overrides,
|
|
1757
|
-
builtin: p.builtin !== false,
|
|
1758
1957
|
})),
|
|
1759
1958
|
}, null, 2) + '\n');
|
|
1760
1959
|
}
|
|
@@ -1765,8 +1964,7 @@ configCmd
|
|
|
1765
1964
|
else {
|
|
1766
1965
|
console.log(chalk.bold('Active path profiles:'));
|
|
1767
1966
|
for (const p of profiles) {
|
|
1768
|
-
|
|
1769
|
-
console.log(` ${chalk.cyan(p.name)}${tag}`);
|
|
1967
|
+
console.log(` ${chalk.cyan(p.name)}`);
|
|
1770
1968
|
console.log(chalk.gray(` paths: ${p.paths.join(', ')}`));
|
|
1771
1969
|
if (p.overrides && Object.keys(p.overrides).length > 0) {
|
|
1772
1970
|
for (const [key, value] of Object.entries(p.overrides)) {
|
|
@@ -2298,8 +2496,18 @@ program
|
|
|
2298
2496
|
if (existing.cnt === 0 && options.path) {
|
|
2299
2497
|
const { extractChurn } = await import('./churn/churnExtractor.js');
|
|
2300
2498
|
const { computeHotspots } = await import('./hotspots/hotspotScorer.js');
|
|
2499
|
+
const { findConfigFileUp, loadConfig } = await import('./config/configLoader.js');
|
|
2500
|
+
const { DEFAULT_CHURN_CONFIG } = await import('./config/defaults.js');
|
|
2301
2501
|
try {
|
|
2302
|
-
|
|
2502
|
+
// Read the `churn` config key (Spec 13 R1) — the literal
|
|
2503
|
+
// `{ churnWindowMonths: 12 }` was the orphan; the window now resolves
|
|
2504
|
+
// from `.codeauditor.json` with DEFAULT_CHURN_CONFIG as the default.
|
|
2505
|
+
const configPath = await findConfigFileUp(options.path);
|
|
2506
|
+
const { config } = await loadConfig({
|
|
2507
|
+
configPath: configPath ?? undefined,
|
|
2508
|
+
projectRoot: options.path,
|
|
2509
|
+
});
|
|
2510
|
+
extractChurn(rawDb, options.path, config.churn ?? DEFAULT_CHURN_CONFIG);
|
|
2303
2511
|
computeHotspots(rawDb);
|
|
2304
2512
|
}
|
|
2305
2513
|
catch (err) {
|
|
@@ -2586,8 +2794,6 @@ ledgerCmd
|
|
|
2586
2794
|
// `audit --detach` forks workers/auditJobRunner; `status`/`result`/`jobs` read
|
|
2587
2795
|
// the persisted ledger. One job model (the ledger run), one write path — these
|
|
2588
2796
|
// are thin wrappers over ledger.ts + mcpAuditJobs.ts, not a second store.
|
|
2589
|
-
/** Lease TTL used by read-path reclaim, mirroring mcpAuditJobs.jobLeaseTtlMs. */
|
|
2590
|
-
const CLI_JOB_LEASE_TTL_MS = Number(process.env.CODE_AUDITOR_JOB_LEASE_TTL_MS) || 30_000;
|
|
2591
2797
|
function spec41StatusBadge(status) {
|
|
2592
2798
|
switch (status) {
|
|
2593
2799
|
case 'completed':
|
|
@@ -2692,10 +2898,11 @@ program
|
|
|
2692
2898
|
.action(async (jobId, options) => {
|
|
2693
2899
|
try {
|
|
2694
2900
|
const { getLedgerRun, reclaimStaleRunning, computeStaleness } = await import('./ledger.js');
|
|
2901
|
+
const { jobLeaseTtlMs } = await import('./mcpAuditJobs.js');
|
|
2695
2902
|
const projectRoot = resolve(options.path);
|
|
2696
2903
|
const db = CodeIndexDB.getInstance(undefined, projectRoot);
|
|
2697
2904
|
await db.initialize();
|
|
2698
|
-
reclaimStaleRunning(db.rawDb, projectRoot,
|
|
2905
|
+
reclaimStaleRunning(db.rawDb, projectRoot, jobLeaseTtlMs());
|
|
2699
2906
|
const run = getLedgerRun(db.rawDb, jobId);
|
|
2700
2907
|
if (!run) {
|
|
2701
2908
|
console.error(chalk.red(`Job not found: ${jobId}`));
|
|
@@ -2853,10 +3060,11 @@ program
|
|
|
2853
3060
|
.action(async (options) => {
|
|
2854
3061
|
try {
|
|
2855
3062
|
const { listLedgerRuns, reclaimStaleRunning, pruneLedgerRuns, computeStaleness } = await import('./ledger.js');
|
|
3063
|
+
const { jobLeaseTtlMs } = await import('./mcpAuditJobs.js');
|
|
2856
3064
|
const projectRoot = resolve(options.path);
|
|
2857
3065
|
const db = CodeIndexDB.getInstance(undefined, projectRoot);
|
|
2858
3066
|
await db.initialize();
|
|
2859
|
-
reclaimStaleRunning(db.rawDb, projectRoot,
|
|
3067
|
+
reclaimStaleRunning(db.rawDb, projectRoot, jobLeaseTtlMs());
|
|
2860
3068
|
if (options.prune) {
|
|
2861
3069
|
const keep = parseInt(options.keep, 10) || 10;
|
|
2862
3070
|
const n = pruneLedgerRuns(db.rawDb, projectRoot, keep);
|
|
@@ -3069,6 +3277,11 @@ program
|
|
|
3069
3277
|
hooks: options.hooks,
|
|
3070
3278
|
list: options.list,
|
|
3071
3279
|
});
|
|
3280
|
+
// Nudge an undecided user toward the one-time telemetry choice. Only after
|
|
3281
|
+
// a real install (not `--list`), and never once they've already decided.
|
|
3282
|
+
if (!options.list && !telemetryStatus().decided) {
|
|
3283
|
+
console.log('Anonymous dismissal feedback is off. Run `code-audit telemetry enable` to opt in, or `code-audit telemetry disable` to decline.');
|
|
3284
|
+
}
|
|
3072
3285
|
}
|
|
3073
3286
|
catch (error) {
|
|
3074
3287
|
console.error(chalk.red('Error:'), error);
|