@poetic-ai/poetic 1.42.0

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 (782) hide show
  1. package/.github/SECURITY.md +47 -0
  2. package/.nvmrc +1 -0
  3. package/.poetic/README.md +37 -0
  4. package/.poetic/providers/catalog.json +12051 -0
  5. package/.poetic/providers/pricing.json +1272 -0
  6. package/.poetic/providers/registry.json +3369 -0
  7. package/CHANGELOG.md +552 -0
  8. package/CODE_OF_CONDUCT.md +40 -0
  9. package/CONTRIBUTING.md +23 -0
  10. package/INSTALL.md +454 -0
  11. package/LICENSE +21 -0
  12. package/README.md +474 -0
  13. package/dist/BasicOptimizationCompetitionRunner-5H5TBYO4.js +153 -0
  14. package/dist/ExecutionTracker-UVONC4C6.js +16 -0
  15. package/dist/OptimizationConfig-7DFY2TST.js +17 -0
  16. package/dist/OptimizationEngine-JIMGP3LY.js +1597 -0
  17. package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
  18. package/dist/actions-LUJPINLJ.js +322 -0
  19. package/dist/agent-ingest-3DJUJ7FU.js +53 -0
  20. package/dist/aggregator-DNCBINFO.js +12 -0
  21. package/dist/ai-judge-5QT5QJVU.js +156 -0
  22. package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
  23. package/dist/allowlist-utils-23V7TJ3G.js +28 -0
  24. package/dist/anchored-turn-service-JULUCUIK.js +489 -0
  25. package/dist/api-transport-4TYTNLTJ.js +1087 -0
  26. package/dist/apply-completion-mode-AW2MOS3R.js +89 -0
  27. package/dist/artifact-migrator-23L45ISD.js +267 -0
  28. package/dist/ask-HWVV6QFR.js +135 -0
  29. package/dist/auth-5KEDKAPP.js +67 -0
  30. package/dist/auth-7TT3JINV.js +78 -0
  31. package/dist/auth-E6XUNZ5M.js +68 -0
  32. package/dist/auth-H3XDZE22.js +134 -0
  33. package/dist/auth-OC4E6633.js +71 -0
  34. package/dist/auth-S4CTX4GQ.js +44 -0
  35. package/dist/auth-YLH3S7EY.js +69 -0
  36. package/dist/auth-liveness-TDDEZY3T.js +46 -0
  37. package/dist/auto-optimizer-VPRWOWGU.js +80 -0
  38. package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
  39. package/dist/autoloop-evidence-gates-PCDALGVJ.js +38 -0
  40. package/dist/autoloop-gate-policy-Z7FVJVXV.js +175 -0
  41. package/dist/autoloop-helpers-2KTK43GL.js +22 -0
  42. package/dist/autoloop-ledger-W7QO62PX.js +96 -0
  43. package/dist/autoloop-ledger-subscriber-Z5RW5EIE.js +162 -0
  44. package/dist/autoloop-run-defaults-FERGRZGP.js +19 -0
  45. package/dist/autoloop-run-lock-CT2NWSV3.js +197 -0
  46. package/dist/autoloop-success-J2VKKBXQ.js +85 -0
  47. package/dist/autoloop-termination-summary-RN75F422.js +58 -0
  48. package/dist/autoloop-trajectory-XFIEXP5Z.js +282 -0
  49. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  50. package/dist/autonomous-loop-controller-PW4XVFGQ.js +4120 -0
  51. package/dist/backend-P3DAYRP7.js +29 -0
  52. package/dist/background-executor-CBN552V4.js +257 -0
  53. package/dist/backlog-execution-intent-U4XYPTV6.js +15 -0
  54. package/dist/backup-active-store-5WXG6SXT.js +17 -0
  55. package/dist/backup-telemetry-db-XGLXAA3N.js +254 -0
  56. package/dist/basic-competition-master-VCSBJVRN.js +344 -0
  57. package/dist/branch-archive-manager-RP6FP3ZC.js +254 -0
  58. package/dist/branch-cleanup-manager-RSHAI7YR.js +20 -0
  59. package/dist/build-gate-YHGRB4QB.js +71 -0
  60. package/dist/change-summary-WY7J5TOX.js +33 -0
  61. package/dist/chunk-23A26CSN.js +123 -0
  62. package/dist/chunk-27UTJD3M.js +265 -0
  63. package/dist/chunk-2A5CILN3.js +310 -0
  64. package/dist/chunk-2AQUWJPW.js +225 -0
  65. package/dist/chunk-2BZ53J6J.js +2344 -0
  66. package/dist/chunk-2DY5KNVM.js +276 -0
  67. package/dist/chunk-2EIA4RBE.js +659 -0
  68. package/dist/chunk-2IUXIGQD.js +1064 -0
  69. package/dist/chunk-2N42MS2Z.js +2193 -0
  70. package/dist/chunk-2QJ3H3L7.js +42 -0
  71. package/dist/chunk-2QLYTVYX.js +791 -0
  72. package/dist/chunk-2VSQMRCB.js +18 -0
  73. package/dist/chunk-2XQXYBM2.js +130 -0
  74. package/dist/chunk-2YFUIER7.js +426 -0
  75. package/dist/chunk-34CNP2HB.js +148 -0
  76. package/dist/chunk-35P3W3JX.js +456 -0
  77. package/dist/chunk-36PEBZAF.js +18 -0
  78. package/dist/chunk-3AOKYKA7.js +22 -0
  79. package/dist/chunk-3BCUNHKF.js +475 -0
  80. package/dist/chunk-3FLXLLB7.js +26 -0
  81. package/dist/chunk-3FOZ2VHV.js +100 -0
  82. package/dist/chunk-3G6FZCRF.js +106 -0
  83. package/dist/chunk-3M57DADF.js +44 -0
  84. package/dist/chunk-3S62LLWJ.js +543 -0
  85. package/dist/chunk-3ZPQLGV7.js +2904 -0
  86. package/dist/chunk-44N5WZZH.js +45 -0
  87. package/dist/chunk-45FPSA3B.js +125 -0
  88. package/dist/chunk-4BJ3O4RQ.js +929 -0
  89. package/dist/chunk-4BOP7T6L.js +2321 -0
  90. package/dist/chunk-4BTDUT2S.js +42 -0
  91. package/dist/chunk-4CSS7WVI.js +143 -0
  92. package/dist/chunk-4CUY7AFY.js +247 -0
  93. package/dist/chunk-4GSN5O5J.js +62 -0
  94. package/dist/chunk-4HN6DF7V.js +1027 -0
  95. package/dist/chunk-4IAPOG5V.js +415 -0
  96. package/dist/chunk-4IYIZQWV.js +48 -0
  97. package/dist/chunk-4NXPXE62.js +84 -0
  98. package/dist/chunk-4RCCF5BR.js +712 -0
  99. package/dist/chunk-4V7NAQ4R.js +19527 -0
  100. package/dist/chunk-4VJITV4P.js +445 -0
  101. package/dist/chunk-4YX7J6QL.js +1859 -0
  102. package/dist/chunk-527OBWQB.js +338 -0
  103. package/dist/chunk-5D4A7E3D.js +448 -0
  104. package/dist/chunk-5DLKYTQX.js +4003 -0
  105. package/dist/chunk-5EERLVZB.js +139 -0
  106. package/dist/chunk-5H72XE4H.js +256 -0
  107. package/dist/chunk-5HDP7XZG.js +91 -0
  108. package/dist/chunk-5LAMRH4X.js +969 -0
  109. package/dist/chunk-5LTN43AS.js +1972 -0
  110. package/dist/chunk-5RBHQYDB.js +2206 -0
  111. package/dist/chunk-5WCQRDRB.js +588 -0
  112. package/dist/chunk-5WRLK5KW.js +700 -0
  113. package/dist/chunk-5ZCXC23G.js +595 -0
  114. package/dist/chunk-6BM72ZMG.js +31 -0
  115. package/dist/chunk-6EDAJH2I.js +68 -0
  116. package/dist/chunk-6EQKFDBH.js +457 -0
  117. package/dist/chunk-6MFRHTRI.js +115 -0
  118. package/dist/chunk-6TZJRKNW.js +321 -0
  119. package/dist/chunk-6V7HGQFZ.js +20 -0
  120. package/dist/chunk-6VWVO2TU.js +3746 -0
  121. package/dist/chunk-6Y5TWI7H.js +146 -0
  122. package/dist/chunk-6Y5U7UFY.js +91 -0
  123. package/dist/chunk-6ZLAK3XG.js +14 -0
  124. package/dist/chunk-72XCRQED.js +34 -0
  125. package/dist/chunk-72YTZMAM.js +589 -0
  126. package/dist/chunk-73BBJOKA.js +263 -0
  127. package/dist/chunk-73NCTWKL.js +188 -0
  128. package/dist/chunk-77I6G4CO.js +1 -0
  129. package/dist/chunk-7DHRDWFS.js +3104 -0
  130. package/dist/chunk-7DNSNKJV.js +78 -0
  131. package/dist/chunk-7FMJVYBS.js +307 -0
  132. package/dist/chunk-7GDRQBQC.js +419 -0
  133. package/dist/chunk-7GPCEFUV.js +270 -0
  134. package/dist/chunk-7IL4A2PP.js +948 -0
  135. package/dist/chunk-7MMLMXO6.js +3679 -0
  136. package/dist/chunk-7QCZSLBH.js +1 -0
  137. package/dist/chunk-7R2WLDOS.js +62 -0
  138. package/dist/chunk-7T7RUJI7.js +949 -0
  139. package/dist/chunk-A2WKSVX7.js +43 -0
  140. package/dist/chunk-A3YGID55.js +133 -0
  141. package/dist/chunk-A722DEVA.js +14 -0
  142. package/dist/chunk-ACDIT7OP.js +1376 -0
  143. package/dist/chunk-ACKIPAOJ.js +302 -0
  144. package/dist/chunk-APPNGGN7.js +365 -0
  145. package/dist/chunk-APV6MK5E.js +137 -0
  146. package/dist/chunk-ASEP3M2W.js +968 -0
  147. package/dist/chunk-AT4TNPWW.js +2931 -0
  148. package/dist/chunk-ATVKCSGT.js +250 -0
  149. package/dist/chunk-AURFMVCD.js +899 -0
  150. package/dist/chunk-AX6GWE7V.js +47 -0
  151. package/dist/chunk-AY5EWJPF.js +385 -0
  152. package/dist/chunk-BAV2HJXS.js +194 -0
  153. package/dist/chunk-BBHRN366.js +89 -0
  154. package/dist/chunk-BBPSTTPA.js +1004 -0
  155. package/dist/chunk-BDATUDDJ.js +992 -0
  156. package/dist/chunk-BKE5PG5L.js +20414 -0
  157. package/dist/chunk-BLPHWMDK.js +797 -0
  158. package/dist/chunk-BSE4R6XD.js +322 -0
  159. package/dist/chunk-BXGMAU4A.js +396 -0
  160. package/dist/chunk-BXI4NXL3.js +507 -0
  161. package/dist/chunk-BZU2O43F.js +1125 -0
  162. package/dist/chunk-C3L6YQ7P.js +147 -0
  163. package/dist/chunk-C57KJOUQ.js +121 -0
  164. package/dist/chunk-CCV7BPSY.js +118 -0
  165. package/dist/chunk-CD7ISXA4.js +826 -0
  166. package/dist/chunk-CE5OZBYY.js +21 -0
  167. package/dist/chunk-CFBIG37O.js +154 -0
  168. package/dist/chunk-CJC6GZ46.js +457 -0
  169. package/dist/chunk-CKCDGXIV.js +408 -0
  170. package/dist/chunk-CKNX3TTP.js +10338 -0
  171. package/dist/chunk-CLKSETWE.js +10 -0
  172. package/dist/chunk-CP7H3HSP.js +1552 -0
  173. package/dist/chunk-CPLEWXNZ.js +66 -0
  174. package/dist/chunk-CQM3A35X.js +844 -0
  175. package/dist/chunk-CS6P76D3.js +103 -0
  176. package/dist/chunk-CTLUBNCW.js +622 -0
  177. package/dist/chunk-CUSRN6RJ.js +632 -0
  178. package/dist/chunk-D5EP5D2W.js +26 -0
  179. package/dist/chunk-D5RYINO7.js +412 -0
  180. package/dist/chunk-DBFS4HMH.js +751 -0
  181. package/dist/chunk-DC4ZYMXJ.js +115 -0
  182. package/dist/chunk-DCBZP442.js +9243 -0
  183. package/dist/chunk-DCYF7EKG.js +26 -0
  184. package/dist/chunk-DDMAFNUK.js +5351 -0
  185. package/dist/chunk-DF5SLDE4.js +966 -0
  186. package/dist/chunk-DJFW7SMX.js +348 -0
  187. package/dist/chunk-DQFLLBJW.js +121 -0
  188. package/dist/chunk-DSFM56OA.js +1203 -0
  189. package/dist/chunk-DTY4APYV.js +218 -0
  190. package/dist/chunk-DXH5JBRS.js +437 -0
  191. package/dist/chunk-E3NTPHEO.js +194 -0
  192. package/dist/chunk-E74LUIID.js +302 -0
  193. package/dist/chunk-EI57M5BI.js +194 -0
  194. package/dist/chunk-EJ4ZAWLV.js +305 -0
  195. package/dist/chunk-EJGCZGUF.js +1483 -0
  196. package/dist/chunk-EK2U3YEG.js +486 -0
  197. package/dist/chunk-ELMFYNV7.js +109 -0
  198. package/dist/chunk-ENRGKNR5.js +25 -0
  199. package/dist/chunk-ETYDXCK7.js +679 -0
  200. package/dist/chunk-EYRH3W74.js +239 -0
  201. package/dist/chunk-F23DIWNN.js +1024 -0
  202. package/dist/chunk-F5JO7HAS.js +94 -0
  203. package/dist/chunk-F7ER6ANO.js +174 -0
  204. package/dist/chunk-FATUVIIN.js +374 -0
  205. package/dist/chunk-FC23CTXV.js +322 -0
  206. package/dist/chunk-FD4ERYEG.js +22 -0
  207. package/dist/chunk-FH7WOJAE.js +79 -0
  208. package/dist/chunk-FHOWVDF5.js +1342 -0
  209. package/dist/chunk-FKAUPHMR.js +96 -0
  210. package/dist/chunk-FONNFJXA.js +137 -0
  211. package/dist/chunk-FQ7FSZRW.js +75 -0
  212. package/dist/chunk-FRG57FPM.js +240 -0
  213. package/dist/chunk-FUVP64ER.js +31 -0
  214. package/dist/chunk-FYOILAN5.js +6818 -0
  215. package/dist/chunk-G35UYQ6Z.js +69 -0
  216. package/dist/chunk-G36W2T2S.js +1143 -0
  217. package/dist/chunk-G3L2L5XZ.js +49 -0
  218. package/dist/chunk-G4THLFV3.js +148 -0
  219. package/dist/chunk-GAFJEYLK.js +29 -0
  220. package/dist/chunk-GFGYB2ZU.js +1689 -0
  221. package/dist/chunk-GG6KJYW6.js +85 -0
  222. package/dist/chunk-GHHFDU2U.js +55 -0
  223. package/dist/chunk-GHTZSQB7.js +57 -0
  224. package/dist/chunk-GK37ILCX.js +1231 -0
  225. package/dist/chunk-GKN3HMN4.js +2809 -0
  226. package/dist/chunk-GNVDBVJP.js +156 -0
  227. package/dist/chunk-GPEL3FBM.js +924 -0
  228. package/dist/chunk-GPSNGPZS.js +1604 -0
  229. package/dist/chunk-GSGD5E4C.js +30 -0
  230. package/dist/chunk-GSUQJJXQ.js +331 -0
  231. package/dist/chunk-GSV226X6.js +110 -0
  232. package/dist/chunk-H2AYQIHW.js +224 -0
  233. package/dist/chunk-H66DXFS5.js +1374 -0
  234. package/dist/chunk-H6G7QRMQ.js +35 -0
  235. package/dist/chunk-H7JAGHZT.js +59 -0
  236. package/dist/chunk-H7ZEFECA.js +316 -0
  237. package/dist/chunk-HAC6EHZZ.js +79 -0
  238. package/dist/chunk-HIO33P3G.js +19 -0
  239. package/dist/chunk-HMVQIPH3.js +547 -0
  240. package/dist/chunk-HOYBYAOA.js +257 -0
  241. package/dist/chunk-HX5P3CSP.js +1784 -0
  242. package/dist/chunk-I46EG2XQ.js +65 -0
  243. package/dist/chunk-I4NPDSCB.js +279 -0
  244. package/dist/chunk-I5WRT7ZR.js +514 -0
  245. package/dist/chunk-IC7I6YIJ.js +301 -0
  246. package/dist/chunk-IDCSOZVN.js +78 -0
  247. package/dist/chunk-IFCBYECK.js +112 -0
  248. package/dist/chunk-IFZCPEY2.js +66 -0
  249. package/dist/chunk-IKFP2KUR.js +48 -0
  250. package/dist/chunk-IRFBN336.js +878 -0
  251. package/dist/chunk-IUXNGKA6.js +152 -0
  252. package/dist/chunk-IV2RVAN7.js +1356 -0
  253. package/dist/chunk-IZYIQQ7X.js +53 -0
  254. package/dist/chunk-J3UUR7DE.js +210 -0
  255. package/dist/chunk-J54VUAY2.js +566 -0
  256. package/dist/chunk-J62KPGII.js +464 -0
  257. package/dist/chunk-J6P3FWWW.js +130 -0
  258. package/dist/chunk-JKBHJQMT.js +434 -0
  259. package/dist/chunk-JLS65NUQ.js +14 -0
  260. package/dist/chunk-JOSYEJKY.js +141 -0
  261. package/dist/chunk-JPKSXKNB.js +94 -0
  262. package/dist/chunk-JQNJB2BB.js +2440 -0
  263. package/dist/chunk-JRVNSWSQ.js +2626 -0
  264. package/dist/chunk-JSWMRQYG.js +28 -0
  265. package/dist/chunk-JZKNBBIB.js +152 -0
  266. package/dist/chunk-K54Y7MLK.js +160 -0
  267. package/dist/chunk-K65546RE.js +183 -0
  268. package/dist/chunk-KM3F7SYE.js +702 -0
  269. package/dist/chunk-KNDYMVWN.js +102 -0
  270. package/dist/chunk-KNT72VR6.js +132 -0
  271. package/dist/chunk-KP6YILMU.js +482 -0
  272. package/dist/chunk-KQEBSK3T.js +274 -0
  273. package/dist/chunk-KT6VHSPF.js +84 -0
  274. package/dist/chunk-KTMW65UX.js +14 -0
  275. package/dist/chunk-KZ5CJVBP.js +1813 -0
  276. package/dist/chunk-L4427KOE.js +26 -0
  277. package/dist/chunk-L6OM4A22.js +189 -0
  278. package/dist/chunk-L7E6XCRA.js +1042 -0
  279. package/dist/chunk-L7JZLXQL.js +173 -0
  280. package/dist/chunk-LAMKBTXX.js +40 -0
  281. package/dist/chunk-LDCF2MKN.js +132 -0
  282. package/dist/chunk-LEIIWPWQ.js +78 -0
  283. package/dist/chunk-LFTQVYBB.js +31 -0
  284. package/dist/chunk-LG3PDRTR.js +2872 -0
  285. package/dist/chunk-LGHII5ET.js +23 -0
  286. package/dist/chunk-LH5QY22X.js +1205 -0
  287. package/dist/chunk-LIVJ6266.js +438 -0
  288. package/dist/chunk-LKRAR3IH.js +276 -0
  289. package/dist/chunk-LO23NABI.js +3063 -0
  290. package/dist/chunk-LO3X5NLS.js +326 -0
  291. package/dist/chunk-LPITVM7M.js +339 -0
  292. package/dist/chunk-LR5IJIGV.js +810 -0
  293. package/dist/chunk-LRGMHROI.js +79 -0
  294. package/dist/chunk-LUVKFFWR.js +315 -0
  295. package/dist/chunk-LWCBNGH6.js +35 -0
  296. package/dist/chunk-LWTN3WRV.js +260 -0
  297. package/dist/chunk-M3HQYKQX.js +308 -0
  298. package/dist/chunk-M6GVSPEH.js +1016 -0
  299. package/dist/chunk-MF5HP6XV.js +221 -0
  300. package/dist/chunk-MHLCBZJB.js +328 -0
  301. package/dist/chunk-MN6PL4AN.js +120 -0
  302. package/dist/chunk-MOEY65Z6.js +5678 -0
  303. package/dist/chunk-MQ4WA34C.js +206 -0
  304. package/dist/chunk-MWHF5V7U.js +223 -0
  305. package/dist/chunk-MWHLBPNU.js +211 -0
  306. package/dist/chunk-MWK5UZQ3.js +1068 -0
  307. package/dist/chunk-MYLH2S4G.js +64 -0
  308. package/dist/chunk-MZ5WYKNA.js +28 -0
  309. package/dist/chunk-N4VTRA7K.js +131 -0
  310. package/dist/chunk-N5DX4JAK.js +12 -0
  311. package/dist/chunk-N65O4XTH.js +5011 -0
  312. package/dist/chunk-NEQUQHOX.js +223 -0
  313. package/dist/chunk-NGK6PEOG.js +25 -0
  314. package/dist/chunk-NJVD4PWE.js +1033 -0
  315. package/dist/chunk-NM6PMYY4.js +768 -0
  316. package/dist/chunk-NN4PJDHP.js +708 -0
  317. package/dist/chunk-NP2V3L7K.js +226 -0
  318. package/dist/chunk-NRLY536M.js +260 -0
  319. package/dist/chunk-NRNE225N.js +1270 -0
  320. package/dist/chunk-NS2K2GTP.js +605 -0
  321. package/dist/chunk-NS33V3IM.js +51 -0
  322. package/dist/chunk-NSHASMZZ.js +71 -0
  323. package/dist/chunk-NWOYOA6H.js +378 -0
  324. package/dist/chunk-NWRUSEXG.js +322 -0
  325. package/dist/chunk-NZGDAWIP.js +1905 -0
  326. package/dist/chunk-O47UOKU3.js +395 -0
  327. package/dist/chunk-O4G2W3ST.js +9831 -0
  328. package/dist/chunk-O6V4PNLO.js +63 -0
  329. package/dist/chunk-OA4GPILI.js +624 -0
  330. package/dist/chunk-OGMSYL6J.js +227 -0
  331. package/dist/chunk-OIS7J26S.js +319 -0
  332. package/dist/chunk-OMX5VL43.js +79 -0
  333. package/dist/chunk-ON3G73BU.js +264 -0
  334. package/dist/chunk-OPYFYTWQ.js +220 -0
  335. package/dist/chunk-OQ6K46CK.js +1734 -0
  336. package/dist/chunk-OYZYO7TV.js +47 -0
  337. package/dist/chunk-OZ4REHIN.js +4386 -0
  338. package/dist/chunk-P47VN5F4.js +282 -0
  339. package/dist/chunk-P5I4X7A7.js +353 -0
  340. package/dist/chunk-P6VQROCO.js +594 -0
  341. package/dist/chunk-P7CQGPLS.js +30 -0
  342. package/dist/chunk-PCAGC5MR.js +1763 -0
  343. package/dist/chunk-PFTQBXS6.js +5181 -0
  344. package/dist/chunk-PGSPX4SU.js +15 -0
  345. package/dist/chunk-PIKLF7BM.js +432 -0
  346. package/dist/chunk-PJWJ3SAV.js +22 -0
  347. package/dist/chunk-PKIFMV72.js +100 -0
  348. package/dist/chunk-PL37JDNA.js +189 -0
  349. package/dist/chunk-PTH5E5XO.js +195 -0
  350. package/dist/chunk-PW6AXLQC.js +4128 -0
  351. package/dist/chunk-PYITM4N2.js +79 -0
  352. package/dist/chunk-PZ5AY32C.js +10 -0
  353. package/dist/chunk-Q3RO7N35.js +45 -0
  354. package/dist/chunk-Q3WIC6GQ.js +2670 -0
  355. package/dist/chunk-Q5XIXSHX.js +271 -0
  356. package/dist/chunk-QGJDMEOV.js +34 -0
  357. package/dist/chunk-QNOB37UH.js +58 -0
  358. package/dist/chunk-QOCOVLUH.js +462 -0
  359. package/dist/chunk-QTCJ5CC5.js +172 -0
  360. package/dist/chunk-QVFV5IP2.js +232 -0
  361. package/dist/chunk-QVZMFDYG.js +29 -0
  362. package/dist/chunk-R35PEUKH.js +511 -0
  363. package/dist/chunk-R4UWBC35.js +200 -0
  364. package/dist/chunk-R6MLCREW.js +44 -0
  365. package/dist/chunk-R6W23LKN.js +254 -0
  366. package/dist/chunk-R7XDDX2A.js +4007 -0
  367. package/dist/chunk-RDFRCT64.js +168 -0
  368. package/dist/chunk-RE5VZDFQ.js +58 -0
  369. package/dist/chunk-RGROYC2G.js +638 -0
  370. package/dist/chunk-RGWHUI5E.js +68 -0
  371. package/dist/chunk-RHVG6UNL.js +205 -0
  372. package/dist/chunk-RI4EX2QE.js +18 -0
  373. package/dist/chunk-RJAAKDRX.js +17 -0
  374. package/dist/chunk-ROMHOSMQ.js +185 -0
  375. package/dist/chunk-RWREC3KJ.js +517 -0
  376. package/dist/chunk-RYNETRDJ.js +118 -0
  377. package/dist/chunk-RZY7RKM5.js +500 -0
  378. package/dist/chunk-S2MNWFAG.js +52 -0
  379. package/dist/chunk-S2VQCZO4.js +22 -0
  380. package/dist/chunk-S54MKU6V.js +117 -0
  381. package/dist/chunk-S5OIDFRM.js +302 -0
  382. package/dist/chunk-SCW4ZF6R.js +150 -0
  383. package/dist/chunk-SLS2N4PH.js +2213 -0
  384. package/dist/chunk-SNLBO4BF.js +247 -0
  385. package/dist/chunk-SP3LFU6B.js +60 -0
  386. package/dist/chunk-SQQTDDQA.js +537 -0
  387. package/dist/chunk-STV6LYYE.js +45 -0
  388. package/dist/chunk-SURZ2WFE.js +326 -0
  389. package/dist/chunk-SZ7DL357.js +1047 -0
  390. package/dist/chunk-T5E4NQCM.js +5742 -0
  391. package/dist/chunk-TAJPCXSB.js +13 -0
  392. package/dist/chunk-TAOOYK3P.js +358 -0
  393. package/dist/chunk-TDSEX5CF.js +24 -0
  394. package/dist/chunk-TFTGP7Z7.js +174 -0
  395. package/dist/chunk-TGON4N4O.js +197 -0
  396. package/dist/chunk-TGQZHDY2.js +2373 -0
  397. package/dist/chunk-TJJZ2OKV.js +6783 -0
  398. package/dist/chunk-TRSVUPCX.js +25 -0
  399. package/dist/chunk-TSXGRLPR.js +107 -0
  400. package/dist/chunk-U2S3YEX3.js +224 -0
  401. package/dist/chunk-U45RTRGY.js +818 -0
  402. package/dist/chunk-U6C3VVWS.js +13 -0
  403. package/dist/chunk-UDMS5AD3.js +307 -0
  404. package/dist/chunk-UGX7GI37.js +94 -0
  405. package/dist/chunk-UH3JJSHK.js +1 -0
  406. package/dist/chunk-UHRBTZYY.js +208 -0
  407. package/dist/chunk-UHT2KRG5.js +193 -0
  408. package/dist/chunk-UI2F6DJ5.js +118 -0
  409. package/dist/chunk-UMAKSB4Z.js +284 -0
  410. package/dist/chunk-UR2IBGIM.js +521 -0
  411. package/dist/chunk-UUH2RVKS.js +585 -0
  412. package/dist/chunk-UVJ4PJDK.js +4533 -0
  413. package/dist/chunk-V53UG2OT.js +9924 -0
  414. package/dist/chunk-V72RMBM4.js +48 -0
  415. package/dist/chunk-VBNCKCCI.js +16 -0
  416. package/dist/chunk-VNSYKC25.js +24 -0
  417. package/dist/chunk-VPHVFK4A.js +1984 -0
  418. package/dist/chunk-VTLNJQ44.js +133 -0
  419. package/dist/chunk-VTW7HP3R.js +100 -0
  420. package/dist/chunk-VVGEPBPS.js +218 -0
  421. package/dist/chunk-VVLLL7I4.js +166 -0
  422. package/dist/chunk-VX3UMWB7.js +483 -0
  423. package/dist/chunk-VXF4Q3FW.js +20 -0
  424. package/dist/chunk-W3JMT2YY.js +712 -0
  425. package/dist/chunk-WDUORIHF.js +877 -0
  426. package/dist/chunk-WDVTY4U6.js +148 -0
  427. package/dist/chunk-WIFZCHEG.js +12566 -0
  428. package/dist/chunk-WIRN3F75.js +736 -0
  429. package/dist/chunk-WMPU2UOV.js +82 -0
  430. package/dist/chunk-WTOKKE2V.js +784 -0
  431. package/dist/chunk-WX5IRLF6.js +740 -0
  432. package/dist/chunk-WZ6U3O7I.js +1581 -0
  433. package/dist/chunk-XAONGNST.js +57 -0
  434. package/dist/chunk-XB5YLCLB.js +13 -0
  435. package/dist/chunk-XEP5NQ5Y.js +688 -0
  436. package/dist/chunk-XGYF2QMZ.js +351 -0
  437. package/dist/chunk-XHEKQENB.js +255 -0
  438. package/dist/chunk-XNO4FM6X.js +1124 -0
  439. package/dist/chunk-XPHKYHO4.js +878 -0
  440. package/dist/chunk-XPK2I4NC.js +405 -0
  441. package/dist/chunk-XPU2XADL.js +2175 -0
  442. package/dist/chunk-XQD2B6BB.js +507 -0
  443. package/dist/chunk-XT2ZQVTC.js +558 -0
  444. package/dist/chunk-XTXJGGUV.js +351 -0
  445. package/dist/chunk-XUXVDPSZ.js +50 -0
  446. package/dist/chunk-XV7NZL4B.js +57 -0
  447. package/dist/chunk-XZE4XARH.js +563 -0
  448. package/dist/chunk-XZYR5EDO.js +152 -0
  449. package/dist/chunk-Y3J4JMTU.js +61 -0
  450. package/dist/chunk-Y55LZN5U.js +52 -0
  451. package/dist/chunk-Y5VN7DMP.js +112 -0
  452. package/dist/chunk-Y67VAHN4.js +459 -0
  453. package/dist/chunk-YAXSKEUH.js +3544 -0
  454. package/dist/chunk-YB3JD4E6.js +975 -0
  455. package/dist/chunk-YESZJFK6.js +220 -0
  456. package/dist/chunk-YGXKOBQQ.js +292 -0
  457. package/dist/chunk-YMX76IOS.js +31 -0
  458. package/dist/chunk-YOTXESEH.js +257 -0
  459. package/dist/chunk-YTYIEZQY.js +119 -0
  460. package/dist/chunk-YVORHQ2S.js +579 -0
  461. package/dist/chunk-Z2CUQDAR.js +3429 -0
  462. package/dist/chunk-Z2KYOFHS.js +7000 -0
  463. package/dist/chunk-Z6PC7QX6.js +161 -0
  464. package/dist/chunk-ZDTGECTN.js +235 -0
  465. package/dist/chunk-ZIPWI2LY.js +151 -0
  466. package/dist/chunk-ZSKKMTQJ.js +554 -0
  467. package/dist/chunk-ZTT5IVPY.js +1160 -0
  468. package/dist/chunk-ZX65UI5W.js +78 -0
  469. package/dist/chunk-ZYG7GGKO.js +218 -0
  470. package/dist/chunk-ZZZUL4OF.js +38 -0
  471. package/dist/cli-utils-IXL26KJT.js +40 -0
  472. package/dist/cli-validation-WLXWLUJL.js +111 -0
  473. package/dist/commit-utils-P7CRJF5N.js +202 -0
  474. package/dist/compete-config-resolver-R5ULXMYH.js +76 -0
  475. package/dist/compete-request-62JESVET.js +364 -0
  476. package/dist/compete-results-QEPG6FZX.js +208 -0
  477. package/dist/competition-outcome-tracker-R32OOZ43.js +38 -0
  478. package/dist/config-JCOKXOQT.js +166 -0
  479. package/dist/config-audit-EL3GHXS7.js +360 -0
  480. package/dist/config-explain-TNILDEVJ.js +12 -0
  481. package/dist/config-loader-VPFPFO4B.js +38 -0
  482. package/dist/config-manager-7T4E2BQO.js +67 -0
  483. package/dist/config-validator-KKOHOW7O.js +72 -0
  484. package/dist/cost-YC42XUF3.js +53 -0
  485. package/dist/coverage-orchestrator-CISNKJC2.js +772 -0
  486. package/dist/coverage-scanner-YVD62MLH.js +12 -0
  487. package/dist/createCompetitionRunner-LJG6ZQSO.js +46 -0
  488. package/dist/data-migration-state-VJK64DLT.js +31 -0
  489. package/dist/db-migrator-XSEIOGWY.js +34 -0
  490. package/dist/discovery-JGYGDD25.js +25 -0
  491. package/dist/doctor-GJOYE7AE.js +186 -0
  492. package/dist/domain-analyzer-AWF3RP6E.js +29 -0
  493. package/dist/ensure-initialized-744DIZEZ.js +52 -0
  494. package/dist/entry.js +940 -0
  495. package/dist/environment-YS45U5ZI.js +81 -0
  496. package/dist/error-parser-core-PPZ36A4S.js +50 -0
  497. package/dist/escalation-ladder-MKTCEGSA.js +130 -0
  498. package/dist/evaluation-context-KV4GZNN7.js +35 -0
  499. package/dist/evidence-plan-resolver-GBSYSAPX.js +85 -0
  500. package/dist/execution-data-writer-3ODTBDLH.js +53 -0
  501. package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
  502. package/dist/execution-preflight-Z4Y64V3I.js +209 -0
  503. package/dist/execution-roles-R3DPPMD3.js +66 -0
  504. package/dist/exit-code-error-Z4SW2DVK.js +14 -0
  505. package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
  506. package/dist/factory-XBN7DFIM.js +149 -0
  507. package/dist/file-utils-XIVR2ZMA.js +47 -0
  508. package/dist/flywheel-autoloop-executor-UILGOFFK.js +249 -0
  509. package/dist/flywheel-competition-executor-JOBEXTRB.js +259 -0
  510. package/dist/flywheel-executor-6JFLA6J5.js +369 -0
  511. package/dist/flywheel-git-isolation-UC5NIEVU.js +48 -0
  512. package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
  513. package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
  514. package/dist/flywheel-preflight-XEY5SHM6.js +104 -0
  515. package/dist/flywheel-resume-7HELH7QS.js +23 -0
  516. package/dist/flywheel-safety-7U7DPOAP.js +28 -0
  517. package/dist/flywheel-scope-decision-ZHKF6ZIN.js +11 -0
  518. package/dist/get-telemetry-logger-DPVWWIYY.js +73 -0
  519. package/dist/git-worktree-IY6V6DUO.js +18 -0
  520. package/dist/github-pr-manager-4LXEKJTA.js +211 -0
  521. package/dist/guidance-profile-config-E7XJL2VP.js +117 -0
  522. package/dist/guidance-profile-renderer-QK2YMAAP.js +21 -0
  523. package/dist/index-query-4JEUKA44.js +31 -0
  524. package/dist/index.js +108661 -0
  525. package/dist/instructions-6BURLQJC.js +64 -0
  526. package/dist/invoke-provider-auth-GRUYP44M.js +223 -0
  527. package/dist/judge-scoring.json +80 -0
  528. package/dist/judge-test.js +555 -0
  529. package/dist/lab-mode-OTWVHN63.js +39 -0
  530. package/dist/lab-utils-BJRFLGK4.js +23 -0
  531. package/dist/linux-host-class-UY4KVLFD.js +29 -0
  532. package/dist/llm-judge-executor-F7Z3HO77.js +133 -0
  533. package/dist/local-executor-CEHWE2PL.js +223 -0
  534. package/dist/logger-33TR6EE5.js +72 -0
  535. package/dist/loop-spec-XTLQAVZ7.js +191 -0
  536. package/dist/manager-2HJG5CLT.js +25 -0
  537. package/dist/matrix-prompt-builder-6UDN5X3F.js +497 -0
  538. package/dist/matrix-result-parser-7W35EUOV.js +15 -0
  539. package/dist/metadata-HQ43NDEK.js +22 -0
  540. package/dist/model-invocations-db-QBO4Y7WZ.js +38 -0
  541. package/dist/monitor-XGYBG2DW.js +72 -0
  542. package/dist/next-PB5ZXZKB.js +90 -0
  543. package/dist/next-ZBDK725T.js +69 -0
  544. package/dist/optimization-config-resolver-O6WKR47U.js +75 -0
  545. package/dist/package-3YCWIQQ5.js +10 -0
  546. package/dist/parallel-orchestrator-NL7YJJU2.js +297 -0
  547. package/dist/parallel-worker.js +279 -0
  548. package/dist/parse-git-status-PIAF3OTP.js +10 -0
  549. package/dist/path-security-ETTH6TZL.js +39 -0
  550. package/dist/pattern-bank-UNJR5ADV.js +15 -0
  551. package/dist/plan-backlog-list-fast-VAGYBV3J.js +270 -0
  552. package/dist/plan-backlog-show-fast-SG2CZPW3.js +406 -0
  553. package/dist/plan-sprint-list-fast-LURAX47V.js +162 -0
  554. package/dist/plan-sprint-status-fast-FJAODCHD.js +208 -0
  555. package/dist/plan-task-status-fast-HNYBMQI4.js +349 -0
  556. package/dist/plan-to-flywheel-Z4U3GWPN.js +456 -0
  557. package/dist/planning-backlog-3CQ5QQBQ.js +319 -0
  558. package/dist/poetic-root-V5DNXEAE.js +17 -0
  559. package/dist/preflight-OPANWMME.js +12 -0
  560. package/dist/process-registry-PDZJPTAS.js +27 -0
  561. package/dist/process-scanner-C22SYXYD.js +22 -0
  562. package/dist/processes-KMQUD7HY.js +29 -0
  563. package/dist/processes-json-fast-IBDXZ6WW.js +135 -0
  564. package/dist/profile-SE5EVXAP.js +149 -0
  565. package/dist/prompts-WZZPGWBX.js +168 -0
  566. package/dist/protected-branches-RNTEX7ET.js +57 -0
  567. package/dist/provider-aware-resource-manager-QBTZJMNP.js +18 -0
  568. package/dist/provider-matrix-N5X57V3Y.js +154 -0
  569. package/dist/provider-matrix-renderer-MZDWKKID.js +139 -0
  570. package/dist/provider-output-forwarding-DERID3TP.js +30 -0
  571. package/dist/provider-registry-J5NRBJKI.js +128 -0
  572. package/dist/provider-temp-cleanup-KYGLF6YU.js +14 -0
  573. package/dist/prune-engine-Q6E2DXBN.js +451 -0
  574. package/dist/quality-gate-YRHMQAEI.js +70 -0
  575. package/dist/quickstart-FIRLKGJI.js +62 -0
  576. package/dist/readiness-VZTMSG6J.js +96 -0
  577. package/dist/registry-YODFY77A.js +153 -0
  578. package/dist/repair-helpers-TTV5FEF4.js +117 -0
  579. package/dist/repo-root-2IGD4H7X.js +22 -0
  580. package/dist/resolution-engine-D6TX6FRG.js +127 -0
  581. package/dist/resolve-provider-cli-O2P6XZBZ.js +35 -0
  582. package/dist/restore-telemetry-db-BQL6DTQF.js +360 -0
  583. package/dist/result-streamer-WEHW476R.js +19 -0
  584. package/dist/routing-events-DHPUZDDF.js +27 -0
  585. package/dist/routing-history-store-UWCEXAP3.js +46 -0
  586. package/dist/routing-planner-F5WQEUOM.js +160 -0
  587. package/dist/run-poetic-tui-J6LWRJUP.js +13517 -0
  588. package/dist/run-simulation.js +376 -0
  589. package/dist/runner-CS2TNGHA.js +1092 -0
  590. package/dist/runner-HHH7ZN2Z.js +1571 -0
  591. package/dist/safety-OCC4KJJR.js +64 -0
  592. package/dist/safety-stanza-7SV3HGG3.js +60 -0
  593. package/dist/sandbox-32QXJEMV.js +81 -0
  594. package/dist/sandbox-RSO7VP6V.js +94 -0
  595. package/dist/schema-extensions.sql +234 -0
  596. package/dist/security-2KI5XNDG.js +17 -0
  597. package/dist/setup-bb-plugin-QAQWZCV5.js +738 -0
  598. package/dist/setup-claude-code-P7BTTSPO.js +317 -0
  599. package/dist/setup-temp-cleanup-GASCWZ2I.js +20 -0
  600. package/dist/shared-utils-D6U6UREP.js +37 -0
  601. package/dist/simple-artifact-goal-OTXNGZY6.js +25 -0
  602. package/dist/sprint-UIXPYOXQ.js +338 -0
  603. package/dist/sprint-bridge-4BHMSC3M.js +68 -0
  604. package/dist/sprint-execution-service-2B7WHL5L.js +311 -0
  605. package/dist/sprint-manager-IDQUDNQI.js +91 -0
  606. package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
  607. package/dist/stale-cleanup-orchestrator-XWXV7KCZ.js +62 -0
  608. package/dist/storage-access-F6ALDN4S.js +22 -0
  609. package/dist/synthesis-XD6EDVHF.js +185 -0
  610. package/dist/task-classifier-LNLXSHOM.js +494 -0
  611. package/dist/task-list-fast-PTMA4LUC.js +147 -0
  612. package/dist/task-manager-XAT7GOWB.js +93 -0
  613. package/dist/task-splitter-U7DJ7W6A.js +79 -0
  614. package/dist/task-type-detector-OLVOMXZO.js +21 -0
  615. package/dist/task-type-resolver-KKNQYSB4.js +42 -0
  616. package/dist/telemetry-5HWBBXLX.js +131 -0
  617. package/dist/telemetry-health-tracker-DMSSGBZ2.js +11 -0
  618. package/dist/telemetry-path-resolver-7ICSG276.js +28 -0
  619. package/dist/telemetry-reliability-XUOZNZZ6.js +125 -0
  620. package/dist/token-estimator-MEQUL3EJ.js +37 -0
  621. package/dist/transports-KNSSV2V4.js +255 -0
  622. package/dist/unified-cost-tracker-4TFRBVPR.js +35 -0
  623. package/dist/unified-state-cleanup-LJPF2BOW.js +276 -0
  624. package/dist/universal-cost-calculator-BAJV35GA.js +42 -0
  625. package/dist/user-agents-GHUGCSKN.js +22 -0
  626. package/dist/variant-delivery-state-KLRNG6XA.js +33 -0
  627. package/dist/variant-state-cleanup-MZGGLQAJ.js +280 -0
  628. package/dist/variant-success-PJXWE3ZV.js +12 -0
  629. package/dist/variant-worker-KUWKBLAH.js +4196 -0
  630. package/dist/variant-worker.js +24 -0
  631. package/dist/variants-JE2FSAQS.js +233 -0
  632. package/dist/verification-toolchains-V24UHW6Q.js +28 -0
  633. package/dist/verify-commands-H3DTCSGI.js +37 -0
  634. package/dist/warning-EGQGUUIO.js +12 -0
  635. package/dist/work-edge-RWEDWJZF.js +49 -0
  636. package/dist/work-item-writer-WHAVZXAY.js +19 -0
  637. package/dist/worker-7SA2VS2Y.js +1435 -0
  638. package/dist/worker.js +19 -0
  639. package/dist/worktree-metrics-3DFUYVYE.js +26 -0
  640. package/dist/writeback-VZKHYHSN.js +44 -0
  641. package/docs/CLI_REFERENCE.md +7042 -0
  642. package/docs/PROVIDER_SETUP.md +1570 -0
  643. package/docs/README.md +96 -0
  644. package/docs/TROUBLESHOOTING.md +2232 -0
  645. package/docs/getting-started/QUICK_START.md +294 -0
  646. package/docs/getting-started/README.md +188 -0
  647. package/docs/getting-started/SETUP.md +52 -0
  648. package/docs/reference/AGENT_CONTEXT.md +38 -0
  649. package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
  650. package/docs/reference/README.md +381 -0
  651. package/docs/reference/SECURITY.md +262 -0
  652. package/integrations/bb-plugin-poetic/README.md +362 -0
  653. package/integrations/bb-plugin-poetic/app.css +341 -0
  654. package/integrations/bb-plugin-poetic/app.tsx +5059 -0
  655. package/integrations/bb-plugin-poetic/package.json +45 -0
  656. package/integrations/bb-plugin-poetic/server.ts +444 -0
  657. package/integrations/bb-plugin-poetic/src/adapter.ts +3312 -0
  658. package/integrations/bb-plugin-poetic/src/backlog-authoring-model.ts +150 -0
  659. package/integrations/bb-plugin-poetic/src/backlog-authoring-schema.ts +355 -0
  660. package/integrations/bb-plugin-poetic/src/backlog-authoring-service.ts +419 -0
  661. package/integrations/bb-plugin-poetic/src/backlog-authoring-view.ts +1026 -0
  662. package/integrations/bb-plugin-poetic/src/competition-defaults-schema.ts +122 -0
  663. package/integrations/bb-plugin-poetic/src/competition-defaults-service.ts +105 -0
  664. package/integrations/bb-plugin-poetic/src/competition-defaults-view.ts +138 -0
  665. package/integrations/bb-plugin-poetic/src/contract.ts +615 -0
  666. package/integrations/bb-plugin-poetic/src/finalize-model.ts +205 -0
  667. package/integrations/bb-plugin-poetic/src/finalize-schema.ts +158 -0
  668. package/integrations/bb-plugin-poetic/src/finalize-service.ts +382 -0
  669. package/integrations/bb-plugin-poetic/src/finalize-view.ts +159 -0
  670. package/integrations/bb-plugin-poetic/src/judge-operations-readback.ts +303 -0
  671. package/integrations/bb-plugin-poetic/src/judge-operations-schema.ts +33 -0
  672. package/integrations/bb-plugin-poetic/src/judge-operations-view.ts +459 -0
  673. package/integrations/bb-plugin-poetic/src/model.ts +1302 -0
  674. package/integrations/bb-plugin-poetic/src/monitor-service.ts +233 -0
  675. package/integrations/bb-plugin-poetic/src/panel-read-ux.ts +97 -0
  676. package/integrations/bb-plugin-poetic/src/patch-preview-schema.ts +166 -0
  677. package/integrations/bb-plugin-poetic/src/patch-preview-service.ts +480 -0
  678. package/integrations/bb-plugin-poetic/src/patch-preview-view.ts +109 -0
  679. package/integrations/bb-plugin-poetic/src/planning-readback.ts +204 -0
  680. package/integrations/bb-plugin-poetic/src/planning-service.ts +594 -0
  681. package/integrations/bb-plugin-poetic/src/planning-workspace-schema.ts +95 -0
  682. package/integrations/bb-plugin-poetic/src/planning-workspace.ts +323 -0
  683. package/integrations/bb-plugin-poetic/src/poll-handoff.ts +136 -0
  684. package/integrations/bb-plugin-poetic/src/project-target-server.ts +21 -0
  685. package/integrations/bb-plugin-poetic/src/project-target.ts +45 -0
  686. package/integrations/bb-plugin-poetic/src/reference-index.ts +192 -0
  687. package/integrations/bb-plugin-poetic/src/repository-schema.ts +30 -0
  688. package/integrations/bb-plugin-poetic/src/result-explorer-view.ts +597 -0
  689. package/integrations/bb-plugin-poetic/src/result-readback-model.ts +163 -0
  690. package/integrations/bb-plugin-poetic/src/result-readback-schema.ts +319 -0
  691. package/integrations/bb-plugin-poetic/src/result-readback-service.ts +333 -0
  692. package/integrations/bb-plugin-poetic/src/run-page-view.ts +177 -0
  693. package/integrations/bb-plugin-poetic/src/setup-config-schema.ts +291 -0
  694. package/integrations/bb-plugin-poetic/src/setup-config-service.ts +590 -0
  695. package/integrations/bb-plugin-poetic/src/setup-config-view.ts +413 -0
  696. package/integrations/bb-plugin-poetic/src/sprint-close-model.ts +150 -0
  697. package/integrations/bb-plugin-poetic/src/sprint-close-schema.ts +136 -0
  698. package/integrations/bb-plugin-poetic/src/sprint-close-service.ts +341 -0
  699. package/integrations/bb-plugin-poetic/src/sprint-close-view.ts +116 -0
  700. package/integrations/bb-plugin-poetic/src/sprint-composition-model.ts +714 -0
  701. package/integrations/bb-plugin-poetic/src/sprint-composition-readback.ts +231 -0
  702. package/integrations/bb-plugin-poetic/src/sprint-composition-schema.ts +601 -0
  703. package/integrations/bb-plugin-poetic/src/sprint-composition-service.ts +775 -0
  704. package/integrations/bb-plugin-poetic/src/sprint-composition-view.ts +1221 -0
  705. package/integrations/bb-plugin-poetic/src/task-authoring-model.ts +567 -0
  706. package/integrations/bb-plugin-poetic/src/task-authoring-schema.ts +635 -0
  707. package/integrations/bb-plugin-poetic/src/task-authoring-service.ts +842 -0
  708. package/integrations/bb-plugin-poetic/src/task-authoring-view.ts +1227 -0
  709. package/integrations/bb-plugin-poetic/src/task-detail-readback.ts +56 -0
  710. package/integrations/bb-plugin-poetic/src/task-detail-schema.ts +144 -0
  711. package/integrations/bb-plugin-poetic/src/task-navigation.ts +446 -0
  712. package/integrations/bb-plugin-poetic/src/workbench-route.ts +74 -0
  713. package/integrations/bb-plugin-poetic/tests/host-contract.test.ts +773 -0
  714. package/integrations/bb-plugin-poetic/tsconfig.json +18 -0
  715. package/integrations/bb-plugin-poetic/types/PROVENANCE.json +52 -0
  716. package/integrations/bb-plugin-poetic/types/bb-plugin-sdk-app.d.ts +1444 -0
  717. package/integrations/bb-plugin-poetic/types/bb-plugin-sdk.d.ts +13030 -0
  718. package/integrations/bb-plugin-poetic/vitest.host.config.ts +71 -0
  719. package/npm-shrinkwrap.json +4950 -0
  720. package/package.json +331 -0
  721. package/schemas/README.md +80 -0
  722. package/schemas/config-v1.schema.json +136 -0
  723. package/schemas/execution-config.schema.json +47 -0
  724. package/schemas/judge-scoring.schema.json +370 -0
  725. package/schemas/poetic.config.schema.json +2214 -0
  726. package/schemas/provider-config.schema.json +203 -0
  727. package/schemas/telemetry-config.schema.json +79 -0
  728. package/schemas/user-preferences.schema.json +141 -0
  729. package/scripts/assert-node-runtime.mjs +140 -0
  730. package/scripts/preflight-native.mjs +49 -0
  731. package/scripts/preinstall-node-check.mjs +78 -0
  732. package/scripts/setup-git-hooks.mjs +24 -0
  733. package/scripts/sync.sh +2722 -0
  734. package/scripts/write-node-launcher.sh +108 -0
  735. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  736. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  737. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  738. package/templates/.poetic/README.md +37 -0
  739. package/templates/.poetic/agents/README.md +296 -0
  740. package/templates/.poetic/agents/api-documenter.md +147 -0
  741. package/templates/.poetic/agents/backend-architect.md +31 -0
  742. package/templates/.poetic/agents/code-reviewer.md +157 -0
  743. package/templates/.poetic/agents/data-scientist.md +179 -0
  744. package/templates/.poetic/agents/database-optimizer.md +145 -0
  745. package/templates/.poetic/agents/debugger.md +31 -0
  746. package/templates/.poetic/agents/deployment-engineer.md +164 -0
  747. package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
  748. package/templates/.poetic/agents/frontend-developer.md +150 -0
  749. package/templates/.poetic/agents/javascript-pro.md +36 -0
  750. package/templates/.poetic/agents/performance-engineer.md +151 -0
  751. package/templates/.poetic/agents/python-pro.md +137 -0
  752. package/templates/.poetic/agents/test-automator.md +147 -0
  753. package/templates/.poetic/agents/typescript-pro.md +34 -0
  754. package/templates/.poetic/config/poetic.config.jsonc +69 -0
  755. package/templates/.poetic/config/project-context.template.json +6 -0
  756. package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
  757. package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
  758. package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
  759. package/templates/.poetic/config/task-type-aliases.yaml +28 -0
  760. package/templates/.poetic/gitignore.template +55 -0
  761. package/templates/.poetic/task-types/analysis.yaml +40 -0
  762. package/templates/.poetic/task-types/architecture.yaml +38 -0
  763. package/templates/.poetic/task-types/doc.yaml +35 -0
  764. package/templates/.poetic/task-types/feature.yaml +23 -0
  765. package/templates/.poetic/task-types/general.yaml +6 -0
  766. package/templates/.poetic/task-types/security.yaml +39 -0
  767. package/templates/AGENTS.template.md +99 -0
  768. package/templates/CLAUDE.template.md +1 -0
  769. package/templates/GEMINI.template.md +1 -0
  770. package/templates/builtin-workflows/code-review.yaml +73 -0
  771. package/templates/builtin-workflows/compete-streak.yaml +78 -0
  772. package/templates/builtin-workflows/hello-verify.yaml +10 -0
  773. package/templates/builtin-workflows/judge-regression.yaml +114 -0
  774. package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
  775. package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
  776. package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
  777. package/templates/guard-kit/check.mjs.template +777 -0
  778. package/templates/guard-kit/config.json.template +6 -0
  779. package/templates/guard-kit/poetic-guard.yml.template +189 -0
  780. package/templates/profiles/README.md +56 -0
  781. package/templates/profiles/frontier-claude.json +27 -0
  782. package/templates/profiles/frontier-codex.json +26 -0
@@ -0,0 +1,1342 @@
1
+ import {
2
+ isProjectTestPath
3
+ } from "./chunk-UDMS5AD3.js";
4
+ import {
5
+ describeVerificationCommand
6
+ } from "./chunk-2QLYTVYX.js";
7
+
8
+ // src/core/project/capabilities.ts
9
+ import {
10
+ existsSync,
11
+ lstatSync,
12
+ readdirSync,
13
+ readFileSync,
14
+ realpathSync,
15
+ statSync
16
+ } from "fs";
17
+ import path from "path";
18
+ import { parse as parseJsonc } from "jsonc-parser";
19
+
20
+ // src/core/project/iac-runner-commands.ts
21
+ var STATIC_NONPACKAGE_LINT_PREFIXES = [
22
+ "terraform fmt",
23
+ "hadolint ",
24
+ "tflint",
25
+ "kubeconform",
26
+ "pwsh -NoProfile -Command Invoke-"
27
+ ];
28
+ function isNonPackageStaticLintCommand(command) {
29
+ const trimmed = command.trimStart();
30
+ return STATIC_NONPACKAGE_LINT_PREFIXES.some((prefix) => trimmed.startsWith(prefix));
31
+ }
32
+ var IAC_STATIC_LINT_PREFIXES = ["terraform fmt", "hadolint ", "tflint", "kubeconform"];
33
+ function isIacStaticCommand(command) {
34
+ const trimmed = command.trimStart();
35
+ return IAC_STATIC_LINT_PREFIXES.some((prefix) => trimmed.startsWith(prefix));
36
+ }
37
+ function isIacProjectPath(filePath) {
38
+ const normalized = filePath.replace(/\\/g, "/").toLowerCase();
39
+ const base = normalized.split("/").pop() ?? normalized;
40
+ return base === "dockerfile" || base.endsWith(".tf") || base.endsWith(".tfvars");
41
+ }
42
+ var POWERSHELL_EXECUTABLES = ["pwsh", "pwsh.exe", "powershell", "powershell.exe"];
43
+ function isPowerShellStaticCommand(command) {
44
+ const tokens = command.trim().split(/\s+/);
45
+ const executable = tokens[0];
46
+ if (executable === void 0 || !POWERSHELL_EXECUTABLES.includes(executable)) {
47
+ return false;
48
+ }
49
+ return tokens.some((token) => token.startsWith("Invoke-"));
50
+ }
51
+ function buildIacLintCommands(detected) {
52
+ const commands = [];
53
+ if (detected.dockerfile && detected.hadolintConfig) {
54
+ commands.push("hadolint Dockerfile");
55
+ }
56
+ if (detected.terraform) {
57
+ commands.push("terraform fmt -check -recursive");
58
+ }
59
+ if (detected.terraform && detected.tflintConfig) {
60
+ commands.push("tflint --recursive");
61
+ }
62
+ return commands;
63
+ }
64
+ function buildRunnerCommands(detected, kind) {
65
+ if (detected.availableTasks === void 0) {
66
+ return [];
67
+ }
68
+ if (!detected.availableTasks.includes(kind)) {
69
+ return [];
70
+ }
71
+ const commands = [];
72
+ if (detected.just) {
73
+ commands.push(`just ${kind}`);
74
+ }
75
+ if (detected.task) {
76
+ commands.push(`task ${kind}`);
77
+ }
78
+ return commands;
79
+ }
80
+ function buildPowerShellCommands(detected) {
81
+ const test = [];
82
+ const lint = [];
83
+ if (detected.pesterConfig) {
84
+ test.push("pwsh -NoProfile -Command Invoke-Pester -CI");
85
+ }
86
+ return { test, lint };
87
+ }
88
+
89
+ // src/core/project/capabilities.ts
90
+ var PROJECT_LANGUAGES = [
91
+ "node",
92
+ "typescript",
93
+ "javascript",
94
+ "c",
95
+ "cpp",
96
+ "python",
97
+ "go",
98
+ "rust",
99
+ "java",
100
+ "dotnet",
101
+ "swift",
102
+ "kotlin",
103
+ "dart",
104
+ "ruby",
105
+ "php",
106
+ "shell",
107
+ "powershell",
108
+ "r",
109
+ "sql",
110
+ "docs",
111
+ "unknown"
112
+ ];
113
+ function fileExists(root, file) {
114
+ return existsSync(path.join(root, file));
115
+ }
116
+ function directoryStaysInsideRoot(root, relativeDirectory) {
117
+ const directoryPath = path.join(root, relativeDirectory);
118
+ try {
119
+ const stat = lstatSync(directoryPath);
120
+ if (!stat.isDirectory() || stat.isSymbolicLink()) return false;
121
+ const rootRealPath = realpathSync(root);
122
+ const directoryRealPath = realpathSync(directoryPath);
123
+ const relativePath = path.relative(rootRealPath, directoryRealPath);
124
+ return relativePath.length === 0 || !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
125
+ } catch {
126
+ return false;
127
+ }
128
+ }
129
+ var PROJECT_IGNORED_DIRECTORIES = /* @__PURE__ */ new Set([
130
+ ".git",
131
+ ".hg",
132
+ ".svn",
133
+ ".poetic",
134
+ "node_modules",
135
+ "dist",
136
+ "build",
137
+ "target",
138
+ "vendor",
139
+ ".venv",
140
+ "venv",
141
+ "__pycache__",
142
+ // Terraform's generated provider/module cache. A checkout containing only
143
+ // `.terraform/modules/.../*.tf` cache files must NOT be detected as a Terraform
144
+ // project (that would run irrelevant `terraform fmt` on generated dependency
145
+ // content). Only first-party `*.tf` outside this cache should count.
146
+ ".terraform"
147
+ ]);
148
+ var IGNORED_ANYWHERE_SEGMENTS = /* @__PURE__ */ new Set([
149
+ ".git",
150
+ ".hg",
151
+ ".svn",
152
+ ".poetic",
153
+ "node_modules",
154
+ ".venv",
155
+ "venv",
156
+ "__pycache__",
157
+ ".terraform"
158
+ ]);
159
+ function isIgnoredProjectPath(relativePath, extra) {
160
+ const normalized = relativePath.replace(/\\/g, "/");
161
+ const segments = normalized.split("/").filter((s) => s.length > 0);
162
+ if (segments.length === 0) return false;
163
+ if (segments.some((segment) => IGNORED_ANYWHERE_SEGMENTS.has(segment))) {
164
+ return true;
165
+ }
166
+ const leading = segments[0];
167
+ const extraSet = extra ? new Set(extra) : /* @__PURE__ */ new Set();
168
+ return PROJECT_IGNORED_DIRECTORIES.has(leading) || extraSet.has(leading);
169
+ }
170
+ var FIXTURE_TREE_PARENTS = /* @__PURE__ */ new Set(["tests", "test"]);
171
+ function isIgnoredFixtureOrSentinelPath(relativePath) {
172
+ const segments = relativePath.replace(/\\/g, "/").split("/").filter((segment) => segment.length > 0);
173
+ if (segments.length === 0) return false;
174
+ for (let i = 0; i < segments.length - 1; i++) {
175
+ const current = segments[i];
176
+ const next = segments[i + 1];
177
+ if (current !== void 0 && next !== void 0 && FIXTURE_TREE_PARENTS.has(current) && next === "fixtures") {
178
+ return true;
179
+ }
180
+ }
181
+ const last = segments[segments.length - 1] ?? "";
182
+ const lastLooksLikeFile = last.includes(".") && !last.startsWith(".");
183
+ const directorySegments = lastLooksLikeFile ? segments.slice(0, -1) : segments;
184
+ return directorySegments.some((segment) => /sentinel/i.test(segment));
185
+ }
186
+ function isIgnoredLanguageSignalPath(relativePath) {
187
+ return isIgnoredProjectPath(relativePath) || isIgnoredFixtureOrSentinelPath(relativePath);
188
+ }
189
+ function hasFileMatching(root, predicate) {
190
+ return collectFilesMatching(root, predicate, 1).length > 0;
191
+ }
192
+ function collectFilesMatching(root, predicate, limit = 50) {
193
+ const ignoredDirectories = PROJECT_IGNORED_DIRECTORIES;
194
+ const stack = [""];
195
+ const matches = [];
196
+ while (stack.length > 0) {
197
+ const relativeDirectory = stack.pop() ?? "";
198
+ const absoluteDirectory = path.join(root, relativeDirectory);
199
+ let entries;
200
+ try {
201
+ entries = readdirSync(absoluteDirectory, { withFileTypes: true });
202
+ } catch {
203
+ continue;
204
+ }
205
+ if (!Array.isArray(entries)) continue;
206
+ for (const entry of entries) {
207
+ if (entry.name.startsWith(".") && ignoredDirectories.has(entry.name)) continue;
208
+ const relativePath = path.join(relativeDirectory, entry.name);
209
+ const absolutePath = path.join(root, relativePath);
210
+ if (entry.isDirectory()) {
211
+ if (ignoredDirectories.has(entry.name) || isIgnoredLanguageSignalPath(relativePath)) {
212
+ continue;
213
+ }
214
+ stack.push(relativePath);
215
+ } else if (entry.isFile() || entry.isSymbolicLink()) {
216
+ let isFile = entry.isFile();
217
+ if (!isFile) {
218
+ try {
219
+ isFile = statSync(absolutePath).isFile();
220
+ } catch {
221
+ isFile = false;
222
+ }
223
+ }
224
+ if (isFile && !isIgnoredLanguageSignalPath(relativePath) && predicate(relativePath, entry.name)) {
225
+ matches.push(relativePath);
226
+ if (matches.length >= limit) return matches;
227
+ }
228
+ }
229
+ }
230
+ }
231
+ return matches;
232
+ }
233
+ function commandExists(command) {
234
+ const pathEnv = process.env.PATH ?? "";
235
+ const pathEntries = pathEnv.split(path.delimiter).filter(Boolean);
236
+ const extensions = process.platform === "win32" ? (process.env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean) : [""];
237
+ return pathEntries.some(
238
+ (entry) => extensions.some((extension) => existsSync(path.join(entry, `${command}${extension}`)))
239
+ );
240
+ }
241
+ function readJsonFile(filePath) {
242
+ try {
243
+ const parsed = JSON.parse(readFileSync(filePath, "utf8"));
244
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
245
+ } catch {
246
+ return null;
247
+ }
248
+ }
249
+ function readJsonArrayProperty(filePath, property) {
250
+ const parsed = readJsonFile(filePath);
251
+ const value = parsed?.[property];
252
+ return Array.isArray(value) ? value.filter(
253
+ (entry) => Boolean(entry) && typeof entry === "object" && !Array.isArray(entry)
254
+ ) : [];
255
+ }
256
+ function isSafeCommandToken(value) {
257
+ return /^[A-Za-z0-9_.+-]+$/.test(value) && !value.startsWith("-");
258
+ }
259
+ function cmakeBinaryDirStaysInsideWorktree(binaryDir) {
260
+ if (typeof binaryDir !== "string" || binaryDir.trim().length === 0) return true;
261
+ let normalized = binaryDir.trim().replace(/\\/g, "/");
262
+ const cmakeSourceDirPrefix = "${sourceDir}/";
263
+ if (normalized.startsWith(cmakeSourceDirPrefix)) {
264
+ normalized = normalized.slice(cmakeSourceDirPrefix.length);
265
+ } else if (normalized.includes("$")) {
266
+ return false;
267
+ }
268
+ if (path.isAbsolute(normalized) || /^[A-Za-z]:\//.test(normalized)) return false;
269
+ return !normalized.split("/").some((part) => part === "..");
270
+ }
271
+ function presetInheritedNames(preset) {
272
+ const inherits = preset.inherits;
273
+ if (typeof inherits === "string") return [inherits.trim()].filter(Boolean);
274
+ if (Array.isArray(inherits)) {
275
+ return inherits.filter((entry) => typeof entry === "string").map((entry) => entry.trim()).filter(Boolean);
276
+ }
277
+ return [];
278
+ }
279
+ function resolveCMakePreset(presets, name, seen = /* @__PURE__ */ new Set()) {
280
+ if (seen.has(name)) return void 0;
281
+ const preset = presets.get(name);
282
+ if (!preset) return void 0;
283
+ seen.add(name);
284
+ let resolved = {};
285
+ for (const parentName of presetInheritedNames(preset)) {
286
+ const parent = resolveCMakePreset(presets, parentName, seen);
287
+ if (parent) resolved = { ...parent, ...resolved };
288
+ }
289
+ return { ...resolved, ...preset };
290
+ }
291
+ function firstSafeCMakePresetName(filePath, property) {
292
+ const configurePresets = /* @__PURE__ */ new Map();
293
+ for (const entry of readJsonArrayProperty(filePath, "configurePresets")) {
294
+ if (typeof entry.name === "string") configurePresets.set(entry.name.trim(), entry);
295
+ }
296
+ const candidatePresets = /* @__PURE__ */ new Map();
297
+ for (const entry of readJsonArrayProperty(filePath, property)) {
298
+ if (typeof entry.name === "string") candidatePresets.set(entry.name.trim(), entry);
299
+ }
300
+ for (const name of candidatePresets.keys()) {
301
+ if (name.length === 0 || !isSafeCommandToken(name)) continue;
302
+ const entry = resolveCMakePreset(candidatePresets, name);
303
+ if (!entry) continue;
304
+ const configurePresetName = typeof entry.configurePreset === "string" ? entry.configurePreset.trim() : "";
305
+ const configurePreset = configurePresetName ? resolveCMakePreset(configurePresets, configurePresetName) : void 0;
306
+ if (!cmakeBinaryDirStaysInsideWorktree(configurePreset?.binaryDir)) continue;
307
+ return name;
308
+ }
309
+ return void 0;
310
+ }
311
+ function readTextFile(filePath) {
312
+ try {
313
+ const content = readFileSync(filePath, "utf8");
314
+ return typeof content === "string" ? content : "";
315
+ } catch {
316
+ return "";
317
+ }
318
+ }
319
+ function readTextFilePrefix(filePath, maxBytes) {
320
+ try {
321
+ const content = readFileSync(filePath, "utf8");
322
+ return typeof content === "string" ? content.slice(0, maxBytes) : "";
323
+ } catch {
324
+ return "";
325
+ }
326
+ }
327
+ function readPackageScripts(root) {
328
+ const pkg = readJsonFile(path.join(root, "package.json"));
329
+ const rawScripts = pkg?.scripts;
330
+ if (!rawScripts || typeof rawScripts !== "object" || Array.isArray(rawScripts)) {
331
+ return {};
332
+ }
333
+ const scripts = {};
334
+ for (const [key, value] of Object.entries(rawScripts)) {
335
+ if (typeof value === "string" && value.trim().length > 0) {
336
+ scripts[key] = value;
337
+ }
338
+ }
339
+ return scripts;
340
+ }
341
+ function readComposerScripts(root) {
342
+ const composer = readJsonFile(path.join(root, "composer.json"));
343
+ const rawScripts = composer?.scripts;
344
+ if (!rawScripts || typeof rawScripts !== "object" || Array.isArray(rawScripts)) {
345
+ return {};
346
+ }
347
+ const scripts = {};
348
+ for (const [key, value] of Object.entries(rawScripts)) {
349
+ if (typeof value === "string" && value.trim().length > 0) {
350
+ scripts[key] = value;
351
+ } else if (Array.isArray(value) && value.length > 0) {
352
+ scripts[key] = value.map((entry) => String(entry)).join(" && ");
353
+ }
354
+ }
355
+ return scripts;
356
+ }
357
+ function readVerificationOverrides(root) {
358
+ const configPath = [
359
+ path.join(root, ".poetic", "config", "poetic.config.jsonc"),
360
+ path.join(root, "poetic.config.jsonc")
361
+ ].find((candidate) => existsSync(candidate));
362
+ if (!configPath) return {};
363
+ try {
364
+ const parsed = parseJsonc(readFileSync(configPath, "utf8"));
365
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
366
+ const verification = parsed.verification;
367
+ if (!verification || typeof verification !== "object" || Array.isArray(verification)) return {};
368
+ const out = {};
369
+ for (const key of [
370
+ "format",
371
+ "build",
372
+ "typecheck",
373
+ "lint",
374
+ "test",
375
+ "audit",
376
+ "coverage"
377
+ ]) {
378
+ const value = verification[key];
379
+ if (typeof value === "string" && value.trim().length > 0) {
380
+ out[key] = [value.trim()];
381
+ } else if (Array.isArray(value)) {
382
+ out[key] = value.filter(
383
+ (entry) => typeof entry === "string" && entry.trim().length > 0
384
+ );
385
+ }
386
+ }
387
+ return out;
388
+ } catch {
389
+ return {};
390
+ }
391
+ }
392
+ function detectPackageManager(root) {
393
+ const pkg = readJsonFile(path.join(root, "package.json"));
394
+ const packageManager = pkg?.packageManager;
395
+ if (typeof packageManager === "string") {
396
+ const manager = packageManager.split("@")[0];
397
+ if (manager === "npm" || manager === "pnpm" || manager === "yarn" || manager === "bun") {
398
+ return manager;
399
+ }
400
+ }
401
+ if (fileExists(root, "pnpm-lock.yaml")) return "pnpm";
402
+ if (fileExists(root, "yarn.lock")) return "yarn";
403
+ if (fileExists(root, "bun.lockb") || fileExists(root, "bun.lock")) return "bun";
404
+ return "npm";
405
+ }
406
+ function buildPackageScriptCommand(root, script) {
407
+ const manager = detectPackageManager(root);
408
+ if (manager === "npm") {
409
+ return script === "test" ? "npm test" : `npm run ${script}`;
410
+ }
411
+ if (manager === "yarn") {
412
+ return script === "test" ? "yarn test" : `yarn run ${script}`;
413
+ }
414
+ return `${manager} run ${script}`;
415
+ }
416
+ function packageRunCommand(root, script) {
417
+ return buildPackageScriptCommand(root, script);
418
+ }
419
+ function hasPackageDependency(root, dependency) {
420
+ const pkg = readJsonFile(path.join(root, "package.json"));
421
+ return Boolean(pkg?.dependencies?.[dependency] ?? pkg?.devDependencies?.[dependency]);
422
+ }
423
+ function hasLocalPackageBin(root, executable) {
424
+ const extension = process.platform === "win32" ? ".cmd" : "";
425
+ return existsSync(path.join(root, "node_modules", ".bin", `${executable}${extension}`));
426
+ }
427
+ function pythonModuleCommand(module, args = "") {
428
+ const suffix = args.trim().length > 0 ? ` ${args.trim()}` : "";
429
+ if (commandExists("python3")) return `python3 -m ${module}${suffix}`;
430
+ if (commandExists("python")) return `python -m ${module}${suffix}`;
431
+ if (process.platform === "win32" && commandExists("py")) return `py -m ${module}${suffix}`;
432
+ return `python3 -m ${module}${suffix}`;
433
+ }
434
+ function hasPythonSrcPackageLayout(root) {
435
+ if (!directoryStaysInsideRoot(root, "src")) return false;
436
+ return hasFileMatching(root, (relativePath, basename) => {
437
+ if (!basename.endsWith(".py")) return false;
438
+ const normalized = relativePath.replace(/\\/g, "/");
439
+ return normalized.startsWith("src/");
440
+ });
441
+ }
442
+ function pythonCommandWithSrcPath(root, command) {
443
+ if (process.platform === "win32" || !hasPythonSrcPackageLayout(root)) return command;
444
+ return `env PYTHONPATH=src ${command}`;
445
+ }
446
+ function isPythonUnitTestRelativePath(relativePath, basename) {
447
+ if (!basename.endsWith(".py")) return false;
448
+ const normalized = relativePath.replace(/\\/g, "/");
449
+ return /^tests?\//.test(normalized) || /(?:^|\/)test_[^/]+\.py$/.test(normalized) || /(?:^|\/)[^/]+_test\.py$/.test(normalized);
450
+ }
451
+ function pythonUnittestDiscoveryRoot(root) {
452
+ for (const dir of ["tests", "test"]) {
453
+ if (directoryStaysInsideRoot(root, dir) && hasFileMatching(
454
+ root,
455
+ (relativePath, basename) => basename.endsWith(".py") && relativePath.replace(/\\/g, "/").split("/")[0] === dir && !isIgnoredFixtureOrSentinelPath(relativePath)
456
+ )) {
457
+ return dir;
458
+ }
459
+ }
460
+ if (hasFileMatching(
461
+ root,
462
+ (relativePath, basename) => !relativePath.replace(/\\/g, "/").includes("/") && isPythonUnitTestRelativePath(relativePath, basename)
463
+ )) {
464
+ return ".";
465
+ }
466
+ return null;
467
+ }
468
+ function pythonUnittestCommand(root) {
469
+ const start = pythonUnittestDiscoveryRoot(root);
470
+ if (start === null) return null;
471
+ return pythonCommandWithSrcPath(root, pythonModuleCommand("unittest", `discover -s ${start}`));
472
+ }
473
+ function pythonUnittestCoverageCommand(root) {
474
+ return pythonCommandWithSrcPath(
475
+ root,
476
+ pythonModuleCommand("coverage", "run -m unittest discover")
477
+ );
478
+ }
479
+ function hasPytestSignal(root) {
480
+ const text = pythonProjectText(root).toLowerCase();
481
+ return fileExists(root, "pytest.ini") || /\[tool\.pytest\b/.test(text) || /(^|\n)\s*pytest(?:[<>=~! ]|\n|$)/.test(text);
482
+ }
483
+ function hasPythonStdlibUnittestSignal(root) {
484
+ const testFiles = collectFilesMatching(
485
+ root,
486
+ (relativePath, basename) => isPythonUnitTestRelativePath(relativePath, basename),
487
+ 20
488
+ );
489
+ return testFiles.some((relativePath) => {
490
+ const content = readTextFilePrefix(path.join(root, relativePath), 12e3);
491
+ return /^\s*import\s+unittest(?:\s|$)/m.test(content) || /^\s*from\s+unittest(?:\s|\.|$)/m.test(content) || /\bunittest\.TestCase\b/.test(content) || /\bunittest\.main\s*\(/.test(content);
492
+ });
493
+ }
494
+ function pythonTestRunners(root) {
495
+ const unittestCommand = pythonUnittestCommand(root);
496
+ if (hasPytestSignal(root)) {
497
+ return {
498
+ primary: pythonCommandWithSrcPath(root, pythonModuleCommand("pytest")),
499
+ fallback: unittestCommand !== null && hasPythonStdlibUnittestSignal(root) ? [unittestCommand] : []
500
+ };
501
+ }
502
+ if (unittestCommand !== null) return { primary: unittestCommand, fallback: [] };
503
+ return { primary: null, fallback: [] };
504
+ }
505
+ function pythonProjectText(root) {
506
+ return [
507
+ readTextFile(path.join(root, "pyproject.toml")),
508
+ readTextFile(path.join(root, "requirements.txt")),
509
+ readTextFile(path.join(root, "requirements-dev.txt")),
510
+ readTextFile(path.join(root, "setup.cfg")),
511
+ readTextFile(path.join(root, "tox.ini")),
512
+ readTextFile(path.join(root, "mypy.ini"))
513
+ ].join("\n");
514
+ }
515
+ function hasPythonToolSignal(root, tool) {
516
+ const text = pythonProjectText(root).toLowerCase();
517
+ if (tool === "ruff") {
518
+ return fileExists(root, "ruff.toml") || fileExists(root, ".ruff.toml") || /\[tool\.ruff/.test(text) || /(^|\n)\s*ruff(?:[<>=~! ]|\n|$)/.test(text);
519
+ }
520
+ if (tool === "black") {
521
+ return /\[tool\.black/.test(text) || /(^|\n)\s*black(?:[<>=~! ]|\n|$)/.test(text);
522
+ }
523
+ return fileExists(root, "mypy.ini") || /\[tool\.mypy/.test(text) || /\[mypy\]/.test(text) || /(^|\n)\s*mypy(?:[<>=~! ]|\n|$)/.test(text);
524
+ }
525
+ function addPythonQualityCommands(root, verification) {
526
+ if (hasPythonToolSignal(root, "black")) verification.format.push("black --check .");
527
+ if (hasPythonToolSignal(root, "ruff")) verification.lint.push("ruff check .");
528
+ if (hasPythonToolSignal(root, "mypy")) verification.typecheck.push("mypy .");
529
+ }
530
+ function addJvmQualityCommands(root, manifests, verification) {
531
+ const gradleText = gradleProjectText(root);
532
+ const gradleCommand = wrapperCommand(root, "gradlew", "gradlew.bat", "gradle");
533
+ if (manifests.gradle) {
534
+ verification.build.push(`${gradleCommand} build`);
535
+ verification.typecheck.push(`${gradleCommand} build`);
536
+ if (/\bspotless\b|\bcheckstyle\b/.test(gradleText))
537
+ verification.lint.push(`${gradleCommand} check`);
538
+ return;
539
+ }
540
+ if (manifests.pomXml) {
541
+ const pomText = readTextFile(path.join(root, "pom.xml")).toLowerCase();
542
+ const mavenCommand = wrapperCommand(root, "mvnw", "mvnw.cmd", "mvn");
543
+ verification.build.push(`${mavenCommand} compile`);
544
+ verification.typecheck.push(`${mavenCommand} compile`);
545
+ if (pomText.includes("spotless-maven-plugin") || pomText.includes("maven-checkstyle-plugin")) {
546
+ verification.lint.push(`${mavenCommand} verify`);
547
+ }
548
+ }
549
+ }
550
+ function addNativeCommands(root, manifests, verification) {
551
+ if (manifests.cmakePresets) {
552
+ const presetsPath = path.join(root, "CMakePresets.json");
553
+ const buildPreset = firstSafeCMakePresetName(presetsPath, "buildPresets");
554
+ const testPreset = firstSafeCMakePresetName(presetsPath, "testPresets");
555
+ if (buildPreset) {
556
+ verification.build.push(`cmake --build --preset ${buildPreset}`);
557
+ }
558
+ if (testPreset) {
559
+ verification.test.push(`ctest --preset ${testPreset}`);
560
+ }
561
+ }
562
+ const hasCmakeManifest = manifests.cmakeLists || manifests.cmakePresets;
563
+ if (hasCmakeManifest && !verification.build.some((command) => command.startsWith("cmake --build "))) {
564
+ if (manifests.buildCMakeCache) {
565
+ verification.build.push("cmake --build build");
566
+ }
567
+ }
568
+ if (hasCmakeManifest && !verification.test.some((command) => command.startsWith("ctest "))) {
569
+ if (manifests.buildCTestFile) {
570
+ verification.test.push("ctest --test-dir build --output-on-failure");
571
+ }
572
+ }
573
+ if (manifests.mesonBuild && manifests.mesonConfigured) {
574
+ verification.build.push("meson compile -C build");
575
+ verification.test.push("meson test -C build");
576
+ }
577
+ }
578
+ function hasCSourceFile(root) {
579
+ return hasFileMatching(root, (_relativePath, basename) => /\.c$/.test(basename));
580
+ }
581
+ function hasCHeaderFile(root) {
582
+ return hasFileMatching(root, (_relativePath, basename) => /\.h$/.test(basename));
583
+ }
584
+ function hasCppSourceFile(root) {
585
+ return hasFileMatching(root, (_relativePath, basename) => {
586
+ const lower = basename.toLowerCase();
587
+ return /\.(?:cc|cpp|cxx|c\+\+|hh|hpp|hxx|h\+\+|ipp|ixx)$/.test(lower) || basename.endsWith(".C") || basename.endsWith(".H");
588
+ });
589
+ }
590
+ function mesonProjectLanguages(root) {
591
+ const projectArgs = readTextFile(path.join(root, "meson.build")).match(
592
+ /project\s*\(([\s\S]*?)\)/i
593
+ )?.[1];
594
+ if (!projectArgs) return { c: false, cpp: false };
595
+ return {
596
+ c: /['"]c['"]/i.test(projectArgs),
597
+ cpp: /['"]cpp['"]/i.test(projectArgs)
598
+ };
599
+ }
600
+ function gradleProjectText(root) {
601
+ const gradleFiles = [
602
+ "build.gradle",
603
+ "build.gradle.kts",
604
+ "settings.gradle",
605
+ "settings.gradle.kts",
606
+ ...collectFilesMatching(
607
+ root,
608
+ (relativePath, basename) => (basename === "build.gradle" || basename === "build.gradle.kts") && relativePath.includes("/"),
609
+ 20
610
+ )
611
+ ];
612
+ return unique(gradleFiles).map((file) => readTextFile(path.join(root, file))).join("\n").toLowerCase();
613
+ }
614
+ function hasGradleManifest(root) {
615
+ return fileExists(root, "build.gradle") || fileExists(root, "build.gradle.kts") || hasFileMatching(
616
+ root,
617
+ (relativePath, basename) => (basename === "build.gradle" || basename === "build.gradle.kts") && relativePath.includes("/")
618
+ );
619
+ }
620
+ function hasKotlinSourceFile(root) {
621
+ return hasFileMatching(root, (_relativePath, basename) => {
622
+ if (basename.endsWith(".kt")) return true;
623
+ return basename.endsWith(".kts") && !basename.endsWith(".gradle.kts") && basename !== "settings.gradle.kts";
624
+ });
625
+ }
626
+ function hasGradleKotlinSignal(root) {
627
+ const gradleText = gradleProjectText(root);
628
+ return hasKotlinSourceFile(root) || /\bkotlin\s*\(/.test(gradleText) || /\borg\.jetbrains\.kotlin\b/.test(gradleText) || /\bkotlin-android\b/.test(gradleText);
629
+ }
630
+ function hasJavaSourceFile(root) {
631
+ return hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".java"));
632
+ }
633
+ function hasGradleJavaSignal(root) {
634
+ const gradleText = gradleProjectText(root);
635
+ return hasJavaSourceFile(root) || /\bid\s*\(?\s*['"](?:java|java-library|application)['"]/.test(gradleText) || /\bapply\s+plugin:\s*['"](?:java|java-library|application)['"]/.test(gradleText);
636
+ }
637
+ function hasSqlSourceFile(root) {
638
+ return hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".sql"));
639
+ }
640
+ function hasSqlfluffConfig(root) {
641
+ return fileExists(root, ".sqlfluff") || /\[sqlfluff\]/i.test(readTextFile(path.join(root, "setup.cfg"))) || /\[sqlfluff\]/i.test(readTextFile(path.join(root, "tox.ini"))) || /\[tool\.sqlfluff\]/i.test(readTextFile(path.join(root, "pyproject.toml")));
642
+ }
643
+ function addPackageScriptCommands(root, scripts, verification) {
644
+ const add = (kind, script) => {
645
+ if (scripts[script]) verification[kind].push(packageRunCommand(root, script));
646
+ };
647
+ add("format", "format:check");
648
+ add("format", "check:format");
649
+ add("format", "fmt:check");
650
+ add("typecheck", "typecheck");
651
+ add("typecheck", "type-check");
652
+ add("lint", "lint");
653
+ add("test", "test:smoke");
654
+ add("test", "test:unit");
655
+ add("test", "test:fast");
656
+ add("test", "test");
657
+ add("build", "build");
658
+ }
659
+ function addResolverOwnedBiomeLintCommand(root, manifests, verification) {
660
+ if (!manifests.rootPackageJson) return;
661
+ if (verification.lint.some((command) => describeVerificationCommand(command).language === "node"))
662
+ return;
663
+ if (!hasPackageDependency(root, "@biomejs/biome")) return;
664
+ if (!hasLocalPackageBin(root, "biome")) return;
665
+ verification.lint.push(
666
+ "npx --no-install biome check --changed --no-errors-on-unmatched --reporter=json --formatter-enabled=false --linter-enabled=true ."
667
+ );
668
+ }
669
+ function addAuditCommands(root, manifests, sourceSignals, audit) {
670
+ if (manifests.rootPackageJson) {
671
+ const manager = detectPackageManager(root);
672
+ if (manager === "npm" && fileExists(root, "package-lock.json")) {
673
+ audit.push("npm audit --omit=dev --audit-level=high --json");
674
+ } else if (manager === "pnpm" && fileExists(root, "pnpm-lock.yaml")) {
675
+ audit.push("pnpm audit --prod --audit-level high --json");
676
+ } else if (manager === "yarn" && fileExists(root, "yarn.lock")) {
677
+ audit.push("yarn npm audit --recursive --severity high --json");
678
+ } else if (manager === "bun" && (fileExists(root, "bun.lockb") || fileExists(root, "bun.lock"))) {
679
+ audit.push("bun audit --production --json");
680
+ }
681
+ }
682
+ if (sourceSignals.python && hasPythonAuditSignal(root)) {
683
+ audit.push("pip-audit");
684
+ }
685
+ if (sourceSignals.go && manifests.goMod) {
686
+ audit.push("govulncheck ./...");
687
+ }
688
+ if (sourceSignals.rust && manifests.cargoToml) {
689
+ audit.push("cargo audit");
690
+ }
691
+ }
692
+ function hasPythonAuditSignal(root) {
693
+ const text = pythonProjectText(root).toLowerCase();
694
+ return /(^|\n)\s*pip-audit(?:[<>=~! ]|\n|$)/.test(text) || /\bpip-audit\b/.test(text);
695
+ }
696
+ function hasPythonCoverageSignal(root) {
697
+ const text = pythonProjectText(root).toLowerCase();
698
+ return fileExists(root, ".coveragerc") || /\[tool\.coverage/.test(text) || /\[coverage:/.test(text) || /(^|\n)\s*coverage(?:[<>=~! ]|\n|$)/.test(text) || /(^|\n)\s*pytest-cov(?:[<>=~! ]|\n|$)/.test(text) || /\bpytest-cov\b/.test(text);
699
+ }
700
+ function hasRustCoverageSignal(root) {
701
+ const text = readTextFile(path.join(root, "Cargo.toml")).toLowerCase();
702
+ return /\bcargo-llvm-cov\b/.test(text) || /\btarpaulin\b/.test(text) || fileExists(root, "tarpaulin.toml");
703
+ }
704
+ var CANONICAL_RUNNER_TASKS = [
705
+ "test",
706
+ "lint",
707
+ "build",
708
+ "check",
709
+ "verify"
710
+ ];
711
+ function readRunnerTaskNames(root, candidateFiles, runner) {
712
+ const found = /* @__PURE__ */ new Set();
713
+ const activeFile = candidateFiles.find((file) => fileExists(root, file));
714
+ if (activeFile !== void 0) {
715
+ const text = readTextFilePrefix(path.join(root, activeFile), 64 * 1024);
716
+ const names = runner === "just" ? readJustRecipeNames(text) : readTaskfileTaskNames(text);
717
+ for (const kind of CANONICAL_RUNNER_TASKS) {
718
+ if (names.has(kind)) found.add(kind);
719
+ }
720
+ }
721
+ return CANONICAL_RUNNER_TASKS.filter((kind) => found.has(kind));
722
+ }
723
+ function readJustRecipeNames(text) {
724
+ const names = /* @__PURE__ */ new Set();
725
+ for (const rawLine of text.split("\n")) {
726
+ const line = rawLine.replace(/\r$/, "");
727
+ const match = line.match(/^([A-Za-z0-9_-]+)[ \t]*:(?!=)/);
728
+ if (match?.[1]) names.add(match[1]);
729
+ }
730
+ return names;
731
+ }
732
+ function readTaskfileTaskNames(text) {
733
+ const names = /* @__PURE__ */ new Set();
734
+ const lines = text.split("\n").map((l) => l.replace(/\r$/, ""));
735
+ let i = 0;
736
+ while (i < lines.length) {
737
+ if (/^tasks:\s*(?:#.*)?$/.test(lines[i] ?? "")) break;
738
+ i += 1;
739
+ }
740
+ if (i >= lines.length) return names;
741
+ i += 1;
742
+ let taskKeyIndent = -1;
743
+ let currentTask;
744
+ let currentTaskInternal = false;
745
+ const finalizeCurrent = () => {
746
+ if (currentTask !== void 0 && !currentTaskInternal) {
747
+ names.add(currentTask);
748
+ }
749
+ currentTask = void 0;
750
+ currentTaskInternal = false;
751
+ };
752
+ for (; i < lines.length; i += 1) {
753
+ const line = lines[i] ?? "";
754
+ if (line.trim().length === 0 || line.trim().startsWith("#")) continue;
755
+ const indent = line.length - line.replace(/^[ ]+/, "").length;
756
+ if (indent === 0) break;
757
+ if (taskKeyIndent === -1) taskKeyIndent = indent;
758
+ if (indent === taskKeyIndent) {
759
+ finalizeCurrent();
760
+ const match = line.match(/^[ ]+([A-Za-z0-9_-]+)[ \t]*:(.*)$/);
761
+ if (match?.[1]) {
762
+ currentTask = match[1];
763
+ const inlineRemainder = match[2] ?? "";
764
+ if (/\binternal:\s*true\b/i.test(inlineRemainder)) {
765
+ currentTaskInternal = true;
766
+ }
767
+ }
768
+ continue;
769
+ }
770
+ if (currentTask !== void 0 && /^\s*internal:\s*true\s*(?:#.*)?$/i.test(line)) {
771
+ currentTaskInternal = true;
772
+ }
773
+ }
774
+ finalizeCurrent();
775
+ return names;
776
+ }
777
+ function addCoverageCommands(root, scripts, manifests, sourceSignals, coverage) {
778
+ if (manifests.rootPackageJson && scripts["test:coverage"]) {
779
+ coverage.push(packageRunCommand(root, "test:coverage"));
780
+ }
781
+ if (sourceSignals.go && manifests.goMod) {
782
+ coverage.push("go test -cover ./...");
783
+ }
784
+ if (sourceSignals.python && hasPythonCoverageSignal(root)) {
785
+ if (hasPytestSignal(root)) {
786
+ coverage.push(pythonCommandWithSrcPath(root, `${pythonModuleCommand("pytest")} --cov`));
787
+ } else if (pythonUnittestDiscoveryRoot(root) !== null) {
788
+ coverage.push(pythonUnittestCoverageCommand(root));
789
+ }
790
+ }
791
+ if (sourceSignals.rust && manifests.cargoToml && hasRustCoverageSignal(root)) {
792
+ const text = readTextFile(path.join(root, "Cargo.toml")).toLowerCase();
793
+ coverage.push(/\bcargo-llvm-cov\b/.test(text) ? "cargo llvm-cov" : "cargo tarpaulin");
794
+ }
795
+ }
796
+ function readTurboTaskNames(root) {
797
+ const tasks = /* @__PURE__ */ new Set();
798
+ const sources = [];
799
+ const turboJson = readJsonFile(path.join(root, "turbo.json"));
800
+ if (turboJson) sources.push(turboJson.tasks, turboJson.pipeline);
801
+ const pkg = readJsonFile(path.join(root, "package.json"));
802
+ const pkgTurbo = pkg?.turbo;
803
+ if (pkgTurbo && typeof pkgTurbo === "object" && !Array.isArray(pkgTurbo)) {
804
+ const turboConfig = pkgTurbo;
805
+ sources.push(turboConfig.tasks, turboConfig.pipeline);
806
+ }
807
+ for (const source of sources) {
808
+ if (source && typeof source === "object" && !Array.isArray(source)) {
809
+ for (const key of Object.keys(source)) {
810
+ const taskName = key.includes("#") ? key.split("#").pop() ?? key : key;
811
+ if (taskName.length > 0) tasks.add(taskName);
812
+ }
813
+ }
814
+ }
815
+ return tasks;
816
+ }
817
+ function addTurboTaskCommands(root, scripts, verification) {
818
+ const taskNames = readTurboTaskNames(root);
819
+ if (taskNames.size === 0) return;
820
+ const rootScriptCovered = /* @__PURE__ */ new Set(["build", "lint", "typecheck", "test"]);
821
+ const turboTaskBuckets = [
822
+ { task: "build", kind: "build" },
823
+ { task: "check", kind: "test" },
824
+ { task: "lint", kind: "lint" },
825
+ { task: "test", kind: "test" },
826
+ { task: "typecheck", kind: "typecheck" },
827
+ { task: "verify", kind: "test" }
828
+ ];
829
+ for (const { task, kind } of turboTaskBuckets) {
830
+ if (!taskNames.has(task)) continue;
831
+ if (rootScriptCovered.has(task) && scripts[task]) continue;
832
+ verification[kind].push(`turbo run ${task}`);
833
+ }
834
+ }
835
+ function hasJavaScriptTestFile(root) {
836
+ return hasFileMatching(
837
+ root,
838
+ (_relativePath, basename) => /\.(test|spec)\.(js|jsx|mjs|cjs|ts|tsx|mts|cts)$/.test(basename)
839
+ );
840
+ }
841
+ function hasProjectTestFile(root) {
842
+ return hasFileMatching(root, (relativePath) => isProjectTestPath(relativePath));
843
+ }
844
+ function addDotnetCommands(root, manifests, verification) {
845
+ if (!manifests.dotnetSolution && !manifests.dotnetProject) return;
846
+ verification.format.push("dotnet format --verify-no-changes");
847
+ verification.build.push("dotnet build");
848
+ verification.typecheck.push("dotnet build");
849
+ if (hasProjectTestFile(root)) {
850
+ verification.test.push("dotnet test");
851
+ }
852
+ }
853
+ function addSwiftCommands(root, manifests, verification) {
854
+ if (!manifests.packageSwift) return;
855
+ verification.build.push("swift build");
856
+ const hasSwiftTests = hasFileMatching(root, (relativePath, basename) => {
857
+ const normalized = relativePath.replace(/\\/g, "/");
858
+ return normalized.startsWith("Tests/") || basename.endsWith("Tests.swift") || basename.endsWith("Test.swift");
859
+ });
860
+ if (hasSwiftTests) verification.test.push("swift test");
861
+ }
862
+ function pubspecText(root) {
863
+ return readTextFile(path.join(root, "pubspec.yaml")).toLowerCase();
864
+ }
865
+ function addDartCommands(root, manifests, verification) {
866
+ if (!manifests.pubspecYaml) return;
867
+ const text = pubspecText(root);
868
+ const isFlutter = /^\s*flutter\s*:/m.test(text) || /(^|\n)\s*sdk\s*:\s*flutter\b/.test(text);
869
+ const hasDartTests = hasFileMatching(root, (relativePath, basename) => {
870
+ const normalized = relativePath.replace(/\\/g, "/").toLowerCase();
871
+ return (normalized.startsWith("test/") || normalized.startsWith("integration_test/")) && basename.endsWith("_test.dart");
872
+ });
873
+ if (isFlutter) {
874
+ verification.lint.push("flutter analyze");
875
+ if (hasDartTests) verification.test.push("flutter test");
876
+ } else {
877
+ verification.lint.push("dart analyze");
878
+ if (hasDartTests || /(^|\n)\s*test\s*:/.test(text)) verification.test.push("dart test");
879
+ }
880
+ }
881
+ function addShellCommands(root, verification) {
882
+ const shellFiles = collectFilesMatching(
883
+ root,
884
+ (relativePath, basename) => /\.(?:sh|bash|zsh)$/.test(basename) && !basename.startsWith("-") && !/[^\w./-]/.test(relativePath),
885
+ 20
886
+ );
887
+ if (shellFiles.length === 0) return;
888
+ if (fileExists(root, ".shellcheckrc") || fileExists(root, "shellcheckrc")) {
889
+ verification.lint.push(`shellcheck ${shellFiles.join(" ")}`);
890
+ }
891
+ }
892
+ function addRCommands(manifests, verification) {
893
+ if (manifests.rDescription) {
894
+ verification.test.push("R CMD check .");
895
+ }
896
+ }
897
+ function addSqlCommands(manifests, verification) {
898
+ if (manifests.dbtProject) {
899
+ verification.build.push("dbt compile");
900
+ verification.test.push("dbt test");
901
+ }
902
+ if (manifests.sqlfluffConfig) {
903
+ verification.lint.push("sqlfluff lint .");
904
+ }
905
+ }
906
+ function hasBundlerInstallSignal(root) {
907
+ return existsSync(path.join(root, "vendor", "bundle")) || existsSync(path.join(root, ".bundle", "config"));
908
+ }
909
+ function addRubyCommands(root, manifests, verification) {
910
+ if (manifests.gemfile && !hasBundlerInstallSignal(root)) return;
911
+ const bundlePrefix = manifests.gemfile ? "bundle exec " : "";
912
+ const gemfileText = readTextFile(path.join(root, "Gemfile"));
913
+ const gemspecText = collectFilesMatching(
914
+ root,
915
+ (_relativePath, basename) => basename.endsWith(".gemspec"),
916
+ 5
917
+ ).map((file) => readTextFile(path.join(root, file))).join("\n");
918
+ const rubyText = `${gemfileText}
919
+ ${gemspecText}`;
920
+ const hasRspec = /\brspec\b/i.test(rubyText) || hasFileMatching(
921
+ root,
922
+ (relativePath, basename) => relativePath.startsWith("spec/") || basename.endsWith("_spec.rb")
923
+ );
924
+ const hasMinitest = hasProjectTestFile(root);
925
+ if (manifests.rubocop || /\brubocop\b/i.test(rubyText)) {
926
+ verification.lint.push(`${bundlePrefix}rubocop`.trim());
927
+ }
928
+ if (hasRspec) {
929
+ verification.test.push(`${bundlePrefix}rspec`.trim());
930
+ } else if (manifests.rakefile && hasMinitest) {
931
+ verification.test.push(`${bundlePrefix}rake test`.trim());
932
+ }
933
+ }
934
+ function hasComposerInstallSignal(root) {
935
+ return existsSync(path.join(root, "vendor", "autoload.php")) || existsSync(path.join(root, "vendor", "bin"));
936
+ }
937
+ function addPhpCommands(root, composerScripts, manifests, verification) {
938
+ if (manifests.composerJson && !hasComposerInstallSignal(root)) return;
939
+ const addComposerScript = (kind, script) => {
940
+ if (composerScripts[script]) verification[kind].push(`composer run ${script}`);
941
+ };
942
+ addComposerScript("test", "test");
943
+ addComposerScript("lint", "lint");
944
+ addComposerScript("typecheck", "typecheck");
945
+ addComposerScript("typecheck", "analyse");
946
+ addComposerScript("typecheck", "analyze");
947
+ addComposerScript("build", "build");
948
+ if (manifests.composerJson) {
949
+ if (manifests.phpunit && !composerScripts.test) {
950
+ verification.test.push("composer exec -- phpunit");
951
+ }
952
+ if (manifests.phpstan && !composerScripts.typecheck && !composerScripts.analyse) {
953
+ verification.typecheck.push("composer exec -- phpstan analyse");
954
+ }
955
+ if (manifests.psalm && !composerScripts.typecheck) {
956
+ verification.typecheck.push("composer exec -- psalm");
957
+ }
958
+ }
959
+ }
960
+ function addMakeCommands(root, verification) {
961
+ const makefile = ["Makefile", "makefile"].find((file) => fileExists(root, file));
962
+ if (!makefile) return;
963
+ let content = "";
964
+ try {
965
+ content = readFileSync(path.join(root, makefile), "utf8");
966
+ } catch {
967
+ return;
968
+ }
969
+ const hasTarget = (name) => new RegExp(`^${name}:`, "m").test(content);
970
+ if (hasTarget("check")) verification.test.push("make check");
971
+ if (hasTarget("test")) verification.test.push("make test");
972
+ if (hasTarget("lint")) verification.lint.push("make lint");
973
+ if (hasTarget("build")) verification.build.push("make build");
974
+ if (hasTarget("verify")) verification.test.push("make verify");
975
+ }
976
+ function unique(items) {
977
+ return Array.from(new Set(items));
978
+ }
979
+ function mergeVerificationCommands(base, override) {
980
+ const merged = {
981
+ format: unique(override.format ?? base.format),
982
+ build: unique(override.build ?? base.build),
983
+ typecheck: unique(override.typecheck ?? base.typecheck),
984
+ lint: unique(override.lint ?? base.lint),
985
+ test: unique(override.test ?? base.test),
986
+ testFallback: unique(override.testFallback ?? base.testFallback)
987
+ };
988
+ const audit = unique(override.audit ?? base.audit ?? []);
989
+ if (audit.length > 0) merged.audit = audit;
990
+ const coverage = unique(override.coverage ?? base.coverage ?? []);
991
+ if (coverage.length > 0) merged.coverage = coverage;
992
+ return merged;
993
+ }
994
+ function detectDocsOnly(root, languages) {
995
+ if (languages.some((language) => language !== "docs" && language !== "unknown")) {
996
+ return false;
997
+ }
998
+ const docsSignals = ["README.md", "README", "docs", "CHANGELOG.md", "LICENSE"].some(
999
+ (entry) => existsSync(path.join(root, entry))
1000
+ );
1001
+ return docsSignals;
1002
+ }
1003
+ function wrapperCommand(root, unixWrapper, windowsWrapper, fallback) {
1004
+ if (process.platform === "win32" && fileExists(root, windowsWrapper))
1005
+ return `.${path.sep}${windowsWrapper}`;
1006
+ if (fileExists(root, unixWrapper)) return `./${unixWrapper}`;
1007
+ return fallback;
1008
+ }
1009
+ function detectProjectCapabilities(root) {
1010
+ const buildDirectorySafe = directoryStaysInsideRoot(root, "build");
1011
+ const manifests = {
1012
+ packageJson: fileExists(root, "package.json") || hasFileMatching(
1013
+ root,
1014
+ (relativePath, basename) => relativePath.includes("/") && basename === "package.json"
1015
+ ),
1016
+ // ROOT-only package.json signal (distinct from `packageJson`, which is ALSO
1017
+ // true for a merely-nested manifest). The Node fast/scoped path runs ROOT
1018
+ // npm-script-based commands, so it must gate on a ROOT package.json existing
1019
+ // — mirroring `isNodeLikeTarget`'s `existsSync(path.join(root,'package.json'))`
1020
+ // in src/planning/quality-presets.ts. A nested-only manifest is NOT a root
1021
+ // Node surface and must fall through to the resolver-backed language path.
1022
+ rootPackageJson: fileExists(root, "package.json"),
1023
+ denoJson: fileExists(root, "deno.json") || fileExists(root, "deno.jsonc"),
1024
+ tsconfig: fileExists(root, "tsconfig.json") || fileExists(root, "tsconfig.typecheck.json"),
1025
+ pyproject: fileExists(root, "pyproject.toml"),
1026
+ requirements: fileExists(root, "requirements.txt"),
1027
+ goMod: fileExists(root, "go.mod"),
1028
+ cargoToml: fileExists(root, "Cargo.toml"),
1029
+ pomXml: fileExists(root, "pom.xml"),
1030
+ gradle: hasGradleManifest(root),
1031
+ cmakeLists: fileExists(root, "CMakeLists.txt"),
1032
+ cmakePresets: fileExists(root, "CMakePresets.json"),
1033
+ mesonBuild: fileExists(root, "meson.build"),
1034
+ buildCMakeCache: buildDirectorySafe && fileExists(root, path.join("build", "CMakeCache.txt")),
1035
+ buildCTestFile: buildDirectorySafe && fileExists(root, path.join("build", "CTestTestfile.cmake")),
1036
+ buildNinja: buildDirectorySafe && fileExists(root, path.join("build", "build.ninja")),
1037
+ mesonConfigured: buildDirectorySafe && fileExists(root, path.join("build", "meson-private")),
1038
+ dotnetSolution: hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".sln")),
1039
+ dotnetProject: hasFileMatching(
1040
+ root,
1041
+ (_relativePath, basename) => /\.(csproj|fsproj|vbproj)$/.test(basename)
1042
+ ),
1043
+ gemfile: fileExists(root, "Gemfile"),
1044
+ gemspec: hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".gemspec")),
1045
+ rakefile: fileExists(root, "Rakefile"),
1046
+ rubocop: fileExists(root, ".rubocop.yml") || fileExists(root, ".rubocop.yaml"),
1047
+ packageSwift: fileExists(root, "Package.swift"),
1048
+ pubspecYaml: fileExists(root, "pubspec.yaml"),
1049
+ composerJson: fileExists(root, "composer.json"),
1050
+ composerLock: fileExists(root, "composer.lock"),
1051
+ phpunit: fileExists(root, "phpunit.xml") || fileExists(root, "phpunit.xml.dist"),
1052
+ phpstan: fileExists(root, "phpstan.neon") || fileExists(root, "phpstan.neon.dist"),
1053
+ psalm: fileExists(root, "psalm.xml") || fileExists(root, "psalm.xml.dist"),
1054
+ dbtProject: fileExists(root, "dbt_project.yml") || fileExists(root, "dbt_project.yaml"),
1055
+ sqlfluffConfig: hasSqlfluffConfig(root),
1056
+ rDescription: fileExists(root, "DESCRIPTION"),
1057
+ renvLock: fileExists(root, "renv.lock"),
1058
+ rProject: hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".Rproj")),
1059
+ shellcheckConfig: fileExists(root, ".shellcheckrc") || fileExists(root, "shellcheckrc"),
1060
+ pesterConfig: fileExists(root, "PesterConfiguration.ps1"),
1061
+ // PowerShell static-analysis config (PSScriptAnalyzer settings). Drives the
1062
+ // PowerShell lint command in the additive IaC/runner/PowerShell derivation.
1063
+ scriptAnalyzerConfig: fileExists(root, "PSScriptAnalyzerSettings.psd1"),
1064
+ makefile: fileExists(root, "Makefile") || fileExists(root, "makefile"),
1065
+ mavenWrapper: fileExists(root, "mvnw") || fileExists(root, "mvnw.cmd"),
1066
+ gradleWrapper: fileExists(root, "gradlew") || fileExists(root, "gradlew.bat"),
1067
+ // --- Static IaC surfaces (additive verification-coverage lane) ---------
1068
+ // `dockerfile` is kept DISTINCT from `dockerCompose`: a Compose file is not a
1069
+ // Dockerfile and must not trigger `hadolint Dockerfile`.
1070
+ dockerfile: fileExists(root, "Dockerfile"),
1071
+ // hadolint is a separate binary from Docker; gate it on its own dedicated
1072
+ // config (`.hadolint.yaml`/`.hadolint.yml`) rather than the presence of a
1073
+ // Dockerfile, so a plain Docker repo does not emit a command-not-found
1074
+ // `hadolint` failure (mirrors the `tflintConfig` gate).
1075
+ hadolintConfig: fileExists(root, ".hadolint.yaml") || fileExists(root, ".hadolint.yml"),
1076
+ dockerCompose: fileExists(root, "docker-compose.yml") || fileExists(root, "docker-compose.yaml") || fileExists(root, "compose.yml") || fileExists(root, "compose.yaml"),
1077
+ // Any `*.tf` file anywhere in the tree signals Terraform configuration.
1078
+ terraform: hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".tf")),
1079
+ // tflint is a separate binary from the Terraform CLI; gate it on its own
1080
+ // dedicated config (`.tflint.hcl`) rather than the presence of `*.tf`, so a
1081
+ // plain Terraform repo does not emit a command-not-found `tflint` failure.
1082
+ tflintConfig: fileExists(root, ".tflint.hcl"),
1083
+ // golangci-lint is a separate binary from the Go toolchain; gate it on its
1084
+ // own dedicated config file rather than the presence of go.mod, so a plain
1085
+ // Go repo does not emit a command-not-found `golangci-lint` failure
1086
+ // (mirrors the `tflintConfig`/`hadolintConfig` real-toolchain-signal gates).
1087
+ golangciLintConfig: fileExists(root, ".golangci.yml") || fileExists(root, ".golangci.yaml") || fileExists(root, ".golangci.toml") || fileExists(root, ".golangci.json"),
1088
+ // Conservative Kubernetes-manifest heuristic. Scanning every YAML for
1089
+ // `apiVersion:`+`kind:` is too I/O-heavy, so we use cheap structural signals
1090
+ // only: a `k8s/` or `kubernetes/` directory, or a kustomization file at root.
1091
+ // This intentionally UNDER-detects (e.g. manifests in an oddly-named dir) to
1092
+ // stay fail-closed: a missed manifest emits no command rather than a wrong one.
1093
+ kubernetesManifests: directoryStaysInsideRoot(root, "k8s") || directoryStaysInsideRoot(root, "kubernetes") || fileExists(root, "kustomization.yaml") || fileExists(root, "kustomization.yml"),
1094
+ // --- Custom task runners (just / task) --------------------------------
1095
+ justfile: fileExists(root, "justfile") || fileExists(root, ".justfile") || fileExists(root, "Justfile"),
1096
+ taskfile: fileExists(root, "Taskfile.yml") || fileExists(root, "Taskfile.yaml") || fileExists(root, "taskfile.yml") || fileExists(root, "taskfile.yaml") || fileExists(root, "Taskfile.dist.yml") || fileExists(root, "Taskfile.dist.yaml")
1097
+ };
1098
+ const mesonLanguages = manifests.mesonBuild ? mesonProjectLanguages(root) : { c: false, cpp: false };
1099
+ const hasCppSource = hasCppSourceFile(root) || mesonLanguages.cpp;
1100
+ const sourceSignals = {
1101
+ typescript: manifests.tsconfig || manifests.denoJson || hasFileMatching(root, (_relativePath, basename) => /\.(?:ts|tsx|mts|cts)$/.test(basename)),
1102
+ javascript: manifests.rootPackageJson || manifests.denoJson || hasFileMatching(root, (_relativePath, basename) => /\.(?:js|jsx|mjs|cjs)$/.test(basename)),
1103
+ c: hasCSourceFile(root) || mesonLanguages.c || !hasCppSource && hasCHeaderFile(root),
1104
+ cpp: hasCppSource,
1105
+ python: manifests.pyproject || manifests.requirements || fileExists(root, "poetry.lock") || fileExists(root, "Pipfile") || fileExists(root, "Pipfile.lock") || fileExists(root, "pytest.ini") || fileExists(root, "setup.py") || hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".py")),
1106
+ go: manifests.goMod || hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".go")),
1107
+ rust: manifests.cargoToml || hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".rs")),
1108
+ java: !manifests.gradle && manifests.pomXml || hasGradleJavaSignal(root),
1109
+ dotnet: manifests.dotnetSolution || manifests.dotnetProject,
1110
+ swift: manifests.packageSwift || hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".swift")),
1111
+ kotlin: hasFileMatching(root, (_relativePath, basename) => basename === "AndroidManifest.xml") || hasGradleKotlinSignal(root),
1112
+ dart: manifests.pubspecYaml || hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".dart")),
1113
+ ruby: manifests.gemfile || manifests.gemspec || manifests.rakefile || manifests.rubocop || hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".rb")),
1114
+ php: manifests.composerJson || manifests.composerLock || manifests.phpunit || manifests.phpstan || manifests.psalm || hasFileMatching(root, (_relativePath, basename) => basename.endsWith(".php")),
1115
+ shell: hasFileMatching(
1116
+ root,
1117
+ (_relativePath, basename) => /\.(?:sh|bash|fish|ksh|zsh)$/.test(basename)
1118
+ ),
1119
+ powershell: manifests.pesterConfig || hasFileMatching(root, (_relativePath, basename) => /\.(?:ps1|psm1|psd1)$/i.test(basename)),
1120
+ r: manifests.rDescription || manifests.rProject || hasFileMatching(root, (_relativePath, basename) => /\.(?:r|R|Rmd|Rnw)$/i.test(basename)),
1121
+ sql: manifests.dbtProject || hasSqlSourceFile(root)
1122
+ };
1123
+ const languages = /* @__PURE__ */ new Set();
1124
+ if (manifests.rootPackageJson) {
1125
+ languages.add("node");
1126
+ languages.add(sourceSignals.typescript ? "typescript" : "javascript");
1127
+ }
1128
+ if (!manifests.rootPackageJson && sourceSignals.typescript) languages.add("typescript");
1129
+ if (!manifests.rootPackageJson && sourceSignals.javascript) languages.add("javascript");
1130
+ if (sourceSignals.c) languages.add("c");
1131
+ if (sourceSignals.cpp) languages.add("cpp");
1132
+ if (sourceSignals.python) languages.add("python");
1133
+ if (sourceSignals.go) languages.add("go");
1134
+ if (sourceSignals.rust) languages.add("rust");
1135
+ if (sourceSignals.java) languages.add("java");
1136
+ if (sourceSignals.dotnet) languages.add("dotnet");
1137
+ if (sourceSignals.swift) languages.add("swift");
1138
+ if (sourceSignals.kotlin) languages.add("kotlin");
1139
+ if (sourceSignals.dart) languages.add("dart");
1140
+ if (sourceSignals.ruby) languages.add("ruby");
1141
+ if (sourceSignals.php) languages.add("php");
1142
+ if (sourceSignals.shell) languages.add("shell");
1143
+ if (sourceSignals.powershell) languages.add("powershell");
1144
+ if (sourceSignals.r) languages.add("r");
1145
+ if (sourceSignals.sql) languages.add("sql");
1146
+ if (languages.size === 0) {
1147
+ const initialLanguages = [];
1148
+ if (detectDocsOnly(root, initialLanguages)) languages.add("docs");
1149
+ }
1150
+ if (languages.size === 0) languages.add("unknown");
1151
+ const packageScripts = readPackageScripts(root);
1152
+ const composerScripts = readComposerScripts(root);
1153
+ const verification = {
1154
+ format: [],
1155
+ build: [],
1156
+ typecheck: [],
1157
+ lint: [],
1158
+ test: [],
1159
+ testFallback: []
1160
+ };
1161
+ addPackageScriptCommands(root, packageScripts, verification);
1162
+ if (manifests.packageJson) {
1163
+ addTurboTaskCommands(root, packageScripts, verification);
1164
+ }
1165
+ if (manifests.packageJson && detectPackageManager(root) === "bun" && !packageScripts.test && hasJavaScriptTestFile(root)) {
1166
+ verification.test.push("bun test");
1167
+ }
1168
+ addMakeCommands(root, verification);
1169
+ addNativeCommands(root, manifests, verification);
1170
+ if (sourceSignals.python) {
1171
+ addPythonQualityCommands(root, verification);
1172
+ const pythonRunners = pythonTestRunners(root);
1173
+ if (pythonRunners.primary) verification.test.push(pythonRunners.primary);
1174
+ for (const fallback of pythonRunners.fallback) {
1175
+ verification.testFallback.push(fallback);
1176
+ }
1177
+ }
1178
+ if (manifests.goMod) {
1179
+ verification.lint.push("go vet ./...");
1180
+ if (manifests.golangciLintConfig) {
1181
+ verification.lint.push("golangci-lint run");
1182
+ }
1183
+ verification.typecheck.push('go test ./... -run "^$"');
1184
+ verification.test.push("go test ./...");
1185
+ verification.build.push("go build ./...");
1186
+ }
1187
+ if (manifests.cargoToml) {
1188
+ verification.format.push("cargo fmt --check");
1189
+ verification.lint.push("cargo clippy --locked --all-targets --all-features -- -D warnings");
1190
+ verification.typecheck.push("cargo check --locked");
1191
+ verification.test.push("cargo test --locked");
1192
+ verification.build.push("cargo build --locked");
1193
+ }
1194
+ if (sourceSignals.swift) addSwiftCommands(root, manifests, verification);
1195
+ if (sourceSignals.dart) addDartCommands(root, manifests, verification);
1196
+ addJvmQualityCommands(root, manifests, verification);
1197
+ if (manifests.gradle) {
1198
+ verification.test.push(`${wrapperCommand(root, "gradlew", "gradlew.bat", "gradle")} test`);
1199
+ } else if (manifests.pomXml) {
1200
+ verification.test.push(`${wrapperCommand(root, "mvnw", "mvnw.cmd", "mvn")} test`);
1201
+ }
1202
+ addDotnetCommands(root, manifests, verification);
1203
+ if (sourceSignals.shell) addShellCommands(root, verification);
1204
+ if (sourceSignals.r) addRCommands(manifests, verification);
1205
+ if (sourceSignals.sql) addSqlCommands(manifests, verification);
1206
+ if (sourceSignals.ruby) addRubyCommands(root, manifests, verification);
1207
+ if (sourceSignals.php) addPhpCommands(root, composerScripts, manifests, verification);
1208
+ addResolverOwnedBiomeLintCommand(root, manifests, verification);
1209
+ const hadSourceLint = verification.lint.length > 0;
1210
+ const hadSourceTest = verification.test.length > 0;
1211
+ const hadSourceBuild = verification.build.length > 0;
1212
+ if (manifests.dockerfile || manifests.terraform || manifests.kubernetesManifests) {
1213
+ for (const command of buildIacLintCommands({
1214
+ dockerfile: manifests.dockerfile,
1215
+ hadolintConfig: manifests.hadolintConfig,
1216
+ terraform: manifests.terraform,
1217
+ tflintConfig: manifests.tflintConfig,
1218
+ kubernetesManifests: manifests.kubernetesManifests
1219
+ })) {
1220
+ verification.lint.push(command);
1221
+ }
1222
+ }
1223
+ if (manifests.justfile || manifests.taskfile) {
1224
+ const runnerDetecteds = [];
1225
+ if (manifests.justfile) {
1226
+ const justTasks = readRunnerTaskNames(root, ["justfile", ".justfile", "Justfile"], "just");
1227
+ if (justTasks.length > 0) {
1228
+ runnerDetecteds.push({ just: true, task: false, availableTasks: justTasks });
1229
+ }
1230
+ }
1231
+ if (manifests.taskfile) {
1232
+ const taskTasks = readRunnerTaskNames(
1233
+ root,
1234
+ [
1235
+ "Taskfile.yml",
1236
+ "Taskfile.yaml",
1237
+ "taskfile.yml",
1238
+ "taskfile.yaml",
1239
+ "Taskfile.dist.yml",
1240
+ "Taskfile.dist.yaml"
1241
+ ],
1242
+ "task"
1243
+ );
1244
+ if (taskTasks.length > 0) {
1245
+ runnerDetecteds.push({ just: false, task: true, availableTasks: taskTasks });
1246
+ }
1247
+ }
1248
+ if (!hadSourceTest) {
1249
+ for (const runnerDetected of runnerDetecteds) {
1250
+ for (const command of buildRunnerCommands(runnerDetected, "test")) {
1251
+ verification.test.push(command);
1252
+ }
1253
+ }
1254
+ }
1255
+ if (!hadSourceBuild) {
1256
+ for (const runnerDetected of runnerDetecteds) {
1257
+ for (const command of buildRunnerCommands(runnerDetected, "build")) {
1258
+ verification.build.push(command);
1259
+ }
1260
+ }
1261
+ }
1262
+ if (!hadSourceLint) {
1263
+ let runnerEmittedLint = false;
1264
+ for (const runnerDetected of runnerDetecteds) {
1265
+ const before = verification.lint.length;
1266
+ for (const command of buildRunnerCommands(runnerDetected, "lint")) {
1267
+ verification.lint.push(command);
1268
+ }
1269
+ if (verification.lint.length > before) runnerEmittedLint = true;
1270
+ }
1271
+ if (!runnerEmittedLint) {
1272
+ for (const runnerDetected of runnerDetecteds) {
1273
+ for (const kind of ["check", "verify"]) {
1274
+ const beforeKind = verification.lint.length;
1275
+ for (const command of buildRunnerCommands(runnerDetected, kind)) {
1276
+ verification.lint.push(command);
1277
+ }
1278
+ if (verification.lint.length > beforeKind) {
1279
+ runnerEmittedLint = true;
1280
+ break;
1281
+ }
1282
+ }
1283
+ if (runnerEmittedLint) break;
1284
+ }
1285
+ }
1286
+ }
1287
+ }
1288
+ if (sourceSignals.powershell) {
1289
+ const powershell = buildPowerShellCommands({
1290
+ pesterConfig: manifests.pesterConfig,
1291
+ scriptAnalyzerConfig: manifests.scriptAnalyzerConfig,
1292
+ hasPowerShellSources: sourceSignals.powershell
1293
+ });
1294
+ for (const command of powershell.test) verification.test.push(command);
1295
+ for (const command of powershell.lint) verification.lint.push(command);
1296
+ }
1297
+ const auditCommands = [];
1298
+ const coverageCommands = [];
1299
+ addAuditCommands(root, manifests, sourceSignals, auditCommands);
1300
+ addCoverageCommands(root, packageScripts, manifests, sourceSignals, coverageCommands);
1301
+ const mergedVerification = mergeVerificationCommands(
1302
+ {
1303
+ format: unique(verification.format),
1304
+ build: unique(verification.build),
1305
+ typecheck: unique(verification.typecheck),
1306
+ lint: unique(verification.lint),
1307
+ test: unique(verification.test),
1308
+ testFallback: unique(verification.testFallback),
1309
+ audit: unique(auditCommands),
1310
+ coverage: unique(coverageCommands)
1311
+ },
1312
+ readVerificationOverrides(root)
1313
+ );
1314
+ const detectedLanguages = Array.from(languages);
1315
+ return {
1316
+ root,
1317
+ languages: detectedLanguages,
1318
+ manifests,
1319
+ packageScripts,
1320
+ composerScripts,
1321
+ verification: mergedVerification,
1322
+ docsOnly: detectDocsOnly(root, detectedLanguages)
1323
+ };
1324
+ }
1325
+ function hasProjectLanguage(capabilities, language) {
1326
+ return capabilities.languages.includes(language);
1327
+ }
1328
+
1329
+ export {
1330
+ isNonPackageStaticLintCommand,
1331
+ isIacStaticCommand,
1332
+ isIacProjectPath,
1333
+ isPowerShellStaticCommand,
1334
+ PROJECT_LANGUAGES,
1335
+ PROJECT_IGNORED_DIRECTORIES,
1336
+ isIgnoredProjectPath,
1337
+ detectPackageManager,
1338
+ buildPackageScriptCommand,
1339
+ detectProjectCapabilities,
1340
+ hasProjectLanguage
1341
+ };
1342
+ //# sourceMappingURL=chunk-FHOWVDF5.js.map