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
@@ -29,6 +29,8 @@ import { TS_CONTROL_KINDS } from '../types/index.js';
29
29
 
30
30
  import type {
31
31
  AnalysisOptions,
32
+ BooleanParamCluster,
33
+ CatchRethrowEntry,
32
34
  CodeLocation,
33
35
  DependencyProfile,
34
36
  FileCriticality,
@@ -38,9 +40,11 @@ import type {
38
40
  FunctionEntry,
39
41
  Location,
40
42
  MagicNumberEntry,
43
+ MagicStringEntry,
41
44
  Metrics,
42
45
  NodeBudget,
43
46
  PackageFileSummary,
47
+ PromiseAllUnhandledEntry,
44
48
  TreeEntry,
45
49
  } from '../types/index.js';
46
50
 
@@ -72,7 +76,7 @@ export function buildDependencyCriticality(
72
76
  for (const fn of fileSummary.functions) {
73
77
  const complexity = Number(fn.complexity) || 0;
74
78
  totalComplexity += complexity;
75
- if (complexity >= options.criticalComplexityThreshold) {
79
+ if (complexity >= options.thresholds.criticalComplexityThreshold) {
76
80
  highComplexity += 1;
77
81
  }
78
82
  }
@@ -339,7 +343,7 @@ export function analyzeSourceFile(
339
343
  entry.declared = true;
340
344
  }
341
345
 
342
- if (statementCount >= options.minFunctionStatements) {
346
+ if (statementCount >= options.thresholds.minFunctionStatements) {
343
347
  const bodyHash = body
344
348
  ? makeFingerprint(body)
345
349
  : hashString(fileRelative);
@@ -374,7 +378,7 @@ export function analyzeSourceFile(
374
378
  fileEntry.flows.push(flowEntry);
375
379
  packageFileSummary.flowCount += 1;
376
380
 
377
- if (statementCount >= options.minFlowStatements) {
381
+ if (statementCount >= options.thresholds.minFlowStatements) {
378
382
  const flowHash = makeFingerprint(node);
379
383
  increment(maps.controlMap, `${flowHash}|${node.kind}`, {
380
384
  ...flowEntry,
@@ -400,6 +404,7 @@ export function analyzeSourceFile(
400
404
 
401
405
  analyzeAsyncPatterns(sourceFile, fileEntry);
402
406
  collectFileProfiles(sourceFile, fileRelative, fileEntry);
407
+ collectSmartQualityData(sourceFile, fileRelative, fileEntry);
403
408
 
404
409
  return fileEntry;
405
410
  }
@@ -507,3 +512,168 @@ function collectFileProfiles(
507
512
  }
508
513
  }
509
514
  }
515
+
516
+ const PROMISE_COMBINATORS = new Set(['all', 'allSettled', 'race', 'any']);
517
+ const PROMISE_KIND_MAP: Record<string, PromiseAllUnhandledEntry['kind']> = {
518
+ all: 'Promise.all',
519
+ allSettled: 'Promise.allSettled',
520
+ race: 'Promise.race',
521
+ any: 'Promise.any',
522
+ };
523
+
524
+ function collectSmartQualityData(
525
+ sourceFile: ts.SourceFile,
526
+ fileRelative: string,
527
+ fileEntry: FileEntry
528
+ ): void {
529
+ if (isTestFile(fileRelative)) return;
530
+
531
+ const magicStrings: MagicStringEntry[] = [];
532
+ const catchRethrows: CatchRethrowEntry[] = [];
533
+ const booleanParamClusters: BooleanParamCluster[] = [];
534
+ const promiseAllUnhandled: PromiseAllUnhandledEntry[] = [];
535
+
536
+ const stringCompareValues = new Map<string, CodeLocation[]>();
537
+
538
+ const visit = (node: ts.Node): void => {
539
+ if (
540
+ ts.isBinaryExpression(node) &&
541
+ (node.operatorToken.kind === ts.SyntaxKind.EqualsEqualsEqualsToken ||
542
+ node.operatorToken.kind === ts.SyntaxKind.ExclamationEqualsEqualsToken ||
543
+ node.operatorToken.kind === ts.SyntaxKind.EqualsEqualsToken ||
544
+ node.operatorToken.kind === ts.SyntaxKind.ExclamationEqualsToken)
545
+ ) {
546
+ const checkStringLiteral = (operand: ts.Expression): void => {
547
+ if (ts.isStringLiteral(operand) && operand.text.length > 0) {
548
+ const loc = getLineAndCharacter(sourceFile, operand);
549
+ const locs = stringCompareValues.get(operand.text) || [];
550
+ locs.push({ file: fileRelative, lineStart: loc.lineStart, lineEnd: loc.lineEnd });
551
+ stringCompareValues.set(operand.text, locs);
552
+ }
553
+ };
554
+ checkStringLiteral(node.left);
555
+ checkStringLiteral(node.right);
556
+ }
557
+
558
+ if (ts.isSwitchStatement(node)) {
559
+ for (const clause of node.caseBlock.clauses) {
560
+ if (ts.isCaseClause(clause) && ts.isStringLiteral(clause.expression)) {
561
+ const text = clause.expression.text;
562
+ if (text.length > 0) {
563
+ const loc = getLineAndCharacter(sourceFile, clause.expression);
564
+ const locs = stringCompareValues.get(text) || [];
565
+ locs.push({ file: fileRelative, lineStart: loc.lineStart, lineEnd: loc.lineEnd });
566
+ stringCompareValues.set(text, locs);
567
+ }
568
+ }
569
+ }
570
+ }
571
+
572
+ if (ts.isCatchClause(node)) {
573
+ const block = node.block;
574
+ if (
575
+ block.statements.length === 1 &&
576
+ ts.isThrowStatement(block.statements[0])
577
+ ) {
578
+ const throwExpr = block.statements[0].expression;
579
+ const catchParam = node.variableDeclaration?.name;
580
+ if (
581
+ throwExpr &&
582
+ catchParam &&
583
+ ts.isIdentifier(catchParam) &&
584
+ ts.isIdentifier(throwExpr) &&
585
+ throwExpr.text === catchParam.text
586
+ ) {
587
+ const loc = getLineAndCharacter(sourceFile, node);
588
+ catchRethrows.push({
589
+ file: fileRelative,
590
+ lineStart: loc.lineStart,
591
+ lineEnd: loc.lineEnd,
592
+ });
593
+ }
594
+ }
595
+ }
596
+
597
+ if (isFunctionLike(node)) {
598
+ const funcNode = node as ts.FunctionLikeDeclaration;
599
+ if (funcNode.parameters && funcNode.parameters.length >= 2) {
600
+ let boolCount = 0;
601
+ for (const param of funcNode.parameters) {
602
+ if (
603
+ param.type &&
604
+ param.type.kind === ts.SyntaxKind.BooleanKeyword
605
+ ) {
606
+ boolCount++;
607
+ }
608
+ }
609
+ if (boolCount >= 3) {
610
+ const name = getFunctionName(node, sourceFile);
611
+ const loc = getLineAndCharacter(sourceFile, node);
612
+ booleanParamClusters.push({
613
+ name,
614
+ booleanCount: boolCount,
615
+ totalParams: funcNode.parameters.length,
616
+ lineStart: loc.lineStart,
617
+ lineEnd: loc.lineEnd,
618
+ });
619
+ }
620
+ }
621
+ }
622
+
623
+ if (
624
+ ts.isCallExpression(node) &&
625
+ ts.isPropertyAccessExpression(node.expression) &&
626
+ ts.isIdentifier(node.expression.expression) &&
627
+ node.expression.expression.text === 'Promise' &&
628
+ PROMISE_COMBINATORS.has(node.expression.name.text)
629
+ ) {
630
+ const combinator = node.expression.name.text;
631
+ let hasTryCatch = false;
632
+ let hasCatchChain = false;
633
+ let parent = node.parent;
634
+ while (parent) {
635
+ if (ts.isTryStatement(parent)) {
636
+ hasTryCatch = true;
637
+ break;
638
+ }
639
+ if (
640
+ ts.isCallExpression(parent) &&
641
+ ts.isPropertyAccessExpression(parent.expression) &&
642
+ parent.expression.name.text === 'catch'
643
+ ) {
644
+ hasCatchChain = true;
645
+ break;
646
+ }
647
+ if (isFunctionLike(parent)) break;
648
+ parent = parent.parent;
649
+ }
650
+
651
+ if (!hasTryCatch && !hasCatchChain) {
652
+ const loc = getLineAndCharacter(sourceFile, node);
653
+ promiseAllUnhandled.push({
654
+ file: fileRelative,
655
+ lineStart: loc.lineStart,
656
+ lineEnd: loc.lineEnd,
657
+ kind: PROMISE_KIND_MAP[combinator] || 'Promise.all',
658
+ });
659
+ }
660
+ }
661
+
662
+ ts.forEachChild(node, visit);
663
+ };
664
+
665
+ ts.forEachChild(sourceFile, visit);
666
+
667
+ for (const [value, locs] of stringCompareValues) {
668
+ if (locs.length >= 2) {
669
+ for (const loc of locs) {
670
+ magicStrings.push({ ...loc, value });
671
+ }
672
+ }
673
+ }
674
+
675
+ if (magicStrings.length > 0) fileEntry.magicStrings = magicStrings;
676
+ if (catchRethrows.length > 0) fileEntry.catchRethrows = catchRethrows;
677
+ if (booleanParamClusters.length > 0) fileEntry.booleanParamClusters = booleanParamClusters;
678
+ if (promiseAllUnhandled.length > 0) fileEntry.promiseAllUnhandled = promiseAllUnhandled;
679
+ }
@@ -121,4 +121,77 @@ describe('collectSecurityData', () => {
121
121
  expect(fileEntry.suspiciousStrings).toBeDefined();
122
122
  expect(fileEntry.suspiciousStrings!.length).toBe(0);
123
123
  });
124
+
125
+ it('does not mark generic auth/session logs as sensitive without secret values', () => {
126
+ const code = `
127
+ console.log("auth flow started");
128
+ console.info("session refreshed successfully");
129
+ console.warn("user auth status changed");
130
+ `;
131
+ const sourceFile = parse(code);
132
+ const fileEntry = emptyFileEntry();
133
+ collectSecurityData(sourceFile, 'test.ts', fileEntry);
134
+ expect(fileEntry.consoleLogs).toBeDefined();
135
+ expect(fileEntry.consoleLogs).toHaveLength(3);
136
+ expect(fileEntry.consoleLogs!.every(log => log.hasSensitiveArg === false)).toBe(
137
+ true
138
+ );
139
+ });
140
+
141
+ it('marks token-bearing log calls as sensitive', () => {
142
+ const code = `
143
+ const token = "abc123";
144
+ console.log("token", token);
145
+ `;
146
+ const sourceFile = parse(code);
147
+ const fileEntry = emptyFileEntry();
148
+ collectSecurityData(sourceFile, 'test.ts', fileEntry);
149
+ expect(fileEntry.consoleLogs).toBeDefined();
150
+ expect(fileEntry.consoleLogs).toHaveLength(1);
151
+ expect(fileEntry.consoleLogs![0].hasSensitiveArg).toBe(true);
152
+ });
153
+
154
+ it('does not mark CLI usage/help templates as sensitive token logs', () => {
155
+ const code = `
156
+ console.error(\`Unknown \${flagName}: "\${token}". Use pillar names\`);
157
+ console.log(\`
158
+ Usage:
159
+ node scripts/run.js [options]
160
+ Options:
161
+ --root <path>
162
+ \`);
163
+ `;
164
+ const sourceFile = parse(code);
165
+ const fileEntry = emptyFileEntry();
166
+ collectSecurityData(sourceFile, 'test.ts', fileEntry);
167
+ expect(fileEntry.consoleLogs).toBeDefined();
168
+ expect(fileEntry.consoleLogs).toHaveLength(2);
169
+ expect(fileEntry.consoleLogs![0].hasSensitiveArg).toBe(false);
170
+ expect(fileEntry.consoleLogs![1].hasSensitiveArg).toBe(false);
171
+ });
172
+
173
+ it('does not flag high-entropy literals without secret-like identifier context', () => {
174
+ const code = `
175
+ const traceId = "a9F3kLmN2pQr8sTuVwX4yZaB6cDe7fGh";
176
+ `;
177
+ const sourceFile = parse(code);
178
+ const fileEntry = emptyFileEntry();
179
+ collectSecurityData(sourceFile, 'test.ts', fileEntry);
180
+ expect(fileEntry.suspiciousStrings).toBeDefined();
181
+ expect(fileEntry.suspiciousStrings!.length).toBe(0);
182
+ });
183
+
184
+ it('flags high-entropy literals when assigned to secret-like identifiers', () => {
185
+ const code = `
186
+ const apiToken = "a9F3kLmN2pQr8sTuVwX4yZaB6cDe7fGh";
187
+ `;
188
+ const sourceFile = parse(code);
189
+ const fileEntry = emptyFileEntry();
190
+ collectSecurityData(sourceFile, 'test.ts', fileEntry);
191
+ expect(fileEntry.suspiciousStrings).toBeDefined();
192
+ const secretEntry = fileEntry.suspiciousStrings!.find(
193
+ s => s.kind === 'hardcoded-secret'
194
+ );
195
+ expect(secretEntry).toBeDefined();
196
+ });
124
197
  });
@@ -4,12 +4,11 @@ import { getLineAndCharacter } from '../common/utils.js';
4
4
 
5
5
  import type { CodeLocation, ConsoleLogEntry, FileEntry, SuspiciousString } from '../types/index.js';
6
6
 
7
- const SENSITIVE_LOG_PATTERNS = [
7
+ const HIGH_CONFIDENCE_SENSITIVE_LOG_PATTERNS = [
8
8
  /password/i,
9
9
  /passwd/i,
10
10
  /\bsecret\b/i,
11
11
  /\btoken\b/i,
12
- /\bauth\b/i,
13
12
  /credential/i,
14
13
  /credit.?card/i,
15
14
  /\bssn\b/i,
@@ -17,9 +16,23 @@ const SENSITIVE_LOG_PATTERNS = [
17
16
  /api[_-]?key/i,
18
17
  /private[_-]?key/i,
19
18
  /access[_-]?key/i,
19
+ ];
20
+
21
+ const LOW_CONFIDENCE_SENSITIVE_LOG_PATTERNS = [
22
+ /\bauth\b/i,
20
23
  /\bsession\b/i,
21
24
  ];
22
25
 
26
+ const NON_SECRET_AUTH_SESSION_CONTEXT =
27
+ /\b(auth|session)\b.{0,40}\b(flow|status|state|start(?:ed)?|success(?:ful|fully)?|fail(?:ed|ure)?|refresh(?:ed)?|renew(?:ed)?|expire(?:d)?|invalid|chang(?:e|ed)|required|created|destroyed)\b/i;
28
+ const AUTH_SESSION_VALUE_HINT =
29
+ /\b(id|sid|jwt|bearer|cookie|header|authorization|credential|secret|token|key)\b|[:=]|\{|\}/i;
30
+ const NON_SECRET_USAGE_HINT =
31
+ /\busage:\b|\boptions:\b|--[a-z0-9-]+|\bunknown\b.{0,20}\btoken\b|\bpillar names?\b|\bcategory names?\b/i;
32
+
33
+ const SECRET_CONTEXT_NAME_PATTERN =
34
+ /(password|passwd|secret|token|api[_-]?key|private[_-]?key|access[_-]?key|credential|auth|session|jwt|bearer|ssn)/i;
35
+
23
36
  const CONSOLE_LOG_METHODS = new Set([
24
37
  'log', 'debug', 'trace', 'info', 'warn', 'error', 'dir', 'table',
25
38
  ]);
@@ -93,6 +106,44 @@ function computeShannonEntropy(s: string): number {
93
106
  return entropy;
94
107
  }
95
108
 
109
+ function hasSecretLikeIdentifierContext(
110
+ node: ts.Node,
111
+ sourceFile: ts.SourceFile
112
+ ): boolean {
113
+ const parent = node.parent;
114
+ if (ts.isVariableDeclaration(parent)) {
115
+ if (ts.isIdentifier(parent.name)) {
116
+ return SECRET_CONTEXT_NAME_PATTERN.test(parent.name.text);
117
+ }
118
+ return false;
119
+ }
120
+ if (ts.isPropertyAssignment(parent)) {
121
+ if (ts.isIdentifier(parent.name)) {
122
+ return SECRET_CONTEXT_NAME_PATTERN.test(parent.name.text);
123
+ }
124
+ if (ts.isStringLiteral(parent.name) || ts.isNumericLiteral(parent.name)) {
125
+ return SECRET_CONTEXT_NAME_PATTERN.test(parent.name.text);
126
+ }
127
+ }
128
+ if (ts.isBinaryExpression(parent) && ts.isPropertyAccessExpression(parent.left)) {
129
+ return SECRET_CONTEXT_NAME_PATTERN.test(parent.left.name.getText(sourceFile));
130
+ }
131
+ return false;
132
+ }
133
+
134
+ function hasSensitiveLogArgument(argText: string): boolean {
135
+ if (NON_SECRET_USAGE_HINT.test(argText)) return false;
136
+ if (HIGH_CONFIDENCE_SENSITIVE_LOG_PATTERNS.some(p => p.test(argText))) {
137
+ return true;
138
+ }
139
+ const hasLowConfidenceTerm = LOW_CONFIDENCE_SENSITIVE_LOG_PATTERNS.some(p =>
140
+ p.test(argText)
141
+ );
142
+ if (!hasLowConfidenceTerm) return false;
143
+ if (NON_SECRET_AUTH_SESSION_CONTEXT.test(argText)) return false;
144
+ return AUTH_SESSION_VALUE_HINT.test(argText);
145
+ }
146
+
96
147
  export function collectSecurityData(
97
148
  sourceFile: ts.SourceFile,
98
149
  fileRelative: string,
@@ -127,7 +178,7 @@ export function collectSecurityData(
127
178
  if (obj === 'console' && CONSOLE_LOG_METHODS.has(method)) {
128
179
  const loc = getLineAndCharacter(sourceFile, node);
129
180
  const argText = node.arguments.map(a => a.getText(sourceFile)).join(' ');
130
- const hasSensitiveArg = SENSITIVE_LOG_PATTERNS.some(p => p.test(argText));
181
+ const hasSensitiveArg = hasSensitiveLogArgument(argText);
131
182
  consoleLogs.push({
132
183
  method,
133
184
  lineStart: loc.lineStart,
@@ -229,6 +280,7 @@ export function collectSecurityData(
229
280
  if (!isInsideMetadataProperty(node) && !isInsideRegexLiteral(node)) {
230
281
  const value = node.text;
231
282
  if (!isPlaceholderOrUuid(value)) {
283
+ let matchedSecretPattern = false;
232
284
  for (const pattern of SECRET_PATTERNS) {
233
285
  if (pattern.test(value)) {
234
286
  const loc = getLineAndCharacter(sourceFile, node);
@@ -239,10 +291,16 @@ export function collectSecurityData(
239
291
  snippet: value.slice(0, 40),
240
292
  context: 'literal',
241
293
  });
294
+ matchedSecretPattern = true;
242
295
  break;
243
296
  }
244
297
  }
245
- if (value.length >= 20 && computeShannonEntropy(value) > 4.5) {
298
+ if (
299
+ !matchedSecretPattern &&
300
+ value.length >= 20 &&
301
+ computeShannonEntropy(value) > 4.5 &&
302
+ hasSecretLikeIdentifierContext(node, sourceFile)
303
+ ) {
246
304
  const loc = getLineAndCharacter(sourceFile, node);
247
305
  suspiciousStrings.push({
248
306
  lineStart: loc.lineStart,
@@ -0,0 +1,59 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { resolveEnabledPillars } from './index.js';
4
+
5
+ describe('resolveEnabledPillars', () => {
6
+ it('enables all pillars when no feature filter is provided', () => {
7
+ expect(resolveEnabledPillars(null)).toEqual({
8
+ architecture: true,
9
+ codeQuality: true,
10
+ deadCode: true,
11
+ security: true,
12
+ testQuality: true,
13
+ });
14
+ });
15
+
16
+ it('enables only security for security-only categories', () => {
17
+ expect(resolveEnabledPillars(new Set(['hardcoded-secret']))).toEqual({
18
+ architecture: false,
19
+ codeQuality: false,
20
+ deadCode: false,
21
+ security: true,
22
+ testQuality: false,
23
+ });
24
+ });
25
+
26
+ it('enables only test quality for test-quality-only categories', () => {
27
+ expect(resolveEnabledPillars(new Set(['missing-mock-restoration']))).toEqual({
28
+ architecture: false,
29
+ codeQuality: false,
30
+ deadCode: false,
31
+ security: false,
32
+ testQuality: true,
33
+ });
34
+ });
35
+
36
+ it('enables dead code categories explicitly', () => {
37
+ expect(resolveEnabledPillars(new Set(['dead-export']))).toEqual({
38
+ architecture: false,
39
+ codeQuality: false,
40
+ deadCode: true,
41
+ security: false,
42
+ testQuality: false,
43
+ });
44
+ });
45
+
46
+ it('enables multiple pillars when categories span pillars', () => {
47
+ expect(
48
+ resolveEnabledPillars(
49
+ new Set(['dependency-cycle', 'cognitive-complexity', 'hardcoded-secret'])
50
+ )
51
+ ).toEqual({
52
+ architecture: true,
53
+ codeQuality: true,
54
+ deadCode: false,
55
+ security: true,
56
+ testQuality: false,
57
+ });
58
+ });
59
+ });