@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.
- package/.github/SECURITY.md +47 -0
- package/.nvmrc +1 -0
- package/.poetic/README.md +37 -0
- package/.poetic/providers/catalog.json +12051 -0
- package/.poetic/providers/pricing.json +1272 -0
- package/.poetic/providers/registry.json +3369 -0
- package/CHANGELOG.md +552 -0
- package/CODE_OF_CONDUCT.md +40 -0
- package/CONTRIBUTING.md +23 -0
- package/INSTALL.md +454 -0
- package/LICENSE +21 -0
- package/README.md +474 -0
- package/dist/BasicOptimizationCompetitionRunner-5H5TBYO4.js +153 -0
- package/dist/ExecutionTracker-UVONC4C6.js +16 -0
- package/dist/OptimizationConfig-7DFY2TST.js +17 -0
- package/dist/OptimizationEngine-JIMGP3LY.js +1597 -0
- package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
- package/dist/actions-LUJPINLJ.js +322 -0
- package/dist/agent-ingest-3DJUJ7FU.js +53 -0
- package/dist/aggregator-DNCBINFO.js +12 -0
- package/dist/ai-judge-5QT5QJVU.js +156 -0
- package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
- package/dist/allowlist-utils-23V7TJ3G.js +28 -0
- package/dist/anchored-turn-service-JULUCUIK.js +489 -0
- package/dist/api-transport-4TYTNLTJ.js +1087 -0
- package/dist/apply-completion-mode-AW2MOS3R.js +89 -0
- package/dist/artifact-migrator-23L45ISD.js +267 -0
- package/dist/ask-HWVV6QFR.js +135 -0
- package/dist/auth-5KEDKAPP.js +67 -0
- package/dist/auth-7TT3JINV.js +78 -0
- package/dist/auth-E6XUNZ5M.js +68 -0
- package/dist/auth-H3XDZE22.js +134 -0
- package/dist/auth-OC4E6633.js +71 -0
- package/dist/auth-S4CTX4GQ.js +44 -0
- package/dist/auth-YLH3S7EY.js +69 -0
- package/dist/auth-liveness-TDDEZY3T.js +46 -0
- package/dist/auto-optimizer-VPRWOWGU.js +80 -0
- package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
- package/dist/autoloop-evidence-gates-PCDALGVJ.js +38 -0
- package/dist/autoloop-gate-policy-Z7FVJVXV.js +175 -0
- package/dist/autoloop-helpers-2KTK43GL.js +22 -0
- package/dist/autoloop-ledger-W7QO62PX.js +96 -0
- package/dist/autoloop-ledger-subscriber-Z5RW5EIE.js +162 -0
- package/dist/autoloop-run-defaults-FERGRZGP.js +19 -0
- package/dist/autoloop-run-lock-CT2NWSV3.js +197 -0
- package/dist/autoloop-success-J2VKKBXQ.js +85 -0
- package/dist/autoloop-termination-summary-RN75F422.js +58 -0
- package/dist/autoloop-trajectory-XFIEXP5Z.js +282 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/autonomous-loop-controller-PW4XVFGQ.js +4120 -0
- package/dist/backend-P3DAYRP7.js +29 -0
- package/dist/background-executor-CBN552V4.js +257 -0
- package/dist/backlog-execution-intent-U4XYPTV6.js +15 -0
- package/dist/backup-active-store-5WXG6SXT.js +17 -0
- package/dist/backup-telemetry-db-XGLXAA3N.js +254 -0
- package/dist/basic-competition-master-VCSBJVRN.js +344 -0
- package/dist/branch-archive-manager-RP6FP3ZC.js +254 -0
- package/dist/branch-cleanup-manager-RSHAI7YR.js +20 -0
- package/dist/build-gate-YHGRB4QB.js +71 -0
- package/dist/change-summary-WY7J5TOX.js +33 -0
- package/dist/chunk-23A26CSN.js +123 -0
- package/dist/chunk-27UTJD3M.js +265 -0
- package/dist/chunk-2A5CILN3.js +310 -0
- package/dist/chunk-2AQUWJPW.js +225 -0
- package/dist/chunk-2BZ53J6J.js +2344 -0
- package/dist/chunk-2DY5KNVM.js +276 -0
- package/dist/chunk-2EIA4RBE.js +659 -0
- package/dist/chunk-2IUXIGQD.js +1064 -0
- package/dist/chunk-2N42MS2Z.js +2193 -0
- package/dist/chunk-2QJ3H3L7.js +42 -0
- package/dist/chunk-2QLYTVYX.js +791 -0
- package/dist/chunk-2VSQMRCB.js +18 -0
- package/dist/chunk-2XQXYBM2.js +130 -0
- package/dist/chunk-2YFUIER7.js +426 -0
- package/dist/chunk-34CNP2HB.js +148 -0
- package/dist/chunk-35P3W3JX.js +456 -0
- package/dist/chunk-36PEBZAF.js +18 -0
- package/dist/chunk-3AOKYKA7.js +22 -0
- package/dist/chunk-3BCUNHKF.js +475 -0
- package/dist/chunk-3FLXLLB7.js +26 -0
- package/dist/chunk-3FOZ2VHV.js +100 -0
- package/dist/chunk-3G6FZCRF.js +106 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3S62LLWJ.js +543 -0
- package/dist/chunk-3ZPQLGV7.js +2904 -0
- package/dist/chunk-44N5WZZH.js +45 -0
- package/dist/chunk-45FPSA3B.js +125 -0
- package/dist/chunk-4BJ3O4RQ.js +929 -0
- package/dist/chunk-4BOP7T6L.js +2321 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4CSS7WVI.js +143 -0
- package/dist/chunk-4CUY7AFY.js +247 -0
- package/dist/chunk-4GSN5O5J.js +62 -0
- package/dist/chunk-4HN6DF7V.js +1027 -0
- package/dist/chunk-4IAPOG5V.js +415 -0
- package/dist/chunk-4IYIZQWV.js +48 -0
- package/dist/chunk-4NXPXE62.js +84 -0
- package/dist/chunk-4RCCF5BR.js +712 -0
- package/dist/chunk-4V7NAQ4R.js +19527 -0
- package/dist/chunk-4VJITV4P.js +445 -0
- package/dist/chunk-4YX7J6QL.js +1859 -0
- package/dist/chunk-527OBWQB.js +338 -0
- package/dist/chunk-5D4A7E3D.js +448 -0
- package/dist/chunk-5DLKYTQX.js +4003 -0
- package/dist/chunk-5EERLVZB.js +139 -0
- package/dist/chunk-5H72XE4H.js +256 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5LAMRH4X.js +969 -0
- package/dist/chunk-5LTN43AS.js +1972 -0
- package/dist/chunk-5RBHQYDB.js +2206 -0
- package/dist/chunk-5WCQRDRB.js +588 -0
- package/dist/chunk-5WRLK5KW.js +700 -0
- package/dist/chunk-5ZCXC23G.js +595 -0
- package/dist/chunk-6BM72ZMG.js +31 -0
- package/dist/chunk-6EDAJH2I.js +68 -0
- package/dist/chunk-6EQKFDBH.js +457 -0
- package/dist/chunk-6MFRHTRI.js +115 -0
- package/dist/chunk-6TZJRKNW.js +321 -0
- package/dist/chunk-6V7HGQFZ.js +20 -0
- package/dist/chunk-6VWVO2TU.js +3746 -0
- package/dist/chunk-6Y5TWI7H.js +146 -0
- package/dist/chunk-6Y5U7UFY.js +91 -0
- package/dist/chunk-6ZLAK3XG.js +14 -0
- package/dist/chunk-72XCRQED.js +34 -0
- package/dist/chunk-72YTZMAM.js +589 -0
- package/dist/chunk-73BBJOKA.js +263 -0
- package/dist/chunk-73NCTWKL.js +188 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DHRDWFS.js +3104 -0
- package/dist/chunk-7DNSNKJV.js +78 -0
- package/dist/chunk-7FMJVYBS.js +307 -0
- package/dist/chunk-7GDRQBQC.js +419 -0
- package/dist/chunk-7GPCEFUV.js +270 -0
- package/dist/chunk-7IL4A2PP.js +948 -0
- package/dist/chunk-7MMLMXO6.js +3679 -0
- package/dist/chunk-7QCZSLBH.js +1 -0
- package/dist/chunk-7R2WLDOS.js +62 -0
- package/dist/chunk-7T7RUJI7.js +949 -0
- package/dist/chunk-A2WKSVX7.js +43 -0
- package/dist/chunk-A3YGID55.js +133 -0
- package/dist/chunk-A722DEVA.js +14 -0
- package/dist/chunk-ACDIT7OP.js +1376 -0
- package/dist/chunk-ACKIPAOJ.js +302 -0
- package/dist/chunk-APPNGGN7.js +365 -0
- package/dist/chunk-APV6MK5E.js +137 -0
- package/dist/chunk-ASEP3M2W.js +968 -0
- package/dist/chunk-AT4TNPWW.js +2931 -0
- package/dist/chunk-ATVKCSGT.js +250 -0
- package/dist/chunk-AURFMVCD.js +899 -0
- package/dist/chunk-AX6GWE7V.js +47 -0
- package/dist/chunk-AY5EWJPF.js +385 -0
- package/dist/chunk-BAV2HJXS.js +194 -0
- package/dist/chunk-BBHRN366.js +89 -0
- package/dist/chunk-BBPSTTPA.js +1004 -0
- package/dist/chunk-BDATUDDJ.js +992 -0
- package/dist/chunk-BKE5PG5L.js +20414 -0
- package/dist/chunk-BLPHWMDK.js +797 -0
- package/dist/chunk-BSE4R6XD.js +322 -0
- package/dist/chunk-BXGMAU4A.js +396 -0
- package/dist/chunk-BXI4NXL3.js +507 -0
- package/dist/chunk-BZU2O43F.js +1125 -0
- package/dist/chunk-C3L6YQ7P.js +147 -0
- package/dist/chunk-C57KJOUQ.js +121 -0
- package/dist/chunk-CCV7BPSY.js +118 -0
- package/dist/chunk-CD7ISXA4.js +826 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFBIG37O.js +154 -0
- package/dist/chunk-CJC6GZ46.js +457 -0
- package/dist/chunk-CKCDGXIV.js +408 -0
- package/dist/chunk-CKNX3TTP.js +10338 -0
- package/dist/chunk-CLKSETWE.js +10 -0
- package/dist/chunk-CP7H3HSP.js +1552 -0
- package/dist/chunk-CPLEWXNZ.js +66 -0
- package/dist/chunk-CQM3A35X.js +844 -0
- package/dist/chunk-CS6P76D3.js +103 -0
- package/dist/chunk-CTLUBNCW.js +622 -0
- package/dist/chunk-CUSRN6RJ.js +632 -0
- package/dist/chunk-D5EP5D2W.js +26 -0
- package/dist/chunk-D5RYINO7.js +412 -0
- package/dist/chunk-DBFS4HMH.js +751 -0
- package/dist/chunk-DC4ZYMXJ.js +115 -0
- package/dist/chunk-DCBZP442.js +9243 -0
- package/dist/chunk-DCYF7EKG.js +26 -0
- package/dist/chunk-DDMAFNUK.js +5351 -0
- package/dist/chunk-DF5SLDE4.js +966 -0
- package/dist/chunk-DJFW7SMX.js +348 -0
- package/dist/chunk-DQFLLBJW.js +121 -0
- package/dist/chunk-DSFM56OA.js +1203 -0
- package/dist/chunk-DTY4APYV.js +218 -0
- package/dist/chunk-DXH5JBRS.js +437 -0
- package/dist/chunk-E3NTPHEO.js +194 -0
- package/dist/chunk-E74LUIID.js +302 -0
- package/dist/chunk-EI57M5BI.js +194 -0
- package/dist/chunk-EJ4ZAWLV.js +305 -0
- package/dist/chunk-EJGCZGUF.js +1483 -0
- package/dist/chunk-EK2U3YEG.js +486 -0
- package/dist/chunk-ELMFYNV7.js +109 -0
- package/dist/chunk-ENRGKNR5.js +25 -0
- package/dist/chunk-ETYDXCK7.js +679 -0
- package/dist/chunk-EYRH3W74.js +239 -0
- package/dist/chunk-F23DIWNN.js +1024 -0
- package/dist/chunk-F5JO7HAS.js +94 -0
- package/dist/chunk-F7ER6ANO.js +174 -0
- package/dist/chunk-FATUVIIN.js +374 -0
- package/dist/chunk-FC23CTXV.js +322 -0
- package/dist/chunk-FD4ERYEG.js +22 -0
- package/dist/chunk-FH7WOJAE.js +79 -0
- package/dist/chunk-FHOWVDF5.js +1342 -0
- package/dist/chunk-FKAUPHMR.js +96 -0
- package/dist/chunk-FONNFJXA.js +137 -0
- package/dist/chunk-FQ7FSZRW.js +75 -0
- package/dist/chunk-FRG57FPM.js +240 -0
- package/dist/chunk-FUVP64ER.js +31 -0
- package/dist/chunk-FYOILAN5.js +6818 -0
- package/dist/chunk-G35UYQ6Z.js +69 -0
- package/dist/chunk-G36W2T2S.js +1143 -0
- package/dist/chunk-G3L2L5XZ.js +49 -0
- package/dist/chunk-G4THLFV3.js +148 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GFGYB2ZU.js +1689 -0
- package/dist/chunk-GG6KJYW6.js +85 -0
- package/dist/chunk-GHHFDU2U.js +55 -0
- package/dist/chunk-GHTZSQB7.js +57 -0
- package/dist/chunk-GK37ILCX.js +1231 -0
- package/dist/chunk-GKN3HMN4.js +2809 -0
- package/dist/chunk-GNVDBVJP.js +156 -0
- package/dist/chunk-GPEL3FBM.js +924 -0
- package/dist/chunk-GPSNGPZS.js +1604 -0
- package/dist/chunk-GSGD5E4C.js +30 -0
- package/dist/chunk-GSUQJJXQ.js +331 -0
- package/dist/chunk-GSV226X6.js +110 -0
- package/dist/chunk-H2AYQIHW.js +224 -0
- package/dist/chunk-H66DXFS5.js +1374 -0
- package/dist/chunk-H6G7QRMQ.js +35 -0
- package/dist/chunk-H7JAGHZT.js +59 -0
- package/dist/chunk-H7ZEFECA.js +316 -0
- package/dist/chunk-HAC6EHZZ.js +79 -0
- package/dist/chunk-HIO33P3G.js +19 -0
- package/dist/chunk-HMVQIPH3.js +547 -0
- package/dist/chunk-HOYBYAOA.js +257 -0
- package/dist/chunk-HX5P3CSP.js +1784 -0
- package/dist/chunk-I46EG2XQ.js +65 -0
- package/dist/chunk-I4NPDSCB.js +279 -0
- package/dist/chunk-I5WRT7ZR.js +514 -0
- package/dist/chunk-IC7I6YIJ.js +301 -0
- package/dist/chunk-IDCSOZVN.js +78 -0
- package/dist/chunk-IFCBYECK.js +112 -0
- package/dist/chunk-IFZCPEY2.js +66 -0
- package/dist/chunk-IKFP2KUR.js +48 -0
- package/dist/chunk-IRFBN336.js +878 -0
- package/dist/chunk-IUXNGKA6.js +152 -0
- package/dist/chunk-IV2RVAN7.js +1356 -0
- package/dist/chunk-IZYIQQ7X.js +53 -0
- package/dist/chunk-J3UUR7DE.js +210 -0
- package/dist/chunk-J54VUAY2.js +566 -0
- package/dist/chunk-J62KPGII.js +464 -0
- package/dist/chunk-J6P3FWWW.js +130 -0
- package/dist/chunk-JKBHJQMT.js +434 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JOSYEJKY.js +141 -0
- package/dist/chunk-JPKSXKNB.js +94 -0
- package/dist/chunk-JQNJB2BB.js +2440 -0
- package/dist/chunk-JRVNSWSQ.js +2626 -0
- package/dist/chunk-JSWMRQYG.js +28 -0
- package/dist/chunk-JZKNBBIB.js +152 -0
- package/dist/chunk-K54Y7MLK.js +160 -0
- package/dist/chunk-K65546RE.js +183 -0
- package/dist/chunk-KM3F7SYE.js +702 -0
- package/dist/chunk-KNDYMVWN.js +102 -0
- package/dist/chunk-KNT72VR6.js +132 -0
- package/dist/chunk-KP6YILMU.js +482 -0
- package/dist/chunk-KQEBSK3T.js +274 -0
- package/dist/chunk-KT6VHSPF.js +84 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KZ5CJVBP.js +1813 -0
- package/dist/chunk-L4427KOE.js +26 -0
- package/dist/chunk-L6OM4A22.js +189 -0
- package/dist/chunk-L7E6XCRA.js +1042 -0
- package/dist/chunk-L7JZLXQL.js +173 -0
- package/dist/chunk-LAMKBTXX.js +40 -0
- package/dist/chunk-LDCF2MKN.js +132 -0
- package/dist/chunk-LEIIWPWQ.js +78 -0
- package/dist/chunk-LFTQVYBB.js +31 -0
- package/dist/chunk-LG3PDRTR.js +2872 -0
- package/dist/chunk-LGHII5ET.js +23 -0
- package/dist/chunk-LH5QY22X.js +1205 -0
- package/dist/chunk-LIVJ6266.js +438 -0
- package/dist/chunk-LKRAR3IH.js +276 -0
- package/dist/chunk-LO23NABI.js +3063 -0
- package/dist/chunk-LO3X5NLS.js +326 -0
- package/dist/chunk-LPITVM7M.js +339 -0
- package/dist/chunk-LR5IJIGV.js +810 -0
- package/dist/chunk-LRGMHROI.js +79 -0
- package/dist/chunk-LUVKFFWR.js +315 -0
- package/dist/chunk-LWCBNGH6.js +35 -0
- package/dist/chunk-LWTN3WRV.js +260 -0
- package/dist/chunk-M3HQYKQX.js +308 -0
- package/dist/chunk-M6GVSPEH.js +1016 -0
- package/dist/chunk-MF5HP6XV.js +221 -0
- package/dist/chunk-MHLCBZJB.js +328 -0
- package/dist/chunk-MN6PL4AN.js +120 -0
- package/dist/chunk-MOEY65Z6.js +5678 -0
- package/dist/chunk-MQ4WA34C.js +206 -0
- package/dist/chunk-MWHF5V7U.js +223 -0
- package/dist/chunk-MWHLBPNU.js +211 -0
- package/dist/chunk-MWK5UZQ3.js +1068 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N4VTRA7K.js +131 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-N65O4XTH.js +5011 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NGK6PEOG.js +25 -0
- package/dist/chunk-NJVD4PWE.js +1033 -0
- package/dist/chunk-NM6PMYY4.js +768 -0
- package/dist/chunk-NN4PJDHP.js +708 -0
- package/dist/chunk-NP2V3L7K.js +226 -0
- package/dist/chunk-NRLY536M.js +260 -0
- package/dist/chunk-NRNE225N.js +1270 -0
- package/dist/chunk-NS2K2GTP.js +605 -0
- package/dist/chunk-NS33V3IM.js +51 -0
- package/dist/chunk-NSHASMZZ.js +71 -0
- package/dist/chunk-NWOYOA6H.js +378 -0
- package/dist/chunk-NWRUSEXG.js +322 -0
- package/dist/chunk-NZGDAWIP.js +1905 -0
- package/dist/chunk-O47UOKU3.js +395 -0
- package/dist/chunk-O4G2W3ST.js +9831 -0
- package/dist/chunk-O6V4PNLO.js +63 -0
- package/dist/chunk-OA4GPILI.js +624 -0
- package/dist/chunk-OGMSYL6J.js +227 -0
- package/dist/chunk-OIS7J26S.js +319 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ON3G73BU.js +264 -0
- package/dist/chunk-OPYFYTWQ.js +220 -0
- package/dist/chunk-OQ6K46CK.js +1734 -0
- package/dist/chunk-OYZYO7TV.js +47 -0
- package/dist/chunk-OZ4REHIN.js +4386 -0
- package/dist/chunk-P47VN5F4.js +282 -0
- package/dist/chunk-P5I4X7A7.js +353 -0
- package/dist/chunk-P6VQROCO.js +594 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-PCAGC5MR.js +1763 -0
- package/dist/chunk-PFTQBXS6.js +5181 -0
- package/dist/chunk-PGSPX4SU.js +15 -0
- package/dist/chunk-PIKLF7BM.js +432 -0
- package/dist/chunk-PJWJ3SAV.js +22 -0
- package/dist/chunk-PKIFMV72.js +100 -0
- package/dist/chunk-PL37JDNA.js +189 -0
- package/dist/chunk-PTH5E5XO.js +195 -0
- package/dist/chunk-PW6AXLQC.js +4128 -0
- package/dist/chunk-PYITM4N2.js +79 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3RO7N35.js +45 -0
- package/dist/chunk-Q3WIC6GQ.js +2670 -0
- package/dist/chunk-Q5XIXSHX.js +271 -0
- package/dist/chunk-QGJDMEOV.js +34 -0
- package/dist/chunk-QNOB37UH.js +58 -0
- package/dist/chunk-QOCOVLUH.js +462 -0
- package/dist/chunk-QTCJ5CC5.js +172 -0
- package/dist/chunk-QVFV5IP2.js +232 -0
- package/dist/chunk-QVZMFDYG.js +29 -0
- package/dist/chunk-R35PEUKH.js +511 -0
- package/dist/chunk-R4UWBC35.js +200 -0
- package/dist/chunk-R6MLCREW.js +44 -0
- package/dist/chunk-R6W23LKN.js +254 -0
- package/dist/chunk-R7XDDX2A.js +4007 -0
- package/dist/chunk-RDFRCT64.js +168 -0
- package/dist/chunk-RE5VZDFQ.js +58 -0
- package/dist/chunk-RGROYC2G.js +638 -0
- package/dist/chunk-RGWHUI5E.js +68 -0
- package/dist/chunk-RHVG6UNL.js +205 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RJAAKDRX.js +17 -0
- package/dist/chunk-ROMHOSMQ.js +185 -0
- package/dist/chunk-RWREC3KJ.js +517 -0
- package/dist/chunk-RYNETRDJ.js +118 -0
- package/dist/chunk-RZY7RKM5.js +500 -0
- package/dist/chunk-S2MNWFAG.js +52 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S54MKU6V.js +117 -0
- package/dist/chunk-S5OIDFRM.js +302 -0
- package/dist/chunk-SCW4ZF6R.js +150 -0
- package/dist/chunk-SLS2N4PH.js +2213 -0
- package/dist/chunk-SNLBO4BF.js +247 -0
- package/dist/chunk-SP3LFU6B.js +60 -0
- package/dist/chunk-SQQTDDQA.js +537 -0
- package/dist/chunk-STV6LYYE.js +45 -0
- package/dist/chunk-SURZ2WFE.js +326 -0
- package/dist/chunk-SZ7DL357.js +1047 -0
- package/dist/chunk-T5E4NQCM.js +5742 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TAOOYK3P.js +358 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TFTGP7Z7.js +174 -0
- package/dist/chunk-TGON4N4O.js +197 -0
- package/dist/chunk-TGQZHDY2.js +2373 -0
- package/dist/chunk-TJJZ2OKV.js +6783 -0
- package/dist/chunk-TRSVUPCX.js +25 -0
- package/dist/chunk-TSXGRLPR.js +107 -0
- package/dist/chunk-U2S3YEX3.js +224 -0
- package/dist/chunk-U45RTRGY.js +818 -0
- package/dist/chunk-U6C3VVWS.js +13 -0
- package/dist/chunk-UDMS5AD3.js +307 -0
- package/dist/chunk-UGX7GI37.js +94 -0
- package/dist/chunk-UH3JJSHK.js +1 -0
- package/dist/chunk-UHRBTZYY.js +208 -0
- package/dist/chunk-UHT2KRG5.js +193 -0
- package/dist/chunk-UI2F6DJ5.js +118 -0
- package/dist/chunk-UMAKSB4Z.js +284 -0
- package/dist/chunk-UR2IBGIM.js +521 -0
- package/dist/chunk-UUH2RVKS.js +585 -0
- package/dist/chunk-UVJ4PJDK.js +4533 -0
- package/dist/chunk-V53UG2OT.js +9924 -0
- package/dist/chunk-V72RMBM4.js +48 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VNSYKC25.js +24 -0
- package/dist/chunk-VPHVFK4A.js +1984 -0
- package/dist/chunk-VTLNJQ44.js +133 -0
- package/dist/chunk-VTW7HP3R.js +100 -0
- package/dist/chunk-VVGEPBPS.js +218 -0
- package/dist/chunk-VVLLL7I4.js +166 -0
- package/dist/chunk-VX3UMWB7.js +483 -0
- package/dist/chunk-VXF4Q3FW.js +20 -0
- package/dist/chunk-W3JMT2YY.js +712 -0
- package/dist/chunk-WDUORIHF.js +877 -0
- package/dist/chunk-WDVTY4U6.js +148 -0
- package/dist/chunk-WIFZCHEG.js +12566 -0
- package/dist/chunk-WIRN3F75.js +736 -0
- package/dist/chunk-WMPU2UOV.js +82 -0
- package/dist/chunk-WTOKKE2V.js +784 -0
- package/dist/chunk-WX5IRLF6.js +740 -0
- package/dist/chunk-WZ6U3O7I.js +1581 -0
- package/dist/chunk-XAONGNST.js +57 -0
- package/dist/chunk-XB5YLCLB.js +13 -0
- package/dist/chunk-XEP5NQ5Y.js +688 -0
- package/dist/chunk-XGYF2QMZ.js +351 -0
- package/dist/chunk-XHEKQENB.js +255 -0
- package/dist/chunk-XNO4FM6X.js +1124 -0
- package/dist/chunk-XPHKYHO4.js +878 -0
- package/dist/chunk-XPK2I4NC.js +405 -0
- package/dist/chunk-XPU2XADL.js +2175 -0
- package/dist/chunk-XQD2B6BB.js +507 -0
- package/dist/chunk-XT2ZQVTC.js +558 -0
- package/dist/chunk-XTXJGGUV.js +351 -0
- package/dist/chunk-XUXVDPSZ.js +50 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XZE4XARH.js +563 -0
- package/dist/chunk-XZYR5EDO.js +152 -0
- package/dist/chunk-Y3J4JMTU.js +61 -0
- package/dist/chunk-Y55LZN5U.js +52 -0
- package/dist/chunk-Y5VN7DMP.js +112 -0
- package/dist/chunk-Y67VAHN4.js +459 -0
- package/dist/chunk-YAXSKEUH.js +3544 -0
- package/dist/chunk-YB3JD4E6.js +975 -0
- package/dist/chunk-YESZJFK6.js +220 -0
- package/dist/chunk-YGXKOBQQ.js +292 -0
- package/dist/chunk-YMX76IOS.js +31 -0
- package/dist/chunk-YOTXESEH.js +257 -0
- package/dist/chunk-YTYIEZQY.js +119 -0
- package/dist/chunk-YVORHQ2S.js +579 -0
- package/dist/chunk-Z2CUQDAR.js +3429 -0
- package/dist/chunk-Z2KYOFHS.js +7000 -0
- package/dist/chunk-Z6PC7QX6.js +161 -0
- package/dist/chunk-ZDTGECTN.js +235 -0
- package/dist/chunk-ZIPWI2LY.js +151 -0
- package/dist/chunk-ZSKKMTQJ.js +554 -0
- package/dist/chunk-ZTT5IVPY.js +1160 -0
- package/dist/chunk-ZX65UI5W.js +78 -0
- package/dist/chunk-ZYG7GGKO.js +218 -0
- package/dist/chunk-ZZZUL4OF.js +38 -0
- package/dist/cli-utils-IXL26KJT.js +40 -0
- package/dist/cli-validation-WLXWLUJL.js +111 -0
- package/dist/commit-utils-P7CRJF5N.js +202 -0
- package/dist/compete-config-resolver-R5ULXMYH.js +76 -0
- package/dist/compete-request-62JESVET.js +364 -0
- package/dist/compete-results-QEPG6FZX.js +208 -0
- package/dist/competition-outcome-tracker-R32OOZ43.js +38 -0
- package/dist/config-JCOKXOQT.js +166 -0
- package/dist/config-audit-EL3GHXS7.js +360 -0
- package/dist/config-explain-TNILDEVJ.js +12 -0
- package/dist/config-loader-VPFPFO4B.js +38 -0
- package/dist/config-manager-7T4E2BQO.js +67 -0
- package/dist/config-validator-KKOHOW7O.js +72 -0
- package/dist/cost-YC42XUF3.js +53 -0
- package/dist/coverage-orchestrator-CISNKJC2.js +772 -0
- package/dist/coverage-scanner-YVD62MLH.js +12 -0
- package/dist/createCompetitionRunner-LJG6ZQSO.js +46 -0
- package/dist/data-migration-state-VJK64DLT.js +31 -0
- package/dist/db-migrator-XSEIOGWY.js +34 -0
- package/dist/discovery-JGYGDD25.js +25 -0
- package/dist/doctor-GJOYE7AE.js +186 -0
- package/dist/domain-analyzer-AWF3RP6E.js +29 -0
- package/dist/ensure-initialized-744DIZEZ.js +52 -0
- package/dist/entry.js +940 -0
- package/dist/environment-YS45U5ZI.js +81 -0
- package/dist/error-parser-core-PPZ36A4S.js +50 -0
- package/dist/escalation-ladder-MKTCEGSA.js +130 -0
- package/dist/evaluation-context-KV4GZNN7.js +35 -0
- package/dist/evidence-plan-resolver-GBSYSAPX.js +85 -0
- package/dist/execution-data-writer-3ODTBDLH.js +53 -0
- package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
- package/dist/execution-preflight-Z4Y64V3I.js +209 -0
- package/dist/execution-roles-R3DPPMD3.js +66 -0
- package/dist/exit-code-error-Z4SW2DVK.js +14 -0
- package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
- package/dist/factory-XBN7DFIM.js +149 -0
- package/dist/file-utils-XIVR2ZMA.js +47 -0
- package/dist/flywheel-autoloop-executor-UILGOFFK.js +249 -0
- package/dist/flywheel-competition-executor-JOBEXTRB.js +259 -0
- package/dist/flywheel-executor-6JFLA6J5.js +369 -0
- package/dist/flywheel-git-isolation-UC5NIEVU.js +48 -0
- package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
- package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
- package/dist/flywheel-preflight-XEY5SHM6.js +104 -0
- package/dist/flywheel-resume-7HELH7QS.js +23 -0
- package/dist/flywheel-safety-7U7DPOAP.js +28 -0
- package/dist/flywheel-scope-decision-ZHKF6ZIN.js +11 -0
- package/dist/get-telemetry-logger-DPVWWIYY.js +73 -0
- package/dist/git-worktree-IY6V6DUO.js +18 -0
- package/dist/github-pr-manager-4LXEKJTA.js +211 -0
- package/dist/guidance-profile-config-E7XJL2VP.js +117 -0
- package/dist/guidance-profile-renderer-QK2YMAAP.js +21 -0
- package/dist/index-query-4JEUKA44.js +31 -0
- package/dist/index.js +108661 -0
- package/dist/instructions-6BURLQJC.js +64 -0
- package/dist/invoke-provider-auth-GRUYP44M.js +223 -0
- package/dist/judge-scoring.json +80 -0
- package/dist/judge-test.js +555 -0
- package/dist/lab-mode-OTWVHN63.js +39 -0
- package/dist/lab-utils-BJRFLGK4.js +23 -0
- package/dist/linux-host-class-UY4KVLFD.js +29 -0
- package/dist/llm-judge-executor-F7Z3HO77.js +133 -0
- package/dist/local-executor-CEHWE2PL.js +223 -0
- package/dist/logger-33TR6EE5.js +72 -0
- package/dist/loop-spec-XTLQAVZ7.js +191 -0
- package/dist/manager-2HJG5CLT.js +25 -0
- package/dist/matrix-prompt-builder-6UDN5X3F.js +497 -0
- package/dist/matrix-result-parser-7W35EUOV.js +15 -0
- package/dist/metadata-HQ43NDEK.js +22 -0
- package/dist/model-invocations-db-QBO4Y7WZ.js +38 -0
- package/dist/monitor-XGYBG2DW.js +72 -0
- package/dist/next-PB5ZXZKB.js +90 -0
- package/dist/next-ZBDK725T.js +69 -0
- package/dist/optimization-config-resolver-O6WKR47U.js +75 -0
- package/dist/package-3YCWIQQ5.js +10 -0
- package/dist/parallel-orchestrator-NL7YJJU2.js +297 -0
- package/dist/parallel-worker.js +279 -0
- package/dist/parse-git-status-PIAF3OTP.js +10 -0
- package/dist/path-security-ETTH6TZL.js +39 -0
- package/dist/pattern-bank-UNJR5ADV.js +15 -0
- package/dist/plan-backlog-list-fast-VAGYBV3J.js +270 -0
- package/dist/plan-backlog-show-fast-SG2CZPW3.js +406 -0
- package/dist/plan-sprint-list-fast-LURAX47V.js +162 -0
- package/dist/plan-sprint-status-fast-FJAODCHD.js +208 -0
- package/dist/plan-task-status-fast-HNYBMQI4.js +349 -0
- package/dist/plan-to-flywheel-Z4U3GWPN.js +456 -0
- package/dist/planning-backlog-3CQ5QQBQ.js +319 -0
- package/dist/poetic-root-V5DNXEAE.js +17 -0
- package/dist/preflight-OPANWMME.js +12 -0
- package/dist/process-registry-PDZJPTAS.js +27 -0
- package/dist/process-scanner-C22SYXYD.js +22 -0
- package/dist/processes-KMQUD7HY.js +29 -0
- package/dist/processes-json-fast-IBDXZ6WW.js +135 -0
- package/dist/profile-SE5EVXAP.js +149 -0
- package/dist/prompts-WZZPGWBX.js +168 -0
- package/dist/protected-branches-RNTEX7ET.js +57 -0
- package/dist/provider-aware-resource-manager-QBTZJMNP.js +18 -0
- package/dist/provider-matrix-N5X57V3Y.js +154 -0
- package/dist/provider-matrix-renderer-MZDWKKID.js +139 -0
- package/dist/provider-output-forwarding-DERID3TP.js +30 -0
- package/dist/provider-registry-J5NRBJKI.js +128 -0
- package/dist/provider-temp-cleanup-KYGLF6YU.js +14 -0
- package/dist/prune-engine-Q6E2DXBN.js +451 -0
- package/dist/quality-gate-YRHMQAEI.js +70 -0
- package/dist/quickstart-FIRLKGJI.js +62 -0
- package/dist/readiness-VZTMSG6J.js +96 -0
- package/dist/registry-YODFY77A.js +153 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-2IGD4H7X.js +22 -0
- package/dist/resolution-engine-D6TX6FRG.js +127 -0
- package/dist/resolve-provider-cli-O2P6XZBZ.js +35 -0
- package/dist/restore-telemetry-db-BQL6DTQF.js +360 -0
- package/dist/result-streamer-WEHW476R.js +19 -0
- package/dist/routing-events-DHPUZDDF.js +27 -0
- package/dist/routing-history-store-UWCEXAP3.js +46 -0
- package/dist/routing-planner-F5WQEUOM.js +160 -0
- package/dist/run-poetic-tui-J6LWRJUP.js +13517 -0
- package/dist/run-simulation.js +376 -0
- package/dist/runner-CS2TNGHA.js +1092 -0
- package/dist/runner-HHH7ZN2Z.js +1571 -0
- package/dist/safety-OCC4KJJR.js +64 -0
- package/dist/safety-stanza-7SV3HGG3.js +60 -0
- package/dist/sandbox-32QXJEMV.js +81 -0
- package/dist/sandbox-RSO7VP6V.js +94 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-2KI5XNDG.js +17 -0
- package/dist/setup-bb-plugin-QAQWZCV5.js +738 -0
- package/dist/setup-claude-code-P7BTTSPO.js +317 -0
- package/dist/setup-temp-cleanup-GASCWZ2I.js +20 -0
- package/dist/shared-utils-D6U6UREP.js +37 -0
- package/dist/simple-artifact-goal-OTXNGZY6.js +25 -0
- package/dist/sprint-UIXPYOXQ.js +338 -0
- package/dist/sprint-bridge-4BHMSC3M.js +68 -0
- package/dist/sprint-execution-service-2B7WHL5L.js +311 -0
- package/dist/sprint-manager-IDQUDNQI.js +91 -0
- package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
- package/dist/stale-cleanup-orchestrator-XWXV7KCZ.js +62 -0
- package/dist/storage-access-F6ALDN4S.js +22 -0
- package/dist/synthesis-XD6EDVHF.js +185 -0
- package/dist/task-classifier-LNLXSHOM.js +494 -0
- package/dist/task-list-fast-PTMA4LUC.js +147 -0
- package/dist/task-manager-XAT7GOWB.js +93 -0
- package/dist/task-splitter-U7DJ7W6A.js +79 -0
- package/dist/task-type-detector-OLVOMXZO.js +21 -0
- package/dist/task-type-resolver-KKNQYSB4.js +42 -0
- package/dist/telemetry-5HWBBXLX.js +131 -0
- package/dist/telemetry-health-tracker-DMSSGBZ2.js +11 -0
- package/dist/telemetry-path-resolver-7ICSG276.js +28 -0
- package/dist/telemetry-reliability-XUOZNZZ6.js +125 -0
- package/dist/token-estimator-MEQUL3EJ.js +37 -0
- package/dist/transports-KNSSV2V4.js +255 -0
- package/dist/unified-cost-tracker-4TFRBVPR.js +35 -0
- package/dist/unified-state-cleanup-LJPF2BOW.js +276 -0
- package/dist/universal-cost-calculator-BAJV35GA.js +42 -0
- package/dist/user-agents-GHUGCSKN.js +22 -0
- package/dist/variant-delivery-state-KLRNG6XA.js +33 -0
- package/dist/variant-state-cleanup-MZGGLQAJ.js +280 -0
- package/dist/variant-success-PJXWE3ZV.js +12 -0
- package/dist/variant-worker-KUWKBLAH.js +4196 -0
- package/dist/variant-worker.js +24 -0
- package/dist/variants-JE2FSAQS.js +233 -0
- package/dist/verification-toolchains-V24UHW6Q.js +28 -0
- package/dist/verify-commands-H3DTCSGI.js +37 -0
- package/dist/warning-EGQGUUIO.js +12 -0
- package/dist/work-edge-RWEDWJZF.js +49 -0
- package/dist/work-item-writer-WHAVZXAY.js +19 -0
- package/dist/worker-7SA2VS2Y.js +1435 -0
- package/dist/worker.js +19 -0
- package/dist/worktree-metrics-3DFUYVYE.js +26 -0
- package/dist/writeback-VZKHYHSN.js +44 -0
- package/docs/CLI_REFERENCE.md +7042 -0
- package/docs/PROVIDER_SETUP.md +1570 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2232 -0
- package/docs/getting-started/QUICK_START.md +294 -0
- package/docs/getting-started/README.md +188 -0
- package/docs/getting-started/SETUP.md +52 -0
- package/docs/reference/AGENT_CONTEXT.md +38 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/README.md +381 -0
- package/docs/reference/SECURITY.md +262 -0
- package/integrations/bb-plugin-poetic/README.md +362 -0
- package/integrations/bb-plugin-poetic/app.css +341 -0
- package/integrations/bb-plugin-poetic/app.tsx +5059 -0
- package/integrations/bb-plugin-poetic/package.json +45 -0
- package/integrations/bb-plugin-poetic/server.ts +444 -0
- package/integrations/bb-plugin-poetic/src/adapter.ts +3312 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-schema.ts +355 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-service.ts +419 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-view.ts +1026 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-poetic/src/contract.ts +615 -0
- package/integrations/bb-plugin-poetic/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-poetic/src/finalize-schema.ts +158 -0
- package/integrations/bb-plugin-poetic/src/finalize-service.ts +382 -0
- package/integrations/bb-plugin-poetic/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-poetic/src/model.ts +1302 -0
- package/integrations/bb-plugin-poetic/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-poetic/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-poetic/src/planning-readback.ts +204 -0
- package/integrations/bb-plugin-poetic/src/planning-service.ts +594 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace-schema.ts +95 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace.ts +323 -0
- package/integrations/bb-plugin-poetic/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-poetic/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-poetic/src/project-target.ts +45 -0
- package/integrations/bb-plugin-poetic/src/reference-index.ts +192 -0
- package/integrations/bb-plugin-poetic/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-poetic/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-poetic/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-poetic/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-poetic/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-poetic/src/run-page-view.ts +177 -0
- package/integrations/bb-plugin-poetic/src/setup-config-schema.ts +291 -0
- package/integrations/bb-plugin-poetic/src/setup-config-service.ts +590 -0
- package/integrations/bb-plugin-poetic/src/setup-config-view.ts +413 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-schema.ts +136 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-service.ts +341 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-model.ts +714 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-schema.ts +601 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-service.ts +775 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-model.ts +567 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-schema.ts +635 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-poetic/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-poetic/src/task-detail-schema.ts +144 -0
- package/integrations/bb-plugin-poetic/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-poetic/src/workbench-route.ts +74 -0
- package/integrations/bb-plugin-poetic/tests/host-contract.test.ts +773 -0
- package/integrations/bb-plugin-poetic/tsconfig.json +18 -0
- package/integrations/bb-plugin-poetic/types/PROVENANCE.json +52 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk-app.d.ts +1444 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk.d.ts +13030 -0
- package/integrations/bb-plugin-poetic/vitest.host.config.ts +71 -0
- package/npm-shrinkwrap.json +4950 -0
- package/package.json +331 -0
- package/schemas/README.md +80 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +370 -0
- package/schemas/poetic.config.schema.json +2214 -0
- package/schemas/provider-config.schema.json +203 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +140 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/preinstall-node-check.mjs +78 -0
- package/scripts/setup-git-hooks.mjs +24 -0
- package/scripts/sync.sh +2722 -0
- package/scripts/write-node-launcher.sh +108 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.poetic/README.md +37 -0
- package/templates/.poetic/agents/README.md +296 -0
- package/templates/.poetic/agents/api-documenter.md +147 -0
- package/templates/.poetic/agents/backend-architect.md +31 -0
- package/templates/.poetic/agents/code-reviewer.md +157 -0
- package/templates/.poetic/agents/data-scientist.md +179 -0
- package/templates/.poetic/agents/database-optimizer.md +145 -0
- package/templates/.poetic/agents/debugger.md +31 -0
- package/templates/.poetic/agents/deployment-engineer.md +164 -0
- package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
- package/templates/.poetic/agents/frontend-developer.md +150 -0
- package/templates/.poetic/agents/javascript-pro.md +36 -0
- package/templates/.poetic/agents/performance-engineer.md +151 -0
- package/templates/.poetic/agents/python-pro.md +137 -0
- package/templates/.poetic/agents/test-automator.md +147 -0
- package/templates/.poetic/agents/typescript-pro.md +34 -0
- package/templates/.poetic/config/poetic.config.jsonc +69 -0
- package/templates/.poetic/config/project-context.template.json +6 -0
- package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.poetic/config/task-type-aliases.yaml +28 -0
- package/templates/.poetic/gitignore.template +55 -0
- package/templates/.poetic/task-types/analysis.yaml +40 -0
- package/templates/.poetic/task-types/architecture.yaml +38 -0
- package/templates/.poetic/task-types/doc.yaml +35 -0
- package/templates/.poetic/task-types/feature.yaml +23 -0
- package/templates/.poetic/task-types/general.yaml +6 -0
- package/templates/.poetic/task-types/security.yaml +39 -0
- package/templates/AGENTS.template.md +99 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/compete-streak.yaml +78 -0
- package/templates/builtin-workflows/hello-verify.yaml +10 -0
- package/templates/builtin-workflows/judge-regression.yaml +114 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
- package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
- package/templates/guard-kit/check.mjs.template +777 -0
- package/templates/guard-kit/config.json.template +6 -0
- package/templates/guard-kit/poetic-guard.yml.template +189 -0
- package/templates/profiles/README.md +56 -0
- package/templates/profiles/frontier-claude.json +27 -0
- package/templates/profiles/frontier-codex.json +26 -0
|
@@ -0,0 +1,992 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveRepairArtifactPolicy
|
|
3
|
+
} from "./chunk-XHEKQENB.js";
|
|
4
|
+
import {
|
|
5
|
+
aggregateResolverOutcomes,
|
|
6
|
+
classifyResolverCommand
|
|
7
|
+
} from "./chunk-PL37JDNA.js";
|
|
8
|
+
import {
|
|
9
|
+
captureCurrentWorkspaceTreeIdentity
|
|
10
|
+
} from "./chunk-NSHASMZZ.js";
|
|
11
|
+
import {
|
|
12
|
+
FileLockCompromisedError,
|
|
13
|
+
acquireFencedFileLock,
|
|
14
|
+
ensureLockTargetFile
|
|
15
|
+
} from "./chunk-UHT2KRG5.js";
|
|
16
|
+
import {
|
|
17
|
+
isCompeteNonInteractiveEnvironment
|
|
18
|
+
} from "./chunk-A722DEVA.js";
|
|
19
|
+
import {
|
|
20
|
+
parseDiffGitHeaderPaths,
|
|
21
|
+
parseUnifiedDiffPathLine
|
|
22
|
+
} from "./chunk-C3L6YQ7P.js";
|
|
23
|
+
import {
|
|
24
|
+
shouldExcludeFile
|
|
25
|
+
} from "./chunk-NS33V3IM.js";
|
|
26
|
+
import {
|
|
27
|
+
changedFilesRequireVerification,
|
|
28
|
+
resolveVerificationChannelScope
|
|
29
|
+
} from "./chunk-KP6YILMU.js";
|
|
30
|
+
import {
|
|
31
|
+
readArtifactDiffFromManifestPath
|
|
32
|
+
} from "./chunk-XGYF2QMZ.js";
|
|
33
|
+
import {
|
|
34
|
+
runVerificationCommand
|
|
35
|
+
} from "./chunk-D5RYINO7.js";
|
|
36
|
+
import {
|
|
37
|
+
mkPoeticTempDir
|
|
38
|
+
} from "./chunk-C57KJOUQ.js";
|
|
39
|
+
import {
|
|
40
|
+
execGit
|
|
41
|
+
} from "./chunk-KNDYMVWN.js";
|
|
42
|
+
import {
|
|
43
|
+
DEFAULT_TIMEOUT_MS
|
|
44
|
+
} from "./chunk-LAMKBTXX.js";
|
|
45
|
+
import {
|
|
46
|
+
safeRmDir
|
|
47
|
+
} from "./chunk-G4THLFV3.js";
|
|
48
|
+
import {
|
|
49
|
+
POETIC_ALLOW_OFF_SCOPE_REPAIR,
|
|
50
|
+
readEnv
|
|
51
|
+
} from "./chunk-5DLKYTQX.js";
|
|
52
|
+
|
|
53
|
+
// src/core/compete/apply-completion-mode.ts
|
|
54
|
+
import { execFileSync } from "child_process";
|
|
55
|
+
import { existsSync, mkdirSync, writeFileSync } from "fs";
|
|
56
|
+
import { join as join3, posix } from "path";
|
|
57
|
+
|
|
58
|
+
// src/core/git/checkout-mutation-lock.ts
|
|
59
|
+
import * as fs from "fs/promises";
|
|
60
|
+
import * as path from "path";
|
|
61
|
+
var CHECKOUT_MUTATION_LOCK_STALE_MS = 12e4;
|
|
62
|
+
var CHECKOUT_MUTATION_LOCK_RETRIES = 120;
|
|
63
|
+
var CHECKOUT_MUTATION_LOCK_MIN_TIMEOUT_MS = 250;
|
|
64
|
+
var CHECKOUT_MUTATION_LOCK_MAX_TIMEOUT_MS = 2e3;
|
|
65
|
+
var CHECKOUT_MUTATION_LOCK_BACKOFF_FACTOR = 1.5;
|
|
66
|
+
function getCheckoutMutationLockTarget(projectRoot) {
|
|
67
|
+
return path.join(projectRoot, ".poetic", "merge-apply", ".apply.lock");
|
|
68
|
+
}
|
|
69
|
+
async function resolveCheckoutMutationLockRoot(projectRoot) {
|
|
70
|
+
try {
|
|
71
|
+
return await fs.realpath(projectRoot);
|
|
72
|
+
} catch {
|
|
73
|
+
return projectRoot;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function acquireCheckoutMutationLock(projectRoot) {
|
|
77
|
+
const canonicalRoot = await resolveCheckoutMutationLockRoot(projectRoot);
|
|
78
|
+
const lockTarget = getCheckoutMutationLockTarget(canonicalRoot);
|
|
79
|
+
try {
|
|
80
|
+
await fs.mkdir(path.dirname(lockTarget), { recursive: true });
|
|
81
|
+
await ensureLockTargetFile(lockTarget);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
84
|
+
throw new Error(`Failed to prepare checkout mutation lock at ${lockTarget}: ${msg}`);
|
|
85
|
+
}
|
|
86
|
+
return acquireFencedFileLock(lockTarget, {
|
|
87
|
+
stale: CHECKOUT_MUTATION_LOCK_STALE_MS,
|
|
88
|
+
realpath: false,
|
|
89
|
+
retries: {
|
|
90
|
+
retries: CHECKOUT_MUTATION_LOCK_RETRIES,
|
|
91
|
+
minTimeout: CHECKOUT_MUTATION_LOCK_MIN_TIMEOUT_MS,
|
|
92
|
+
maxTimeout: CHECKOUT_MUTATION_LOCK_MAX_TIMEOUT_MS,
|
|
93
|
+
factor: CHECKOUT_MUTATION_LOCK_BACKOFF_FACTOR
|
|
94
|
+
},
|
|
95
|
+
description: "Checkout mutation lock"
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// src/core/git/untracked-intent-index.ts
|
|
100
|
+
import { copyFile, writeFile } from "fs/promises";
|
|
101
|
+
import { tmpdir } from "os";
|
|
102
|
+
import { isAbsolute, join as join2 } from "path";
|
|
103
|
+
var NO_INTENT_INDEX = {
|
|
104
|
+
untrackedPaths: [],
|
|
105
|
+
dispose: async () => {
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
async function listAddableUntrackedFiles(params) {
|
|
109
|
+
const result = await execGit(["ls-files", "--others", "--exclude-standard", "-z"], {
|
|
110
|
+
cwd: params.worktreePath,
|
|
111
|
+
timeoutMs: params.timeoutMs
|
|
112
|
+
});
|
|
113
|
+
if (result.exitCode !== 0) {
|
|
114
|
+
throw new Error(
|
|
115
|
+
`git ls-files --others failed (exit ${result.exitCode}): ${result.stderr.trim() || "unknown error"}`
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
return result.stdout.split("\0").filter((entry) => entry.length > 0).filter((entry) => !entry.endsWith("/"));
|
|
119
|
+
}
|
|
120
|
+
async function resolveIndexPath(worktreePath, timeoutMs) {
|
|
121
|
+
const absolute = await execGit(["rev-parse", "--path-format=absolute", "--git-path", "index"], {
|
|
122
|
+
cwd: worktreePath,
|
|
123
|
+
timeoutMs
|
|
124
|
+
});
|
|
125
|
+
if (absolute.exitCode === 0 && absolute.stdout.trim()) {
|
|
126
|
+
return absolute.stdout.trim();
|
|
127
|
+
}
|
|
128
|
+
const relative = await execGit(["rev-parse", "--git-path", "index"], {
|
|
129
|
+
cwd: worktreePath,
|
|
130
|
+
timeoutMs
|
|
131
|
+
});
|
|
132
|
+
const reported = relative.stdout.trim();
|
|
133
|
+
if (relative.exitCode !== 0 || !reported) {
|
|
134
|
+
throw new Error(
|
|
135
|
+
`git rev-parse --git-path index failed (exit ${relative.exitCode}): ${relative.stderr.trim() || "unknown error"}`
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
return isAbsolute(reported) ? reported : join2(worktreePath, reported);
|
|
139
|
+
}
|
|
140
|
+
async function prepareUntrackedIntentIndex(params) {
|
|
141
|
+
const worktreePath = params.worktreePath.trim();
|
|
142
|
+
if (!worktreePath) {
|
|
143
|
+
throw new Error("untracked intent-to-add index requires a worktree path");
|
|
144
|
+
}
|
|
145
|
+
const untrackedPaths = await listAddableUntrackedFiles({
|
|
146
|
+
worktreePath,
|
|
147
|
+
timeoutMs: params.timeoutMs
|
|
148
|
+
});
|
|
149
|
+
if (untrackedPaths.length === 0) {
|
|
150
|
+
return NO_INTENT_INDEX;
|
|
151
|
+
}
|
|
152
|
+
const realIndexPath = await resolveIndexPath(worktreePath, params.timeoutMs);
|
|
153
|
+
const tempDir = await mkPoeticTempDir("winner-intent-index");
|
|
154
|
+
const dispose = async () => {
|
|
155
|
+
try {
|
|
156
|
+
await safeRmDir(tempDir, {
|
|
157
|
+
protectedPaths: [tmpdir()],
|
|
158
|
+
managedRoots: [tmpdir()]
|
|
159
|
+
});
|
|
160
|
+
} catch {
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
try {
|
|
164
|
+
const indexPath = join2(tempDir, "index");
|
|
165
|
+
await copyFile(realIndexPath, indexPath);
|
|
166
|
+
const pathspecFile = join2(tempDir, "pathspecs");
|
|
167
|
+
await writeFile(
|
|
168
|
+
pathspecFile,
|
|
169
|
+
`${untrackedPaths.map((entry) => `:(literal)${entry}`).join("\0")}\0`,
|
|
170
|
+
"utf8"
|
|
171
|
+
);
|
|
172
|
+
const addResult = await execGit(
|
|
173
|
+
[
|
|
174
|
+
"add",
|
|
175
|
+
"--intent-to-add",
|
|
176
|
+
`--pathspec-from-file=${pathspecFile}`,
|
|
177
|
+
"--pathspec-file-nul",
|
|
178
|
+
"--"
|
|
179
|
+
],
|
|
180
|
+
{
|
|
181
|
+
cwd: worktreePath,
|
|
182
|
+
timeoutMs: params.timeoutMs,
|
|
183
|
+
// Writes land in the COPY, never the worktree's own index.
|
|
184
|
+
env: { GIT_INDEX_FILE: indexPath }
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
if (addResult.exitCode !== 0) {
|
|
188
|
+
throw new Error(
|
|
189
|
+
`git add --intent-to-add failed (exit ${addResult.exitCode}): ${addResult.stderr.trim() || "unknown error"}`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
return { indexPath, untrackedPaths, dispose };
|
|
193
|
+
} catch (error) {
|
|
194
|
+
await dispose();
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// src/core/compete/apply-completion-mode.ts
|
|
200
|
+
var COMPETE_DIFF_BINARY_FLAGS = ["--binary", "--full-index"];
|
|
201
|
+
var COMPETE_GIT_APPLY_WHITESPACE_FLAGS = ["--whitespace=nowarn"];
|
|
202
|
+
var COMPETE_DIFF_MAX_BUFFER_BYTES = 256 * 1024 * 1024;
|
|
203
|
+
var TRUNCATED_DIFF_MARKERS = [
|
|
204
|
+
/diff truncated/i,
|
|
205
|
+
/^\.\.\. \[diff truncated(?:[^\]]*)\](?:[;,]|$)/im,
|
|
206
|
+
/^\[Note: .*diff truncated.*\]$/im,
|
|
207
|
+
/^NOTE: Diff truncated/im,
|
|
208
|
+
/^\.\.\.\[output truncated:/im
|
|
209
|
+
];
|
|
210
|
+
function isRecoverableCompetitionDiff(diff) {
|
|
211
|
+
if (diff.trim().length === 0) return false;
|
|
212
|
+
return !TRUNCATED_DIFF_MARKERS.some((marker) => marker.test(diff));
|
|
213
|
+
}
|
|
214
|
+
var PR_REMOTE_OP_TIMEOUT_MS = 3e5;
|
|
215
|
+
function resolveEffectiveCompletionMode(mode, context) {
|
|
216
|
+
let effectiveMode = mode === "none" ? "isolated" : mode;
|
|
217
|
+
if (effectiveMode === "auto") {
|
|
218
|
+
if (context.autoModePreference !== void 0) {
|
|
219
|
+
effectiveMode = context.autoModePreference;
|
|
220
|
+
} else {
|
|
221
|
+
effectiveMode = "isolated";
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (context.createPr === false && effectiveMode === "pr") {
|
|
225
|
+
effectiveMode = "isolated";
|
|
226
|
+
}
|
|
227
|
+
return effectiveMode;
|
|
228
|
+
}
|
|
229
|
+
var CompletionModeCancelledError = class extends Error {
|
|
230
|
+
constructor(mode, variantId) {
|
|
231
|
+
super(`completion-mode=${mode} cancelled by user for ${variantId}`);
|
|
232
|
+
this.name = "CompletionModeCancelledError";
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
function getBranchModeAckPath(projectRoot) {
|
|
236
|
+
return join3(projectRoot, ".poetic", "state", "branch-mode-ack");
|
|
237
|
+
}
|
|
238
|
+
function hasBranchModeAck(projectRoot) {
|
|
239
|
+
return existsSync(getBranchModeAckPath(projectRoot));
|
|
240
|
+
}
|
|
241
|
+
function writeBranchModeAck(projectRoot) {
|
|
242
|
+
const ackPath = getBranchModeAckPath(projectRoot);
|
|
243
|
+
mkdirSync(join3(projectRoot, ".poetic", "state"), { recursive: true });
|
|
244
|
+
writeFileSync(ackPath, (/* @__PURE__ */ new Date()).toISOString(), "utf8");
|
|
245
|
+
}
|
|
246
|
+
function isWorkingTreeClean(projectRoot) {
|
|
247
|
+
try {
|
|
248
|
+
const output = execFileSync("git", ["status", "--porcelain", "--untracked-files=all"], {
|
|
249
|
+
cwd: projectRoot,
|
|
250
|
+
encoding: "utf8"
|
|
251
|
+
});
|
|
252
|
+
return parsePorcelainChangedFiles(output, { includeRenameSources: true }).every(
|
|
253
|
+
(filePath) => filePath === ".poetic/merge-apply" || filePath.startsWith(".poetic/merge-apply/")
|
|
254
|
+
);
|
|
255
|
+
} catch {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function resolveWinnerBranchName(winner) {
|
|
260
|
+
if (winner.branchName?.trim()) {
|
|
261
|
+
return winner.branchName.trim();
|
|
262
|
+
}
|
|
263
|
+
if (!winner.worktreePath) {
|
|
264
|
+
return void 0;
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
const output = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], {
|
|
268
|
+
cwd: winner.worktreePath,
|
|
269
|
+
encoding: "utf8"
|
|
270
|
+
}).trim();
|
|
271
|
+
if (!output || output === "HEAD") {
|
|
272
|
+
return void 0;
|
|
273
|
+
}
|
|
274
|
+
return output;
|
|
275
|
+
} catch {
|
|
276
|
+
return void 0;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
function readGitOutput(projectRoot, args) {
|
|
280
|
+
try {
|
|
281
|
+
const output = execFileSync("git", args, {
|
|
282
|
+
cwd: projectRoot,
|
|
283
|
+
encoding: "utf8"
|
|
284
|
+
}).trim();
|
|
285
|
+
return output || void 0;
|
|
286
|
+
} catch {
|
|
287
|
+
return void 0;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
function normalizePatchForGitApply(patch) {
|
|
291
|
+
return patch.endsWith("\n") ? patch : `${patch}
|
|
292
|
+
`;
|
|
293
|
+
}
|
|
294
|
+
function readGitHead(projectRoot) {
|
|
295
|
+
return readGitOutput(projectRoot, ["rev-parse", "HEAD"]);
|
|
296
|
+
}
|
|
297
|
+
function readGitBranch(projectRoot) {
|
|
298
|
+
const branch = readGitOutput(projectRoot, ["rev-parse", "--abbrev-ref", "HEAD"]);
|
|
299
|
+
return branch && branch !== "HEAD" ? branch : void 0;
|
|
300
|
+
}
|
|
301
|
+
function readWinnerHead(winner, projectRoot) {
|
|
302
|
+
if (winner.worktreePath) {
|
|
303
|
+
const worktreeHead = readGitHead(winner.worktreePath);
|
|
304
|
+
if (worktreeHead) return worktreeHead;
|
|
305
|
+
}
|
|
306
|
+
const branchName = resolveWinnerBranchName(winner);
|
|
307
|
+
return branchName ? readGitOutput(projectRoot, ["rev-parse", branchName]) : void 0;
|
|
308
|
+
}
|
|
309
|
+
function parsePorcelainChangedFiles(statusOutput, options = {}) {
|
|
310
|
+
const files = /* @__PURE__ */ new Set();
|
|
311
|
+
const unquote = (value) => value.replace(/^"|"$/g, "");
|
|
312
|
+
for (const line of statusOutput.split(/\r?\n/)) {
|
|
313
|
+
if (!line.trim()) continue;
|
|
314
|
+
const pathPart = line.slice(3).trim();
|
|
315
|
+
if (!pathPart) continue;
|
|
316
|
+
if (pathPart.includes(" -> ")) {
|
|
317
|
+
const segments = pathPart.split(" -> ");
|
|
318
|
+
const destination = segments.pop() ?? pathPart;
|
|
319
|
+
files.add(unquote(destination));
|
|
320
|
+
if (options.includeRenameSources) {
|
|
321
|
+
for (const source of segments) {
|
|
322
|
+
if (source.trim()) files.add(unquote(source.trim()));
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
files.add(unquote(pathPart));
|
|
328
|
+
}
|
|
329
|
+
return [...files].sort();
|
|
330
|
+
}
|
|
331
|
+
function buildPrBody(winner, context) {
|
|
332
|
+
const lines = ["## Summary", `Poetic selected \`${winner.variantId}\` as the winning variant.`];
|
|
333
|
+
if (context.taskId) {
|
|
334
|
+
lines.push("", `- Task ID: \`${context.taskId}\``);
|
|
335
|
+
}
|
|
336
|
+
if (context.resolvedConfig) {
|
|
337
|
+
lines.push(`- Judge: \`${context.resolvedConfig.judge}\``);
|
|
338
|
+
lines.push(`- Completion mode: \`${context.resolvedConfig.completionMode}\``);
|
|
339
|
+
}
|
|
340
|
+
if (context.allVariants && context.allVariants.length > 0) {
|
|
341
|
+
lines.push(`- Variants evaluated: ${context.allVariants.length}`);
|
|
342
|
+
}
|
|
343
|
+
return `${lines.join("\n")}
|
|
344
|
+
`;
|
|
345
|
+
}
|
|
346
|
+
function parsePrNumberFromGhCreateOutput(output) {
|
|
347
|
+
const trimmed = String(output).trim();
|
|
348
|
+
if (!trimmed) {
|
|
349
|
+
return void 0;
|
|
350
|
+
}
|
|
351
|
+
const githubUrlMatch = trimmed.match(/\/pull\/(\d+)(?:\b|$)/);
|
|
352
|
+
if (githubUrlMatch?.[1]) {
|
|
353
|
+
return Number.parseInt(githubUrlMatch[1], 10);
|
|
354
|
+
}
|
|
355
|
+
const hashMatch = trimmed.match(/#(\d+)\b/);
|
|
356
|
+
if (hashMatch?.[1]) {
|
|
357
|
+
return Number.parseInt(hashMatch[1], 10);
|
|
358
|
+
}
|
|
359
|
+
return void 0;
|
|
360
|
+
}
|
|
361
|
+
async function applyIsolated(winner, context) {
|
|
362
|
+
if (winner.worktreePath) {
|
|
363
|
+
console.log(`Winner retained at: ${winner.worktreePath} (no target changes applied)`);
|
|
364
|
+
} else {
|
|
365
|
+
console.log(`Winner: ${winner.variantId} (retained; no target changes applied)`);
|
|
366
|
+
}
|
|
367
|
+
const classification = winner.repairOutcome?.classification;
|
|
368
|
+
if (classification === "off_scope") {
|
|
369
|
+
console.log(`Final artifact: ${winner.repairOutcome?.finalArtifactTrust ?? "quarantined"}`);
|
|
370
|
+
console.log("Judge verdict applies to final artifact: no");
|
|
371
|
+
} else if (classification === "unknown") {
|
|
372
|
+
console.log("Final artifact: unknown repair scope");
|
|
373
|
+
}
|
|
374
|
+
context.onApplied?.({
|
|
375
|
+
mode: "isolated",
|
|
376
|
+
variantId: winner.variantId,
|
|
377
|
+
taskId: context.taskId
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
async function assertLiveWorkspaceMatchesAcceptedArtifact(winner, mode) {
|
|
381
|
+
if (!winner.worktreePath || !winner.acceptedWorkspaceTreeSha) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const currentSourceTreeSha = await captureCurrentWorkspaceTreeIdentity(winner.worktreePath);
|
|
385
|
+
if (currentSourceTreeSha !== winner.acceptedWorkspaceTreeSha) {
|
|
386
|
+
throw new Error(
|
|
387
|
+
`completion-mode=${mode}: live winner workspace no longer matches the accepted judged artifact (${winner.acceptedWorkspaceTreeSha} -> ${currentSourceTreeSha}). Refusing stale or expanded application.`
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
async function applyPr(winner, context) {
|
|
392
|
+
const branchName = resolveWinnerBranchName(winner);
|
|
393
|
+
if (!branchName) {
|
|
394
|
+
console.warn("completion-mode=pr: winner has no branch; falling back to isolated.");
|
|
395
|
+
await applyIsolated(winner, context);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
winner.branchName = branchName;
|
|
399
|
+
await assertLiveWorkspaceMatchesAcceptedArtifact(winner, "pr");
|
|
400
|
+
console.log(`Pushing winning branch: ${branchName}`);
|
|
401
|
+
try {
|
|
402
|
+
const pushFromWinnerHead = Boolean(winner.worktreePath);
|
|
403
|
+
execFileSync(
|
|
404
|
+
"git",
|
|
405
|
+
pushFromWinnerHead ? ["push", "origin", `HEAD:refs/heads/${branchName}`] : ["push", "origin", branchName],
|
|
406
|
+
{
|
|
407
|
+
cwd: winner.worktreePath ?? context.projectRoot,
|
|
408
|
+
stdio: "inherit",
|
|
409
|
+
// Bound the push so it cannot hang forever on a credential/auth prompt
|
|
410
|
+
// (FIX #7). Other apply git calls already use 30s/60s timeouts.
|
|
411
|
+
timeout: PR_REMOTE_OP_TIMEOUT_MS,
|
|
412
|
+
// Fail fast instead of blocking on an interactive credential prompt.
|
|
413
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: "0" }
|
|
414
|
+
}
|
|
415
|
+
);
|
|
416
|
+
const prCreateOutput = execFileSync(
|
|
417
|
+
"gh",
|
|
418
|
+
[
|
|
419
|
+
"pr",
|
|
420
|
+
"create",
|
|
421
|
+
"--head",
|
|
422
|
+
branchName,
|
|
423
|
+
"--title",
|
|
424
|
+
`Poetic: ${winner.variantId} wins`,
|
|
425
|
+
"--body",
|
|
426
|
+
buildPrBody(winner, context)
|
|
427
|
+
],
|
|
428
|
+
{
|
|
429
|
+
cwd: context.projectRoot,
|
|
430
|
+
encoding: "utf8",
|
|
431
|
+
// Bound `gh pr create` so it cannot hang forever on an interactive gh
|
|
432
|
+
// auth/login prompt (FIX #7).
|
|
433
|
+
timeout: PR_REMOTE_OP_TIMEOUT_MS,
|
|
434
|
+
// Tell gh this is non-interactive so a missing credential fails fast
|
|
435
|
+
// rather than blocking on a prompt.
|
|
436
|
+
env: { ...process.env, GH_PROMPT_DISABLED: "1" }
|
|
437
|
+
}
|
|
438
|
+
);
|
|
439
|
+
const prNumber = parsePrNumberFromGhCreateOutput(prCreateOutput);
|
|
440
|
+
if (typeof prNumber === "number" && Number.isFinite(prNumber)) {
|
|
441
|
+
winner.prNumber = prNumber;
|
|
442
|
+
}
|
|
443
|
+
console.log(`Pull request created for ${winner.variantId}`);
|
|
444
|
+
context.onApplied?.({
|
|
445
|
+
mode: "pr",
|
|
446
|
+
variantId: winner.variantId,
|
|
447
|
+
taskId: context.taskId,
|
|
448
|
+
prNumber
|
|
449
|
+
});
|
|
450
|
+
} catch (err) {
|
|
451
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
452
|
+
console.error(`Failed to create PR: ${msg}`);
|
|
453
|
+
throw err;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
function parseAddedFilePathsFromPatch(patch) {
|
|
457
|
+
const lines = patch.split("\n");
|
|
458
|
+
const added = [];
|
|
459
|
+
for (let i = 0; i < lines.length; i++) {
|
|
460
|
+
const line = lines[i];
|
|
461
|
+
if (line === "--- /dev/null" || line?.startsWith("--- /dev/null ")) {
|
|
462
|
+
const next = lines[i + 1];
|
|
463
|
+
if (next?.startsWith("+++ ")) {
|
|
464
|
+
const decoded = decodePatchPath(next.slice(4));
|
|
465
|
+
if (decoded) {
|
|
466
|
+
added.push(decoded);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return added;
|
|
472
|
+
}
|
|
473
|
+
function decodeCQuotedPath(body) {
|
|
474
|
+
const bytes = [];
|
|
475
|
+
for (let i = 0; i < body.length; i++) {
|
|
476
|
+
const ch = body[i] ?? "";
|
|
477
|
+
if (ch !== "\\") {
|
|
478
|
+
for (const b of Buffer.from(ch, "utf8")) {
|
|
479
|
+
bytes.push(b);
|
|
480
|
+
}
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
const next = body[i + 1];
|
|
484
|
+
if (next === void 0) {
|
|
485
|
+
bytes.push(92);
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
if (next >= "0" && next <= "7") {
|
|
489
|
+
let oct = "";
|
|
490
|
+
let j = i + 1;
|
|
491
|
+
while (j < body.length && oct.length < 3) {
|
|
492
|
+
const digit = body[j] ?? "";
|
|
493
|
+
if (digit < "0" || digit > "7") {
|
|
494
|
+
break;
|
|
495
|
+
}
|
|
496
|
+
oct += digit;
|
|
497
|
+
j++;
|
|
498
|
+
}
|
|
499
|
+
bytes.push(Number.parseInt(oct, 8) & 255);
|
|
500
|
+
i = j - 1;
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
switch (next) {
|
|
504
|
+
case "\\":
|
|
505
|
+
bytes.push(92);
|
|
506
|
+
break;
|
|
507
|
+
case '"':
|
|
508
|
+
bytes.push(34);
|
|
509
|
+
break;
|
|
510
|
+
case "t":
|
|
511
|
+
bytes.push(9);
|
|
512
|
+
break;
|
|
513
|
+
case "n":
|
|
514
|
+
bytes.push(10);
|
|
515
|
+
break;
|
|
516
|
+
case "r":
|
|
517
|
+
bytes.push(13);
|
|
518
|
+
break;
|
|
519
|
+
case "f":
|
|
520
|
+
bytes.push(12);
|
|
521
|
+
break;
|
|
522
|
+
case "b":
|
|
523
|
+
bytes.push(8);
|
|
524
|
+
break;
|
|
525
|
+
case "v":
|
|
526
|
+
bytes.push(11);
|
|
527
|
+
break;
|
|
528
|
+
case "a":
|
|
529
|
+
bytes.push(7);
|
|
530
|
+
break;
|
|
531
|
+
default:
|
|
532
|
+
for (const b of Buffer.from(next, "utf8")) {
|
|
533
|
+
bytes.push(b);
|
|
534
|
+
}
|
|
535
|
+
break;
|
|
536
|
+
}
|
|
537
|
+
i++;
|
|
538
|
+
}
|
|
539
|
+
return Buffer.from(bytes).toString("utf8");
|
|
540
|
+
}
|
|
541
|
+
function decodePatchPath(field) {
|
|
542
|
+
let raw = field.split(" ")[0]?.trim() ?? "";
|
|
543
|
+
if (!raw || raw === "/dev/null") {
|
|
544
|
+
return void 0;
|
|
545
|
+
}
|
|
546
|
+
if (raw.startsWith('"') && raw.endsWith('"') && raw.length >= 2) {
|
|
547
|
+
raw = decodeCQuotedPath(raw.slice(1, -1));
|
|
548
|
+
}
|
|
549
|
+
if (raw.startsWith("a/") || raw.startsWith("b/")) {
|
|
550
|
+
raw = raw.slice(2);
|
|
551
|
+
}
|
|
552
|
+
return raw.length > 0 ? raw : void 0;
|
|
553
|
+
}
|
|
554
|
+
function assertPatchPathsAreDeliveryEligible(patch) {
|
|
555
|
+
for (const line of patch.split("\n")) {
|
|
556
|
+
let paths = [];
|
|
557
|
+
if (line.startsWith("diff --git ")) {
|
|
558
|
+
const parsed = parseDiffGitHeaderPaths(line);
|
|
559
|
+
if (!parsed) {
|
|
560
|
+
throw new Error(
|
|
561
|
+
"completion-mode=branch: could not validate a diff header path. Refusing an unscoped patch."
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
paths = [parsed.aPath, parsed.bPath];
|
|
565
|
+
} else if (line.startsWith("--- ") || line.startsWith("+++ ")) {
|
|
566
|
+
const parsed = parseUnifiedDiffPathLine(line);
|
|
567
|
+
if (parsed && parsed !== "/dev/null") paths = [parsed];
|
|
568
|
+
}
|
|
569
|
+
for (const path2 of paths) {
|
|
570
|
+
const normalized = path2.replace(/\\/g, "/");
|
|
571
|
+
if (posix.isAbsolute(normalized) || normalized === ".." || normalized.startsWith("../") || normalized.includes("/../")) {
|
|
572
|
+
throw new Error(
|
|
573
|
+
`completion-mode=branch: accepted artifact contains unsafe path ${path2}. Refusing to apply bytes outside the repository.`
|
|
574
|
+
);
|
|
575
|
+
}
|
|
576
|
+
if (shouldExcludeFile(path2)) {
|
|
577
|
+
throw new Error(
|
|
578
|
+
`completion-mode=branch: accepted artifact contains excluded path ${path2}. Refusing to apply bytes outside the delivery-eligible artifact.`
|
|
579
|
+
);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
function rollbackFailedApply(projectRoot, baseSha, patch) {
|
|
585
|
+
try {
|
|
586
|
+
execFileSync("git", ["reset", "--hard", baseSha], {
|
|
587
|
+
cwd: projectRoot,
|
|
588
|
+
encoding: "utf8"
|
|
589
|
+
});
|
|
590
|
+
const addedPaths = parseAddedFilePathsFromPatch(patch);
|
|
591
|
+
if (addedPaths.length > 0) {
|
|
592
|
+
const literalPathspecs = addedPaths.map((path2) => `:(literal)${path2}`);
|
|
593
|
+
execFileSync("git", ["clean", "-d", "-f", "--", ...literalPathspecs], {
|
|
594
|
+
cwd: projectRoot,
|
|
595
|
+
encoding: "utf8"
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
} catch (rollbackErr) {
|
|
599
|
+
const rollbackMsg = rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr);
|
|
600
|
+
throw new Error(
|
|
601
|
+
`Error: failed to roll back working tree after a failed apply: ${rollbackMsg}. The working tree may be in a partial state. Recover manually with: git reset --hard ${baseSha} && git clean -d -f`
|
|
602
|
+
);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
async function verifyAppliedBranch(projectRoot, changedFiles, timeoutMinutes) {
|
|
606
|
+
const scope = resolveVerificationChannelScope(projectRoot, changedFiles);
|
|
607
|
+
const channels = [
|
|
608
|
+
["build", scope.build],
|
|
609
|
+
["lint", scope.lint],
|
|
610
|
+
["test", scope.test]
|
|
611
|
+
];
|
|
612
|
+
const unavailableChannel = channels.find(([, channel]) => channel.availability === "unavailable");
|
|
613
|
+
if (unavailableChannel) {
|
|
614
|
+
return {
|
|
615
|
+
status: "unavailable",
|
|
616
|
+
reason: `Capability-resolved ${unavailableChannel[0]} verification is unavailable for the applied files.`
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
const selected = channels.flatMap(
|
|
620
|
+
([channel, resolved]) => resolved.availability === "relevant" ? resolved.commands.map((command) => ({ channel, command })) : []
|
|
621
|
+
);
|
|
622
|
+
if (selected.length === 0) {
|
|
623
|
+
return changedFilesRequireVerification(changedFiles) ? {
|
|
624
|
+
status: "unavailable",
|
|
625
|
+
reason: "No capability-resolved verification command covers the applied source files."
|
|
626
|
+
} : {
|
|
627
|
+
status: "not_run",
|
|
628
|
+
reason: "The applied files have no applicable deterministic verification command."
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
const outcomes = [];
|
|
632
|
+
for (const { channel, command } of selected) {
|
|
633
|
+
const startedAt = Date.now();
|
|
634
|
+
const result = await runVerificationCommand(command, {
|
|
635
|
+
cwd: projectRoot,
|
|
636
|
+
timeoutMs: timeoutMinutes !== void 0 ? timeoutMinutes * 6e4 : DEFAULT_TIMEOUT_MS
|
|
637
|
+
});
|
|
638
|
+
outcomes.push({
|
|
639
|
+
...classifyResolverCommand(command, result, Date.now() - startedAt),
|
|
640
|
+
channel
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
const aggregate = aggregateResolverOutcomes(outcomes);
|
|
644
|
+
const commandEvidence = outcomes.map(({ channel, command, classification, durationMs }) => ({
|
|
645
|
+
channel,
|
|
646
|
+
command,
|
|
647
|
+
classification,
|
|
648
|
+
durationMs
|
|
649
|
+
}));
|
|
650
|
+
if (aggregate.classification !== "passed") {
|
|
651
|
+
return {
|
|
652
|
+
status: aggregate.classification === "unavailable" ? "unavailable" : "failed",
|
|
653
|
+
reason: aggregate.representative?.message ?? "Capability-resolved post-apply verification produced no usable evidence.",
|
|
654
|
+
commands: commandEvidence
|
|
655
|
+
};
|
|
656
|
+
}
|
|
657
|
+
return {
|
|
658
|
+
status: "passed",
|
|
659
|
+
reason: `Passed ${outcomes.length} capability-resolved verification command(s).`,
|
|
660
|
+
commands: commandEvidence
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
async function applyBranch(winner, modeSource, context) {
|
|
664
|
+
const inCi = context.isCi ?? isCompeteNonInteractiveEnvironment();
|
|
665
|
+
if (inCi && modeSource !== "flag" && modeSource !== "env") {
|
|
666
|
+
throw new Error(
|
|
667
|
+
"completion-mode=branch requires explicit opt-in in CI. Use --completion-mode branch or POETIC_COMPLETION_MODE=branch to enable."
|
|
668
|
+
);
|
|
669
|
+
}
|
|
670
|
+
if (!isWorkingTreeClean(context.projectRoot)) {
|
|
671
|
+
throw new Error(
|
|
672
|
+
"completion-mode=branch requires a clean working tree. Commit or stash your changes first."
|
|
673
|
+
);
|
|
674
|
+
}
|
|
675
|
+
if (!inCi && !hasBranchModeAck(context.projectRoot)) {
|
|
676
|
+
if (process.stdout.isTTY) {
|
|
677
|
+
const readline = await import("readline");
|
|
678
|
+
const rl = readline.createInterface({
|
|
679
|
+
input: process.stdin,
|
|
680
|
+
output: process.stdout
|
|
681
|
+
});
|
|
682
|
+
const answer = await new Promise((resolve) => {
|
|
683
|
+
rl.question(
|
|
684
|
+
"completion-mode=branch will apply changes directly to your current branch.\nThis is a one-time confirmation per repo. Continue? [y/N] ",
|
|
685
|
+
(ans) => {
|
|
686
|
+
rl.close();
|
|
687
|
+
resolve(ans.trim().toLowerCase());
|
|
688
|
+
}
|
|
689
|
+
);
|
|
690
|
+
});
|
|
691
|
+
if (answer !== "y" && answer !== "yes") {
|
|
692
|
+
console.log("Aborted.");
|
|
693
|
+
throw new CompletionModeCancelledError("branch", winner.variantId);
|
|
694
|
+
}
|
|
695
|
+
writeBranchModeAck(context.projectRoot);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
console.log(`Applying ${winner.variantId} changes to current branch...`);
|
|
699
|
+
const baseSha = execFileSync("git", ["rev-parse", "HEAD"], {
|
|
700
|
+
cwd: context.projectRoot,
|
|
701
|
+
encoding: "utf8"
|
|
702
|
+
}).trim();
|
|
703
|
+
const baselineRef = winner.baselineRef?.trim();
|
|
704
|
+
if (!baselineRef) {
|
|
705
|
+
throw new Error(
|
|
706
|
+
`completion-mode=branch: winner ${winner.variantId} is missing a trustworthy baselineRef. Refusing to apply without proving the target branch is still at the competition base.`
|
|
707
|
+
);
|
|
708
|
+
}
|
|
709
|
+
const normalizedBaseline = baselineRef.toLowerCase();
|
|
710
|
+
const normalizedHead = baseSha.toLowerCase();
|
|
711
|
+
const baselineMatchesHead = normalizedBaseline === normalizedHead || normalizedBaseline.length >= 7 && normalizedHead.startsWith(normalizedBaseline) || normalizedHead.length >= 7 && normalizedBaseline.startsWith(normalizedHead);
|
|
712
|
+
if (!baselineMatchesHead) {
|
|
713
|
+
throw new Error(
|
|
714
|
+
`completion-mode=branch: target HEAD moved since the competition started (expected ${baselineRef}, found ${baseSha}). Refusing to reverse or overwrite concurrent commits.`
|
|
715
|
+
);
|
|
716
|
+
}
|
|
717
|
+
const targetBranch = readGitBranch(context.projectRoot);
|
|
718
|
+
const sourceBranch = resolveWinnerBranchName(winner);
|
|
719
|
+
const sourceHeadSha = readWinnerHead(winner, context.projectRoot);
|
|
720
|
+
let applyAttempted = false;
|
|
721
|
+
let releaseCheckoutMutationLock;
|
|
722
|
+
let patchOutput = "";
|
|
723
|
+
let appliedEvent;
|
|
724
|
+
try {
|
|
725
|
+
let source = "none";
|
|
726
|
+
let artifactDiff;
|
|
727
|
+
if (winner.worktreePath) {
|
|
728
|
+
let intentIndex;
|
|
729
|
+
try {
|
|
730
|
+
intentIndex = await prepareUntrackedIntentIndex({
|
|
731
|
+
worktreePath: winner.worktreePath
|
|
732
|
+
});
|
|
733
|
+
} catch (prepareErr) {
|
|
734
|
+
if (existsSync(winner.worktreePath)) {
|
|
735
|
+
const prepareMsg = prepareErr instanceof Error ? prepareErr.message : String(prepareErr);
|
|
736
|
+
throw new Error(
|
|
737
|
+
`completion-mode=branch: failed to stage untracked winner files for the diff from worktree ${winner.worktreePath}: ${prepareMsg}. Refusing to apply a patch that would silently omit newly created files.`
|
|
738
|
+
);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
try {
|
|
742
|
+
patchOutput = execFileSync(
|
|
743
|
+
"git",
|
|
744
|
+
["diff", ...COMPETE_DIFF_BINARY_FLAGS, "--no-color", baseSha],
|
|
745
|
+
{
|
|
746
|
+
cwd: winner.worktreePath,
|
|
747
|
+
encoding: "utf8",
|
|
748
|
+
maxBuffer: COMPETE_DIFF_MAX_BUFFER_BYTES,
|
|
749
|
+
// Read against the temp index so untracked files render as new-file
|
|
750
|
+
// blocks. Omitted when there were none, keeping the no-untracked-work
|
|
751
|
+
// case byte-identical to previous behavior.
|
|
752
|
+
...intentIndex?.indexPath ? { env: { ...process.env, GIT_INDEX_FILE: intentIndex.indexPath } } : {}
|
|
753
|
+
}
|
|
754
|
+
);
|
|
755
|
+
source = "worktree";
|
|
756
|
+
} catch (diffErr) {
|
|
757
|
+
const worktreeMissing = !existsSync(winner.worktreePath);
|
|
758
|
+
if (!worktreeMissing) {
|
|
759
|
+
const diffMsg = diffErr instanceof Error ? diffErr.message : String(diffErr);
|
|
760
|
+
throw new Error(
|
|
761
|
+
`completion-mode=branch: failed to read the winner diff from worktree ${winner.worktreePath}: ${diffMsg}. Refusing to fall back to a possibly-stale cached diff because the worktree is present but the diff could not be read.`
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
} finally {
|
|
765
|
+
await intentIndex?.dispose();
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
let acceptedDiff;
|
|
769
|
+
if (winner.worktreeDiff && isRecoverableCompetitionDiff(winner.worktreeDiff)) {
|
|
770
|
+
acceptedDiff = winner.worktreeDiff;
|
|
771
|
+
} else if (winner.artifactManifest) {
|
|
772
|
+
artifactDiff = await readArtifactDiffFromManifestPath(winner.artifactManifest, context.projectRoot) ?? void 0;
|
|
773
|
+
if (artifactDiff && artifactDiff.trim().length > 0) {
|
|
774
|
+
acceptedDiff = artifactDiff;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
const legacyByteIdentity = source === "worktree" && acceptedDiff !== void 0 && normalizePatchForGitApply(patchOutput) === normalizePatchForGitApply(acceptedDiff);
|
|
778
|
+
if (acceptedDiff) {
|
|
779
|
+
assertPatchPathsAreDeliveryEligible(acceptedDiff);
|
|
780
|
+
if (source !== "worktree") patchOutput = acceptedDiff;
|
|
781
|
+
}
|
|
782
|
+
if (source === "worktree" && patchOutput.trim() && !winner.acceptedWorkspaceTreeSha && !legacyByteIdentity) {
|
|
783
|
+
throw new Error(
|
|
784
|
+
acceptedDiff ? "completion-mode=branch: live winner diff is not byte-identical to the accepted eligible artifact and has no accepted workspace-tree identity. Refusing stale or expanded application." : "completion-mode=branch: live winner has no accepted cached or persisted artifact identity (workspace-tree identity unavailable). Refusing to apply an unverified live worktree state."
|
|
785
|
+
);
|
|
786
|
+
}
|
|
787
|
+
if (source === "none" && winner.worktreeDiff && isRecoverableCompetitionDiff(winner.worktreeDiff)) {
|
|
788
|
+
patchOutput = winner.worktreeDiff;
|
|
789
|
+
source = "cached-diff";
|
|
790
|
+
}
|
|
791
|
+
if (source === "none" && winner.artifactManifest) {
|
|
792
|
+
artifactDiff ??= await readArtifactDiffFromManifestPath(winner.artifactManifest, context.projectRoot) ?? void 0;
|
|
793
|
+
if (artifactDiff && artifactDiff.trim().length > 0) {
|
|
794
|
+
patchOutput = artifactDiff;
|
|
795
|
+
source = "artifact";
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
if (source === "none") {
|
|
799
|
+
throw new Error(
|
|
800
|
+
`completion-mode=branch: winner ${winner.variantId} has no worktree path, cached diff, or artifact diff for application.`
|
|
801
|
+
);
|
|
802
|
+
}
|
|
803
|
+
assertPatchPathsAreDeliveryEligible(patchOutput);
|
|
804
|
+
if (!patchOutput.trim()) {
|
|
805
|
+
console.log("Winner has no changes relative to HEAD \u2014 nothing to apply.");
|
|
806
|
+
context.onApplied?.({
|
|
807
|
+
mode: "branch",
|
|
808
|
+
variantId: winner.variantId,
|
|
809
|
+
taskId: context.taskId,
|
|
810
|
+
appliedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
811
|
+
sourceBranch,
|
|
812
|
+
sourceHeadSha,
|
|
813
|
+
targetBranch,
|
|
814
|
+
targetPreApplyHeadSha: baseSha,
|
|
815
|
+
targetPostApplyHeadSha: baseSha,
|
|
816
|
+
diffSource: source,
|
|
817
|
+
changedFiles: [],
|
|
818
|
+
filesChanged: 0,
|
|
819
|
+
reason: "empty_diff"
|
|
820
|
+
});
|
|
821
|
+
return;
|
|
822
|
+
}
|
|
823
|
+
patchOutput = normalizePatchForGitApply(patchOutput);
|
|
824
|
+
if (source === "worktree") {
|
|
825
|
+
await assertLiveWorkspaceMatchesAcceptedArtifact(winner, "branch");
|
|
826
|
+
}
|
|
827
|
+
releaseCheckoutMutationLock = await acquireCheckoutMutationLock(context.projectRoot);
|
|
828
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
829
|
+
if (!isWorkingTreeClean(context.projectRoot)) {
|
|
830
|
+
throw new Error(
|
|
831
|
+
"completion-mode=branch: target working tree changed while resolving the winner patch. Refusing to mix concurrent edits into the apply transaction."
|
|
832
|
+
);
|
|
833
|
+
}
|
|
834
|
+
const currentTargetHead = readGitHead(context.projectRoot);
|
|
835
|
+
if (currentTargetHead !== baseSha) {
|
|
836
|
+
throw new Error(
|
|
837
|
+
`completion-mode=branch: target HEAD changed while resolving the winner patch (${baseSha} -> ${currentTargetHead ?? "unavailable"}). Refusing stale application.`
|
|
838
|
+
);
|
|
839
|
+
}
|
|
840
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
841
|
+
applyAttempted = true;
|
|
842
|
+
execFileSync("git", ["apply", "--3way", ...COMPETE_GIT_APPLY_WHITESPACE_FLAGS], {
|
|
843
|
+
cwd: context.projectRoot,
|
|
844
|
+
input: patchOutput,
|
|
845
|
+
encoding: "utf8"
|
|
846
|
+
});
|
|
847
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
848
|
+
const targetPostApplyHeadSha = readGitHead(context.projectRoot);
|
|
849
|
+
const changedFiles = parsePorcelainChangedFiles(
|
|
850
|
+
execFileSync("git", ["status", "--porcelain"], {
|
|
851
|
+
cwd: context.projectRoot,
|
|
852
|
+
encoding: "utf8"
|
|
853
|
+
})
|
|
854
|
+
);
|
|
855
|
+
console.log(
|
|
856
|
+
source === "cached-diff" ? `Applied ${winner.variantId} changes to current branch (from cached diff).` : source === "artifact" ? `Applied ${winner.variantId} changes to current branch (from artifact diff).` : `Applied ${winner.variantId} changes to current branch.`
|
|
857
|
+
);
|
|
858
|
+
appliedEvent = {
|
|
859
|
+
mode: "branch",
|
|
860
|
+
variantId: winner.variantId,
|
|
861
|
+
taskId: context.taskId,
|
|
862
|
+
appliedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
863
|
+
sourceBranch,
|
|
864
|
+
sourceHeadSha,
|
|
865
|
+
targetBranch,
|
|
866
|
+
targetPreApplyHeadSha: baseSha,
|
|
867
|
+
targetPostApplyHeadSha,
|
|
868
|
+
diffSource: source,
|
|
869
|
+
changedFiles,
|
|
870
|
+
filesChanged: changedFiles.length
|
|
871
|
+
};
|
|
872
|
+
} catch (err) {
|
|
873
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
874
|
+
console.error(`Error: failed to apply changes: ${msg}`);
|
|
875
|
+
if (applyAttempted) {
|
|
876
|
+
try {
|
|
877
|
+
if (releaseCheckoutMutationLock) {
|
|
878
|
+
await releaseCheckoutMutationLock.assertOwned();
|
|
879
|
+
}
|
|
880
|
+
rollbackFailedApply(context.projectRoot, baseSha, patchOutput);
|
|
881
|
+
console.log(`Info: rolled back working tree to ${baseSha} after failed apply.`);
|
|
882
|
+
} catch (rollbackErr) {
|
|
883
|
+
const rollbackMsg = rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr);
|
|
884
|
+
console.error(
|
|
885
|
+
rollbackErr instanceof FileLockCompromisedError ? `Warning: checkout lock ownership was lost; rollback was skipped and the target tree may be partially applied at ${context.projectRoot}. ${rollbackMsg}` : rollbackMsg
|
|
886
|
+
);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
throw err;
|
|
890
|
+
} finally {
|
|
891
|
+
if (releaseCheckoutMutationLock) {
|
|
892
|
+
await releaseCheckoutMutationLock().catch(() => void 0);
|
|
893
|
+
releaseCheckoutMutationLock = void 0;
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
if (!appliedEvent) return;
|
|
897
|
+
const postApplyVerification = await verifyAppliedBranch(
|
|
898
|
+
context.projectRoot,
|
|
899
|
+
appliedEvent.changedFiles ?? [],
|
|
900
|
+
context.resolvedConfig?.timeout
|
|
901
|
+
);
|
|
902
|
+
const verifiedEvent = { ...appliedEvent, postApplyVerification };
|
|
903
|
+
context.onApplied?.(verifiedEvent);
|
|
904
|
+
if (postApplyVerification.status === "failed" || postApplyVerification.status === "unavailable") {
|
|
905
|
+
throw new Error(
|
|
906
|
+
`completion-mode=branch post-apply verification ${postApplyVerification.status}: ${postApplyVerification.reason}. The applied changes were left in the working tree for inspection.`
|
|
907
|
+
);
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
function isOffScopeRepairOverrideEnabled(context) {
|
|
911
|
+
return context.allowOffScopeRepair === true || readEnv(POETIC_ALLOW_OFF_SCOPE_REPAIR).value === true;
|
|
912
|
+
}
|
|
913
|
+
function assertRepairArtifactAllowedForMode(winner, effectiveMode, context) {
|
|
914
|
+
const classification = winner.repairOutcome?.classification;
|
|
915
|
+
const policy = resolveRepairArtifactPolicy({
|
|
916
|
+
classification,
|
|
917
|
+
effectiveMode,
|
|
918
|
+
allowOffScopeRepair: isOffScopeRepairOverrideEnabled(context)
|
|
919
|
+
});
|
|
920
|
+
if (winner.repairOutcome) {
|
|
921
|
+
winner.repairOutcome.finalArtifactTrust = policy.finalArtifactTrust;
|
|
922
|
+
}
|
|
923
|
+
if (policy.action === "block") {
|
|
924
|
+
throw new Error(
|
|
925
|
+
`${policy.reason}. Judge verdict does not apply to the repaired final artifact. Use --allow-off-scope-repair or POETIC_ALLOW_OFF_SCOPE_REPAIR=1 to override.`
|
|
926
|
+
);
|
|
927
|
+
}
|
|
928
|
+
if (policy.action === "warn") {
|
|
929
|
+
if (classification === "off_scope") {
|
|
930
|
+
console.warn(
|
|
931
|
+
`Warning: ${policy.reason}. Judge verdict does not apply to the repaired final artifact.`
|
|
932
|
+
);
|
|
933
|
+
} else if (classification === "scope_expanded" || classification === "substantive_in_scope") {
|
|
934
|
+
console.warn(
|
|
935
|
+
`Warning: ${policy.reason}. Judge verdict only partially applies to the repaired final artifact.`
|
|
936
|
+
);
|
|
937
|
+
} else if (classification === "unknown") {
|
|
938
|
+
console.warn(`Warning: ${policy.reason}.`);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
async function applyCompletionMode(winner, mode, modeSource, context) {
|
|
943
|
+
let preCreatePrDowngrade = mode === "none" ? "isolated" : mode;
|
|
944
|
+
if (mode === "auto") {
|
|
945
|
+
preCreatePrDowngrade = context.autoModePreference ?? "isolated";
|
|
946
|
+
}
|
|
947
|
+
const effectiveMode = resolveEffectiveCompletionMode(mode, {
|
|
948
|
+
...context,
|
|
949
|
+
winner: {
|
|
950
|
+
executionMode: winner.executionMode
|
|
951
|
+
}
|
|
952
|
+
});
|
|
953
|
+
if (context.createPr === false && preCreatePrDowngrade === "pr") {
|
|
954
|
+
console.log("completion-mode=pr downgraded to isolated (--no-create-pr)");
|
|
955
|
+
}
|
|
956
|
+
assertRepairArtifactAllowedForMode(winner, effectiveMode, context);
|
|
957
|
+
if ((effectiveMode === "pr" || effectiveMode === "branch") && winner.gatesPassed !== true) {
|
|
958
|
+
throw new Error(
|
|
959
|
+
`Refusing completion-mode=${effectiveMode}: apply gates did not pass for ${winner.variantId}`
|
|
960
|
+
);
|
|
961
|
+
}
|
|
962
|
+
switch (effectiveMode) {
|
|
963
|
+
case "isolated":
|
|
964
|
+
await applyIsolated(winner, context);
|
|
965
|
+
break;
|
|
966
|
+
case "pr":
|
|
967
|
+
await applyPr(winner, context);
|
|
968
|
+
break;
|
|
969
|
+
case "branch":
|
|
970
|
+
await applyBranch(winner, modeSource, context);
|
|
971
|
+
break;
|
|
972
|
+
default:
|
|
973
|
+
console.warn(
|
|
974
|
+
`Unknown completion mode: ${effectiveMode}; falling back to isolated.`
|
|
975
|
+
);
|
|
976
|
+
await applyIsolated(winner, context);
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
export {
|
|
981
|
+
acquireCheckoutMutationLock,
|
|
982
|
+
prepareUntrackedIntentIndex,
|
|
983
|
+
COMPETE_DIFF_BINARY_FLAGS,
|
|
984
|
+
COMPETE_GIT_APPLY_WHITESPACE_FLAGS,
|
|
985
|
+
COMPETE_DIFF_MAX_BUFFER_BYTES,
|
|
986
|
+
isRecoverableCompetitionDiff,
|
|
987
|
+
PR_REMOTE_OP_TIMEOUT_MS,
|
|
988
|
+
resolveEffectiveCompletionMode,
|
|
989
|
+
CompletionModeCancelledError,
|
|
990
|
+
applyCompletionMode
|
|
991
|
+
};
|
|
992
|
+
//# sourceMappingURL=chunk-BDATUDDJ.js.map
|