octocode-cli 1.2.8 → 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 -11767
- 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
|
@@ -370,8 +370,7 @@ function f() {
|
|
|
370
370
|
const maps = emptyMaps();
|
|
371
371
|
const opts = {
|
|
372
372
|
...testOpts,
|
|
373
|
-
minFunctionStatements: 6,
|
|
374
|
-
minFlowStatements: 1,
|
|
373
|
+
thresholds: { ...testOpts.thresholds, minFunctionStatements: 6, minFlowStatements: 1 },
|
|
375
374
|
};
|
|
376
375
|
analyzeTreeSitterFile('/repo/src/big.ts', code, opts, 'test-pkg', maps);
|
|
377
376
|
expect(maps.flowMap.size).toBeGreaterThan(0);
|
|
@@ -403,5 +402,122 @@ function f() {
|
|
|
403
402
|
expect(result).not.toBeNull();
|
|
404
403
|
expect(result!.functions[0].source).toBe('tree-sitter');
|
|
405
404
|
});
|
|
405
|
+
|
|
406
|
+
it('computes cognitiveComplexity > 0 for nested control flow', () => {
|
|
407
|
+
const code = `function complexFn(x: number, y: boolean) {
|
|
408
|
+
if (x > 0) { // +1
|
|
409
|
+
if (y) { // +2 (1 + nesting=1)
|
|
410
|
+
for (let i = 0; i < x; i++) { // +3 (1 + nesting=2)
|
|
411
|
+
if (i % 2 === 0) { // +4 (1 + nesting=3)
|
|
412
|
+
console.log(i);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return x;
|
|
418
|
+
}`;
|
|
419
|
+
const result = analyzeTreeSitterFile(
|
|
420
|
+
'/repo/src/cognitive.ts',
|
|
421
|
+
code,
|
|
422
|
+
testOpts,
|
|
423
|
+
'test-pkg',
|
|
424
|
+
null
|
|
425
|
+
);
|
|
426
|
+
expect(result).not.toBeNull();
|
|
427
|
+
const fn = result!.functions[0];
|
|
428
|
+
expect(fn.cognitiveComplexity).toBeGreaterThanOrEqual(10);
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
it('computes cognitiveComplexity = 0 for simple linear function', () => {
|
|
432
|
+
const code = `function simple() {
|
|
433
|
+
const a = 1;
|
|
434
|
+
const b = 2;
|
|
435
|
+
return a + b;
|
|
436
|
+
}`;
|
|
437
|
+
const result = analyzeTreeSitterFile(
|
|
438
|
+
'/repo/src/simple.ts',
|
|
439
|
+
code,
|
|
440
|
+
testOpts,
|
|
441
|
+
'test-pkg',
|
|
442
|
+
null
|
|
443
|
+
);
|
|
444
|
+
expect(result).not.toBeNull();
|
|
445
|
+
expect(result!.functions[0].cognitiveComplexity).toBe(0);
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
it('handles else-if without double-counting nesting', () => {
|
|
449
|
+
const code = `function classify(x: number) {
|
|
450
|
+
if (x > 100) {
|
|
451
|
+
return 'high';
|
|
452
|
+
} else if (x > 50) {
|
|
453
|
+
return 'medium';
|
|
454
|
+
} else if (x > 0) {
|
|
455
|
+
return 'low';
|
|
456
|
+
} else {
|
|
457
|
+
return 'none';
|
|
458
|
+
}
|
|
459
|
+
}`;
|
|
460
|
+
const result = analyzeTreeSitterFile(
|
|
461
|
+
'/repo/src/elseif.ts',
|
|
462
|
+
code,
|
|
463
|
+
testOpts,
|
|
464
|
+
'test-pkg',
|
|
465
|
+
null
|
|
466
|
+
);
|
|
467
|
+
expect(result).not.toBeNull();
|
|
468
|
+
const fn = result!.functions[0];
|
|
469
|
+
expect(fn.cognitiveComplexity).toBeGreaterThan(0);
|
|
470
|
+
expect(fn.cognitiveComplexity).toBeLessThan(10);
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
it('increments for logical operators (&&, ||, ??)', () => {
|
|
474
|
+
const code = `function guard(a: any, b: any, c: any) {
|
|
475
|
+
if (a && b || c) {
|
|
476
|
+
return true;
|
|
477
|
+
}
|
|
478
|
+
return false;
|
|
479
|
+
}`;
|
|
480
|
+
const result = analyzeTreeSitterFile(
|
|
481
|
+
'/repo/src/logical.ts',
|
|
482
|
+
code,
|
|
483
|
+
testOpts,
|
|
484
|
+
'test-pkg',
|
|
485
|
+
null
|
|
486
|
+
);
|
|
487
|
+
expect(result).not.toBeNull();
|
|
488
|
+
const fn = result!.functions[0];
|
|
489
|
+
expect(fn.cognitiveComplexity).toBeGreaterThanOrEqual(3);
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
it('cognitiveComplexity reflects nesting depth penalty', () => {
|
|
493
|
+
const shallow = `function shallow(x: boolean) { if (x) { return 1; } return 0; }`;
|
|
494
|
+
const deep = `function deep(x: boolean, y: boolean) {
|
|
495
|
+
if (x) {
|
|
496
|
+
if (y) {
|
|
497
|
+
return 1;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return 0;
|
|
501
|
+
}`;
|
|
502
|
+
const shallowResult = analyzeTreeSitterFile(
|
|
503
|
+
'/repo/src/shallow.ts',
|
|
504
|
+
shallow,
|
|
505
|
+
testOpts,
|
|
506
|
+
'test-pkg',
|
|
507
|
+
null
|
|
508
|
+
);
|
|
509
|
+
const deepResult = analyzeTreeSitterFile(
|
|
510
|
+
'/repo/src/deep.ts',
|
|
511
|
+
deep,
|
|
512
|
+
testOpts,
|
|
513
|
+
'test-pkg',
|
|
514
|
+
null
|
|
515
|
+
);
|
|
516
|
+
expect(shallowResult).not.toBeNull();
|
|
517
|
+
expect(deepResult).not.toBeNull();
|
|
518
|
+
expect(deepResult!.functions[0].cognitiveComplexity).toBeGreaterThan(
|
|
519
|
+
shallowResult!.functions[0].cognitiveComplexity
|
|
520
|
+
);
|
|
521
|
+
});
|
|
406
522
|
}
|
|
407
523
|
);
|
|
@@ -127,6 +127,68 @@ function collectTreeSitterMetrics(
|
|
|
127
127
|
return metrics;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
+
const COGNITIVE_NESTING_TYPES = new Set([
|
|
131
|
+
'if_statement',
|
|
132
|
+
'for_statement',
|
|
133
|
+
'for_in_statement',
|
|
134
|
+
'for_of_statement',
|
|
135
|
+
'for_await_statement',
|
|
136
|
+
'while_statement',
|
|
137
|
+
'do_statement',
|
|
138
|
+
'catch_clause',
|
|
139
|
+
'conditional_expression',
|
|
140
|
+
'switch_statement',
|
|
141
|
+
]);
|
|
142
|
+
|
|
143
|
+
const COGNITIVE_LOGICAL_TYPES = new Set(['&&', '||', '??']);
|
|
144
|
+
|
|
145
|
+
function computeTreeSitterCognitiveComplexity(node: SyntaxNode): number {
|
|
146
|
+
let total = 0;
|
|
147
|
+
|
|
148
|
+
const visit = (current: SyntaxNode, nesting: number): void => {
|
|
149
|
+
let increment = 0;
|
|
150
|
+
let nestable = false;
|
|
151
|
+
|
|
152
|
+
if (COGNITIVE_NESTING_TYPES.has(current.type)) {
|
|
153
|
+
increment = 1;
|
|
154
|
+
nestable = true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (current.type === 'binary_expression') {
|
|
158
|
+
for (const child of current.children) {
|
|
159
|
+
if (!child.isNamed && COGNITIVE_LOGICAL_TYPES.has(child.type)) {
|
|
160
|
+
increment = 1;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (
|
|
167
|
+
current.type === 'if_statement' &&
|
|
168
|
+
current.parent?.type === 'else_clause'
|
|
169
|
+
) {
|
|
170
|
+
increment = 1;
|
|
171
|
+
nestable = false;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (nestable) {
|
|
175
|
+
total += increment + nesting;
|
|
176
|
+
for (const child of current.children) {
|
|
177
|
+
visit(child, nesting + 1);
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
total += increment;
|
|
183
|
+
for (const child of current.children) {
|
|
184
|
+
visit(child, nesting);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
visit(node, 0);
|
|
189
|
+
return total;
|
|
190
|
+
}
|
|
191
|
+
|
|
130
192
|
function inferTreeSitterFunctionName(node: SyntaxNode, _text: string): string {
|
|
131
193
|
const identifier = node.namedChildren.find(child =>
|
|
132
194
|
['identifier', 'property_identifier', 'type_identifier'].includes(
|
|
@@ -290,13 +352,13 @@ export function analyzeTreeSitterFile(
|
|
|
290
352
|
awaits: metrics.awaits,
|
|
291
353
|
calls: metrics.calls,
|
|
292
354
|
loops: metrics.loops,
|
|
293
|
-
cognitiveComplexity:
|
|
355
|
+
cognitiveComplexity: computeTreeSitterCognitiveComplexity(node),
|
|
294
356
|
source: 'tree-sitter',
|
|
295
357
|
};
|
|
296
358
|
|
|
297
359
|
fileEntry.functions.push(entry);
|
|
298
360
|
|
|
299
|
-
if (maps && statementCount >= options.minFunctionStatements) {
|
|
361
|
+
if (maps && statementCount >= options.thresholds.minFunctionStatements) {
|
|
300
362
|
const body = node.namedChildren.find(
|
|
301
363
|
child => child.type === 'statement_block'
|
|
302
364
|
);
|
|
@@ -325,7 +387,7 @@ export function analyzeTreeSitterFile(
|
|
|
325
387
|
};
|
|
326
388
|
fileEntry.flows.push(flowEntry);
|
|
327
389
|
|
|
328
|
-
if (maps && statementCount >= options.minFlowStatements) {
|
|
390
|
+
if (maps && statementCount >= options.thresholds.minFlowStatements) {
|
|
329
391
|
const flowHash = makeTreeSitterFingerprint(node);
|
|
330
392
|
increment(maps.controlMap, `${flowHash}|${node.type}`, {
|
|
331
393
|
...flowEntry,
|
|
@@ -400,7 +400,7 @@ describe('analyzeSourceFile', () => {
|
|
|
400
400
|
src,
|
|
401
401
|
'pkg',
|
|
402
402
|
summary,
|
|
403
|
-
{ ...testOpts, minFunctionStatements: 6 },
|
|
403
|
+
{ ...testOpts, thresholds: { ...testOpts.thresholds, minFunctionStatements: 6 } },
|
|
404
404
|
maps,
|
|
405
405
|
[],
|
|
406
406
|
emptyProfile
|
|
@@ -1862,3 +1862,283 @@ describe('collectTestProfile (via analyzeSourceFile)', () => {
|
|
|
1862
1862
|
);
|
|
1863
1863
|
});
|
|
1864
1864
|
});
|
|
1865
|
+
|
|
1866
|
+
describe('collectSmartQualityData', () => {
|
|
1867
|
+
it('collects magic strings from === comparisons', () => {
|
|
1868
|
+
const code = `
|
|
1869
|
+
function check(status: string) {
|
|
1870
|
+
if (status === 'active') { return 1; }
|
|
1871
|
+
if (status === 'active') { return 2; }
|
|
1872
|
+
if (status === 'inactive') { return 0; }
|
|
1873
|
+
}`;
|
|
1874
|
+
const src = parse(code);
|
|
1875
|
+
const result = analyzeSourceFile(
|
|
1876
|
+
src,
|
|
1877
|
+
'pkg',
|
|
1878
|
+
emptyPackageSummary(),
|
|
1879
|
+
testOpts,
|
|
1880
|
+
emptyMaps(),
|
|
1881
|
+
[],
|
|
1882
|
+
emptyProfile
|
|
1883
|
+
);
|
|
1884
|
+
expect(result.magicStrings).toBeDefined();
|
|
1885
|
+
expect(result.magicStrings!.length).toBeGreaterThanOrEqual(2);
|
|
1886
|
+
expect(result.magicStrings!.some(ms => ms.value === 'active')).toBe(true);
|
|
1887
|
+
});
|
|
1888
|
+
|
|
1889
|
+
it('collects magic strings from switch/case clauses', () => {
|
|
1890
|
+
const code = `
|
|
1891
|
+
function handle(action: string) {
|
|
1892
|
+
switch (action) {
|
|
1893
|
+
case 'create': return 1;
|
|
1894
|
+
case 'update': return 2;
|
|
1895
|
+
case 'create': return 3;
|
|
1896
|
+
}
|
|
1897
|
+
}`;
|
|
1898
|
+
const src = parse(code);
|
|
1899
|
+
const result = analyzeSourceFile(
|
|
1900
|
+
src,
|
|
1901
|
+
'pkg',
|
|
1902
|
+
emptyPackageSummary(),
|
|
1903
|
+
testOpts,
|
|
1904
|
+
emptyMaps(),
|
|
1905
|
+
[],
|
|
1906
|
+
emptyProfile
|
|
1907
|
+
);
|
|
1908
|
+
expect(result.magicStrings).toBeDefined();
|
|
1909
|
+
expect(result.magicStrings!.some(ms => ms.value === 'create')).toBe(true);
|
|
1910
|
+
});
|
|
1911
|
+
|
|
1912
|
+
it('does not collect magic strings from test files', () => {
|
|
1913
|
+
const code = `
|
|
1914
|
+
function check(s: string) {
|
|
1915
|
+
if (s === 'test') return 1;
|
|
1916
|
+
if (s === 'test') return 2;
|
|
1917
|
+
}`;
|
|
1918
|
+
const src = ts.createSourceFile(
|
|
1919
|
+
'/repo/src/__tests__/check.test.ts',
|
|
1920
|
+
code,
|
|
1921
|
+
ts.ScriptTarget.ESNext,
|
|
1922
|
+
true
|
|
1923
|
+
);
|
|
1924
|
+
const result = analyzeSourceFile(
|
|
1925
|
+
src,
|
|
1926
|
+
'pkg',
|
|
1927
|
+
emptyPackageSummary(),
|
|
1928
|
+
testOpts,
|
|
1929
|
+
emptyMaps(),
|
|
1930
|
+
[],
|
|
1931
|
+
emptyProfile
|
|
1932
|
+
);
|
|
1933
|
+
expect(result.magicStrings).toBeUndefined();
|
|
1934
|
+
});
|
|
1935
|
+
|
|
1936
|
+
it('collects catch-rethrow patterns', () => {
|
|
1937
|
+
const code = `
|
|
1938
|
+
function risky() {
|
|
1939
|
+
try {
|
|
1940
|
+
doStuff();
|
|
1941
|
+
} catch (e) {
|
|
1942
|
+
throw e;
|
|
1943
|
+
}
|
|
1944
|
+
}`;
|
|
1945
|
+
const src = parse(code);
|
|
1946
|
+
const result = analyzeSourceFile(
|
|
1947
|
+
src,
|
|
1948
|
+
'pkg',
|
|
1949
|
+
emptyPackageSummary(),
|
|
1950
|
+
testOpts,
|
|
1951
|
+
emptyMaps(),
|
|
1952
|
+
[],
|
|
1953
|
+
emptyProfile
|
|
1954
|
+
);
|
|
1955
|
+
expect(result.catchRethrows).toBeDefined();
|
|
1956
|
+
expect(result.catchRethrows!.length).toBe(1);
|
|
1957
|
+
});
|
|
1958
|
+
|
|
1959
|
+
it('does not flag catch blocks that transform errors', () => {
|
|
1960
|
+
const code = `
|
|
1961
|
+
function safe() {
|
|
1962
|
+
try { doStuff(); } catch (e) { console.error(e); throw new Error('wrapped'); }
|
|
1963
|
+
}`;
|
|
1964
|
+
const src = parse(code);
|
|
1965
|
+
const result = analyzeSourceFile(
|
|
1966
|
+
src,
|
|
1967
|
+
'pkg',
|
|
1968
|
+
emptyPackageSummary(),
|
|
1969
|
+
testOpts,
|
|
1970
|
+
emptyMaps(),
|
|
1971
|
+
[],
|
|
1972
|
+
emptyProfile
|
|
1973
|
+
);
|
|
1974
|
+
expect(result.catchRethrows).toBeUndefined();
|
|
1975
|
+
});
|
|
1976
|
+
|
|
1977
|
+
it('does not flag catch blocks with multiple statements', () => {
|
|
1978
|
+
const code = `
|
|
1979
|
+
function logged() {
|
|
1980
|
+
try { doStuff(); } catch (e) { console.error(e); throw e; }
|
|
1981
|
+
}`;
|
|
1982
|
+
const src = parse(code);
|
|
1983
|
+
const result = analyzeSourceFile(
|
|
1984
|
+
src,
|
|
1985
|
+
'pkg',
|
|
1986
|
+
emptyPackageSummary(),
|
|
1987
|
+
testOpts,
|
|
1988
|
+
emptyMaps(),
|
|
1989
|
+
[],
|
|
1990
|
+
emptyProfile
|
|
1991
|
+
);
|
|
1992
|
+
expect(result.catchRethrows).toBeUndefined();
|
|
1993
|
+
});
|
|
1994
|
+
|
|
1995
|
+
it('collects boolean parameter clusters', () => {
|
|
1996
|
+
const code = `
|
|
1997
|
+
function configure(verbose: boolean, debug: boolean, strict: boolean) {
|
|
1998
|
+
return { verbose, debug, strict };
|
|
1999
|
+
}`;
|
|
2000
|
+
const src = parse(code);
|
|
2001
|
+
const result = analyzeSourceFile(
|
|
2002
|
+
src,
|
|
2003
|
+
'pkg',
|
|
2004
|
+
emptyPackageSummary(),
|
|
2005
|
+
testOpts,
|
|
2006
|
+
emptyMaps(),
|
|
2007
|
+
[],
|
|
2008
|
+
emptyProfile
|
|
2009
|
+
);
|
|
2010
|
+
expect(result.booleanParamClusters).toBeDefined();
|
|
2011
|
+
expect(result.booleanParamClusters!.length).toBe(1);
|
|
2012
|
+
expect(result.booleanParamClusters![0].booleanCount).toBe(3);
|
|
2013
|
+
expect(result.booleanParamClusters![0].totalParams).toBe(3);
|
|
2014
|
+
});
|
|
2015
|
+
|
|
2016
|
+
it('does not flag functions with fewer than 3 boolean params', () => {
|
|
2017
|
+
const code = `function toggle(a: boolean, b: boolean) { return a && b; }`;
|
|
2018
|
+
const src = parse(code);
|
|
2019
|
+
const result = analyzeSourceFile(
|
|
2020
|
+
src,
|
|
2021
|
+
'pkg',
|
|
2022
|
+
emptyPackageSummary(),
|
|
2023
|
+
testOpts,
|
|
2024
|
+
emptyMaps(),
|
|
2025
|
+
[],
|
|
2026
|
+
emptyProfile
|
|
2027
|
+
);
|
|
2028
|
+
expect(result.booleanParamClusters).toBeUndefined();
|
|
2029
|
+
});
|
|
2030
|
+
|
|
2031
|
+
it('collects unhandled Promise.all calls', () => {
|
|
2032
|
+
const code = `
|
|
2033
|
+
async function loadAll() {
|
|
2034
|
+
const results = await Promise.all([fetch('/a'), fetch('/b')]);
|
|
2035
|
+
return results;
|
|
2036
|
+
}`;
|
|
2037
|
+
const src = parse(code);
|
|
2038
|
+
const result = analyzeSourceFile(
|
|
2039
|
+
src,
|
|
2040
|
+
'pkg',
|
|
2041
|
+
emptyPackageSummary(),
|
|
2042
|
+
testOpts,
|
|
2043
|
+
emptyMaps(),
|
|
2044
|
+
[],
|
|
2045
|
+
emptyProfile
|
|
2046
|
+
);
|
|
2047
|
+
expect(result.promiseAllUnhandled).toBeDefined();
|
|
2048
|
+
expect(result.promiseAllUnhandled!.length).toBe(1);
|
|
2049
|
+
expect(result.promiseAllUnhandled![0].kind).toBe('Promise.all');
|
|
2050
|
+
});
|
|
2051
|
+
|
|
2052
|
+
it('does not flag Promise.all inside try-catch', () => {
|
|
2053
|
+
const code = `
|
|
2054
|
+
async function safeFetch() {
|
|
2055
|
+
try {
|
|
2056
|
+
const results = await Promise.all([fetch('/a')]);
|
|
2057
|
+
return results;
|
|
2058
|
+
} catch (e) {
|
|
2059
|
+
return [];
|
|
2060
|
+
}
|
|
2061
|
+
}`;
|
|
2062
|
+
const src = parse(code);
|
|
2063
|
+
const result = analyzeSourceFile(
|
|
2064
|
+
src,
|
|
2065
|
+
'pkg',
|
|
2066
|
+
emptyPackageSummary(),
|
|
2067
|
+
testOpts,
|
|
2068
|
+
emptyMaps(),
|
|
2069
|
+
[],
|
|
2070
|
+
emptyProfile
|
|
2071
|
+
);
|
|
2072
|
+
expect(result.promiseAllUnhandled).toBeUndefined();
|
|
2073
|
+
});
|
|
2074
|
+
|
|
2075
|
+
it('does not flag Promise.all with .catch() chain', () => {
|
|
2076
|
+
const code = `
|
|
2077
|
+
async function safeFetch() {
|
|
2078
|
+
const results = await Promise.all([fetch('/a')]).catch(() => []);
|
|
2079
|
+
return results;
|
|
2080
|
+
}`;
|
|
2081
|
+
const src = parse(code);
|
|
2082
|
+
const result = analyzeSourceFile(
|
|
2083
|
+
src,
|
|
2084
|
+
'pkg',
|
|
2085
|
+
emptyPackageSummary(),
|
|
2086
|
+
testOpts,
|
|
2087
|
+
emptyMaps(),
|
|
2088
|
+
[],
|
|
2089
|
+
emptyProfile
|
|
2090
|
+
);
|
|
2091
|
+
expect(result.promiseAllUnhandled).toBeUndefined();
|
|
2092
|
+
});
|
|
2093
|
+
|
|
2094
|
+
it('detects Promise.race and Promise.any', () => {
|
|
2095
|
+
const code = `
|
|
2096
|
+
async function raceAndAny() {
|
|
2097
|
+
const first = await Promise.race([fetch('/a'), fetch('/b')]);
|
|
2098
|
+
const any = await Promise.any([fetch('/c'), fetch('/d')]);
|
|
2099
|
+
}`;
|
|
2100
|
+
const src = parse(code);
|
|
2101
|
+
const result = analyzeSourceFile(
|
|
2102
|
+
src,
|
|
2103
|
+
'pkg',
|
|
2104
|
+
emptyPackageSummary(),
|
|
2105
|
+
testOpts,
|
|
2106
|
+
emptyMaps(),
|
|
2107
|
+
[],
|
|
2108
|
+
emptyProfile
|
|
2109
|
+
);
|
|
2110
|
+
expect(result.promiseAllUnhandled).toBeDefined();
|
|
2111
|
+
expect(result.promiseAllUnhandled!.length).toBe(2);
|
|
2112
|
+
const kinds = result.promiseAllUnhandled!.map(p => p.kind);
|
|
2113
|
+
expect(kinds).toContain('Promise.race');
|
|
2114
|
+
expect(kinds).toContain('Promise.any');
|
|
2115
|
+
});
|
|
2116
|
+
|
|
2117
|
+
it('does not collect smart quality data from test files', () => {
|
|
2118
|
+
const code = `
|
|
2119
|
+
function check(s: string) {
|
|
2120
|
+
if (s === 'test') return 1;
|
|
2121
|
+
if (s === 'test') return 2;
|
|
2122
|
+
try { x(); } catch (e) { throw e; }
|
|
2123
|
+
}`;
|
|
2124
|
+
const src = ts.createSourceFile(
|
|
2125
|
+
'/repo/src/__tests__/check.test.ts',
|
|
2126
|
+
code,
|
|
2127
|
+
ts.ScriptTarget.ESNext,
|
|
2128
|
+
true
|
|
2129
|
+
);
|
|
2130
|
+
const result = analyzeSourceFile(
|
|
2131
|
+
src,
|
|
2132
|
+
'pkg',
|
|
2133
|
+
emptyPackageSummary(),
|
|
2134
|
+
testOpts,
|
|
2135
|
+
emptyMaps(),
|
|
2136
|
+
[],
|
|
2137
|
+
emptyProfile
|
|
2138
|
+
);
|
|
2139
|
+
expect(result.magicStrings).toBeUndefined();
|
|
2140
|
+
expect(result.catchRethrows).toBeUndefined();
|
|
2141
|
+
expect(result.booleanParamClusters).toBeUndefined();
|
|
2142
|
+
expect(result.promiseAllUnhandled).toBeUndefined();
|
|
2143
|
+
});
|
|
2144
|
+
});
|