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,45 @@
1
+ #!/usr/bin/env node
2
+ import b from"node:fs";import f from"node:path";import{js as M,ts as N,tsx as E}from"@ast-grep/napi";import w from"node:path";import{fileURLToPath as A}from"node:url";function T(t,e=process.argv[1]){return e?A(t)===w.resolve(e):!1}import R from"node:path";import*as u from"typescript";var k={couplingThreshold:15,fanInThreshold:20,fanOutThreshold:15,godModuleStatements:500,godModuleExports:20,barrelSymbolThreshold:30,sdpMinDelta:.15,sdpMaxSourceInstability:.6,layerOrder:[],minFunctionStatements:6,minFlowStatements:6,criticalComplexityThreshold:30,godFunctionStatements:100,godFunctionMiThreshold:10,cognitiveComplexityThreshold:15,parameterThreshold:5,halsteadEffortThreshold:5e5,maintainabilityIndexThreshold:20,anyThreshold:5,flowDupThreshold:3,similarityThreshold:.85,deepNestingThreshold:5,multipleReturnThreshold:6,magicStringMinOccurrences:3,booleanParamThreshold:3,overrideChainThreshold:3,shotgunThreshold:8,secretEntropyThreshold:4.5,secretMinLength:20,mockThreshold:10},O={root:process.cwd(),out:null,json:!1,packageRoot:R.join(process.cwd(),"packages"),parser:"auto",includeTests:!1,emitTree:!0,treeDepth:4,noCache:!1,clearCache:!1,semantic:!1,graph:!1,graphAdvanced:!1,flow:!1,scope:null,scopeSymbols:null,features:null,ignoreDirs:new Set([".git",".next",".yarn",".cache",".octocode","node_modules","dist","coverage","out"]),findingsLimit:1/0,noDiversify:!1,maxRecsPerCategory:2,deepLinkTopN:12,thresholds:{...k},affected:null,saveBaseline:!1,ignoreKnown:null,reporter:"default",focus:null,focusDepth:1,collapse:null,atLeast:null,configFile:null},_={architecture:["dependency-cycle","dependency-critical-path","dependency-test-only","architecture-sdp-violation","high-coupling","god-module-coupling","orphan-module","unreachable-module","layer-violation","low-cohesion","mega-folder","distance-from-main-sequence","feature-envy","untested-critical-code","over-abstraction","concrete-dependency","circular-type-dependency","shotgun-surgery","import-side-effect-risk","cycle-cluster","broker-module","bridge-module","package-boundary-chatter","startup-risk-hub","namespace-import","commonjs-in-esm","export-star-leak","mixed-module-format"],"code-quality":["duplicate-function-body","duplicate-flow-structure","function-optimization","cognitive-complexity","god-module","god-function","halstead-effort","low-maintainability","excessive-parameters","unsafe-any","empty-catch","switch-no-default","unused-parameter","deep-override-chain","interface-compliance","type-assertion-escape","promise-misuse","narrowable-type","missing-error-boundary","await-in-loop","sync-io","uncleared-timer","listener-leak-risk","unbounded-collection","similar-function-body","message-chain","deep-nesting","multiple-return-paths","catch-rethrow","magic-string","boolean-parameter-cluster","promise-all-unhandled","export-surface-density","change-risk"],"dead-code":["dead-export","dead-re-export","re-export-duplication","re-export-shadowed","unused-npm-dependency","package-boundary-violation","barrel-explosion","unused-import","orphan-implementation","move-to-caller","semantic-dead-export","dead-file"],security:["hardcoded-secret","eval-usage","unsafe-html","sql-injection-risk","unsafe-regex","prototype-pollution-risk","unvalidated-input-sink","input-passthrough-risk","path-traversal-risk","command-injection-risk","debug-log-leakage","sensitive-data-logging"],"test-quality":["low-assertion-density","test-no-assertion","excessive-mocking","shared-mutable-state","missing-test-cleanup","focused-test","fake-timer-no-restore","missing-mock-restoration"]},$=new Set(Object.values(_).flat());var x=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);var j=new Set([u.SyntaxKind.IfStatement,u.SyntaxKind.SwitchStatement,u.SyntaxKind.TryStatement,u.SyntaxKind.ForStatement,u.SyntaxKind.WhileStatement,u.SyntaxKind.DoStatement,u.SyntaxKind.ForOfStatement,u.SyntaxKind.ForInStatement,u.SyntaxKind.ConditionalExpression]);var y={"empty-catch":{rule:{kind:"catch_clause",has:{kind:"statement_block",regex:"^\\{\\s*\\}$"}},description:"Empty catch blocks that silently swallow errors"},"console-log":{rule:{pattern:"console.log($$$ARGS)"},description:"console.log calls left in production code"},"console-any":{rule:{pattern:"console.$METHOD($$$ARGS)"},description:"Any console method call (log, warn, error, debug, etc.)"},debugger:{rule:{kind:"debugger_statement"},description:"Debugger statements left in code"},"todo-fixme":{rule:{kind:"comment",regex:"(?i)(TODO|FIXME|HACK|XXX|BUG)"},description:"TODO, FIXME, HACK, XXX, BUG comments"},"any-type":{rule:{kind:"predefined_type",regex:"^any$"},description:"Explicit `any` type annotations"},"type-assertion":{rule:{kind:"as_expression"},description:"TypeScript type assertions (as X)"},"non-null-assertion":{rule:{kind:"non_null_expression"},description:"Non-null assertions (x!)"},"fat-arrow-body":{rule:{kind:"arrow_function",has:{kind:"statement_block"}},description:"Arrow functions with statement block bodies (could be expression)"},"nested-ternary":{rule:{kind:"ternary_expression",has:{kind:"ternary_expression",stopBy:"end"}},description:"Nested ternary expressions (hard to read)"},"throw-string":{rule:{kind:"throw_statement",has:{kind:"string"}},description:"Throwing string literals instead of Error objects"},"switch-no-default":{rule:{kind:"switch_statement",not:{has:{kind:"switch_default",stopBy:"end"}}},description:"Switch statements without a default case"},"class-declaration":{rule:{kind:"class_declaration"},description:"All class declarations"},"async-function":{rule:{kind:"function_declaration",regex:"^async "},description:"Async function declarations"},"export-default":{rule:{kind:"export_statement",has:{field:"default"}},description:"Default exports"},"import-star":{rule:{kind:"import_statement",has:{kind:"namespace_import"}},description:"Namespace imports (import * as X)"},"catch-rethrow":{rule:{kind:"catch_clause",has:{kind:"statement_block",has:{kind:"throw_statement"}}},description:"Catch blocks that only re-throw the caught error"},"promise-all":{rule:{pattern:"Promise.all($$$ARGS)"},description:"Promise.all calls (check for missing error handling)"},"boolean-param":{rule:{kind:"type_annotation",has:{kind:"predefined_type",regex:"^boolean$"}},description:"Function parameters typed as boolean"},"magic-number":{rule:{kind:"number",not:{regex:"^[01]$"}},description:"Numeric literals (excluding 0 and 1) \u2014 potential magic numbers"},"deep-callback":{rule:{kind:"arrow_function",inside:{kind:"arrow_function",inside:{kind:"arrow_function",stopBy:"end"},stopBy:"end"}},description:"Deeply nested arrow function callbacks (3+ levels)"},"unused-var":{rule:{kind:"variable_declarator",not:{has:{kind:"call_expression",stopBy:"end"}}},description:"Variable declarations without call expressions (candidates for dead code)"}};function C(t){let e=f.basename(t);return/\.(test|spec)\.(ts|tsx|js|jsx|mjs|cjs)$/.test(e)||e.startsWith("test_")||t.includes("__tests__")}function F(t,e){let i=[],r=n=>{let o;try{o=b.readdirSync(n,{withFileTypes:!0})}catch{return}o.sort((a,s)=>a.name.localeCompare(s.name));for(let a of o){if(e.ignoreDirs.has(a.name)||a.isSymbolicLink())continue;let s=f.join(n,a.name);if(a.isDirectory()){r(s);continue}if(!a.isFile()||a.name.endsWith(".d.ts"))continue;let c=f.extname(a.name);x.has(c)&&(!e.includeTests&&C(s)||i.push(s))}};return r(t),i}function v(t){switch(t){case".tsx":return E;case".jsx":return E;case".js":case".mjs":case".cjs":return M;default:return N}}function L(t,e){let i={},r,n=/\$\$\$([A-Z_][A-Z0-9_]*)/g,o=new Set;for(;(r=n.exec(e))!==null;){let s=r[1];o.add(s);let c=t.getMultipleMatches(s);c.length>0&&(i[`$$$${s}`]=c.map(d=>d.text()).join(", "))}let a=/(?<!\$)\$([A-Z_][A-Z0-9_]*)(?!\$)/g;for(;(r=a.exec(e))!==null;){let s=r[1];if(o.has(s))continue;let c=t.getMatch(s);c&&(i[`$${s}`]=c.text())}return i}function D(t,e,i){let r=t.range(),n={file:e,kind:String(t.kind()),text:t.text(),lineStart:r.start.line+1,lineEnd:r.end.line+1,columnStart:r.start.column,columnEnd:r.end.column};if(i){let o=L(t,i);Object.keys(o).length>0&&(n.metaVariables=o)}return n}function P(t,e,i,r,n){let o=f.extname(t),a=v(o),s;try{s=a.parse(e).root().findAll(i)}catch{return[]}let c=[];for(let d of s){if(c.length>=n)break;c.push(D(d,t,r))}return c}function I(t,e,i){let r,n,o,a=null;if(e.preset){let l=y[e.preset];if(!l){let p=Object.keys(y).join(", ");throw new Error(`Unknown preset: "${e.preset}". Available: ${p}`)}r=l,n=`preset:${e.preset} \u2014 ${l.description}`,o="preset"}else if(e.rule)r=e.rule,n=`rule:${JSON.stringify(e.rule)}`,o="rule";else if(e.kind)r={rule:{kind:e.kind}},n=`kind:${e.kind}`,o="kind";else if(e.pattern)r=e.pattern,a=e.pattern,n=`pattern:${e.pattern}`,o="pattern";else throw new Error("Must provide --pattern, --kind, --preset, or --rule");let s=[],c=new Set,d=e.context>0?new Map:void 0;for(let l of t){if(s.length>=e.limit)break;let p;try{p=b.readFileSync(l,"utf8")}catch{continue}let h=f.relative(i,l),g=e.limit-s.length,S=P(h,p,r,a,g);S.length>0&&(c.add(h),s.push(...S),d&&d.set(h,p.split(`
3
+ `)))}let m={query:n,queryType:o,totalMatches:s.length,totalFiles:c.size,matches:s};return d&&(m._sourceByFile=d),m}function G(t){let e={root:process.cwd(),pattern:null,kind:null,preset:null,rule:null,json:!1,limit:500,includeTests:!1,ignoreDirs:new Set([".git",".next",".yarn",".cache",".octocode","node_modules","dist","coverage","out"]),context:0},i=!1;for(let r=0;r<t.length;r++){let n=t[r];if(n==="--pattern"||n==="-p"){e.pattern=t[++r];continue}if(n.startsWith("--pattern=")){e.pattern=n.slice(10);continue}if(n==="--kind"||n==="-k"){e.kind=t[++r];continue}if(n.startsWith("--kind=")){e.kind=n.slice(7);continue}if(n==="--preset"){e.preset=t[++r];continue}if(n.startsWith("--preset=")){e.preset=n.slice(9);continue}if(n==="--rule"){let o=t[++r];try{e.rule=JSON.parse(o)}catch{throw new Error(`Invalid --rule JSON: ${o?.slice(0,100)??"(empty)"}`)}continue}if(n==="--root"){e.root=f.resolve(t[++r]);continue}if(n.startsWith("--root=")){e.root=f.resolve(n.slice(7));continue}if(n==="--json"){e.json=!0;continue}if(n==="--limit"){e.limit=parseInt(t[++r],10);continue}if(n==="--include-tests"){e.includeTests=!0;continue}if(n==="--context"||n==="-C"){e.context=parseInt(t[++r],10);continue}if(n==="--list-presets"){i=!0;continue}(n==="--help"||n==="-h")&&(B(),process.exit(0))}return Number.isNaN(e.limit)&&(e.limit=500),Number.isNaN(e.context)&&(e.context=0),{opts:e,listPresets:i}}function B(){console.log(`
4
+ ast-search \u2014 Structural code search powered by ast-grep
5
+
6
+ Usage:
7
+ node scripts/ast/search.js [options]
8
+
9
+ Search modes (pick one):
10
+ --pattern, -p <code> Match code structurally (e.g. 'console.log($$$ARGS)')
11
+ --kind, -k <kind> Match AST node kind (e.g. 'function_declaration')
12
+ --preset <name> Use a built-in search preset (e.g. 'empty-catch')
13
+ --rule <json> Raw ast-grep rule object as JSON
14
+
15
+ Options:
16
+ --root <path> Search root directory (default: cwd)
17
+ --json Output as JSON
18
+ --limit N Max matches (default: 500)
19
+ --include-tests Include test files
20
+ --context, -C N Lines of context around matches (text output only)
21
+ --list-presets Show available presets and exit
22
+ --help, -h Show this message
23
+
24
+ Pattern wildcards:
25
+ $NAME Match any single AST node
26
+ $$$NAME Match zero or more nodes (variadic)
27
+
28
+ Examples:
29
+ node scripts/ast/search.js -p 'console.log($$$ARGS)' --root ./src
30
+ node scripts/ast/search.js --preset empty-catch --root ./packages
31
+ node scripts/ast/search.js -k function_declaration --json --limit 20
32
+ node scripts/ast/search.js --preset todo-fixme --include-tests
33
+ node scripts/ast/search.js -p 'if ($COND) { return $VAL }' --root ./src
34
+ node scripts/ast/search.js --rule '{"rule":{"kind":"catch_clause"}}' --root ./src
35
+
36
+ Presets:
37
+ ${Object.entries(y).map(([t,e])=>` ${t.padEnd(22)} ${e.description}`).join(`
38
+ `)}
39
+ `)}function K(t,e,i){let r=[];r.push(`
40
+ \u{1F50D} ${t.query}`),r.push(` ${t.totalMatches} matches across ${t.totalFiles} files
41
+ `);let n=e.context,o=t._sourceByFile,a="";for(let s of t.matches){if(s.file!==a&&(a=s.file,r.push(`
42
+ \u2500\u2500 ${a} \u2500\u2500`)),n>0&&o){let m=o.get(s.file);if(m){let l=Math.max(0,s.lineStart-1-n),p=Math.min(m.length,s.lineEnd+n);for(let h=l;h<p;h++){let g=h+1,S=g>=s.lineStart&&g<=s.lineEnd?">":" ";r.push(` ${S} ${String(g).padStart(4)} | ${m[h]}`)}r.push("");continue}}let d=(s.text.length>200?s.text.slice(0,200)+"\u2026":s.text).replace(/\n/g,"\u21B5").replace(/\s+/g," ");if(r.push(` L${s.lineStart}:${s.columnStart} [${s.kind}] ${d}`),s.metaVariables&&Object.keys(s.metaVariables).length>0)for(let[m,l]of Object.entries(s.metaVariables)){let p=l.length>80?l.slice(0,80)+"\u2026":l;r.push(` ${m} = ${p}`)}}return r.push(""),r.join(`
43
+ `)}async function X(){let{opts:t,listPresets:e}=G(process.argv.slice(2));if(e){if(t.json)console.log(JSON.stringify(y));else{console.log(`
44
+ Available presets:
45
+ `);for(let[n,o]of Object.entries(y))console.log(` ${n.padEnd(22)} ${o.description}`);console.log("")}return}!t.pattern&&!t.kind&&!t.preset&&!t.rule&&(console.error("Error: Must provide --pattern, --kind, --preset, or --rule"),console.error("Run with --help for usage information."),process.exit(1));let i=F(t.root,t);i.length===0&&(console.error(`No files found in ${t.root}`),process.exit(1));let r=I(i,t,t.root);t.json?console.log(JSON.stringify(r)):console.log(K(r,t,t.root))}T(import.meta.url)&&X().catch(t=>{console.error(t),process.exit(1)});export{y as PRESETS,F as collectSearchFiles,K as formatTextOutput,G as parseSearchArgs,I as runSearch,P as searchFile};
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import a from"node:fs";import x from"node:path";import w from"node:path";import{fileURLToPath as F}from"node:url";function b(e,t=process.argv[1]){return t?F(e)===w.resolve(t):!1}function R(){console.log(`
3
+ ast-tree-search \u2014 Search generated ast-trees.txt output
4
+
5
+ Usage:
6
+ node scripts/ast/tree-search.js [options]
7
+
8
+ Options:
9
+ --input, -i <path> Path to ast-trees.txt, a scan directory, or .octocode/scan (default: .octocode/scan)
10
+ --pattern, -p <regex> Regex to match against AST tree lines
11
+ --kind, -k <kind> Match a node kind (supports snake_case or PascalCase)
12
+ --file <regex> Filter matches to section file paths that match the regex
13
+ --section <regex> Filter matches to section headers that match the regex
14
+ --limit <n> Max matches to return (default: 50, 0 = all)
15
+ --context, -C <n> Context lines around each match (default: 0)
16
+ --json Output matches as JSON
17
+ --ignore-case Case-insensitive pattern matching
18
+ --help, -h Show this message
19
+
20
+ Examples:
21
+ node scripts/ast/tree-search.js -i .octocode/scan -k function_declaration --limit 25
22
+ node scripts/ast/tree-search.js -i .octocode/scan/2026-03-18T23-43-21-490Z -k ClassDeclaration --file 'src/index'
23
+ node scripts/ast/tree-search.js -i .octocode/scan -p 'IfStatement|SwitchStatement' --section 'src/'
24
+ `)}function u(e,t,s){let i=e.indexOf("=");return i!==-1?{value:e.slice(i+1),nextIndex:s}:{value:t[s+1]||"",nextIndex:s+1}}function y(e){let t={input:".octocode/scan",pattern:null,kind:null,context:0,json:!1,ignoreCase:!1,limit:50,file:null,section:null},s=!1;for(let i=0;i<e.length;i+=1){let n=e[i];if(n==="--json"){t.json=!0;continue}if(n==="--ignore-case"){t.ignoreCase=!0;continue}if(n==="--help"||n==="-h"){s=!0;continue}if(n==="--input"||n==="-i"||n.startsWith("--input=")){let r=u(n,e,i);t.input=r.value,i=r.nextIndex;continue}if(n==="--pattern"||n==="-p"||n.startsWith("--pattern=")){let r=u(n,e,i);t.pattern=r.value,i=r.nextIndex;continue}if(n==="--kind"||n==="-k"||n.startsWith("--kind=")){let r=u(n,e,i);t.kind=r.value,i=r.nextIndex;continue}if(n==="--file"||n.startsWith("--file=")){let r=u(n,e,i);t.file=r.value,i=r.nextIndex;continue}if(n==="--section"||n.startsWith("--section=")){let r=u(n,e,i);t.section=r.value,i=r.nextIndex;continue}if(n==="--limit"||n.startsWith("--limit=")){let r=u(n,e,i),o=Number.parseInt(r.value,10);t.limit=Number.isFinite(o)?o:50,i=r.nextIndex;continue}if(n==="--context"||n==="-C"||n.startsWith("--context=")){let r=u(n,e,i),o=Number.parseInt(r.value,10);t.context=Number.isFinite(o)?o:0,i=r.nextIndex;continue}throw new Error(`Unknown argument: ${n}`)}return{opts:t,showHelp:s}}function v(e){if(!e.pattern&&!e.kind)throw new Error("Must provide --pattern or --kind");if(!Number.isFinite(e.context)||e.context<0)throw new Error("--context must be a non-negative integer");if(!Number.isFinite(e.limit)||e.limit<0)throw new Error("--limit must be a non-negative integer")}function N(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[-\s]+/g,"_").toLowerCase()}function C(e){return e.split("_").filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function A(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function g(e,t,s){if(!e)return null;try{return new RegExp(e,t)}catch(i){throw new Error(`Invalid ${s} regex: ${i.message}`)}}function j(e){let s=e.indexOf(" \u2014 ");return s===-1?null:e.slice(s+3).trim()||null}function q(e){let t=x.resolve(e);if(!a.existsSync(t))throw new Error(`Input does not exist: ${t}`);if(a.statSync(t).isFile())return{requestedInput:t,inputFile:t,selectionMode:"direct-file"};let i=x.join(t,"ast-trees.txt");if(a.existsSync(i)&&a.statSync(i).isFile())return{requestedInput:t,inputFile:i,selectionMode:"scan-dir"};let n=a.readdirSync(t,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>x.join(t,r.name,"ast-trees.txt")).filter(r=>a.existsSync(r)&&a.statSync(r).isFile()).sort((r,o)=>a.statSync(o).mtimeMs-a.statSync(r).mtimeMs);if(n.length===0)throw new Error(`No ast-trees.txt found under: ${t}`);return{requestedInput:t,inputFile:n[0],selectionMode:"latest-scan"}}function E(e,t){let s=t.ignoreCase?"i":"",i=g(t.pattern,s,"pattern"),n=g(t.file,s,"file"),r=g(t.section,s,"section"),o=null;if(t.kind){let c=N(t.kind),l=C(c);o=new RegExp(`\\b(?:${A(c)}|${A(l)})\\b`,s)}let p=a.readFileSync(e.inputFile,"utf8").split(/\r?\n/),h=[],f="",d=null;for(let c=0;c<p.length;c+=1){let l=p[c];if(l.startsWith("## ")&&(f=l.slice(3).trim(),d=j(f)),i&&!i.test(l)||o&&!o.test(l)||r&&!r.test(f)||n&&!n.test(d??""))continue;let S=Math.max(0,c-t.context),T=Math.min(p.length,c+t.context+1);h.push({section:f,file:d,lineNumber:c+1,line:l,context:p.slice(S,T).map((k,I)=>({lineNumber:S+I+1,line:k}))})}let m=t.limit===0?h:h.slice(0,t.limit),$=new Set(h.map(c=>c.file).filter(Boolean)).size,M=[t.kind?`kind=${t.kind}`:null,t.pattern?`pattern=${t.pattern}`:null,t.file?`file=${t.file}`:null,t.section?`section=${t.section}`:null].filter(Boolean);return{requestedInput:e.requestedInput,inputFile:e.inputFile,selectionMode:e.selectionMode,query:M.join(", "),limit:t.limit,totalMatches:h.length,returnedMatches:m.length,truncated:m.length<h.length,uniqueFiles:$,matches:m}}function O(e,t){let s=[];s.push(`
25
+ AST tree search: ${e.query}`),s.push(`Requested input: ${e.requestedInput}`),s.push(`Selected AST file: ${e.inputFile} (${e.selectionMode})`),s.push(`Matches: ${e.totalMatches} total, showing ${e.returnedMatches}${e.truncated?` (limit ${e.limit})`:""}`),s.push(`Matched files: ${e.uniqueFiles}
26
+ `);let i="";for(let n of e.matches){if(n.section!==i&&(i=n.section,s.push(`-- ${i||"(no section)"} --`)),t.context>0){for(let o of n.context){let p=o.lineNumber===n.lineNumber?">":" ";s.push(` ${p} ${String(o.lineNumber).padStart(4)} | ${o.line}`)}s.push("");continue}let r=n.file?` (${n.file})`:"";s.push(` L${n.lineNumber}${r} ${n.line}`)}return e.totalMatches===0&&s.push("No matches found."),s.push(""),s.join(`
27
+ `)}async function L(){try{let{opts:e,showHelp:t}=y(process.argv.slice(2));if(t){R();return}v(e);let s=q(e.input),i=E(s,e);if(e.json){console.log(JSON.stringify(i,null,2));return}console.log(O(i,e))}catch(e){console.error(e.message),process.exit(1)}}b(import.meta.url)&&L();export{O as formatAstTreeSearchOutput,y as parseAstTreeSearchArgs,q as resolveAstTreeInput,E as searchAstTree,v as validateAstTreeSearchOptions};