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
@@ -0,0 +1,64 @@
1
+ import type { Finding, ReporterFormat } from '../types/index.js';
2
+
3
+ /**
4
+ * Formats findings for alternative output targets.
5
+ * Inspired by eslint's --format flag and dependency-cruiser's reporter plugins.
6
+ */
7
+
8
+ export function formatFindings(
9
+ findings: Finding[],
10
+ format: ReporterFormat,
11
+ root: string
12
+ ): string {
13
+ switch (format) {
14
+ case 'compact':
15
+ return formatCompact(findings, root);
16
+ case 'github-actions':
17
+ return formatGitHubActions(findings, root);
18
+ default:
19
+ return '';
20
+ }
21
+ }
22
+
23
+ function relativePath(file: string, root: string): string {
24
+ return file.startsWith(root) ? file.slice(root.length + 1) : file;
25
+ }
26
+
27
+ function severityToLevel(severity: string): string {
28
+ switch (severity) {
29
+ case 'critical': return 'error';
30
+ case 'high': return 'error';
31
+ case 'medium': return 'warning';
32
+ case 'low': return 'notice';
33
+ default: return 'warning';
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Compact: one-line per finding for terminal/CI logs.
39
+ * Format: severity:file:line - [category] title
40
+ */
41
+ function formatCompact(findings: Finding[], root: string): string {
42
+ return findings
43
+ .map(f => {
44
+ const file = relativePath(f.file, root);
45
+ const loc = f.lineStart ? `${file}:${f.lineStart}` : file;
46
+ return `${f.severity}:${loc} - [${f.category}] ${f.title}`;
47
+ })
48
+ .join('\n');
49
+ }
50
+
51
+ /**
52
+ * GitHub Actions: ::warning / ::error annotations.
53
+ * These appear inline on PR diffs.
54
+ */
55
+ function formatGitHubActions(findings: Finding[], root: string): string {
56
+ return findings
57
+ .map(f => {
58
+ const file = relativePath(f.file, root);
59
+ const line = f.lineStart || 1;
60
+ const level = severityToLevel(f.severity);
61
+ return `::${level} file=${file},line=${line}::${f.title} [${f.category}]`;
62
+ })
63
+ .join('\n');
64
+ }
@@ -0,0 +1,279 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import {
4
+ collectFocusNeighborhood,
5
+ collapseToFolderDepth,
6
+ generateMermaidGraph,
7
+ } from './writer.js';
8
+ import type { DependencyState, DependencySummary } from '../types/index.js';
9
+
10
+ function makeDependencyState(
11
+ outgoing: Record<string, string[]>,
12
+ incoming: Record<string, string[]>
13
+ ): DependencyState {
14
+ return {
15
+ outgoing: new Map(
16
+ Object.entries(outgoing).map(([k, v]) => [k, new Set(v)])
17
+ ),
18
+ incoming: new Map(
19
+ Object.entries(incoming).map(([k, v]) => [k, new Set(v)])
20
+ ),
21
+ files: new Set([...Object.keys(outgoing), ...Object.keys(incoming)]),
22
+ externalImports: new Map(),
23
+ packageJsonDeps: new Map(),
24
+ packageJsonDevDeps: new Map(),
25
+ } as unknown as DependencyState;
26
+ }
27
+
28
+ function makeMinimalSummary(): DependencySummary {
29
+ return {
30
+ totalModules: 0,
31
+ totalEdges: 0,
32
+ rootsCount: 0,
33
+ leavesCount: 0,
34
+ cycles: [],
35
+ criticalModules: [],
36
+ criticalPaths: [],
37
+ outgoingTop: [],
38
+ inboundTop: [],
39
+ testOnlyModules: [],
40
+ unresolvedEdgeCount: 0,
41
+ } as unknown as DependencySummary;
42
+ }
43
+
44
+ describe('collectFocusNeighborhood', () => {
45
+ it('returns the focus module and its direct neighbors at depth 1', () => {
46
+ const state = makeDependencyState(
47
+ {
48
+ 'src/a.ts': ['src/b.ts', 'src/c.ts'],
49
+ 'src/b.ts': [],
50
+ 'src/c.ts': ['src/d.ts'],
51
+ 'src/d.ts': [],
52
+ },
53
+ {
54
+ 'src/b.ts': ['src/a.ts'],
55
+ 'src/c.ts': ['src/a.ts'],
56
+ 'src/d.ts': ['src/c.ts'],
57
+ }
58
+ );
59
+
60
+ const result = collectFocusNeighborhood('src/a.ts', 1, state);
61
+ expect(result.has('src/a.ts')).toBe(true);
62
+ expect(result.has('src/b.ts')).toBe(true);
63
+ expect(result.has('src/c.ts')).toBe(true);
64
+ expect(result.has('src/d.ts')).toBe(false);
65
+ });
66
+
67
+ it('returns friends-of-friends at depth 2', () => {
68
+ const state = makeDependencyState(
69
+ {
70
+ 'src/a.ts': ['src/b.ts'],
71
+ 'src/b.ts': ['src/c.ts'],
72
+ 'src/c.ts': [],
73
+ },
74
+ {
75
+ 'src/b.ts': ['src/a.ts'],
76
+ 'src/c.ts': ['src/b.ts'],
77
+ }
78
+ );
79
+
80
+ const result = collectFocusNeighborhood('src/a.ts', 2, state);
81
+ expect(result.has('src/a.ts')).toBe(true);
82
+ expect(result.has('src/b.ts')).toBe(true);
83
+ expect(result.has('src/c.ts')).toBe(true);
84
+ });
85
+
86
+ it('returns empty set for non-existent focus module', () => {
87
+ const state = makeDependencyState(
88
+ { 'src/a.ts': ['src/b.ts'] },
89
+ { 'src/b.ts': ['src/a.ts'] }
90
+ );
91
+
92
+ const result = collectFocusNeighborhood('nonexistent.ts', 1, state);
93
+ expect(result.size).toBe(0);
94
+ });
95
+
96
+ it('matches partial path via endsWith', () => {
97
+ const state = makeDependencyState(
98
+ { 'packages/mcp/src/session.ts': ['packages/mcp/src/utils.ts'] },
99
+ { 'packages/mcp/src/utils.ts': ['packages/mcp/src/session.ts'] }
100
+ );
101
+
102
+ const result = collectFocusNeighborhood('src/session.ts', 1, state);
103
+ expect(result.has('packages/mcp/src/session.ts')).toBe(true);
104
+ expect(result.has('packages/mcp/src/utils.ts')).toBe(true);
105
+ });
106
+
107
+ it('includes incoming neighbors (dependents)', () => {
108
+ const state = makeDependencyState(
109
+ {
110
+ 'src/a.ts': [],
111
+ 'src/caller.ts': ['src/a.ts'],
112
+ },
113
+ {
114
+ 'src/a.ts': ['src/caller.ts'],
115
+ }
116
+ );
117
+
118
+ const result = collectFocusNeighborhood('src/a.ts', 1, state);
119
+ expect(result.has('src/caller.ts')).toBe(true);
120
+ });
121
+
122
+ it('handles cycles without infinite loop', () => {
123
+ const state = makeDependencyState(
124
+ {
125
+ 'src/a.ts': ['src/b.ts'],
126
+ 'src/b.ts': ['src/a.ts'],
127
+ },
128
+ {
129
+ 'src/a.ts': ['src/b.ts'],
130
+ 'src/b.ts': ['src/a.ts'],
131
+ }
132
+ );
133
+
134
+ const result = collectFocusNeighborhood('src/a.ts', 5, state);
135
+ expect(result.size).toBe(2);
136
+ });
137
+
138
+ it('depth 0 returns only the focus module itself', () => {
139
+ const state = makeDependencyState(
140
+ { 'src/a.ts': ['src/b.ts'] },
141
+ { 'src/b.ts': ['src/a.ts'] }
142
+ );
143
+
144
+ const result = collectFocusNeighborhood('src/a.ts', 0, state);
145
+ expect(result.size).toBe(1);
146
+ expect(result.has('src/a.ts')).toBe(true);
147
+ });
148
+ });
149
+
150
+ describe('collapseToFolderDepth', () => {
151
+ it('collapses files to folder depth 1', () => {
152
+ const state = makeDependencyState(
153
+ {
154
+ 'src/a.ts': ['lib/b.ts'],
155
+ 'lib/b.ts': [],
156
+ },
157
+ { 'lib/b.ts': ['src/a.ts'] }
158
+ );
159
+ const moduleSet = new Set(['src/a.ts', 'lib/b.ts']);
160
+
161
+ const { nodes, edges } = collapseToFolderDepth(moduleSet, state, 1);
162
+ expect(nodes.has('src')).toBe(true);
163
+ expect(nodes.has('lib')).toBe(true);
164
+ expect(edges).toHaveLength(1);
165
+ expect(edges[0]).toEqual({ from: 'src', to: 'lib', weight: 1 });
166
+ });
167
+
168
+ it('removes self-edges (same folder)', () => {
169
+ const state = makeDependencyState(
170
+ {
171
+ 'src/a.ts': ['src/b.ts'],
172
+ 'src/b.ts': [],
173
+ },
174
+ { 'src/b.ts': ['src/a.ts'] }
175
+ );
176
+ const moduleSet = new Set(['src/a.ts', 'src/b.ts']);
177
+
178
+ const { edges } = collapseToFolderDepth(moduleSet, state, 1);
179
+ expect(edges).toHaveLength(0);
180
+ });
181
+
182
+ it('accumulates edge weights for multiple files in same folder pair', () => {
183
+ const state = makeDependencyState(
184
+ {
185
+ 'src/a.ts': ['lib/x.ts'],
186
+ 'src/b.ts': ['lib/y.ts'],
187
+ 'lib/x.ts': [],
188
+ 'lib/y.ts': [],
189
+ },
190
+ {
191
+ 'lib/x.ts': ['src/a.ts'],
192
+ 'lib/y.ts': ['src/b.ts'],
193
+ }
194
+ );
195
+ const moduleSet = new Set([
196
+ 'src/a.ts',
197
+ 'src/b.ts',
198
+ 'lib/x.ts',
199
+ 'lib/y.ts',
200
+ ]);
201
+
202
+ const { edges } = collapseToFolderDepth(moduleSet, state, 1);
203
+ const srcToLib = edges.find(e => e.from === 'src' && e.to === 'lib');
204
+ expect(srcToLib).toBeDefined();
205
+ expect(srcToLib!.weight).toBe(2);
206
+ });
207
+
208
+ it('collapses to depth 2 (two path segments)', () => {
209
+ const state = makeDependencyState(
210
+ {
211
+ 'packages/mcp/src/a.ts': ['packages/cli/src/b.ts'],
212
+ 'packages/cli/src/b.ts': [],
213
+ },
214
+ { 'packages/cli/src/b.ts': ['packages/mcp/src/a.ts'] }
215
+ );
216
+ const moduleSet = new Set([
217
+ 'packages/mcp/src/a.ts',
218
+ 'packages/cli/src/b.ts',
219
+ ]);
220
+
221
+ const { nodes, edges } = collapseToFolderDepth(moduleSet, state, 2);
222
+ expect(nodes.has('packages/mcp')).toBe(true);
223
+ expect(nodes.has('packages/cli')).toBe(true);
224
+ expect(edges).toHaveLength(1);
225
+ });
226
+ });
227
+
228
+ describe('generateMermaidGraph with renderOpts', () => {
229
+ it('includes focus comment when focus is specified', () => {
230
+ const state = makeDependencyState(
231
+ { 'src/a.ts': ['src/b.ts'] },
232
+ { 'src/b.ts': ['src/a.ts'] }
233
+ );
234
+
235
+ const result = generateMermaidGraph(
236
+ state,
237
+ makeMinimalSummary(),
238
+ new Map(),
239
+ { focus: 'src/a.ts', focusDepth: 1 }
240
+ );
241
+
242
+ expect(result).toContain('Focus: src/a.ts');
243
+ });
244
+
245
+ it('produces collapsed output when collapse is specified', () => {
246
+ const state = makeDependencyState(
247
+ { 'src/a.ts': ['lib/b.ts'], 'lib/b.ts': [] },
248
+ { 'lib/b.ts': ['src/a.ts'] }
249
+ );
250
+
251
+ const summary = {
252
+ ...makeMinimalSummary(),
253
+ outgoingTop: [{ file: 'src/a.ts' }],
254
+ inboundTop: [{ file: 'lib/b.ts' }],
255
+ } as unknown as DependencySummary;
256
+
257
+ const result = generateMermaidGraph(state, summary, new Map(), {
258
+ collapse: 1,
259
+ });
260
+
261
+ expect(result).toContain('Collapsed to folder depth');
262
+ });
263
+
264
+ it('renders standard graph when no renderOpts', () => {
265
+ const state = makeDependencyState(
266
+ { 'src/a.ts': [] },
267
+ {}
268
+ );
269
+ const summary = {
270
+ ...makeMinimalSummary(),
271
+ outgoingTop: [{ file: 'src/a.ts' }],
272
+ } as unknown as DependencySummary;
273
+
274
+ const result = generateMermaidGraph(state, summary, new Map());
275
+ expect(result).toContain('graph LR');
276
+ expect(result).not.toContain('Collapsed');
277
+ expect(result).not.toContain('Focus:');
278
+ });
279
+ });
@@ -247,6 +247,12 @@ describe('output contract', () => {
247
247
  expect(summaryData).toHaveProperty('strongestGraphSignal');
248
248
  expect(summaryData).toHaveProperty('strongestAstSignal');
249
249
  expect(Array.isArray(summaryData.combinedSignals)).toBe(true);
250
+ expect(Array.isArray(summaryData.featureScores)).toBe(true);
251
+ expect(summaryData.featureScores.length).toBeGreaterThan(0);
252
+ expect(summaryData.qualityRating).toBeDefined();
253
+ expect(summaryData.qualityRating.model).toBe('hybrid-ai-structure-v1');
254
+ expect(Array.isArray(summaryData.qualityRating.aspects)).toBe(true);
255
+ expect(summaryData.qualityRating.aspects.length).toBe(6);
250
256
  expect(
251
257
  summaryData.analysisSummary.recommendedValidation ||
252
258
  summaryData.recommendedValidation