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
|
@@ -5,34 +5,6 @@
|
|
|
5
5
|
* @module types/guards
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Check if value is a non-empty string
|
|
10
|
-
*/
|
|
11
|
-
export function isNonEmptyString(value: unknown): value is string {
|
|
12
|
-
return typeof value === 'string' && value.length > 0;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Check if value is a positive finite number
|
|
17
|
-
*/
|
|
18
|
-
export function isPositiveNumber(value: unknown): value is number {
|
|
19
|
-
return typeof value === 'number' && value > 0 && Number.isFinite(value);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Check if value is a non-negative finite number
|
|
24
|
-
*/
|
|
25
|
-
export function isNonNegativeNumber(value: unknown): value is number {
|
|
26
|
-
return typeof value === 'number' && value >= 0 && Number.isFinite(value);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Check if value is an array of non-empty strings
|
|
31
|
-
*/
|
|
32
|
-
export function isStringArray(value: unknown): value is string[] {
|
|
33
|
-
return Array.isArray(value) && value.every(isNonEmptyString);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
8
|
/**
|
|
37
9
|
* Check if value is an array (of any type)
|
|
38
10
|
*/
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP Protocol
|
|
3
|
-
* Based on: https://modelcontextprotocol.io/docs/concepts/tools
|
|
2
|
+
* MCP Protocol utilities for /tools endpoints
|
|
4
3
|
*/
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
export interface JsonSchema {
|
|
8
|
-
$schema?: string;
|
|
9
|
-
type: 'object';
|
|
10
|
-
properties: Record<string, JsonSchemaProperty>;
|
|
11
|
-
required?: string[];
|
|
12
|
-
additionalProperties?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface JsonSchemaProperty {
|
|
5
|
+
interface JsonSchemaProperty {
|
|
16
6
|
type: string;
|
|
17
7
|
description?: string;
|
|
18
8
|
items?: JsonSchemaProperty;
|
|
@@ -28,60 +18,17 @@ export interface JsonSchemaProperty {
|
|
|
28
18
|
default?: unknown;
|
|
29
19
|
}
|
|
30
20
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
inputSchema: JsonSchema;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* MCP Prompt argument for /prompts/list
|
|
42
|
-
*/
|
|
43
|
-
export interface McpPromptArgument {
|
|
44
|
-
name: string;
|
|
45
|
-
description: string;
|
|
46
|
-
required?: boolean;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* MCP Prompt representation for /prompts/list
|
|
51
|
-
*/
|
|
52
|
-
export interface McpPrompt {
|
|
53
|
-
name: string;
|
|
54
|
-
description: string;
|
|
55
|
-
arguments?: McpPromptArgument[];
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Response metadata
|
|
60
|
-
*/
|
|
61
|
-
export interface ListResponseMeta {
|
|
62
|
-
totalCount: number;
|
|
63
|
-
version: string;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Response type for GET /tools/list
|
|
68
|
-
*/
|
|
69
|
-
export interface ListToolsResponse {
|
|
70
|
-
tools: McpTool[];
|
|
71
|
-
_meta?: ListResponseMeta;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Response type for GET /prompts/list
|
|
76
|
-
*/
|
|
77
|
-
export interface ListPromptsResponse {
|
|
78
|
-
prompts: McpPrompt[];
|
|
79
|
-
_meta?: ListResponseMeta;
|
|
21
|
+
interface JsonSchema {
|
|
22
|
+
$schema?: string;
|
|
23
|
+
type: 'object';
|
|
24
|
+
properties: Record<string, JsonSchemaProperty>;
|
|
25
|
+
required?: string[];
|
|
26
|
+
additionalProperties?: boolean;
|
|
80
27
|
}
|
|
81
28
|
|
|
82
29
|
/**
|
|
83
|
-
* Transform description-based schema to JSON Schema format
|
|
84
|
-
*
|
|
30
|
+
* Transform description-based schema to JSON Schema format.
|
|
31
|
+
* Fallback transformer when full JSON schemas are not available.
|
|
85
32
|
*/
|
|
86
33
|
export function transformToJsonSchema(
|
|
87
34
|
schemaDescriptions: Record<string, string>,
|
|
@@ -89,15 +36,13 @@ export function transformToJsonSchema(
|
|
|
89
36
|
): JsonSchema {
|
|
90
37
|
const properties: Record<string, JsonSchemaProperty> = {};
|
|
91
38
|
|
|
92
|
-
// Create properties from descriptions
|
|
93
39
|
for (const [key, description] of Object.entries(schemaDescriptions)) {
|
|
94
40
|
properties[key] = {
|
|
95
|
-
type: 'string',
|
|
41
|
+
type: 'string',
|
|
96
42
|
description,
|
|
97
43
|
};
|
|
98
44
|
}
|
|
99
45
|
|
|
100
|
-
// Wrap in queries array structure (standard MCP bulk query pattern)
|
|
101
46
|
return {
|
|
102
47
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
103
48
|
type: 'object',
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Response types for MCP tool results.
|
|
3
|
-
* Use these instead of Record<string, unknown> for type-safe data handling.
|
|
4
3
|
*
|
|
5
4
|
* @module types/responses
|
|
6
5
|
*/
|
|
@@ -11,20 +10,6 @@ import { hasProperty, hasArrayProperty } from './guards.js';
|
|
|
11
10
|
// File and Search Types
|
|
12
11
|
// =============================================================================
|
|
13
12
|
|
|
14
|
-
/**
|
|
15
|
-
* A match within a file
|
|
16
|
-
*/
|
|
17
|
-
export interface MatchLocation {
|
|
18
|
-
line: number;
|
|
19
|
-
column?: number;
|
|
20
|
-
value?: string;
|
|
21
|
-
byteOffset?: number;
|
|
22
|
-
charOffset?: number;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* A file with matches from search results
|
|
27
|
-
*/
|
|
28
13
|
export interface FileMatch {
|
|
29
14
|
path: string;
|
|
30
15
|
line?: number;
|
|
@@ -33,12 +18,15 @@ export interface FileMatch {
|
|
|
33
18
|
matchCount?: number;
|
|
34
19
|
contextBefore?: string[];
|
|
35
20
|
contextAfter?: string[];
|
|
36
|
-
allMatches?:
|
|
21
|
+
allMatches?: Array<{
|
|
22
|
+
line: number;
|
|
23
|
+
column?: number;
|
|
24
|
+
value?: string;
|
|
25
|
+
byteOffset?: number;
|
|
26
|
+
charOffset?: number;
|
|
27
|
+
}>;
|
|
37
28
|
}
|
|
38
29
|
|
|
39
|
-
/**
|
|
40
|
-
* Pagination info for paginated results
|
|
41
|
-
*/
|
|
42
30
|
export interface PaginationInfo {
|
|
43
31
|
page?: number;
|
|
44
32
|
currentPage?: number;
|
|
@@ -49,83 +37,10 @@ export interface PaginationInfo {
|
|
|
49
37
|
nextCursor?: string;
|
|
50
38
|
}
|
|
51
39
|
|
|
52
|
-
/**
|
|
53
|
-
* Search result from localSearchCode or githubSearchCode
|
|
54
|
-
*/
|
|
55
|
-
interface SearchResult {
|
|
56
|
-
files?: FileMatch[];
|
|
57
|
-
totalMatches?: number;
|
|
58
|
-
totalFiles?: number;
|
|
59
|
-
pagination?: PaginationInfo;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// =============================================================================
|
|
63
|
-
// LSP Types
|
|
64
|
-
// =============================================================================
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* LSP position
|
|
68
|
-
*/
|
|
69
|
-
interface LspPosition {
|
|
70
|
-
line: number;
|
|
71
|
-
character: number;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* LSP range
|
|
76
|
-
*/
|
|
77
|
-
interface LspRange {
|
|
78
|
-
start: LspPosition;
|
|
79
|
-
end: LspPosition;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* LSP definition location
|
|
84
|
-
*/
|
|
85
|
-
interface LspDefinition {
|
|
86
|
-
uri: string;
|
|
87
|
-
range: LspRange;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* LSP reference location
|
|
92
|
-
*/
|
|
93
|
-
export interface LspReference extends LspDefinition {
|
|
94
|
-
context?: string;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* LSP call hierarchy item
|
|
99
|
-
*/
|
|
100
|
-
export interface LspCallHierarchyItem {
|
|
101
|
-
name: string;
|
|
102
|
-
kind?: number;
|
|
103
|
-
uri: string;
|
|
104
|
-
range?: LspRange;
|
|
105
|
-
selectionRange?: LspRange;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// =============================================================================
|
|
109
|
-
// Repository Structure Types
|
|
110
|
-
// =============================================================================
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Repository structure result
|
|
114
|
-
*/
|
|
115
|
-
export interface RepoStructure {
|
|
116
|
-
files?: string[];
|
|
117
|
-
folders?: string[];
|
|
118
|
-
totalFiles?: number;
|
|
119
|
-
totalDirectories?: number;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
40
|
// =============================================================================
|
|
123
|
-
//
|
|
41
|
+
// Internal helpers
|
|
124
42
|
// =============================================================================
|
|
125
43
|
|
|
126
|
-
/**
|
|
127
|
-
* Check if an object is a FileMatch
|
|
128
|
-
*/
|
|
129
44
|
function isFileMatch(obj: unknown): obj is FileMatch {
|
|
130
45
|
return (
|
|
131
46
|
typeof obj === 'object' &&
|
|
@@ -135,59 +50,26 @@ function isFileMatch(obj: unknown): obj is FileMatch {
|
|
|
135
50
|
);
|
|
136
51
|
}
|
|
137
52
|
|
|
138
|
-
/**
|
|
139
|
-
* Check if an object has valid pagination info
|
|
140
|
-
*/
|
|
141
53
|
function hasValidPagination(obj: unknown): obj is { pagination: PaginationInfo } {
|
|
142
54
|
if (!hasProperty(obj, 'pagination')) return false;
|
|
143
55
|
const p = obj.pagination;
|
|
144
56
|
return typeof p === 'object' && p !== null;
|
|
145
57
|
}
|
|
146
58
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
export function isSearchResult(obj: unknown): obj is SearchResult {
|
|
151
|
-
if (typeof obj !== 'object' || obj === null) return false;
|
|
152
|
-
if (hasArrayProperty(obj, 'files')) {
|
|
153
|
-
const files = (obj as { files: unknown[] }).files;
|
|
154
|
-
return files.every(isFileMatch);
|
|
155
|
-
}
|
|
156
|
-
return hasProperty(obj, 'totalMatches') || hasProperty(obj, 'totalFiles');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Check if an object is an LspDefinition
|
|
161
|
-
*/
|
|
162
|
-
export function isLspDefinition(obj: unknown): obj is LspDefinition {
|
|
163
|
-
return (
|
|
164
|
-
typeof obj === 'object' &&
|
|
165
|
-
obj !== null &&
|
|
166
|
-
'uri' in obj &&
|
|
167
|
-
'range' in obj &&
|
|
168
|
-
typeof (obj as LspDefinition).uri === 'string'
|
|
169
|
-
);
|
|
170
|
-
}
|
|
59
|
+
// =============================================================================
|
|
60
|
+
// Public extractors
|
|
61
|
+
// =============================================================================
|
|
171
62
|
|
|
172
|
-
/**
|
|
173
|
-
* Extract files array from data safely
|
|
174
|
-
*/
|
|
175
63
|
export function extractFiles(data: unknown): FileMatch[] {
|
|
176
64
|
if (!hasArrayProperty(data, 'files')) return [];
|
|
177
65
|
return (data as { files: unknown[] }).files.filter(isFileMatch);
|
|
178
66
|
}
|
|
179
67
|
|
|
180
|
-
/**
|
|
181
|
-
* Extract pagination from data safely
|
|
182
|
-
*/
|
|
183
68
|
export function extractPagination(data: unknown): PaginationInfo | undefined {
|
|
184
69
|
if (!hasValidPagination(data)) return undefined;
|
|
185
70
|
return data.pagination;
|
|
186
71
|
}
|
|
187
72
|
|
|
188
|
-
/**
|
|
189
|
-
* Extract total matches from data safely
|
|
190
|
-
*/
|
|
191
73
|
export function extractTotalMatches(data: unknown): number {
|
|
192
74
|
if (hasProperty(data, 'totalMatches') && typeof data.totalMatches === 'number') {
|
|
193
75
|
return data.totalMatches;
|
|
@@ -458,21 +458,6 @@ startPeriodicCleanup();
|
|
|
458
458
|
// Manual Cleanup Functions
|
|
459
459
|
// =============================================================================
|
|
460
460
|
|
|
461
|
-
/**
|
|
462
|
-
* Clear a specific circuit breaker.
|
|
463
|
-
* Use for testing or when a service is decommissioned.
|
|
464
|
-
* @param name - Circuit breaker name to clear
|
|
465
|
-
* @returns true if circuit existed and was cleared
|
|
466
|
-
*/
|
|
467
|
-
export function clearCircuit(name: string): boolean {
|
|
468
|
-
const existed = circuits.delete(name);
|
|
469
|
-
configs.delete(name);
|
|
470
|
-
if (existed) {
|
|
471
|
-
console.log(agentLog(`🧹 Circuit ${name} cleared`));
|
|
472
|
-
}
|
|
473
|
-
return existed;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
461
|
/**
|
|
477
462
|
* Clear all circuit breakers.
|
|
478
463
|
* Use for testing cleanup or server shutdown.
|
|
@@ -484,9 +469,3 @@ export function clearAllCircuits(): void {
|
|
|
484
469
|
console.log(agentLog(`🧹 Cleared ${count} circuit(s)`));
|
|
485
470
|
}
|
|
486
471
|
|
|
487
|
-
/**
|
|
488
|
-
* Get the number of active circuits (for monitoring).
|
|
489
|
-
*/
|
|
490
|
-
export function getCircuitCount(): number {
|
|
491
|
-
return circuits.size;
|
|
492
|
-
}
|
|
@@ -259,7 +259,7 @@ export function logWarn(message: string, data?: unknown): void {
|
|
|
259
259
|
// Public API - Tools Logger
|
|
260
260
|
// ============================================================================
|
|
261
261
|
|
|
262
|
-
|
|
262
|
+
interface ToolLogEntry {
|
|
263
263
|
tool: string;
|
|
264
264
|
route: string;
|
|
265
265
|
method: string;
|
|
@@ -271,58 +271,11 @@ export interface ToolLogEntry {
|
|
|
271
271
|
requestId?: string;
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
-
/**
|
|
275
|
-
* Log a tool invocation (async, non-blocking).
|
|
276
|
-
*/
|
|
277
274
|
export function logToolCall(entry: ToolLogEntry): void {
|
|
278
275
|
const logEntry = formatLogEntry('TOOL', `${entry.method} ${entry.route}`, entry);
|
|
279
276
|
writeLogAsync(TOOLS_LOG, logEntry);
|
|
280
277
|
}
|
|
281
278
|
|
|
282
|
-
/**
|
|
283
|
-
* Log a successful tool result.
|
|
284
|
-
*/
|
|
285
|
-
export function logToolSuccess(
|
|
286
|
-
tool: string,
|
|
287
|
-
route: string,
|
|
288
|
-
method: string,
|
|
289
|
-
params: Record<string, unknown>,
|
|
290
|
-
duration: number,
|
|
291
|
-
resultSize: number
|
|
292
|
-
): void {
|
|
293
|
-
logToolCall({
|
|
294
|
-
tool,
|
|
295
|
-
route,
|
|
296
|
-
method,
|
|
297
|
-
params,
|
|
298
|
-
duration,
|
|
299
|
-
success: true,
|
|
300
|
-
resultSize,
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
/**
|
|
305
|
-
* Log a failed tool invocation.
|
|
306
|
-
*/
|
|
307
|
-
export function logToolError(
|
|
308
|
-
tool: string,
|
|
309
|
-
route: string,
|
|
310
|
-
method: string,
|
|
311
|
-
params: Record<string, unknown>,
|
|
312
|
-
duration: number,
|
|
313
|
-
error: string
|
|
314
|
-
): void {
|
|
315
|
-
logToolCall({
|
|
316
|
-
tool,
|
|
317
|
-
route,
|
|
318
|
-
method,
|
|
319
|
-
params,
|
|
320
|
-
duration,
|
|
321
|
-
success: false,
|
|
322
|
-
error,
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
|
|
326
279
|
// ============================================================================
|
|
327
280
|
// Utility Functions
|
|
328
281
|
// ============================================================================
|
|
@@ -334,20 +287,6 @@ export function getLogsPath(): string {
|
|
|
334
287
|
return LOGS_DIR;
|
|
335
288
|
}
|
|
336
289
|
|
|
337
|
-
/**
|
|
338
|
-
* Get the path to the errors log file.
|
|
339
|
-
*/
|
|
340
|
-
export function getErrorLogPath(): string {
|
|
341
|
-
return ERROR_LOG;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Get the path to the tools log file.
|
|
346
|
-
*/
|
|
347
|
-
export function getToolsLogPath(): string {
|
|
348
|
-
return TOOLS_LOG;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
290
|
/**
|
|
352
291
|
* Initialize logger synchronously (call at startup).
|
|
353
292
|
* After startup, all operations are async.
|
|
@@ -356,41 +295,6 @@ export function initializeLogger(): void {
|
|
|
356
295
|
ensureLogsDirSync();
|
|
357
296
|
}
|
|
358
297
|
|
|
359
|
-
// ============================================================================
|
|
360
|
-
// Express Middleware Integration
|
|
361
|
-
// ============================================================================
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* Create a logging middleware that logs tool invocations.
|
|
365
|
-
* Use this to wrap route handlers for automatic logging.
|
|
366
|
-
*/
|
|
367
|
-
export function createToolLogger(toolName: string) {
|
|
368
|
-
return (
|
|
369
|
-
req: { method: string; path: string; query: unknown },
|
|
370
|
-
res: { statusCode: number; on: (event: string, cb: () => void) => void },
|
|
371
|
-
next: () => void
|
|
372
|
-
): void => {
|
|
373
|
-
const start = Date.now();
|
|
374
|
-
|
|
375
|
-
res.on('finish', () => {
|
|
376
|
-
const duration = Date.now() - start;
|
|
377
|
-
const success = res.statusCode < 400;
|
|
378
|
-
|
|
379
|
-
logToolCall({
|
|
380
|
-
tool: toolName,
|
|
381
|
-
route: req.path,
|
|
382
|
-
method: req.method,
|
|
383
|
-
params: req.query as Record<string, unknown>,
|
|
384
|
-
duration,
|
|
385
|
-
success,
|
|
386
|
-
error: success ? undefined : `HTTP ${res.statusCode}`,
|
|
387
|
-
});
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
next();
|
|
391
|
-
};
|
|
392
|
-
}
|
|
393
|
-
|
|
394
298
|
// ============================================================================
|
|
395
299
|
// Security Utilities
|
|
396
300
|
// ============================================================================
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* @module utils/resilience
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { withCircuitBreaker
|
|
8
|
-
import { withRetry,
|
|
7
|
+
import { withCircuitBreaker } from './circuitBreaker.js';
|
|
8
|
+
import { withRetry, RETRY_CONFIGS } from './retry.js';
|
|
9
9
|
import { withTimeout } from './asyncTimeout.js';
|
|
10
10
|
|
|
11
11
|
/** Default timeout for MCP tool calls (30 seconds) */
|
|
@@ -52,16 +52,6 @@ const TOOL_CIRCUIT_MAP: Record<string, string> = {
|
|
|
52
52
|
packageSearch: 'package',
|
|
53
53
|
};
|
|
54
54
|
|
|
55
|
-
/**
|
|
56
|
-
* Combined resilience configuration
|
|
57
|
-
*/
|
|
58
|
-
export interface ResilienceConfig {
|
|
59
|
-
circuitBreaker?: Partial<CircuitBreakerConfig>;
|
|
60
|
-
retry?: RetryConfig;
|
|
61
|
-
/** Fallback value when circuit is open */
|
|
62
|
-
fallback?: () => unknown;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
55
|
/**
|
|
66
56
|
* Pre-configured resilience strategies
|
|
67
57
|
*/
|
|
@@ -5,38 +5,8 @@
|
|
|
5
5
|
* @module utils/responseFactory
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { FileMatch, PaginationInfo } from '../types/responses.js';
|
|
9
|
-
import { extractFiles, extractPagination, extractTotalMatches } from '../types/responses.js';
|
|
10
8
|
import { isObject, hasProperty, isArray, hasStringProperty, hasNumberProperty } from '../types/guards.js';
|
|
11
9
|
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// Common Extractors (Type-Safe)
|
|
14
|
-
// =============================================================================
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Extract file matches from search results with proper typing
|
|
18
|
-
*/
|
|
19
|
-
export function extractFileMatches(data: unknown): FileMatch[] {
|
|
20
|
-
return extractFiles(data);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Extract pagination info with proper typing
|
|
25
|
-
*/
|
|
26
|
-
export function extractPaginationInfo(data: unknown): PaginationInfo | undefined {
|
|
27
|
-
return extractPagination(data);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Extract total match count with proper typing
|
|
32
|
-
*/
|
|
33
|
-
export function extractMatchCount(data: unknown): number {
|
|
34
|
-
return extractTotalMatches(data);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Safely extract string property
|
|
39
|
-
*/
|
|
40
10
|
export function safeString(obj: unknown, key: string, fallback = ''): string {
|
|
41
11
|
if (hasStringProperty(obj, key)) {
|
|
42
12
|
return obj[key];
|
|
@@ -44,9 +14,6 @@ export function safeString(obj: unknown, key: string, fallback = ''): string {
|
|
|
44
14
|
return fallback;
|
|
45
15
|
}
|
|
46
16
|
|
|
47
|
-
/**
|
|
48
|
-
* Safely extract number property
|
|
49
|
-
*/
|
|
50
17
|
export function safeNumber(obj: unknown, key: string, fallback = 0): number {
|
|
51
18
|
if (hasNumberProperty(obj, key)) {
|
|
52
19
|
return obj[key];
|
|
@@ -54,9 +21,6 @@ export function safeNumber(obj: unknown, key: string, fallback = 0): number {
|
|
|
54
21
|
return fallback;
|
|
55
22
|
}
|
|
56
23
|
|
|
57
|
-
/**
|
|
58
|
-
* Safely extract array property
|
|
59
|
-
*/
|
|
60
24
|
export function safeArray<T>(obj: unknown, key: string): T[] {
|
|
61
25
|
if (isObject(obj) && hasProperty(obj, key) && isArray(obj[key])) {
|
|
62
26
|
return obj[key] as T[];
|
|
@@ -64,9 +28,6 @@ export function safeArray<T>(obj: unknown, key: string): T[] {
|
|
|
64
28
|
return [];
|
|
65
29
|
}
|
|
66
30
|
|
|
67
|
-
/**
|
|
68
|
-
* Extract match locations from a file result
|
|
69
|
-
*/
|
|
70
31
|
export function extractMatchLocations(matches: unknown[]): Array<{
|
|
71
32
|
line: number;
|
|
72
33
|
column?: number;
|
|
@@ -86,9 +47,6 @@ export function extractMatchLocations(matches: unknown[]): Array<{
|
|
|
86
47
|
});
|
|
87
48
|
}
|
|
88
49
|
|
|
89
|
-
/**
|
|
90
|
-
* Transform pagination from MCP format to skill format
|
|
91
|
-
*/
|
|
92
50
|
export function transformPagination(pagination: unknown): { page: number; total: number; hasMore: boolean } | undefined {
|
|
93
51
|
if (!isObject(pagination)) return undefined;
|
|
94
52
|
|
|
@@ -24,19 +24,13 @@ interface McpToolResponse {
|
|
|
24
24
|
isError?: boolean;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
* Research context from the MCP response
|
|
29
|
-
*/
|
|
30
|
-
export interface ResearchContext {
|
|
27
|
+
interface ResearchContext {
|
|
31
28
|
mainResearchGoal?: string;
|
|
32
29
|
researchGoal?: string;
|
|
33
30
|
reasoning?: string;
|
|
34
31
|
}
|
|
35
32
|
|
|
36
|
-
|
|
37
|
-
* Single result item from bulk response
|
|
38
|
-
*/
|
|
39
|
-
export interface BulkResultItem {
|
|
33
|
+
interface BulkResultItem {
|
|
40
34
|
id: number;
|
|
41
35
|
status: 'hasResults' | 'empty' | 'error';
|
|
42
36
|
data: Record<string, unknown>;
|
|
@@ -57,10 +51,7 @@ export interface ParsedResponse {
|
|
|
57
51
|
status: 'hasResults' | 'empty' | 'error' | 'unknown';
|
|
58
52
|
}
|
|
59
53
|
|
|
60
|
-
|
|
61
|
-
* Parsed bulk response with all results
|
|
62
|
-
*/
|
|
63
|
-
export interface ParsedBulkResponse {
|
|
54
|
+
interface ParsedBulkResponse {
|
|
64
55
|
/** All results from bulk query */
|
|
65
56
|
results: BulkResultItem[];
|
|
66
57
|
/** Categorized hints by status */
|
|
@@ -172,19 +163,6 @@ export function parseToolResponse(response: McpToolResponse): ParsedResponse {
|
|
|
172
163
|
return emptyResult;
|
|
173
164
|
}
|
|
174
165
|
|
|
175
|
-
/**
|
|
176
|
-
* Convenience function to get data field with type safety
|
|
177
|
-
*/
|
|
178
|
-
export function getDataField<T>(
|
|
179
|
-
response: McpToolResponse,
|
|
180
|
-
field: string,
|
|
181
|
-
defaultValue: T
|
|
182
|
-
): T {
|
|
183
|
-
const { data } = parseToolResponse(response);
|
|
184
|
-
const value = data[field];
|
|
185
|
-
return value !== undefined ? (value as T) : defaultValue;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
166
|
/**
|
|
189
167
|
* Parse ALL results from a bulk MCP tool response.
|
|
190
168
|
* Use this when handling multiple queries to get all results.
|