octocode-cli 1.2.7 → 1.2.9
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/README.md +42 -35
- package/out/octocode-cli.js +36 -11719
- package/package.json +36 -36
- package/skills/README.md +42 -114
- package/skills/{octocode-code-engineer → octocode-engineer}/.claude/settings.local.json +2 -1
- package/skills/octocode-engineer/README.md +99 -0
- package/skills/octocode-engineer/SKILL.md +499 -0
- package/skills/octocode-engineer/build.mjs +29 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/eslint.config.mjs +3 -13
- package/skills/{octocode-code-engineer → octocode-engineer}/package.json +28 -27
- package/skills/octocode-engineer/references/ast-reference.md +166 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/references/cli-reference.md +80 -6
- package/skills/octocode-engineer/references/externals.md +86 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/references/output-files.md +46 -6
- package/skills/octocode-engineer/references/quality-indicators.md +202 -0
- package/skills/octocode-engineer/references/tool-workflows.md +298 -0
- package/skills/octocode-engineer/references/validation-playbooks.md +99 -0
- package/skills/octocode-engineer/scripts/ast/search.js +45 -0
- package/skills/octocode-engineer/scripts/ast/tree-search.js +27 -0
- package/skills/octocode-engineer/scripts/index.js +173 -0
- package/skills/octocode-engineer/scripts/run.js +179 -0
- package/skills/octocode-engineer/src/analysis/dependencies.ts +378 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/discovery.test.ts +57 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/discovery.ts +43 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/search.test.ts +113 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/search.ts +64 -1
- package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-sitter.test.ts +118 -2
- package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-sitter.ts +65 -3
- package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/ts-analyzer.test.ts +281 -1
- package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/ts-analyzer.ts +173 -3
- package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/security.test.ts +73 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/security.ts +62 -4
- package/skills/octocode-engineer/src/detector-gating.test.ts +59 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/code-quality.ts +342 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/index.ts +8 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/index.test.ts +565 -11
- package/skills/octocode-engineer/src/index.ts +468 -0
- package/skills/octocode-engineer/src/pipeline/affected.test.ts +147 -0
- package/skills/octocode-engineer/src/pipeline/affected.ts +68 -0
- package/skills/octocode-engineer/src/pipeline/baseline.test.ts +276 -0
- package/skills/octocode-engineer/src/pipeline/baseline.ts +76 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cli.test.ts +300 -53
- package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cli.ts +180 -36
- package/skills/octocode-engineer/src/pipeline/config-loader.test.ts +264 -0
- package/skills/octocode-engineer/src/pipeline/config-loader.ts +109 -0
- package/skills/octocode-engineer/src/pipeline/create-options.ts +55 -0
- package/skills/octocode-engineer/src/pipeline/health-score.test.ts +65 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/main.ts +130 -17
- package/skills/octocode-engineer/src/pipeline/progress.ts +51 -0
- package/skills/octocode-engineer/src/pipeline/reporters.test.ts +155 -0
- package/skills/octocode-engineer/src/pipeline/reporters.ts +64 -0
- package/skills/octocode-engineer/src/reporting/graph-features.test.ts +279 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/output-contract.test.ts +6 -0
- package/skills/octocode-engineer/src/reporting/summary-md.test.ts +1066 -0
- package/skills/octocode-engineer/src/reporting/summary-md.ts +1604 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/writer.ts +136 -13
- package/skills/octocode-engineer/src/run.ts +78 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/sanity.test.ts +1 -1
- package/skills/octocode-engineer/src/types/analysis.ts +25 -0
- package/skills/octocode-engineer/src/types/collectors.ts +134 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/types/constants.ts +75 -41
- package/skills/octocode-engineer/src/types/core.ts +203 -0
- package/skills/octocode-engineer/src/types/dependency.ts +215 -0
- package/skills/octocode-engineer/src/types/file-entry.ts +108 -0
- package/skills/octocode-engineer/src/types/findings.ts +105 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/src/types/index.ts +60 -30
- package/skills/octocode-engineer/src/types/tree-sitter.ts +38 -0
- package/skills/{octocode-code-engineer → octocode-engineer}/tsconfig.json +1 -0
- package/skills/octocode-research/.octocode/scan/.cache/analysis-cache.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/architecture.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/ast-trees.txt +5566 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/code-quality.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/dead-code.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/file-inventory.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/findings.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/graph.md +189 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/security.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/summary.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/summary.md +265 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/architecture.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/ast-trees.txt +5555 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/code-quality.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/dead-code.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/file-inventory.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/findings.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/graph.md +190 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/security.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/summary.json +1 -0
- package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/summary.md +265 -0
- package/skills/octocode-research/CHANGELOG.md +60 -0
- package/skills/octocode-research/README.md +102 -388
- package/skills/octocode-research/SKILL.md +169 -498
- package/skills/octocode-research/package.json +19 -31
- package/skills/octocode-research/references/PARALLEL_AGENT_PROTOCOL.md +19 -0
- package/skills/octocode-research/references/SESSION_MANAGEMENT.md +38 -0
- package/skills/octocode-research/scripts/server-init.js +1 -1
- package/skills/octocode-research/scripts/server.d.ts +2 -1
- package/skills/octocode-research/scripts/server.js +329 -233
- package/skills/octocode-research/src/__tests__/integration/promptsRoutes.test.ts +180 -0
- package/skills/octocode-research/src/__tests__/integration/serverHttp.test.ts +221 -0
- package/skills/octocode-research/src/__tests__/integration/serverLifecycle.test.ts +194 -0
- package/skills/octocode-research/src/__tests__/integration/toolsRoutes.test.ts +501 -0
- package/skills/octocode-research/src/__tests__/unit/readiness.test.ts +61 -0
- package/skills/octocode-research/src/__tests__/unit/resilience.test.ts +192 -0
- package/skills/octocode-research/src/__tests__/unit/responseFactory.test.ts +172 -0
- package/skills/octocode-research/src/__tests__/unit/responseParser.test.ts +288 -0
- package/skills/octocode-research/src/__tests__/unit/schemas.test.ts +509 -0
- package/skills/octocode-research/src/index.ts +4 -124
- package/skills/octocode-research/src/middleware/queryParser.ts +0 -26
- package/skills/octocode-research/src/routes/lsp.ts +58 -59
- package/skills/octocode-research/src/routes/package.ts +35 -65
- package/skills/octocode-research/src/routes/prompts.ts +3 -3
- package/skills/octocode-research/src/routes/tools.ts +8 -20
- package/skills/octocode-research/src/server-init.ts +30 -237
- package/skills/octocode-research/src/server.ts +50 -23
- package/skills/octocode-research/src/types/errorGuards.ts +9 -80
- package/skills/octocode-research/src/types/guards.ts +0 -28
- package/skills/octocode-research/src/types/mcp.ts +11 -66
- package/skills/octocode-research/src/types/responses.ts +11 -129
- package/skills/octocode-research/src/utils/circuitBreaker.ts +0 -21
- package/skills/octocode-research/src/utils/logger.ts +1 -97
- package/skills/octocode-research/src/utils/resilience.ts +2 -12
- package/skills/octocode-research/src/utils/responseFactory.ts +0 -42
- package/skills/octocode-research/src/utils/responseParser.ts +3 -25
- package/skills/octocode-research/src/utils/retry.ts +0 -63
- package/skills/octocode-research/src/utils/routeFactory.ts +1 -1
- package/skills/octocode-research/src/validation/httpPreprocess.ts +0 -3
- package/skills/octocode-research/src/validation/index.ts +0 -1
- package/skills/octocode-research/src/validation/schemas.ts +0 -63
- package/skills/octocode-research/src/validation/toolCallSchema.ts +3 -3
- package/skills/octocode-research/tsdown.config.ts +4 -0
- package/skills/octocode-research/vitest.config.ts +3 -0
- package/skills/octocode-code-engineer/.plan/VALIDATED_PLAN.md +0 -223
- package/skills/octocode-code-engineer/README.md +0 -178
- package/skills/octocode-code-engineer/SKILL.md +0 -418
- package/skills/octocode-code-engineer/minify-scripts.mjs +0 -32
- package/skills/octocode-code-engineer/references/agent-ast-reading-rfc.md +0 -95
- package/skills/octocode-code-engineer/references/architecture-techniques.md +0 -121
- package/skills/octocode-code-engineer/references/ast-search.md +0 -210
- package/skills/octocode-code-engineer/references/ast-tree-search.md +0 -151
- package/skills/octocode-code-engineer/references/concepts.md +0 -107
- package/skills/octocode-code-engineer/references/finding-categories.md +0 -128
- package/skills/octocode-code-engineer/references/improvement-roadmap.md +0 -304
- package/skills/octocode-code-engineer/references/playbooks.md +0 -204
- package/skills/octocode-code-engineer/references/present-results.md +0 -136
- package/skills/octocode-code-engineer/references/tool-workflows.md +0 -566
- package/skills/octocode-code-engineer/references/validate-investigate.md +0 -225
- package/skills/octocode-code-engineer/scripts/analysis/dependencies.js +0 -1
- package/skills/octocode-code-engineer/scripts/analysis/dependency-summary.js +0 -1
- package/skills/octocode-code-engineer/scripts/analysis/discovery.js +0 -1
- package/skills/octocode-code-engineer/scripts/analysis/graph-analytics.js +0 -1
- package/skills/octocode-code-engineer/scripts/analysis/semantic.js +0 -1
- package/skills/octocode-code-engineer/scripts/ast/helpers.js +0 -1
- package/skills/octocode-code-engineer/scripts/ast/metrics.js +0 -1
- package/skills/octocode-code-engineer/scripts/ast/search.js +0 -2
- package/skills/octocode-code-engineer/scripts/ast/tree-search.js +0 -2
- package/skills/octocode-code-engineer/scripts/ast/tree-sitter.js +0 -1
- package/skills/octocode-code-engineer/scripts/ast/ts-analyzer.js +0 -1
- package/skills/octocode-code-engineer/scripts/collectors/chains.js +0 -1
- package/skills/octocode-code-engineer/scripts/collectors/effects.js +0 -1
- package/skills/octocode-code-engineer/scripts/collectors/input-sources.js +0 -1
- package/skills/octocode-code-engineer/scripts/collectors/performance.js +0 -1
- package/skills/octocode-code-engineer/scripts/collectors/prototype-pollution.js +0 -1
- package/skills/octocode-code-engineer/scripts/collectors/security.js +0 -1
- package/skills/octocode-code-engineer/scripts/collectors/test-profile.js +0 -1
- package/skills/octocode-code-engineer/scripts/common/is-direct-run.js +0 -1
- package/skills/octocode-code-engineer/scripts/common/utils.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/code-quality.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/cohesion.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/coupling.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/cycle.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/dead-code.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/import-style.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/index.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/security.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/semantic.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/shared.js +0 -1
- package/skills/octocode-code-engineer/scripts/detectors/test-quality.js +0 -1
- package/skills/octocode-code-engineer/scripts/index.js +0 -1
- package/skills/octocode-code-engineer/scripts/pipeline/cache.js +0 -1
- package/skills/octocode-code-engineer/scripts/pipeline/cli.js +0 -1
- package/skills/octocode-code-engineer/scripts/pipeline/main.js +0 -2
- package/skills/octocode-code-engineer/scripts/reporting/analysis.js +0 -1
- package/skills/octocode-code-engineer/scripts/reporting/summary-md.js +0 -1
- package/skills/octocode-code-engineer/scripts/reporting/writer.js +0 -1
- package/skills/octocode-code-engineer/scripts/types/constants.js +0 -1
- package/skills/octocode-code-engineer/scripts/types/index.js +0 -1
- package/skills/octocode-code-engineer/scripts/types/interfaces.js +0 -1
- package/skills/octocode-code-engineer/src/analysis/dependencies.ts +0 -406
- package/skills/octocode-code-engineer/src/index.ts +0 -403
- package/skills/octocode-code-engineer/src/reporting/summary-md.test.ts +0 -421
- package/skills/octocode-code-engineer/src/reporting/summary-md.ts +0 -714
- package/skills/octocode-code-engineer/src/types/interfaces.ts +0 -682
- package/skills/octocode-research/src/types/toolTypes.ts +0 -33
- package/skills/octocode-research/src/utils/logEmoji.ts +0 -103
- /package/skills/{octocode-code-engineer → octocode-engineer}/.octocode/rfc/RFC-code-engineer-weakness-fixes.md +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/architecture.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/ast-helpers.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/ast-search.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/base.css +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/block-navigation.js +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/cache.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/cli.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/clover.xml +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-effects.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-input-sources.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-performance.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-prototype-pollution.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-security.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-test-profile.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/coverage-final.json +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/dependencies.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/dependency-summary.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/discovery.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/favicon.png +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/graph-analytics.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/index.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/index.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/metrics.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/pipeline.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/prettify.css +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/prettify.js +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/report-analysis.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/report-writer.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/security-detectors.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/semantic-detectors.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/semantic.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/sort-arrow-sprite.png +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/sorter.js +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/summary-md.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/test-quality-detectors.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/tree-sitter-analyzer.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/ts-analyzer.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/types.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/utils.ts.html +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/dependencies.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/dependency-summary.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/dependency-summary.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/graph-analytics.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/graph-analytics.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/semantic.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/semantic.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/helpers.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/helpers.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/metrics.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/metrics.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-search.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-search.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/chains.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/effects.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/effects.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/input-sources.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/input-sources.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/performance.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/performance.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/prototype-pollution.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/prototype-pollution.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/test-profile.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/test-profile.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/is-direct-run.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/is-direct-run.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/utils.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/utils.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/cohesion.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/coupling.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/cycle.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/dead-code.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/import-style.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/index.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/security.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/security.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/semantic.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/shared.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/test-quality.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/test-quality.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cache.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cache.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/main.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/analysis.test.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/analysis.ts +0 -0
- /package/skills/{octocode-code-engineer → octocode-engineer}/vitest.config.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"schemaVersion":"1.1.0","generatedAt":"2026-03-22T10:40:13.784Z","dependencyGraph":{"totalModules":53,"totalEdges":93,"unresolvedEdgeCount":0,"externalDependencyFiles":37,"rootsCount":21,"leavesCount":22,"roots":["ecosystem.config.cjs","eslint.config.mjs","scripts/server-init.js","scripts/server.js","src/__tests__/integration/circuitBreaker.test.ts","src/__tests__/integration/routes.test.ts","src/__tests__/integration/serverLifecycle.test.ts","src/__tests__/unit/circuitBreaker.test.ts","src/__tests__/unit/errorHandler.test.ts","src/__tests__/unit/httpPreprocess.test.ts","src/__tests__/unit/logger.test.ts","src/__tests__/unit/queryParser.test.ts","src/__tests__/unit/responseBuilder.test.ts","src/__tests__/unit/retry.test.ts","src/__tests__/unit/schemas.test.ts","src/server-init.ts","src/server.ts","src/types/toolTypes.ts","src/utils/logEmoji.ts","tsdown.config.ts"],"leaves":["ecosystem.config.cjs","eslint.config.mjs","scripts/server-init.js","scripts/server.js","src/__tests__/integration/serverLifecycle.test.ts","src/mcpCache.ts","src/middleware/queryParser.ts","src/server-init.ts","src/types/errorGuards.ts","src/types/guards.ts","src/types/mcp.ts","src/types/toolTypes.ts","src/utils/colors.ts","src/utils/errorQueue.ts","src/utils/logEmoji.ts","src/utils/responseBuilder.ts","src/utils/responseParser.ts","src/utils/url.ts","src/validation/httpPreprocess.ts","src/validation/toolCallSchema.ts"],"criticalModules":[{"file":"src/utils/logger.ts","outboundCount":2,"inboundCount":4,"inboundFromProduction":3,"inboundFromTests":1,"externalDependencyCount":3,"unresolvedDependencyCount":0,"functionCount":28,"highComplexityFunctions":0,"flows":26,"complexitySum":72,"complexityRisk":0,"score":112,"riskBand":"high"},{"file":"src/utils/responseBuilder.ts","outboundCount":0,"inboundCount":6,"inboundFromProduction":5,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0,"functionCount":17,"highComplexityFunctions":0,"flows":51,"complexitySum":92,"complexityRisk":0,"score":109,"riskBand":"high"},{"file":"src/routes/tools.ts","outboundCount":8,"inboundCount":1,"inboundFromProduction":1,"inboundFromTests":0,"externalDependencyCount":4,"unresolvedDependencyCount":0,"functionCount":16,"highComplexityFunctions":0,"flows":34,"complexitySum":58,"complexityRisk":0,"score":79,"riskBand":"high"},{"file":"src/server.ts","outboundCount":11,"inboundCount":0,"inboundFromProduction":0,"inboundFromTests":0,"externalDependencyCount":2,"unresolvedDependencyCount":0,"functionCount":22,"highComplexityFunctions":0,"flows":11,"complexitySum":36,"complexityRisk":0,"score":71,"riskBand":"high"},{"file":"src/utils/circuitBreaker.ts","outboundCount":3,"inboundCount":4,"inboundFromProduction":2,"inboundFromTests":2,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":18,"highComplexityFunctions":0,"flows":22,"complexitySum":42,"complexityRisk":0,"score":70,"riskBand":"high"},{"file":"src/routes/lsp.ts","outboundCount":7,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0,"functionCount":13,"highComplexityFunctions":0,"flows":21,"complexitySum":49,"complexityRisk":0,"score":65,"riskBand":"high"},{"file":"src/utils/retry.ts","outboundCount":1,"inboundCount":2,"inboundFromProduction":1,"inboundFromTests":1,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":17,"highComplexityFunctions":0,"flows":10,"complexitySum":43,"complexityRisk":0,"score":66,"riskBand":"high"},{"file":"src/routes/github.ts","outboundCount":7,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0,"functionCount":8,"highComplexityFunctions":0,"flows":24,"complexitySum":47,"complexityRisk":0,"score":54,"riskBand":"medium"},{"file":"src/routes/local.ts","outboundCount":7,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0,"functionCount":7,"highComplexityFunctions":0,"flows":22,"complexitySum":40,"complexityRisk":0,"score":46,"riskBand":"medium"},{"file":"src/server-init.ts","outboundCount":0,"inboundCount":0,"inboundFromProduction":0,"inboundFromTests":0,"externalDependencyCount":2,"unresolvedDependencyCount":0,"functionCount":13,"highComplexityFunctions":0,"flows":13,"complexitySum":27,"complexityRisk":0,"score":48,"riskBand":"medium"},{"file":"src/types/errorGuards.ts","outboundCount":0,"inboundCount":1,"inboundFromProduction":1,"inboundFromTests":0,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":12,"highComplexityFunctions":0,"flows":4,"complexitySum":32,"complexityRisk":0,"score":47,"riskBand":"medium"},{"file":"src/utils/responseParser.ts","outboundCount":0,"inboundCount":3,"inboundFromProduction":3,"inboundFromTests":0,"externalDependencyCount":1,"unresolvedDependencyCount":0,"functionCount":3,"highComplexityFunctions":0,"flows":29,"complexitySum":45,"complexityRisk":0,"score":43,"riskBand":"medium"},{"file":"src/types/guards.ts","outboundCount":0,"inboundCount":6,"inboundFromProduction":6,"inboundFromTests":0,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":11,"highComplexityFunctions":0,"flows":0,"complexitySum":25,"complexityRisk":0,"score":40,"riskBand":"medium"},{"file":"src/routes/package.ts","outboundCount":8,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0,"functionCount":8,"highComplexityFunctions":0,"flows":16,"complexitySum":29,"complexityRisk":0,"score":40,"riskBand":"medium"},{"file":"src/utils/responseFactory.ts","outboundCount":2,"inboundCount":4,"inboundFromProduction":4,"inboundFromTests":0,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":9,"highComplexityFunctions":0,"flows":9,"complexitySum":26,"complexityRisk":0,"score":38,"riskBand":"medium"},{"file":"src/validation/schemas.ts","outboundCount":1,"inboundCount":2,"inboundFromProduction":1,"inboundFromTests":1,"externalDependencyCount":2,"unresolvedDependencyCount":0,"functionCount":9,"highComplexityFunctions":0,"flows":7,"complexitySum":25,"complexityRisk":0,"score":37,"riskBand":"medium"},{"file":"src/types/responses.ts","outboundCount":1,"inboundCount":1,"inboundFromProduction":1,"inboundFromTests":0,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":7,"highComplexityFunctions":0,"flows":7,"complexitySum":26,"complexityRisk":0,"score":34,"riskBand":"medium"},{"file":"src/validation/httpPreprocess.ts","outboundCount":0,"inboundCount":3,"inboundFromProduction":2,"inboundFromTests":1,"externalDependencyCount":3,"unresolvedDependencyCount":0,"functionCount":7,"highComplexityFunctions":0,"flows":12,"complexitySum":21,"complexityRisk":0,"score":31,"riskBand":"medium"},{"file":"src/utils/asyncTimeout.ts","outboundCount":1,"inboundCount":7,"inboundFromProduction":6,"inboundFromTests":1,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":9,"highComplexityFunctions":0,"flows":2,"complexitySum":11,"complexityRisk":0,"score":26,"riskBand":"low"},{"file":"src/utils/resilience.ts","outboundCount":3,"inboundCount":5,"inboundFromProduction":5,"inboundFromTests":0,"externalDependencyCount":0,"unresolvedDependencyCount":0,"functionCount":7,"highComplexityFunctions":0,"flows":0,"complexitySum":10,"complexityRisk":0,"score":21,"riskBand":"low"}],"testOnlyModules":[{"file":"src/routes/github.ts","outboundCount":7,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0},{"file":"src/routes/local.ts","outboundCount":7,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0},{"file":"src/routes/lsp.ts","outboundCount":7,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0},{"file":"src/routes/package.ts","outboundCount":8,"inboundCount":1,"inboundFromProduction":0,"inboundFromTests":1,"externalDependencyCount":1,"unresolvedDependencyCount":0}],"unresolvedSample":[],"outgoingTop":[{"file":"src/server.ts","count":11,"score":71},{"file":"src/routes/package.ts","count":8,"score":40},{"file":"src/routes/tools.ts","count":8,"score":79},{"file":"src/routes/github.ts","count":7,"score":54},{"file":"src/routes/local.ts","count":7,"score":46},{"file":"src/routes/lsp.ts","count":7,"score":65},{"file":"src/__tests__/integration/routes.test.ts","count":4,"score":1},{"file":"src/middleware/errorHandler.ts","count":4,"score":9},{"file":"src/routes/prompts.ts","count":4,"score":19},{"file":"src/middleware/logger.ts","count":3,"score":16},{"file":"src/utils/circuitBreaker.ts","count":3,"score":70},{"file":"src/utils/resilience.ts","count":3,"score":21},{"file":"src/__tests__/unit/errorHandler.test.ts","count":2,"score":1},{"file":"src/utils/logger.ts","count":2,"score":112},{"file":"src/utils/responseFactory.ts","count":2,"score":38},{"file":"src/utils/routeFactory.ts","count":2,"score":11},{"file":"src/validation/index.ts","count":2,"score":1},{"file":"src/__tests__/integration/circuitBreaker.test.ts","count":1,"score":1},{"file":"src/__tests__/unit/circuitBreaker.test.ts","count":1,"score":1},{"file":"src/__tests__/unit/httpPreprocess.test.ts","count":1,"score":1}],"inboundTop":[{"file":"src/index.ts","count":9,"score":1},{"file":"src/utils/asyncTimeout.ts","count":7,"score":26},{"file":"src/types/guards.ts","count":6,"score":40},{"file":"src/utils/responseBuilder.ts","count":6,"score":109},{"file":"src/utils/resilience.ts","count":5,"score":21},{"file":"src/mcpCache.ts","count":4,"score":13},{"file":"src/utils/circuitBreaker.ts","count":4,"score":70},{"file":"src/utils/colors.ts","count":4,"score":16},{"file":"src/utils/logger.ts","count":4,"score":112},{"file":"src/utils/responseFactory.ts","count":4,"score":38},{"file":"src/validation/index.ts","count":4,"score":1},{"file":"src/utils/errorQueue.ts","count":3,"score":15},{"file":"src/utils/responseParser.ts","count":3,"score":43},{"file":"src/utils/routeFactory.ts","count":3,"score":11},{"file":"src/validation/httpPreprocess.ts","count":3,"score":31},{"file":"src/middleware/errorHandler.ts","count":2,"score":9},{"file":"src/middleware/queryParser.ts","count":2,"score":24},{"file":"src/middleware/readiness.ts","count":2,"score":4},{"file":"src/utils/retry.ts","count":2,"score":66},{"file":"src/utils/url.ts","count":2,"score":8}],"cycles":[],"criticalPaths":[{"start":"src/server.ts","path":["src/server.ts","src/routes/tools.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":351,"length":6,"containsCycle":false},{"start":"src/routes/tools.ts","path":["src/routes/tools.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":280,"length":5,"containsCycle":false},{"start":"src/__tests__/integration/routes.test.ts","path":["src/__tests__/integration/routes.test.ts","src/routes/lsp.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":267,"length":6,"containsCycle":false},{"start":"src/routes/lsp.ts","path":["src/routes/lsp.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":266,"length":5,"containsCycle":false},{"start":"src/routes/github.ts","path":["src/routes/github.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":255,"length":5,"containsCycle":false},{"start":"src/routes/local.ts","path":["src/routes/local.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":247,"length":5,"containsCycle":false},{"start":"src/routes/package.ts","path":["src/routes/package.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":241,"length":5,"containsCycle":false},{"start":"src/utils/resilience.ts","path":["src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":201,"length":4,"containsCycle":false},{"start":"src/__tests__/integration/circuitBreaker.test.ts","path":["src/__tests__/integration/circuitBreaker.test.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":181,"length":4,"containsCycle":false},{"start":"src/__tests__/unit/circuitBreaker.test.ts","path":["src/__tests__/unit/circuitBreaker.test.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":181,"length":4,"containsCycle":false},{"start":"src/utils/circuitBreaker.ts","path":["src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"score":180,"length":3,"containsCycle":false},{"start":"src/middleware/logger.ts","path":["src/middleware/logger.ts","src/utils/logger.ts","src/utils/colors.ts"],"score":144,"length":3,"containsCycle":false}]},"dependencyFindings":[{"id":"AST-ISSUE-0001","severity":"critical","category":"dependency-critical-path","file":"src/server.ts","lineStart":3,"lineEnd":3,"title":"Critical dependency chain risk: 6 files (2 entry points)","reason":"Potentially high-change surface: src/server.ts -> src/routes/tools.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (351 weight). Also reached from: src/routes/tools.ts.","files":["src/server.ts","src/routes/tools.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/server.ts` (fan-out: 11, fan-in: 0).","steps":["Extract interface from `src/server.ts` — it has 11 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/server.ts:3-3"},"correlatedSignals":["hot-file","critical-path-context","top-level-effects","paired:untested-critical-code","paired:import-side-effect-risk","paired:listener-leak-risk","paired:missing-error-boundary","paired:uncleared-timer"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0002","severity":"critical","category":"dependency-critical-path","file":"src/__tests__/integration/routes.test.ts","lineStart":14,"lineEnd":14,"title":"Critical dependency chain risk: 6 files (2 entry points)","reason":"Potentially high-change surface: src/__tests__/integration/routes.test.ts -> src/routes/lsp.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (267 weight). Also reached from: src/routes/lsp.ts.","files":["src/__tests__/integration/routes.test.ts","src/routes/lsp.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/lsp.ts` (fan-out: 7, fan-in: 1).","steps":["Extract interface from `src/routes/lsp.ts` — it has 7 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/__tests__/integration/routes.test.ts:14-14"},"correlatedSignals":["critical-path-context"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0003","severity":"critical","category":"dependency-critical-path","file":"src/routes/github.ts","lineStart":23,"lineEnd":23,"title":"Critical dependency chain risk: 5 files (2 entry points)","reason":"Potentially high-change surface: src/routes/github.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (255 weight). Also reached from: src/utils/resilience.ts.","files":["src/routes/github.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/github.ts` (fan-out: 7, fan-in: 1).","steps":["Extract interface from `src/routes/github.ts` — it has 7 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/routes/github.ts:23-23"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0004","severity":"critical","category":"dependency-critical-path","file":"src/routes/local.ts","lineStart":21,"lineEnd":21,"title":"Critical dependency chain risk: 5 files","reason":"Potentially high-change surface: src/routes/local.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (247 weight).","files":["src/routes/local.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/local.ts` (fan-out: 7, fan-in: 1).","steps":["Extract interface from `src/routes/local.ts` — it has 7 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/routes/local.ts:21-21"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0005","severity":"critical","category":"dependency-critical-path","file":"src/routes/package.ts","lineStart":7,"lineEnd":7,"title":"Critical dependency chain risk: 5 files","reason":"Potentially high-change surface: src/routes/package.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (241 weight).","files":["src/routes/package.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/package.ts` (fan-out: 8, fan-in: 1).","steps":["Extract interface from `src/routes/package.ts` — it has 8 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/routes/package.ts:7-7"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:unvalidated-input-sink","paired:dependency-test-only","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0006","severity":"critical","category":"dependency-critical-path","file":"src/__tests__/integration/circuitBreaker.test.ts","lineStart":8,"lineEnd":14,"title":"Critical dependency chain risk: 4 files","reason":"Potentially high-change surface: src/__tests__/integration/circuitBreaker.test.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (181 weight).","files":["src/__tests__/integration/circuitBreaker.test.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/utils/circuitBreaker.ts` (fan-out: 3, fan-in: 4).","steps":["Extract interface from `src/utils/circuitBreaker.ts` — it has 3 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/__tests__/integration/circuitBreaker.test.ts:8-14"},"correlatedSignals":["critical-path-context"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0007","severity":"critical","category":"dependency-critical-path","file":"src/__tests__/unit/circuitBreaker.test.ts","lineStart":8,"lineEnd":15,"title":"Critical dependency chain risk: 4 files","reason":"Potentially high-change surface: src/__tests__/unit/circuitBreaker.test.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (181 weight).","files":["src/__tests__/unit/circuitBreaker.test.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/utils/circuitBreaker.ts` (fan-out: 3, fan-in: 4).","steps":["Extract interface from `src/utils/circuitBreaker.ts` — it has 3 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/__tests__/unit/circuitBreaker.test.ts:8-15"},"correlatedSignals":["critical-path-context"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0166","severity":"medium","category":"dependency-test-only","file":"src/routes/github.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/github.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/github.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/github.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0167","severity":"medium","category":"dependency-test-only","file":"src/routes/local.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/local.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/local.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/local.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0168","severity":"medium","category":"dependency-test-only","file":"src/routes/lsp.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/lsp.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/lsp.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/lsp.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0169","severity":"medium","category":"dependency-test-only","file":"src/routes/package.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/package.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/package.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/package.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unreachable-module","paired:unvalidated-input-sink","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}}],"findings":[{"id":"AST-ISSUE-0001","severity":"critical","category":"dependency-critical-path","file":"src/server.ts","lineStart":3,"lineEnd":3,"title":"Critical dependency chain risk: 6 files (2 entry points)","reason":"Potentially high-change surface: src/server.ts -> src/routes/tools.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (351 weight). Also reached from: src/routes/tools.ts.","files":["src/server.ts","src/routes/tools.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/server.ts` (fan-out: 11, fan-in: 0).","steps":["Extract interface from `src/server.ts` — it has 11 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/server.ts:3-3"},"correlatedSignals":["hot-file","critical-path-context","top-level-effects","paired:untested-critical-code","paired:import-side-effect-risk","paired:listener-leak-risk","paired:missing-error-boundary","paired:uncleared-timer"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0002","severity":"critical","category":"dependency-critical-path","file":"src/__tests__/integration/routes.test.ts","lineStart":14,"lineEnd":14,"title":"Critical dependency chain risk: 6 files (2 entry points)","reason":"Potentially high-change surface: src/__tests__/integration/routes.test.ts -> src/routes/lsp.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (267 weight). Also reached from: src/routes/lsp.ts.","files":["src/__tests__/integration/routes.test.ts","src/routes/lsp.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/lsp.ts` (fan-out: 7, fan-in: 1).","steps":["Extract interface from `src/routes/lsp.ts` — it has 7 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/__tests__/integration/routes.test.ts:14-14"},"correlatedSignals":["critical-path-context"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0003","severity":"critical","category":"dependency-critical-path","file":"src/routes/github.ts","lineStart":23,"lineEnd":23,"title":"Critical dependency chain risk: 5 files (2 entry points)","reason":"Potentially high-change surface: src/routes/github.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (255 weight). Also reached from: src/utils/resilience.ts.","files":["src/routes/github.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/github.ts` (fan-out: 7, fan-in: 1).","steps":["Extract interface from `src/routes/github.ts` — it has 7 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/routes/github.ts:23-23"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0004","severity":"critical","category":"dependency-critical-path","file":"src/routes/local.ts","lineStart":21,"lineEnd":21,"title":"Critical dependency chain risk: 5 files","reason":"Potentially high-change surface: src/routes/local.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (247 weight).","files":["src/routes/local.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/local.ts` (fan-out: 7, fan-in: 1).","steps":["Extract interface from `src/routes/local.ts` — it has 7 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/routes/local.ts:21-21"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0005","severity":"critical","category":"dependency-critical-path","file":"src/routes/package.ts","lineStart":7,"lineEnd":7,"title":"Critical dependency chain risk: 5 files","reason":"Potentially high-change surface: src/routes/package.ts -> src/utils/resilience.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (241 weight).","files":["src/routes/package.ts","src/utils/resilience.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/routes/package.ts` (fan-out: 8, fan-in: 1).","steps":["Extract interface from `src/routes/package.ts` — it has 8 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/routes/package.ts:7-7"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:unvalidated-input-sink","paired:dependency-test-only","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0006","severity":"critical","category":"dependency-critical-path","file":"src/__tests__/integration/circuitBreaker.test.ts","lineStart":8,"lineEnd":14,"title":"Critical dependency chain risk: 4 files","reason":"Potentially high-change surface: src/__tests__/integration/circuitBreaker.test.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (181 weight).","files":["src/__tests__/integration/circuitBreaker.test.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/utils/circuitBreaker.ts` (fan-out: 3, fan-in: 4).","steps":["Extract interface from `src/utils/circuitBreaker.ts` — it has 3 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/__tests__/integration/circuitBreaker.test.ts:8-14"},"correlatedSignals":["critical-path-context"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0007","severity":"critical","category":"dependency-critical-path","file":"src/__tests__/unit/circuitBreaker.test.ts","lineStart":8,"lineEnd":15,"title":"Critical dependency chain risk: 4 files","reason":"Potentially high-change surface: src/__tests__/unit/circuitBreaker.test.ts -> src/utils/circuitBreaker.ts -> src/index.ts -> src/utils/responseBuilder.ts (181 weight).","files":["src/__tests__/unit/circuitBreaker.test.ts","src/utils/circuitBreaker.ts","src/index.ts","src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Break chain at `src/utils/circuitBreaker.ts` (fan-out: 3, fan-in: 4).","steps":["Extract interface from `src/utils/circuitBreaker.ts` — it has 3 outbound dependencies.","Downstream modules depend on the interface, not the implementation.","This splits the chain into two independent segments."]},"impact":"Critical refactor opportunities; shorter chains reduce blast radius of change.","tags":["change-risk","dependency","blast-radius"],"ruleId":"graph.dependency-critical-path","analysisLens":"graph","confidence":"high","evidence":{"category":"dependency-critical-path","location":"src/__tests__/unit/circuitBreaker.test.ts:8-15"},"correlatedSignals":["critical-path-context"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0044","severity":"high","category":"distance-from-main-sequence","file":"src/mcpCache.ts","lineStart":1,"lineEnd":1,"title":"Distance from Main Sequence: src/mcpCache.ts (D=1.00)","reason":"Zone of Pain (concrete + stable): hard to extend, painful to change. A=0.00, I=0.00, D=1.00 (threshold: 0.7).","files":["src/mcpCache.ts"],"suggestedFix":{"strategy":"Add abstractions (interfaces/types) or reduce inbound coupling.","steps":["Extract interfaces for key behaviors to increase abstractness.","Consider splitting into abstract contracts + concrete implementations.","Reduce inbound coupling by narrowing the public API surface."]},"impact":"Modules on the Main Sequence (D≈0) have optimal balance between stability and extensibility.","tags":["architecture","stability","abstractness","sdp"],"ruleId":"ast.distance-from-main-sequence","analysisLens":"ast","confidence":"low","evidence":{"category":"distance-from-main-sequence","location":"src/mcpCache.ts:1-1"},"correlatedSignals":["paired:low-cohesion","paired:missing-error-boundary","paired:promise-misuse","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0045","severity":"high","category":"distance-from-main-sequence","file":"src/types/guards.ts","lineStart":1,"lineEnd":1,"title":"Distance from Main Sequence: src/types/guards.ts (D=1.00)","reason":"Zone of Pain (concrete + stable): hard to extend, painful to change. A=0.00, I=0.00, D=1.00 (threshold: 0.7).","files":["src/types/guards.ts"],"suggestedFix":{"strategy":"Add abstractions (interfaces/types) or reduce inbound coupling.","steps":["Extract interfaces for key behaviors to increase abstractness.","Consider splitting into abstract contracts + concrete implementations.","Reduce inbound coupling by narrowing the public API surface."]},"impact":"Modules on the Main Sequence (D≈0) have optimal balance between stability and extensibility.","tags":["architecture","stability","abstractness","sdp"],"ruleId":"ast.distance-from-main-sequence","analysisLens":"ast","confidence":"low","evidence":{"category":"distance-from-main-sequence","location":"src/types/guards.ts:1-1"},"correlatedSignals":["hot-file","paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:untested-critical-code","paired:move-to-caller","paired:narrowable-type"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0046","severity":"high","category":"distance-from-main-sequence","file":"src/utils/asyncTimeout.ts","lineStart":1,"lineEnd":1,"title":"Distance from Main Sequence: src/utils/asyncTimeout.ts (D=0.88)","reason":"Zone of Pain (concrete + stable): hard to extend, painful to change. A=0.00, I=0.13, D=0.88 (threshold: 0.7).","files":["src/utils/asyncTimeout.ts"],"suggestedFix":{"strategy":"Add abstractions (interfaces/types) or reduce inbound coupling.","steps":["Extract interfaces for key behaviors to increase abstractness.","Consider splitting into abstract contracts + concrete implementations.","Reduce inbound coupling by narrowing the public API surface."]},"impact":"Modules on the Main Sequence (D≈0) have optimal balance between stability and extensibility.","tags":["architecture","stability","abstractness","sdp"],"ruleId":"ast.distance-from-main-sequence","analysisLens":"ast","confidence":"low","evidence":{"category":"distance-from-main-sequence","location":"src/utils/asyncTimeout.ts:1-1"},"correlatedSignals":["hot-file","paired:listener-leak-risk","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0047","severity":"high","category":"distance-from-main-sequence","file":"src/utils/colors.ts","lineStart":1,"lineEnd":1,"title":"Distance from Main Sequence: src/utils/colors.ts (D=1.00)","reason":"Zone of Pain (concrete + stable): hard to extend, painful to change. A=0.00, I=0.00, D=1.00 (threshold: 0.7).","files":["src/utils/colors.ts"],"suggestedFix":{"strategy":"Add abstractions (interfaces/types) or reduce inbound coupling.","steps":["Extract interfaces for key behaviors to increase abstractness.","Consider splitting into abstract contracts + concrete implementations.","Reduce inbound coupling by narrowing the public API surface."]},"impact":"Modules on the Main Sequence (D≈0) have optimal balance between stability and extensibility.","tags":["architecture","stability","abstractness","sdp"],"ruleId":"ast.distance-from-main-sequence","analysisLens":"ast","confidence":"low","evidence":{"category":"distance-from-main-sequence","location":"src/utils/colors.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:untested-critical-code","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0048","severity":"high","category":"distance-from-main-sequence","file":"src/utils/errorQueue.ts","lineStart":1,"lineEnd":1,"title":"Distance from Main Sequence: src/utils/errorQueue.ts (D=1.00)","reason":"Zone of Pain (concrete + stable): hard to extend, painful to change. A=0.00, I=0.00, D=1.00 (threshold: 0.7).","files":["src/utils/errorQueue.ts"],"suggestedFix":{"strategy":"Add abstractions (interfaces/types) or reduce inbound coupling.","steps":["Extract interfaces for key behaviors to increase abstractness.","Consider splitting into abstract contracts + concrete implementations.","Reduce inbound coupling by narrowing the public API surface."]},"impact":"Modules on the Main Sequence (D≈0) have optimal balance between stability and extensibility.","tags":["architecture","stability","abstractness","sdp"],"ruleId":"ast.distance-from-main-sequence","analysisLens":"ast","confidence":"low","evidence":{"category":"distance-from-main-sequence","location":"src/utils/errorQueue.ts:1-1"},"correlatedSignals":["paired:over-abstraction"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0049","severity":"high","category":"distance-from-main-sequence","file":"src/utils/responseBuilder.ts","lineStart":1,"lineEnd":1,"title":"Distance from Main Sequence: src/utils/responseBuilder.ts (D=1.00)","reason":"Zone of Pain (concrete + stable): hard to extend, painful to change. A=0.00, I=0.00, D=1.00 (threshold: 0.7).","files":["src/utils/responseBuilder.ts"],"suggestedFix":{"strategy":"Add abstractions (interfaces/types) or reduce inbound coupling.","steps":["Extract interfaces for key behaviors to increase abstractness.","Consider splitting into abstract contracts + concrete implementations.","Reduce inbound coupling by narrowing the public API surface."]},"impact":"Modules on the Main Sequence (D≈0) have optimal balance between stability and extensibility.","tags":["architecture","stability","abstractness","sdp"],"ruleId":"ast.distance-from-main-sequence","analysisLens":"ast","confidence":"low","evidence":{"category":"distance-from-main-sequence","location":"src/utils/responseBuilder.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:similar-function-body","paired:cognitive-complexity","paired:over-abstraction"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0050","severity":"high","category":"distance-from-main-sequence","file":"src/validation/httpPreprocess.ts","lineStart":1,"lineEnd":1,"title":"Distance from Main Sequence: src/validation/httpPreprocess.ts (D=1.00)","reason":"Zone of Pain (concrete + stable): hard to extend, painful to change. A=0.00, I=0.00, D=1.00 (threshold: 0.7).","files":["src/validation/httpPreprocess.ts"],"suggestedFix":{"strategy":"Add abstractions (interfaces/types) or reduce inbound coupling.","steps":["Extract interfaces for key behaviors to increase abstractness.","Consider splitting into abstract contracts + concrete implementations.","Reduce inbound coupling by narrowing the public API surface."]},"impact":"Modules on the Main Sequence (D≈0) have optimal balance between stability and extensibility.","tags":["architecture","stability","abstractness","sdp"],"ruleId":"ast.distance-from-main-sequence","analysisLens":"ast","confidence":"low","evidence":{"category":"distance-from-main-sequence","location":"src/validation/httpPreprocess.ts:1-1"},"correlatedSignals":["hot-file","paired:semantic-dead-export","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0051","severity":"high","category":"export-star-leak","file":"src/validation/index.ts","lineStart":1,"lineEnd":1,"title":"export * leaks entire module surface: ./schemas.js","reason":"`export * from './schemas.js'` re-exports every symbol from the source, defeating granular tree-shaking. Target exports 39 symbols.","files":["src/validation/index.ts:1-1"],"suggestedFix":{"strategy":"Replace export * with explicit named re-exports.","steps":["List the symbols actually consumed from `./schemas.js` by downstream modules.","Replace `export * from './schemas.js'` with `export { A, B, C } from './schemas.js'`.","This lets bundlers eliminate unused re-exports during tree-shaking."]},"impact":"Explicit re-exports enable precise tree-shaking and make the public API surface visible.","tags":["tree-shaking","bundle-size","export-star","api-surface"],"ruleId":"ast.export-star-leak","analysisLens":"ast","confidence":"low","evidence":{"category":"export-star-leak","location":"src/validation/index.ts:1-1"},"correlatedSignals":["paired:re-export-duplication"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0052","severity":"high","category":"feature-envy","file":"src/utils/retry.ts","lineStart":7,"lineEnd":13,"title":"Feature envy: src/utils/retry.ts → src/types/errorGuards.ts","reason":"Module imports 5/5 symbols (100%) from \"src/types/errorGuards.ts\". This suggests the logic may belong in or closer to the target module.","files":["src/utils/retry.ts","src/types/errorGuards.ts"],"suggestedFix":{"strategy":"Move dependent logic to the target module or extract a shared module.","steps":["Identify which functions/logic in this file use the imported symbols.","Move that logic to the target module if it belongs there.","If shared, extract a dedicated module that both can import from.","Reduce the import surface by passing data instead of importing behaviors."]},"impact":"Misplaced logic increases coupling and makes changes ripple across module boundaries.","tags":["coupling","responsibility","misplaced-logic"],"lspHints":[{"tool":"lspCallHierarchy","symbolName":"retry.ts","lineHint":7,"file":"src/utils/retry.ts","expectedResult":"trace which functions use imports from src/types/errorGuards.ts to decide what to move"},{"tool":"lspGotoDefinition","symbolName":"errorGuards.ts","lineHint":7,"file":"src/utils/retry.ts","expectedResult":"inspect target module to evaluate if logic belongs there"}],"ruleId":"hybrid.feature-envy","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"feature-envy","location":"src/utils/retry.ts:7-13"},"correlatedSignals":["hot-file","paired:await-in-loop","paired:dead-export","paired:semantic-dead-export"],"recommendedValidation":{"summary":"trace which functions use imports from src/types/errorGuards.ts to decide what to move","tools":["localSearchCode","lspCallHierarchy"]}},{"id":"AST-ISSUE-0053","severity":"high","category":"feature-envy","file":"src/validation/schemas.ts","lineStart":38,"lineEnd":46,"title":"Feature envy: src/validation/schemas.ts → src/validation/httpPreprocess.ts","reason":"Module imports 7/7 symbols (100%) from \"src/validation/httpPreprocess.ts\". This suggests the logic may belong in or closer to the target module.","files":["src/validation/schemas.ts","src/validation/httpPreprocess.ts"],"suggestedFix":{"strategy":"Move dependent logic to the target module or extract a shared module.","steps":["Identify which functions/logic in this file use the imported symbols.","Move that logic to the target module if it belongs there.","If shared, extract a dedicated module that both can import from.","Reduce the import surface by passing data instead of importing behaviors."]},"impact":"Misplaced logic increases coupling and makes changes ripple across module boundaries.","tags":["coupling","responsibility","misplaced-logic"],"lspHints":[{"tool":"lspCallHierarchy","symbolName":"schemas.ts","lineHint":38,"file":"src/validation/schemas.ts","expectedResult":"trace which functions use imports from src/validation/httpPreprocess.ts to decide what to move"},{"tool":"lspGotoDefinition","symbolName":"httpPreprocess.ts","lineHint":38,"file":"src/validation/schemas.ts","expectedResult":"inspect target module to evaluate if logic belongs there"}],"ruleId":"hybrid.feature-envy","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"feature-envy","location":"src/validation/schemas.ts:38-46"},"correlatedSignals":["hot-file","paired:god-module","paired:semantic-dead-export"],"recommendedValidation":{"summary":"trace which functions use imports from src/validation/httpPreprocess.ts to decide what to move","tools":["localSearchCode","lspCallHierarchy"]}},{"id":"AST-ISSUE-0105","severity":"high","category":"unreachable-module","file":"src/middleware/queryParser.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/middleware/queryParser.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/middleware/queryParser.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/middleware/queryParser.ts:1-1"},"correlatedSignals":["paired:cognitive-complexity","paired:input-passthrough-risk","paired:prototype-pollution-risk"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0106","severity":"high","category":"unreachable-module","file":"src/routes/github.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/routes/github.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/routes/github.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/routes/github.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0107","severity":"high","category":"unreachable-module","file":"src/routes/local.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/routes/local.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/routes/local.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/routes/local.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0108","severity":"high","category":"unreachable-module","file":"src/routes/lsp.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/routes/lsp.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/routes/lsp.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/routes/lsp.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0109","severity":"high","category":"unreachable-module","file":"src/routes/package.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/routes/package.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/routes/package.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/routes/package.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unvalidated-input-sink","paired:dependency-test-only","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0110","severity":"high","category":"unreachable-module","file":"src/server-init.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/server-init.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/server-init.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/server-init.ts:1-1"},"correlatedSignals":["top-level-effects","paired:await-in-loop","paired:untested-critical-code","paired:dead-file","paired:empty-catch","paired:import-side-effect-risk","paired:listener-leak-risk","paired:missing-error-boundary"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0111","severity":"high","category":"unreachable-module","file":"src/types/guards.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/types/guards.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/types/guards.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/types/guards.ts:1-1"},"correlatedSignals":["hot-file","paired:dead-export","paired:distance-from-main-sequence","paired:semantic-dead-export","paired:untested-critical-code","paired:move-to-caller","paired:narrowable-type"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0112","severity":"high","category":"unreachable-module","file":"src/types/responses.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/types/responses.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/types/responses.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/types/responses.ts:1-1"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0113","severity":"high","category":"unreachable-module","file":"src/types/toolTypes.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/types/toolTypes.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/types/toolTypes.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/types/toolTypes.ts:1-1"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:dead-file","paired:orphan-module","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0114","severity":"high","category":"unreachable-module","file":"src/utils/logEmoji.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/utils/logEmoji.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/utils/logEmoji.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/utils/logEmoji.ts:1-1"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:dead-file","paired:orphan-module","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0115","severity":"high","category":"unreachable-module","file":"src/utils/responseFactory.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/utils/responseFactory.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/utils/responseFactory.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/utils/responseFactory.ts:1-1"},"correlatedSignals":["hot-file","paired:dead-export","paired:semantic-dead-export","paired:untested-critical-code","paired:architecture-sdp-violation","paired:feature-envy","paired:move-to-caller","paired:narrowable-type"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0116","severity":"high","category":"unreachable-module","file":"src/utils/routeFactory.ts","lineStart":1,"lineEnd":1,"title":"Unreachable module: src/utils/routeFactory.ts","reason":"Module is not reachable from any entrypoint via the import graph.","files":["src/utils/routeFactory.ts"],"suggestedFix":{"strategy":"Verify reachability and remove if truly dead.","steps":["Check if this module is loaded dynamically or via framework conventions.","Verify it is not registered as a route, plugin, or middleware.","If confirmed unreachable, delete and re-run scan."]},"impact":"Identifies potentially large sections of dead code missed by direct-import checks.","tags":["dead-code","dependency","reachability"],"ruleId":"graph.unreachable-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"unreachable-module","location":"src/utils/routeFactory.ts:1-1"},"correlatedSignals":["paired:unvalidated-input-sink","paired:dead-export","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0117","severity":"high","category":"untested-critical-code","file":"src/routes/tools.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/routes/tools.ts","reason":"High-risk file has no test imports. fan-in=1, fan-out=8, complexity=79; on critical dependency path (risk score: 58).","files":["src/routes/tools.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/routes/tools.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:hardcoded-secret","paired:prototype-pollution-risk","paired:unvalidated-input-sink","paired:listener-leak-risk","paired:over-abstraction","paired:type-assertion-escape"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0118","severity":"high","category":"untested-critical-code","file":"src/types/guards.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/types/guards.ts","reason":"High-risk file has no test imports. fan-in=6, fan-out=0, complexity=40 (risk score: 55).","files":["src/types/guards.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/types/guards.ts:1-1"},"correlatedSignals":["hot-file","paired:dead-export","paired:distance-from-main-sequence","paired:semantic-dead-export","paired:unreachable-module","paired:move-to-caller","paired:narrowable-type"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0119","severity":"high","category":"untested-critical-code","file":"src/server.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/server.ts","reason":"High-risk file has no test imports. fan-in=0, fan-out=11, complexity=71; on critical dependency path (risk score: 54).","files":["src/server.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/server.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","top-level-effects","paired:dependency-critical-path","paired:import-side-effect-risk","paired:listener-leak-risk","paired:missing-error-boundary","paired:uncleared-timer"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0120","severity":"high","category":"untested-critical-code","file":"src/types/errorGuards.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/types/errorGuards.ts","reason":"High-risk file has no test imports. fan-in=1, fan-out=0, complexity=47 (risk score: 45).","files":["src/types/errorGuards.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/types/errorGuards.ts:1-1"},"correlatedSignals":["hot-file","paired:dead-export","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0121","severity":"high","category":"untested-critical-code","file":"src/utils/resilience.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/utils/resilience.ts","reason":"High-risk file has no test imports. fan-in=5, fan-out=3, complexity=21; on critical dependency path (risk score: 45).","files":["src/utils/resilience.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/utils/resilience.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:semantic-dead-export","paired:dead-export"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0122","severity":"high","category":"untested-critical-code","file":"src/utils/responseFactory.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/utils/responseFactory.ts","reason":"High-risk file has no test imports. fan-in=4, fan-out=2, complexity=38 (risk score: 44).","files":["src/utils/responseFactory.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/utils/responseFactory.ts:1-1"},"correlatedSignals":["hot-file","paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:architecture-sdp-violation","paired:feature-envy","paired:move-to-caller","paired:narrowable-type"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0123","severity":"high","category":"untested-critical-code","file":"src/utils/responseParser.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/utils/responseParser.ts","reason":"High-risk file has no test imports. fan-in=3, fan-out=0, complexity=43 (risk score: 41).","files":["src/utils/responseParser.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/utils/responseParser.ts:1-1"},"correlatedSignals":["hot-file","paired:cognitive-complexity","paired:dead-export","paired:semantic-dead-export","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0124","severity":"high","category":"untested-critical-code","file":"src/utils/colors.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/utils/colors.ts","reason":"High-risk file has no test imports. fan-in=4, fan-out=0, complexity=16; on critical dependency path (risk score: 39).","files":["src/utils/colors.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/utils/colors.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:distance-from-main-sequence","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0125","severity":"high","category":"untested-critical-code","file":"src/index.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/index.ts","reason":"High-risk file has no test imports. fan-in=9, fan-out=1, complexity=1; on critical dependency path (risk score: 38).","files":["src/index.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/index.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dead-re-export"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0126","severity":"high","category":"untested-critical-code","file":"src/server-init.ts","lineStart":1,"lineEnd":1,"title":"Untested critical code: src/server-init.ts","reason":"High-risk file has no test imports. high complexity score (48), 0 high-complexity functions (risk score: 48).","files":["src/server-init.ts"],"suggestedFix":{"strategy":"Add test coverage for this critical module.","steps":["Create a test file that imports and exercises the public API of this module.","Focus on the highest-complexity functions and exported behaviors first.","Add integration tests if this module sits on a critical dependency path.","Consider property-based tests for complex data transformations."]},"impact":"Untested critical code is the highest-risk area for regressions and undetected bugs.","tags":["testing","coverage","change-risk","critical"],"ruleId":"ast.untested-critical-code","analysisLens":"ast","confidence":"low","evidence":{"category":"untested-critical-code","location":"src/server-init.ts:1-1"},"correlatedSignals":["top-level-effects","paired:await-in-loop","paired:unreachable-module","paired:dead-file","paired:empty-catch","paired:import-side-effect-risk","paired:listener-leak-risk","paired:missing-error-boundary"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0134","severity":"medium","category":"architecture-sdp-violation","file":"src/utils/responseFactory.ts","lineStart":8,"lineEnd":8,"title":"SDP violation: stable module depends on unstable module","reason":"\"src/utils/responseFactory.ts\" (I=0.33) depends on \"src/types/responses.ts\" (I=0.50). Delta=0.17.","files":["src/utils/responseFactory.ts","src/types/responses.ts"],"suggestedFix":{"strategy":"Invert dependency via interface/abstraction or move shared code to a stable utility.","steps":["Extract a stable interface that the stable module depends on.","Have the unstable module implement that interface.","Consider moving shared logic to a lower-instability utility module."]},"impact":"Prevents cascading instability and reduces change propagation risk.","tags":["stability","coupling","architecture","sdp"],"ruleId":"graph.architecture-sdp-violation","analysisLens":"graph","confidence":"medium","evidence":{"category":"architecture-sdp-violation","location":"src/utils/responseFactory.ts:8-8"},"correlatedSignals":["hot-file","paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:untested-critical-code","paired:feature-envy","paired:move-to-caller","paired:narrowable-type"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0166","severity":"medium","category":"dependency-test-only","file":"src/routes/github.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/github.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/github.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/github.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0167","severity":"medium","category":"dependency-test-only","file":"src/routes/local.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/local.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/local.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/local.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0168","severity":"medium","category":"dependency-test-only","file":"src/routes/lsp.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/lsp.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/lsp.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/lsp.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0169","severity":"medium","category":"dependency-test-only","file":"src/routes/package.ts","lineStart":1,"lineEnd":1,"title":"Module imported only from tests: src/routes/package.ts","reason":"No production file imports this module, but tests do. Verify if this module belongs in test fixtures/helpers.","files":["src/routes/package.ts"],"suggestedFix":{"strategy":"Move test-only utilities to test scope or make production usage explicit.","steps":["Re-run import scanning after moving test-only modules to __tests__ or helper folders.","If this is shared production utility, add a non-test entrypoint/import.","Remove dead or stale production references and delete unused module if confirmed."]},"impact":"Reduces shipping of non-production-only modules and clarifies ownership boundaries.","tags":["testing","dead-code","dependency"],"ruleId":"graph.dependency-test-only","analysisLens":"graph","confidence":"medium","evidence":{"category":"dependency-test-only","location":"src/routes/package.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unreachable-module","paired:unvalidated-input-sink","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0175","severity":"medium","category":"export-star-leak","file":"src/validation/index.ts","lineStart":2,"lineEnd":2,"title":"export * leaks entire module surface: ./httpPreprocess.js","reason":"`export * from './httpPreprocess.js'` re-exports every symbol from the source, defeating granular tree-shaking. Target exports 10 symbols.","files":["src/validation/index.ts:2-2"],"suggestedFix":{"strategy":"Replace export * with explicit named re-exports.","steps":["List the symbols actually consumed from `./httpPreprocess.js` by downstream modules.","Replace `export * from './httpPreprocess.js'` with `export { A, B, C } from './httpPreprocess.js'`.","This lets bundlers eliminate unused re-exports during tree-shaking."]},"impact":"Explicit re-exports enable precise tree-shaking and make the public API surface visible.","tags":["tree-shaking","bundle-size","export-star","api-surface"],"ruleId":"ast.export-star-leak","analysisLens":"ast","confidence":"low","evidence":{"category":"export-star-leak","location":"src/validation/index.ts:2-2"},"correlatedSignals":["paired:re-export-duplication"],"recommendedValidation":{"summary":"Confirm the code location and inspect the matched structure before proposing a refactor.","tools":["localSearchCode"]}},{"id":"AST-ISSUE-0176","severity":"medium","category":"feature-envy","file":"src/utils/responseFactory.ts","lineStart":10,"lineEnd":10,"title":"Feature envy: src/utils/responseFactory.ts → src/types/guards.ts","reason":"Module imports 5/8 symbols (63%) from \"src/types/guards.ts\". This suggests the logic may belong in or closer to the target module.","files":["src/utils/responseFactory.ts","src/types/guards.ts"],"suggestedFix":{"strategy":"Move dependent logic to the target module or extract a shared module.","steps":["Identify which functions/logic in this file use the imported symbols.","Move that logic to the target module if it belongs there.","If shared, extract a dedicated module that both can import from.","Reduce the import surface by passing data instead of importing behaviors."]},"impact":"Misplaced logic increases coupling and makes changes ripple across module boundaries.","tags":["coupling","responsibility","misplaced-logic"],"lspHints":[{"tool":"lspCallHierarchy","symbolName":"responseFactory.ts","lineHint":10,"file":"src/utils/responseFactory.ts","expectedResult":"trace which functions use imports from src/types/guards.ts to decide what to move"},{"tool":"lspGotoDefinition","symbolName":"guards.ts","lineHint":10,"file":"src/utils/responseFactory.ts","expectedResult":"inspect target module to evaluate if logic belongs there"}],"ruleId":"hybrid.feature-envy","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"feature-envy","location":"src/utils/responseFactory.ts:10-10"},"correlatedSignals":["hot-file","paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:untested-critical-code","paired:architecture-sdp-violation","paired:move-to-caller","paired:narrowable-type"],"recommendedValidation":{"summary":"trace which functions use imports from src/types/guards.ts to decide what to move","tools":["localSearchCode","lspCallHierarchy"]}},{"id":"AST-ISSUE-0177","severity":"medium","category":"import-side-effect-risk","file":"src/server-init.ts","lineStart":182,"lineEnd":182,"title":"Import-time side effects (2): src/server-init.ts","reason":"Module executes work at import time: process.on() (line 182); process.on() (line 183). Risk score: 8 (ast=8, impact=+0, role=-0). Confidence: high.","files":["src/server-init.ts"],"suggestedFix":{"strategy":"Move import-time side effects behind explicit initialization or lazy loading.","steps":["Wrap startup logic in an exported init() function instead of running at module scope.","Replace synchronous I/O with async alternatives called at runtime.","Guard side-effect imports with dynamic import() behind feature checks.","If this is an intentional entrypoint, consider adding a suppression comment."]},"impact":"Importing this module triggers 2 side effect(s). With fan-in=0, unintended imports can degrade startup latency and cause surprising runtime behavior.","tags":["import-side-effect","startup","architecture","performance"],"lspHints":[{"tool":"lspFindReferences","symbolName":"server-init","lineHint":1,"file":"src/server-init.ts","expectedResult":"find all modules that import this file and may trigger side effects"}],"ruleId":"hybrid.import-side-effect-risk","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"import-side-effect-risk","location":"src/server-init.ts:182-182"},"correlatedSignals":["top-level-effects","paired:await-in-loop","paired:unreachable-module","paired:untested-critical-code","paired:dead-file","paired:empty-catch","paired:listener-leak-risk","paired:missing-error-boundary"],"recommendedValidation":{"summary":"find all modules that import this file and may trigger side effects","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0178","severity":"medium","category":"import-side-effect-risk","file":"src/server.ts","lineStart":269,"lineEnd":269,"title":"Import-time side effects (2): src/server.ts","reason":"Module executes work at import time: process.on() (line 269); process.on() (line 270). Risk score: 10 (ast=8, impact=+6, role=-4). Confidence: high. Architecture context: on critical path, entrypoint (discounted).","files":["src/server.ts"],"suggestedFix":{"strategy":"Move import-time side effects behind explicit initialization or lazy loading.","steps":["Wrap startup logic in an exported init() function instead of running at module scope.","Replace synchronous I/O with async alternatives called at runtime.","Guard side-effect imports with dynamic import() behind feature checks.","If this is an intentional entrypoint, consider adding a suppression comment."]},"impact":"Importing this module triggers 2 side effect(s). With fan-in=0, unintended imports can degrade startup latency and cause surprising runtime behavior.","tags":["import-side-effect","startup","architecture","performance"],"lspHints":[{"tool":"lspFindReferences","symbolName":"server","lineHint":1,"file":"src/server.ts","expectedResult":"find all modules that import this file and may trigger side effects"}],"ruleId":"hybrid.import-side-effect-risk","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"import-side-effect-risk","location":"src/server.ts:269-269"},"correlatedSignals":["hot-file","critical-path-context","top-level-effects","paired:dependency-critical-path","paired:untested-critical-code","paired:listener-leak-risk","paired:missing-error-boundary","paired:uncleared-timer"],"recommendedValidation":{"summary":"find all modules that import this file and may trigger side effects","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0188","severity":"medium","category":"low-cohesion","file":"src/mcpCache.ts","lineStart":1,"lineEnd":1,"title":"Low cohesion: src/mcpCache.ts (LCOM=2)","reason":"Module exports 3 consumed symbols that form 2 independent groups. Consumers never import symbols across groups — the module serves unrelated purposes.","files":["src/mcpCache.ts"],"suggestedFix":{"strategy":"Split into 2 focused modules, one per cohesion group.","steps":["Identify which exports belong to each independent group.","Create a new module for each group with a descriptive name.","Move exports and their dependencies to the appropriate module.","Update consumer imports to point to the new modules."]},"impact":"Higher cohesion = easier navigation, focused testing, and smaller change blast radius.","tags":["cohesion","responsibility","architecture"],"ruleId":"hybrid.low-cohesion","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"low-cohesion","location":"src/mcpCache.ts:1-1"},"correlatedSignals":["paired:distance-from-main-sequence","paired:missing-error-boundary","paired:promise-misuse","paired:move-to-caller"],"recommendedValidation":{"summary":"Validate both the structural location and the behavioral path before presenting the claim as fact.","tools":["localSearchCode","lspCallHierarchy"]}},{"id":"AST-ISSUE-0189","severity":"medium","category":"low-cohesion","file":"src/utils/logger.ts","lineStart":1,"lineEnd":1,"title":"Low cohesion: src/utils/logger.ts (LCOM=2)","reason":"Module exports 6 consumed symbols that form 2 independent groups. Consumers never import symbols across groups — the module serves unrelated purposes.","files":["src/utils/logger.ts"],"suggestedFix":{"strategy":"Split into 2 focused modules, one per cohesion group.","steps":["Identify which exports belong to each independent group.","Create a new module for each group with a descriptive name.","Move exports and their dependencies to the appropriate module.","Update consumer imports to point to the new modules."]},"impact":"Higher cohesion = easier navigation, focused testing, and smaller change blast radius.","tags":["cohesion","responsibility","architecture"],"ruleId":"hybrid.low-cohesion","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"low-cohesion","location":"src/utils/logger.ts:1-1"},"correlatedSignals":["hot-file","critical-path-context","paired:dead-export","paired:semantic-dead-export","paired:sql-injection-risk","paired:empty-catch","paired:excessive-parameters","paired:input-passthrough-risk"],"recommendedValidation":{"summary":"Validate both the structural location and the behavioral path before presenting the claim as fact.","tools":["localSearchCode","lspCallHierarchy"]}},{"id":"AST-ISSUE-0193","severity":"medium","category":"orphan-module","file":"src/server-init.ts","lineStart":1,"lineEnd":1,"title":"Orphan module: src/server-init.ts","reason":"Module has no inbound or outbound dependencies — completely disconnected from the module graph.","files":["src/server-init.ts"],"suggestedFix":{"strategy":"Delete if truly unused, or wire into module graph.","steps":["Check if the file is a runtime entrypoint, route, or config.","If truly disconnected, delete and re-run scan.","If needed, add an explicit import from the appropriate parent module."]},"impact":"Removes dead surface area and clarifies module ownership.","tags":["dead-code","dependency","isolation"],"ruleId":"graph.orphan-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"orphan-module","location":"src/server-init.ts:1-1"},"correlatedSignals":["top-level-effects","paired:await-in-loop","paired:unreachable-module","paired:untested-critical-code","paired:dead-file","paired:empty-catch","paired:import-side-effect-risk","paired:listener-leak-risk"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0194","severity":"medium","category":"orphan-module","file":"src/types/toolTypes.ts","lineStart":1,"lineEnd":1,"title":"Orphan module: src/types/toolTypes.ts","reason":"Module has no inbound or outbound dependencies — completely disconnected from the module graph.","files":["src/types/toolTypes.ts"],"suggestedFix":{"strategy":"Delete if truly unused, or wire into module graph.","steps":["Check if the file is a runtime entrypoint, route, or config.","If truly disconnected, delete and re-run scan.","If needed, add an explicit import from the appropriate parent module."]},"impact":"Removes dead surface area and clarifies module ownership.","tags":["dead-code","dependency","isolation"],"ruleId":"graph.orphan-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"orphan-module","location":"src/types/toolTypes.ts:1-1"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:dead-file","paired:over-abstraction","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0195","severity":"medium","category":"orphan-module","file":"src/utils/logEmoji.ts","lineStart":1,"lineEnd":1,"title":"Orphan module: src/utils/logEmoji.ts","reason":"Module has no inbound or outbound dependencies — completely disconnected from the module graph.","files":["src/utils/logEmoji.ts"],"suggestedFix":{"strategy":"Delete if truly unused, or wire into module graph.","steps":["Check if the file is a runtime entrypoint, route, or config.","If truly disconnected, delete and re-run scan.","If needed, add an explicit import from the appropriate parent module."]},"impact":"Removes dead surface area and clarifies module ownership.","tags":["dead-code","dependency","isolation"],"ruleId":"graph.orphan-module","analysisLens":"graph","confidence":"medium","evidence":{"category":"orphan-module","location":"src/utils/logEmoji.ts:1-1"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:dead-file","paired:move-to-caller"],"recommendedValidation":{"summary":"Confirm the dependency edge or hub behavior with localSearchCode and an LSP navigation step.","tools":["localSearchCode","lspGotoDefinition"]}},{"id":"AST-ISSUE-0196","severity":"medium","category":"over-abstraction","file":"src/routes/package.ts","lineStart":50,"lineEnd":50,"title":"Over-abstraction: interface PackageInfo has exactly 1 implementor","reason":"Interface \"PackageInfo\" is implemented only by one class in \"src/routes/package.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/routes/package.ts","src/routes/package.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"PackageInfo","lineHint":50,"file":"src/routes/package.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/routes/package.ts:50-50"},"correlatedSignals":["hot-file","critical-path-context","paired:dependency-critical-path","paired:unreachable-module","paired:unvalidated-input-sink","paired:dependency-test-only","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0197","severity":"medium","category":"over-abstraction","file":"src/routes/tools.ts","lineStart":465,"lineEnd":465,"title":"Over-abstraction: interface ToolEntry has exactly 1 implementor","reason":"Interface \"ToolEntry\" is implemented only by one class in \"src/routes/tools.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/routes/tools.ts","src/routes/tools.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"ToolEntry","lineHint":465,"file":"src/routes/tools.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/routes/tools.ts:465-465"},"correlatedSignals":["hot-file","critical-path-context","paired:hardcoded-secret","paired:prototype-pollution-risk","paired:untested-critical-code","paired:unvalidated-input-sink","paired:listener-leak-risk","paired:type-assertion-escape"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0198","severity":"medium","category":"over-abstraction","file":"src/types/mcp.ts","lineStart":7,"lineEnd":7,"title":"Over-abstraction: interface JsonSchema has exactly 1 implementor","reason":"Interface \"JsonSchema\" is implemented only by one class in \"src/types/mcp.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/types/mcp.ts","src/types/mcp.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"JsonSchema","lineHint":7,"file":"src/types/mcp.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/types/mcp.ts:7-7"},"correlatedSignals":["paired:semantic-dead-export","paired:dead-export","paired:move-to-caller","paired:prototype-pollution-risk"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0199","severity":"medium","category":"over-abstraction","file":"src/types/mcp.ts","lineStart":15,"lineEnd":15,"title":"Over-abstraction: interface JsonSchemaProperty has exactly 1 implementor","reason":"Interface \"JsonSchemaProperty\" is implemented only by one class in \"src/types/mcp.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/types/mcp.ts","src/types/mcp.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"JsonSchemaProperty","lineHint":15,"file":"src/types/mcp.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/types/mcp.ts:15-15"},"correlatedSignals":["paired:semantic-dead-export","paired:dead-export","paired:move-to-caller","paired:prototype-pollution-risk"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0200","severity":"medium","category":"over-abstraction","file":"src/types/responses.ts","lineStart":28,"lineEnd":28,"title":"Over-abstraction: interface FileMatch has exactly 1 implementor","reason":"Interface \"FileMatch\" is implemented only by one class in \"src/types/responses.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/types/responses.ts","src/types/responses.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"FileMatch","lineHint":28,"file":"src/types/responses.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/types/responses.ts:28-28"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0201","severity":"medium","category":"over-abstraction","file":"src/types/responses.ts","lineStart":85,"lineEnd":85,"title":"Over-abstraction: interface LspDefinition has exactly 1 implementor","reason":"Interface \"LspDefinition\" is implemented only by one class in \"src/types/responses.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/types/responses.ts","src/types/responses.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"LspDefinition","lineHint":85,"file":"src/types/responses.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/types/responses.ts:85-85"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0202","severity":"medium","category":"over-abstraction","file":"src/types/toolTypes.ts","lineStart":21,"lineEnd":21,"title":"Over-abstraction: interface QueryParamsResult has exactly 1 implementor","reason":"Interface \"QueryParamsResult\" is implemented only by one class in \"src/types/toolTypes.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/types/toolTypes.ts","src/types/toolTypes.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"QueryParamsResult","lineHint":21,"file":"src/types/toolTypes.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/types/toolTypes.ts:21-21"},"correlatedSignals":["paired:dead-export","paired:semantic-dead-export","paired:unreachable-module","paired:dead-file","paired:orphan-module","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0203","severity":"medium","category":"over-abstraction","file":"src/utils/circuitBreaker.ts","lineStart":36,"lineEnd":36,"title":"Over-abstraction: interface CircuitBreakerConfig has exactly 1 implementor","reason":"Interface \"CircuitBreakerConfig\" is implemented only by one class in \"src/utils/circuitBreaker.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/utils/circuitBreaker.ts","src/utils/circuitBreaker.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"CircuitBreakerConfig","lineHint":36,"file":"src/utils/circuitBreaker.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/utils/circuitBreaker.ts:36-36"},"correlatedSignals":["hot-file","critical-path-context","paired:dead-export","paired:prototype-pollution-risk","paired:semantic-dead-export","paired:type-assertion-escape","paired:uncleared-timer","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0204","severity":"medium","category":"over-abstraction","file":"src/utils/errorQueue.ts","lineStart":8,"lineEnd":8,"title":"Over-abstraction: interface QueuedError has exactly 1 implementor","reason":"Interface \"QueuedError\" is implemented only by one class in \"src/utils/errorQueue.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/utils/errorQueue.ts","src/utils/errorQueue.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"QueuedError","lineHint":8,"file":"src/utils/errorQueue.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/utils/errorQueue.ts:8-8"},"correlatedSignals":["paired:distance-from-main-sequence"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0205","severity":"medium","category":"over-abstraction","file":"src/utils/responseBuilder.ts","lineStart":62,"lineEnd":62,"title":"Over-abstraction: interface ResearchContext has exactly 1 implementor","reason":"Interface \"ResearchContext\" is implemented only by one class in \"src/utils/responseParser.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/utils/responseBuilder.ts","src/utils/responseParser.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"ResearchContext","lineHint":62,"file":"src/utils/responseBuilder.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/utils/responseBuilder.ts:62-62"},"correlatedSignals":["hot-file","critical-path-context","paired:distance-from-main-sequence","paired:similar-function-body","paired:cognitive-complexity"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0206","severity":"medium","category":"over-abstraction","file":"src/utils/responseParser.ts","lineStart":39,"lineEnd":39,"title":"Over-abstraction: interface BulkResultItem has exactly 1 implementor","reason":"Interface \"BulkResultItem\" is implemented only by one class in \"src/utils/responseParser.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/utils/responseParser.ts","src/utils/responseParser.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"BulkResultItem","lineHint":39,"file":"src/utils/responseParser.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/utils/responseParser.ts:39-39"},"correlatedSignals":["hot-file","paired:cognitive-complexity","paired:dead-export","paired:semantic-dead-export","paired:untested-critical-code","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0207","severity":"medium","category":"over-abstraction","file":"src/utils/responseParser.ts","lineStart":49,"lineEnd":49,"title":"Over-abstraction: interface ParsedResponse has exactly 1 implementor","reason":"Interface \"ParsedResponse\" is implemented only by one class in \"src/utils/responseParser.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/utils/responseParser.ts","src/utils/responseParser.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"ParsedResponse","lineHint":49,"file":"src/utils/responseParser.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/utils/responseParser.ts:49-49"},"correlatedSignals":["hot-file","paired:cognitive-complexity","paired:dead-export","paired:semantic-dead-export","paired:untested-critical-code","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0208","severity":"medium","category":"over-abstraction","file":"src/utils/responseParser.ts","lineStart":63,"lineEnd":63,"title":"Over-abstraction: interface ParsedBulkResponse has exactly 1 implementor","reason":"Interface \"ParsedBulkResponse\" is implemented only by one class in \"src/utils/responseParser.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/utils/responseParser.ts","src/utils/responseParser.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"ParsedBulkResponse","lineHint":63,"file":"src/utils/responseParser.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/utils/responseParser.ts:63-63"},"correlatedSignals":["hot-file","paired:cognitive-complexity","paired:dead-export","paired:semantic-dead-export","paired:untested-critical-code","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}},{"id":"AST-ISSUE-0209","severity":"medium","category":"over-abstraction","file":"src/validation/toolCallSchema.ts","lineStart":57,"lineEnd":57,"title":"Over-abstraction: interface ValidationResult has exactly 1 implementor","reason":"Interface \"ValidationResult\" is implemented only by one class in \"src/validation/toolCallSchema.ts\". The abstraction layer adds complexity without enabling polymorphism.","files":["src/validation/toolCallSchema.ts","src/validation/toolCallSchema.ts"],"suggestedFix":{"strategy":"Inline the interface into the concrete class or keep it only if future implementors are planned.","steps":["Evaluate whether the interface is needed for testing (mocking) or future extensibility.","If not, merge the interface declaration into the concrete class.","Update consumers to depend on the concrete class directly."]},"impact":"Over-abstraction adds indirection without polymorphic benefit, increasing cognitive load.","tags":["architecture","abstraction","semantic"],"lspHints":[{"tool":"lspFindReferences","symbolName":"ValidationResult","lineHint":57,"file":"src/validation/toolCallSchema.ts","expectedResult":"exactly 1 implementation confirms over-abstraction"}],"ruleId":"hybrid.over-abstraction","analysisLens":"hybrid","confidence":"medium","evidence":{"category":"over-abstraction","location":"src/validation/toolCallSchema.ts:57-57"},"correlatedSignals":["paired:dead-export","paired:input-passthrough-risk","paired:move-to-caller"],"recommendedValidation":{"summary":"exactly 1 implementation confirms over-abstraction","tools":["localSearchCode","lspFindReferences"]}}],"findingsCount":67,"severityBreakdown":{"critical":7,"high":32,"medium":28,"low":0,"info":0},"categoryBreakdown":{"dependency-critical-path":7,"distance-from-main-sequence":7,"export-star-leak":2,"feature-envy":3,"unreachable-module":12,"untested-critical-code":10,"architecture-sdp-violation":1,"dependency-test-only":4,"import-side-effect-risk":2,"low-cohesion":2,"orphan-module":3,"over-abstraction":14},"hotFiles":[{"file":"src/utils/logger.ts","riskScore":97,"fanIn":4,"fanOut":2,"complexityScore":112,"exportCount":12,"inCycle":false,"onCriticalPath":true},{"file":"src/utils/responseBuilder.ts","riskScore":87,"fanIn":6,"fanOut":0,"complexityScore":109,"exportCount":3,"inCycle":false,"onCriticalPath":true},{"file":"src/validation/schemas.ts","riskScore":84,"fanIn":2,"fanOut":1,"complexityScore":37,"exportCount":39,"inCycle":false,"onCriticalPath":false},{"file":"src/utils/circuitBreaker.ts","riskScore":75,"fanIn":4,"fanOut":3,"complexityScore":70,"exportCount":11,"inCycle":false,"onCriticalPath":true},{"file":"src/routes/tools.ts","riskScore":58,"fanIn":1,"fanOut":8,"complexityScore":79,"exportCount":1,"inCycle":false,"onCriticalPath":true},{"file":"src/types/guards.ts","riskScore":55,"fanIn":6,"fanOut":0,"complexityScore":40,"exportCount":11,"inCycle":false,"onCriticalPath":false},{"file":"src/server.ts","riskScore":54,"fanIn":0,"fanOut":11,"complexityScore":71,"exportCount":2,"inCycle":false,"onCriticalPath":true},{"file":"src/routes/lsp.ts","riskScore":51,"fanIn":1,"fanOut":7,"complexityScore":65,"exportCount":1,"inCycle":false,"onCriticalPath":true},{"file":"src/utils/retry.ts","riskScore":50,"fanIn":2,"fanOut":1,"complexityScore":66,"exportCount":7,"inCycle":false,"onCriticalPath":false},{"file":"src/routes/github.ts","riskScore":45,"fanIn":1,"fanOut":7,"complexityScore":54,"exportCount":1,"inCycle":false,"onCriticalPath":true},{"file":"src/types/errorGuards.ts","riskScore":45,"fanIn":1,"fanOut":0,"complexityScore":47,"exportCount":12,"inCycle":false,"onCriticalPath":false},{"file":"src/utils/resilience.ts","riskScore":45,"fanIn":5,"fanOut":3,"complexityScore":21,"exportCount":5,"inCycle":false,"onCriticalPath":true},{"file":"src/utils/responseFactory.ts","riskScore":44,"fanIn":4,"fanOut":2,"complexityScore":38,"exportCount":8,"inCycle":false,"onCriticalPath":false},{"file":"src/routes/local.ts","riskScore":41,"fanIn":1,"fanOut":7,"complexityScore":46,"exportCount":1,"inCycle":false,"onCriticalPath":true},{"file":"src/utils/responseParser.ts","riskScore":41,"fanIn":3,"fanOut":0,"complexityScore":43,"exportCount":7,"inCycle":false,"onCriticalPath":false},{"file":"src/validation/httpPreprocess.ts","riskScore":40,"fanIn":3,"fanOut":0,"complexityScore":31,"exportCount":10,"inCycle":false,"onCriticalPath":false},{"file":"src/routes/package.ts","riskScore":39,"fanIn":1,"fanOut":8,"complexityScore":40,"exportCount":1,"inCycle":false,"onCriticalPath":true},{"file":"src/utils/colors.ts","riskScore":39,"fanIn":4,"fanOut":0,"complexityScore":16,"exportCount":6,"inCycle":false,"onCriticalPath":true},{"file":"src/index.ts","riskScore":38,"fanIn":9,"fanOut":1,"complexityScore":1,"exportCount":0,"inCycle":false,"onCriticalPath":true},{"file":"src/utils/asyncTimeout.ts","riskScore":38,"fanIn":7,"fanOut":1,"complexityScore":26,"exportCount":2,"inCycle":false,"onCriticalPath":false}],"graphSignals":[{"kind":"structural-chokepoint","lens":"graph","title":"Structural chokepoint","summary":"src/utils/responseBuilder.ts concentrates dependency pressure (articulation point, 1 bridge edge(s), on critical path, high complexity risk (109)).","confidence":"high","score":53,"files":["src/utils/responseBuilder.ts"],"categories":["broker-module","bridge-module"],"evidence":{"score":53,"reasons":["articulation point","1 bridge edge(s)","on critical path","high complexity risk (109)"]}}],"chokepoints":[{"file":"src/utils/responseBuilder.ts","score":53,"reasons":["articulation point","1 bridge edge(s)","on critical path","high complexity risk (109)"],"fanIn":6,"fanOut":0,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/circuitBreaker.ts","score":51,"reasons":["articulation point","2 bridge edge(s)","on critical path","high complexity risk (70)"],"fanIn":4,"fanOut":3,"articulation":true,"bridgeCount":2,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/logger.ts","score":50,"reasons":["articulation point","1 bridge edge(s)","on critical path","high complexity risk (112)"],"fanIn":4,"fanOut":2,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/routes/tools.ts","score":49,"reasons":["high fan-out (8)","articulation point","2 bridge edge(s)","on critical path","high complexity risk (79)"],"fanIn":1,"fanOut":8,"articulation":true,"bridgeCount":2,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/resilience.ts","score":45,"reasons":["articulation point","1 bridge edge(s)","on critical path","high complexity risk (21)"],"fanIn":5,"fanOut":3,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/retry.ts","score":38,"reasons":["articulation point","3 bridge edge(s)","high complexity risk (66)"],"fanIn":2,"fanOut":1,"articulation":true,"bridgeCount":3,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/index.ts","score":36,"reasons":["high fan-in (9)","on critical path"],"fanIn":9,"fanOut":1,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/server.ts","score":28,"reasons":["high fan-out (11)","on critical path","high complexity risk (71)"],"fanIn":0,"fanOut":11,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/validation/httpPreprocess.ts","score":28,"reasons":["articulation point","1 bridge edge(s)","high complexity risk (31)"],"fanIn":3,"fanOut":0,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/validation/toolCallSchema.ts","score":28,"reasons":["articulation point","2 bridge edge(s)"],"fanIn":2,"fanOut":0,"articulation":true,"bridgeCount":2,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/validation/index.ts","score":27,"reasons":["articulation point"],"fanIn":4,"fanOut":2,"articulation":true,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/validation/schemas.ts","score":27,"reasons":["articulation point","1 bridge edge(s)","high complexity risk (37)"],"fanIn":2,"fanOut":1,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/routes/lsp.ts","score":26,"reasons":["high fan-out (7)","on critical path","high complexity risk (65)"],"fanIn":1,"fanOut":7,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/routes/github.ts","score":25,"reasons":["high fan-out (7)","on critical path","high complexity risk (54)"],"fanIn":1,"fanOut":7,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/routes/package.ts","score":25,"reasons":["high fan-out (8)","on critical path","high complexity risk (40)"],"fanIn":1,"fanOut":8,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/asyncTimeout.ts","score":25,"reasons":["high complexity risk (26)"],"fanIn":7,"fanOut":1,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/routes/local.ts","score":24,"reasons":["high fan-out (7)","on critical path","high complexity risk (46)"],"fanIn":1,"fanOut":7,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/types/guards.ts","score":22,"reasons":["high complexity risk (40)"],"fanIn":6,"fanOut":0,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/utils/colors.ts","score":22,"reasons":["on critical path"],"fanIn":4,"fanOut":0,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/responseFactory.ts","score":18,"reasons":["high complexity risk (38)"],"fanIn":4,"fanOut":2,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/middleware/logger.ts","score":16,"reasons":["on critical path"],"fanIn":1,"fanOut":3,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/__tests__/integration/circuitBreaker.test.ts","score":13,"reasons":["1 bridge edge(s)","on critical path"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/__tests__/integration/routes.test.ts","score":13,"reasons":["on critical path"],"fanIn":0,"fanOut":4,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/__tests__/unit/circuitBreaker.test.ts","score":13,"reasons":["1 bridge edge(s)","on critical path"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/responseParser.ts","score":13,"reasons":["high complexity risk (43)"],"fanIn":3,"fanOut":0,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/types/errorGuards.ts","score":12,"reasons":["1 bridge edge(s)","high complexity risk (47)"],"fanIn":1,"fanOut":0,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/middleware/queryParser.ts","score":8,"reasons":["high complexity risk (24)"],"fanIn":2,"fanOut":0,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/types/responses.ts","score":8,"reasons":["high complexity risk (34)"],"fanIn":1,"fanOut":1,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/types/mcp.ts","score":7,"reasons":["1 bridge edge(s)"],"fanIn":1,"fanOut":0,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/__tests__/unit/httpPreprocess.test.ts","score":5,"reasons":["1 bridge edge(s)"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/__tests__/unit/logger.test.ts","score":5,"reasons":["1 bridge edge(s)"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/__tests__/unit/queryParser.test.ts","score":5,"reasons":["1 bridge edge(s)"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/__tests__/unit/responseBuilder.test.ts","score":5,"reasons":["1 bridge edge(s)"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/__tests__/unit/retry.test.ts","score":5,"reasons":["1 bridge edge(s)"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/__tests__/unit/schemas.test.ts","score":5,"reasons":["1 bridge edge(s)"],"fanIn":0,"fanOut":1,"articulation":false,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/server-init.ts","score":5,"reasons":["high complexity risk (48)"],"fanIn":0,"fanOut":0,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":false}],"criticalHubCandidates":[{"file":"src/utils/responseBuilder.ts","score":53,"reasons":["articulation point","1 bridge edge(s)","on critical path","high complexity risk (109)"],"fanIn":6,"fanOut":0,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/circuitBreaker.ts","score":51,"reasons":["articulation point","2 bridge edge(s)","on critical path","high complexity risk (70)"],"fanIn":4,"fanOut":3,"articulation":true,"bridgeCount":2,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/logger.ts","score":50,"reasons":["articulation point","1 bridge edge(s)","on critical path","high complexity risk (112)"],"fanIn":4,"fanOut":2,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/routes/tools.ts","score":49,"reasons":["high fan-out (8)","articulation point","2 bridge edge(s)","on critical path","high complexity risk (79)"],"fanIn":1,"fanOut":8,"articulation":true,"bridgeCount":2,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/resilience.ts","score":45,"reasons":["articulation point","1 bridge edge(s)","on critical path","high complexity risk (21)"],"fanIn":5,"fanOut":3,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/utils/retry.ts","score":38,"reasons":["articulation point","3 bridge edge(s)","high complexity risk (66)"],"fanIn":2,"fanOut":1,"articulation":true,"bridgeCount":3,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/index.ts","score":36,"reasons":["high fan-in (9)","on critical path"],"fanIn":9,"fanOut":1,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/server.ts","score":28,"reasons":["high fan-out (11)","on critical path","high complexity risk (71)"],"fanIn":0,"fanOut":11,"articulation":false,"bridgeCount":0,"cycleClusterCount":0,"onCriticalPath":true},{"file":"src/validation/httpPreprocess.ts","score":28,"reasons":["articulation point","1 bridge edge(s)","high complexity risk (31)"],"fanIn":3,"fanOut":0,"articulation":true,"bridgeCount":1,"cycleClusterCount":0,"onCriticalPath":false},{"file":"src/validation/toolCallSchema.ts","score":28,"reasons":["articulation point","2 bridge edge(s)"],"fanIn":2,"fanOut":0,"articulation":true,"bridgeCount":2,"cycleClusterCount":0,"onCriticalPath":false}],"sccClusters":[],"packageGraphSummary":null,"packageHotspots":[]}
|