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,578 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP-compatible Zod schemas for octocode-research routes.
|
|
3
|
+
*
|
|
4
|
+
* These schemas wrap the authoritative schemas from octocode-mcp/public
|
|
5
|
+
* with HTTP query string preprocessing (string → number/boolean/array).
|
|
6
|
+
*
|
|
7
|
+
* @module validation/schemas
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { z } from 'zod/v4';
|
|
11
|
+
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Import authoritative schemas from octocode-mcp (Source of Truth)
|
|
14
|
+
// =============================================================================
|
|
15
|
+
import {
|
|
16
|
+
// Local Tool Schemas
|
|
17
|
+
RipgrepQuerySchema,
|
|
18
|
+
FetchContentQuerySchema,
|
|
19
|
+
FindFilesQuerySchema,
|
|
20
|
+
ViewStructureQuerySchema,
|
|
21
|
+
// LSP Tool Schemas
|
|
22
|
+
LSPGotoDefinitionQuerySchema,
|
|
23
|
+
LSPFindReferencesQuerySchema,
|
|
24
|
+
LSPCallHierarchyQuerySchema,
|
|
25
|
+
// GitHub Tool Schemas
|
|
26
|
+
GitHubCodeSearchQuerySchema,
|
|
27
|
+
FileContentQuerySchema,
|
|
28
|
+
GitHubReposSearchSingleQuerySchema,
|
|
29
|
+
GitHubViewRepoStructureQuerySchema,
|
|
30
|
+
GitHubPullRequestSearchQuerySchema,
|
|
31
|
+
// Package Search Schemas
|
|
32
|
+
NpmPackageQuerySchema,
|
|
33
|
+
} from 'octocode-mcp/public';
|
|
34
|
+
|
|
35
|
+
// =============================================================================
|
|
36
|
+
// Import HTTP preprocessing utilities
|
|
37
|
+
// =============================================================================
|
|
38
|
+
import {
|
|
39
|
+
toArray,
|
|
40
|
+
safePath,
|
|
41
|
+
numericString,
|
|
42
|
+
requiredNumber,
|
|
43
|
+
booleanString,
|
|
44
|
+
stringArray,
|
|
45
|
+
withResearchDefaults,
|
|
46
|
+
} from './httpPreprocess.js';
|
|
47
|
+
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// Local Route Schemas
|
|
50
|
+
// =============================================================================
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* HTTP schema for localSearchCode (ripgrep)
|
|
54
|
+
* Wraps RipgrepQuerySchema with HTTP preprocessing
|
|
55
|
+
*/
|
|
56
|
+
export const localSearchSchema = z
|
|
57
|
+
.object({
|
|
58
|
+
// Required
|
|
59
|
+
pattern: z.string().min(1, 'Pattern is required'),
|
|
60
|
+
path: safePath,
|
|
61
|
+
|
|
62
|
+
// Workflow mode preset
|
|
63
|
+
mode: z.enum(['discovery', 'paginated', 'detailed']).optional(),
|
|
64
|
+
|
|
65
|
+
// Pattern interpretation
|
|
66
|
+
fixedString: booleanString,
|
|
67
|
+
perlRegex: booleanString,
|
|
68
|
+
|
|
69
|
+
// Case sensitivity
|
|
70
|
+
smartCase: booleanString,
|
|
71
|
+
caseInsensitive: booleanString,
|
|
72
|
+
caseSensitive: booleanString,
|
|
73
|
+
|
|
74
|
+
// Match behavior
|
|
75
|
+
wholeWord: booleanString,
|
|
76
|
+
invertMatch: booleanString,
|
|
77
|
+
multiline: booleanString,
|
|
78
|
+
multilineDotall: booleanString,
|
|
79
|
+
lineRegexp: booleanString,
|
|
80
|
+
|
|
81
|
+
// File filtering
|
|
82
|
+
type: z.string().optional(),
|
|
83
|
+
include: stringArray.optional(),
|
|
84
|
+
exclude: stringArray.optional(),
|
|
85
|
+
excludeDir: stringArray.optional(),
|
|
86
|
+
binaryFiles: z.enum(['text', 'without-match', 'binary']).optional(),
|
|
87
|
+
|
|
88
|
+
// Ignore control
|
|
89
|
+
noIgnore: booleanString,
|
|
90
|
+
hidden: booleanString,
|
|
91
|
+
followSymlinks: booleanString,
|
|
92
|
+
|
|
93
|
+
// Output control
|
|
94
|
+
filesOnly: booleanString,
|
|
95
|
+
filesWithoutMatch: booleanString,
|
|
96
|
+
count: booleanString,
|
|
97
|
+
countMatches: booleanString,
|
|
98
|
+
lineNumbers: booleanString,
|
|
99
|
+
column: booleanString,
|
|
100
|
+
|
|
101
|
+
// Context control
|
|
102
|
+
contextLines: numericString,
|
|
103
|
+
beforeContext: numericString,
|
|
104
|
+
afterContext: numericString,
|
|
105
|
+
context: numericString, // deprecated alias
|
|
106
|
+
matchContentLength: numericString,
|
|
107
|
+
|
|
108
|
+
// Match limiting
|
|
109
|
+
maxMatchesPerFile: numericString,
|
|
110
|
+
maxFiles: numericString,
|
|
111
|
+
maxResults: numericString, // deprecated alias
|
|
112
|
+
|
|
113
|
+
// Pagination
|
|
114
|
+
limit: numericString,
|
|
115
|
+
filesPerPage: numericString,
|
|
116
|
+
filePageNumber: numericString,
|
|
117
|
+
matchesPerPage: numericString,
|
|
118
|
+
|
|
119
|
+
// Stats & output format
|
|
120
|
+
includeStats: booleanString,
|
|
121
|
+
includeDistribution: booleanString,
|
|
122
|
+
jsonOutput: booleanString,
|
|
123
|
+
vimgrepFormat: booleanString,
|
|
124
|
+
|
|
125
|
+
// Advanced options
|
|
126
|
+
threads: numericString,
|
|
127
|
+
mmap: booleanString,
|
|
128
|
+
noUnicode: booleanString,
|
|
129
|
+
encoding: z.string().optional(),
|
|
130
|
+
sort: z.enum(['path', 'modified', 'accessed', 'created']).optional(),
|
|
131
|
+
sortReverse: booleanString,
|
|
132
|
+
noMessages: booleanString,
|
|
133
|
+
passthru: booleanString,
|
|
134
|
+
debug: booleanString,
|
|
135
|
+
showFileLastModified: booleanString,
|
|
136
|
+
|
|
137
|
+
// Research context (optional for HTTP)
|
|
138
|
+
mainResearchGoal: z.string().optional(),
|
|
139
|
+
researchGoal: z.string().optional(),
|
|
140
|
+
reasoning: z.string().optional(),
|
|
141
|
+
})
|
|
142
|
+
.transform((data) => {
|
|
143
|
+
const result = withResearchDefaults(data);
|
|
144
|
+
if (result.contextLines === undefined && data.context !== undefined) {
|
|
145
|
+
result.contextLines = data.context;
|
|
146
|
+
}
|
|
147
|
+
if (result.limit === undefined && data.maxResults !== undefined) {
|
|
148
|
+
result.limit = data.maxResults;
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* HTTP schema for localGetFileContent
|
|
155
|
+
* Wraps FetchContentQuerySchema with HTTP preprocessing
|
|
156
|
+
*/
|
|
157
|
+
export const localContentSchema = z
|
|
158
|
+
.object({
|
|
159
|
+
path: safePath,
|
|
160
|
+
|
|
161
|
+
// Line-based pagination
|
|
162
|
+
startLine: numericString,
|
|
163
|
+
endLine: numericString,
|
|
164
|
+
fullContent: booleanString,
|
|
165
|
+
|
|
166
|
+
// Pattern matching within file
|
|
167
|
+
matchString: z.string().optional(),
|
|
168
|
+
matchStringContextLines: numericString,
|
|
169
|
+
matchStringIsRegex: booleanString,
|
|
170
|
+
matchStringCaseSensitive: booleanString,
|
|
171
|
+
|
|
172
|
+
// Character-based pagination
|
|
173
|
+
charOffset: numericString,
|
|
174
|
+
charLength: numericString,
|
|
175
|
+
|
|
176
|
+
// Research context
|
|
177
|
+
mainResearchGoal: z.string().optional(),
|
|
178
|
+
researchGoal: z.string().optional(),
|
|
179
|
+
reasoning: z.string().optional(),
|
|
180
|
+
})
|
|
181
|
+
.transform(withResearchDefaults);
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Transform human-readable file type to MCP's Unix-style type codes
|
|
185
|
+
*/
|
|
186
|
+
const fileTypeTransform = (val: string | undefined) => {
|
|
187
|
+
if (!val) return undefined;
|
|
188
|
+
const typeMap: Record<string, string | undefined> = {
|
|
189
|
+
file: 'f',
|
|
190
|
+
directory: 'd',
|
|
191
|
+
symlink: 'l',
|
|
192
|
+
block: 'b',
|
|
193
|
+
character: 'c',
|
|
194
|
+
pipe: 'p',
|
|
195
|
+
socket: 's',
|
|
196
|
+
all: undefined,
|
|
197
|
+
f: 'f',
|
|
198
|
+
d: 'd',
|
|
199
|
+
l: 'l',
|
|
200
|
+
b: 'b',
|
|
201
|
+
c: 'c',
|
|
202
|
+
p: 'p',
|
|
203
|
+
s: 's',
|
|
204
|
+
};
|
|
205
|
+
return typeMap[val] ?? val;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* HTTP schema for localFindFiles
|
|
210
|
+
* Wraps FindFilesQuerySchema with HTTP preprocessing
|
|
211
|
+
*/
|
|
212
|
+
export const localFindSchema = z
|
|
213
|
+
.object({
|
|
214
|
+
path: safePath,
|
|
215
|
+
pattern: z.string().optional(),
|
|
216
|
+
name: z.string().optional(),
|
|
217
|
+
names: stringArray.optional(),
|
|
218
|
+
iname: z.string().optional(),
|
|
219
|
+
pathPattern: z.string().optional(),
|
|
220
|
+
regex: z.string().optional(),
|
|
221
|
+
regexType: z.enum(['posix-egrep', 'posix-extended', 'posix-basic']).optional(),
|
|
222
|
+
type: z
|
|
223
|
+
.enum([
|
|
224
|
+
'file', 'directory', 'symlink', 'block', 'character', 'pipe', 'socket', 'all',
|
|
225
|
+
'f', 'd', 'l', 'b', 'c', 'p', 's',
|
|
226
|
+
])
|
|
227
|
+
.optional()
|
|
228
|
+
.transform(fileTypeTransform),
|
|
229
|
+
empty: booleanString,
|
|
230
|
+
executable: booleanString,
|
|
231
|
+
readable: booleanString,
|
|
232
|
+
writable: booleanString,
|
|
233
|
+
permissions: z.string().optional(),
|
|
234
|
+
maxDepth: numericString,
|
|
235
|
+
minDepth: numericString,
|
|
236
|
+
modifiedWithin: z.string().optional(),
|
|
237
|
+
modifiedBefore: z.string().optional(),
|
|
238
|
+
accessedWithin: z.string().optional(),
|
|
239
|
+
sizeGreater: z.string().optional(),
|
|
240
|
+
sizeLess: z.string().optional(),
|
|
241
|
+
excludeDir: stringArray.optional(),
|
|
242
|
+
limit: numericString,
|
|
243
|
+
maxResults: numericString,
|
|
244
|
+
filesPerPage: numericString,
|
|
245
|
+
filePageNumber: numericString,
|
|
246
|
+
charOffset: numericString,
|
|
247
|
+
charLength: numericString,
|
|
248
|
+
details: booleanString,
|
|
249
|
+
showFileLastModified: booleanString,
|
|
250
|
+
mainResearchGoal: z.string().optional(),
|
|
251
|
+
researchGoal: z.string().optional(),
|
|
252
|
+
reasoning: z.string().optional(),
|
|
253
|
+
})
|
|
254
|
+
.transform((data) => {
|
|
255
|
+
const result = withResearchDefaults(data);
|
|
256
|
+
if (result.name === undefined && data.pattern !== undefined) {
|
|
257
|
+
result.name = data.pattern;
|
|
258
|
+
}
|
|
259
|
+
if (result.limit === undefined && data.maxResults !== undefined) {
|
|
260
|
+
result.limit = data.maxResults;
|
|
261
|
+
}
|
|
262
|
+
return result;
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* HTTP schema for localViewStructure
|
|
267
|
+
* Wraps ViewStructureQuerySchema with HTTP preprocessing
|
|
268
|
+
*/
|
|
269
|
+
export const localStructureSchema = z
|
|
270
|
+
.object({
|
|
271
|
+
path: safePath,
|
|
272
|
+
pattern: z.string().optional(),
|
|
273
|
+
directoriesOnly: booleanString,
|
|
274
|
+
filesOnly: booleanString,
|
|
275
|
+
extension: z.string().optional(),
|
|
276
|
+
extensions: z.preprocess(
|
|
277
|
+
(val) => (val === undefined || val === null) ? undefined : toArray(val),
|
|
278
|
+
z.array(z.string()).optional()
|
|
279
|
+
),
|
|
280
|
+
hidden: booleanString,
|
|
281
|
+
showHidden: booleanString,
|
|
282
|
+
depth: numericString,
|
|
283
|
+
recursive: booleanString,
|
|
284
|
+
details: booleanString,
|
|
285
|
+
humanReadable: booleanString,
|
|
286
|
+
summary: booleanString,
|
|
287
|
+
showFileLastModified: booleanString,
|
|
288
|
+
sortBy: z.enum(['name', 'size', 'time', 'extension']).optional(),
|
|
289
|
+
reverse: booleanString,
|
|
290
|
+
limit: numericString,
|
|
291
|
+
entriesPerPage: numericString,
|
|
292
|
+
entryPageNumber: numericString,
|
|
293
|
+
charOffset: numericString,
|
|
294
|
+
charLength: numericString,
|
|
295
|
+
mainResearchGoal: z.string().optional(),
|
|
296
|
+
researchGoal: z.string().optional(),
|
|
297
|
+
reasoning: z.string().optional(),
|
|
298
|
+
})
|
|
299
|
+
.transform((data) => {
|
|
300
|
+
const result = withResearchDefaults(data);
|
|
301
|
+
if (result.hidden === undefined && data.showHidden !== undefined) {
|
|
302
|
+
result.hidden = data.showHidden;
|
|
303
|
+
}
|
|
304
|
+
return result;
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// =============================================================================
|
|
308
|
+
// LSP Route Schemas
|
|
309
|
+
// =============================================================================
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* HTTP schema for lspGotoDefinition
|
|
313
|
+
* Wraps LSPGotoDefinitionQuerySchema with HTTP preprocessing
|
|
314
|
+
*/
|
|
315
|
+
export const lspDefinitionSchema = z
|
|
316
|
+
.object({
|
|
317
|
+
uri: safePath,
|
|
318
|
+
symbolName: z.string().min(1, 'Symbol name is required'),
|
|
319
|
+
lineHint: requiredNumber.refine((n) => n >= 1, 'Line hint must be at least 1'),
|
|
320
|
+
orderHint: numericString.default(0),
|
|
321
|
+
contextLines: numericString.default(5),
|
|
322
|
+
mainResearchGoal: z.string().optional(),
|
|
323
|
+
researchGoal: z.string().optional(),
|
|
324
|
+
reasoning: z.string().optional(),
|
|
325
|
+
})
|
|
326
|
+
.transform(withResearchDefaults);
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* HTTP schema for lspFindReferences
|
|
330
|
+
* Wraps LSPFindReferencesQuerySchema with HTTP preprocessing
|
|
331
|
+
*/
|
|
332
|
+
export const lspReferencesSchema = z
|
|
333
|
+
.object({
|
|
334
|
+
uri: safePath,
|
|
335
|
+
symbolName: z.string().min(1, 'Symbol name is required'),
|
|
336
|
+
lineHint: requiredNumber.refine((n) => n >= 1, 'Line hint must be at least 1'),
|
|
337
|
+
orderHint: numericString.default(0),
|
|
338
|
+
includeDeclaration: booleanString.default(true),
|
|
339
|
+
contextLines: numericString.default(2),
|
|
340
|
+
referencesPerPage: numericString.default(20),
|
|
341
|
+
page: numericString.default(1),
|
|
342
|
+
mainResearchGoal: z.string().optional(),
|
|
343
|
+
researchGoal: z.string().optional(),
|
|
344
|
+
reasoning: z.string().optional(),
|
|
345
|
+
})
|
|
346
|
+
.transform(withResearchDefaults);
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* HTTP schema for lspCallHierarchy
|
|
350
|
+
* Wraps LSPCallHierarchyQuerySchema with HTTP preprocessing
|
|
351
|
+
*/
|
|
352
|
+
export const lspCallsSchema = z
|
|
353
|
+
.object({
|
|
354
|
+
uri: safePath,
|
|
355
|
+
symbolName: z.string().min(1, 'Symbol name is required'),
|
|
356
|
+
lineHint: requiredNumber.refine((n) => n >= 1, 'Line hint must be at least 1'),
|
|
357
|
+
orderHint: numericString.default(0),
|
|
358
|
+
direction: z.enum(['incoming', 'outgoing'], {
|
|
359
|
+
error: "Direction must be 'incoming' or 'outgoing'",
|
|
360
|
+
}),
|
|
361
|
+
depth: numericString.default(1),
|
|
362
|
+
contextLines: numericString.default(2),
|
|
363
|
+
callsPerPage: numericString.default(15),
|
|
364
|
+
page: numericString.default(1),
|
|
365
|
+
mainResearchGoal: z.string().optional(),
|
|
366
|
+
researchGoal: z.string().optional(),
|
|
367
|
+
reasoning: z.string().optional(),
|
|
368
|
+
})
|
|
369
|
+
.transform(withResearchDefaults);
|
|
370
|
+
|
|
371
|
+
// =============================================================================
|
|
372
|
+
// GitHub Route Schemas
|
|
373
|
+
// =============================================================================
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* HTTP schema for githubSearchCode
|
|
377
|
+
* Wraps GitHubCodeSearchQuerySchema with HTTP preprocessing
|
|
378
|
+
*/
|
|
379
|
+
export const githubSearchSchema = z
|
|
380
|
+
.object({
|
|
381
|
+
keywordsToSearch: stringArray,
|
|
382
|
+
owner: z.string().optional(),
|
|
383
|
+
repo: z.string().optional(),
|
|
384
|
+
path: z.string().optional(),
|
|
385
|
+
extension: z.string().optional(),
|
|
386
|
+
filename: z.string().optional(),
|
|
387
|
+
match: z.enum(['file', 'path']).optional(),
|
|
388
|
+
limit: numericString,
|
|
389
|
+
page: numericString,
|
|
390
|
+
mainResearchGoal: z.string().optional(),
|
|
391
|
+
researchGoal: z.string().optional(),
|
|
392
|
+
reasoning: z.string().optional(),
|
|
393
|
+
})
|
|
394
|
+
.transform(withResearchDefaults);
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* HTTP schema for githubGetFileContent
|
|
398
|
+
* Wraps FileContentQuerySchema with HTTP preprocessing
|
|
399
|
+
*/
|
|
400
|
+
export const githubContentSchema = z
|
|
401
|
+
.object({
|
|
402
|
+
owner: z.string().min(1, 'Owner is required'),
|
|
403
|
+
repo: z.string().min(1, 'Repo is required'),
|
|
404
|
+
path: z.string().min(1, 'Path is required'),
|
|
405
|
+
branch: z.string().optional(),
|
|
406
|
+
fullContent: booleanString,
|
|
407
|
+
startLine: numericString,
|
|
408
|
+
endLine: numericString,
|
|
409
|
+
matchString: z.string().optional(),
|
|
410
|
+
matchStringContextLines: numericString,
|
|
411
|
+
charOffset: numericString,
|
|
412
|
+
charLength: numericString,
|
|
413
|
+
mainResearchGoal: z.string().optional(),
|
|
414
|
+
researchGoal: z.string().optional(),
|
|
415
|
+
reasoning: z.string().optional(),
|
|
416
|
+
})
|
|
417
|
+
.transform(withResearchDefaults);
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* HTTP schema for githubSearchRepositories
|
|
421
|
+
* Wraps GitHubReposSearchSingleQuerySchema with HTTP preprocessing
|
|
422
|
+
*/
|
|
423
|
+
export const githubReposSchema = z
|
|
424
|
+
.object({
|
|
425
|
+
keywordsToSearch: stringArray.optional(),
|
|
426
|
+
topicsToSearch: stringArray.optional(),
|
|
427
|
+
owner: z.string().optional(),
|
|
428
|
+
stars: z.string().optional(),
|
|
429
|
+
size: z.string().optional(),
|
|
430
|
+
created: z.string().optional(),
|
|
431
|
+
updated: z.string().optional(),
|
|
432
|
+
match: z.preprocess(toArray, z.array(z.enum(['name', 'description', 'readme'])).optional()),
|
|
433
|
+
sort: z.enum(['stars', 'forks', 'updated', 'best-match']).optional(),
|
|
434
|
+
limit: numericString,
|
|
435
|
+
page: numericString,
|
|
436
|
+
mainResearchGoal: z.string().optional(),
|
|
437
|
+
researchGoal: z.string().optional(),
|
|
438
|
+
reasoning: z.string().optional(),
|
|
439
|
+
})
|
|
440
|
+
.refine(
|
|
441
|
+
(data) =>
|
|
442
|
+
(data.keywordsToSearch && data.keywordsToSearch.length > 0) ||
|
|
443
|
+
(data.topicsToSearch && data.topicsToSearch.length > 0),
|
|
444
|
+
{
|
|
445
|
+
message: "At least one of 'keywordsToSearch' or 'topicsToSearch' is required",
|
|
446
|
+
path: ['keywordsToSearch'],
|
|
447
|
+
}
|
|
448
|
+
)
|
|
449
|
+
.transform(withResearchDefaults);
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* HTTP schema for githubViewRepoStructure
|
|
453
|
+
* Wraps GitHubViewRepoStructureQuerySchema with HTTP preprocessing
|
|
454
|
+
*/
|
|
455
|
+
export const githubStructureSchema = z
|
|
456
|
+
.object({
|
|
457
|
+
owner: z.string().min(1, 'Owner is required'),
|
|
458
|
+
repo: z.string().min(1, 'Repo is required'),
|
|
459
|
+
branch: z.string().min(1, 'Branch is required'),
|
|
460
|
+
path: z.string().optional(),
|
|
461
|
+
depth: numericString,
|
|
462
|
+
entriesPerPage: numericString,
|
|
463
|
+
entryPageNumber: numericString,
|
|
464
|
+
mainResearchGoal: z.string().optional(),
|
|
465
|
+
researchGoal: z.string().optional(),
|
|
466
|
+
reasoning: z.string().optional(),
|
|
467
|
+
})
|
|
468
|
+
.transform(withResearchDefaults);
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* HTTP schema for githubSearchPullRequests
|
|
472
|
+
* Wraps GitHubPullRequestSearchQuerySchema with HTTP preprocessing
|
|
473
|
+
*/
|
|
474
|
+
export const githubPRsSchema = z
|
|
475
|
+
.object({
|
|
476
|
+
query: z.string().optional(),
|
|
477
|
+
owner: z.string().optional(),
|
|
478
|
+
repo: z.string().optional(),
|
|
479
|
+
prNumber: numericString,
|
|
480
|
+
match: z.preprocess(toArray, z.array(z.enum(['title', 'body', 'comments'])).optional()),
|
|
481
|
+
author: z.string().optional(),
|
|
482
|
+
assignee: z.string().optional(),
|
|
483
|
+
commenter: z.string().optional(),
|
|
484
|
+
involves: z.string().optional(),
|
|
485
|
+
mentions: z.string().optional(),
|
|
486
|
+
'review-requested': z.string().optional(),
|
|
487
|
+
'reviewed-by': z.string().optional(),
|
|
488
|
+
label: z.preprocess(toArray, z.union([z.string(), z.array(z.string())]).optional()),
|
|
489
|
+
'no-label': booleanString,
|
|
490
|
+
'no-milestone': booleanString,
|
|
491
|
+
'no-project': booleanString,
|
|
492
|
+
'no-assignee': booleanString,
|
|
493
|
+
base: z.string().optional(),
|
|
494
|
+
head: z.string().optional(),
|
|
495
|
+
state: z.enum(['open', 'closed']).optional(),
|
|
496
|
+
created: z.string().optional(),
|
|
497
|
+
updated: z.string().optional(),
|
|
498
|
+
closed: z.string().optional(),
|
|
499
|
+
'merged-at': z.string().optional(),
|
|
500
|
+
comments: z.union([numericString, z.string()]).optional(),
|
|
501
|
+
reactions: z.union([numericString, z.string()]).optional(),
|
|
502
|
+
interactions: z.union([numericString, z.string()]).optional(),
|
|
503
|
+
merged: booleanString,
|
|
504
|
+
draft: booleanString,
|
|
505
|
+
withComments: booleanString,
|
|
506
|
+
withCommits: booleanString,
|
|
507
|
+
type: z.enum(['metadata', 'fullContent', 'partialContent']).optional(),
|
|
508
|
+
sort: z.enum(['created', 'updated', 'best-match']).optional(),
|
|
509
|
+
order: z.enum(['asc', 'desc']).optional(),
|
|
510
|
+
limit: numericString,
|
|
511
|
+
page: numericString,
|
|
512
|
+
mainResearchGoal: z.string().optional(),
|
|
513
|
+
researchGoal: z.string().optional(),
|
|
514
|
+
reasoning: z.string().optional(),
|
|
515
|
+
})
|
|
516
|
+
.transform(withResearchDefaults);
|
|
517
|
+
|
|
518
|
+
// =============================================================================
|
|
519
|
+
// Package Route Schemas
|
|
520
|
+
// =============================================================================
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* HTTP schema for packageSearch
|
|
524
|
+
* Wraps PackageSearchQuerySchema with HTTP preprocessing
|
|
525
|
+
*/
|
|
526
|
+
export const packageSearchSchema = z
|
|
527
|
+
.object({
|
|
528
|
+
name: z.string().min(1, 'Package name is required'),
|
|
529
|
+
ecosystem: z.enum(['npm', 'python']).optional().default('npm'),
|
|
530
|
+
searchLimit: numericString,
|
|
531
|
+
npmFetchMetadata: booleanString,
|
|
532
|
+
pythonFetchMetadata: booleanString,
|
|
533
|
+
mainResearchGoal: z.string().optional(),
|
|
534
|
+
researchGoal: z.string().optional(),
|
|
535
|
+
reasoning: z.string().optional(),
|
|
536
|
+
})
|
|
537
|
+
.transform(withResearchDefaults);
|
|
538
|
+
|
|
539
|
+
// =============================================================================
|
|
540
|
+
// Type Exports (derived from schemas)
|
|
541
|
+
// =============================================================================
|
|
542
|
+
|
|
543
|
+
export type LocalSearchQuery = z.output<typeof localSearchSchema>;
|
|
544
|
+
export type LocalContentQuery = z.output<typeof localContentSchema>;
|
|
545
|
+
export type LocalFindQuery = z.output<typeof localFindSchema>;
|
|
546
|
+
export type LocalStructureQuery = z.output<typeof localStructureSchema>;
|
|
547
|
+
|
|
548
|
+
export type LspDefinitionQuery = z.output<typeof lspDefinitionSchema>;
|
|
549
|
+
export type LspReferencesQuery = z.output<typeof lspReferencesSchema>;
|
|
550
|
+
export type LspCallsQuery = z.output<typeof lspCallsSchema>;
|
|
551
|
+
|
|
552
|
+
export type GithubSearchQuery = z.output<typeof githubSearchSchema>;
|
|
553
|
+
export type GithubContentQuery = z.output<typeof githubContentSchema>;
|
|
554
|
+
export type GithubReposQuery = z.output<typeof githubReposSchema>;
|
|
555
|
+
export type GithubStructureQuery = z.output<typeof githubStructureSchema>;
|
|
556
|
+
export type GithubPRsQuery = z.output<typeof githubPRsSchema>;
|
|
557
|
+
|
|
558
|
+
export type PackageSearchQuery = z.output<typeof packageSearchSchema>;
|
|
559
|
+
|
|
560
|
+
// =============================================================================
|
|
561
|
+
// Re-export MCP schemas for reference (if needed by consumers)
|
|
562
|
+
// =============================================================================
|
|
563
|
+
export {
|
|
564
|
+
// These are the authoritative schemas from octocode-mcp
|
|
565
|
+
RipgrepQuerySchema,
|
|
566
|
+
FetchContentQuerySchema,
|
|
567
|
+
FindFilesQuerySchema,
|
|
568
|
+
ViewStructureQuerySchema,
|
|
569
|
+
LSPGotoDefinitionQuerySchema,
|
|
570
|
+
LSPFindReferencesQuerySchema,
|
|
571
|
+
LSPCallHierarchyQuerySchema,
|
|
572
|
+
GitHubCodeSearchQuerySchema,
|
|
573
|
+
FileContentQuerySchema,
|
|
574
|
+
GitHubReposSearchSingleQuerySchema,
|
|
575
|
+
GitHubViewRepoStructureQuerySchema,
|
|
576
|
+
GitHubPullRequestSearchQuerySchema,
|
|
577
|
+
NpmPackageQuerySchema,
|
|
578
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Zod schema for tool call body validation.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes validation logic to avoid duplication across routes.
|
|
5
|
+
*
|
|
6
|
+
* @module validation/toolCallSchema
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { z } from 'zod/v4';
|
|
10
|
+
|
|
11
|
+
// =============================================================================
|
|
12
|
+
// Constants
|
|
13
|
+
// =============================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Maximum number of queries per tool call.
|
|
17
|
+
* Limits parallel execution to prevent resource exhaustion.
|
|
18
|
+
*/
|
|
19
|
+
export const MAX_QUERIES = 3;
|
|
20
|
+
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Schemas
|
|
23
|
+
// =============================================================================
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Schema for individual query objects.
|
|
27
|
+
* Each query must be a non-empty object with arbitrary key-value pairs.
|
|
28
|
+
*/
|
|
29
|
+
const querySchema = z.record(z.string(), z.unknown()).refine(
|
|
30
|
+
(obj) => Object.keys(obj).length > 0,
|
|
31
|
+
{ message: 'Query object cannot be empty' }
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Schema for tool call request body.
|
|
36
|
+
* Requires a queries array with 1-3 items.
|
|
37
|
+
*/
|
|
38
|
+
export const toolCallBodySchema = z.object({
|
|
39
|
+
queries: z
|
|
40
|
+
.array(querySchema)
|
|
41
|
+
.min(1, 'At least one query is required')
|
|
42
|
+
.max(MAX_QUERIES, `Maximum ${MAX_QUERIES} queries per request`),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Inferred type from the schema
|
|
47
|
+
*/
|
|
48
|
+
export type ToolCallBody = z.infer<typeof toolCallBodySchema>;
|
|
49
|
+
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// Validation Function
|
|
52
|
+
// =============================================================================
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Validation result type
|
|
56
|
+
*/
|
|
57
|
+
export interface ValidationResult<T> {
|
|
58
|
+
success: boolean;
|
|
59
|
+
data?: T;
|
|
60
|
+
error?: {
|
|
61
|
+
message: string;
|
|
62
|
+
details: z.core.$ZodIssue[];
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Validate tool call body against schema.
|
|
68
|
+
*
|
|
69
|
+
* @param body - Request body to validate
|
|
70
|
+
* @returns Validation result with data or error details
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const result = validateToolCallBody(req.body);
|
|
75
|
+
* if (!result.success) {
|
|
76
|
+
* res.status(400).json({
|
|
77
|
+
* success: false,
|
|
78
|
+
* hints: [result.error.message, ...result.error.details.map(d => d.message)]
|
|
79
|
+
* });
|
|
80
|
+
* return;
|
|
81
|
+
* }
|
|
82
|
+
* const { queries } = result.data;
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export function validateToolCallBody(body: unknown): ValidationResult<ToolCallBody> {
|
|
86
|
+
const result = toolCallBodySchema.safeParse(body);
|
|
87
|
+
|
|
88
|
+
if (!result.success) {
|
|
89
|
+
const issues = result.error.issues;
|
|
90
|
+
const primaryMessage = issues[0]?.message || 'Invalid request body';
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: {
|
|
95
|
+
message: primaryMessage,
|
|
96
|
+
details: issues,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
data: result.data,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Generate user-friendly hints for validation errors.
|
|
109
|
+
*
|
|
110
|
+
* @param toolName - Name of the tool being called
|
|
111
|
+
* @param error - Validation error details
|
|
112
|
+
* @returns Array of hint strings for the user
|
|
113
|
+
*/
|
|
114
|
+
export function getValidationHints(
|
|
115
|
+
toolName: string,
|
|
116
|
+
error: { message: string; details: z.core.$ZodIssue[] }
|
|
117
|
+
): string[] {
|
|
118
|
+
const hints = [error.message];
|
|
119
|
+
|
|
120
|
+
// Add specific hints based on error type
|
|
121
|
+
const hasQueriesError = error.details.some(
|
|
122
|
+
(d) => d.path.includes('queries') || d.message.includes('queries')
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
if (hasQueriesError) {
|
|
126
|
+
hints.push('Body must contain: { "queries": [{ ... }] }');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
hints.push(`Use GET /tools/info/${toolName} for schema`);
|
|
130
|
+
|
|
131
|
+
return hints;
|
|
132
|
+
}
|