octocode-cli 1.2.5 → 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 +86 -109
  3. package/out/octocode-cli.js +7027 -7014
  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,205 @@
1
+ /**
2
+ * Integration tests for circuit breaker functionality.
3
+ *
4
+ * @module tests/integration/circuitBreaker
5
+ */
6
+
7
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
8
+ import {
9
+ withCircuitBreaker,
10
+ resetCircuit,
11
+ getCircuitState,
12
+ configureCircuit,
13
+ CircuitOpenError,
14
+ } from '../../utils/circuitBreaker.js';
15
+
16
+ describe('Circuit Breaker', () => {
17
+ beforeEach(() => {
18
+ // Reset all circuits before each test
19
+ resetCircuit('test');
20
+ resetCircuit('lsp');
21
+ resetCircuit('github');
22
+ resetCircuit('local');
23
+ });
24
+
25
+ describe('Basic Functionality', () => {
26
+ it('allows requests when circuit is closed', async () => {
27
+ const result = await withCircuitBreaker('test', () => Promise.resolve('ok'));
28
+ expect(result).toBe('ok');
29
+ expect(getCircuitState('test').state).toBe('closed');
30
+ });
31
+
32
+ it('passes through function return values', async () => {
33
+ const expected = { data: 'test', count: 42 };
34
+ const result = await withCircuitBreaker('test', () => Promise.resolve(expected));
35
+ expect(result).toEqual(expected);
36
+ });
37
+
38
+ it('propagates errors while circuit is closed', async () => {
39
+ const error = new Error('test error');
40
+ await expect(
41
+ withCircuitBreaker('test', () => Promise.reject(error))
42
+ ).rejects.toThrow('test error');
43
+ });
44
+ });
45
+
46
+ describe('State Transitions', () => {
47
+ it('opens after reaching failure threshold', async () => {
48
+ // Configure test circuit with low threshold
49
+ configureCircuit('test', {
50
+ failureThreshold: 2,
51
+ successThreshold: 1,
52
+ resetTimeoutMs: 1000,
53
+ });
54
+
55
+ const failingFn = () => Promise.reject(new Error('fail'));
56
+
57
+ // First failure
58
+ await withCircuitBreaker('test', failingFn).catch(() => {});
59
+ expect(getCircuitState('test').state).toBe('closed');
60
+
61
+ // Second failure - should open circuit
62
+ await withCircuitBreaker('test', failingFn).catch(() => {});
63
+ expect(getCircuitState('test').state).toBe('open');
64
+ });
65
+
66
+ it('rejects immediately when circuit is open', async () => {
67
+ // Force circuit open
68
+ configureCircuit('test', {
69
+ failureThreshold: 1,
70
+ successThreshold: 1,
71
+ resetTimeoutMs: 10000,
72
+ });
73
+
74
+ await withCircuitBreaker('test', () => Promise.reject(new Error('fail'))).catch(() => {});
75
+
76
+ // Next call should be rejected immediately
77
+ await expect(
78
+ withCircuitBreaker('test', () => Promise.resolve('ok'))
79
+ ).rejects.toThrow(CircuitOpenError);
80
+ });
81
+
82
+ it('transitions to half-open after reset timeout', async () => {
83
+ vi.useFakeTimers();
84
+
85
+ configureCircuit('test', {
86
+ failureThreshold: 1,
87
+ successThreshold: 1,
88
+ resetTimeoutMs: 1000,
89
+ });
90
+
91
+ // Open the circuit
92
+ await withCircuitBreaker('test', () => Promise.reject(new Error())).catch(() => {});
93
+ expect(getCircuitState('test').state).toBe('open');
94
+
95
+ // Advance time past reset timeout
96
+ vi.advanceTimersByTime(1100);
97
+
98
+ // Next call should be allowed (half-open state)
99
+ const result = await withCircuitBreaker('test', () => Promise.resolve('recovered'));
100
+ expect(result).toBe('recovered');
101
+ expect(getCircuitState('test').state).toBe('closed');
102
+
103
+ vi.useRealTimers();
104
+ });
105
+
106
+ it('closes after success in half-open state', async () => {
107
+ vi.useFakeTimers();
108
+
109
+ configureCircuit('test', {
110
+ failureThreshold: 1,
111
+ successThreshold: 1,
112
+ resetTimeoutMs: 100,
113
+ });
114
+
115
+ // Open circuit
116
+ await withCircuitBreaker('test', () => Promise.reject(new Error())).catch(() => {});
117
+
118
+ // Wait for reset
119
+ vi.advanceTimersByTime(150);
120
+
121
+ // Successful call should close circuit
122
+ await withCircuitBreaker('test', () => Promise.resolve('ok'));
123
+ expect(getCircuitState('test').state).toBe('closed');
124
+
125
+ vi.useRealTimers();
126
+ });
127
+
128
+ it('reopens if failure occurs in half-open state', async () => {
129
+ vi.useFakeTimers();
130
+
131
+ configureCircuit('test', {
132
+ failureThreshold: 1,
133
+ successThreshold: 1,
134
+ resetTimeoutMs: 100,
135
+ });
136
+
137
+ // Open circuit
138
+ await withCircuitBreaker('test', () => Promise.reject(new Error())).catch(() => {});
139
+
140
+ // Wait for reset
141
+ vi.advanceTimersByTime(150);
142
+
143
+ // Another failure should reopen circuit
144
+ await withCircuitBreaker('test', () => Promise.reject(new Error())).catch(() => {});
145
+ expect(getCircuitState('test').state).toBe('open');
146
+
147
+ vi.useRealTimers();
148
+ });
149
+ });
150
+
151
+ describe('Pre-configured Circuits', () => {
152
+ it('has LSP circuit configured', () => {
153
+ expect(getCircuitState('lsp').state).toBe('closed');
154
+ });
155
+
156
+ it('has GitHub circuit configured', () => {
157
+ expect(getCircuitState('github').state).toBe('closed');
158
+ });
159
+ });
160
+
161
+ describe('CircuitOpenError', () => {
162
+ it('includes circuit name and retry time', async () => {
163
+ configureCircuit('test', {
164
+ failureThreshold: 1,
165
+ successThreshold: 1,
166
+ resetTimeoutMs: 5000,
167
+ });
168
+
169
+ await withCircuitBreaker('test', () => Promise.reject(new Error())).catch(() => {});
170
+
171
+ try {
172
+ await withCircuitBreaker('test', () => Promise.resolve());
173
+ expect.fail('Should have thrown');
174
+ } catch (e) {
175
+ expect(e).toBeInstanceOf(CircuitOpenError);
176
+ const error = e as CircuitOpenError;
177
+ expect(error.circuitName).toBe('test');
178
+ expect(error.retryAfterMs).toBeGreaterThan(0);
179
+ expect(error.retryAfterMs).toBeLessThanOrEqual(5000);
180
+ }
181
+ });
182
+ });
183
+
184
+ describe('Reset Functionality', () => {
185
+ it('resets circuit to closed state', async () => {
186
+ configureCircuit('test', {
187
+ failureThreshold: 1,
188
+ successThreshold: 1,
189
+ resetTimeoutMs: 10000,
190
+ });
191
+
192
+ // Open circuit
193
+ await withCircuitBreaker('test', () => Promise.reject(new Error())).catch(() => {});
194
+ expect(getCircuitState('test').state).toBe('open');
195
+
196
+ // Reset
197
+ resetCircuit('test');
198
+ expect(getCircuitState('test').state).toBe('closed');
199
+
200
+ // Should allow requests again
201
+ const result = await withCircuitBreaker('test', () => Promise.resolve('ok'));
202
+ expect(result).toBe('ok');
203
+ });
204
+ });
205
+ });
@@ -0,0 +1,374 @@
1
+ /**
2
+ * Integration tests for route validation and response handling.
3
+ *
4
+ * @module tests/integration/routes
5
+ */
6
+
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
8
+
9
+ import { describe, it, expect, vi } from 'vitest';
10
+ import express from 'express';
11
+ import request from 'supertest';
12
+ import { localRoutes } from '../../routes/local.js';
13
+ import { githubRoutes } from '../../routes/github.js';
14
+ import { lspRoutes } from '../../routes/lsp.js';
15
+ import { packageRoutes } from '../../routes/package.js';
16
+
17
+ // Mock the MCP cache
18
+ vi.mock('../../mcpCache.js', () => ({
19
+ getMcpContent: vi.fn().mockReturnValue({
20
+ tools: {},
21
+ prompts: {},
22
+ instructions: 'Test instructions',
23
+ baseHints: [],
24
+ genericErrorHints: [],
25
+ }),
26
+ initializeMcpContent: vi.fn().mockResolvedValue({}),
27
+ isMcpInitialized: vi.fn().mockReturnValue(true),
28
+ }));
29
+
30
+ // Mock the MCP tools
31
+ vi.mock('../../index.js', () => ({
32
+ localSearchCode: vi.fn().mockResolvedValue({
33
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n files: []\n totalMatches: 0' }],
34
+ }),
35
+ localGetFileContent: vi.fn().mockResolvedValue({
36
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n path: test.ts\n content: "test"' }],
37
+ }),
38
+ localFindFiles: vi.fn().mockResolvedValue({
39
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n files: []' }],
40
+ }),
41
+ localViewStructure: vi.fn().mockResolvedValue({
42
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n structuredOutput: ""' }],
43
+ }),
44
+ githubSearchCode: vi.fn().mockResolvedValue({
45
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n files: []' }],
46
+ }),
47
+ githubGetFileContent: vi.fn().mockResolvedValue({
48
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n content: "test"' }],
49
+ }),
50
+ githubSearchRepositories: vi.fn().mockResolvedValue({
51
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n repositories: []' }],
52
+ }),
53
+ githubViewRepoStructure: vi.fn().mockResolvedValue({
54
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n structure: {}' }],
55
+ }),
56
+ githubSearchPullRequests: vi.fn().mockResolvedValue({
57
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n pull_requests: []' }],
58
+ }),
59
+ lspGotoDefinition: vi.fn().mockResolvedValue({
60
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n definition: null' }],
61
+ }),
62
+ lspFindReferences: vi.fn().mockResolvedValue({
63
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n references: []' }],
64
+ }),
65
+ lspCallHierarchy: vi.fn().mockResolvedValue({
66
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n calls: []' }],
67
+ }),
68
+ packageSearch: vi.fn().mockResolvedValue({
69
+ content: [{ type: 'text', text: 'results:\n - status: hasResults\n data:\n packages: []' }],
70
+ }),
71
+ }));
72
+
73
+ // Create app factory with routes (matching actual server.ts configuration)
74
+ function createApp(): any {
75
+ const app = express();
76
+ app.use(express.json());
77
+ // Routes are mounted at root, matching server.ts
78
+ app.use('/', localRoutes);
79
+ app.use('/', githubRoutes);
80
+ app.use('/', lspRoutes);
81
+ app.use('/', packageRoutes);
82
+ return app;
83
+ }
84
+
85
+ describe('Route Validation', () => {
86
+ describe('Local Routes', () => {
87
+ describe('GET /localSearchCode', () => {
88
+ it('validates required pattern parameter', async () => {
89
+ const res = await request(createApp()).get('/localSearchCode');
90
+ expect(res.status).toBe(400);
91
+ });
92
+
93
+ it('accepts valid search request', async () => {
94
+ const res = await request(createApp())
95
+ .get('/localSearchCode')
96
+ .query({ pattern: 'test', path: '/test' });
97
+ expect(res.status).toBe(200);
98
+ expect(res.body).toHaveProperty('content');
99
+ });
100
+
101
+ it('returns proper response structure', async () => {
102
+ const res = await request(createApp())
103
+ .get('/localSearchCode')
104
+ .query({ pattern: 'test', path: '/test' });
105
+ expect(res.body).toHaveProperty('content');
106
+ expect(Array.isArray(res.body.content)).toBe(true);
107
+ });
108
+ });
109
+
110
+ describe('GET /localGetFileContent', () => {
111
+ it('validates required path parameter', async () => {
112
+ const res = await request(createApp()).get('/localGetFileContent');
113
+ expect(res.status).toBe(400);
114
+ });
115
+
116
+ it('accepts valid content request', async () => {
117
+ const res = await request(createApp())
118
+ .get('/localGetFileContent')
119
+ .query({ path: '/test/file.ts' });
120
+ expect(res.status).toBe(200);
121
+ });
122
+ });
123
+
124
+ describe('GET /localFindFiles', () => {
125
+ it('validates required path parameter', async () => {
126
+ const res = await request(createApp()).get('/localFindFiles');
127
+ expect(res.status).toBe(400);
128
+ });
129
+
130
+ it('accepts valid find request', async () => {
131
+ const res = await request(createApp())
132
+ .get('/localFindFiles')
133
+ .query({ path: '/test' });
134
+ expect(res.status).toBe(200);
135
+ });
136
+ });
137
+
138
+ describe('GET /localViewStructure', () => {
139
+ it('validates required path parameter', async () => {
140
+ const res = await request(createApp()).get('/localViewStructure');
141
+ expect(res.status).toBe(400);
142
+ });
143
+
144
+ it('accepts valid structure request', async () => {
145
+ const res = await request(createApp())
146
+ .get('/localViewStructure')
147
+ .query({ path: '/test' });
148
+ expect(res.status).toBe(200);
149
+ });
150
+ });
151
+ });
152
+
153
+ describe('GitHub Routes', () => {
154
+ describe('GET /githubSearchCode', () => {
155
+ it('validates required parameters', async () => {
156
+ const res = await request(createApp()).get('/githubSearchCode');
157
+ expect(res.status).toBe(400);
158
+ });
159
+
160
+ it('accepts valid search request', async () => {
161
+ const res = await request(createApp())
162
+ .get('/githubSearchCode')
163
+ .query({
164
+ keywordsToSearch: 'test',
165
+ mainResearchGoal: 'test',
166
+ researchGoal: 'test',
167
+ reasoning: 'test',
168
+ });
169
+ expect(res.status).toBe(200);
170
+ });
171
+ });
172
+
173
+ describe('GET /githubGetFileContent', () => {
174
+ it('validates required parameters', async () => {
175
+ const res = await request(createApp()).get('/githubGetFileContent');
176
+ expect(res.status).toBe(400);
177
+ });
178
+
179
+ it('accepts valid content request', async () => {
180
+ const res = await request(createApp())
181
+ .get('/githubGetFileContent')
182
+ .query({
183
+ owner: 'test',
184
+ repo: 'test',
185
+ path: 'test.ts',
186
+ mainResearchGoal: 'test',
187
+ researchGoal: 'test',
188
+ reasoning: 'test',
189
+ });
190
+ expect(res.status).toBe(200);
191
+ });
192
+ });
193
+
194
+ describe('GET /githubSearchRepositories', () => {
195
+ it('validates required keywords or topics', async () => {
196
+ const res = await request(createApp())
197
+ .get('/githubSearchRepositories')
198
+ .query({
199
+ mainResearchGoal: 'test',
200
+ researchGoal: 'test',
201
+ reasoning: 'test',
202
+ });
203
+ expect(res.status).toBe(400);
204
+ });
205
+
206
+ it('accepts valid repos request with keywords', async () => {
207
+ const res = await request(createApp())
208
+ .get('/githubSearchRepositories')
209
+ .query({
210
+ keywordsToSearch: 'test-keyword',
211
+ mainResearchGoal: 'test',
212
+ researchGoal: 'test',
213
+ reasoning: 'test',
214
+ });
215
+ expect(res.status).toBe(200);
216
+ });
217
+
218
+ it('accepts valid repos request with topics', async () => {
219
+ const res = await request(createApp())
220
+ .get('/githubSearchRepositories')
221
+ .query({
222
+ topicsToSearch: 'test-topic',
223
+ mainResearchGoal: 'test',
224
+ researchGoal: 'test',
225
+ reasoning: 'test',
226
+ });
227
+ expect(res.status).toBe(200);
228
+ });
229
+ });
230
+
231
+ describe('GET /githubViewRepoStructure', () => {
232
+ it('validates required parameters', async () => {
233
+ const res = await request(createApp()).get('/githubViewRepoStructure');
234
+ expect(res.status).toBe(400);
235
+ });
236
+
237
+ it('accepts valid structure request', async () => {
238
+ const res = await request(createApp())
239
+ .get('/githubViewRepoStructure')
240
+ .query({
241
+ owner: 'test',
242
+ repo: 'test',
243
+ branch: 'main',
244
+ mainResearchGoal: 'test',
245
+ researchGoal: 'test',
246
+ reasoning: 'test',
247
+ });
248
+ expect(res.status).toBe(200);
249
+ });
250
+ });
251
+
252
+ describe('GET /githubSearchPullRequests', () => {
253
+ it('accepts valid PRs request', async () => {
254
+ const res = await request(createApp())
255
+ .get('/githubSearchPullRequests')
256
+ .query({
257
+ mainResearchGoal: 'test',
258
+ researchGoal: 'test',
259
+ reasoning: 'test',
260
+ });
261
+ expect(res.status).toBe(200);
262
+ });
263
+ });
264
+ });
265
+
266
+ describe('LSP Routes', () => {
267
+ describe('GET /lspGotoDefinition', () => {
268
+ it('validates required parameters', async () => {
269
+ const res = await request(createApp()).get('/lspGotoDefinition');
270
+ expect(res.status).toBe(400);
271
+ });
272
+
273
+ it('accepts valid definition request', async () => {
274
+ const res = await request(createApp())
275
+ .get('/lspGotoDefinition')
276
+ .query({
277
+ uri: 'file:///test.ts',
278
+ symbolName: 'test',
279
+ lineHint: 1,
280
+ });
281
+ expect(res.status).toBe(200);
282
+ });
283
+ });
284
+
285
+ describe('GET /lspFindReferences', () => {
286
+ it('validates required parameters', async () => {
287
+ const res = await request(createApp()).get('/lspFindReferences');
288
+ expect(res.status).toBe(400);
289
+ });
290
+
291
+ it('accepts valid references request', async () => {
292
+ const res = await request(createApp())
293
+ .get('/lspFindReferences')
294
+ .query({
295
+ uri: 'file:///test.ts',
296
+ symbolName: 'test',
297
+ lineHint: 1,
298
+ });
299
+ expect(res.status).toBe(200);
300
+ });
301
+ });
302
+
303
+ describe('GET /lspCallHierarchy', () => {
304
+ it('validates required parameters', async () => {
305
+ const res = await request(createApp()).get('/lspCallHierarchy');
306
+ expect(res.status).toBe(400);
307
+ });
308
+
309
+ it('accepts valid calls request', async () => {
310
+ const res = await request(createApp())
311
+ .get('/lspCallHierarchy')
312
+ .query({
313
+ uri: 'file:///test.ts',
314
+ symbolName: 'test',
315
+ lineHint: 1,
316
+ direction: 'incoming',
317
+ });
318
+ expect(res.status).toBe(200);
319
+ });
320
+ });
321
+ });
322
+
323
+ describe('Package Routes', () => {
324
+ describe('GET /packageSearch', () => {
325
+ it('validates required parameters', async () => {
326
+ const res = await request(createApp()).get('/packageSearch');
327
+ expect(res.status).toBe(400);
328
+ });
329
+
330
+ it('accepts valid npm package search', async () => {
331
+ const res = await request(createApp())
332
+ .get('/packageSearch')
333
+ .query({
334
+ name: 'express',
335
+ ecosystem: 'npm',
336
+ mainResearchGoal: 'test',
337
+ researchGoal: 'test',
338
+ reasoning: 'test',
339
+ });
340
+ expect(res.status).toBe(200);
341
+ });
342
+
343
+ it('accepts valid python package search', async () => {
344
+ const res = await request(createApp())
345
+ .get('/packageSearch')
346
+ .query({
347
+ name: 'requests',
348
+ ecosystem: 'python',
349
+ mainResearchGoal: 'test',
350
+ researchGoal: 'test',
351
+ reasoning: 'test',
352
+ });
353
+ expect(res.status).toBe(200);
354
+ });
355
+ });
356
+ });
357
+
358
+ describe('Response Structure', () => {
359
+ it('includes content array in all responses', async () => {
360
+ const res = await request(createApp())
361
+ .get('/localSearchCode')
362
+ .query({ pattern: 'test', path: '/test' });
363
+ expect(res.body).toHaveProperty('content');
364
+ expect(Array.isArray(res.body.content)).toBe(true);
365
+ });
366
+
367
+ it('includes structuredContent in responses', async () => {
368
+ const res = await request(createApp())
369
+ .get('/localSearchCode')
370
+ .query({ pattern: 'test', path: '/test' });
371
+ expect(res.body).toHaveProperty('structuredContent');
372
+ });
373
+ });
374
+ });