oc-pilot 0.5.1 → 0.88.1

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 (481) hide show
  1. package/CHANGELOG.md +683 -0
  2. package/CONTRIBUTING.md +4 -2
  3. package/README.md +588 -20
  4. package/README.ru.md +572 -10
  5. package/dist/cli.js +185 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/cli.test.js +1211 -1
  8. package/dist/cli.test.js.map +1 -1
  9. package/dist/commands/anti-regression.js +97 -0
  10. package/dist/commands/anti-regression.js.map +1 -0
  11. package/dist/commands/arch-diff.js +80 -0
  12. package/dist/commands/arch-diff.js.map +1 -0
  13. package/dist/commands/authz.js +167 -0
  14. package/dist/commands/authz.js.map +1 -0
  15. package/dist/commands/autopsy.js +64 -0
  16. package/dist/commands/autopsy.js.map +1 -0
  17. package/dist/commands/bankruptcy.js +60 -0
  18. package/dist/commands/bankruptcy.js.map +1 -0
  19. package/dist/commands/battle.js +119 -0
  20. package/dist/commands/battle.js.map +1 -0
  21. package/dist/commands/boundaries.js +114 -0
  22. package/dist/commands/boundaries.js.map +1 -0
  23. package/dist/commands/bounty.js +56 -0
  24. package/dist/commands/bounty.js.map +1 -0
  25. package/dist/commands/brag.js +62 -0
  26. package/dist/commands/brag.js.map +1 -0
  27. package/dist/commands/cache.js +62 -0
  28. package/dist/commands/cache.js.map +1 -0
  29. package/dist/commands/cinema.js +61 -0
  30. package/dist/commands/cinema.js.map +1 -0
  31. package/dist/commands/cleanup.js +110 -0
  32. package/dist/commands/cleanup.js.map +1 -0
  33. package/dist/commands/commit.js +177 -0
  34. package/dist/commands/commit.js.map +1 -0
  35. package/dist/commands/commit.test.js +160 -0
  36. package/dist/commands/commit.test.js.map +1 -0
  37. package/dist/commands/compliance.js +121 -0
  38. package/dist/commands/compliance.js.map +1 -0
  39. package/dist/commands/contract-drift.js +97 -0
  40. package/dist/commands/contract-drift.js.map +1 -0
  41. package/dist/commands/coverage.js +137 -0
  42. package/dist/commands/coverage.js.map +1 -0
  43. package/dist/commands/day.js +116 -0
  44. package/dist/commands/day.js.map +1 -0
  45. package/dist/commands/day.test.js +45 -0
  46. package/dist/commands/day.test.js.map +1 -0
  47. package/dist/commands/deps.js +245 -0
  48. package/dist/commands/deps.js.map +1 -0
  49. package/dist/commands/docgen.js +4 -2
  50. package/dist/commands/docgen.js.map +1 -1
  51. package/dist/commands/doctor.js +146 -2
  52. package/dist/commands/doctor.js.map +1 -1
  53. package/dist/commands/doctor.test.js +69 -0
  54. package/dist/commands/doctor.test.js.map +1 -0
  55. package/dist/commands/echo.js +78 -0
  56. package/dist/commands/echo.js.map +1 -0
  57. package/dist/commands/ecosystem-verify.js +113 -0
  58. package/dist/commands/ecosystem-verify.js.map +1 -0
  59. package/dist/commands/env-sync.js +102 -0
  60. package/dist/commands/env-sync.js.map +1 -0
  61. package/dist/commands/explain.js +115 -0
  62. package/dist/commands/explain.js.map +1 -0
  63. package/dist/commands/fix.js +145 -3
  64. package/dist/commands/fix.js.map +1 -1
  65. package/dist/commands/flaky.js +111 -0
  66. package/dist/commands/flaky.js.map +1 -0
  67. package/dist/commands/fuzz.js +119 -0
  68. package/dist/commands/fuzz.js.map +1 -0
  69. package/dist/commands/hivemind.js +124 -0
  70. package/dist/commands/hivemind.js.map +1 -0
  71. package/dist/commands/impact.js +73 -0
  72. package/dist/commands/impact.js.map +1 -0
  73. package/dist/commands/init.js +73 -11
  74. package/dist/commands/init.js.map +1 -1
  75. package/dist/commands/init.test.js +138 -0
  76. package/dist/commands/init.test.js.map +1 -0
  77. package/dist/commands/install-hook.js +161 -0
  78. package/dist/commands/install-hook.js.map +1 -0
  79. package/dist/commands/install-hook.test.js +100 -0
  80. package/dist/commands/install-hook.test.js.map +1 -0
  81. package/dist/commands/invariants.js +103 -0
  82. package/dist/commands/invariants.js.map +1 -0
  83. package/dist/commands/mock-leak.js +97 -0
  84. package/dist/commands/mock-leak.js.map +1 -0
  85. package/dist/commands/mutate.js +99 -0
  86. package/dist/commands/mutate.js.map +1 -0
  87. package/dist/commands/pack.js +144 -0
  88. package/dist/commands/pack.js.map +1 -0
  89. package/dist/commands/preflight.js +137 -0
  90. package/dist/commands/preflight.js.map +1 -0
  91. package/dist/commands/query.js +57 -0
  92. package/dist/commands/query.js.map +1 -0
  93. package/dist/commands/ready.js +152 -0
  94. package/dist/commands/ready.js.map +1 -0
  95. package/dist/commands/receipt.js +289 -0
  96. package/dist/commands/receipt.js.map +1 -0
  97. package/dist/commands/replay.js +112 -0
  98. package/dist/commands/replay.js.map +1 -0
  99. package/dist/commands/replay.test.js +125 -0
  100. package/dist/commands/replay.test.js.map +1 -0
  101. package/dist/commands/restore.js +54 -0
  102. package/dist/commands/restore.js.map +1 -0
  103. package/dist/commands/review.js +263 -4
  104. package/dist/commands/review.js.map +1 -1
  105. package/dist/commands/review.test.js +160 -0
  106. package/dist/commands/review.test.js.map +1 -0
  107. package/dist/commands/reviewers.js +86 -0
  108. package/dist/commands/reviewers.js.map +1 -0
  109. package/dist/commands/roast.js +102 -0
  110. package/dist/commands/roast.js.map +1 -0
  111. package/dist/commands/sandbox.js +82 -0
  112. package/dist/commands/sandbox.js.map +1 -0
  113. package/dist/commands/sast.js +162 -0
  114. package/dist/commands/sast.js.map +1 -0
  115. package/dist/commands/scan.js +47 -12
  116. package/dist/commands/scan.js.map +1 -1
  117. package/dist/commands/slop.js +145 -0
  118. package/dist/commands/slop.js.map +1 -0
  119. package/dist/commands/slop.test.js +135 -0
  120. package/dist/commands/slop.test.js.map +1 -0
  121. package/dist/commands/stats.js +61 -0
  122. package/dist/commands/stats.js.map +1 -0
  123. package/dist/commands/test-gen.js +372 -0
  124. package/dist/commands/test-gen.js.map +1 -0
  125. package/dist/commands/test-guard.js +89 -0
  126. package/dist/commands/test-guard.js.map +1 -0
  127. package/dist/commands/test-plan.js +133 -0
  128. package/dist/commands/test-plan.js.map +1 -0
  129. package/dist/commands/zoom-symbol.js +52 -0
  130. package/dist/commands/zoom-symbol.js.map +1 -0
  131. package/dist/core/agent-rules.js +35 -0
  132. package/dist/core/agent-rules.js.map +1 -0
  133. package/dist/core/anthropic.test.js +116 -0
  134. package/dist/core/anthropic.test.js.map +1 -0
  135. package/dist/core/anti-regression.js +161 -0
  136. package/dist/core/anti-regression.js.map +1 -0
  137. package/dist/core/anti-regression.test.js +154 -0
  138. package/dist/core/anti-regression.test.js.map +1 -0
  139. package/dist/core/aql.js +220 -0
  140. package/dist/core/aql.js.map +1 -0
  141. package/dist/core/aql.test.js +64 -0
  142. package/dist/core/aql.test.js.map +1 -0
  143. package/dist/core/arch-diff.js +122 -0
  144. package/dist/core/arch-diff.js.map +1 -0
  145. package/dist/core/arch-diff.test.js +93 -0
  146. package/dist/core/arch-diff.test.js.map +1 -0
  147. package/dist/core/authz.js +292 -0
  148. package/dist/core/authz.js.map +1 -0
  149. package/dist/core/authz.test.js +115 -0
  150. package/dist/core/authz.test.js.map +1 -0
  151. package/dist/core/autopsy.js +230 -0
  152. package/dist/core/autopsy.js.map +1 -0
  153. package/dist/core/autopsy.test.js +106 -0
  154. package/dist/core/autopsy.test.js.map +1 -0
  155. package/dist/core/bankruptcy.js +232 -0
  156. package/dist/core/bankruptcy.js.map +1 -0
  157. package/dist/core/bankruptcy.test.js +91 -0
  158. package/dist/core/bankruptcy.test.js.map +1 -0
  159. package/dist/core/baseline.js +131 -0
  160. package/dist/core/baseline.js.map +1 -0
  161. package/dist/core/baseline.test.js +91 -0
  162. package/dist/core/baseline.test.js.map +1 -0
  163. package/dist/core/battle.js +213 -0
  164. package/dist/core/battle.js.map +1 -0
  165. package/dist/core/battle.test.js +116 -0
  166. package/dist/core/battle.test.js.map +1 -0
  167. package/dist/core/boundaries.js +200 -0
  168. package/dist/core/boundaries.js.map +1 -0
  169. package/dist/core/boundaries.test.js +62 -0
  170. package/dist/core/boundaries.test.js.map +1 -0
  171. package/dist/core/bounty.js +128 -0
  172. package/dist/core/bounty.js.map +1 -0
  173. package/dist/core/bounty.test.js +82 -0
  174. package/dist/core/bounty.test.js.map +1 -0
  175. package/dist/core/brag.js +174 -0
  176. package/dist/core/brag.js.map +1 -0
  177. package/dist/core/brag.test.js +43 -0
  178. package/dist/core/brag.test.js.map +1 -0
  179. package/dist/core/cache.js +189 -0
  180. package/dist/core/cache.js.map +1 -0
  181. package/dist/core/cache.test.js +159 -0
  182. package/dist/core/cache.test.js.map +1 -0
  183. package/dist/core/cinema.js +242 -0
  184. package/dist/core/cinema.js.map +1 -0
  185. package/dist/core/cinema.test.js +73 -0
  186. package/dist/core/cinema.test.js.map +1 -0
  187. package/dist/core/cleanup.js +107 -0
  188. package/dist/core/cleanup.js.map +1 -0
  189. package/dist/core/compliance.js +193 -0
  190. package/dist/core/compliance.js.map +1 -0
  191. package/dist/core/compliance.test.js +123 -0
  192. package/dist/core/compliance.test.js.map +1 -0
  193. package/dist/core/config.js +78 -0
  194. package/dist/core/config.js.map +1 -1
  195. package/dist/core/config.test.js +66 -0
  196. package/dist/core/config.test.js.map +1 -1
  197. package/dist/core/contract-drift.js +296 -0
  198. package/dist/core/contract-drift.js.map +1 -0
  199. package/dist/core/contract-drift.test.js +166 -0
  200. package/dist/core/contract-drift.test.js.map +1 -0
  201. package/dist/core/cost.test.js +103 -0
  202. package/dist/core/cost.test.js.map +1 -0
  203. package/dist/core/coverage.js +335 -0
  204. package/dist/core/coverage.js.map +1 -0
  205. package/dist/core/coverage.test.js +190 -0
  206. package/dist/core/coverage.test.js.map +1 -0
  207. package/dist/core/deps-fix.js +169 -0
  208. package/dist/core/deps-fix.js.map +1 -0
  209. package/dist/core/deps-fix.test.js +176 -0
  210. package/dist/core/deps-fix.test.js.map +1 -0
  211. package/dist/core/deps-health.js +353 -0
  212. package/dist/core/deps-health.js.map +1 -0
  213. package/dist/core/deps-health.test.js +230 -0
  214. package/dist/core/deps-health.test.js.map +1 -0
  215. package/dist/core/deps-why.js +260 -0
  216. package/dist/core/deps-why.js.map +1 -0
  217. package/dist/core/deps-why.test.js +175 -0
  218. package/dist/core/deps-why.test.js.map +1 -0
  219. package/dist/core/deps.js +179 -0
  220. package/dist/core/deps.js.map +1 -0
  221. package/dist/core/deps.test.js +88 -0
  222. package/dist/core/deps.test.js.map +1 -0
  223. package/dist/core/diff-source.js +4 -2
  224. package/dist/core/diff-source.js.map +1 -1
  225. package/dist/core/echo.js +151 -0
  226. package/dist/core/echo.js.map +1 -0
  227. package/dist/core/echo.test.js +90 -0
  228. package/dist/core/echo.test.js.map +1 -0
  229. package/dist/core/ecosystem-verify.js +331 -0
  230. package/dist/core/ecosystem-verify.js.map +1 -0
  231. package/dist/core/ecosystem-verify.test.js +158 -0
  232. package/dist/core/ecosystem-verify.test.js.map +1 -0
  233. package/dist/core/engine-preset.test.js +60 -0
  234. package/dist/core/engine-preset.test.js.map +1 -0
  235. package/dist/core/engine.js +278 -32
  236. package/dist/core/engine.js.map +1 -1
  237. package/dist/core/engine.test.js +63 -0
  238. package/dist/core/engine.test.js.map +1 -1
  239. package/dist/core/env-sync.js +122 -0
  240. package/dist/core/env-sync.js.map +1 -0
  241. package/dist/core/env-sync.test.js +99 -0
  242. package/dist/core/env-sync.test.js.map +1 -0
  243. package/dist/core/file-context.js +4 -2
  244. package/dist/core/file-context.js.map +1 -1
  245. package/dist/core/findings-baseline.js +60 -0
  246. package/dist/core/findings-baseline.js.map +1 -0
  247. package/dist/core/findings-baseline.test.js +77 -0
  248. package/dist/core/findings-baseline.test.js.map +1 -0
  249. package/dist/core/findings.js +68 -21
  250. package/dist/core/findings.js.map +1 -1
  251. package/dist/core/flaky.js +137 -0
  252. package/dist/core/flaky.js.map +1 -0
  253. package/dist/core/flaky.test.js +97 -0
  254. package/dist/core/flaky.test.js.map +1 -0
  255. package/dist/core/format.js +5 -3
  256. package/dist/core/format.js.map +1 -1
  257. package/dist/core/fuzz.js +306 -0
  258. package/dist/core/fuzz.js.map +1 -0
  259. package/dist/core/fuzz.test.js +121 -0
  260. package/dist/core/fuzz.test.js.map +1 -0
  261. package/dist/core/git.js +22 -0
  262. package/dist/core/git.js.map +1 -1
  263. package/dist/core/gitlab.js +176 -0
  264. package/dist/core/gitlab.js.map +1 -0
  265. package/dist/core/gitlab.test.js +199 -0
  266. package/dist/core/gitlab.test.js.map +1 -0
  267. package/dist/core/hivemind.js +250 -0
  268. package/dist/core/hivemind.js.map +1 -0
  269. package/dist/core/hivemind.test.js +79 -0
  270. package/dist/core/hivemind.test.js.map +1 -0
  271. package/dist/core/hologram.js +463 -0
  272. package/dist/core/hologram.js.map +1 -0
  273. package/dist/core/hologram.test.js +124 -0
  274. package/dist/core/hologram.test.js.map +1 -0
  275. package/dist/core/impact.js +240 -0
  276. package/dist/core/impact.js.map +1 -0
  277. package/dist/core/impact.test.js +105 -0
  278. package/dist/core/impact.test.js.map +1 -0
  279. package/dist/core/import-graph.js +170 -0
  280. package/dist/core/import-graph.js.map +1 -0
  281. package/dist/core/import-graph.test.js +52 -0
  282. package/dist/core/import-graph.test.js.map +1 -0
  283. package/dist/core/injection.js +55 -0
  284. package/dist/core/injection.js.map +1 -0
  285. package/dist/core/injection.test.js +45 -0
  286. package/dist/core/injection.test.js.map +1 -0
  287. package/dist/core/invariants.js +286 -0
  288. package/dist/core/invariants.js.map +1 -0
  289. package/dist/core/invariants.test.js +87 -0
  290. package/dist/core/invariants.test.js.map +1 -0
  291. package/dist/core/last-review.js +92 -0
  292. package/dist/core/last-review.js.map +1 -0
  293. package/dist/core/last-review.test.js +97 -0
  294. package/dist/core/last-review.test.js.map +1 -0
  295. package/dist/core/lockfile-support.test.js +112 -0
  296. package/dist/core/lockfile-support.test.js.map +1 -0
  297. package/dist/core/lockfile.js +284 -0
  298. package/dist/core/lockfile.js.map +1 -0
  299. package/dist/core/lockfile.test.js +203 -0
  300. package/dist/core/lockfile.test.js.map +1 -0
  301. package/dist/core/mock-leak.js +120 -0
  302. package/dist/core/mock-leak.js.map +1 -0
  303. package/dist/core/mock-leak.test.js +79 -0
  304. package/dist/core/mock-leak.test.js.map +1 -0
  305. package/dist/core/mutation.js +206 -0
  306. package/dist/core/mutation.js.map +1 -0
  307. package/dist/core/mutation.test.js +104 -0
  308. package/dist/core/mutation.test.js.map +1 -0
  309. package/dist/core/opencode.js +15 -2
  310. package/dist/core/opencode.js.map +1 -1
  311. package/dist/core/opencode.test.js +10 -1
  312. package/dist/core/opencode.test.js.map +1 -1
  313. package/dist/core/options.js +51 -3
  314. package/dist/core/options.js.map +1 -1
  315. package/dist/core/osv.js +202 -0
  316. package/dist/core/osv.js.map +1 -0
  317. package/dist/core/osv.test.js +173 -0
  318. package/dist/core/osv.test.js.map +1 -0
  319. package/dist/core/output-format.test.js +102 -0
  320. package/dist/core/output-format.test.js.map +1 -0
  321. package/dist/core/pack.js +212 -0
  322. package/dist/core/pack.js.map +1 -0
  323. package/dist/core/pack.test.js +129 -0
  324. package/dist/core/pack.test.js.map +1 -0
  325. package/dist/core/phantom.js +155 -0
  326. package/dist/core/phantom.js.map +1 -0
  327. package/dist/core/phantom.test.js +58 -0
  328. package/dist/core/phantom.test.js.map +1 -0
  329. package/dist/core/pr-comment.js +116 -0
  330. package/dist/core/pr-comment.js.map +1 -0
  331. package/dist/core/pr-comment.test.js +53 -0
  332. package/dist/core/pr-comment.test.js.map +1 -0
  333. package/dist/core/pr-review.js +160 -0
  334. package/dist/core/pr-review.js.map +1 -0
  335. package/dist/core/pr-review.test.js +62 -0
  336. package/dist/core/pr-review.test.js.map +1 -0
  337. package/dist/core/preflight-run.js +106 -0
  338. package/dist/core/preflight-run.js.map +1 -0
  339. package/dist/core/preflight.js +173 -0
  340. package/dist/core/preflight.js.map +1 -0
  341. package/dist/core/preflight.test.js +187 -0
  342. package/dist/core/preflight.test.js.map +1 -0
  343. package/dist/core/presets.js +408 -0
  344. package/dist/core/presets.js.map +1 -0
  345. package/dist/core/presets.test.js +79 -0
  346. package/dist/core/presets.test.js.map +1 -0
  347. package/dist/core/prompt.golden.test.js +74 -0
  348. package/dist/core/prompt.golden.test.js.map +1 -0
  349. package/dist/core/prompt.js +43 -4
  350. package/dist/core/prompt.js.map +1 -1
  351. package/dist/core/prompt.test.js +16 -0
  352. package/dist/core/prompt.test.js.map +1 -1
  353. package/dist/core/readiness-fix.js +111 -0
  354. package/dist/core/readiness-fix.js.map +1 -0
  355. package/dist/core/readiness-fix.test.js +99 -0
  356. package/dist/core/readiness-fix.test.js.map +1 -0
  357. package/dist/core/readiness.js +189 -0
  358. package/dist/core/readiness.js.map +1 -0
  359. package/dist/core/readiness.test.js +199 -0
  360. package/dist/core/readiness.test.js.map +1 -0
  361. package/dist/core/receipt.js +193 -0
  362. package/dist/core/receipt.js.map +1 -0
  363. package/dist/core/receipt.test.js +193 -0
  364. package/dist/core/receipt.test.js.map +1 -0
  365. package/dist/core/reviewers.js +179 -0
  366. package/dist/core/reviewers.js.map +1 -0
  367. package/dist/core/reviewers.test.js +105 -0
  368. package/dist/core/reviewers.test.js.map +1 -0
  369. package/dist/core/roast.js +27 -0
  370. package/dist/core/roast.js.map +1 -0
  371. package/dist/core/roast.test.js +19 -0
  372. package/dist/core/roast.test.js.map +1 -0
  373. package/dist/core/router.js +8 -0
  374. package/dist/core/router.js.map +1 -0
  375. package/dist/core/router.test.js +157 -0
  376. package/dist/core/router.test.js.map +1 -0
  377. package/dist/core/rules.js +2 -2
  378. package/dist/core/rules.js.map +1 -1
  379. package/dist/core/run.js +322 -20
  380. package/dist/core/run.js.map +1 -1
  381. package/dist/core/sarif.js +125 -0
  382. package/dist/core/sarif.js.map +1 -0
  383. package/dist/core/sarif.test.js +60 -0
  384. package/dist/core/sarif.test.js.map +1 -0
  385. package/dist/core/sast.js +324 -0
  386. package/dist/core/sast.js.map +1 -0
  387. package/dist/core/sast.test.js +105 -0
  388. package/dist/core/sast.test.js.map +1 -0
  389. package/dist/core/sbom.js +121 -0
  390. package/dist/core/sbom.js.map +1 -0
  391. package/dist/core/sbom.test.js +81 -0
  392. package/dist/core/sbom.test.js.map +1 -0
  393. package/dist/core/second-opinion.js +88 -0
  394. package/dist/core/second-opinion.js.map +1 -0
  395. package/dist/core/second-opinion.test.js +89 -0
  396. package/dist/core/second-opinion.test.js.map +1 -0
  397. package/dist/core/secrets.js +120 -5
  398. package/dist/core/secrets.js.map +1 -1
  399. package/dist/core/secrets.test.js +74 -1
  400. package/dist/core/secrets.test.js.map +1 -1
  401. package/dist/core/shadow.js +94 -0
  402. package/dist/core/shadow.js.map +1 -0
  403. package/dist/core/shadow.test.js +50 -0
  404. package/dist/core/shadow.test.js.map +1 -0
  405. package/dist/core/slicing.js +110 -0
  406. package/dist/core/slicing.js.map +1 -0
  407. package/dist/core/slicing.test.js +287 -0
  408. package/dist/core/slicing.test.js.map +1 -0
  409. package/dist/core/slop/churn.js +49 -0
  410. package/dist/core/slop/churn.js.map +1 -0
  411. package/dist/core/slop/collect.js +186 -0
  412. package/dist/core/slop/collect.js.map +1 -0
  413. package/dist/core/slop/dead-exports.js +101 -0
  414. package/dist/core/slop/dead-exports.js.map +1 -0
  415. package/dist/core/slop/duplicates.js +155 -0
  416. package/dist/core/slop/duplicates.js.map +1 -0
  417. package/dist/core/slop/index.js +72 -0
  418. package/dist/core/slop/index.js.map +1 -0
  419. package/dist/core/slop/model.js +2 -0
  420. package/dist/core/slop/model.js.map +1 -0
  421. package/dist/core/slop/score.js +185 -0
  422. package/dist/core/slop/score.js.map +1 -0
  423. package/dist/core/slop/slop.test.js +160 -0
  424. package/dist/core/slop/slop.test.js.map +1 -0
  425. package/dist/core/slop/source.js +129 -0
  426. package/dist/core/slop/source.js.map +1 -0
  427. package/dist/core/slop/test-debt.js +178 -0
  428. package/dist/core/slop/test-debt.js.map +1 -0
  429. package/dist/core/slop/test-debt.test.js +114 -0
  430. package/dist/core/slop/test-debt.test.js.map +1 -0
  431. package/dist/core/slop/todos.js +117 -0
  432. package/dist/core/slop/todos.js.map +1 -0
  433. package/dist/core/snapshot.js +214 -0
  434. package/dist/core/snapshot.js.map +1 -0
  435. package/dist/core/snapshot.test.js +101 -0
  436. package/dist/core/snapshot.test.js.map +1 -0
  437. package/dist/core/stats.js +119 -0
  438. package/dist/core/stats.js.map +1 -0
  439. package/dist/core/stats.test.js +86 -0
  440. package/dist/core/stats.test.js.map +1 -0
  441. package/dist/core/suppressions.js +96 -0
  442. package/dist/core/suppressions.js.map +1 -0
  443. package/dist/core/suppressions.test.js +90 -0
  444. package/dist/core/suppressions.test.js.map +1 -0
  445. package/dist/core/test-delta.js +53 -0
  446. package/dist/core/test-delta.js.map +1 -0
  447. package/dist/core/test-delta.test.js +41 -0
  448. package/dist/core/test-delta.test.js.map +1 -0
  449. package/dist/core/test-plan.js +212 -0
  450. package/dist/core/test-plan.js.map +1 -0
  451. package/dist/core/test-plan.test.js +94 -0
  452. package/dist/core/test-plan.test.js.map +1 -0
  453. package/dist/core/test-weakening.js +191 -0
  454. package/dist/core/test-weakening.js.map +1 -0
  455. package/dist/core/test-weakening.test.js +114 -0
  456. package/dist/core/test-weakening.test.js.map +1 -0
  457. package/dist/core/tree-scan.js +77 -0
  458. package/dist/core/tree-scan.js.map +1 -0
  459. package/dist/core/tree-scan.test.js +58 -0
  460. package/dist/core/tree-scan.test.js.map +1 -0
  461. package/dist/mcp-prompts.test.js +133 -0
  462. package/dist/mcp-prompts.test.js.map +1 -0
  463. package/dist/mcp.js +3303 -240
  464. package/dist/mcp.js.map +1 -1
  465. package/dist/mcp.test.js +1739 -1
  466. package/dist/mcp.test.js.map +1 -1
  467. package/dist/skills.test.js +221 -0
  468. package/dist/skills.test.js.map +1 -0
  469. package/dist/version.js +1 -1
  470. package/dist/version.js.map +1 -1
  471. package/docs/integrations.md +151 -7
  472. package/package.json +2 -1
  473. package/prompts/oc-pilot.en.md +8 -1
  474. package/prompts/oc-pilot.ru.md +8 -1
  475. package/server.json +2 -2
  476. package/skills/agent-self-review/SKILL.md +87 -0
  477. package/skills/commit-discipline/SKILL.md +86 -0
  478. package/skills/oc-pilot/SKILL.md +86 -0
  479. package/skills/secure-diff-gate/SKILL.md +101 -0
  480. package/skills/stack-review-packs/SKILL.md +76 -0
  481. package/skills/test-failure-triage/SKILL.md +88 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Dependency health: audits package.json against the imports the code actually
3
+ * makes. Catches the clean-install breakers agents create: phantom imports of
4
+ * transitive packages, declared-but-unused dependencies, test-only packages in
5
+ * `dependencies`, overlapping libraries, unsafe specs and a lockfile that is
6
+ * out of sync with the manifest. Everything is offline and deterministic.
7
+ */
8
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
9
+ import { join } from "node:path";
10
+ import { PilotError } from "./errors.js";
11
+ import { detectLockfile, lockfileHint, readLockfile } from "./lockfile.js";
12
+ import { readRepository } from "./slop/collect.js";
13
+ import { isTestFile } from "./slop/source.js";
14
+ const NODE_BUILTINS = new Set([
15
+ "assert",
16
+ "async_hooks",
17
+ "buffer",
18
+ "child_process",
19
+ "cluster",
20
+ "console",
21
+ "constants",
22
+ "crypto",
23
+ "dgram",
24
+ "diagnostics_channel",
25
+ "dns",
26
+ "domain",
27
+ "events",
28
+ "fs",
29
+ "http",
30
+ "http2",
31
+ "https",
32
+ "inspector",
33
+ "module",
34
+ "net",
35
+ "os",
36
+ "path",
37
+ "perf_hooks",
38
+ "process",
39
+ "punycode",
40
+ "querystring",
41
+ "readline",
42
+ "repl",
43
+ "string_decoder",
44
+ "timers",
45
+ "tls",
46
+ "trace_events",
47
+ "tty",
48
+ "url",
49
+ "util",
50
+ "v8",
51
+ "vm",
52
+ "wasi",
53
+ "worker_threads",
54
+ "zlib",
55
+ ]);
56
+ /** Injected by compilers and polyfills rather than imported by source. */
57
+ const TOOLING_PACKAGES = new Set(["tslib", "core-js", "regenerator-runtime", "@babel/runtime"]);
58
+ /** Libraries that solve the same task: keeping two of them is dependency slop. */
59
+ const OVERLAPS = [
60
+ ["moment", "dayjs", "date-fns", "luxon"],
61
+ ["lodash", "underscore", "ramda"],
62
+ ["axios", "got", "node-fetch", "superagent", "undici"],
63
+ ["jest", "vitest", "mocha", "ava", "tap"],
64
+ ["eslint", "biome", "oxlint"],
65
+ ["webpack", "vite", "rollup", "esbuild", "parcel"],
66
+ ["express", "fastify", "koa", "hapi", "@hapi/hapi"],
67
+ ["chalk", "kleur", "picocolors", "ansi-colors", "yoctocolors"],
68
+ ["yargs", "commander", "meow", "cac", "minimist"],
69
+ ["pg", "mysql2", "better-sqlite3", "sqlite3", "mongodb", "mongoose", "prisma", "sequelize", "drizzle-orm", "knex"],
70
+ ];
71
+ const IMPORT_PATTERNS = [
72
+ // import x from "pkg"; import type { T } from "pkg"; import "pkg";
73
+ /^[ \t]*import\s+(?:type\s+)?(?:[^'"\n;]*?\s+from\s+)?["']([^"']+)["']/gm,
74
+ // export * from "pkg"; export { a } from "pkg";
75
+ /^[ \t]*export\s+(?:type\s+)?(?:\*|\{[^}]*\})\s+from\s+["']([^"']+)["']/gm,
76
+ // closing line of a multi-line import or export: } from "pkg";
77
+ /^[ \t]*\}\s+from\s+["']([^"']+)["']/gm,
78
+ // require("pkg") and dynamic import("pkg") can appear anywhere.
79
+ /^[ \t]*(?:(?:(?:const|let|var)\s+)?[A-Za-z_$][\w$.\[\]]*\s*=\s*)?require\s*\(\s*["']([^"']+)["']\s*\)/gm,
80
+ /^[ \t]*(?:(?:(?:const|let|var)\s+)?[A-Za-z_$][\w$.\[\]]*\s*=\s*)?(?:await\s+)?import\s*\(\s*["']([^"']+)["']\s*\)/gm,
81
+ ];
82
+ const SEVERITY_WEIGHT = { high: 3, medium: 2, low: 1 };
83
+ function escapeRegExp(value) {
84
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
85
+ }
86
+ /** `@scope/pkg/sub` -> `@scope/pkg`, `pkg/sub` -> `pkg`; relative and builtin schemes -> undefined. */
87
+ export function packageNameOf(specifier) {
88
+ const value = specifier.trim();
89
+ if (!value)
90
+ return undefined;
91
+ if (value.startsWith(".") || value.startsWith("/") || value.startsWith("#"))
92
+ return undefined;
93
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(value))
94
+ return undefined;
95
+ const parts = value.split("/");
96
+ if (value.startsWith("@")) {
97
+ return parts.length >= 2 && parts[1] ? `${parts[0]}/${parts[1]}` : undefined;
98
+ }
99
+ return parts[0] || undefined;
100
+ }
101
+ /** Removes comments and template literals so code samples inside strings are not read as imports. */
102
+ function codeOnly(text) {
103
+ return text
104
+ .replace(/\/\*[\s\S]*?\*\//g, (block) => block.replace(/[^\n]/g, " "))
105
+ .replace(/`(?:\\[\s\S]|[^`\\])*`/g, (literal) => literal.replace(/[^\n]/g, " "));
106
+ }
107
+ function importedPackages(text) {
108
+ const found = new Set();
109
+ const source = codeOnly(text);
110
+ for (const pattern of IMPORT_PATTERNS) {
111
+ pattern.lastIndex = 0;
112
+ let match;
113
+ while ((match = pattern.exec(source)) !== null) {
114
+ const name = packageNameOf(match[1] ?? "");
115
+ if (name)
116
+ found.add(name);
117
+ }
118
+ }
119
+ return [...found];
120
+ }
121
+ function readJsonFile(path) {
122
+ try {
123
+ const parsed = JSON.parse(readFileSync(path, "utf8").replace(/^\uFEFF/, ""));
124
+ return parsed;
125
+ }
126
+ catch {
127
+ return undefined;
128
+ }
129
+ }
130
+ function workspaceNames(cwd, manifest) {
131
+ const patterns = Array.isArray(manifest.workspaces)
132
+ ? manifest.workspaces
133
+ : manifest.workspaces?.packages ?? [];
134
+ const names = new Set();
135
+ for (const pattern of patterns) {
136
+ const normalized = pattern.replace(/\\/g, "/").replace(/\/+$/, "");
137
+ if (!normalized.endsWith("/*"))
138
+ continue;
139
+ const base = join(cwd, normalized.slice(0, -2));
140
+ if (!existsSync(base))
141
+ continue;
142
+ for (const entry of readdirSync(base)) {
143
+ const child = readJsonFile(join(base, entry, "package.json"));
144
+ if (!child || typeof child !== "object")
145
+ continue;
146
+ const name = child.name;
147
+ if (name)
148
+ names.add(name);
149
+ }
150
+ }
151
+ return names;
152
+ }
153
+ /** Configuration blocks (`lint-staged`, `babel`, ...) name packages without importing them. */
154
+ function manifestExtras(manifest) {
155
+ const extras = {};
156
+ for (const [key, value] of Object.entries(manifest)) {
157
+ if (/dependencies$/i.test(key) || key === "scripts" || key === "name")
158
+ continue;
159
+ extras[key] = value;
160
+ }
161
+ return JSON.stringify(extras);
162
+ }
163
+ function mentionedInScripts(scripts, name) {
164
+ return new RegExp(`(?:^|[\\s"'/:=])${escapeRegExp(name)}(?:$|[\\s"'/:=])`).test(scripts);
165
+ }
166
+ function quotedAnywhere(files, name) {
167
+ const pattern = new RegExp(`["'\`]${escapeRegExp(name)}(?:/[^"'\`\\s]*)?["'\`]`);
168
+ return files.some((file) => pattern.test(file.text));
169
+ }
170
+ function isNpmProjectManifest(path) {
171
+ return /(^|\/)package\.json$/.test(path.replace(/\\/g, "/"));
172
+ }
173
+ export function auditDependencies(cwd, options = {}) {
174
+ const manifestPath = join(cwd, "package.json");
175
+ if (!existsSync(manifestPath) || !isNpmProjectManifest(manifestPath)) {
176
+ throw new PilotError("package.json не найден", {
177
+ hint: "Запустите команду в корне npm-проекта или укажите --cwd.",
178
+ exitCode: 2,
179
+ });
180
+ }
181
+ const parsed = readJsonFile(manifestPath);
182
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
183
+ throw new PilotError("Не удалось прочитать package.json", {
184
+ hint: "Проверьте, что файл содержит корректный JSON.",
185
+ exitCode: 2,
186
+ });
187
+ }
188
+ const manifest = parsed;
189
+ const declared = new Map();
190
+ const collect = (record, field, overwrite) => {
191
+ for (const [name, spec] of Object.entries(record ?? {})) {
192
+ if (overwrite || !declared.has(name))
193
+ declared.set(name, { field, spec });
194
+ }
195
+ };
196
+ collect(manifest.dependencies, "prod", true);
197
+ collect(manifest.devDependencies, "dev", false);
198
+ collect(manifest.peerDependencies, "peer", false);
199
+ collect(manifest.optionalDependencies, "optional", true);
200
+ const ignore = new Set(options.ignore ?? []);
201
+ const repository = readRepository(cwd);
202
+ const files = repository.files;
203
+ const workspaces = workspaceNames(cwd, manifest);
204
+ const skip = (name) => ignore.has(name) || name === manifest.name || workspaces.has(name);
205
+ const usage = new Map();
206
+ for (const file of files) {
207
+ for (const name of importedPackages(file.text)) {
208
+ const paths = usage.get(name) ?? [];
209
+ if (!paths.includes(file.path))
210
+ paths.push(file.path);
211
+ usage.set(name, paths);
212
+ }
213
+ }
214
+ const scripts = Object.values(manifest.scripts ?? {}).join("\n");
215
+ const extras = manifestExtras(manifest);
216
+ const issues = [];
217
+ for (const [name, paths] of usage) {
218
+ if (skip(name) || NODE_BUILTINS.has(name) || declared.has(name))
219
+ continue;
220
+ issues.push({
221
+ kind: "phantom",
222
+ severity: "high",
223
+ name,
224
+ files: paths.slice(0, 5),
225
+ message: `импортируется в ${paths.length} файле(ах), но не объявлен в package.json — чистая установка упадёт`,
226
+ });
227
+ }
228
+ for (const [name, info] of declared) {
229
+ if (skip(name) || info.field === "peer")
230
+ continue;
231
+ if (name.startsWith("@types/") || TOOLING_PACKAGES.has(name))
232
+ continue;
233
+ if (usage.has(name) || quotedAnywhere(files, name))
234
+ continue;
235
+ if (mentionedInScripts(scripts, name) || mentionedInScripts(extras, name))
236
+ continue;
237
+ issues.push({
238
+ kind: "unused",
239
+ severity: "medium",
240
+ name,
241
+ message: "объявлен, но нигде не используется — можно удалить",
242
+ });
243
+ }
244
+ for (const [name, info] of declared) {
245
+ if (skip(name) || (info.field !== "prod" && info.field !== "optional"))
246
+ continue;
247
+ const paths = usage.get(name);
248
+ if (!paths || paths.length === 0)
249
+ continue;
250
+ if (!paths.every((path) => isTestFile(path)))
251
+ continue;
252
+ issues.push({
253
+ kind: "misplaced",
254
+ severity: "low",
255
+ name,
256
+ files: paths.slice(0, 5),
257
+ message: "используется только в тестах — перенесите в devDependencies",
258
+ });
259
+ }
260
+ for (const group of OVERLAPS) {
261
+ const present = group.filter((name) => declared.has(name));
262
+ if (present.length < 2)
263
+ continue;
264
+ issues.push({
265
+ kind: "duplicate",
266
+ severity: "low",
267
+ name: present.join(", "),
268
+ message: `${present.length} пакета решают одну задачу — оставьте один`,
269
+ });
270
+ }
271
+ for (const [name, info] of declared) {
272
+ if (skip(name) || info.field === "peer")
273
+ continue;
274
+ const spec = info.spec.trim();
275
+ if (!spec || spec === "*" || spec === "latest") {
276
+ issues.push({
277
+ kind: "unpinned",
278
+ severity: "medium",
279
+ name,
280
+ message: `диапазон версии «${spec || "пусто"}» не фиксирует версию`,
281
+ });
282
+ continue;
283
+ }
284
+ if (spec.startsWith("workspace:"))
285
+ continue;
286
+ if (/^(git\+|github:|git@|https?:\/\/)/i.test(spec)) {
287
+ issues.push({
288
+ kind: "vcs",
289
+ severity: "high",
290
+ name,
291
+ message: `зависимость подключена из ${spec} — код не проверен реестром`,
292
+ });
293
+ }
294
+ else if (spec.startsWith("file:")) {
295
+ issues.push({
296
+ kind: "vcs",
297
+ severity: "low",
298
+ name,
299
+ message: "локальная зависимость file: не попадёт в публикацию",
300
+ });
301
+ }
302
+ }
303
+ let lockfile = null;
304
+ const lockInfo = detectLockfile(cwd);
305
+ if (lockInfo) {
306
+ lockfile = lockInfo.file;
307
+ const lock = readLockfile(cwd);
308
+ if (!lock || lock.packages.length === 0) {
309
+ issues.push({
310
+ kind: "lockfile",
311
+ severity: "low",
312
+ name: lockInfo.file,
313
+ message: "не удалось прочитать lockfile — проверьте формат",
314
+ });
315
+ }
316
+ else {
317
+ const installed = new Set(lock.packages.map((entry) => entry.name));
318
+ for (const [name, info] of declared) {
319
+ if (skip(name) || info.field === "peer")
320
+ continue;
321
+ if (/^(workspace:|file:)/.test(info.spec.trim()))
322
+ continue;
323
+ if (installed.has(name))
324
+ continue;
325
+ issues.push({
326
+ kind: "lockfile",
327
+ severity: "high",
328
+ name,
329
+ message: `объявлен в package.json, но отсутствует в ${lockInfo.file} — ${lockfileHint(lockInfo.kind)}`,
330
+ });
331
+ }
332
+ }
333
+ }
334
+ const order = { high: 0, medium: 1, low: 2 };
335
+ issues.sort((left, right) => order[left.severity] - order[right.severity] ||
336
+ left.kind.localeCompare(right.kind) ||
337
+ left.name.localeCompare(right.name));
338
+ return {
339
+ packageName: manifest.name ?? "(без имени)",
340
+ declared: declared.size,
341
+ imported: usage.size,
342
+ scannedFiles: files.length,
343
+ truncated: repository.truncated,
344
+ lockfile,
345
+ issues,
346
+ };
347
+ }
348
+ /** Exit code helper: true when an issue is at least as severe as the threshold. */
349
+ export function issueFailsGate(issues, threshold) {
350
+ const limit = SEVERITY_WEIGHT[threshold];
351
+ return issues.some((issue) => SEVERITY_WEIGHT[issue.severity] >= limit);
352
+ }
353
+ //# sourceMappingURL=deps-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps-health.js","sourceRoot":"","sources":["../../src/core/deps-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawnSync } from "node:child_process";
3
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { dirname, join } from "node:path";
6
+ import test from "node:test";
7
+ import { auditDependencies, issueFailsGate, packageNameOf, } from "./deps-health.js";
8
+ function makeRepo(files) {
9
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-deps-health-"));
10
+ const init = spawnSync("git", ["init", "-q"], { cwd: dir, encoding: "utf8" });
11
+ if (init.status !== 0)
12
+ throw new Error(`git init failed: ${init.stderr}`);
13
+ for (const [path, text] of Object.entries(files)) {
14
+ const full = join(dir, path);
15
+ mkdirSync(dirname(full), { recursive: true });
16
+ writeFileSync(full, text, "utf8");
17
+ }
18
+ return dir;
19
+ }
20
+ function manifest(value) {
21
+ return JSON.stringify({ name: "demo", private: true, ...value }, null, 2);
22
+ }
23
+ function kinds(issues) {
24
+ return issues.map((issue) => issue.kind);
25
+ }
26
+ test("flags imported packages that package.json does not declare", () => {
27
+ const dir = makeRepo({
28
+ "package.json": manifest({ dependencies: { react: "^18.0.0" } }),
29
+ "src/app.ts": [
30
+ 'import React from "react";',
31
+ 'import axios from "axios";',
32
+ 'import { readFileSync } from "node:fs";',
33
+ 'import { helper } from "./local";',
34
+ ].join("\n"),
35
+ });
36
+ try {
37
+ const report = auditDependencies(dir);
38
+ const phantom = report.issues.filter((issue) => issue.kind === "phantom");
39
+ assert.deepEqual(phantom.map((issue) => issue.name), ["axios"]);
40
+ assert.equal(phantom[0]?.severity, "high");
41
+ assert.deepEqual(phantom[0]?.files, ["src/app.ts"]);
42
+ assert.match(phantom[0]?.message ?? "", /не объявлен/);
43
+ assert.equal(report.packageName, "demo");
44
+ assert.equal(report.declared, 1);
45
+ assert.ok(report.imported >= 2);
46
+ assert.equal(report.scannedFiles, 1);
47
+ }
48
+ finally {
49
+ rmSync(dir, { recursive: true, force: true });
50
+ }
51
+ });
52
+ test("packageNameOf normalizes scoped packages and skips builtins, URLs and relative paths", () => {
53
+ assert.equal(packageNameOf("@scope/pkg/sub/deep"), "@scope/pkg");
54
+ assert.equal(packageNameOf("pkg/sub"), "pkg");
55
+ assert.equal(packageNameOf("lodash"), "lodash");
56
+ assert.equal(packageNameOf("./local"), undefined);
57
+ assert.equal(packageNameOf("../up"), undefined);
58
+ assert.equal(packageNameOf("/absolute"), undefined);
59
+ assert.equal(packageNameOf("#internal"), undefined);
60
+ assert.equal(packageNameOf("node:fs"), undefined);
61
+ assert.equal(packageNameOf("https://example.com/lib.js"), undefined);
62
+ assert.equal(packageNameOf(""), undefined);
63
+ });
64
+ test("reports declared packages that nothing imports and keeps tooling quiet", () => {
65
+ const dir = makeRepo({
66
+ "package.json": manifest({
67
+ dependencies: { "left-pad": "^1.3.0" },
68
+ devDependencies: { eslint: "^9.0.0", "@types/node": "^22.0.0", tslib: "^2.0.0" },
69
+ peerDependencies: { react: "^18.0.0" },
70
+ scripts: { lint: "eslint ." },
71
+ }),
72
+ "src/app.ts": "export const value = 1;\n",
73
+ });
74
+ try {
75
+ const report = auditDependencies(dir);
76
+ const unused = report.issues.filter((issue) => issue.kind === "unused");
77
+ assert.deepEqual(unused.map((issue) => issue.name), ["left-pad"]);
78
+ assert.equal(unused[0]?.severity, "medium");
79
+ assert.equal(report.declared, 5);
80
+ }
81
+ finally {
82
+ rmSync(dir, { recursive: true, force: true });
83
+ }
84
+ });
85
+ test("flags production dependencies used only by tests", () => {
86
+ const dir = makeRepo({
87
+ "package.json": manifest({ dependencies: { zod: "^3.23.0" } }),
88
+ "src/app.ts": "export const value = 1;\n",
89
+ "src/app.test.ts": 'import { z } from "zod";\n',
90
+ });
91
+ try {
92
+ const report = auditDependencies(dir);
93
+ const misplaced = report.issues.filter((issue) => issue.kind === "misplaced");
94
+ assert.deepEqual(misplaced.map((issue) => issue.name), ["zod"]);
95
+ assert.equal(misplaced[0]?.severity, "low");
96
+ assert.deepEqual(misplaced[0]?.files, ["src/app.test.ts"]);
97
+ assert.ok(!kinds(report.issues).includes("unused"));
98
+ }
99
+ finally {
100
+ rmSync(dir, { recursive: true, force: true });
101
+ }
102
+ });
103
+ test("flags overlapping libraries, unpinned specs and vcs references", () => {
104
+ const dir = makeRepo({
105
+ "package.json": manifest({
106
+ dependencies: {
107
+ moment: "^2.30.0",
108
+ dayjs: "^1.11.0",
109
+ lodash: "*",
110
+ "left-pad": "git+https://github.com/user/left-pad.git",
111
+ "local-lib": "file:../local",
112
+ },
113
+ }),
114
+ "src/app.ts": ['import moment from "moment";', 'import dayjs from "dayjs";', 'import _ from "lodash";'].join("\n"),
115
+ });
116
+ try {
117
+ const report = auditDependencies(dir);
118
+ const duplicate = report.issues.find((issue) => issue.kind === "duplicate");
119
+ assert.equal(duplicate?.name, "moment, dayjs");
120
+ const unpinned = report.issues.find((issue) => issue.kind === "unpinned");
121
+ assert.equal(unpinned?.name, "lodash");
122
+ assert.equal(unpinned?.severity, "medium");
123
+ const vcs = report.issues.filter((issue) => issue.kind === "vcs");
124
+ assert.deepEqual(vcs.map((issue) => [issue.name, issue.severity]), [
125
+ ["left-pad", "high"],
126
+ ["local-lib", "low"],
127
+ ]);
128
+ assert.equal(issueFailsGate(report.issues, "high"), true);
129
+ assert.equal(issueFailsGate([], "low"), false);
130
+ assert.equal(issueFailsGate([unpinned], "high"), false);
131
+ }
132
+ finally {
133
+ rmSync(dir, { recursive: true, force: true });
134
+ }
135
+ });
136
+ test("flags declared packages missing from package-lock.json", () => {
137
+ const dir = makeRepo({
138
+ "package.json": manifest({ dependencies: { zod: "^3.23.0", lodash: "^4.17.21" } }),
139
+ "src/app.ts": ['import { z } from "zod";', 'import _ from "lodash";'].join("\n"),
140
+ "package-lock.json": JSON.stringify({
141
+ lockfileVersion: 3,
142
+ packages: { "": {}, "node_modules/lodash": { version: "4.17.21" } },
143
+ }),
144
+ });
145
+ try {
146
+ const report = auditDependencies(dir);
147
+ assert.equal(report.lockfile, "package-lock.json");
148
+ const lockIssues = report.issues.filter((issue) => issue.kind === "lockfile");
149
+ assert.deepEqual(lockIssues.map((issue) => issue.name), ["zod"]);
150
+ assert.equal(lockIssues[0]?.severity, "high");
151
+ assert.ok(!lockIssues.some((issue) => issue.name === "lodash"));
152
+ }
153
+ finally {
154
+ rmSync(dir, { recursive: true, force: true });
155
+ }
156
+ });
157
+ test("workspace packages are not phantom dependencies", () => {
158
+ const dir = makeRepo({
159
+ "package.json": manifest({ workspaces: ["packages/*"] }),
160
+ "packages/ui/package.json": JSON.stringify({ name: "@app/ui", version: "0.0.0" }),
161
+ "packages/ui/index.ts": "export const button = 1;\n",
162
+ "src/app.ts": 'import { button } from "@app/ui";\n',
163
+ });
164
+ try {
165
+ const report = auditDependencies(dir);
166
+ assert.ok(!report.issues.some((issue) => issue.kind === "phantom"));
167
+ }
168
+ finally {
169
+ rmSync(dir, { recursive: true, force: true });
170
+ }
171
+ });
172
+ test("ignore skips noisy packages", () => {
173
+ const dir = makeRepo({
174
+ "package.json": manifest({ dependencies: { zod: "^3.23.0" } }),
175
+ "src/app.ts": "export const value = 1;\n",
176
+ });
177
+ try {
178
+ const report = auditDependencies(dir, { ignore: ["zod"] });
179
+ assert.deepEqual(report.issues, []);
180
+ assert.equal(report.declared, 1);
181
+ }
182
+ finally {
183
+ rmSync(dir, { recursive: true, force: true });
184
+ }
185
+ });
186
+ test("string literals that look like imports are not phantom dependencies", () => {
187
+ const dir = makeRepo({
188
+ "package.json": manifest({ dependencies: {} }),
189
+ "src/gen.test.ts": "const sample = 'import axios from \"axios\";\\n';\n",
190
+ "src/template.test.ts": "const sample = `\nimport express from \"express\";\n`;\n",
191
+ "src/require.test.ts": "const sample = 'const chalk = require(\"chalk\");\n';\n",
192
+ "src/dynamic.test.ts": "const sample = 'await import(\"vitest\");\n';\n",
193
+ });
194
+ try {
195
+ const report = auditDependencies(dir);
196
+ assert.deepEqual(report.issues.filter((issue) => issue.kind === "phantom").map((issue) => issue.name), []);
197
+ }
198
+ finally {
199
+ rmSync(dir, { recursive: true, force: true });
200
+ }
201
+ });
202
+ test("real import forms are still detected", () => {
203
+ const dir = makeRepo({
204
+ "package.json": manifest({ dependencies: {} }),
205
+ "src/single.ts": 'import axios from "axios";\n',
206
+ "src/multi.ts": 'import {\n z\n} from "zod";\n',
207
+ "src/cjs.js": 'const leftPad = require("left-pad");\n',
208
+ "src/dynamic.ts": 'const mod = await import("chalk");\n',
209
+ });
210
+ try {
211
+ const report = auditDependencies(dir);
212
+ assert.deepEqual(report.issues
213
+ .filter((issue) => issue.kind === "phantom")
214
+ .map((issue) => issue.name)
215
+ .sort(), ["axios", "chalk", "left-pad", "zod"]);
216
+ }
217
+ finally {
218
+ rmSync(dir, { recursive: true, force: true });
219
+ }
220
+ });
221
+ test("missing package.json raises a usage error", () => {
222
+ const dir = mkdtempSync(join(tmpdir(), "oc-pilot-deps-health-empty-"));
223
+ try {
224
+ assert.throws(() => auditDependencies(dir), /package\.json не найден/);
225
+ }
226
+ finally {
227
+ rmSync(dir, { recursive: true, force: true });
228
+ }
229
+ });
230
+ //# sourceMappingURL=deps-health.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps-health.test.js","sourceRoot":"","sources":["../../src/core/deps-health.test.ts"],"names":[],"mappings":"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"}