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.
Files changed (303) hide show
  1. package/LICENSE +21 -63
  2. package/README.md +85 -142
  3. package/out/octocode-cli.js +7026 -6945
  4. package/package.json +8 -6
  5. package/skills/README.md +97 -120
  6. package/skills/octocode-code-engineer/.claude/settings.local.json +18 -0
  7. package/skills/octocode-code-engineer/.octocode/rfc/RFC-code-engineer-weakness-fixes.md +255 -0
  8. package/skills/octocode-code-engineer/.plan/VALIDATED_PLAN.md +223 -0
  9. package/skills/octocode-code-engineer/README.md +178 -0
  10. package/skills/octocode-code-engineer/SKILL.md +418 -0
  11. package/skills/octocode-code-engineer/coverage/architecture.ts.html +7828 -0
  12. package/skills/octocode-code-engineer/coverage/ast-helpers.ts.html +211 -0
  13. package/skills/octocode-code-engineer/coverage/ast-search.ts.html +1795 -0
  14. package/skills/octocode-code-engineer/coverage/base.css +224 -0
  15. package/skills/octocode-code-engineer/coverage/block-navigation.js +87 -0
  16. package/skills/octocode-code-engineer/coverage/cache.ts.html +376 -0
  17. package/skills/octocode-code-engineer/coverage/cli.ts.html +982 -0
  18. package/skills/octocode-code-engineer/coverage/clover.xml +3217 -0
  19. package/skills/octocode-code-engineer/coverage/collect-effects.ts.html +664 -0
  20. package/skills/octocode-code-engineer/coverage/collect-input-sources.ts.html +577 -0
  21. package/skills/octocode-code-engineer/coverage/collect-performance.ts.html +331 -0
  22. package/skills/octocode-code-engineer/coverage/collect-prototype-pollution.ts.html +421 -0
  23. package/skills/octocode-code-engineer/coverage/collect-security.ts.html +604 -0
  24. package/skills/octocode-code-engineer/coverage/collect-test-profile.ts.html +589 -0
  25. package/skills/octocode-code-engineer/coverage/coverage-final.json +30 -0
  26. package/skills/octocode-code-engineer/coverage/dependencies.ts.html +997 -0
  27. package/skills/octocode-code-engineer/coverage/dependency-summary.ts.html +688 -0
  28. package/skills/octocode-code-engineer/coverage/discovery.ts.html +322 -0
  29. package/skills/octocode-code-engineer/coverage/favicon.png +0 -0
  30. package/skills/octocode-code-engineer/coverage/graph-analytics.ts.html +1510 -0
  31. package/skills/octocode-code-engineer/coverage/index.html +536 -0
  32. package/skills/octocode-code-engineer/coverage/index.ts.html +826 -0
  33. package/skills/octocode-code-engineer/coverage/metrics.ts.html +553 -0
  34. package/skills/octocode-code-engineer/coverage/pipeline.ts.html +2044 -0
  35. package/skills/octocode-code-engineer/coverage/prettify.css +1 -0
  36. package/skills/octocode-code-engineer/coverage/prettify.js +2 -0
  37. package/skills/octocode-code-engineer/coverage/report-analysis.ts.html +1570 -0
  38. package/skills/octocode-code-engineer/coverage/report-writer.ts.html +1102 -0
  39. package/skills/octocode-code-engineer/coverage/security-detectors.ts.html +1747 -0
  40. package/skills/octocode-code-engineer/coverage/semantic-detectors.ts.html +2152 -0
  41. package/skills/octocode-code-engineer/coverage/semantic.ts.html +1897 -0
  42. package/skills/octocode-code-engineer/coverage/sort-arrow-sprite.png +0 -0
  43. package/skills/octocode-code-engineer/coverage/sorter.js +210 -0
  44. package/skills/octocode-code-engineer/coverage/summary-md.ts.html +1222 -0
  45. package/skills/octocode-code-engineer/coverage/test-quality-detectors.ts.html +1039 -0
  46. package/skills/octocode-code-engineer/coverage/tree-sitter-analyzer.ts.html +955 -0
  47. package/skills/octocode-code-engineer/coverage/ts-analyzer.ts.html +1213 -0
  48. package/skills/octocode-code-engineer/coverage/types.ts.html +2473 -0
  49. package/skills/octocode-code-engineer/coverage/utils.ts.html +820 -0
  50. package/skills/octocode-code-engineer/eslint.config.mjs +54 -0
  51. package/skills/octocode-code-engineer/minify-scripts.mjs +32 -0
  52. package/skills/octocode-code-engineer/package.json +54 -0
  53. package/skills/octocode-code-engineer/references/agent-ast-reading-rfc.md +95 -0
  54. package/skills/octocode-code-engineer/references/architecture-techniques.md +121 -0
  55. package/skills/octocode-code-engineer/references/ast-search.md +210 -0
  56. package/skills/octocode-code-engineer/references/ast-tree-search.md +151 -0
  57. package/skills/octocode-code-engineer/references/cli-reference.md +167 -0
  58. package/skills/octocode-code-engineer/references/concepts.md +107 -0
  59. package/skills/octocode-code-engineer/references/finding-categories.md +128 -0
  60. package/skills/octocode-code-engineer/references/improvement-roadmap.md +304 -0
  61. package/skills/octocode-code-engineer/references/output-files.md +144 -0
  62. package/skills/octocode-code-engineer/references/playbooks.md +204 -0
  63. package/skills/octocode-code-engineer/references/present-results.md +136 -0
  64. package/skills/octocode-code-engineer/references/tool-workflows.md +566 -0
  65. package/skills/octocode-code-engineer/references/validate-investigate.md +225 -0
  66. package/skills/octocode-code-engineer/scripts/analysis/dependencies.js +1 -0
  67. package/skills/octocode-code-engineer/scripts/analysis/dependency-summary.js +1 -0
  68. package/skills/octocode-code-engineer/scripts/analysis/discovery.js +1 -0
  69. package/skills/octocode-code-engineer/scripts/analysis/graph-analytics.js +1 -0
  70. package/skills/octocode-code-engineer/scripts/analysis/semantic.js +1 -0
  71. package/skills/octocode-code-engineer/scripts/ast/helpers.js +1 -0
  72. package/skills/octocode-code-engineer/scripts/ast/metrics.js +1 -0
  73. package/skills/octocode-code-engineer/scripts/ast/search.js +2 -0
  74. package/skills/octocode-code-engineer/scripts/ast/tree-search.js +2 -0
  75. package/skills/octocode-code-engineer/scripts/ast/tree-sitter.js +1 -0
  76. package/skills/octocode-code-engineer/scripts/ast/ts-analyzer.js +1 -0
  77. package/skills/octocode-code-engineer/scripts/collectors/chains.js +1 -0
  78. package/skills/octocode-code-engineer/scripts/collectors/effects.js +1 -0
  79. package/skills/octocode-code-engineer/scripts/collectors/input-sources.js +1 -0
  80. package/skills/octocode-code-engineer/scripts/collectors/performance.js +1 -0
  81. package/skills/octocode-code-engineer/scripts/collectors/prototype-pollution.js +1 -0
  82. package/skills/octocode-code-engineer/scripts/collectors/security.js +1 -0
  83. package/skills/octocode-code-engineer/scripts/collectors/test-profile.js +1 -0
  84. package/skills/octocode-code-engineer/scripts/common/is-direct-run.js +1 -0
  85. package/skills/octocode-code-engineer/scripts/common/utils.js +1 -0
  86. package/skills/octocode-code-engineer/scripts/detectors/code-quality.js +1 -0
  87. package/skills/octocode-code-engineer/scripts/detectors/cohesion.js +1 -0
  88. package/skills/octocode-code-engineer/scripts/detectors/coupling.js +1 -0
  89. package/skills/octocode-code-engineer/scripts/detectors/cycle.js +1 -0
  90. package/skills/octocode-code-engineer/scripts/detectors/dead-code.js +1 -0
  91. package/skills/octocode-code-engineer/scripts/detectors/import-style.js +1 -0
  92. package/skills/octocode-code-engineer/scripts/detectors/index.js +1 -0
  93. package/skills/octocode-code-engineer/scripts/detectors/security.js +1 -0
  94. package/skills/octocode-code-engineer/scripts/detectors/semantic.js +1 -0
  95. package/skills/octocode-code-engineer/scripts/detectors/shared.js +1 -0
  96. package/skills/octocode-code-engineer/scripts/detectors/test-quality.js +1 -0
  97. package/skills/octocode-code-engineer/scripts/index.js +1 -0
  98. package/skills/octocode-code-engineer/scripts/pipeline/cache.js +1 -0
  99. package/skills/octocode-code-engineer/scripts/pipeline/cli.js +1 -0
  100. package/skills/octocode-code-engineer/scripts/pipeline/main.js +2 -0
  101. package/skills/octocode-code-engineer/scripts/reporting/analysis.js +1 -0
  102. package/skills/octocode-code-engineer/scripts/reporting/summary-md.js +1 -0
  103. package/skills/octocode-code-engineer/scripts/reporting/writer.js +1 -0
  104. package/skills/octocode-code-engineer/scripts/types/constants.js +1 -0
  105. package/skills/octocode-code-engineer/scripts/types/index.js +1 -0
  106. package/skills/octocode-code-engineer/scripts/types/interfaces.js +1 -0
  107. package/skills/octocode-code-engineer/src/analysis/dependencies.test.ts +545 -0
  108. package/skills/octocode-code-engineer/src/analysis/dependencies.ts +406 -0
  109. package/skills/octocode-code-engineer/src/analysis/dependency-summary.test.ts +566 -0
  110. package/skills/octocode-code-engineer/src/analysis/dependency-summary.ts +257 -0
  111. package/skills/octocode-code-engineer/src/analysis/discovery.test.ts +420 -0
  112. package/skills/octocode-code-engineer/src/analysis/discovery.ts +87 -0
  113. package/skills/octocode-code-engineer/src/analysis/graph-analytics.test.ts +449 -0
  114. package/skills/octocode-code-engineer/src/analysis/graph-analytics.ts +534 -0
  115. package/skills/octocode-code-engineer/src/analysis/semantic.test.ts +1533 -0
  116. package/skills/octocode-code-engineer/src/analysis/semantic.ts +830 -0
  117. package/skills/octocode-code-engineer/src/ast/helpers.test.ts +185 -0
  118. package/skills/octocode-code-engineer/src/ast/helpers.ts +62 -0
  119. package/skills/octocode-code-engineer/src/ast/metrics.test.ts +304 -0
  120. package/skills/octocode-code-engineer/src/ast/metrics.ts +204 -0
  121. package/skills/octocode-code-engineer/src/ast/search.test.ts +647 -0
  122. package/skills/octocode-code-engineer/src/ast/search.ts +648 -0
  123. package/skills/octocode-code-engineer/src/ast/tree-search.test.ts +199 -0
  124. package/skills/octocode-code-engineer/src/ast/tree-search.ts +392 -0
  125. package/skills/octocode-code-engineer/src/ast/tree-sitter.test.ts +407 -0
  126. package/skills/octocode-code-engineer/src/ast/tree-sitter.ts +402 -0
  127. package/skills/octocode-code-engineer/src/ast/ts-analyzer.test.ts +1864 -0
  128. package/skills/octocode-code-engineer/src/ast/ts-analyzer.ts +509 -0
  129. package/skills/octocode-code-engineer/src/collectors/chains.ts +74 -0
  130. package/skills/octocode-code-engineer/src/collectors/effects.test.ts +490 -0
  131. package/skills/octocode-code-engineer/src/collectors/effects.ts +332 -0
  132. package/skills/octocode-code-engineer/src/collectors/input-sources.test.ts +144 -0
  133. package/skills/octocode-code-engineer/src/collectors/input-sources.ts +196 -0
  134. package/skills/octocode-code-engineer/src/collectors/performance.test.ts +82 -0
  135. package/skills/octocode-code-engineer/src/collectors/performance.ts +141 -0
  136. package/skills/octocode-code-engineer/src/collectors/prototype-pollution.test.ts +55 -0
  137. package/skills/octocode-code-engineer/src/collectors/prototype-pollution.ts +162 -0
  138. package/skills/octocode-code-engineer/src/collectors/security.test.ts +124 -0
  139. package/skills/octocode-code-engineer/src/collectors/security.ts +309 -0
  140. package/skills/octocode-code-engineer/src/collectors/test-profile.test.ts +97 -0
  141. package/skills/octocode-code-engineer/src/collectors/test-profile.ts +269 -0
  142. package/skills/octocode-code-engineer/src/common/is-direct-run.test.ts +32 -0
  143. package/skills/octocode-code-engineer/src/common/is-direct-run.ts +13 -0
  144. package/skills/octocode-code-engineer/src/common/utils.test.ts +463 -0
  145. package/skills/octocode-code-engineer/src/common/utils.ts +304 -0
  146. package/skills/octocode-code-engineer/src/detectors/code-quality.ts +966 -0
  147. package/skills/octocode-code-engineer/src/detectors/cohesion.ts +539 -0
  148. package/skills/octocode-code-engineer/src/detectors/coupling.ts +323 -0
  149. package/skills/octocode-code-engineer/src/detectors/cycle.ts +349 -0
  150. package/skills/octocode-code-engineer/src/detectors/dead-code.ts +320 -0
  151. package/skills/octocode-code-engineer/src/detectors/import-style.ts +376 -0
  152. package/skills/octocode-code-engineer/src/detectors/index.test.ts +3061 -0
  153. package/skills/octocode-code-engineer/src/detectors/index.ts +88 -0
  154. package/skills/octocode-code-engineer/src/detectors/security.test.ts +882 -0
  155. package/skills/octocode-code-engineer/src/detectors/security.ts +821 -0
  156. package/skills/octocode-code-engineer/src/detectors/semantic.ts +758 -0
  157. package/skills/octocode-code-engineer/src/detectors/shared.ts +49 -0
  158. package/skills/octocode-code-engineer/src/detectors/test-quality.test.ts +388 -0
  159. package/skills/octocode-code-engineer/src/detectors/test-quality.ts +367 -0
  160. package/skills/octocode-code-engineer/src/index.test.ts +4425 -0
  161. package/skills/octocode-code-engineer/src/index.ts +403 -0
  162. package/skills/octocode-code-engineer/src/pipeline/cache.test.ts +199 -0
  163. package/skills/octocode-code-engineer/src/pipeline/cache.ts +130 -0
  164. package/skills/octocode-code-engineer/src/pipeline/cli.test.ts +493 -0
  165. package/skills/octocode-code-engineer/src/pipeline/cli.ts +344 -0
  166. package/skills/octocode-code-engineer/src/pipeline/main.test.ts +174 -0
  167. package/skills/octocode-code-engineer/src/pipeline/main.ts +1074 -0
  168. package/skills/octocode-code-engineer/src/pipeline.test.ts +84 -0
  169. package/skills/octocode-code-engineer/src/reporting/analysis.test.ts +782 -0
  170. package/skills/octocode-code-engineer/src/reporting/analysis.ts +688 -0
  171. package/skills/octocode-code-engineer/src/reporting/output-contract.test.ts +463 -0
  172. package/skills/octocode-code-engineer/src/reporting/summary-md.test.ts +421 -0
  173. package/skills/octocode-code-engineer/src/reporting/summary-md.ts +714 -0
  174. package/skills/octocode-code-engineer/src/reporting/writer.ts +430 -0
  175. package/skills/octocode-code-engineer/src/sanity.test.ts +47 -0
  176. package/skills/octocode-code-engineer/src/types/constants.ts +248 -0
  177. package/skills/octocode-code-engineer/src/types/index.ts +80 -0
  178. package/skills/octocode-code-engineer/src/types/interfaces.ts +682 -0
  179. package/skills/octocode-code-engineer/tsconfig.json +17 -0
  180. package/skills/octocode-code-engineer/vitest.config.ts +8 -0
  181. package/skills/octocode-documentation-writer/README.md +113 -0
  182. package/skills/octocode-documentation-writer/SKILL.md +886 -0
  183. package/skills/octocode-documentation-writer/references/agent-discovery-analysis.md +453 -0
  184. package/skills/octocode-documentation-writer/references/agent-documentation-writer.md +255 -0
  185. package/skills/octocode-documentation-writer/references/agent-engineer-questions.md +247 -0
  186. package/skills/octocode-documentation-writer/references/agent-orchestrator.md +370 -0
  187. package/skills/octocode-documentation-writer/references/agent-qa-validator.md +227 -0
  188. package/skills/octocode-documentation-writer/references/agent-researcher.md +250 -0
  189. package/skills/octocode-documentation-writer/schemas/analysis-schema.json +886 -0
  190. package/skills/octocode-documentation-writer/schemas/discovery-tasks.json +96 -0
  191. package/skills/octocode-documentation-writer/schemas/documentation-structure.json +373 -0
  192. package/skills/octocode-documentation-writer/schemas/partial-discovery-schema.json +102 -0
  193. package/skills/octocode-documentation-writer/schemas/partial-research-schema.json +98 -0
  194. package/skills/octocode-documentation-writer/schemas/qa-results-schema.json +113 -0
  195. package/skills/octocode-documentation-writer/schemas/questions-schema.json +228 -0
  196. package/skills/octocode-documentation-writer/schemas/research-schema.json +104 -0
  197. package/skills/octocode-documentation-writer/schemas/state-schema.json +222 -0
  198. package/skills/octocode-documentation-writer/schemas/work-assignments-schema.json +74 -0
  199. package/skills/octocode-plan/SKILL.md +122 -116
  200. package/skills/octocode-prompt-optimizer/SKILL.md +617 -0
  201. package/skills/octocode-pull-request-reviewer/README.md +249 -0
  202. package/skills/octocode-pull-request-reviewer/SKILL.md +479 -0
  203. package/skills/octocode-pull-request-reviewer/references/dependency-check.md +74 -0
  204. package/skills/octocode-pull-request-reviewer/references/domain-reviewers.md +24 -0
  205. package/skills/octocode-pull-request-reviewer/references/execution-lifecycle.md +441 -0
  206. package/skills/octocode-pull-request-reviewer/references/flow-analysis-protocol.md +64 -0
  207. package/skills/octocode-pull-request-reviewer/references/output-template.md +174 -0
  208. package/skills/octocode-pull-request-reviewer/references/parallel-agent-protocol.md +182 -0
  209. package/skills/octocode-pull-request-reviewer/references/review-guidelines.md +26 -0
  210. package/skills/octocode-pull-request-reviewer/references/verification-checklist.md +40 -0
  211. package/skills/octocode-research/.claude/settings.local.json +46 -0
  212. package/skills/octocode-research/.octocode/plan/code-review-fixes/plan.md +312 -0
  213. package/skills/octocode-research/.octocode/plan/code-review-fixes/research.md +212 -0
  214. package/skills/octocode-research/.octocode/plans/NODE_SERVER_START_PLAN.md +755 -0
  215. package/skills/octocode-research/.octocode/research/code-review/research.md +371 -0
  216. package/skills/octocode-research/.octocode/review/IMPROVEMENTS.md +391 -0
  217. package/skills/octocode-research/.octocode/review/REVIEW_PLAN.md +289 -0
  218. package/skills/octocode-research/.octocode/review/REVIEW_REPORT.md +356 -0
  219. package/skills/octocode-research/AGENTS.md +349 -0
  220. package/skills/octocode-research/README.md +494 -0
  221. package/skills/octocode-research/SKILL.md +652 -274
  222. package/skills/octocode-research/docs/API_REFERENCE.md +562 -0
  223. package/skills/octocode-research/docs/ARCHITECTURE.md +554 -0
  224. package/skills/octocode-research/docs/FLOWS.md +577 -0
  225. package/skills/octocode-research/docs/OVERVIEW.md +564 -0
  226. package/skills/octocode-research/docs/SERVER_FLOWS.md +631 -0
  227. package/skills/octocode-research/ecosystem.config.cjs +88 -0
  228. package/skills/octocode-research/eslint.config.mjs +27 -0
  229. package/skills/octocode-research/package.json +84 -0
  230. package/skills/octocode-research/references/GUARDRAILS.md +40 -0
  231. package/skills/octocode-research/references/PARALLEL_AGENT_PROTOCOL.md +178 -0
  232. package/skills/octocode-research/references/roast-prompt.md +149 -0
  233. package/skills/octocode-research/scripts/server-init.d.ts +2 -0
  234. package/skills/octocode-research/scripts/server-init.js +2 -0
  235. package/skills/octocode-research/scripts/server.d.ts +8 -0
  236. package/skills/octocode-research/scripts/server.js +445 -0
  237. package/skills/octocode-research/src/__tests__/integration/circuitBreaker.test.ts +205 -0
  238. package/skills/octocode-research/src/__tests__/integration/routes.test.ts +374 -0
  239. package/skills/octocode-research/src/__tests__/unit/circuitBreaker.test.ts +245 -0
  240. package/skills/octocode-research/src/__tests__/unit/errorHandler.test.ts +183 -0
  241. package/skills/octocode-research/src/__tests__/unit/httpPreprocess.test.ts +157 -0
  242. package/skills/octocode-research/src/__tests__/unit/logger.test.ts +143 -0
  243. package/skills/octocode-research/src/__tests__/unit/queryParser.test.ts +130 -0
  244. package/skills/octocode-research/src/__tests__/unit/responseBuilder.test.ts +469 -0
  245. package/skills/octocode-research/src/__tests__/unit/retry.test.ts +205 -0
  246. package/skills/octocode-research/src/index.ts +186 -0
  247. package/skills/octocode-research/src/mcpCache.ts +49 -0
  248. package/skills/octocode-research/src/middleware/errorHandler.ts +65 -0
  249. package/skills/octocode-research/src/middleware/logger.ts +61 -0
  250. package/skills/octocode-research/src/middleware/queryParser.ts +115 -0
  251. package/skills/octocode-research/src/middleware/readiness.ts +17 -0
  252. package/skills/octocode-research/src/routes/github.ts +197 -0
  253. package/skills/octocode-research/src/routes/local.ts +175 -0
  254. package/skills/octocode-research/src/routes/lsp.ts +177 -0
  255. package/skills/octocode-research/src/routes/package.ts +127 -0
  256. package/skills/octocode-research/src/routes/prompts.ts +138 -0
  257. package/skills/octocode-research/src/routes/tools.ts +677 -0
  258. package/skills/octocode-research/src/server-init.ts +363 -0
  259. package/skills/octocode-research/src/server.ts +285 -0
  260. package/skills/octocode-research/src/types/errorGuards.ts +151 -0
  261. package/skills/octocode-research/src/types/express.d.ts +76 -0
  262. package/skills/octocode-research/src/types/guards.ts +98 -0
  263. package/skills/octocode-research/src/types/mcp.ts +119 -0
  264. package/skills/octocode-research/src/types/responses.ts +199 -0
  265. package/skills/octocode-research/src/types/toolTypes.ts +33 -0
  266. package/skills/octocode-research/src/utils/asyncTimeout.ts +116 -0
  267. package/skills/octocode-research/src/utils/circuitBreaker.ts +492 -0
  268. package/skills/octocode-research/src/utils/colors.ts +53 -0
  269. package/skills/octocode-research/src/utils/errorQueue.ts +71 -0
  270. package/skills/octocode-research/src/utils/logEmoji.ts +103 -0
  271. package/skills/octocode-research/src/utils/logger.ts +413 -0
  272. package/skills/octocode-research/src/utils/resilience.ts +169 -0
  273. package/skills/octocode-research/src/utils/responseBuilder.ts +495 -0
  274. package/skills/octocode-research/src/utils/responseFactory.ts +100 -0
  275. package/skills/octocode-research/src/utils/responseParser.ts +272 -0
  276. package/skills/octocode-research/src/utils/retry.ts +280 -0
  277. package/skills/octocode-research/src/utils/routeFactory.ts +117 -0
  278. package/skills/octocode-research/src/utils/url.ts +20 -0
  279. package/skills/octocode-research/src/validation/httpPreprocess.ts +155 -0
  280. package/skills/octocode-research/src/validation/index.ts +2 -0
  281. package/skills/octocode-research/src/validation/schemas.ts +578 -0
  282. package/skills/octocode-research/src/validation/toolCallSchema.ts +132 -0
  283. package/skills/octocode-research/tsconfig.json +21 -0
  284. package/skills/octocode-research/tsdown.config.ts +42 -0
  285. package/skills/octocode-research/vitest.config.ts +20 -0
  286. package/skills/octocode-researcher/SKILL.md +461 -0
  287. package/skills/octocode-researcher/references/fallbacks.md +120 -0
  288. package/skills/{octocode-local-search → octocode-researcher}/references/tool-reference.md +132 -49
  289. package/skills/{octocode-local-search → octocode-researcher}/references/workflow-patterns.md +204 -4
  290. package/skills/octocode-rfc-generator/SKILL.md +223 -0
  291. package/skills/octocode-rfc-generator/references/rfc-template.md +193 -0
  292. package/skills/octocode-roast/SKILL.md +63 -21
  293. package/skills/octocode-implement/SKILL.md +0 -293
  294. package/skills/octocode-implement/references/execution-phases.md +0 -317
  295. package/skills/octocode-implement/references/tool-reference.md +0 -403
  296. package/skills/octocode-implement/references/workflow-patterns.md +0 -385
  297. package/skills/octocode-local-search/SKILL.md +0 -449
  298. package/skills/octocode-pr-review/SKILL.md +0 -391
  299. package/skills/octocode-pr-review/references/domain-reviewers.md +0 -105
  300. package/skills/octocode-pr-review/references/execution-lifecycle.md +0 -116
  301. package/skills/octocode-pr-review/references/research-flows.md +0 -75
  302. package/skills/octocode-research/references/tool-reference.md +0 -304
  303. 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
+ }