octocode-cli 1.2.7 → 1.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/README.md +42 -35
  2. package/out/octocode-cli.js +36 -11719
  3. package/package.json +36 -36
  4. package/skills/README.md +42 -114
  5. package/skills/{octocode-code-engineer → octocode-engineer}/.claude/settings.local.json +2 -1
  6. package/skills/octocode-engineer/README.md +99 -0
  7. package/skills/octocode-engineer/SKILL.md +499 -0
  8. package/skills/octocode-engineer/build.mjs +29 -0
  9. package/skills/{octocode-code-engineer → octocode-engineer}/eslint.config.mjs +3 -13
  10. package/skills/{octocode-code-engineer → octocode-engineer}/package.json +28 -27
  11. package/skills/octocode-engineer/references/ast-reference.md +166 -0
  12. package/skills/{octocode-code-engineer → octocode-engineer}/references/cli-reference.md +80 -6
  13. package/skills/octocode-engineer/references/externals.md +86 -0
  14. package/skills/{octocode-code-engineer → octocode-engineer}/references/output-files.md +46 -6
  15. package/skills/octocode-engineer/references/quality-indicators.md +202 -0
  16. package/skills/octocode-engineer/references/tool-workflows.md +298 -0
  17. package/skills/octocode-engineer/references/validation-playbooks.md +99 -0
  18. package/skills/octocode-engineer/scripts/ast/search.js +45 -0
  19. package/skills/octocode-engineer/scripts/ast/tree-search.js +27 -0
  20. package/skills/octocode-engineer/scripts/index.js +173 -0
  21. package/skills/octocode-engineer/scripts/run.js +179 -0
  22. package/skills/octocode-engineer/src/analysis/dependencies.ts +378 -0
  23. package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/discovery.test.ts +57 -0
  24. package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/discovery.ts +43 -0
  25. package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/search.test.ts +113 -0
  26. package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/search.ts +64 -1
  27. package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-sitter.test.ts +118 -2
  28. package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-sitter.ts +65 -3
  29. package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/ts-analyzer.test.ts +281 -1
  30. package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/ts-analyzer.ts +173 -3
  31. package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/security.test.ts +73 -0
  32. package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/security.ts +62 -4
  33. package/skills/octocode-engineer/src/detector-gating.test.ts +59 -0
  34. package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/code-quality.ts +342 -0
  35. package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/index.ts +8 -0
  36. package/skills/{octocode-code-engineer → octocode-engineer}/src/index.test.ts +565 -11
  37. package/skills/octocode-engineer/src/index.ts +468 -0
  38. package/skills/octocode-engineer/src/pipeline/affected.test.ts +147 -0
  39. package/skills/octocode-engineer/src/pipeline/affected.ts +68 -0
  40. package/skills/octocode-engineer/src/pipeline/baseline.test.ts +276 -0
  41. package/skills/octocode-engineer/src/pipeline/baseline.ts +76 -0
  42. package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cli.test.ts +300 -53
  43. package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cli.ts +180 -36
  44. package/skills/octocode-engineer/src/pipeline/config-loader.test.ts +264 -0
  45. package/skills/octocode-engineer/src/pipeline/config-loader.ts +109 -0
  46. package/skills/octocode-engineer/src/pipeline/create-options.ts +55 -0
  47. package/skills/octocode-engineer/src/pipeline/health-score.test.ts +65 -0
  48. package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/main.ts +130 -17
  49. package/skills/octocode-engineer/src/pipeline/progress.ts +51 -0
  50. package/skills/octocode-engineer/src/pipeline/reporters.test.ts +155 -0
  51. package/skills/octocode-engineer/src/pipeline/reporters.ts +64 -0
  52. package/skills/octocode-engineer/src/reporting/graph-features.test.ts +279 -0
  53. package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/output-contract.test.ts +6 -0
  54. package/skills/octocode-engineer/src/reporting/summary-md.test.ts +1066 -0
  55. package/skills/octocode-engineer/src/reporting/summary-md.ts +1604 -0
  56. package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/writer.ts +136 -13
  57. package/skills/octocode-engineer/src/run.ts +78 -0
  58. package/skills/{octocode-code-engineer → octocode-engineer}/src/sanity.test.ts +1 -1
  59. package/skills/octocode-engineer/src/types/analysis.ts +25 -0
  60. package/skills/octocode-engineer/src/types/collectors.ts +134 -0
  61. package/skills/{octocode-code-engineer → octocode-engineer}/src/types/constants.ts +75 -41
  62. package/skills/octocode-engineer/src/types/core.ts +203 -0
  63. package/skills/octocode-engineer/src/types/dependency.ts +215 -0
  64. package/skills/octocode-engineer/src/types/file-entry.ts +108 -0
  65. package/skills/octocode-engineer/src/types/findings.ts +105 -0
  66. package/skills/{octocode-code-engineer → octocode-engineer}/src/types/index.ts +60 -30
  67. package/skills/octocode-engineer/src/types/tree-sitter.ts +38 -0
  68. package/skills/{octocode-code-engineer → octocode-engineer}/tsconfig.json +1 -0
  69. package/skills/octocode-research/.octocode/scan/.cache/analysis-cache.json +1 -0
  70. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/architecture.json +1 -0
  71. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/ast-trees.txt +5566 -0
  72. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/code-quality.json +1 -0
  73. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/dead-code.json +1 -0
  74. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/file-inventory.json +1 -0
  75. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/findings.json +1 -0
  76. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/graph.md +189 -0
  77. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/security.json +1 -0
  78. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/summary.json +1 -0
  79. package/skills/octocode-research/.octocode/scan/2026-03-22T10-32-27-073Z/summary.md +265 -0
  80. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/architecture.json +1 -0
  81. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/ast-trees.txt +5555 -0
  82. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/code-quality.json +1 -0
  83. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/dead-code.json +1 -0
  84. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/file-inventory.json +1 -0
  85. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/findings.json +1 -0
  86. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/graph.md +190 -0
  87. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/security.json +1 -0
  88. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/summary.json +1 -0
  89. package/skills/octocode-research/.octocode/scan/2026-03-22T10-40-10-469Z/summary.md +265 -0
  90. package/skills/octocode-research/CHANGELOG.md +60 -0
  91. package/skills/octocode-research/README.md +102 -388
  92. package/skills/octocode-research/SKILL.md +169 -498
  93. package/skills/octocode-research/package.json +19 -31
  94. package/skills/octocode-research/references/PARALLEL_AGENT_PROTOCOL.md +19 -0
  95. package/skills/octocode-research/references/SESSION_MANAGEMENT.md +38 -0
  96. package/skills/octocode-research/scripts/server-init.js +1 -1
  97. package/skills/octocode-research/scripts/server.d.ts +2 -1
  98. package/skills/octocode-research/scripts/server.js +329 -233
  99. package/skills/octocode-research/src/__tests__/integration/promptsRoutes.test.ts +180 -0
  100. package/skills/octocode-research/src/__tests__/integration/serverHttp.test.ts +221 -0
  101. package/skills/octocode-research/src/__tests__/integration/serverLifecycle.test.ts +194 -0
  102. package/skills/octocode-research/src/__tests__/integration/toolsRoutes.test.ts +501 -0
  103. package/skills/octocode-research/src/__tests__/unit/readiness.test.ts +61 -0
  104. package/skills/octocode-research/src/__tests__/unit/resilience.test.ts +192 -0
  105. package/skills/octocode-research/src/__tests__/unit/responseFactory.test.ts +172 -0
  106. package/skills/octocode-research/src/__tests__/unit/responseParser.test.ts +288 -0
  107. package/skills/octocode-research/src/__tests__/unit/schemas.test.ts +509 -0
  108. package/skills/octocode-research/src/index.ts +4 -124
  109. package/skills/octocode-research/src/middleware/queryParser.ts +0 -26
  110. package/skills/octocode-research/src/routes/lsp.ts +58 -59
  111. package/skills/octocode-research/src/routes/package.ts +35 -65
  112. package/skills/octocode-research/src/routes/prompts.ts +3 -3
  113. package/skills/octocode-research/src/routes/tools.ts +8 -20
  114. package/skills/octocode-research/src/server-init.ts +30 -237
  115. package/skills/octocode-research/src/server.ts +50 -23
  116. package/skills/octocode-research/src/types/errorGuards.ts +9 -80
  117. package/skills/octocode-research/src/types/guards.ts +0 -28
  118. package/skills/octocode-research/src/types/mcp.ts +11 -66
  119. package/skills/octocode-research/src/types/responses.ts +11 -129
  120. package/skills/octocode-research/src/utils/circuitBreaker.ts +0 -21
  121. package/skills/octocode-research/src/utils/logger.ts +1 -97
  122. package/skills/octocode-research/src/utils/resilience.ts +2 -12
  123. package/skills/octocode-research/src/utils/responseFactory.ts +0 -42
  124. package/skills/octocode-research/src/utils/responseParser.ts +3 -25
  125. package/skills/octocode-research/src/utils/retry.ts +0 -63
  126. package/skills/octocode-research/src/utils/routeFactory.ts +1 -1
  127. package/skills/octocode-research/src/validation/httpPreprocess.ts +0 -3
  128. package/skills/octocode-research/src/validation/index.ts +0 -1
  129. package/skills/octocode-research/src/validation/schemas.ts +0 -63
  130. package/skills/octocode-research/src/validation/toolCallSchema.ts +3 -3
  131. package/skills/octocode-research/tsdown.config.ts +4 -0
  132. package/skills/octocode-research/vitest.config.ts +3 -0
  133. package/skills/octocode-code-engineer/.plan/VALIDATED_PLAN.md +0 -223
  134. package/skills/octocode-code-engineer/README.md +0 -178
  135. package/skills/octocode-code-engineer/SKILL.md +0 -418
  136. package/skills/octocode-code-engineer/minify-scripts.mjs +0 -32
  137. package/skills/octocode-code-engineer/references/agent-ast-reading-rfc.md +0 -95
  138. package/skills/octocode-code-engineer/references/architecture-techniques.md +0 -121
  139. package/skills/octocode-code-engineer/references/ast-search.md +0 -210
  140. package/skills/octocode-code-engineer/references/ast-tree-search.md +0 -151
  141. package/skills/octocode-code-engineer/references/concepts.md +0 -107
  142. package/skills/octocode-code-engineer/references/finding-categories.md +0 -128
  143. package/skills/octocode-code-engineer/references/improvement-roadmap.md +0 -304
  144. package/skills/octocode-code-engineer/references/playbooks.md +0 -204
  145. package/skills/octocode-code-engineer/references/present-results.md +0 -136
  146. package/skills/octocode-code-engineer/references/tool-workflows.md +0 -566
  147. package/skills/octocode-code-engineer/references/validate-investigate.md +0 -225
  148. package/skills/octocode-code-engineer/scripts/analysis/dependencies.js +0 -1
  149. package/skills/octocode-code-engineer/scripts/analysis/dependency-summary.js +0 -1
  150. package/skills/octocode-code-engineer/scripts/analysis/discovery.js +0 -1
  151. package/skills/octocode-code-engineer/scripts/analysis/graph-analytics.js +0 -1
  152. package/skills/octocode-code-engineer/scripts/analysis/semantic.js +0 -1
  153. package/skills/octocode-code-engineer/scripts/ast/helpers.js +0 -1
  154. package/skills/octocode-code-engineer/scripts/ast/metrics.js +0 -1
  155. package/skills/octocode-code-engineer/scripts/ast/search.js +0 -2
  156. package/skills/octocode-code-engineer/scripts/ast/tree-search.js +0 -2
  157. package/skills/octocode-code-engineer/scripts/ast/tree-sitter.js +0 -1
  158. package/skills/octocode-code-engineer/scripts/ast/ts-analyzer.js +0 -1
  159. package/skills/octocode-code-engineer/scripts/collectors/chains.js +0 -1
  160. package/skills/octocode-code-engineer/scripts/collectors/effects.js +0 -1
  161. package/skills/octocode-code-engineer/scripts/collectors/input-sources.js +0 -1
  162. package/skills/octocode-code-engineer/scripts/collectors/performance.js +0 -1
  163. package/skills/octocode-code-engineer/scripts/collectors/prototype-pollution.js +0 -1
  164. package/skills/octocode-code-engineer/scripts/collectors/security.js +0 -1
  165. package/skills/octocode-code-engineer/scripts/collectors/test-profile.js +0 -1
  166. package/skills/octocode-code-engineer/scripts/common/is-direct-run.js +0 -1
  167. package/skills/octocode-code-engineer/scripts/common/utils.js +0 -1
  168. package/skills/octocode-code-engineer/scripts/detectors/code-quality.js +0 -1
  169. package/skills/octocode-code-engineer/scripts/detectors/cohesion.js +0 -1
  170. package/skills/octocode-code-engineer/scripts/detectors/coupling.js +0 -1
  171. package/skills/octocode-code-engineer/scripts/detectors/cycle.js +0 -1
  172. package/skills/octocode-code-engineer/scripts/detectors/dead-code.js +0 -1
  173. package/skills/octocode-code-engineer/scripts/detectors/import-style.js +0 -1
  174. package/skills/octocode-code-engineer/scripts/detectors/index.js +0 -1
  175. package/skills/octocode-code-engineer/scripts/detectors/security.js +0 -1
  176. package/skills/octocode-code-engineer/scripts/detectors/semantic.js +0 -1
  177. package/skills/octocode-code-engineer/scripts/detectors/shared.js +0 -1
  178. package/skills/octocode-code-engineer/scripts/detectors/test-quality.js +0 -1
  179. package/skills/octocode-code-engineer/scripts/index.js +0 -1
  180. package/skills/octocode-code-engineer/scripts/pipeline/cache.js +0 -1
  181. package/skills/octocode-code-engineer/scripts/pipeline/cli.js +0 -1
  182. package/skills/octocode-code-engineer/scripts/pipeline/main.js +0 -2
  183. package/skills/octocode-code-engineer/scripts/reporting/analysis.js +0 -1
  184. package/skills/octocode-code-engineer/scripts/reporting/summary-md.js +0 -1
  185. package/skills/octocode-code-engineer/scripts/reporting/writer.js +0 -1
  186. package/skills/octocode-code-engineer/scripts/types/constants.js +0 -1
  187. package/skills/octocode-code-engineer/scripts/types/index.js +0 -1
  188. package/skills/octocode-code-engineer/scripts/types/interfaces.js +0 -1
  189. package/skills/octocode-code-engineer/src/analysis/dependencies.ts +0 -406
  190. package/skills/octocode-code-engineer/src/index.ts +0 -403
  191. package/skills/octocode-code-engineer/src/reporting/summary-md.test.ts +0 -421
  192. package/skills/octocode-code-engineer/src/reporting/summary-md.ts +0 -714
  193. package/skills/octocode-code-engineer/src/types/interfaces.ts +0 -682
  194. package/skills/octocode-research/src/types/toolTypes.ts +0 -33
  195. package/skills/octocode-research/src/utils/logEmoji.ts +0 -103
  196. /package/skills/{octocode-code-engineer → octocode-engineer}/.octocode/rfc/RFC-code-engineer-weakness-fixes.md +0 -0
  197. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/architecture.ts.html +0 -0
  198. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/ast-helpers.ts.html +0 -0
  199. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/ast-search.ts.html +0 -0
  200. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/base.css +0 -0
  201. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/block-navigation.js +0 -0
  202. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/cache.ts.html +0 -0
  203. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/cli.ts.html +0 -0
  204. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/clover.xml +0 -0
  205. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-effects.ts.html +0 -0
  206. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-input-sources.ts.html +0 -0
  207. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-performance.ts.html +0 -0
  208. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-prototype-pollution.ts.html +0 -0
  209. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-security.ts.html +0 -0
  210. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/collect-test-profile.ts.html +0 -0
  211. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/coverage-final.json +0 -0
  212. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/dependencies.ts.html +0 -0
  213. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/dependency-summary.ts.html +0 -0
  214. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/discovery.ts.html +0 -0
  215. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/favicon.png +0 -0
  216. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/graph-analytics.ts.html +0 -0
  217. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/index.html +0 -0
  218. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/index.ts.html +0 -0
  219. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/metrics.ts.html +0 -0
  220. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/pipeline.ts.html +0 -0
  221. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/prettify.css +0 -0
  222. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/prettify.js +0 -0
  223. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/report-analysis.ts.html +0 -0
  224. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/report-writer.ts.html +0 -0
  225. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/security-detectors.ts.html +0 -0
  226. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/semantic-detectors.ts.html +0 -0
  227. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/semantic.ts.html +0 -0
  228. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/sort-arrow-sprite.png +0 -0
  229. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/sorter.js +0 -0
  230. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/summary-md.ts.html +0 -0
  231. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/test-quality-detectors.ts.html +0 -0
  232. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/tree-sitter-analyzer.ts.html +0 -0
  233. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/ts-analyzer.ts.html +0 -0
  234. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/types.ts.html +0 -0
  235. /package/skills/{octocode-code-engineer → octocode-engineer}/coverage/utils.ts.html +0 -0
  236. /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/dependencies.test.ts +0 -0
  237. /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/dependency-summary.test.ts +0 -0
  238. /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/dependency-summary.ts +0 -0
  239. /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/graph-analytics.test.ts +0 -0
  240. /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/graph-analytics.ts +0 -0
  241. /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/semantic.test.ts +0 -0
  242. /package/skills/{octocode-code-engineer → octocode-engineer}/src/analysis/semantic.ts +0 -0
  243. /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/helpers.test.ts +0 -0
  244. /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/helpers.ts +0 -0
  245. /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/metrics.test.ts +0 -0
  246. /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/metrics.ts +0 -0
  247. /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-search.test.ts +0 -0
  248. /package/skills/{octocode-code-engineer → octocode-engineer}/src/ast/tree-search.ts +0 -0
  249. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/chains.ts +0 -0
  250. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/effects.test.ts +0 -0
  251. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/effects.ts +0 -0
  252. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/input-sources.test.ts +0 -0
  253. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/input-sources.ts +0 -0
  254. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/performance.test.ts +0 -0
  255. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/performance.ts +0 -0
  256. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/prototype-pollution.test.ts +0 -0
  257. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/prototype-pollution.ts +0 -0
  258. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/test-profile.test.ts +0 -0
  259. /package/skills/{octocode-code-engineer → octocode-engineer}/src/collectors/test-profile.ts +0 -0
  260. /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/is-direct-run.test.ts +0 -0
  261. /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/is-direct-run.ts +0 -0
  262. /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/utils.test.ts +0 -0
  263. /package/skills/{octocode-code-engineer → octocode-engineer}/src/common/utils.ts +0 -0
  264. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/cohesion.ts +0 -0
  265. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/coupling.ts +0 -0
  266. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/cycle.ts +0 -0
  267. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/dead-code.ts +0 -0
  268. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/import-style.ts +0 -0
  269. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/index.test.ts +0 -0
  270. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/security.test.ts +0 -0
  271. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/security.ts +0 -0
  272. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/semantic.ts +0 -0
  273. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/shared.ts +0 -0
  274. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/test-quality.test.ts +0 -0
  275. /package/skills/{octocode-code-engineer → octocode-engineer}/src/detectors/test-quality.ts +0 -0
  276. /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cache.test.ts +0 -0
  277. /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/cache.ts +0 -0
  278. /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline/main.test.ts +0 -0
  279. /package/skills/{octocode-code-engineer → octocode-engineer}/src/pipeline.test.ts +0 -0
  280. /package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/analysis.test.ts +0 -0
  281. /package/skills/{octocode-code-engineer → octocode-engineer}/src/reporting/analysis.ts +0 -0
  282. /package/skills/{octocode-code-engineer → octocode-engineer}/vitest.config.ts +0 -0
@@ -370,8 +370,7 @@ function f() {
370
370
  const maps = emptyMaps();
371
371
  const opts = {
372
372
  ...testOpts,
373
- minFunctionStatements: 6,
374
- minFlowStatements: 1,
373
+ thresholds: { ...testOpts.thresholds, minFunctionStatements: 6, minFlowStatements: 1 },
375
374
  };
376
375
  analyzeTreeSitterFile('/repo/src/big.ts', code, opts, 'test-pkg', maps);
377
376
  expect(maps.flowMap.size).toBeGreaterThan(0);
@@ -403,5 +402,122 @@ function f() {
403
402
  expect(result).not.toBeNull();
404
403
  expect(result!.functions[0].source).toBe('tree-sitter');
405
404
  });
405
+
406
+ it('computes cognitiveComplexity > 0 for nested control flow', () => {
407
+ const code = `function complexFn(x: number, y: boolean) {
408
+ if (x > 0) { // +1
409
+ if (y) { // +2 (1 + nesting=1)
410
+ for (let i = 0; i < x; i++) { // +3 (1 + nesting=2)
411
+ if (i % 2 === 0) { // +4 (1 + nesting=3)
412
+ console.log(i);
413
+ }
414
+ }
415
+ }
416
+ }
417
+ return x;
418
+ }`;
419
+ const result = analyzeTreeSitterFile(
420
+ '/repo/src/cognitive.ts',
421
+ code,
422
+ testOpts,
423
+ 'test-pkg',
424
+ null
425
+ );
426
+ expect(result).not.toBeNull();
427
+ const fn = result!.functions[0];
428
+ expect(fn.cognitiveComplexity).toBeGreaterThanOrEqual(10);
429
+ });
430
+
431
+ it('computes cognitiveComplexity = 0 for simple linear function', () => {
432
+ const code = `function simple() {
433
+ const a = 1;
434
+ const b = 2;
435
+ return a + b;
436
+ }`;
437
+ const result = analyzeTreeSitterFile(
438
+ '/repo/src/simple.ts',
439
+ code,
440
+ testOpts,
441
+ 'test-pkg',
442
+ null
443
+ );
444
+ expect(result).not.toBeNull();
445
+ expect(result!.functions[0].cognitiveComplexity).toBe(0);
446
+ });
447
+
448
+ it('handles else-if without double-counting nesting', () => {
449
+ const code = `function classify(x: number) {
450
+ if (x > 100) {
451
+ return 'high';
452
+ } else if (x > 50) {
453
+ return 'medium';
454
+ } else if (x > 0) {
455
+ return 'low';
456
+ } else {
457
+ return 'none';
458
+ }
459
+ }`;
460
+ const result = analyzeTreeSitterFile(
461
+ '/repo/src/elseif.ts',
462
+ code,
463
+ testOpts,
464
+ 'test-pkg',
465
+ null
466
+ );
467
+ expect(result).not.toBeNull();
468
+ const fn = result!.functions[0];
469
+ expect(fn.cognitiveComplexity).toBeGreaterThan(0);
470
+ expect(fn.cognitiveComplexity).toBeLessThan(10);
471
+ });
472
+
473
+ it('increments for logical operators (&&, ||, ??)', () => {
474
+ const code = `function guard(a: any, b: any, c: any) {
475
+ if (a && b || c) {
476
+ return true;
477
+ }
478
+ return false;
479
+ }`;
480
+ const result = analyzeTreeSitterFile(
481
+ '/repo/src/logical.ts',
482
+ code,
483
+ testOpts,
484
+ 'test-pkg',
485
+ null
486
+ );
487
+ expect(result).not.toBeNull();
488
+ const fn = result!.functions[0];
489
+ expect(fn.cognitiveComplexity).toBeGreaterThanOrEqual(3);
490
+ });
491
+
492
+ it('cognitiveComplexity reflects nesting depth penalty', () => {
493
+ const shallow = `function shallow(x: boolean) { if (x) { return 1; } return 0; }`;
494
+ const deep = `function deep(x: boolean, y: boolean) {
495
+ if (x) {
496
+ if (y) {
497
+ return 1;
498
+ }
499
+ }
500
+ return 0;
501
+ }`;
502
+ const shallowResult = analyzeTreeSitterFile(
503
+ '/repo/src/shallow.ts',
504
+ shallow,
505
+ testOpts,
506
+ 'test-pkg',
507
+ null
508
+ );
509
+ const deepResult = analyzeTreeSitterFile(
510
+ '/repo/src/deep.ts',
511
+ deep,
512
+ testOpts,
513
+ 'test-pkg',
514
+ null
515
+ );
516
+ expect(shallowResult).not.toBeNull();
517
+ expect(deepResult).not.toBeNull();
518
+ expect(deepResult!.functions[0].cognitiveComplexity).toBeGreaterThan(
519
+ shallowResult!.functions[0].cognitiveComplexity
520
+ );
521
+ });
406
522
  }
407
523
  );
@@ -127,6 +127,68 @@ function collectTreeSitterMetrics(
127
127
  return metrics;
128
128
  }
129
129
 
130
+ const COGNITIVE_NESTING_TYPES = new Set([
131
+ 'if_statement',
132
+ 'for_statement',
133
+ 'for_in_statement',
134
+ 'for_of_statement',
135
+ 'for_await_statement',
136
+ 'while_statement',
137
+ 'do_statement',
138
+ 'catch_clause',
139
+ 'conditional_expression',
140
+ 'switch_statement',
141
+ ]);
142
+
143
+ const COGNITIVE_LOGICAL_TYPES = new Set(['&&', '||', '??']);
144
+
145
+ function computeTreeSitterCognitiveComplexity(node: SyntaxNode): number {
146
+ let total = 0;
147
+
148
+ const visit = (current: SyntaxNode, nesting: number): void => {
149
+ let increment = 0;
150
+ let nestable = false;
151
+
152
+ if (COGNITIVE_NESTING_TYPES.has(current.type)) {
153
+ increment = 1;
154
+ nestable = true;
155
+ }
156
+
157
+ if (current.type === 'binary_expression') {
158
+ for (const child of current.children) {
159
+ if (!child.isNamed && COGNITIVE_LOGICAL_TYPES.has(child.type)) {
160
+ increment = 1;
161
+ break;
162
+ }
163
+ }
164
+ }
165
+
166
+ if (
167
+ current.type === 'if_statement' &&
168
+ current.parent?.type === 'else_clause'
169
+ ) {
170
+ increment = 1;
171
+ nestable = false;
172
+ }
173
+
174
+ if (nestable) {
175
+ total += increment + nesting;
176
+ for (const child of current.children) {
177
+ visit(child, nesting + 1);
178
+ }
179
+ return;
180
+ }
181
+
182
+ total += increment;
183
+ for (const child of current.children) {
184
+ visit(child, nesting);
185
+ }
186
+ };
187
+
188
+ visit(node, 0);
189
+ return total;
190
+ }
191
+
130
192
  function inferTreeSitterFunctionName(node: SyntaxNode, _text: string): string {
131
193
  const identifier = node.namedChildren.find(child =>
132
194
  ['identifier', 'property_identifier', 'type_identifier'].includes(
@@ -290,13 +352,13 @@ export function analyzeTreeSitterFile(
290
352
  awaits: metrics.awaits,
291
353
  calls: metrics.calls,
292
354
  loops: metrics.loops,
293
- cognitiveComplexity: 0,
355
+ cognitiveComplexity: computeTreeSitterCognitiveComplexity(node),
294
356
  source: 'tree-sitter',
295
357
  };
296
358
 
297
359
  fileEntry.functions.push(entry);
298
360
 
299
- if (maps && statementCount >= options.minFunctionStatements) {
361
+ if (maps && statementCount >= options.thresholds.minFunctionStatements) {
300
362
  const body = node.namedChildren.find(
301
363
  child => child.type === 'statement_block'
302
364
  );
@@ -325,7 +387,7 @@ export function analyzeTreeSitterFile(
325
387
  };
326
388
  fileEntry.flows.push(flowEntry);
327
389
 
328
- if (maps && statementCount >= options.minFlowStatements) {
390
+ if (maps && statementCount >= options.thresholds.minFlowStatements) {
329
391
  const flowHash = makeTreeSitterFingerprint(node);
330
392
  increment(maps.controlMap, `${flowHash}|${node.type}`, {
331
393
  ...flowEntry,
@@ -400,7 +400,7 @@ describe('analyzeSourceFile', () => {
400
400
  src,
401
401
  'pkg',
402
402
  summary,
403
- { ...testOpts, minFunctionStatements: 6 },
403
+ { ...testOpts, thresholds: { ...testOpts.thresholds, minFunctionStatements: 6 } },
404
404
  maps,
405
405
  [],
406
406
  emptyProfile
@@ -1862,3 +1862,283 @@ describe('collectTestProfile (via analyzeSourceFile)', () => {
1862
1862
  );
1863
1863
  });
1864
1864
  });
1865
+
1866
+ describe('collectSmartQualityData', () => {
1867
+ it('collects magic strings from === comparisons', () => {
1868
+ const code = `
1869
+ function check(status: string) {
1870
+ if (status === 'active') { return 1; }
1871
+ if (status === 'active') { return 2; }
1872
+ if (status === 'inactive') { return 0; }
1873
+ }`;
1874
+ const src = parse(code);
1875
+ const result = analyzeSourceFile(
1876
+ src,
1877
+ 'pkg',
1878
+ emptyPackageSummary(),
1879
+ testOpts,
1880
+ emptyMaps(),
1881
+ [],
1882
+ emptyProfile
1883
+ );
1884
+ expect(result.magicStrings).toBeDefined();
1885
+ expect(result.magicStrings!.length).toBeGreaterThanOrEqual(2);
1886
+ expect(result.magicStrings!.some(ms => ms.value === 'active')).toBe(true);
1887
+ });
1888
+
1889
+ it('collects magic strings from switch/case clauses', () => {
1890
+ const code = `
1891
+ function handle(action: string) {
1892
+ switch (action) {
1893
+ case 'create': return 1;
1894
+ case 'update': return 2;
1895
+ case 'create': return 3;
1896
+ }
1897
+ }`;
1898
+ const src = parse(code);
1899
+ const result = analyzeSourceFile(
1900
+ src,
1901
+ 'pkg',
1902
+ emptyPackageSummary(),
1903
+ testOpts,
1904
+ emptyMaps(),
1905
+ [],
1906
+ emptyProfile
1907
+ );
1908
+ expect(result.magicStrings).toBeDefined();
1909
+ expect(result.magicStrings!.some(ms => ms.value === 'create')).toBe(true);
1910
+ });
1911
+
1912
+ it('does not collect magic strings from test files', () => {
1913
+ const code = `
1914
+ function check(s: string) {
1915
+ if (s === 'test') return 1;
1916
+ if (s === 'test') return 2;
1917
+ }`;
1918
+ const src = ts.createSourceFile(
1919
+ '/repo/src/__tests__/check.test.ts',
1920
+ code,
1921
+ ts.ScriptTarget.ESNext,
1922
+ true
1923
+ );
1924
+ const result = analyzeSourceFile(
1925
+ src,
1926
+ 'pkg',
1927
+ emptyPackageSummary(),
1928
+ testOpts,
1929
+ emptyMaps(),
1930
+ [],
1931
+ emptyProfile
1932
+ );
1933
+ expect(result.magicStrings).toBeUndefined();
1934
+ });
1935
+
1936
+ it('collects catch-rethrow patterns', () => {
1937
+ const code = `
1938
+ function risky() {
1939
+ try {
1940
+ doStuff();
1941
+ } catch (e) {
1942
+ throw e;
1943
+ }
1944
+ }`;
1945
+ const src = parse(code);
1946
+ const result = analyzeSourceFile(
1947
+ src,
1948
+ 'pkg',
1949
+ emptyPackageSummary(),
1950
+ testOpts,
1951
+ emptyMaps(),
1952
+ [],
1953
+ emptyProfile
1954
+ );
1955
+ expect(result.catchRethrows).toBeDefined();
1956
+ expect(result.catchRethrows!.length).toBe(1);
1957
+ });
1958
+
1959
+ it('does not flag catch blocks that transform errors', () => {
1960
+ const code = `
1961
+ function safe() {
1962
+ try { doStuff(); } catch (e) { console.error(e); throw new Error('wrapped'); }
1963
+ }`;
1964
+ const src = parse(code);
1965
+ const result = analyzeSourceFile(
1966
+ src,
1967
+ 'pkg',
1968
+ emptyPackageSummary(),
1969
+ testOpts,
1970
+ emptyMaps(),
1971
+ [],
1972
+ emptyProfile
1973
+ );
1974
+ expect(result.catchRethrows).toBeUndefined();
1975
+ });
1976
+
1977
+ it('does not flag catch blocks with multiple statements', () => {
1978
+ const code = `
1979
+ function logged() {
1980
+ try { doStuff(); } catch (e) { console.error(e); throw e; }
1981
+ }`;
1982
+ const src = parse(code);
1983
+ const result = analyzeSourceFile(
1984
+ src,
1985
+ 'pkg',
1986
+ emptyPackageSummary(),
1987
+ testOpts,
1988
+ emptyMaps(),
1989
+ [],
1990
+ emptyProfile
1991
+ );
1992
+ expect(result.catchRethrows).toBeUndefined();
1993
+ });
1994
+
1995
+ it('collects boolean parameter clusters', () => {
1996
+ const code = `
1997
+ function configure(verbose: boolean, debug: boolean, strict: boolean) {
1998
+ return { verbose, debug, strict };
1999
+ }`;
2000
+ const src = parse(code);
2001
+ const result = analyzeSourceFile(
2002
+ src,
2003
+ 'pkg',
2004
+ emptyPackageSummary(),
2005
+ testOpts,
2006
+ emptyMaps(),
2007
+ [],
2008
+ emptyProfile
2009
+ );
2010
+ expect(result.booleanParamClusters).toBeDefined();
2011
+ expect(result.booleanParamClusters!.length).toBe(1);
2012
+ expect(result.booleanParamClusters![0].booleanCount).toBe(3);
2013
+ expect(result.booleanParamClusters![0].totalParams).toBe(3);
2014
+ });
2015
+
2016
+ it('does not flag functions with fewer than 3 boolean params', () => {
2017
+ const code = `function toggle(a: boolean, b: boolean) { return a && b; }`;
2018
+ const src = parse(code);
2019
+ const result = analyzeSourceFile(
2020
+ src,
2021
+ 'pkg',
2022
+ emptyPackageSummary(),
2023
+ testOpts,
2024
+ emptyMaps(),
2025
+ [],
2026
+ emptyProfile
2027
+ );
2028
+ expect(result.booleanParamClusters).toBeUndefined();
2029
+ });
2030
+
2031
+ it('collects unhandled Promise.all calls', () => {
2032
+ const code = `
2033
+ async function loadAll() {
2034
+ const results = await Promise.all([fetch('/a'), fetch('/b')]);
2035
+ return results;
2036
+ }`;
2037
+ const src = parse(code);
2038
+ const result = analyzeSourceFile(
2039
+ src,
2040
+ 'pkg',
2041
+ emptyPackageSummary(),
2042
+ testOpts,
2043
+ emptyMaps(),
2044
+ [],
2045
+ emptyProfile
2046
+ );
2047
+ expect(result.promiseAllUnhandled).toBeDefined();
2048
+ expect(result.promiseAllUnhandled!.length).toBe(1);
2049
+ expect(result.promiseAllUnhandled![0].kind).toBe('Promise.all');
2050
+ });
2051
+
2052
+ it('does not flag Promise.all inside try-catch', () => {
2053
+ const code = `
2054
+ async function safeFetch() {
2055
+ try {
2056
+ const results = await Promise.all([fetch('/a')]);
2057
+ return results;
2058
+ } catch (e) {
2059
+ return [];
2060
+ }
2061
+ }`;
2062
+ const src = parse(code);
2063
+ const result = analyzeSourceFile(
2064
+ src,
2065
+ 'pkg',
2066
+ emptyPackageSummary(),
2067
+ testOpts,
2068
+ emptyMaps(),
2069
+ [],
2070
+ emptyProfile
2071
+ );
2072
+ expect(result.promiseAllUnhandled).toBeUndefined();
2073
+ });
2074
+
2075
+ it('does not flag Promise.all with .catch() chain', () => {
2076
+ const code = `
2077
+ async function safeFetch() {
2078
+ const results = await Promise.all([fetch('/a')]).catch(() => []);
2079
+ return results;
2080
+ }`;
2081
+ const src = parse(code);
2082
+ const result = analyzeSourceFile(
2083
+ src,
2084
+ 'pkg',
2085
+ emptyPackageSummary(),
2086
+ testOpts,
2087
+ emptyMaps(),
2088
+ [],
2089
+ emptyProfile
2090
+ );
2091
+ expect(result.promiseAllUnhandled).toBeUndefined();
2092
+ });
2093
+
2094
+ it('detects Promise.race and Promise.any', () => {
2095
+ const code = `
2096
+ async function raceAndAny() {
2097
+ const first = await Promise.race([fetch('/a'), fetch('/b')]);
2098
+ const any = await Promise.any([fetch('/c'), fetch('/d')]);
2099
+ }`;
2100
+ const src = parse(code);
2101
+ const result = analyzeSourceFile(
2102
+ src,
2103
+ 'pkg',
2104
+ emptyPackageSummary(),
2105
+ testOpts,
2106
+ emptyMaps(),
2107
+ [],
2108
+ emptyProfile
2109
+ );
2110
+ expect(result.promiseAllUnhandled).toBeDefined();
2111
+ expect(result.promiseAllUnhandled!.length).toBe(2);
2112
+ const kinds = result.promiseAllUnhandled!.map(p => p.kind);
2113
+ expect(kinds).toContain('Promise.race');
2114
+ expect(kinds).toContain('Promise.any');
2115
+ });
2116
+
2117
+ it('does not collect smart quality data from test files', () => {
2118
+ const code = `
2119
+ function check(s: string) {
2120
+ if (s === 'test') return 1;
2121
+ if (s === 'test') return 2;
2122
+ try { x(); } catch (e) { throw e; }
2123
+ }`;
2124
+ const src = ts.createSourceFile(
2125
+ '/repo/src/__tests__/check.test.ts',
2126
+ code,
2127
+ ts.ScriptTarget.ESNext,
2128
+ true
2129
+ );
2130
+ const result = analyzeSourceFile(
2131
+ src,
2132
+ 'pkg',
2133
+ emptyPackageSummary(),
2134
+ testOpts,
2135
+ emptyMaps(),
2136
+ [],
2137
+ emptyProfile
2138
+ );
2139
+ expect(result.magicStrings).toBeUndefined();
2140
+ expect(result.catchRethrows).toBeUndefined();
2141
+ expect(result.booleanParamClusters).toBeUndefined();
2142
+ expect(result.promiseAllUnhandled).toBeUndefined();
2143
+ });
2144
+ });