octocode-cli 1.2.6 → 1.2.7
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/LICENSE +21 -63
- package/README.md +85 -142
- package/out/octocode-cli.js +7026 -6945
- package/package.json +8 -6
- package/skills/README.md +97 -120
- package/skills/octocode-code-engineer/.claude/settings.local.json +18 -0
- package/skills/octocode-code-engineer/.octocode/rfc/RFC-code-engineer-weakness-fixes.md +255 -0
- package/skills/octocode-code-engineer/.plan/VALIDATED_PLAN.md +223 -0
- package/skills/octocode-code-engineer/README.md +178 -0
- package/skills/octocode-code-engineer/SKILL.md +418 -0
- package/skills/octocode-code-engineer/coverage/architecture.ts.html +7828 -0
- package/skills/octocode-code-engineer/coverage/ast-helpers.ts.html +211 -0
- package/skills/octocode-code-engineer/coverage/ast-search.ts.html +1795 -0
- package/skills/octocode-code-engineer/coverage/base.css +224 -0
- package/skills/octocode-code-engineer/coverage/block-navigation.js +87 -0
- package/skills/octocode-code-engineer/coverage/cache.ts.html +376 -0
- package/skills/octocode-code-engineer/coverage/cli.ts.html +982 -0
- package/skills/octocode-code-engineer/coverage/clover.xml +3217 -0
- package/skills/octocode-code-engineer/coverage/collect-effects.ts.html +664 -0
- package/skills/octocode-code-engineer/coverage/collect-input-sources.ts.html +577 -0
- package/skills/octocode-code-engineer/coverage/collect-performance.ts.html +331 -0
- package/skills/octocode-code-engineer/coverage/collect-prototype-pollution.ts.html +421 -0
- package/skills/octocode-code-engineer/coverage/collect-security.ts.html +604 -0
- package/skills/octocode-code-engineer/coverage/collect-test-profile.ts.html +589 -0
- package/skills/octocode-code-engineer/coverage/coverage-final.json +30 -0
- package/skills/octocode-code-engineer/coverage/dependencies.ts.html +997 -0
- package/skills/octocode-code-engineer/coverage/dependency-summary.ts.html +688 -0
- package/skills/octocode-code-engineer/coverage/discovery.ts.html +322 -0
- package/skills/octocode-code-engineer/coverage/favicon.png +0 -0
- package/skills/octocode-code-engineer/coverage/graph-analytics.ts.html +1510 -0
- package/skills/octocode-code-engineer/coverage/index.html +536 -0
- package/skills/octocode-code-engineer/coverage/index.ts.html +826 -0
- package/skills/octocode-code-engineer/coverage/metrics.ts.html +553 -0
- package/skills/octocode-code-engineer/coverage/pipeline.ts.html +2044 -0
- package/skills/octocode-code-engineer/coverage/prettify.css +1 -0
- package/skills/octocode-code-engineer/coverage/prettify.js +2 -0
- package/skills/octocode-code-engineer/coverage/report-analysis.ts.html +1570 -0
- package/skills/octocode-code-engineer/coverage/report-writer.ts.html +1102 -0
- package/skills/octocode-code-engineer/coverage/security-detectors.ts.html +1747 -0
- package/skills/octocode-code-engineer/coverage/semantic-detectors.ts.html +2152 -0
- package/skills/octocode-code-engineer/coverage/semantic.ts.html +1897 -0
- package/skills/octocode-code-engineer/coverage/sort-arrow-sprite.png +0 -0
- package/skills/octocode-code-engineer/coverage/sorter.js +210 -0
- package/skills/octocode-code-engineer/coverage/summary-md.ts.html +1222 -0
- package/skills/octocode-code-engineer/coverage/test-quality-detectors.ts.html +1039 -0
- package/skills/octocode-code-engineer/coverage/tree-sitter-analyzer.ts.html +955 -0
- package/skills/octocode-code-engineer/coverage/ts-analyzer.ts.html +1213 -0
- package/skills/octocode-code-engineer/coverage/types.ts.html +2473 -0
- package/skills/octocode-code-engineer/coverage/utils.ts.html +820 -0
- package/skills/octocode-code-engineer/eslint.config.mjs +54 -0
- package/skills/octocode-code-engineer/minify-scripts.mjs +32 -0
- package/skills/octocode-code-engineer/package.json +54 -0
- package/skills/octocode-code-engineer/references/agent-ast-reading-rfc.md +95 -0
- package/skills/octocode-code-engineer/references/architecture-techniques.md +121 -0
- package/skills/octocode-code-engineer/references/ast-search.md +210 -0
- package/skills/octocode-code-engineer/references/ast-tree-search.md +151 -0
- package/skills/octocode-code-engineer/references/cli-reference.md +167 -0
- package/skills/octocode-code-engineer/references/concepts.md +107 -0
- package/skills/octocode-code-engineer/references/finding-categories.md +128 -0
- package/skills/octocode-code-engineer/references/improvement-roadmap.md +304 -0
- package/skills/octocode-code-engineer/references/output-files.md +144 -0
- package/skills/octocode-code-engineer/references/playbooks.md +204 -0
- package/skills/octocode-code-engineer/references/present-results.md +136 -0
- package/skills/octocode-code-engineer/references/tool-workflows.md +566 -0
- package/skills/octocode-code-engineer/references/validate-investigate.md +225 -0
- package/skills/octocode-code-engineer/scripts/analysis/dependencies.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/dependency-summary.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/discovery.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/graph-analytics.js +1 -0
- package/skills/octocode-code-engineer/scripts/analysis/semantic.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/helpers.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/metrics.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/search.js +2 -0
- package/skills/octocode-code-engineer/scripts/ast/tree-search.js +2 -0
- package/skills/octocode-code-engineer/scripts/ast/tree-sitter.js +1 -0
- package/skills/octocode-code-engineer/scripts/ast/ts-analyzer.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/chains.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/effects.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/input-sources.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/performance.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/prototype-pollution.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/security.js +1 -0
- package/skills/octocode-code-engineer/scripts/collectors/test-profile.js +1 -0
- package/skills/octocode-code-engineer/scripts/common/is-direct-run.js +1 -0
- package/skills/octocode-code-engineer/scripts/common/utils.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/code-quality.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/cohesion.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/coupling.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/cycle.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/dead-code.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/import-style.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/security.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/semantic.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/shared.js +1 -0
- package/skills/octocode-code-engineer/scripts/detectors/test-quality.js +1 -0
- package/skills/octocode-code-engineer/scripts/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/cache.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/cli.js +1 -0
- package/skills/octocode-code-engineer/scripts/pipeline/main.js +2 -0
- package/skills/octocode-code-engineer/scripts/reporting/analysis.js +1 -0
- package/skills/octocode-code-engineer/scripts/reporting/summary-md.js +1 -0
- package/skills/octocode-code-engineer/scripts/reporting/writer.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/constants.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/index.js +1 -0
- package/skills/octocode-code-engineer/scripts/types/interfaces.js +1 -0
- package/skills/octocode-code-engineer/src/analysis/dependencies.test.ts +545 -0
- package/skills/octocode-code-engineer/src/analysis/dependencies.ts +406 -0
- package/skills/octocode-code-engineer/src/analysis/dependency-summary.test.ts +566 -0
- package/skills/octocode-code-engineer/src/analysis/dependency-summary.ts +257 -0
- package/skills/octocode-code-engineer/src/analysis/discovery.test.ts +420 -0
- package/skills/octocode-code-engineer/src/analysis/discovery.ts +87 -0
- package/skills/octocode-code-engineer/src/analysis/graph-analytics.test.ts +449 -0
- package/skills/octocode-code-engineer/src/analysis/graph-analytics.ts +534 -0
- package/skills/octocode-code-engineer/src/analysis/semantic.test.ts +1533 -0
- package/skills/octocode-code-engineer/src/analysis/semantic.ts +830 -0
- package/skills/octocode-code-engineer/src/ast/helpers.test.ts +185 -0
- package/skills/octocode-code-engineer/src/ast/helpers.ts +62 -0
- package/skills/octocode-code-engineer/src/ast/metrics.test.ts +304 -0
- package/skills/octocode-code-engineer/src/ast/metrics.ts +204 -0
- package/skills/octocode-code-engineer/src/ast/search.test.ts +647 -0
- package/skills/octocode-code-engineer/src/ast/search.ts +648 -0
- package/skills/octocode-code-engineer/src/ast/tree-search.test.ts +199 -0
- package/skills/octocode-code-engineer/src/ast/tree-search.ts +392 -0
- package/skills/octocode-code-engineer/src/ast/tree-sitter.test.ts +407 -0
- package/skills/octocode-code-engineer/src/ast/tree-sitter.ts +402 -0
- package/skills/octocode-code-engineer/src/ast/ts-analyzer.test.ts +1864 -0
- package/skills/octocode-code-engineer/src/ast/ts-analyzer.ts +509 -0
- package/skills/octocode-code-engineer/src/collectors/chains.ts +74 -0
- package/skills/octocode-code-engineer/src/collectors/effects.test.ts +490 -0
- package/skills/octocode-code-engineer/src/collectors/effects.ts +332 -0
- package/skills/octocode-code-engineer/src/collectors/input-sources.test.ts +144 -0
- package/skills/octocode-code-engineer/src/collectors/input-sources.ts +196 -0
- package/skills/octocode-code-engineer/src/collectors/performance.test.ts +82 -0
- package/skills/octocode-code-engineer/src/collectors/performance.ts +141 -0
- package/skills/octocode-code-engineer/src/collectors/prototype-pollution.test.ts +55 -0
- package/skills/octocode-code-engineer/src/collectors/prototype-pollution.ts +162 -0
- package/skills/octocode-code-engineer/src/collectors/security.test.ts +124 -0
- package/skills/octocode-code-engineer/src/collectors/security.ts +309 -0
- package/skills/octocode-code-engineer/src/collectors/test-profile.test.ts +97 -0
- package/skills/octocode-code-engineer/src/collectors/test-profile.ts +269 -0
- package/skills/octocode-code-engineer/src/common/is-direct-run.test.ts +32 -0
- package/skills/octocode-code-engineer/src/common/is-direct-run.ts +13 -0
- package/skills/octocode-code-engineer/src/common/utils.test.ts +463 -0
- package/skills/octocode-code-engineer/src/common/utils.ts +304 -0
- package/skills/octocode-code-engineer/src/detectors/code-quality.ts +966 -0
- package/skills/octocode-code-engineer/src/detectors/cohesion.ts +539 -0
- package/skills/octocode-code-engineer/src/detectors/coupling.ts +323 -0
- package/skills/octocode-code-engineer/src/detectors/cycle.ts +349 -0
- package/skills/octocode-code-engineer/src/detectors/dead-code.ts +320 -0
- package/skills/octocode-code-engineer/src/detectors/import-style.ts +376 -0
- package/skills/octocode-code-engineer/src/detectors/index.test.ts +3061 -0
- package/skills/octocode-code-engineer/src/detectors/index.ts +88 -0
- package/skills/octocode-code-engineer/src/detectors/security.test.ts +882 -0
- package/skills/octocode-code-engineer/src/detectors/security.ts +821 -0
- package/skills/octocode-code-engineer/src/detectors/semantic.ts +758 -0
- package/skills/octocode-code-engineer/src/detectors/shared.ts +49 -0
- package/skills/octocode-code-engineer/src/detectors/test-quality.test.ts +388 -0
- package/skills/octocode-code-engineer/src/detectors/test-quality.ts +367 -0
- package/skills/octocode-code-engineer/src/index.test.ts +4425 -0
- package/skills/octocode-code-engineer/src/index.ts +403 -0
- package/skills/octocode-code-engineer/src/pipeline/cache.test.ts +199 -0
- package/skills/octocode-code-engineer/src/pipeline/cache.ts +130 -0
- package/skills/octocode-code-engineer/src/pipeline/cli.test.ts +493 -0
- package/skills/octocode-code-engineer/src/pipeline/cli.ts +344 -0
- package/skills/octocode-code-engineer/src/pipeline/main.test.ts +174 -0
- package/skills/octocode-code-engineer/src/pipeline/main.ts +1074 -0
- package/skills/octocode-code-engineer/src/pipeline.test.ts +84 -0
- package/skills/octocode-code-engineer/src/reporting/analysis.test.ts +782 -0
- package/skills/octocode-code-engineer/src/reporting/analysis.ts +688 -0
- package/skills/octocode-code-engineer/src/reporting/output-contract.test.ts +463 -0
- package/skills/octocode-code-engineer/src/reporting/summary-md.test.ts +421 -0
- package/skills/octocode-code-engineer/src/reporting/summary-md.ts +714 -0
- package/skills/octocode-code-engineer/src/reporting/writer.ts +430 -0
- package/skills/octocode-code-engineer/src/sanity.test.ts +47 -0
- package/skills/octocode-code-engineer/src/types/constants.ts +248 -0
- package/skills/octocode-code-engineer/src/types/index.ts +80 -0
- package/skills/octocode-code-engineer/src/types/interfaces.ts +682 -0
- package/skills/octocode-code-engineer/tsconfig.json +17 -0
- package/skills/octocode-code-engineer/vitest.config.ts +8 -0
- package/skills/octocode-documentation-writer/README.md +113 -0
- package/skills/octocode-documentation-writer/SKILL.md +886 -0
- package/skills/octocode-documentation-writer/references/agent-discovery-analysis.md +453 -0
- package/skills/octocode-documentation-writer/references/agent-documentation-writer.md +255 -0
- package/skills/octocode-documentation-writer/references/agent-engineer-questions.md +247 -0
- package/skills/octocode-documentation-writer/references/agent-orchestrator.md +370 -0
- package/skills/octocode-documentation-writer/references/agent-qa-validator.md +227 -0
- package/skills/octocode-documentation-writer/references/agent-researcher.md +250 -0
- package/skills/octocode-documentation-writer/schemas/analysis-schema.json +886 -0
- package/skills/octocode-documentation-writer/schemas/discovery-tasks.json +96 -0
- package/skills/octocode-documentation-writer/schemas/documentation-structure.json +373 -0
- package/skills/octocode-documentation-writer/schemas/partial-discovery-schema.json +102 -0
- package/skills/octocode-documentation-writer/schemas/partial-research-schema.json +98 -0
- package/skills/octocode-documentation-writer/schemas/qa-results-schema.json +113 -0
- package/skills/octocode-documentation-writer/schemas/questions-schema.json +228 -0
- package/skills/octocode-documentation-writer/schemas/research-schema.json +104 -0
- package/skills/octocode-documentation-writer/schemas/state-schema.json +222 -0
- package/skills/octocode-documentation-writer/schemas/work-assignments-schema.json +74 -0
- package/skills/octocode-plan/SKILL.md +122 -116
- package/skills/octocode-prompt-optimizer/SKILL.md +617 -0
- package/skills/octocode-pull-request-reviewer/README.md +249 -0
- package/skills/octocode-pull-request-reviewer/SKILL.md +479 -0
- package/skills/octocode-pull-request-reviewer/references/dependency-check.md +74 -0
- package/skills/octocode-pull-request-reviewer/references/domain-reviewers.md +24 -0
- package/skills/octocode-pull-request-reviewer/references/execution-lifecycle.md +441 -0
- package/skills/octocode-pull-request-reviewer/references/flow-analysis-protocol.md +64 -0
- package/skills/octocode-pull-request-reviewer/references/output-template.md +174 -0
- package/skills/octocode-pull-request-reviewer/references/parallel-agent-protocol.md +182 -0
- package/skills/octocode-pull-request-reviewer/references/review-guidelines.md +26 -0
- package/skills/octocode-pull-request-reviewer/references/verification-checklist.md +40 -0
- package/skills/octocode-research/.claude/settings.local.json +46 -0
- package/skills/octocode-research/.octocode/plan/code-review-fixes/plan.md +312 -0
- package/skills/octocode-research/.octocode/plan/code-review-fixes/research.md +212 -0
- package/skills/octocode-research/.octocode/plans/NODE_SERVER_START_PLAN.md +755 -0
- package/skills/octocode-research/.octocode/research/code-review/research.md +371 -0
- package/skills/octocode-research/.octocode/review/IMPROVEMENTS.md +391 -0
- package/skills/octocode-research/.octocode/review/REVIEW_PLAN.md +289 -0
- package/skills/octocode-research/.octocode/review/REVIEW_REPORT.md +356 -0
- package/skills/octocode-research/AGENTS.md +349 -0
- package/skills/octocode-research/README.md +494 -0
- package/skills/octocode-research/SKILL.md +652 -274
- package/skills/octocode-research/docs/API_REFERENCE.md +562 -0
- package/skills/octocode-research/docs/ARCHITECTURE.md +554 -0
- package/skills/octocode-research/docs/FLOWS.md +577 -0
- package/skills/octocode-research/docs/OVERVIEW.md +564 -0
- package/skills/octocode-research/docs/SERVER_FLOWS.md +631 -0
- package/skills/octocode-research/ecosystem.config.cjs +88 -0
- package/skills/octocode-research/eslint.config.mjs +27 -0
- package/skills/octocode-research/package.json +84 -0
- package/skills/octocode-research/references/GUARDRAILS.md +40 -0
- package/skills/octocode-research/references/PARALLEL_AGENT_PROTOCOL.md +178 -0
- package/skills/octocode-research/references/roast-prompt.md +149 -0
- package/skills/octocode-research/scripts/server-init.d.ts +2 -0
- package/skills/octocode-research/scripts/server-init.js +2 -0
- package/skills/octocode-research/scripts/server.d.ts +8 -0
- package/skills/octocode-research/scripts/server.js +445 -0
- package/skills/octocode-research/src/__tests__/integration/circuitBreaker.test.ts +205 -0
- package/skills/octocode-research/src/__tests__/integration/routes.test.ts +374 -0
- package/skills/octocode-research/src/__tests__/unit/circuitBreaker.test.ts +245 -0
- package/skills/octocode-research/src/__tests__/unit/errorHandler.test.ts +183 -0
- package/skills/octocode-research/src/__tests__/unit/httpPreprocess.test.ts +157 -0
- package/skills/octocode-research/src/__tests__/unit/logger.test.ts +143 -0
- package/skills/octocode-research/src/__tests__/unit/queryParser.test.ts +130 -0
- package/skills/octocode-research/src/__tests__/unit/responseBuilder.test.ts +469 -0
- package/skills/octocode-research/src/__tests__/unit/retry.test.ts +205 -0
- package/skills/octocode-research/src/index.ts +186 -0
- package/skills/octocode-research/src/mcpCache.ts +49 -0
- package/skills/octocode-research/src/middleware/errorHandler.ts +65 -0
- package/skills/octocode-research/src/middleware/logger.ts +61 -0
- package/skills/octocode-research/src/middleware/queryParser.ts +115 -0
- package/skills/octocode-research/src/middleware/readiness.ts +17 -0
- package/skills/octocode-research/src/routes/github.ts +197 -0
- package/skills/octocode-research/src/routes/local.ts +175 -0
- package/skills/octocode-research/src/routes/lsp.ts +177 -0
- package/skills/octocode-research/src/routes/package.ts +127 -0
- package/skills/octocode-research/src/routes/prompts.ts +138 -0
- package/skills/octocode-research/src/routes/tools.ts +677 -0
- package/skills/octocode-research/src/server-init.ts +363 -0
- package/skills/octocode-research/src/server.ts +285 -0
- package/skills/octocode-research/src/types/errorGuards.ts +151 -0
- package/skills/octocode-research/src/types/express.d.ts +76 -0
- package/skills/octocode-research/src/types/guards.ts +98 -0
- package/skills/octocode-research/src/types/mcp.ts +119 -0
- package/skills/octocode-research/src/types/responses.ts +199 -0
- package/skills/octocode-research/src/types/toolTypes.ts +33 -0
- package/skills/octocode-research/src/utils/asyncTimeout.ts +116 -0
- package/skills/octocode-research/src/utils/circuitBreaker.ts +492 -0
- package/skills/octocode-research/src/utils/colors.ts +53 -0
- package/skills/octocode-research/src/utils/errorQueue.ts +71 -0
- package/skills/octocode-research/src/utils/logEmoji.ts +103 -0
- package/skills/octocode-research/src/utils/logger.ts +413 -0
- package/skills/octocode-research/src/utils/resilience.ts +169 -0
- package/skills/octocode-research/src/utils/responseBuilder.ts +495 -0
- package/skills/octocode-research/src/utils/responseFactory.ts +100 -0
- package/skills/octocode-research/src/utils/responseParser.ts +272 -0
- package/skills/octocode-research/src/utils/retry.ts +280 -0
- package/skills/octocode-research/src/utils/routeFactory.ts +117 -0
- package/skills/octocode-research/src/utils/url.ts +20 -0
- package/skills/octocode-research/src/validation/httpPreprocess.ts +155 -0
- package/skills/octocode-research/src/validation/index.ts +2 -0
- package/skills/octocode-research/src/validation/schemas.ts +578 -0
- package/skills/octocode-research/src/validation/toolCallSchema.ts +132 -0
- package/skills/octocode-research/tsconfig.json +21 -0
- package/skills/octocode-research/tsdown.config.ts +42 -0
- package/skills/octocode-research/vitest.config.ts +20 -0
- package/skills/octocode-researcher/SKILL.md +461 -0
- package/skills/octocode-researcher/references/fallbacks.md +120 -0
- package/skills/{octocode-local-search → octocode-researcher}/references/tool-reference.md +132 -49
- package/skills/{octocode-local-search → octocode-researcher}/references/workflow-patterns.md +204 -4
- package/skills/octocode-rfc-generator/SKILL.md +223 -0
- package/skills/octocode-rfc-generator/references/rfc-template.md +193 -0
- package/skills/octocode-roast/SKILL.md +63 -21
- package/skills/octocode-implement/SKILL.md +0 -293
- package/skills/octocode-implement/references/execution-phases.md +0 -317
- package/skills/octocode-implement/references/tool-reference.md +0 -403
- package/skills/octocode-implement/references/workflow-patterns.md +0 -385
- package/skills/octocode-local-search/SKILL.md +0 -449
- package/skills/octocode-pr-review/SKILL.md +0 -391
- package/skills/octocode-pr-review/references/domain-reviewers.md +0 -105
- package/skills/octocode-pr-review/references/execution-lifecycle.md +0 -116
- package/skills/octocode-pr-review/references/research-flows.md +0 -75
- package/skills/octocode-research/references/tool-reference.md +0 -304
- package/skills/octocode-research/references/workflow-patterns.md +0 -325
|
@@ -0,0 +1,1222 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for summary-md.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="index.html">All files</a> summary-md.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">99.56% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>229/230</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">83.18% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>94/113</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>9/9</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">100% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>207/207</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
446
|
+
<span class="cline-any cline-neutral"> </span>
|
|
447
|
+
<span class="cline-any cline-neutral"> </span>
|
|
448
|
+
<span class="cline-any cline-neutral"> </span>
|
|
449
|
+
<span class="cline-any cline-neutral"> </span>
|
|
450
|
+
<span class="cline-any cline-neutral"> </span>
|
|
451
|
+
<span class="cline-any cline-neutral"> </span>
|
|
452
|
+
<span class="cline-any cline-neutral"> </span>
|
|
453
|
+
<span class="cline-any cline-neutral"> </span>
|
|
454
|
+
<span class="cline-any cline-yes">217x</span>
|
|
455
|
+
<span class="cline-any cline-yes">217x</span>
|
|
456
|
+
<span class="cline-any cline-yes">217x</span>
|
|
457
|
+
<span class="cline-any cline-neutral"> </span>
|
|
458
|
+
<span class="cline-any cline-neutral"> </span>
|
|
459
|
+
<span class="cline-any cline-neutral"> </span>
|
|
460
|
+
<span class="cline-any cline-yes">374x</span>
|
|
461
|
+
<span class="cline-any cline-yes">374x</span>
|
|
462
|
+
<span class="cline-any cline-yes">374x</span>
|
|
463
|
+
<span class="cline-any cline-neutral"> </span>
|
|
464
|
+
<span class="cline-any cline-neutral"> </span>
|
|
465
|
+
<span class="cline-any cline-neutral"> </span>
|
|
466
|
+
<span class="cline-any cline-yes">408x</span>
|
|
467
|
+
<span class="cline-any cline-yes">405x</span>
|
|
468
|
+
<span class="cline-any cline-yes">405x</span>
|
|
469
|
+
<span class="cline-any cline-yes">405x</span>
|
|
470
|
+
<span class="cline-any cline-yes">405x</span>
|
|
471
|
+
<span class="cline-any cline-yes">405x</span>
|
|
472
|
+
<span class="cline-any cline-neutral"> </span>
|
|
473
|
+
<span class="cline-any cline-neutral"> </span>
|
|
474
|
+
<span class="cline-any cline-neutral"> </span>
|
|
475
|
+
<span class="cline-any cline-yes">74x</span>
|
|
476
|
+
<span class="cline-any cline-neutral"> </span>
|
|
477
|
+
<span class="cline-any cline-yes">106x</span>
|
|
478
|
+
<span class="cline-any cline-neutral"> </span>
|
|
479
|
+
<span class="cline-any cline-yes">22x</span>
|
|
480
|
+
<span class="cline-any cline-neutral"> </span>
|
|
481
|
+
<span class="cline-any cline-neutral"> </span>
|
|
482
|
+
<span class="cline-any cline-yes">74x</span>
|
|
483
|
+
<span class="cline-any cline-yes">16x</span>
|
|
484
|
+
<span class="cline-any cline-yes">10x</span>
|
|
485
|
+
<span class="cline-any cline-neutral"> </span>
|
|
486
|
+
<span class="cline-any cline-neutral"> </span>
|
|
487
|
+
<span class="cline-any cline-neutral"> </span>
|
|
488
|
+
<span class="cline-any cline-yes">286x</span>
|
|
489
|
+
<span class="cline-any cline-yes">162x</span>
|
|
490
|
+
<span class="cline-any cline-yes">3x</span>
|
|
491
|
+
<span class="cline-any cline-neutral"> </span>
|
|
492
|
+
<span class="cline-any cline-neutral"> </span>
|
|
493
|
+
<span class="cline-any cline-neutral"> </span>
|
|
494
|
+
<span class="cline-any cline-neutral"> </span>
|
|
495
|
+
<span class="cline-any cline-neutral"> </span>
|
|
496
|
+
<span class="cline-any cline-yes">82x</span>
|
|
497
|
+
<span class="cline-any cline-neutral"> </span>
|
|
498
|
+
<span class="cline-any cline-yes">17x</span>
|
|
499
|
+
<span class="cline-any cline-neutral"> </span>
|
|
500
|
+
<span class="cline-any cline-yes">167x</span>
|
|
501
|
+
<span class="cline-any cline-yes">167x</span>
|
|
502
|
+
<span class="cline-any cline-yes">167x</span>
|
|
503
|
+
<span class="cline-any cline-neutral"> </span>
|
|
504
|
+
<span class="cline-any cline-neutral"> </span>
|
|
505
|
+
<span class="cline-any cline-yes">17x</span>
|
|
506
|
+
<span class="cline-any cline-yes">17x</span>
|
|
507
|
+
<span class="cline-any cline-yes">17x</span>
|
|
508
|
+
<span class="cline-any cline-yes">17x</span>
|
|
509
|
+
<span class="cline-any cline-neutral"> </span>
|
|
510
|
+
<span class="cline-any cline-neutral"> </span>
|
|
511
|
+
<span class="cline-any cline-yes">17x</span>
|
|
512
|
+
<span class="cline-any cline-yes">17x</span>
|
|
513
|
+
<span class="cline-any cline-yes">34x</span>
|
|
514
|
+
<span class="cline-any cline-neutral"> </span>
|
|
515
|
+
<span class="cline-any cline-neutral"> </span>
|
|
516
|
+
<span class="cline-any cline-yes">39x</span>
|
|
517
|
+
<span class="cline-any cline-neutral"> </span>
|
|
518
|
+
<span class="cline-any cline-yes">66x</span>
|
|
519
|
+
<span class="cline-any cline-yes">59x</span>
|
|
520
|
+
<span class="cline-any cline-neutral"> </span>
|
|
521
|
+
<span class="cline-any cline-yes">53x</span>
|
|
522
|
+
<span class="cline-any cline-yes">53x</span>
|
|
523
|
+
<span class="cline-any cline-yes">53x</span>
|
|
524
|
+
<span class="cline-any cline-neutral"> </span>
|
|
525
|
+
<span class="cline-any cline-neutral"> </span>
|
|
526
|
+
<span class="cline-any cline-yes">39x</span>
|
|
527
|
+
<span class="cline-any cline-neutral"> </span>
|
|
528
|
+
<span class="cline-any cline-yes">17x</span>
|
|
529
|
+
<span class="cline-any cline-neutral"> </span>
|
|
530
|
+
<span class="cline-any cline-neutral"> </span>
|
|
531
|
+
<span class="cline-any cline-neutral"> </span>
|
|
532
|
+
<span class="cline-any cline-yes">14x</span>
|
|
533
|
+
<span class="cline-any cline-yes">14x</span>
|
|
534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
535
|
+
<span class="cline-any cline-yes">74x</span>
|
|
536
|
+
<span class="cline-any cline-yes">74x</span>
|
|
537
|
+
<span class="cline-any cline-yes">40x</span>
|
|
538
|
+
<span class="cline-any cline-yes">40x</span>
|
|
539
|
+
<span class="cline-any cline-yes">40x</span>
|
|
540
|
+
<span class="cline-any cline-neutral"> </span>
|
|
541
|
+
<span class="cline-any cline-yes">14x</span>
|
|
542
|
+
<span class="cline-any cline-neutral"> </span>
|
|
543
|
+
<span class="cline-any cline-neutral"> </span>
|
|
544
|
+
<span class="cline-any cline-neutral"> </span>
|
|
545
|
+
<span class="cline-any cline-neutral"> </span>
|
|
546
|
+
<span class="cline-any cline-neutral"> </span>
|
|
547
|
+
<span class="cline-any cline-neutral"> </span>
|
|
548
|
+
<span class="cline-any cline-neutral"> </span>
|
|
549
|
+
<span class="cline-any cline-neutral"> </span>
|
|
550
|
+
<span class="cline-any cline-neutral"> </span>
|
|
551
|
+
<span class="cline-any cline-neutral"> </span>
|
|
552
|
+
<span class="cline-any cline-neutral"> </span>
|
|
553
|
+
<span class="cline-any cline-neutral"> </span>
|
|
554
|
+
<span class="cline-any cline-neutral"> </span>
|
|
555
|
+
<span class="cline-any cline-neutral"> </span>
|
|
556
|
+
<span class="cline-any cline-neutral"> </span>
|
|
557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
560
|
+
<span class="cline-any cline-neutral"> </span>
|
|
561
|
+
<span class="cline-any cline-neutral"> </span>
|
|
562
|
+
<span class="cline-any cline-neutral"> </span>
|
|
563
|
+
<span class="cline-any cline-neutral"> </span>
|
|
564
|
+
<span class="cline-any cline-neutral"> </span>
|
|
565
|
+
<span class="cline-any cline-neutral"> </span>
|
|
566
|
+
<span class="cline-any cline-neutral"> </span>
|
|
567
|
+
<span class="cline-any cline-neutral"> </span>
|
|
568
|
+
<span class="cline-any cline-neutral"> </span>
|
|
569
|
+
<span class="cline-any cline-neutral"> </span>
|
|
570
|
+
<span class="cline-any cline-yes">65x</span>
|
|
571
|
+
<span class="cline-any cline-yes">65x</span>
|
|
572
|
+
<span class="cline-any cline-yes">65x</span>
|
|
573
|
+
<span class="cline-any cline-yes">65x</span>
|
|
574
|
+
<span class="cline-any cline-yes">65x</span>
|
|
575
|
+
<span class="cline-any cline-yes">65x</span>
|
|
576
|
+
<span class="cline-any cline-neutral"> </span>
|
|
577
|
+
<span class="cline-any cline-yes">65x</span>
|
|
578
|
+
<span class="cline-any cline-yes">65x</span>
|
|
579
|
+
<span class="cline-any cline-yes">65x</span>
|
|
580
|
+
<span class="cline-any cline-yes">65x</span>
|
|
581
|
+
<span class="cline-any cline-neutral"> </span>
|
|
582
|
+
<span class="cline-any cline-yes">65x</span>
|
|
583
|
+
<span class="cline-any cline-yes">65x</span>
|
|
584
|
+
<span class="cline-any cline-yes">65x</span>
|
|
585
|
+
<span class="cline-any cline-yes">65x</span>
|
|
586
|
+
<span class="cline-any cline-yes">65x</span>
|
|
587
|
+
<span class="cline-any cline-yes">65x</span>
|
|
588
|
+
<span class="cline-any cline-yes">65x</span>
|
|
589
|
+
<span class="cline-any cline-yes">65x</span>
|
|
590
|
+
<span class="cline-any cline-yes">65x</span>
|
|
591
|
+
<span class="cline-any cline-neutral"> </span>
|
|
592
|
+
<span class="cline-any cline-yes">65x</span>
|
|
593
|
+
<span class="cline-any cline-yes">65x</span>
|
|
594
|
+
<span class="cline-any cline-yes">65x</span>
|
|
595
|
+
<span class="cline-any cline-yes">65x</span>
|
|
596
|
+
<span class="cline-any cline-yes">65x</span>
|
|
597
|
+
<span class="cline-any cline-yes">65x</span>
|
|
598
|
+
<span class="cline-any cline-yes">65x</span>
|
|
599
|
+
<span class="cline-any cline-yes">65x</span>
|
|
600
|
+
<span class="cline-any cline-yes">65x</span>
|
|
601
|
+
<span class="cline-any cline-neutral"> </span>
|
|
602
|
+
<span class="cline-any cline-yes">65x</span>
|
|
603
|
+
<span class="cline-any cline-yes">65x</span>
|
|
604
|
+
<span class="cline-any cline-neutral"> </span>
|
|
605
|
+
<span class="cline-any cline-yes">1x</span>
|
|
606
|
+
<span class="cline-any cline-neutral"> </span>
|
|
607
|
+
<span class="cline-any cline-yes">2x</span>
|
|
608
|
+
<span class="cline-any cline-neutral"> </span>
|
|
609
|
+
<span class="cline-any cline-yes">1x</span>
|
|
610
|
+
<span class="cline-any cline-neutral"> </span>
|
|
611
|
+
<span class="cline-any cline-neutral"> </span>
|
|
612
|
+
<span class="cline-any cline-neutral"> </span>
|
|
613
|
+
<span class="cline-any cline-yes">1x</span>
|
|
614
|
+
<span class="cline-any cline-yes">1x</span>
|
|
615
|
+
<span class="cline-any cline-neutral"> </span>
|
|
616
|
+
<span class="cline-any cline-neutral"> </span>
|
|
617
|
+
<span class="cline-any cline-neutral"> </span>
|
|
618
|
+
<span class="cline-any cline-yes">3x</span>
|
|
619
|
+
<span class="cline-any cline-neutral"> </span>
|
|
620
|
+
<span class="cline-any cline-yes">3x</span>
|
|
621
|
+
<span class="cline-any cline-neutral"> </span>
|
|
622
|
+
<span class="cline-any cline-yes">1x</span>
|
|
623
|
+
<span class="cline-any cline-neutral"> </span>
|
|
624
|
+
<span class="cline-any cline-yes">1x</span>
|
|
625
|
+
<span class="cline-any cline-yes">2x</span>
|
|
626
|
+
<span class="cline-any cline-neutral"> </span>
|
|
627
|
+
<span class="cline-any cline-yes">1x</span>
|
|
628
|
+
<span class="cline-any cline-neutral"> </span>
|
|
629
|
+
<span class="cline-any cline-yes">2x</span>
|
|
630
|
+
<span class="cline-any cline-yes">2x</span>
|
|
631
|
+
<span class="cline-any cline-neutral"> </span>
|
|
632
|
+
<span class="cline-any cline-neutral"> </span>
|
|
633
|
+
<span class="cline-any cline-neutral"> </span>
|
|
634
|
+
<span class="cline-any cline-neutral"> </span>
|
|
635
|
+
<span class="cline-any cline-yes">1x</span>
|
|
636
|
+
<span class="cline-any cline-yes">1x</span>
|
|
637
|
+
<span class="cline-any cline-neutral"> </span>
|
|
638
|
+
<span class="cline-any cline-neutral"> </span>
|
|
639
|
+
<span class="cline-any cline-neutral"> </span>
|
|
640
|
+
<span class="cline-any cline-neutral"> </span>
|
|
641
|
+
<span class="cline-any cline-neutral"> </span>
|
|
642
|
+
<span class="cline-any cline-neutral"> </span>
|
|
643
|
+
<span class="cline-any cline-yes">222x</span>
|
|
644
|
+
<span class="cline-any cline-yes">222x</span>
|
|
645
|
+
<span class="cline-any cline-yes">222x</span>
|
|
646
|
+
<span class="cline-any cline-neutral"> </span>
|
|
647
|
+
<span class="cline-any cline-yes">4404x</span>
|
|
648
|
+
<span class="cline-any cline-yes">4404x</span>
|
|
649
|
+
<span class="cline-any cline-neutral"> </span>
|
|
650
|
+
<span class="cline-any cline-yes">63x</span>
|
|
651
|
+
<span class="cline-any cline-neutral"> </span>
|
|
652
|
+
<span class="cline-any cline-yes">4341x</span>
|
|
653
|
+
<span class="cline-any cline-neutral"> </span>
|
|
654
|
+
<span class="cline-any cline-neutral"> </span>
|
|
655
|
+
<span class="cline-any cline-yes">222x</span>
|
|
656
|
+
<span class="cline-any cline-neutral"> </span>
|
|
657
|
+
<span class="cline-any cline-neutral"> </span>
|
|
658
|
+
<span class="cline-any cline-yes">65x</span>
|
|
659
|
+
<span class="cline-any cline-yes">65x</span>
|
|
660
|
+
<span class="cline-any cline-yes">65x</span>
|
|
661
|
+
<span class="cline-any cline-yes">65x</span>
|
|
662
|
+
<span class="cline-any cline-yes">65x</span>
|
|
663
|
+
<span class="cline-any cline-yes">65x</span>
|
|
664
|
+
<span class="cline-any cline-yes">65x</span>
|
|
665
|
+
<span class="cline-any cline-neutral"> </span>
|
|
666
|
+
<span class="cline-any cline-yes">65x</span>
|
|
667
|
+
<span class="cline-any cline-yes">65x</span>
|
|
668
|
+
<span class="cline-any cline-yes">65x</span>
|
|
669
|
+
<span class="cline-any cline-yes">287x</span>
|
|
670
|
+
<span class="cline-any cline-yes">65x</span>
|
|
671
|
+
<span class="cline-any cline-yes">65x</span>
|
|
672
|
+
<span class="cline-any cline-yes">65x</span>
|
|
673
|
+
<span class="cline-any cline-yes">65x</span>
|
|
674
|
+
<span class="cline-any cline-yes">65x</span>
|
|
675
|
+
<span class="cline-any cline-yes">65x</span>
|
|
676
|
+
<span class="cline-any cline-yes">65x</span>
|
|
677
|
+
<span class="cline-any cline-neutral"> </span>
|
|
678
|
+
<span class="cline-any cline-yes">65x</span>
|
|
679
|
+
<span class="cline-any cline-neutral"> </span>
|
|
680
|
+
<span class="cline-any cline-yes">1x</span>
|
|
681
|
+
<span class="cline-any cline-yes">1x</span>
|
|
682
|
+
<span class="cline-any cline-neutral"> </span>
|
|
683
|
+
<span class="cline-any cline-yes">2x</span>
|
|
684
|
+
<span class="cline-any cline-neutral"> </span>
|
|
685
|
+
<span class="cline-any cline-yes">1x</span>
|
|
686
|
+
<span class="cline-any cline-neutral"> </span>
|
|
687
|
+
<span class="cline-any cline-neutral"> </span>
|
|
688
|
+
<span class="cline-any cline-neutral"> </span>
|
|
689
|
+
<span class="cline-any cline-yes">42x</span>
|
|
690
|
+
<span class="cline-any cline-yes">42x</span>
|
|
691
|
+
<span class="cline-any cline-yes">42x</span>
|
|
692
|
+
<span class="cline-any cline-yes">42x</span>
|
|
693
|
+
<span class="cline-any cline-yes">42x</span>
|
|
694
|
+
<span class="cline-any cline-yes">42x</span>
|
|
695
|
+
<span class="cline-any cline-neutral"> </span>
|
|
696
|
+
<span class="cline-any cline-neutral"> </span>
|
|
697
|
+
<span class="cline-any cline-yes">42x</span>
|
|
698
|
+
<span class="cline-any cline-yes">42x</span>
|
|
699
|
+
<span class="cline-any cline-neutral"> </span>
|
|
700
|
+
<span class="cline-any cline-yes">1x</span>
|
|
701
|
+
<span class="cline-any cline-neutral"> </span>
|
|
702
|
+
<span class="cline-any cline-neutral"> </span>
|
|
703
|
+
<span class="cline-any cline-yes">7x</span>
|
|
704
|
+
<span class="cline-any cline-yes">7x</span>
|
|
705
|
+
<span class="cline-any cline-neutral"> </span>
|
|
706
|
+
<span class="cline-any cline-yes">15x</span>
|
|
707
|
+
<span class="cline-any cline-neutral"> </span>
|
|
708
|
+
<span class="cline-any cline-neutral"> </span>
|
|
709
|
+
<span class="cline-any cline-yes">42x</span>
|
|
710
|
+
<span class="cline-any cline-neutral"> </span>
|
|
711
|
+
<span class="cline-any cline-neutral"> </span>
|
|
712
|
+
<span class="cline-any cline-yes">65x</span>
|
|
713
|
+
<span class="cline-any cline-yes">65x</span>
|
|
714
|
+
<span class="cline-any cline-neutral"> </span>
|
|
715
|
+
<span class="cline-any cline-yes">64x</span>
|
|
716
|
+
<span class="cline-any cline-yes">64x</span>
|
|
717
|
+
<span class="cline-any cline-yes">64x</span>
|
|
718
|
+
<span class="cline-any cline-yes">64x</span>
|
|
719
|
+
<span class="cline-any cline-yes">64x</span>
|
|
720
|
+
<span class="cline-any cline-yes">64x</span>
|
|
721
|
+
<span class="cline-any cline-yes">64x</span>
|
|
722
|
+
<span class="cline-any cline-yes">64x</span>
|
|
723
|
+
<span class="cline-any cline-yes">64x</span>
|
|
724
|
+
<span class="cline-any cline-yes">64x</span>
|
|
725
|
+
<span class="cline-any cline-yes">64x</span>
|
|
726
|
+
<span class="cline-any cline-neutral"> </span>
|
|
727
|
+
<span class="cline-any cline-yes">65x</span>
|
|
728
|
+
<span class="cline-any cline-neutral"> </span>
|
|
729
|
+
<span class="cline-any cline-neutral"> </span>
|
|
730
|
+
<span class="cline-any cline-yes">4x</span>
|
|
731
|
+
<span class="cline-any cline-yes">4x</span>
|
|
732
|
+
<span class="cline-any cline-yes">4x</span>
|
|
733
|
+
<span class="cline-any cline-yes">4x</span>
|
|
734
|
+
<span class="cline-any cline-neutral"> </span>
|
|
735
|
+
<span class="cline-any cline-yes">10x</span>
|
|
736
|
+
<span class="cline-any cline-neutral"> </span>
|
|
737
|
+
<span class="cline-any cline-yes">4x</span>
|
|
738
|
+
<span class="cline-any cline-neutral"> </span>
|
|
739
|
+
<span class="cline-any cline-neutral"> </span>
|
|
740
|
+
<span class="cline-any cline-yes">65x</span>
|
|
741
|
+
<span class="cline-any cline-yes">65x</span>
|
|
742
|
+
<span class="cline-any cline-yes">65x</span>
|
|
743
|
+
<span class="cline-any cline-neutral"> </span>
|
|
744
|
+
<span class="cline-any cline-yes">65x</span>
|
|
745
|
+
<span class="cline-any cline-yes">65x</span>
|
|
746
|
+
<span class="cline-any cline-yes">65x</span>
|
|
747
|
+
<span class="cline-any cline-neutral"> </span>
|
|
748
|
+
<span class="cline-any cline-neutral"> </span>
|
|
749
|
+
<span class="cline-any cline-yes">14x</span>
|
|
750
|
+
<span class="cline-any cline-yes">14x</span>
|
|
751
|
+
<span class="cline-any cline-yes">14x</span>
|
|
752
|
+
<span class="cline-any cline-neutral"> </span>
|
|
753
|
+
<span class="cline-any cline-neutral"> </span>
|
|
754
|
+
<span class="cline-any cline-neutral"> </span>
|
|
755
|
+
<span class="cline-any cline-yes">13x</span>
|
|
756
|
+
<span class="cline-any cline-yes">13x</span>
|
|
757
|
+
<span class="cline-any cline-yes">13x</span>
|
|
758
|
+
<span class="cline-any cline-neutral"> </span>
|
|
759
|
+
<span class="cline-any cline-neutral"> </span>
|
|
760
|
+
<span class="cline-any cline-yes">65x</span>
|
|
761
|
+
<span class="cline-any cline-neutral"> </span>
|
|
762
|
+
<span class="cline-any cline-yes">24x</span>
|
|
763
|
+
<span class="cline-any cline-neutral"> </span>
|
|
764
|
+
<span class="cline-any cline-yes">24x</span>
|
|
765
|
+
<span class="cline-any cline-neutral"> </span>
|
|
766
|
+
<span class="cline-any cline-yes">24x</span>
|
|
767
|
+
<span class="cline-any cline-neutral"> </span>
|
|
768
|
+
<span class="cline-any cline-neutral"> </span>
|
|
769
|
+
<span class="cline-any cline-neutral"> </span>
|
|
770
|
+
<span class="cline-any cline-yes">3x</span>
|
|
771
|
+
<span class="cline-any cline-yes">3x</span>
|
|
772
|
+
<span class="cline-any cline-yes">3x</span>
|
|
773
|
+
<span class="cline-any cline-yes">3x</span>
|
|
774
|
+
<span class="cline-any cline-yes">3x</span>
|
|
775
|
+
<span class="cline-any cline-yes">3x</span>
|
|
776
|
+
<span class="cline-any cline-yes">3x</span>
|
|
777
|
+
<span class="cline-any cline-yes">3x</span>
|
|
778
|
+
<span class="cline-any cline-yes">3x</span>
|
|
779
|
+
<span class="cline-any cline-yes">3x</span>
|
|
780
|
+
<span class="cline-any cline-yes">3x</span>
|
|
781
|
+
<span class="cline-any cline-yes">3x</span>
|
|
782
|
+
<span class="cline-any cline-yes">3x</span>
|
|
783
|
+
<span class="cline-any cline-yes">3x</span>
|
|
784
|
+
<span class="cline-any cline-yes">3x</span>
|
|
785
|
+
<span class="cline-any cline-yes">3x</span>
|
|
786
|
+
<span class="cline-any cline-yes">3x</span>
|
|
787
|
+
<span class="cline-any cline-yes">3x</span>
|
|
788
|
+
<span class="cline-any cline-yes">3x</span>
|
|
789
|
+
<span class="cline-any cline-yes">3x</span>
|
|
790
|
+
<span class="cline-any cline-neutral"> </span>
|
|
791
|
+
<span class="cline-any cline-neutral"> </span>
|
|
792
|
+
<span class="cline-any cline-yes">65x</span>
|
|
793
|
+
<span class="cline-any cline-yes">65x</span>
|
|
794
|
+
<span class="cline-any cline-yes">65x</span>
|
|
795
|
+
<span class="cline-any cline-yes">65x</span>
|
|
796
|
+
<span class="cline-any cline-neutral"> </span>
|
|
797
|
+
<span class="cline-any cline-neutral"> </span>
|
|
798
|
+
<span class="cline-any cline-neutral"> </span>
|
|
799
|
+
<span class="cline-any cline-neutral"> </span>
|
|
800
|
+
<span class="cline-any cline-neutral"> </span>
|
|
801
|
+
<span class="cline-any cline-neutral"> </span>
|
|
802
|
+
<span class="cline-any cline-neutral"> </span>
|
|
803
|
+
<span class="cline-any cline-neutral"> </span>
|
|
804
|
+
<span class="cline-any cline-neutral"> </span>
|
|
805
|
+
<span class="cline-any cline-neutral"> </span>
|
|
806
|
+
<span class="cline-any cline-neutral"> </span>
|
|
807
|
+
<span class="cline-any cline-yes">284x</span>
|
|
808
|
+
<span class="cline-any cline-yes">284x</span>
|
|
809
|
+
<span class="cline-any cline-yes">284x</span>
|
|
810
|
+
<span class="cline-any cline-neutral"> </span>
|
|
811
|
+
<span class="cline-any cline-yes">65x</span>
|
|
812
|
+
<span class="cline-any cline-neutral"> </span>
|
|
813
|
+
<span class="cline-any cline-neutral"> </span>
|
|
814
|
+
<span class="cline-any cline-yes">10x</span>
|
|
815
|
+
<span class="cline-any cline-yes">10x</span>
|
|
816
|
+
<span class="cline-any cline-neutral"> </span>
|
|
817
|
+
<span class="cline-any cline-yes">10x</span>
|
|
818
|
+
<span class="cline-any cline-neutral"> </span>
|
|
819
|
+
<span class="cline-any cline-yes">10x</span>
|
|
820
|
+
<span class="cline-any cline-neutral"> </span>
|
|
821
|
+
<span class="cline-any cline-neutral"> </span>
|
|
822
|
+
<span class="cline-any cline-yes">65x</span>
|
|
823
|
+
<span class="cline-any cline-neutral"> </span>
|
|
824
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import fs from 'node:fs';
|
|
825
|
+
import path from 'node:path';
|
|
826
|
+
|
|
827
|
+
import { PILLAR_CATEGORIES, SEVERITY_ORDER } from './types.js';
|
|
828
|
+
|
|
829
|
+
import type { ReportAnalysisSummary } from './report-analysis.js';
|
|
830
|
+
import type { Finding } from './types.js';
|
|
831
|
+
|
|
832
|
+
export function severityBreakdown(findings: Finding[]): Record<string, number> {
|
|
833
|
+
const counts: Record<string, number> = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
|
|
834
|
+
for (const f of findings) counts[f.severity] = (counts[f.severity] || 0) + 1;
|
|
835
|
+
return counts;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
export function categoryBreakdown(findings: Finding[]): Record<string, number> {
|
|
839
|
+
const counts: Record<string, number> = {};
|
|
840
|
+
for (const f of findings) counts[f.category] = (counts[f.category] || 0) + 1;
|
|
841
|
+
return counts;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
export function computeHealthScore(findings: Finding[], totalFiles: number): number {
|
|
845
|
+
if (totalFiles === 0) return 100;
|
|
846
|
+
const weights = { critical: 25, high: 10, medium: 3, low: 1, info: 0 };
|
|
847
|
+
let penalty = 0;
|
|
848
|
+
for (const f of findings) penalty += weights[f.severity] || 0;
|
|
849
|
+
const normalized = (penalty / totalFiles) * 10;
|
|
850
|
+
return Math.max(0, Math.round(100 - normalized));
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
export function collectTagCloud(findings: Finding[]): { tag: string; count: number }[] {
|
|
854
|
+
const tagCounts = new Map<string, number>();
|
|
855
|
+
for (const f of findings) {
|
|
856
|
+
if (!f.tags) continue;
|
|
857
|
+
for (const tag of f.tags) {
|
|
858
|
+
tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
return [...tagCounts.entries()]
|
|
862
|
+
.map(([tag, count]) => ({ tag, count }))
|
|
863
|
+
.sort((a, b) => b.count - a.count);
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
export function formatFileSize(bytes: number): string {
|
|
867
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
868
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
869
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
type FindingLike = Omit<Finding, 'id'> & { id?: string };
|
|
873
|
+
|
|
874
|
+
export function diversifyFindings<T extends FindingLike>(sorted: T[], limit: number): T[] {
|
|
875
|
+
if (!Number.isFinite(limit) || limit >= sorted.length) return sorted;
|
|
876
|
+
|
|
877
|
+
const groups = new Map<string, T[]>();
|
|
878
|
+
for (const f of sorted) {
|
|
879
|
+
const cat = f.category;
|
|
880
|
+
if (!groups.has(cat)) groups.set(cat, []);
|
|
881
|
+
groups.get(cat)!.push(f);
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
const categoryOrder = [...groups.entries()].sort((a, b) => {
|
|
885
|
+
const aTop = SEVERITY_ORDER[a[1][0].severity] ?? <span class="branch-1 cbranch-no" title="branch not covered" >0;</span>
|
|
886
|
+
const bTop = SEVERITY_ORDER[b[1][0].severity] ?? <span class="branch-1 cbranch-no" title="branch not covered" >0;</span>
|
|
887
|
+
return bTop - aTop;
|
|
888
|
+
});
|
|
889
|
+
|
|
890
|
+
const result: T[] = [];
|
|
891
|
+
const cursors = new Map<string, number>();
|
|
892
|
+
for (const [cat] of categoryOrder) cursors.set(cat, 0);
|
|
893
|
+
|
|
894
|
+
while (result.length < limit) {
|
|
895
|
+
let picked = false;
|
|
896
|
+
for (const [cat, items] of categoryOrder) {
|
|
897
|
+
if (result.length >= limit) break;
|
|
898
|
+
const cursor = cursors.get(cat)!;
|
|
899
|
+
if (cursor < items.length) {
|
|
900
|
+
result.push(items[cursor]);
|
|
901
|
+
cursors.set(cat, cursor + 1);
|
|
902
|
+
picked = true;
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
<span class="missing-if-branch" title="if path not taken" >I</span>if (!picked) <span class="cstat-no" title="statement not covered" >break;</span>
|
|
906
|
+
}
|
|
907
|
+
return result;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
export function diverseTopRecommendations(findings: Finding[], limit: number = 20, maxPerCategory: number = 2): Finding[] {
|
|
911
|
+
const result: Finding[] = [];
|
|
912
|
+
const countByCategory = new Map<string, number>();
|
|
913
|
+
for (const f of findings) {
|
|
914
|
+
const catCount = countByCategory.get(f.category) || 0;
|
|
915
|
+
if (catCount >= maxPerCategory) continue;
|
|
916
|
+
result.push(f);
|
|
917
|
+
countByCategory.set(f.category, catCount + 1);
|
|
918
|
+
if (result.length >= limit) break;
|
|
919
|
+
}
|
|
920
|
+
return result;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
export interface SummaryMdOptions {
|
|
924
|
+
dir: string;
|
|
925
|
+
report: import('./report-writer.js').FullReport;
|
|
926
|
+
outputFiles: Record<string, string>;
|
|
927
|
+
architectureFindings: Finding[];
|
|
928
|
+
codeQualityFindings: Finding[];
|
|
929
|
+
deadCodeFindings: Finding[];
|
|
930
|
+
hotFiles?: import('./types.js').HotFile[];
|
|
931
|
+
activeFeatures?: Set<string> | null;
|
|
932
|
+
scope?: string[] | null;
|
|
933
|
+
root?: string;
|
|
934
|
+
scopeSymbols?: Map<string, string[]> | null;
|
|
935
|
+
semanticEnabled?: boolean;
|
|
936
|
+
securityFindings?: Finding[];
|
|
937
|
+
testQualityFindings?: Finding[];
|
|
938
|
+
reportAnalysis?: ReportAnalysisSummary;
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
export function generateSummaryMd(opts: SummaryMdOptions): string {
|
|
942
|
+
const {
|
|
943
|
+
dir, report, outputFiles,
|
|
944
|
+
architectureFindings, codeQualityFindings, deadCodeFindings,
|
|
945
|
+
hotFiles = [], activeFeatures = null, scope = null,
|
|
946
|
+
root = process.cwd(), scopeSymbols = null,
|
|
947
|
+
semanticEnabled = false, securityFindings = [], testQualityFindings = [],
|
|
948
|
+
reportAnalysis = null,
|
|
949
|
+
} = opts;
|
|
950
|
+
const allFindings = report.optimizationFindings || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
|
|
951
|
+
const sev = severityBreakdown(allFindings);
|
|
952
|
+
const summary = report.summary as Record<string, unknown>;
|
|
953
|
+
const agentOutput = report.agentOutput as Record<string, unknown>;
|
|
954
|
+
const depGraph = report.dependencyGraph;
|
|
955
|
+
|
|
956
|
+
const lines: string[] = [];
|
|
957
|
+
lines.push('# Code Quality Scan Report\n');
|
|
958
|
+
lines.push(`**Generated**: ${report.generatedAt} `);
|
|
959
|
+
lines.push(`**Root**: \`${report.repoRoot}\`\n`);
|
|
960
|
+
|
|
961
|
+
lines.push('## Scan Scope\n');
|
|
962
|
+
lines.push(`| Metric | Count |`);
|
|
963
|
+
lines.push(`|--------|-------|`);
|
|
964
|
+
lines.push(`| Files analyzed | ${summary.totalFiles ?? <span class="branch-1 cbranch-no" title="branch not covered" >'—'} </span>|`);
|
|
965
|
+
lines.push(`| Functions | ${summary.totalFunctions ?? <span class="branch-1 cbranch-no" title="branch not covered" >'—'} </span>|`);
|
|
966
|
+
lines.push(`| Flow nodes | ${summary.totalFlows ?? <span class="branch-1 cbranch-no" title="branch not covered" >'—'} </span>|`);
|
|
967
|
+
lines.push(`| Dependency files | ${summary.totalDependencyFiles ?? <span class="branch-1 cbranch-no" title="branch not covered" >'—'} </span>|`);
|
|
968
|
+
lines.push(`| Packages | ${summary.totalPackages ?? <span class="branch-1 cbranch-no" title="branch not covered" >'—'} </span>|`);
|
|
969
|
+
lines.push('');
|
|
970
|
+
|
|
971
|
+
lines.push('## Findings Overview\n');
|
|
972
|
+
lines.push(`| Severity | Count |`);
|
|
973
|
+
lines.push(`|----------|-------|`);
|
|
974
|
+
lines.push(`| Critical | ${sev.critical} |`);
|
|
975
|
+
lines.push(`| High | ${sev.high} |`);
|
|
976
|
+
lines.push(`| Medium | ${sev.medium} |`);
|
|
977
|
+
lines.push(`| Low | ${sev.low} |`);
|
|
978
|
+
lines.push(`| **Total** | **${allFindings.length}** |`);
|
|
979
|
+
lines.push('');
|
|
980
|
+
|
|
981
|
+
const totalBefore = (agentOutput as Record<string, unknown>)?.totalBeforeTruncation as number | undefined;
|
|
982
|
+
const dropped = (agentOutput as Record<string, unknown>)?.droppedCategories as string[] | undefined;
|
|
983
|
+
if (totalBefore && totalBefore > allFindings.length) {
|
|
984
|
+
lines.push(`> **Truncated**: Showing ${allFindings.length} of ${totalBefore} findings (\`--findings-limit ${allFindings.length}\`).`);
|
|
985
|
+
if (dropped && dropped.length > 0) {
|
|
986
|
+
lines.push(`> Dropped categories: ${dropped.map((c) => `\`${c}\``).join(', ')}`);
|
|
987
|
+
}
|
|
988
|
+
lines.push('');
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
if (activeFeatures) {
|
|
992
|
+
lines.push(`> **Features filter**: \`--features=${[...activeFeatures].join(',')}\``);
|
|
993
|
+
lines.push('');
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
if (scope && scope.length > 0) {
|
|
997
|
+
const scopeDisplay = scope.map((s) => path.relative(root, s)).filter(Boolean);
|
|
998
|
+
if (scopeDisplay.length > 0) {
|
|
999
|
+
let scopeLabel = scopeDisplay.map((p) => `\`${p}\``).join(', ');
|
|
1000
|
+
if (scopeSymbols && scopeSymbols.size > 0) {
|
|
1001
|
+
const symParts: string[] = [];
|
|
1002
|
+
for (const [absFile, names] of scopeSymbols) {
|
|
1003
|
+
const rel = path.relative(root, absFile);
|
|
1004
|
+
symParts.push(...names.map((n) => `\`${rel}:${n}\``));
|
|
1005
|
+
}
|
|
1006
|
+
scopeLabel = symParts.join(', ');
|
|
1007
|
+
}
|
|
1008
|
+
lines.push(`> **Scoped scan**: Only showing findings for: ${scopeLabel}`);
|
|
1009
|
+
lines.push('');
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
if (semanticEnabled) {
|
|
1014
|
+
lines.push('> **Semantic analysis**: TypeChecker + LanguageService enabled (14 additional categories)');
|
|
1015
|
+
lines.push('');
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
const renderPillarCategories = (
|
|
1019
|
+
pillarKey: string,
|
|
1020
|
+
findings: Finding[],
|
|
1021
|
+
): void => {
|
|
1022
|
+
const breakdown = categoryBreakdown(findings);
|
|
1023
|
+
const pillarCats = PILLAR_CATEGORIES[pillarKey] || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
|
|
1024
|
+
const isFiltered = activeFeatures !== null;
|
|
1025
|
+
for (const cat of pillarCats) {
|
|
1026
|
+
const count = breakdown[cat] || 0;
|
|
1027
|
+
const skipped = isFiltered && !activeFeatures!.has(cat);
|
|
1028
|
+
if (skipped) {
|
|
1029
|
+
lines.push(`- \`${cat}\`: — *(skipped)*`);
|
|
1030
|
+
} else {
|
|
1031
|
+
lines.push(`- \`${cat}\`: ${count}`);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
lines.push('');
|
|
1035
|
+
};
|
|
1036
|
+
|
|
1037
|
+
const totalFiles = (summary.totalFiles as number) || <span class="branch-1 cbranch-no" title="branch not covered" >1;</span>
|
|
1038
|
+
const overallHealth = computeHealthScore(allFindings, totalFiles);
|
|
1039
|
+
const archHealth = computeHealthScore(architectureFindings, totalFiles);
|
|
1040
|
+
const qualHealth = computeHealthScore(codeQualityFindings, totalFiles);
|
|
1041
|
+
const deadHealth = computeHealthScore(deadCodeFindings, totalFiles);
|
|
1042
|
+
const secHealth = computeHealthScore(securityFindings, totalFiles);
|
|
1043
|
+
const testHealth = computeHealthScore(testQualityFindings, totalFiles);
|
|
1044
|
+
|
|
1045
|
+
lines.push('## Health Scores\n');
|
|
1046
|
+
lines.push('| Pillar | Score | Grade |');
|
|
1047
|
+
lines.push('|--------|-------|-------|');
|
|
1048
|
+
const grade = (s: number) => s >= 80 ? 'A' : s >= 60 ? 'B' : s >= 40 ? <span class="branch-0 cbranch-no" title="branch not covered" >'C' : s</span> >= 20 ? <span class="branch-0 cbranch-no" title="branch not covered" >'D' : '</span>F';
|
|
1049
|
+
lines.push(`| **Overall** | **${overallHealth}/100** | **${grade(overallHealth)}** |`);
|
|
1050
|
+
lines.push(`| Architecture | ${archHealth}/100 | ${grade(archHealth)} |`);
|
|
1051
|
+
lines.push(`| Code Quality | ${qualHealth}/100 | ${grade(qualHealth)} |`);
|
|
1052
|
+
lines.push(`| Dead Code & Hygiene | ${deadHealth}/100 | ${grade(deadHealth)} |`);
|
|
1053
|
+
if (securityFindings.length > 0) lines.push(`| Security | ${secHealth}/100 | ${grade(secHealth)} |`);
|
|
1054
|
+
if (testQualityFindings.length > 0) lines.push(`| Test Quality | ${testHealth}/100 | ${grade(testHealth)} |`);
|
|
1055
|
+
lines.push('');
|
|
1056
|
+
|
|
1057
|
+
const tagCloud = collectTagCloud(allFindings);
|
|
1058
|
+
if (tagCloud.length > 0) {
|
|
1059
|
+
lines.push('## Top Concern Tags\n');
|
|
1060
|
+
lines.push('Searchable tags across all findings — use to filter `findings.json` with `jq`.\n');
|
|
1061
|
+
for (const { tag, count } of tagCloud.slice(0, 12)) {
|
|
1062
|
+
lines.push(`- \`${tag}\`: ${count} findings`);
|
|
1063
|
+
}
|
|
1064
|
+
lines.push('');
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
if (reportAnalysis) {
|
|
1068
|
+
lines.push('## Analysis Signals\n');
|
|
1069
|
+
lines.push(`- **Graph Signal**: ${reportAnalysis.strongestGraphSignal?.summary || 'No dominant graph signal in this scan.'}`);
|
|
1070
|
+
lines.push(`- **AST Signal**: ${reportAnalysis.strongestAstSignal?.summary || 'No dominant AST signal in this scan.'}`);
|
|
1071
|
+
lines.push(`- **Combined Interpretation**: ${reportAnalysis.combinedInterpretation?.summary || 'No combined interpretation available yet.'}`);
|
|
1072
|
+
lines.push(`- **Confidence**: ${reportAnalysis.combinedInterpretation?.confidence || reportAnalysis.strongestGraphSignal?.confidence || reportAnalysis.strongestAstSignal?.confidence || 'low'}`);
|
|
1073
|
+
const validationSummary = reportAnalysis.recommendedValidation
|
|
1074
|
+
? `${reportAnalysis.recommendedValidation.summary} (tools: ${reportAnalysis.recommendedValidation.tools.join(' -> ')})`
|
|
1075
|
+
: 'Use Octocode local tools to confirm the strongest signal before presenting it as fact.';
|
|
1076
|
+
lines.push(`- **Recommended Validation**: ${validationSummary}`);
|
|
1077
|
+
const megaFolderSignal = reportAnalysis.graphSignals.find((signal) => signal.kind === 'mega-folder-cluster');
|
|
1078
|
+
if (megaFolderSignal) {
|
|
1079
|
+
lines.push(`- **Structural Layout Alert**: ${megaFolderSignal.summary}`);
|
|
1080
|
+
}
|
|
1081
|
+
if (reportAnalysis.investigationPrompts.length > 0) {
|
|
1082
|
+
lines.push('');
|
|
1083
|
+
lines.push('**Investigation Prompts**');
|
|
1084
|
+
for (const prompt of reportAnalysis.investigationPrompts.slice(0, 4)) {
|
|
1085
|
+
lines.push(`- ${prompt}`);
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
lines.push('');
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
lines.push('## Architecture Health\n');
|
|
1092
|
+
lines.push(`> ${architectureFindings.length} findings (score: ${archHealth}/100) — see [\`architecture.json\`](./architecture.json)\n`);
|
|
1093
|
+
if (depGraph) {
|
|
1094
|
+
lines.push(`| Metric | Value |`);
|
|
1095
|
+
lines.push(`|--------|-------|`);
|
|
1096
|
+
lines.push(`| Modules | ${depGraph.totalModules} |`);
|
|
1097
|
+
lines.push(`| Import edges | ${depGraph.totalEdges} |`);
|
|
1098
|
+
lines.push(`| Cycles | ${depGraph.cycles?.length ?? <span class="branch-1 cbranch-no" title="branch not covered" >0} </span>|`);
|
|
1099
|
+
lines.push(`| Critical paths | ${depGraph.criticalPaths?.length ?? <span class="branch-1 cbranch-no" title="branch not covered" >0} </span>|`);
|
|
1100
|
+
lines.push(`| Root modules | ${depGraph.rootsCount} |`);
|
|
1101
|
+
lines.push(`| Leaf modules | ${depGraph.leavesCount} |`);
|
|
1102
|
+
lines.push(`| Test-only modules | ${depGraph.testOnlyModules?.length ?? <span class="branch-1 cbranch-no" title="branch not covered" >0} </span>|`);
|
|
1103
|
+
lines.push(`| Unresolved imports | ${depGraph.unresolvedEdgeCount} |`);
|
|
1104
|
+
lines.push('');
|
|
1105
|
+
}
|
|
1106
|
+
renderPillarCategories('architecture', architectureFindings);
|
|
1107
|
+
|
|
1108
|
+
if (hotFiles.length > 0) {
|
|
1109
|
+
lines.push('## Change Risk Hotspots\n');
|
|
1110
|
+
lines.push('Files most dangerous to change — high fan-in, complexity, or cycle membership.\n');
|
|
1111
|
+
lines.push('| File | Risk | Fan-In | Fan-Out | Complexity | Exports | Cycle | Critical Path |');
|
|
1112
|
+
lines.push('|------|------|--------|---------|------------|---------|-------|---------------|');
|
|
1113
|
+
for (const hf of hotFiles.slice(0, 15)) {
|
|
1114
|
+
lines.push(`| \`${hf.file}\` | ${hf.riskScore} | ${hf.fanIn} | ${hf.fanOut} | ${hf.complexityScore} | ${hf.exportCount} | ${hf.inCycle ? 'Y' : <span class="branch-1 cbranch-no" title="branch not covered" >'-'} </span>| ${hf.onCriticalPath ? 'Y' : <span class="branch-1 cbranch-no" title="branch not covered" >'-'} </span>|`);
|
|
1115
|
+
}
|
|
1116
|
+
lines.push('');
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
lines.push('## Code Quality\n');
|
|
1120
|
+
lines.push(`> ${codeQualityFindings.length} findings (score: ${qualHealth}/100) — see [\`code-quality.json\`](./code-quality.json)\n`);
|
|
1121
|
+
renderPillarCategories('code-quality', codeQualityFindings);
|
|
1122
|
+
|
|
1123
|
+
lines.push('## Dead Code & Hygiene\n');
|
|
1124
|
+
lines.push(`> ${deadCodeFindings.length} findings (score: ${deadHealth}/100) — see [\`dead-code.json\`](./dead-code.json)\n`);
|
|
1125
|
+
renderPillarCategories('dead-code', deadCodeFindings);
|
|
1126
|
+
|
|
1127
|
+
if (securityFindings.length > 0) {
|
|
1128
|
+
lines.push('## Security\n');
|
|
1129
|
+
lines.push(`> ${securityFindings.length} findings (score: ${secHealth}/100) — see [\`security.json\`](./security.json)\n`);
|
|
1130
|
+
renderPillarCategories('security', securityFindings);
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
if (testQualityFindings.length > 0) {
|
|
1134
|
+
lines.push('## Test Quality\n');
|
|
1135
|
+
lines.push(`> ${testQualityFindings.length} findings (score: ${testHealth}/100) — see [\`test-quality.json\`](./test-quality.json)\n`);
|
|
1136
|
+
renderPillarCategories('test-quality', testQualityFindings);
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
const topRecs = (agentOutput?.topRecommendations ?? <span class="branch-1 cbranch-no" title="branch not covered" >[])</span> as Array<{ severity: string; title: string; file: string; category: string }>;
|
|
1140
|
+
if (topRecs.length > 0) {
|
|
1141
|
+
lines.push('## Top Recommendations\n');
|
|
1142
|
+
for (const rec of topRecs.slice(0, 10)) {
|
|
1143
|
+
lines.push(`- **[${rec.severity.toUpperCase()}]** \`${rec.file}\` — ${rec.title} *(${rec.category})* `);
|
|
1144
|
+
}
|
|
1145
|
+
lines.push('');
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
if (outputFiles.astTrees) {
|
|
1149
|
+
lines.push('## AST Trees (`ast-trees.txt`)\n');
|
|
1150
|
+
lines.push('Compact indented text format — each node is `Kind[startLine:endLine]`, nesting = indentation.\n');
|
|
1151
|
+
lines.push('```');
|
|
1152
|
+
lines.push('SourceFile[1:152]');
|
|
1153
|
+
lines.push(' ImportDeclaration[1]');
|
|
1154
|
+
lines.push(' FunctionDeclaration[3:20]');
|
|
1155
|
+
lines.push(' Block[4:19]');
|
|
1156
|
+
lines.push(' IfStatement[5:12] ...');
|
|
1157
|
+
lines.push('```\n');
|
|
1158
|
+
lines.push('**Smart navigation:**\n');
|
|
1159
|
+
lines.push('| Goal | Command |');
|
|
1160
|
+
lines.push('|------|---------|');
|
|
1161
|
+
lines.push('| List all files | `grep "^##" ast-trees.txt` |');
|
|
1162
|
+
lines.push('| Find functions | `grep -E "FunctionDeclaration\\|function_declaration\\|ArrowFunction\\|arrow_function" ast-trees.txt` |');
|
|
1163
|
+
lines.push('| Find classes | `grep -E "ClassDeclaration\\|class_declaration" ast-trees.txt` |');
|
|
1164
|
+
lines.push('| Find control flow | `grep -E "IfStatement\\|SwitchStatement\\|ForStatement\\|WhileStatement" ast-trees.txt` |');
|
|
1165
|
+
lines.push('| Deep nesting (>3) | `grep -E "^\\s{8,}" ast-trees.txt` |');
|
|
1166
|
+
lines.push('| Truncated subtrees | `grep "\\.\\.\\.$" ast-trees.txt` |');
|
|
1167
|
+
lines.push('| Large spans (regex) | Use pattern `\\[(\\d+):(\\d+)\\]` — subtract to find span size |');
|
|
1168
|
+
lines.push('');
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
lines.push('## Output Files\n');
|
|
1172
|
+
lines.push('| File | Size | Description |');
|
|
1173
|
+
lines.push('|------|------|-------------|');
|
|
1174
|
+
const descriptions: Record<string, string> = {
|
|
1175
|
+
summary: 'Scan metadata, agent output, parse errors',
|
|
1176
|
+
architecture: 'Dependency graph, cycles, critical paths, architecture findings',
|
|
1177
|
+
codeQuality: 'Duplicate detection, complexity, god modules/functions',
|
|
1178
|
+
deadCode: 'Dead files/exports/re-exports, unused deps, boundary violations',
|
|
1179
|
+
fileInventory: 'Per-file function/flow/dependency details',
|
|
1180
|
+
findings: 'All findings across all categories (master list)',
|
|
1181
|
+
graph: 'Mermaid dependency graph',
|
|
1182
|
+
astTrees: 'AST tree snapshots (compact indented text — grep/regex friendly)',
|
|
1183
|
+
summaryMd: 'This file — human-readable overview',
|
|
1184
|
+
};
|
|
1185
|
+
for (const [key, file] of Object.entries(outputFiles)) {
|
|
1186
|
+
let size = '—';
|
|
1187
|
+
try { size = formatFileSize(fs.statSync(path.join(dir, file)).size); } catch { size = '—'; }
|
|
1188
|
+
lines.push(`| [\`${file}\`](./${file}) | ${size} | ${descriptions[key] || key} |`);
|
|
1189
|
+
}
|
|
1190
|
+
lines.push('');
|
|
1191
|
+
|
|
1192
|
+
if (report.parseErrors?.length > 0) {
|
|
1193
|
+
lines.push('## Parse Errors\n');
|
|
1194
|
+
lines.push(`${report.parseErrors.length} file(s) failed to parse:\n`);
|
|
1195
|
+
for (const err of report.parseErrors.slice(0, 10)) {
|
|
1196
|
+
lines.push(`- \`${err.file}\`: ${err.message}`);
|
|
1197
|
+
}
|
|
1198
|
+
lines.push('');
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
return lines.join('\n');
|
|
1202
|
+
}
|
|
1203
|
+
</pre></td></tr></table></pre>
|
|
1204
|
+
|
|
1205
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
1206
|
+
</div><!-- /wrapper -->
|
|
1207
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
1208
|
+
Code coverage generated by
|
|
1209
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1210
|
+
at 2026-03-19T00:13:05.663Z
|
|
1211
|
+
</div>
|
|
1212
|
+
<script src="prettify.js"></script>
|
|
1213
|
+
<script>
|
|
1214
|
+
window.onload = function () {
|
|
1215
|
+
prettyPrint();
|
|
1216
|
+
};
|
|
1217
|
+
</script>
|
|
1218
|
+
<script src="sorter.js"></script>
|
|
1219
|
+
<script src="block-navigation.js"></script>
|
|
1220
|
+
</body>
|
|
1221
|
+
</html>
|
|
1222
|
+
|