@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,877 @@
|
|
|
1
|
+
import {
|
|
2
|
+
execGit
|
|
3
|
+
} from "./chunk-KNDYMVWN.js";
|
|
4
|
+
import {
|
|
5
|
+
quotePosixShellArg
|
|
6
|
+
} from "./chunk-N5DX4JAK.js";
|
|
7
|
+
|
|
8
|
+
// src/cli/commands/setup-temp-cleanup.ts
|
|
9
|
+
import { randomUUID } from "crypto";
|
|
10
|
+
import { existsSync } from "fs";
|
|
11
|
+
import { chmod, mkdir, readFile, rename, unlink, writeFile } from "fs/promises";
|
|
12
|
+
import { homedir } from "os";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { execa as execa2 } from "execa";
|
|
15
|
+
|
|
16
|
+
// src/cli/commands/upgrade-support.ts
|
|
17
|
+
import fs from "fs";
|
|
18
|
+
import os from "os";
|
|
19
|
+
import path from "path";
|
|
20
|
+
import { fileURLToPath } from "url";
|
|
21
|
+
import { execa, execaSync } from "execa";
|
|
22
|
+
var DEFAULT_PACKAGE = "@poetic-ai/poetic";
|
|
23
|
+
var LEGACY_PACKAGE = "@poetic/cli";
|
|
24
|
+
var INSTALL_LOCK_DIR_NAME = "install.lock.d";
|
|
25
|
+
var INSTALL_LOCK_OWNER_FILE = "owner.json";
|
|
26
|
+
var DEFAULT_LOCK_TIMEOUT_MS = 3e4;
|
|
27
|
+
var DEFAULT_LOCK_STALE_MS = 36 * 6e4;
|
|
28
|
+
var DEFAULT_LOCK_RETRY_MS = 250;
|
|
29
|
+
var FULL_SHA_RE = /^[0-9a-f]{40}$/i;
|
|
30
|
+
var PARTIAL_SHA_RE = /^[0-9a-f]{7,39}$/i;
|
|
31
|
+
function defaultSleep(ms) {
|
|
32
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
33
|
+
}
|
|
34
|
+
function isPidAlive(pid) {
|
|
35
|
+
if (!Number.isInteger(pid) || pid <= 0) return false;
|
|
36
|
+
try {
|
|
37
|
+
process.kill(pid, 0);
|
|
38
|
+
return true;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
const code = error.code;
|
|
41
|
+
return code === "EPERM";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function poeticHomeDir(homeDir) {
|
|
45
|
+
return path.join(homeDir ?? os.homedir(), ".poetic");
|
|
46
|
+
}
|
|
47
|
+
function installManifestPath(homeDir) {
|
|
48
|
+
return path.join(poeticHomeDir(homeDir), "install.json");
|
|
49
|
+
}
|
|
50
|
+
function installLockDir(homeDir) {
|
|
51
|
+
return path.join(poeticHomeDir(homeDir), INSTALL_LOCK_DIR_NAME);
|
|
52
|
+
}
|
|
53
|
+
function readInstallLockOwner(lockDir) {
|
|
54
|
+
try {
|
|
55
|
+
const ownerPath = path.join(lockDir, INSTALL_LOCK_OWNER_FILE);
|
|
56
|
+
if (!fs.existsSync(ownerPath)) return void 0;
|
|
57
|
+
const raw = fs.readFileSync(ownerPath, "utf8");
|
|
58
|
+
const data = JSON.parse(raw);
|
|
59
|
+
if (typeof data.pid !== "number" || typeof data.hostname !== "string" || typeof data.startedAt !== "string" || typeof data.token !== "string") {
|
|
60
|
+
return void 0;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
pid: data.pid,
|
|
64
|
+
hostname: data.hostname,
|
|
65
|
+
startedAt: data.startedAt,
|
|
66
|
+
command: typeof data.command === "string" ? data.command : "unknown",
|
|
67
|
+
token: data.token
|
|
68
|
+
};
|
|
69
|
+
} catch {
|
|
70
|
+
return void 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function formatLockDiagnostics(lockDir, owner, alive, stale) {
|
|
74
|
+
const lines = [`Install lock is held at ${lockDir}.`];
|
|
75
|
+
if (!owner) {
|
|
76
|
+
lines.push("Owner metadata is missing or unreadable.");
|
|
77
|
+
} else {
|
|
78
|
+
lines.push(
|
|
79
|
+
`Owner: pid=${owner.pid} host=${owner.hostname} startedAt=${owner.startedAt} command=${owner.command}`
|
|
80
|
+
);
|
|
81
|
+
if (alive === false) lines.push("Owner process is not running (stale lock).");
|
|
82
|
+
if (alive === true) lines.push("Owner process appears to be running.");
|
|
83
|
+
}
|
|
84
|
+
if (stale) lines.push("Lock is considered stale and can be reclaimed.");
|
|
85
|
+
lines.push("Wait for the other upgrade/install to finish, or remove the stale lock directory.");
|
|
86
|
+
return lines.join(" ");
|
|
87
|
+
}
|
|
88
|
+
function writeLockOwner(lockDir, owner) {
|
|
89
|
+
const ownerPath = path.join(lockDir, INSTALL_LOCK_OWNER_FILE);
|
|
90
|
+
const tmp = path.join(lockDir, `.owner.${owner.pid}.${Date.now()}.tmp`);
|
|
91
|
+
fs.writeFileSync(tmp, `${JSON.stringify(owner, null, 2)}
|
|
92
|
+
`, "utf8");
|
|
93
|
+
fs.renameSync(tmp, ownerPath);
|
|
94
|
+
}
|
|
95
|
+
function releaseLockDir(lockDir, token) {
|
|
96
|
+
try {
|
|
97
|
+
const owner = readInstallLockOwner(lockDir);
|
|
98
|
+
if (owner && owner.token !== token) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const ownerPath = path.join(lockDir, INSTALL_LOCK_OWNER_FILE);
|
|
102
|
+
try {
|
|
103
|
+
fs.unlinkSync(ownerPath);
|
|
104
|
+
} catch {
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
for (const entry of fs.readdirSync(lockDir)) {
|
|
108
|
+
if (entry.startsWith(".owner.")) {
|
|
109
|
+
try {
|
|
110
|
+
fs.unlinkSync(path.join(lockDir, entry));
|
|
111
|
+
} catch {
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
} catch {
|
|
116
|
+
}
|
|
117
|
+
fs.rmdirSync(lockDir);
|
|
118
|
+
} catch {
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function isLockStale(lockDir, owner, staleMs, nowMs, pidAlive, localHostname) {
|
|
122
|
+
if (!owner) {
|
|
123
|
+
try {
|
|
124
|
+
const stat = fs.statSync(lockDir);
|
|
125
|
+
return { stale: nowMs - stat.mtimeMs > staleMs, alive: void 0 };
|
|
126
|
+
} catch {
|
|
127
|
+
return { stale: true, alive: void 0 };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (owner.hostname !== localHostname) {
|
|
131
|
+
const started2 = Date.parse(owner.startedAt);
|
|
132
|
+
return {
|
|
133
|
+
stale: Number.isFinite(started2) && nowMs - started2 > staleMs,
|
|
134
|
+
alive: void 0
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const alive = pidAlive(owner.pid);
|
|
138
|
+
if (!alive) return { stale: true, alive: false };
|
|
139
|
+
const started = Date.parse(owner.startedAt);
|
|
140
|
+
if (Number.isFinite(started) && nowMs - started > staleMs) {
|
|
141
|
+
return { stale: false, alive: true };
|
|
142
|
+
}
|
|
143
|
+
return { stale: false, alive: true };
|
|
144
|
+
}
|
|
145
|
+
async function acquireInstallLock(options = {}) {
|
|
146
|
+
const homeDir = options.homeDir;
|
|
147
|
+
const lockDir = installLockDir(homeDir);
|
|
148
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
|
|
149
|
+
const staleMs = options.staleMs ?? DEFAULT_LOCK_STALE_MS;
|
|
150
|
+
const retryMs = options.retryMs ?? DEFAULT_LOCK_RETRY_MS;
|
|
151
|
+
const nowFn = options.now ?? Date.now;
|
|
152
|
+
const sleepFn = options.sleep ?? defaultSleep;
|
|
153
|
+
const pidAlive = options.isPidAlive ?? isPidAlive;
|
|
154
|
+
const hostname = options.hostname ?? os.hostname();
|
|
155
|
+
const pid = options.pid ?? process.pid;
|
|
156
|
+
const command = options.command ?? "poetic upgrade";
|
|
157
|
+
const parent = poeticHomeDir(homeDir);
|
|
158
|
+
fs.mkdirSync(parent, { recursive: true });
|
|
159
|
+
const deadline = nowFn() + timeoutMs;
|
|
160
|
+
let lastDiagnostics = `Install lock is held at ${lockDir}.`;
|
|
161
|
+
while (true) {
|
|
162
|
+
const token = `${pid}:${nowFn()}:${Math.random().toString(16).slice(2)}`;
|
|
163
|
+
const owner = {
|
|
164
|
+
pid,
|
|
165
|
+
hostname,
|
|
166
|
+
startedAt: new Date(nowFn()).toISOString(),
|
|
167
|
+
command,
|
|
168
|
+
token
|
|
169
|
+
};
|
|
170
|
+
try {
|
|
171
|
+
fs.mkdirSync(lockDir);
|
|
172
|
+
try {
|
|
173
|
+
writeLockOwner(lockDir, owner);
|
|
174
|
+
} catch (error) {
|
|
175
|
+
try {
|
|
176
|
+
fs.rmdirSync(lockDir);
|
|
177
|
+
} catch {
|
|
178
|
+
}
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
lockDir,
|
|
183
|
+
owner,
|
|
184
|
+
release: () => releaseLockDir(lockDir, token)
|
|
185
|
+
};
|
|
186
|
+
} catch (error) {
|
|
187
|
+
const code = error.code;
|
|
188
|
+
if (code !== "EEXIST") throw error;
|
|
189
|
+
const existing = readInstallLockOwner(lockDir);
|
|
190
|
+
const { stale, alive } = isLockStale(lockDir, existing, staleMs, nowFn(), pidAlive, hostname);
|
|
191
|
+
lastDiagnostics = formatLockDiagnostics(lockDir, existing, alive, stale);
|
|
192
|
+
if (stale) {
|
|
193
|
+
try {
|
|
194
|
+
releaseLockDir(lockDir, existing?.token ?? "");
|
|
195
|
+
} catch {
|
|
196
|
+
}
|
|
197
|
+
if (!fs.existsSync(lockDir)) continue;
|
|
198
|
+
}
|
|
199
|
+
if (nowFn() >= deadline) {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`Error: could not acquire install lock within ${timeoutMs}ms. ${lastDiagnostics}`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
await sleepFn(retryMs);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function parseLsRemoteLines(stdout) {
|
|
209
|
+
const lines = stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
210
|
+
const out = [];
|
|
211
|
+
for (const line of lines) {
|
|
212
|
+
const [sha, ref] = line.split(/\s+/, 2);
|
|
213
|
+
if (sha && ref && FULL_SHA_RE.test(sha)) {
|
|
214
|
+
out.push({ sha: sha.toLowerCase(), ref });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
async function resolveGitCommitSha(repoUrl, ref, runLsRemote) {
|
|
220
|
+
const trimmed = ref.trim();
|
|
221
|
+
if (!trimmed) {
|
|
222
|
+
throw new Error("Error: git ref is empty");
|
|
223
|
+
}
|
|
224
|
+
if (FULL_SHA_RE.test(trimmed)) {
|
|
225
|
+
const result = await runLsRemote(repoUrl);
|
|
226
|
+
if (result.exitCode !== 0) {
|
|
227
|
+
throw new Error(
|
|
228
|
+
`Error: could not query advertised git identities from ${repoUrl}${result.stderr.trim() ? `: ${result.stderr.trim()}` : ` (exit ${result.exitCode})`}`
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
const rows = parseLsRemoteLines(result.stdout);
|
|
232
|
+
const peeledTags = new Set(
|
|
233
|
+
rows.filter((row) => row.ref.endsWith("^{}")).map((row) => row.ref.slice(0, -3))
|
|
234
|
+
);
|
|
235
|
+
const advertised = rows.some((row) => {
|
|
236
|
+
if (row.sha !== trimmed.toLowerCase()) return false;
|
|
237
|
+
const annotatedTagObject = row.ref.startsWith("refs/tags/") && !row.ref.endsWith("^{}") && peeledTags.has(row.ref);
|
|
238
|
+
return !annotatedTagObject;
|
|
239
|
+
});
|
|
240
|
+
if (advertised) return trimmed.toLowerCase();
|
|
241
|
+
throw new Error(`Error: full git SHA "${trimmed}" is not an advertised identity on ${repoUrl}`);
|
|
242
|
+
}
|
|
243
|
+
if (PARTIAL_SHA_RE.test(trimmed)) {
|
|
244
|
+
const result = await runLsRemote(repoUrl, trimmed);
|
|
245
|
+
const matches = parseLsRemoteLines(result.stdout).filter(
|
|
246
|
+
(row) => row.sha.startsWith(trimmed.toLowerCase())
|
|
247
|
+
);
|
|
248
|
+
const unique = [...new Set(matches.map((m) => m.sha))];
|
|
249
|
+
if (unique.length === 1) {
|
|
250
|
+
return unique[0];
|
|
251
|
+
}
|
|
252
|
+
if (unique.length > 1) {
|
|
253
|
+
throw new Error(
|
|
254
|
+
`Error: partial git SHA "${trimmed}" is ambiguous (${unique.length} matches). Use a full 40-character commit SHA.`
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
throw new Error(
|
|
258
|
+
`Error: partial git SHA "${trimmed}" could not be verified against ${repoUrl}. Use a full 40-character commit SHA.`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
const exactTag = await runLsRemote(repoUrl, `refs/tags/${trimmed}`);
|
|
262
|
+
const peeledTag = await runLsRemote(repoUrl, `refs/tags/${trimmed}^{}`);
|
|
263
|
+
const tagRows = [...parseLsRemoteLines(exactTag.stdout), ...parseLsRemoteLines(peeledTag.stdout)];
|
|
264
|
+
const peeled = tagRows.find((row) => row.ref === `refs/tags/${trimmed}^{}`);
|
|
265
|
+
if (peeled?.sha) {
|
|
266
|
+
return peeled.sha;
|
|
267
|
+
}
|
|
268
|
+
if (peeledTag.exitCode !== 0) {
|
|
269
|
+
throw new Error(
|
|
270
|
+
peeledTag.stderr.trim() || `Error: could not verify whether git tag "${trimmed}" is annotated on ${repoUrl}`
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
const lightweight = tagRows.find((row) => row.ref === `refs/tags/${trimmed}`);
|
|
274
|
+
if (lightweight?.sha) {
|
|
275
|
+
return lightweight.sha;
|
|
276
|
+
}
|
|
277
|
+
const headResult = await runLsRemote(repoUrl, `refs/heads/${trimmed}`);
|
|
278
|
+
if (headResult.exitCode === 0) {
|
|
279
|
+
const head = parseLsRemoteLines(headResult.stdout).find(
|
|
280
|
+
(row) => row.ref === `refs/heads/${trimmed}`
|
|
281
|
+
);
|
|
282
|
+
if (head?.sha) return head.sha;
|
|
283
|
+
}
|
|
284
|
+
throw new Error(
|
|
285
|
+
`Error: could not resolve git ref "${trimmed}" on ${repoUrl}. Named refs must resolve before install.`
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
async function resolvePackageVersionString(packageName, ref, runNpmView) {
|
|
289
|
+
const result = await runNpmView(packageName, ref);
|
|
290
|
+
if (result.exitCode !== 0) {
|
|
291
|
+
throw new Error(result.stderr.trim() || `Error: npm could not resolve ${packageName}@${ref}`);
|
|
292
|
+
}
|
|
293
|
+
const version = result.stdout.trim().split(/\r?\n/).at(-1)?.trim() ?? "";
|
|
294
|
+
if (!version) {
|
|
295
|
+
throw new Error(`Error: npm returned no version for ${packageName}@${ref}`);
|
|
296
|
+
}
|
|
297
|
+
if (!/^v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(version)) {
|
|
298
|
+
throw new Error(`Error: npm returned an invalid version for ${packageName}@${ref}`);
|
|
299
|
+
}
|
|
300
|
+
return version;
|
|
301
|
+
}
|
|
302
|
+
function packageInstallTarget(packageName, resolvedVersion) {
|
|
303
|
+
return `${packageName}@${resolvedVersion}`;
|
|
304
|
+
}
|
|
305
|
+
function gitInstallTarget(repository, resolvedFullCommit) {
|
|
306
|
+
if (!FULL_SHA_RE.test(resolvedFullCommit)) {
|
|
307
|
+
throw new Error(
|
|
308
|
+
`Error: git install target requires a full 40-character commit SHA, got "${resolvedFullCommit}"`
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
return `git+${repository}#${resolvedFullCommit.toLowerCase()}`;
|
|
312
|
+
}
|
|
313
|
+
function writeInstallManifestAtomic(manifest, options = {}) {
|
|
314
|
+
const manifestPath = options.manifestPath ?? installManifestPath(options.homeDir);
|
|
315
|
+
const dir = path.dirname(manifestPath);
|
|
316
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
317
|
+
const payload = `${JSON.stringify(manifest, null, 2)}
|
|
318
|
+
`;
|
|
319
|
+
const tmp = path.join(
|
|
320
|
+
dir,
|
|
321
|
+
`.install.json.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`
|
|
322
|
+
);
|
|
323
|
+
try {
|
|
324
|
+
fs.writeFileSync(tmp, payload, "utf8");
|
|
325
|
+
fs.renameSync(tmp, manifestPath);
|
|
326
|
+
} catch (error) {
|
|
327
|
+
try {
|
|
328
|
+
fs.unlinkSync(tmp);
|
|
329
|
+
} catch {
|
|
330
|
+
}
|
|
331
|
+
throw error;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function readInstallManifestFromDisk(options = {}) {
|
|
335
|
+
try {
|
|
336
|
+
const manifestPath = options.manifestPath ?? installManifestPath(options.homeDir);
|
|
337
|
+
if (!fs.existsSync(manifestPath)) return void 0;
|
|
338
|
+
const data = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
|
|
339
|
+
if (!data || typeof data !== "object") return void 0;
|
|
340
|
+
if (data.source === "package" || data.source === "git") {
|
|
341
|
+
return data;
|
|
342
|
+
}
|
|
343
|
+
if (typeof data.commit === "string" && data.commit.length > 0) {
|
|
344
|
+
return { ...data, source: "git", schema: 2 };
|
|
345
|
+
}
|
|
346
|
+
if (typeof data.version === "string" || typeof data.package === "string") {
|
|
347
|
+
return { ...data, source: "package", schema: 2 };
|
|
348
|
+
}
|
|
349
|
+
} catch {
|
|
350
|
+
}
|
|
351
|
+
return void 0;
|
|
352
|
+
}
|
|
353
|
+
function findPackageJson(startDir) {
|
|
354
|
+
let current = startDir;
|
|
355
|
+
while (true) {
|
|
356
|
+
const candidate = path.join(current, "package.json");
|
|
357
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
358
|
+
const parent = path.dirname(current);
|
|
359
|
+
if (parent === current) return void 0;
|
|
360
|
+
current = parent;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
function resolveNpmPrefix(installDir) {
|
|
364
|
+
if (installDir) return installDir;
|
|
365
|
+
try {
|
|
366
|
+
const result = execaSync("npm", ["config", "get", "prefix"]);
|
|
367
|
+
const prefix = result.stdout.trim();
|
|
368
|
+
return prefix || "";
|
|
369
|
+
} catch {
|
|
370
|
+
return "";
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
function detectLegacyPackageOnDisk(installDir) {
|
|
374
|
+
const prefix = resolveNpmPrefix(installDir);
|
|
375
|
+
if (!prefix) return false;
|
|
376
|
+
return fs.existsSync(path.join(prefix, "lib", "node_modules", LEGACY_PACKAGE, "package.json"));
|
|
377
|
+
}
|
|
378
|
+
function detectPackageOnDisk(packageName, installDir) {
|
|
379
|
+
const prefix = resolveNpmPrefix(installDir);
|
|
380
|
+
if (!prefix) return false;
|
|
381
|
+
return fs.existsSync(path.join(prefix, "lib", "node_modules", packageName, "package.json"));
|
|
382
|
+
}
|
|
383
|
+
function readInstalledPackageVersion(packageName, installDir) {
|
|
384
|
+
const prefix = resolveNpmPrefix(installDir);
|
|
385
|
+
if (!prefix) return void 0;
|
|
386
|
+
try {
|
|
387
|
+
const packageJsonPath = path.join(prefix, "lib", "node_modules", packageName, "package.json");
|
|
388
|
+
const parsed = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
389
|
+
return typeof parsed.version === "string" && parsed.version.trim() ? parsed.version.trim() : void 0;
|
|
390
|
+
} catch {
|
|
391
|
+
return void 0;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function snapshotInstallState(options) {
|
|
395
|
+
const packageName = options.packageName ?? DEFAULT_PACKAGE;
|
|
396
|
+
const manifestPath = installManifestPath(options.homeDir);
|
|
397
|
+
let manifestBytes = null;
|
|
398
|
+
try {
|
|
399
|
+
if (fs.existsSync(manifestPath)) {
|
|
400
|
+
manifestBytes = fs.readFileSync(manifestPath, "utf8");
|
|
401
|
+
}
|
|
402
|
+
} catch {
|
|
403
|
+
manifestBytes = null;
|
|
404
|
+
}
|
|
405
|
+
return {
|
|
406
|
+
manifestPath,
|
|
407
|
+
manifestBytes,
|
|
408
|
+
legacyPackagePresent: detectLegacyPackageOnDisk(options.installDir),
|
|
409
|
+
legacyPackageVersion: readInstalledPackageVersion(LEGACY_PACKAGE, options.installDir),
|
|
410
|
+
packagePresent: detectPackageOnDisk(packageName, options.installDir),
|
|
411
|
+
packageVersion: readInstalledPackageVersion(packageName, options.installDir),
|
|
412
|
+
prefix: resolveNpmPrefix(options.installDir),
|
|
413
|
+
capturedAt: (options.now ?? (() => /* @__PURE__ */ new Date()))().toISOString()
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
function preserveManifestBackup(snapshot, writeStderr) {
|
|
417
|
+
if (!snapshot.manifestBytes) return;
|
|
418
|
+
try {
|
|
419
|
+
const bakPath = `${snapshot.manifestPath}.bak`;
|
|
420
|
+
fs.writeFileSync(bakPath, snapshot.manifestBytes, "utf8");
|
|
421
|
+
writeStderr?.(`Previous manifest preserved at ${bakPath}.
|
|
422
|
+
`);
|
|
423
|
+
} catch {
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
function restoreManifestFromSnapshot(snapshot) {
|
|
427
|
+
if (snapshot.manifestBytes === null) {
|
|
428
|
+
try {
|
|
429
|
+
if (fs.existsSync(snapshot.manifestPath)) {
|
|
430
|
+
fs.unlinkSync(snapshot.manifestPath);
|
|
431
|
+
}
|
|
432
|
+
} catch {
|
|
433
|
+
}
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
const dir = path.dirname(snapshot.manifestPath);
|
|
437
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
438
|
+
const tmp = `${snapshot.manifestPath}.restore.${process.pid}.tmp`;
|
|
439
|
+
fs.writeFileSync(tmp, snapshot.manifestBytes, "utf8");
|
|
440
|
+
fs.renameSync(tmp, snapshot.manifestPath);
|
|
441
|
+
}
|
|
442
|
+
function detectSourceCheckout(options = {}) {
|
|
443
|
+
let entryPath = options.entryPath;
|
|
444
|
+
if (!entryPath) {
|
|
445
|
+
try {
|
|
446
|
+
entryPath = fileURLToPath(import.meta.url);
|
|
447
|
+
} catch {
|
|
448
|
+
entryPath = process.argv[1] ?? "";
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
const normalized = entryPath.replace(/\\/g, "/");
|
|
452
|
+
const packageName = options.packageName ?? DEFAULT_PACKAGE;
|
|
453
|
+
const packageRoot = findPackageJson(path.dirname(entryPath));
|
|
454
|
+
const hasTsx = process.argv.some((arg) => arg.includes("tsx")) || process.execArgv.some((arg) => arg.includes("tsx"));
|
|
455
|
+
let kind = "unknown";
|
|
456
|
+
if (hasTsx && !normalized.includes("/node_modules/")) {
|
|
457
|
+
kind = "development";
|
|
458
|
+
} else if (normalized.includes(`/node_modules/${packageName}/`)) {
|
|
459
|
+
try {
|
|
460
|
+
const real = fs.realpathSync(entryPath).replace(/\\/g, "/");
|
|
461
|
+
if (real !== normalized && !real.includes("/node_modules/")) {
|
|
462
|
+
kind = "npm-link";
|
|
463
|
+
} else if (normalized.includes("/lib/node_modules/") || normalized.includes("/.nvm/") || normalized.includes("/volta/")) {
|
|
464
|
+
kind = "global";
|
|
465
|
+
} else {
|
|
466
|
+
kind = "package";
|
|
467
|
+
}
|
|
468
|
+
} catch {
|
|
469
|
+
kind = "package";
|
|
470
|
+
}
|
|
471
|
+
} else if (normalized.includes("/dist/") && !normalized.includes("/node_modules/")) {
|
|
472
|
+
kind = "repo-dist";
|
|
473
|
+
} else if (["/lib/node_modules/", "/.npm/", "/nvm/", "/volta/"].some((p) => normalized.includes(p))) {
|
|
474
|
+
kind = "global";
|
|
475
|
+
} else if (packageRoot) {
|
|
476
|
+
const rootDir = path.dirname(packageRoot);
|
|
477
|
+
const hasSrc = fs.existsSync(path.join(rootDir, "src"));
|
|
478
|
+
const hasGit = fs.existsSync(path.join(rootDir, ".git"));
|
|
479
|
+
if (hasSrc && (hasGit || fs.existsSync(path.join(rootDir, "install.sh")))) {
|
|
480
|
+
kind = "source-checkout";
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
const isSourceLike = kind === "source-checkout" || kind === "npm-link" || kind === "repo-dist" || kind === "development";
|
|
484
|
+
const guidance = isSourceLike ? [
|
|
485
|
+
`This Poetic binary looks like a ${kind} (not a published package install).`,
|
|
486
|
+
"Refusing to default to the unpublished package channel from a source/link checkout.",
|
|
487
|
+
"Update from source instead:",
|
|
488
|
+
" git pull",
|
|
489
|
+
" ./scripts/build-poetic.sh",
|
|
490
|
+
"Do not run package-channel upgrade against a dirty source checkout.",
|
|
491
|
+
"If you intentionally want the published package, pass --source package --force after installing from npm."
|
|
492
|
+
] : [];
|
|
493
|
+
return {
|
|
494
|
+
kind,
|
|
495
|
+
isSourceLike,
|
|
496
|
+
entryPath,
|
|
497
|
+
packageRoot: packageRoot ? path.dirname(packageRoot) : void 0,
|
|
498
|
+
guidance
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
function defaultRunGitLsRemote(repoUrl, refspec) {
|
|
502
|
+
return execGit(["ls-remote", repoUrl, ...refspec ? [refspec] : []], { cwd: os.tmpdir() });
|
|
503
|
+
}
|
|
504
|
+
function defaultRunNpmViewVersion(packageName, ref) {
|
|
505
|
+
return execa("npm", ["view", `${packageName}@${ref}`, "version"], { reject: false }).then(
|
|
506
|
+
(result) => ({
|
|
507
|
+
exitCode: result.exitCode ?? 1,
|
|
508
|
+
stdout: result.stdout ?? "",
|
|
509
|
+
stderr: result.stderr ?? ""
|
|
510
|
+
})
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// src/cli/commands/setup-temp-cleanup.ts
|
|
515
|
+
var LABEL = "com.poetic.temp-cleanup";
|
|
516
|
+
var WRAPPER_DIR = join(homedir(), ".poetic", "bin");
|
|
517
|
+
var WRAPPER_PATH = join(WRAPPER_DIR, "poetic-cleanup");
|
|
518
|
+
var PLIST_DIR = join(homedir(), "Library", "LaunchAgents");
|
|
519
|
+
var PLIST_PATH = join(PLIST_DIR, `${LABEL}.plist`);
|
|
520
|
+
var LOG_DIR = join(homedir(), ".poetic", "logs");
|
|
521
|
+
var LOG_OUT = join(LOG_DIR, "temp-cleanup.log");
|
|
522
|
+
var LOG_ERR = join(LOG_DIR, "temp-cleanup-error.log");
|
|
523
|
+
async function resolvePoeticBinary() {
|
|
524
|
+
const prefix = readInstallManifestFromDisk()?.prefix;
|
|
525
|
+
if (prefix) {
|
|
526
|
+
const selectedBinary = join(prefix, "bin", "poetic");
|
|
527
|
+
if (existsSync(selectedBinary)) return selectedBinary;
|
|
528
|
+
}
|
|
529
|
+
try {
|
|
530
|
+
const { execFileSync } = await import("child_process");
|
|
531
|
+
const which = execFileSync("which", ["poetic"], { encoding: "utf8" }).trim();
|
|
532
|
+
if (which && existsSync(which)) {
|
|
533
|
+
return which;
|
|
534
|
+
}
|
|
535
|
+
} catch {
|
|
536
|
+
}
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
function shellUnescapeSingleQuoted(value) {
|
|
540
|
+
return value.replace(/'\\''/g, "'");
|
|
541
|
+
}
|
|
542
|
+
function buildCleanupArgs(config) {
|
|
543
|
+
const args = ["cleanup", "provider-temp", "--execute", "--silent"];
|
|
544
|
+
if (config.roots.length > 0) {
|
|
545
|
+
for (const root of config.roots) {
|
|
546
|
+
args.push("--root", root);
|
|
547
|
+
}
|
|
548
|
+
} else if (config.useDefaultRoots) {
|
|
549
|
+
args.push("--use-default-roots");
|
|
550
|
+
}
|
|
551
|
+
return args;
|
|
552
|
+
}
|
|
553
|
+
async function loadConfiguredRoots() {
|
|
554
|
+
try {
|
|
555
|
+
const { loadAllConfigSources } = await import("./config-loader-VPFPFO4B.js");
|
|
556
|
+
const sources = await loadAllConfigSources(process.cwd(), {});
|
|
557
|
+
let roots = [];
|
|
558
|
+
for (const source of sources) {
|
|
559
|
+
const cleanup = source.data?.cleanup;
|
|
560
|
+
if (cleanup?.providerTemp?.roots?.length) {
|
|
561
|
+
roots = cleanup.providerTemp.roots;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return roots;
|
|
565
|
+
} catch {
|
|
566
|
+
return [];
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
async function resolveTargetConfig(options) {
|
|
570
|
+
if (options?.roots && options.roots.length > 0) {
|
|
571
|
+
return { roots: options.roots, useDefaultRoots: false };
|
|
572
|
+
}
|
|
573
|
+
if (options?.useDefaultRoots) {
|
|
574
|
+
return { roots: [], useDefaultRoots: true };
|
|
575
|
+
}
|
|
576
|
+
const configuredRoots = await loadConfiguredRoots();
|
|
577
|
+
if (configuredRoots.length > 0) {
|
|
578
|
+
return { roots: configuredRoots, useDefaultRoots: false };
|
|
579
|
+
}
|
|
580
|
+
return {
|
|
581
|
+
error: "No provider temp roots configured. Set cleanup.providerTemp.roots, or re-run with --use-default-roots or --root <path>."
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
function generateWrapper(poeticBinary, targetConfig) {
|
|
585
|
+
const cleanupArgs = buildCleanupArgs(targetConfig).map((arg) => quotePosixShellArg(arg)).join(" ");
|
|
586
|
+
const invokeCmd = `exec "$POETIC_BIN" ${cleanupArgs}`;
|
|
587
|
+
const home = homedir();
|
|
588
|
+
return `#!/bin/bash
|
|
589
|
+
# Poetic temp cleanup wrapper \u2014 managed by \`poetic cleanup temp-agent\`
|
|
590
|
+
# Do not edit manually; re-run \`poetic cleanup temp-agent --install-launchagent\` to update.
|
|
591
|
+
|
|
592
|
+
set -euo pipefail
|
|
593
|
+
|
|
594
|
+
# LaunchAgents run with minimal environment \u2014 set HOME explicitly
|
|
595
|
+
export HOME=${quotePosixShellArg(home)}
|
|
596
|
+
|
|
597
|
+
# Verify the target binary exists; exit 0 (not 1) to avoid launchd backoff
|
|
598
|
+
POETIC_BIN=${quotePosixShellArg(poeticBinary)}
|
|
599
|
+
if [ ! -x "$POETIC_BIN" ]; then
|
|
600
|
+
echo "$(date -Iseconds) poetic-cleanup: binary not found at $POETIC_BIN \u2014 skipping" >> ${quotePosixShellArg(LOG_ERR)} 2>/dev/null || true
|
|
601
|
+
exit 0
|
|
602
|
+
fi
|
|
603
|
+
|
|
604
|
+
${invokeCmd}
|
|
605
|
+
`;
|
|
606
|
+
}
|
|
607
|
+
function generatePlist(intervalSeconds) {
|
|
608
|
+
const home = homedir();
|
|
609
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
610
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
611
|
+
<plist version="1.0">
|
|
612
|
+
<dict>
|
|
613
|
+
<key>Label</key>
|
|
614
|
+
<string>${LABEL}</string>
|
|
615
|
+
|
|
616
|
+
<key>ProgramArguments</key>
|
|
617
|
+
<array>
|
|
618
|
+
<string>${WRAPPER_PATH}</string>
|
|
619
|
+
</array>
|
|
620
|
+
|
|
621
|
+
<key>EnvironmentVariables</key>
|
|
622
|
+
<dict>
|
|
623
|
+
<key>HOME</key>
|
|
624
|
+
<string>${home}</string>
|
|
625
|
+
</dict>
|
|
626
|
+
|
|
627
|
+
<key>StartInterval</key>
|
|
628
|
+
<integer>${intervalSeconds}</integer>
|
|
629
|
+
|
|
630
|
+
<key>RunAtLoad</key>
|
|
631
|
+
<true/>
|
|
632
|
+
|
|
633
|
+
<key>StandardOutPath</key>
|
|
634
|
+
<string>${LOG_OUT}</string>
|
|
635
|
+
|
|
636
|
+
<key>StandardErrorPath</key>
|
|
637
|
+
<string>${LOG_ERR}</string>
|
|
638
|
+
|
|
639
|
+
<key>Nice</key>
|
|
640
|
+
<integer>10</integer>
|
|
641
|
+
|
|
642
|
+
<key>ProcessType</key>
|
|
643
|
+
<string>Background</string>
|
|
644
|
+
</dict>
|
|
645
|
+
</plist>
|
|
646
|
+
`;
|
|
647
|
+
}
|
|
648
|
+
async function writeFileAtomic(filePath, content, mode) {
|
|
649
|
+
const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
650
|
+
try {
|
|
651
|
+
await writeFile(tempPath, content, "utf8");
|
|
652
|
+
if (mode !== void 0) await chmod(tempPath, mode);
|
|
653
|
+
await rename(tempPath, filePath);
|
|
654
|
+
} catch (error) {
|
|
655
|
+
await unlink(tempPath).catch(() => void 0);
|
|
656
|
+
throw error;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
async function restoreFile(filePath, prior, mode) {
|
|
660
|
+
if (prior === null) {
|
|
661
|
+
await unlink(filePath).catch(() => void 0);
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
await writeFileAtomic(filePath, prior, mode);
|
|
665
|
+
}
|
|
666
|
+
async function unloadJob() {
|
|
667
|
+
const uid = process.getuid?.() ?? 501;
|
|
668
|
+
try {
|
|
669
|
+
await execa2("launchctl", ["bootout", `gui/${uid}`, PLIST_PATH], {
|
|
670
|
+
reject: false,
|
|
671
|
+
timeout: 1e4
|
|
672
|
+
});
|
|
673
|
+
} catch {
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
async function loadJob() {
|
|
677
|
+
const uid = process.getuid?.() ?? 501;
|
|
678
|
+
await execa2("launchctl", ["bootstrap", `gui/${uid}`, PLIST_PATH], {
|
|
679
|
+
timeout: 1e4
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
async function installTempCleanup(options) {
|
|
683
|
+
const effectiveIntervalMinutes = options?.intervalMinutes ?? 1440;
|
|
684
|
+
const intervalSeconds = effectiveIntervalMinutes * 60;
|
|
685
|
+
const poeticBinary = await resolvePoeticBinary();
|
|
686
|
+
if (!poeticBinary) {
|
|
687
|
+
return {
|
|
688
|
+
installed: false,
|
|
689
|
+
updated: false,
|
|
690
|
+
message: "Could not resolve poetic binary. Run from a built Poetic repo or ensure `poetic` is in PATH."
|
|
691
|
+
};
|
|
692
|
+
}
|
|
693
|
+
const targetConfig = await resolveTargetConfig(options);
|
|
694
|
+
if ("error" in targetConfig) {
|
|
695
|
+
return {
|
|
696
|
+
installed: false,
|
|
697
|
+
updated: false,
|
|
698
|
+
message: targetConfig.error
|
|
699
|
+
};
|
|
700
|
+
}
|
|
701
|
+
await mkdir(WRAPPER_DIR, { recursive: true });
|
|
702
|
+
await mkdir(PLIST_DIR, { recursive: true });
|
|
703
|
+
await mkdir(LOG_DIR, { recursive: true });
|
|
704
|
+
const wrapperContent = generateWrapper(poeticBinary, targetConfig);
|
|
705
|
+
let wrapperChanged = true;
|
|
706
|
+
if (existsSync(WRAPPER_PATH)) {
|
|
707
|
+
const existing = await readFile(WRAPPER_PATH, "utf8");
|
|
708
|
+
wrapperChanged = existing !== wrapperContent;
|
|
709
|
+
}
|
|
710
|
+
const priorWrapper = existsSync(WRAPPER_PATH) ? await readFile(WRAPPER_PATH, "utf8") : null;
|
|
711
|
+
const plistContent = generatePlist(intervalSeconds);
|
|
712
|
+
let plistChanged = true;
|
|
713
|
+
if (existsSync(PLIST_PATH)) {
|
|
714
|
+
const existing = await readFile(PLIST_PATH, "utf8");
|
|
715
|
+
plistChanged = existing !== plistContent;
|
|
716
|
+
}
|
|
717
|
+
const priorPlist = existsSync(PLIST_PATH) ? await readFile(PLIST_PATH, "utf8") : null;
|
|
718
|
+
try {
|
|
719
|
+
if (wrapperChanged) await writeFileAtomic(WRAPPER_PATH, wrapperContent, 493);
|
|
720
|
+
if (plistChanged) await writeFileAtomic(PLIST_PATH, plistContent);
|
|
721
|
+
await unloadJob();
|
|
722
|
+
await loadJob();
|
|
723
|
+
} catch (err) {
|
|
724
|
+
await restoreFile(WRAPPER_PATH, priorWrapper, 493);
|
|
725
|
+
await restoreFile(PLIST_PATH, priorPlist);
|
|
726
|
+
if (priorPlist !== null) await loadJob().catch(() => void 0);
|
|
727
|
+
return {
|
|
728
|
+
installed: false,
|
|
729
|
+
updated: false,
|
|
730
|
+
message: `Failed to load LaunchAgent: ${err instanceof Error ? err.message : String(err)}`
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
const updated = existsSync(PLIST_PATH) && (wrapperChanged || plistChanged);
|
|
734
|
+
return {
|
|
735
|
+
installed: true,
|
|
736
|
+
updated,
|
|
737
|
+
message: updated ? `LaunchAgent updated and loaded (interval: ${effectiveIntervalMinutes}m)` : `LaunchAgent installed and loaded (interval: ${effectiveIntervalMinutes}m)`
|
|
738
|
+
};
|
|
739
|
+
}
|
|
740
|
+
async function readInstalledTempCleanupOptions() {
|
|
741
|
+
if (!existsSync(WRAPPER_PATH) || !existsSync(PLIST_PATH)) return null;
|
|
742
|
+
try {
|
|
743
|
+
const [wrapper, plist] = await Promise.all([
|
|
744
|
+
readFile(WRAPPER_PATH, "utf8"),
|
|
745
|
+
readFile(PLIST_PATH, "utf8")
|
|
746
|
+
]);
|
|
747
|
+
const execLine = wrapper.match(/^exec "\$POETIC_BIN" (.+)$/m)?.[1] ?? "";
|
|
748
|
+
const args = [...execLine.matchAll(/'((?:'\\''|[^'])*)'/g)].map(
|
|
749
|
+
(match) => shellUnescapeSingleQuoted(match[1] ?? "")
|
|
750
|
+
);
|
|
751
|
+
const roots = [];
|
|
752
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
753
|
+
const root = args[index + 1];
|
|
754
|
+
if (args[index] === "--root" && root) roots.push(root);
|
|
755
|
+
}
|
|
756
|
+
const intervalSeconds = Number(
|
|
757
|
+
plist.match(/<key>StartInterval<\/key>\s*<integer>(\d+)<\/integer>/)?.[1]
|
|
758
|
+
);
|
|
759
|
+
if (!Number.isFinite(intervalSeconds) || intervalSeconds <= 0) return null;
|
|
760
|
+
return {
|
|
761
|
+
intervalMinutes: intervalSeconds / 60,
|
|
762
|
+
roots,
|
|
763
|
+
useDefaultRoots: args.includes("--use-default-roots")
|
|
764
|
+
};
|
|
765
|
+
} catch {
|
|
766
|
+
return null;
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
async function uninstallTempCleanup() {
|
|
770
|
+
let removed = false;
|
|
771
|
+
await unloadJob();
|
|
772
|
+
if (existsSync(PLIST_PATH)) {
|
|
773
|
+
await unlink(PLIST_PATH);
|
|
774
|
+
removed = true;
|
|
775
|
+
}
|
|
776
|
+
if (existsSync(WRAPPER_PATH)) {
|
|
777
|
+
await unlink(WRAPPER_PATH);
|
|
778
|
+
removed = true;
|
|
779
|
+
}
|
|
780
|
+
return {
|
|
781
|
+
removed,
|
|
782
|
+
message: removed ? "LaunchAgent and wrapper removed." : "LaunchAgent was not installed."
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
function parseWrapperPaths(content) {
|
|
786
|
+
const singleQuoted = "'((?:'\\\\''|[^'])*)'";
|
|
787
|
+
const binMatch = new RegExp(`^POETIC_BIN=${singleQuoted}$`, "m").exec(content) ?? /^POETIC_BIN="(.+)"$/m.exec(content);
|
|
788
|
+
const execMatch = new RegExp(`^exec ${singleQuoted} "\\$POETIC_BIN"(?:\\s|$)`, "m").exec(content) ?? /^exec "(.+)" "(.+)" /m.exec(content);
|
|
789
|
+
const binaryPath = binMatch?.[1] ? shellUnescapeSingleQuoted(binMatch[1]) : execMatch?.[2] ?? null;
|
|
790
|
+
const nodePath = execMatch?.[1] ? shellUnescapeSingleQuoted(execMatch[1]) : null;
|
|
791
|
+
return {
|
|
792
|
+
binaryPath,
|
|
793
|
+
nodePath
|
|
794
|
+
};
|
|
795
|
+
}
|
|
796
|
+
async function checkTempCleanupStatus() {
|
|
797
|
+
const wrapperExists = existsSync(WRAPPER_PATH);
|
|
798
|
+
const plistExists = existsSync(PLIST_PATH);
|
|
799
|
+
let jobLoaded = false;
|
|
800
|
+
try {
|
|
801
|
+
const result = await execa2("launchctl", ["list"], { timeout: 5e3 });
|
|
802
|
+
jobLoaded = result.stdout.includes(LABEL);
|
|
803
|
+
} catch {
|
|
804
|
+
}
|
|
805
|
+
let embeddedBinaryPath = null;
|
|
806
|
+
let embeddedBinaryExists = null;
|
|
807
|
+
let embeddedNodePath = null;
|
|
808
|
+
let embeddedNodeExists = null;
|
|
809
|
+
if (wrapperExists) {
|
|
810
|
+
try {
|
|
811
|
+
const wrapperContent = await readFile(WRAPPER_PATH, "utf8");
|
|
812
|
+
const { binaryPath, nodePath } = parseWrapperPaths(wrapperContent);
|
|
813
|
+
embeddedBinaryPath = binaryPath;
|
|
814
|
+
embeddedBinaryExists = binaryPath !== null ? existsSync(binaryPath) : null;
|
|
815
|
+
embeddedNodePath = nodePath;
|
|
816
|
+
embeddedNodeExists = nodePath !== null ? existsSync(nodePath) : null;
|
|
817
|
+
} catch {
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
const stale = (
|
|
821
|
+
// Partial install: one artifact is present without the other
|
|
822
|
+
wrapperExists !== plistExists || // Wrapper installed but unreadable or unparseable — can't validate its launcher
|
|
823
|
+
wrapperExists && embeddedBinaryPath === null || // Wrapper installed and parseable but one or both embedded paths are gone
|
|
824
|
+
embeddedBinaryExists === false || // Legacy wrappers pinned Node separately; retain that stale-path check.
|
|
825
|
+
embeddedNodeExists === false
|
|
826
|
+
);
|
|
827
|
+
return {
|
|
828
|
+
wrapperExists,
|
|
829
|
+
plistExists,
|
|
830
|
+
jobLoaded,
|
|
831
|
+
wrapperPath: WRAPPER_PATH,
|
|
832
|
+
plistPath: PLIST_PATH,
|
|
833
|
+
embeddedBinaryPath,
|
|
834
|
+
embeddedBinaryExists,
|
|
835
|
+
embeddedNodePath,
|
|
836
|
+
embeddedNodeExists,
|
|
837
|
+
stale
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
var __testOnly = {
|
|
841
|
+
buildCleanupArgs,
|
|
842
|
+
generateWrapper,
|
|
843
|
+
parseWrapperPaths,
|
|
844
|
+
resolvePoeticBinary,
|
|
845
|
+
resolveTargetConfig,
|
|
846
|
+
generatePlist,
|
|
847
|
+
writeFileAtomic,
|
|
848
|
+
WRAPPER_PATH,
|
|
849
|
+
PLIST_PATH
|
|
850
|
+
};
|
|
851
|
+
|
|
852
|
+
export {
|
|
853
|
+
DEFAULT_PACKAGE,
|
|
854
|
+
LEGACY_PACKAGE,
|
|
855
|
+
acquireInstallLock,
|
|
856
|
+
resolveGitCommitSha,
|
|
857
|
+
resolvePackageVersionString,
|
|
858
|
+
packageInstallTarget,
|
|
859
|
+
gitInstallTarget,
|
|
860
|
+
writeInstallManifestAtomic,
|
|
861
|
+
readInstallManifestFromDisk,
|
|
862
|
+
findPackageJson,
|
|
863
|
+
resolveNpmPrefix,
|
|
864
|
+
detectLegacyPackageOnDisk,
|
|
865
|
+
snapshotInstallState,
|
|
866
|
+
preserveManifestBackup,
|
|
867
|
+
restoreManifestFromSnapshot,
|
|
868
|
+
detectSourceCheckout,
|
|
869
|
+
defaultRunGitLsRemote,
|
|
870
|
+
defaultRunNpmViewVersion,
|
|
871
|
+
installTempCleanup,
|
|
872
|
+
readInstalledTempCleanupOptions,
|
|
873
|
+
uninstallTempCleanup,
|
|
874
|
+
checkTempCleanupStatus,
|
|
875
|
+
__testOnly
|
|
876
|
+
};
|
|
877
|
+
//# sourceMappingURL=chunk-WDUORIHF.js.map
|