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
@@ -1,421 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- import {
4
- categoryBreakdown,
5
- collectTagCloud,
6
- computeHealthScore,
7
- diverseTopRecommendations,
8
- diversifyFindings,
9
- formatFileSize,
10
- severityBreakdown,
11
- } from './summary-md.js';
12
- import {
13
- ARCHITECTURE_CATEGORIES,
14
- CODE_QUALITY_CATEGORIES,
15
- DEAD_CODE_CATEGORIES,
16
- REPORT_SCHEMA_VERSION,
17
- SECURITY_CATEGORIES,
18
- TEST_QUALITY_CATEGORIES,
19
- } from './writer.js';
20
-
21
- import type { Finding } from '../types/index.js';
22
-
23
- function makeFinding(overrides: Partial<Finding> = {}): Finding {
24
- return {
25
- id: 'test-1',
26
- severity: 'medium',
27
- category: 'code-quality',
28
- title: 'Test finding',
29
- file: 'src/test.ts',
30
- lineStart: 1,
31
- lineEnd: 5,
32
- reason: 'test reason',
33
- files: ['src/test.ts'],
34
- suggestedFix: { strategy: 'test', steps: [] },
35
- ...overrides,
36
- } as Finding;
37
- }
38
-
39
- describe('report-writer constants', () => {
40
- it('REPORT_SCHEMA_VERSION is 1.1.0', () => {
41
- expect(REPORT_SCHEMA_VERSION).toBe('1.1.0');
42
- });
43
-
44
- it('ARCHITECTURE_CATEGORIES is a Set', () => {
45
- expect(ARCHITECTURE_CATEGORIES).toBeInstanceOf(Set);
46
- });
47
-
48
- it('CODE_QUALITY_CATEGORIES is a Set', () => {
49
- expect(CODE_QUALITY_CATEGORIES).toBeInstanceOf(Set);
50
- });
51
-
52
- it('DEAD_CODE_CATEGORIES is a Set', () => {
53
- expect(DEAD_CODE_CATEGORIES).toBeInstanceOf(Set);
54
- });
55
-
56
- it('SECURITY_CATEGORIES is a Set', () => {
57
- expect(SECURITY_CATEGORIES).toBeInstanceOf(Set);
58
- });
59
-
60
- it('TEST_QUALITY_CATEGORIES is a Set', () => {
61
- expect(TEST_QUALITY_CATEGORIES).toBeInstanceOf(Set);
62
- });
63
- });
64
-
65
- describe('severityBreakdown', () => {
66
- it('returns zero counts for empty findings', () => {
67
- const result = severityBreakdown([]);
68
- expect(result).toEqual({
69
- critical: 0,
70
- high: 0,
71
- medium: 0,
72
- low: 0,
73
- info: 0,
74
- });
75
- });
76
-
77
- it('counts single severity correctly', () => {
78
- const findings = [makeFinding({ severity: 'critical' })];
79
- const result = severityBreakdown(findings);
80
- expect(result.critical).toBe(1);
81
- expect(result.high).toBe(0);
82
- });
83
-
84
- it('counts multiple severities correctly', () => {
85
- const findings = [
86
- makeFinding({ id: '1', severity: 'high' }),
87
- makeFinding({ id: '2', severity: 'high' }),
88
- makeFinding({ id: '3', severity: 'medium' }),
89
- makeFinding({ id: '4', severity: 'critical' }),
90
- ];
91
- const result = severityBreakdown(findings);
92
- expect(result.critical).toBe(1);
93
- expect(result.high).toBe(2);
94
- expect(result.medium).toBe(1);
95
- expect(result.low).toBe(0);
96
- expect(result.info).toBe(0);
97
- });
98
-
99
- it('counts all five severities', () => {
100
- const findings = [
101
- makeFinding({ id: '1', severity: 'critical' }),
102
- makeFinding({ id: '2', severity: 'high' }),
103
- makeFinding({ id: '3', severity: 'medium' }),
104
- makeFinding({ id: '4', severity: 'low' }),
105
- makeFinding({ id: '5', severity: 'info' }),
106
- ];
107
- const result = severityBreakdown(findings);
108
- expect(result).toEqual({
109
- critical: 1,
110
- high: 1,
111
- medium: 1,
112
- low: 1,
113
- info: 1,
114
- });
115
- });
116
- });
117
-
118
- describe('categoryBreakdown', () => {
119
- it('returns empty object for empty findings', () => {
120
- expect(categoryBreakdown([])).toEqual({});
121
- });
122
-
123
- it('counts single category correctly', () => {
124
- const findings = [makeFinding({ category: 'dead-export' })];
125
- const result = categoryBreakdown(findings);
126
- expect(result['dead-export']).toBe(1);
127
- });
128
-
129
- it('counts multiple categories correctly', () => {
130
- const findings = [
131
- makeFinding({ id: '1', category: 'dead-export' }),
132
- makeFinding({ id: '2', category: 'dead-export' }),
133
- makeFinding({ id: '3', category: 'dependency-cycle' }),
134
- ];
135
- const result = categoryBreakdown(findings);
136
- expect(result['dead-export']).toBe(2);
137
- expect(result['dependency-cycle']).toBe(1);
138
- });
139
-
140
- it('handles unknown categories', () => {
141
- const findings = [makeFinding({ category: 'custom-category' })];
142
- const result = categoryBreakdown(findings);
143
- expect(result['custom-category']).toBe(1);
144
- });
145
- });
146
-
147
- describe('computeHealthScore', () => {
148
- it('returns 100 for 0 totalFiles', () => {
149
- expect(computeHealthScore([], 0)).toBe(100);
150
- expect(computeHealthScore([makeFinding()], 0)).toBe(100);
151
- });
152
-
153
- it('returns 100 for no findings', () => {
154
- expect(computeHealthScore([], 50)).toBe(100);
155
- });
156
-
157
- it('penalizes critical findings (weight 25)', () => {
158
- const findings = [makeFinding({ severity: 'critical' })];
159
- const score = computeHealthScore(findings, 10);
160
- expect(score).toBe(80);
161
- });
162
-
163
- it('penalizes high findings (weight 10)', () => {
164
- const findings = [makeFinding({ severity: 'high' })];
165
- const score = computeHealthScore(findings, 10);
166
- expect(score).toBe(91);
167
- });
168
-
169
- it('penalizes medium findings (weight 3)', () => {
170
- const findings = [makeFinding({ severity: 'medium' })];
171
- const score = computeHealthScore(findings, 10);
172
- expect(score).toBe(97); // 100 - (3/10)*10 = 97
173
- });
174
-
175
- it('penalizes low findings (weight 1)', () => {
176
- const findings = [makeFinding({ severity: 'low' })];
177
- const score = computeHealthScore(findings, 10);
178
- expect(score).toBe(99); // 100 - (1/10)*10 = 99
179
- });
180
-
181
- it('info severity has weight 0', () => {
182
- const findings = [makeFinding({ severity: 'info' })];
183
- const score = computeHealthScore(findings, 10);
184
- expect(score).toBe(100);
185
- });
186
-
187
- it('penalizes proportional to file count', () => {
188
- const findings = [makeFinding({ severity: 'high' })];
189
- const smallRepo = computeHealthScore(findings, 5);
190
- const largeRepo = computeHealthScore(findings, 100);
191
- expect(largeRepo).toBeGreaterThan(smallRepo);
192
- });
193
-
194
- it('floors at 0', () => {
195
- const findings = Array.from({ length: 10 }, () =>
196
- makeFinding({ id: `f-${Math.random()}`, severity: 'critical' })
197
- );
198
- expect(computeHealthScore(findings, 1)).toBe(4);
199
- });
200
-
201
- it('rounds score to integer', () => {
202
- const findings = [makeFinding({ severity: 'medium' })];
203
- const score = computeHealthScore(findings, 3);
204
- expect(Number.isInteger(score)).toBe(true);
205
- });
206
- });
207
-
208
- describe('collectTagCloud', () => {
209
- it('returns empty for no findings', () => {
210
- expect(collectTagCloud([])).toEqual([]);
211
- });
212
-
213
- it('returns empty when findings have no tags', () => {
214
- expect(collectTagCloud([makeFinding()])).toEqual([]);
215
- });
216
-
217
- it('aggregates tags from single finding', () => {
218
- const findings = [makeFinding({ tags: ['coupling', 'architecture'] })];
219
- const cloud = collectTagCloud(findings);
220
- expect(cloud).toHaveLength(2);
221
- expect(cloud).toContainEqual({ tag: 'coupling', count: 1 });
222
- expect(cloud).toContainEqual({ tag: 'architecture', count: 1 });
223
- });
224
-
225
- it('counts duplicate tags across findings', () => {
226
- const findings = [
227
- makeFinding({ id: '1', tags: ['coupling', 'architecture'] }),
228
- makeFinding({ id: '2', tags: ['coupling', 'change-risk'] }),
229
- makeFinding({ id: '3', tags: ['dead-code'] }),
230
- ];
231
- const cloud = collectTagCloud(findings);
232
- expect(cloud[0]).toEqual({ tag: 'coupling', count: 2 });
233
- expect(cloud.length).toBe(4);
234
- });
235
-
236
- it('sorts by count descending', () => {
237
- const findings = [
238
- makeFinding({ id: '1', tags: ['a', 'b', 'c'] }),
239
- makeFinding({ id: '2', tags: ['a', 'b'] }),
240
- makeFinding({ id: '3', tags: ['a'] }),
241
- ];
242
- const cloud = collectTagCloud(findings);
243
- expect(cloud[0]).toEqual({ tag: 'a', count: 3 });
244
- expect(cloud[1]).toEqual({ tag: 'b', count: 2 });
245
- expect(cloud[2]).toEqual({ tag: 'c', count: 1 });
246
- });
247
-
248
- it('skips findings with undefined tags', () => {
249
- const findings = [
250
- makeFinding({ id: '1', tags: ['valid'] }),
251
- makeFinding({ id: '2' }),
252
- ];
253
- const cloud = collectTagCloud(findings);
254
- expect(cloud).toEqual([{ tag: 'valid', count: 1 }]);
255
- });
256
- });
257
-
258
- describe('formatFileSize', () => {
259
- it('formats bytes as B when < 1024', () => {
260
- expect(formatFileSize(0)).toBe('0 B');
261
- expect(formatFileSize(512)).toBe('512 B');
262
- expect(formatFileSize(1023)).toBe('1023 B');
263
- });
264
-
265
- it('formats as KB when >= 1024 and < 1024*1024', () => {
266
- expect(formatFileSize(1024)).toBe('1.0 KB');
267
- expect(formatFileSize(2048)).toBe('2.0 KB');
268
- expect(formatFileSize(1536)).toBe('1.5 KB');
269
- });
270
-
271
- it('formats as MB when >= 1024*1024', () => {
272
- expect(formatFileSize(1024 * 1024)).toBe('1.0 MB');
273
- expect(formatFileSize(2.5 * 1024 * 1024)).toBe('2.5 MB');
274
- });
275
- });
276
-
277
- describe('diversifyFindings', () => {
278
- const makeDraft = (
279
- severity: Finding['severity'],
280
- category: string,
281
- idx: number
282
- ) =>
283
- makeFinding({
284
- id: `draft-${category}-${idx}`,
285
- severity,
286
- category,
287
- file: `${category}-${idx}.ts`,
288
- });
289
-
290
- it('returns all when limit >= sorted.length', () => {
291
- const input = [makeDraft('high', 'a', 1), makeDraft('high', 'b', 1)];
292
- expect(diversifyFindings(input, 10)).toBe(input);
293
- expect(diversifyFindings(input, 2)).toBe(input);
294
- });
295
-
296
- it('returns all when limit is Infinity', () => {
297
- const input = [makeDraft('high', 'a', 1)];
298
- expect(diversifyFindings(input, Infinity)).toBe(input);
299
- });
300
-
301
- it('returns diverse set across categories when limit < length', () => {
302
- const input = [
303
- ...Array.from({ length: 10 }, (_, i) =>
304
- makeDraft('high', 'await-in-loop', i)
305
- ),
306
- makeDraft('high', 'dead-export', 1),
307
- makeDraft('high', 'dead-export', 2),
308
- ];
309
- const result = diversifyFindings(input, 5);
310
- expect(result).toHaveLength(5);
311
- const categories = new Set(result.map(f => f.category));
312
- expect(categories.size).toBe(2);
313
- });
314
-
315
- it('prioritizes categories by highest severity', () => {
316
- const input = [
317
- makeDraft('critical', 'security', 1),
318
- makeDraft('high', 'quality', 1),
319
- makeDraft('medium', 'dead-code', 1),
320
- ];
321
- const result = diversifyFindings(input, 3);
322
- expect(result[0].category).toBe('security');
323
- expect(result[1].category).toBe('quality');
324
- expect(result[2].category).toBe('dead-code');
325
- });
326
-
327
- it('handles empty input', () => {
328
- expect(diversifyFindings([], 5)).toEqual([]);
329
- });
330
-
331
- it('handles single category', () => {
332
- const input = Array.from({ length: 10 }, (_, i) =>
333
- makeDraft('high', 'only-cat', i)
334
- );
335
- const result = diversifyFindings(input, 3);
336
- expect(result).toHaveLength(3);
337
- expect(result.every(f => f.category === 'only-cat')).toBe(true);
338
- });
339
-
340
- it('handles limit of 1', () => {
341
- const input = [makeDraft('critical', 'a', 1), makeDraft('high', 'b', 1)];
342
- const result = diversifyFindings(input, 1);
343
- expect(result).toHaveLength(1);
344
- expect(result[0].severity).toBe('critical');
345
- });
346
-
347
- it('returns empty when limit is 0 and input has items', () => {
348
- const input = [makeDraft('high', 'a', 1)];
349
- const result = diversifyFindings(input, 0);
350
- expect(result).toEqual([]);
351
- });
352
-
353
- it('handles non-finite limit by returning all', () => {
354
- const input = [makeDraft('high', 'a', 1)];
355
- expect(diversifyFindings(input, NaN)).toBe(input);
356
- });
357
- });
358
-
359
- describe('diverseTopRecommendations', () => {
360
- it('limits findings per category (default maxPerCategory=2)', () => {
361
- const findings = [
362
- makeFinding({ id: '1', category: 'dead-export' }),
363
- makeFinding({ id: '2', category: 'dead-export' }),
364
- makeFinding({ id: '3', category: 'dead-export' }),
365
- makeFinding({ id: '4', category: 'cognitive-complexity' }),
366
- makeFinding({ id: '5', category: 'cognitive-complexity' }),
367
- ];
368
- const result = diverseTopRecommendations(findings, 10);
369
- expect(result).toHaveLength(4);
370
- expect(result.filter(f => f.category === 'dead-export')).toHaveLength(2);
371
- expect(
372
- result.filter(f => f.category === 'cognitive-complexity')
373
- ).toHaveLength(2);
374
- });
375
-
376
- it('respects total limit', () => {
377
- const findings = Array.from({ length: 30 }, (_, i) =>
378
- makeFinding({ id: `${i}`, category: `cat-${i % 10}` })
379
- );
380
- const result = diverseTopRecommendations(findings, 5, 2);
381
- expect(result).toHaveLength(5);
382
- });
383
-
384
- it('returns empty for empty input', () => {
385
- expect(diverseTopRecommendations([], 10)).toHaveLength(0);
386
- });
387
-
388
- it('uses maxPerCategory=1 for maximum diversity', () => {
389
- const findings = [
390
- makeFinding({ id: '1', category: 'a' }),
391
- makeFinding({ id: '2', category: 'a' }),
392
- makeFinding({ id: '3', category: 'b' }),
393
- makeFinding({ id: '4', category: 'b' }),
394
- makeFinding({ id: '5', category: 'c' }),
395
- ];
396
- const result = diverseTopRecommendations(findings, 10, 1);
397
- expect(result).toHaveLength(3);
398
- expect(new Set(result.map(f => f.category)).size).toBe(3);
399
- });
400
-
401
- it('returns all when limit exceeds available diverse findings', () => {
402
- const findings = [
403
- makeFinding({ id: '1', category: 'a' }),
404
- makeFinding({ id: '2', category: 'b' }),
405
- ];
406
- const result = diverseTopRecommendations(findings, 10, 2);
407
- expect(result).toHaveLength(2);
408
- });
409
-
410
- it('preserves input order, taking first maxPerCategory per category', () => {
411
- const findings = [
412
- makeFinding({ id: '1', category: 'a', severity: 'critical' }),
413
- makeFinding({ id: '2', category: 'a', severity: 'high' }),
414
- makeFinding({ id: '3', category: 'b', severity: 'medium' }),
415
- ];
416
- const result = diverseTopRecommendations(findings, 10, 2);
417
- expect(result[0].id).toBe('1');
418
- expect(result[1].id).toBe('2');
419
- expect(result[2].id).toBe('3');
420
- });
421
- });