@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,1024 @@
|
|
|
1
|
+
import {
|
|
2
|
+
queryCanonicalPlanningProjection
|
|
3
|
+
} from "./chunk-Z6PC7QX6.js";
|
|
4
|
+
import {
|
|
5
|
+
getAllTasks
|
|
6
|
+
} from "./chunk-5LTN43AS.js";
|
|
7
|
+
import {
|
|
8
|
+
calculateCapacity,
|
|
9
|
+
computeSprintTerminalReadiness,
|
|
10
|
+
getCurrentSprint,
|
|
11
|
+
listSprints,
|
|
12
|
+
listTasksInSprint
|
|
13
|
+
} from "./chunk-4YX7J6QL.js";
|
|
14
|
+
import {
|
|
15
|
+
getPlanningRoot
|
|
16
|
+
} from "./chunk-OPYFYTWQ.js";
|
|
17
|
+
import {
|
|
18
|
+
getBucketArchivePathByKind,
|
|
19
|
+
getBucketPathByKind,
|
|
20
|
+
listEnabledBuckets
|
|
21
|
+
} from "./chunk-HOYBYAOA.js";
|
|
22
|
+
import {
|
|
23
|
+
resolveDefaultBranch
|
|
24
|
+
} from "./chunk-XQD2B6BB.js";
|
|
25
|
+
import {
|
|
26
|
+
GitExecError,
|
|
27
|
+
execGit
|
|
28
|
+
} from "./chunk-KNDYMVWN.js";
|
|
29
|
+
import {
|
|
30
|
+
PLANNING_GIT_NETWORK_TIMEOUT_MS
|
|
31
|
+
} from "./chunk-LAMKBTXX.js";
|
|
32
|
+
import {
|
|
33
|
+
isSafeGitRemoteAndRef
|
|
34
|
+
} from "./chunk-QOCOVLUH.js";
|
|
35
|
+
import {
|
|
36
|
+
toRepoRelativePath
|
|
37
|
+
} from "./chunk-XZE4XARH.js";
|
|
38
|
+
import {
|
|
39
|
+
POETIC_DEFER_SYNC,
|
|
40
|
+
readEnv
|
|
41
|
+
} from "./chunk-5DLKYTQX.js";
|
|
42
|
+
|
|
43
|
+
// src/planning/git-sync.ts
|
|
44
|
+
import chalk from "chalk";
|
|
45
|
+
|
|
46
|
+
// src/planning/git-exec.ts
|
|
47
|
+
var NETWORK_GIT_SUBCOMMANDS = /* @__PURE__ */ new Set(["fetch", "ls-remote", "pull", "push"]);
|
|
48
|
+
async function runPlanningGit(args, options) {
|
|
49
|
+
const networkTimeoutMs = NETWORK_GIT_SUBCOMMANDS.has(args[0] ?? "") ? PLANNING_GIT_NETWORK_TIMEOUT_MS : void 0;
|
|
50
|
+
try {
|
|
51
|
+
const result = await execGit(args, {
|
|
52
|
+
cwd: options.cwd,
|
|
53
|
+
...options.env ? { env: options.env } : {},
|
|
54
|
+
...options.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : networkTimeoutMs !== void 0 ? { timeoutMs: networkTimeoutMs } : {}
|
|
55
|
+
});
|
|
56
|
+
if (options.reject !== false && result.exitCode !== 0) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`git ${args.join(" ")} failed with exit ${result.exitCode}: ${result.stderr}`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (options.reject === false && error instanceof GitExecError) {
|
|
64
|
+
return {
|
|
65
|
+
exitCode: void 0,
|
|
66
|
+
stdout: "",
|
|
67
|
+
stderr: error.message,
|
|
68
|
+
...error.timedOut ? { timedOut: true } : {}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/planning/remote-sync-verify.ts
|
|
76
|
+
import * as fs from "fs/promises";
|
|
77
|
+
import * as path from "path";
|
|
78
|
+
var DEFAULT_VERIFY_DELAYS_MS = [0, 2e3, 4e3];
|
|
79
|
+
function sleep(ms) {
|
|
80
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
81
|
+
}
|
|
82
|
+
async function resolveRemoteBranchSha(projectRoot, remote, remoteBranch) {
|
|
83
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranch)) {
|
|
84
|
+
return "";
|
|
85
|
+
}
|
|
86
|
+
const lsRemote = await runPlanningGit(["ls-remote", "--heads", "--", remote, remoteBranch], {
|
|
87
|
+
cwd: projectRoot,
|
|
88
|
+
reject: false
|
|
89
|
+
});
|
|
90
|
+
if (lsRemote.exitCode !== 0) {
|
|
91
|
+
return "";
|
|
92
|
+
}
|
|
93
|
+
return lsRemote.stdout.trim().split(/\s+/)[0] ?? "";
|
|
94
|
+
}
|
|
95
|
+
async function remoteContainsCommit(projectRoot, remote, remoteBranch, commitSha) {
|
|
96
|
+
const remoteSha = await resolveRemoteBranchSha(projectRoot, remote, remoteBranch);
|
|
97
|
+
if (!remoteSha) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
if (remoteSha === commitSha) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
const ancestorCheck = await runPlanningGit(
|
|
104
|
+
["merge-base", "--is-ancestor", commitSha, remoteSha],
|
|
105
|
+
{
|
|
106
|
+
cwd: projectRoot,
|
|
107
|
+
reject: false
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
return ancestorCheck.exitCode === 0;
|
|
111
|
+
}
|
|
112
|
+
async function remoteContainsPaths(projectRoot, remote, remoteBranch, relativePaths) {
|
|
113
|
+
const remoteRef = `${remote}/${remoteBranch}`;
|
|
114
|
+
for (const relativePath of relativePaths) {
|
|
115
|
+
const showResult = await runPlanningGit(["show", `${remoteRef}:${relativePath}`], {
|
|
116
|
+
cwd: projectRoot,
|
|
117
|
+
reject: false
|
|
118
|
+
});
|
|
119
|
+
if (showResult.exitCode !== 0) {
|
|
120
|
+
return { ok: false, missingPath: relativePath };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { ok: true };
|
|
124
|
+
}
|
|
125
|
+
async function verifyRemoteSyncPush(options) {
|
|
126
|
+
const {
|
|
127
|
+
projectRoot,
|
|
128
|
+
remote,
|
|
129
|
+
remoteBranch,
|
|
130
|
+
relativePaths,
|
|
131
|
+
expectedCommitSha,
|
|
132
|
+
maxAttempts = 3,
|
|
133
|
+
verifyDelaysMs = DEFAULT_VERIFY_DELAYS_MS
|
|
134
|
+
} = options;
|
|
135
|
+
if (!expectedCommitSha) {
|
|
136
|
+
return { ok: false, reason: "missing expected commit SHA for remote verification" };
|
|
137
|
+
}
|
|
138
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranch)) {
|
|
139
|
+
return {
|
|
140
|
+
ok: false,
|
|
141
|
+
reason: "upstream remote or branch name is not a safe git identifier"
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
145
|
+
const delayMs = verifyDelaysMs[attempt] ?? verifyDelaysMs.at(-1) ?? 0;
|
|
146
|
+
if (delayMs > 0) {
|
|
147
|
+
await sleep(delayMs);
|
|
148
|
+
}
|
|
149
|
+
const fetchResult = await runPlanningGit(["fetch", "--", remote, remoteBranch], {
|
|
150
|
+
cwd: projectRoot,
|
|
151
|
+
reject: false
|
|
152
|
+
});
|
|
153
|
+
if (fetchResult.exitCode !== 0) {
|
|
154
|
+
if (attempt === maxAttempts - 1) {
|
|
155
|
+
const fetchDetail = fetchResult.stderr?.split("\n").find((line) => line.trim().length > 0) ?? fetchResult.stdout?.split("\n").find((line) => line.trim().length > 0) ?? "fetch failed";
|
|
156
|
+
return {
|
|
157
|
+
ok: false,
|
|
158
|
+
reason: `remote verification fetch failed after ${maxAttempts} attempts: ${fetchDetail}`
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const remoteSha = await resolveRemoteBranchSha(projectRoot, remote, remoteBranch);
|
|
164
|
+
if (!remoteSha) {
|
|
165
|
+
if (attempt === maxAttempts - 1) {
|
|
166
|
+
return {
|
|
167
|
+
ok: false,
|
|
168
|
+
reason: `remote branch ${remote}/${remoteBranch} not found after push`
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const commitVisible = await remoteContainsCommit(
|
|
174
|
+
projectRoot,
|
|
175
|
+
remote,
|
|
176
|
+
remoteBranch,
|
|
177
|
+
expectedCommitSha
|
|
178
|
+
);
|
|
179
|
+
if (!commitVisible) {
|
|
180
|
+
if (attempt === maxAttempts - 1) {
|
|
181
|
+
return {
|
|
182
|
+
ok: false,
|
|
183
|
+
reason: `remote ${remote}/${remoteBranch} at ${remoteSha} does not contain pushed commit ${expectedCommitSha}`
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (relativePaths.length > 0) {
|
|
189
|
+
const pathCheck = await remoteContainsPaths(projectRoot, remote, remoteBranch, relativePaths);
|
|
190
|
+
if (!pathCheck.ok) {
|
|
191
|
+
if (attempt === maxAttempts - 1) {
|
|
192
|
+
return {
|
|
193
|
+
ok: false,
|
|
194
|
+
reason: `remote ${remote}/${remoteBranch} is missing synced path ${pathCheck.missingPath}`
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return { ok: true, remoteSha };
|
|
201
|
+
}
|
|
202
|
+
return { ok: false, reason: "remote verification failed after retries" };
|
|
203
|
+
}
|
|
204
|
+
function isRefspecPushTopology(localBranch, remoteBranch) {
|
|
205
|
+
return localBranch.length > 0 && remoteBranch.length > 0 && localBranch !== remoteBranch;
|
|
206
|
+
}
|
|
207
|
+
async function filterExistingRelativePaths(projectRoot, relativePaths) {
|
|
208
|
+
const existingPaths = [];
|
|
209
|
+
for (const relativePath of relativePaths) {
|
|
210
|
+
try {
|
|
211
|
+
await fs.access(path.join(projectRoot, relativePath));
|
|
212
|
+
existingPaths.push(relativePath);
|
|
213
|
+
} catch {
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return existingPaths;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// src/planning/git-sync.ts
|
|
220
|
+
var GENERATED_PLANNING_INDEX_CACHE_REL_PATH = ".poetic/planning/indexes";
|
|
221
|
+
function isDeferSyncEnabled() {
|
|
222
|
+
return readEnv(POETIC_DEFER_SYNC).value ?? false;
|
|
223
|
+
}
|
|
224
|
+
function isMissingRemoteError(output) {
|
|
225
|
+
return /does not appear to be a git repository|couldn't find remote ref|repository .* not found|no such remote/i.test(
|
|
226
|
+
output
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
var ManagedSyncBranchError = class extends Error {
|
|
230
|
+
branch;
|
|
231
|
+
defaultBranch;
|
|
232
|
+
constructor(message, details) {
|
|
233
|
+
super(message);
|
|
234
|
+
this.name = "ManagedSyncBranchError";
|
|
235
|
+
this.branch = details?.branch ?? "";
|
|
236
|
+
this.defaultBranch = details?.defaultBranch ?? "";
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
function formatManagedSyncBranchError(error) {
|
|
240
|
+
if (error.branch.length > 0 && error.defaultBranch.length > 0) {
|
|
241
|
+
return `Managed auto-sync refuses branch ${error.branch}; switch to ${error.defaultBranch} or use a dedicated backlog sync branch`;
|
|
242
|
+
}
|
|
243
|
+
return error.message;
|
|
244
|
+
}
|
|
245
|
+
function isManagedSyncBranchError(error) {
|
|
246
|
+
return error instanceof ManagedSyncBranchError || error instanceof Error && error.name === "ManagedSyncBranchError";
|
|
247
|
+
}
|
|
248
|
+
async function assertManagedSyncBranch(projectRoot, branch) {
|
|
249
|
+
const defaultBranch = await resolveDefaultBranch(projectRoot);
|
|
250
|
+
if (branch === defaultBranch || branch.startsWith("chore/backlog-sync-")) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
throw new ManagedSyncBranchError(
|
|
254
|
+
`Managed auto-sync refuses branch ${branch}; switch to ${defaultBranch} or use a dedicated backlog sync branch`,
|
|
255
|
+
{ branch, defaultBranch }
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
function firstGitLine(output) {
|
|
259
|
+
return output?.split("\n").find((line) => line.trim().length > 0)?.trim() ?? "unknown";
|
|
260
|
+
}
|
|
261
|
+
function splitNulTerminatedPaths(stdout) {
|
|
262
|
+
return stdout.split("\0").filter((entry) => entry.length > 0);
|
|
263
|
+
}
|
|
264
|
+
function isWithinRelPath(candidate, root) {
|
|
265
|
+
return candidate === root || candidate.startsWith(`${root}/`);
|
|
266
|
+
}
|
|
267
|
+
async function stageIgnoredTrackedPathsForSync(projectRoot, relRootPath) {
|
|
268
|
+
const trackedResult = await runPlanningGit(["ls-files", "-z", "--", relRootPath], {
|
|
269
|
+
cwd: projectRoot,
|
|
270
|
+
reject: false
|
|
271
|
+
});
|
|
272
|
+
if (trackedResult.exitCode !== 0 || trackedResult.stdout.length === 0) {
|
|
273
|
+
return [];
|
|
274
|
+
}
|
|
275
|
+
const trackedPaths = splitNulTerminatedPaths(trackedResult.stdout).filter(
|
|
276
|
+
(trackedPath) => isWithinRelPath(trackedPath, relRootPath)
|
|
277
|
+
);
|
|
278
|
+
if (trackedPaths.length === 0) {
|
|
279
|
+
return [];
|
|
280
|
+
}
|
|
281
|
+
const ignoredTrackedPaths = [];
|
|
282
|
+
for (const trackedPath of trackedPaths) {
|
|
283
|
+
const ignoreResult = await runPlanningGit(
|
|
284
|
+
["check-ignore", "--no-index", "-q", "--", trackedPath],
|
|
285
|
+
{
|
|
286
|
+
cwd: projectRoot,
|
|
287
|
+
reject: false
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
if (ignoreResult.exitCode === 0) {
|
|
291
|
+
ignoredTrackedPaths.push(trackedPath);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (ignoredTrackedPaths.length === 0) {
|
|
295
|
+
return [];
|
|
296
|
+
}
|
|
297
|
+
const rmResult = await runPlanningGit(
|
|
298
|
+
["rm", "--cached", "--ignore-unmatch", "--", ...ignoredTrackedPaths],
|
|
299
|
+
{
|
|
300
|
+
cwd: projectRoot,
|
|
301
|
+
reject: false
|
|
302
|
+
}
|
|
303
|
+
);
|
|
304
|
+
if (rmResult.exitCode !== 0) {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
return ignoredTrackedPaths;
|
|
308
|
+
}
|
|
309
|
+
async function stageGeneratedPlanningIndexCacheUntracking(projectRoot) {
|
|
310
|
+
return stageIgnoredTrackedPathsForSync(projectRoot, GENERATED_PLANNING_INDEX_CACHE_REL_PATH);
|
|
311
|
+
}
|
|
312
|
+
async function hasStagedChanges(projectRoot) {
|
|
313
|
+
const result = await runPlanningGit(["diff", "--cached", "--quiet"], {
|
|
314
|
+
cwd: projectRoot,
|
|
315
|
+
reject: false
|
|
316
|
+
});
|
|
317
|
+
return result.exitCode !== 0;
|
|
318
|
+
}
|
|
319
|
+
async function resolvePathsThisSyncWillStage(projectRoot, managedPaths, hadPreexistingStagedChanges) {
|
|
320
|
+
if (managedPaths.length === 0) {
|
|
321
|
+
return [];
|
|
322
|
+
}
|
|
323
|
+
if (!hadPreexistingStagedChanges) {
|
|
324
|
+
return [...managedPaths];
|
|
325
|
+
}
|
|
326
|
+
const alreadyStaged = new Set(await listStagedRelativePaths(projectRoot, managedPaths));
|
|
327
|
+
return managedPaths.filter((managedPath) => !alreadyStaged.has(managedPath));
|
|
328
|
+
}
|
|
329
|
+
async function unstageThisSyncPaths(projectRoot, paths) {
|
|
330
|
+
if (paths.length === 0) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
await runPlanningGit(["reset", "--", ...paths], {
|
|
334
|
+
cwd: projectRoot,
|
|
335
|
+
reject: false
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
async function snapshotStagedIndexEntries(projectRoot, paths) {
|
|
339
|
+
if (paths.length === 0) {
|
|
340
|
+
return [];
|
|
341
|
+
}
|
|
342
|
+
const result = await runPlanningGit(["ls-files", "-s", "-z", "--", ...paths], {
|
|
343
|
+
cwd: projectRoot,
|
|
344
|
+
reject: false
|
|
345
|
+
});
|
|
346
|
+
if (result.exitCode !== 0 || !result.stdout) {
|
|
347
|
+
return [];
|
|
348
|
+
}
|
|
349
|
+
const entries = [];
|
|
350
|
+
for (const record of result.stdout.split("\0")) {
|
|
351
|
+
if (!record) continue;
|
|
352
|
+
const match = record.match(/^(\d{6}) ([0-9a-f]{40,64}) \d+\t(.+)$/);
|
|
353
|
+
if (!match?.[1] || !match[2] || !match[3]) continue;
|
|
354
|
+
entries.push({ mode: match[1], sha: match[2], path: match[3] });
|
|
355
|
+
}
|
|
356
|
+
return entries;
|
|
357
|
+
}
|
|
358
|
+
async function restoreStagedIndexEntries(projectRoot, entries) {
|
|
359
|
+
for (const entry of entries) {
|
|
360
|
+
await runPlanningGit(["update-index", "--cacheinfo", entry.mode, entry.sha, entry.path], {
|
|
361
|
+
cwd: projectRoot,
|
|
362
|
+
reject: false
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
async function captureManagedSyncStaging(projectRoot, managedPaths, hadPreexistingStagedChanges) {
|
|
367
|
+
const pathsThisSyncWillStage = await resolvePathsThisSyncWillStage(
|
|
368
|
+
projectRoot,
|
|
369
|
+
managedPaths,
|
|
370
|
+
hadPreexistingStagedChanges
|
|
371
|
+
);
|
|
372
|
+
return {
|
|
373
|
+
pathsThisSyncWillStage,
|
|
374
|
+
overlappingStagedSnapshots: await snapshotStagedIndexEntries(
|
|
375
|
+
projectRoot,
|
|
376
|
+
managedPaths.filter((managedPath) => !pathsThisSyncWillStage.includes(managedPath))
|
|
377
|
+
)
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
async function abandonManagedSyncStaging(projectRoot, state) {
|
|
381
|
+
await unstageThisSyncPaths(projectRoot, state.pathsStagedByThisSync);
|
|
382
|
+
await restoreStagedIndexEntries(projectRoot, state.overlappingStagedSnapshots);
|
|
383
|
+
}
|
|
384
|
+
async function stageManagedSyncPaths(projectRoot, relativePaths, hadPreexistingStagedChanges) {
|
|
385
|
+
const captured = await captureManagedSyncStaging(
|
|
386
|
+
projectRoot,
|
|
387
|
+
relativePaths,
|
|
388
|
+
hadPreexistingStagedChanges
|
|
389
|
+
);
|
|
390
|
+
if (relativePaths.length > 0) {
|
|
391
|
+
await runPlanningGit(["add", ...relativePaths], { cwd: projectRoot });
|
|
392
|
+
}
|
|
393
|
+
const generatedCacheUntrackedPaths = hadPreexistingStagedChanges ? [] : await stageGeneratedPlanningIndexCacheUntracking(projectRoot);
|
|
394
|
+
return {
|
|
395
|
+
stagingState: {
|
|
396
|
+
overlappingStagedSnapshots: captured.overlappingStagedSnapshots,
|
|
397
|
+
pathsStagedByThisSync: [...captured.pathsThisSyncWillStage, ...generatedCacheUntrackedPaths]
|
|
398
|
+
},
|
|
399
|
+
generatedCacheUntrackedPaths
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
async function listStagedRelativePaths(projectRoot, pathspecs) {
|
|
403
|
+
if (pathspecs.length === 0) {
|
|
404
|
+
return [];
|
|
405
|
+
}
|
|
406
|
+
const result = await runPlanningGit(
|
|
407
|
+
["diff", "--cached", "--name-only", "-z", "--", ...pathspecs],
|
|
408
|
+
{ cwd: projectRoot, reject: false }
|
|
409
|
+
);
|
|
410
|
+
return splitNulTerminatedPaths(result.stdout);
|
|
411
|
+
}
|
|
412
|
+
async function verifyManagedSyncPushBoundary(projectRoot, remote, remoteBranch, preSyncHeadSha, remoteBranchExists) {
|
|
413
|
+
if (!preSyncHeadSha) {
|
|
414
|
+
return {
|
|
415
|
+
ok: false,
|
|
416
|
+
reason: "could not resolve the pre-sync commit",
|
|
417
|
+
kind: "unresolved-base"
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranchExists ? remoteBranch : "HEAD")) {
|
|
421
|
+
return {
|
|
422
|
+
ok: false,
|
|
423
|
+
reason: "upstream remote or branch name is not a safe git identifier",
|
|
424
|
+
kind: "unresolved-base"
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
const fetchResult = await runPlanningGit(
|
|
428
|
+
remoteBranchExists ? ["fetch", "--", remote, remoteBranch] : ["fetch", "--", remote],
|
|
429
|
+
{
|
|
430
|
+
cwd: projectRoot,
|
|
431
|
+
reject: false
|
|
432
|
+
}
|
|
433
|
+
);
|
|
434
|
+
if (fetchResult.exitCode !== 0) {
|
|
435
|
+
return {
|
|
436
|
+
ok: false,
|
|
437
|
+
reason: `fetch failed: ${firstGitLine(fetchResult.stderr ?? fetchResult.stdout)}`,
|
|
438
|
+
kind: "fetch-failed"
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
const ancestryResult = remoteBranchExists ? await runPlanningGit(["merge-base", "--is-ancestor", preSyncHeadSha, "FETCH_HEAD"], {
|
|
442
|
+
cwd: projectRoot,
|
|
443
|
+
reject: false
|
|
444
|
+
}) : await runPlanningGit(
|
|
445
|
+
[
|
|
446
|
+
"for-each-ref",
|
|
447
|
+
"--format=%(refname)",
|
|
448
|
+
"--contains",
|
|
449
|
+
preSyncHeadSha,
|
|
450
|
+
`refs/remotes/${remote}/`
|
|
451
|
+
],
|
|
452
|
+
{ cwd: projectRoot, reject: false }
|
|
453
|
+
);
|
|
454
|
+
const baseIsPublished = ancestryResult.exitCode === 0 && (remoteBranchExists || ancestryResult.stdout.trim().length > 0);
|
|
455
|
+
if (!baseIsPublished) {
|
|
456
|
+
return {
|
|
457
|
+
ok: false,
|
|
458
|
+
reason: "the local branch already contained commits not present on the remote before managed sync",
|
|
459
|
+
kind: "unpublished-base"
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
return { ok: true };
|
|
463
|
+
}
|
|
464
|
+
async function resolveManagedSyncPushCandidate(projectRoot, expectedParentSha, allowedPaths) {
|
|
465
|
+
const headResult = await runPlanningGit(["rev-parse", "HEAD"], {
|
|
466
|
+
cwd: projectRoot,
|
|
467
|
+
reject: false
|
|
468
|
+
});
|
|
469
|
+
const candidateSha = headResult.exitCode === 0 ? headResult.stdout.trim() : "";
|
|
470
|
+
if (!candidateSha || !expectedParentSha) {
|
|
471
|
+
return { ok: false, reason: "could not resolve the managed sync candidate or its parent" };
|
|
472
|
+
}
|
|
473
|
+
const parentResult = await runPlanningGit(["rev-parse", `${candidateSha}^`], {
|
|
474
|
+
cwd: projectRoot,
|
|
475
|
+
reject: false
|
|
476
|
+
});
|
|
477
|
+
if (parentResult.exitCode !== 0 || parentResult.stdout.trim() !== expectedParentSha) {
|
|
478
|
+
return {
|
|
479
|
+
ok: false,
|
|
480
|
+
reason: "the final candidate was not exactly one managed sync commit above the remote base"
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
const changedPathsResult = await runPlanningGit(
|
|
484
|
+
["diff-tree", "--no-commit-id", "--name-only", "-r", "-z", candidateSha],
|
|
485
|
+
{ cwd: projectRoot, reject: false }
|
|
486
|
+
);
|
|
487
|
+
const changedPaths = splitNulTerminatedPaths(changedPathsResult.stdout);
|
|
488
|
+
const allowedPathSet = new Set(allowedPaths);
|
|
489
|
+
if (changedPathsResult.exitCode !== 0 || changedPaths.length === 0 || changedPaths.some((changedPath) => !allowedPathSet.has(changedPath))) {
|
|
490
|
+
return {
|
|
491
|
+
ok: false,
|
|
492
|
+
reason: "the final candidate changed paths outside the managed sync scope"
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
return { ok: true, sha: candidateSha };
|
|
496
|
+
}
|
|
497
|
+
async function syncPlanningFiles(projectRoot, filePaths, commitMessage, options = {}) {
|
|
498
|
+
const warnOrThrow = (message) => {
|
|
499
|
+
if (options.strict) {
|
|
500
|
+
throw new Error(message);
|
|
501
|
+
}
|
|
502
|
+
if (!options.silent) {
|
|
503
|
+
console.log(chalk.yellow(` ${message}`));
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
const warnOrThrowRemoteSync = (message) => {
|
|
507
|
+
if (options.strict && !options.allowPushFailure) {
|
|
508
|
+
throw new Error(message);
|
|
509
|
+
}
|
|
510
|
+
if (!options.silent) {
|
|
511
|
+
console.log(chalk.yellow(` ${message}`));
|
|
512
|
+
}
|
|
513
|
+
};
|
|
514
|
+
const stagingState = {
|
|
515
|
+
pathsStagedByThisSync: [],
|
|
516
|
+
overlappingStagedSnapshots: []
|
|
517
|
+
};
|
|
518
|
+
try {
|
|
519
|
+
const relativePaths = [
|
|
520
|
+
...new Set(filePaths.map((fp) => toRepoRelativePath(projectRoot, fp)))
|
|
521
|
+
].filter((fp) => fp.length > 0);
|
|
522
|
+
if (relativePaths.length === 0) {
|
|
523
|
+
if (options.strict && options.requireStagedChanges) {
|
|
524
|
+
throw new Error("Sync made no staged changes: no managed paths were provided");
|
|
525
|
+
}
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
const syncablePaths = [];
|
|
529
|
+
for (const relativePath of relativePaths) {
|
|
530
|
+
const ignoreResult = await runPlanningGit(["check-ignore", "-q", "--", relativePath], {
|
|
531
|
+
cwd: projectRoot,
|
|
532
|
+
reject: false
|
|
533
|
+
});
|
|
534
|
+
if (ignoreResult.exitCode !== 0) {
|
|
535
|
+
syncablePaths.push(relativePath);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
const hadPreexistingStagedChanges = await hasStagedChanges(projectRoot);
|
|
539
|
+
const capturedStaging = await captureManagedSyncStaging(
|
|
540
|
+
projectRoot,
|
|
541
|
+
syncablePaths,
|
|
542
|
+
hadPreexistingStagedChanges
|
|
543
|
+
);
|
|
544
|
+
const pathsThisSyncWillStage = capturedStaging.pathsThisSyncWillStage;
|
|
545
|
+
stagingState.overlappingStagedSnapshots = capturedStaging.overlappingStagedSnapshots;
|
|
546
|
+
const generatedCacheUntrackedPaths = hadPreexistingStagedChanges ? [] : await stageGeneratedPlanningIndexCacheUntracking(projectRoot);
|
|
547
|
+
const canCommitAllStaged = generatedCacheUntrackedPaths.length > 0;
|
|
548
|
+
const commitPaths = [...syncablePaths, ...generatedCacheUntrackedPaths];
|
|
549
|
+
const commitManagedPaths = () => runPlanningGit(
|
|
550
|
+
canCommitAllStaged ? ["commit", "-m", commitMessage] : ["commit", "-m", commitMessage, "--", ...commitPaths],
|
|
551
|
+
{ cwd: projectRoot, reject: false }
|
|
552
|
+
);
|
|
553
|
+
if (commitPaths.length === 0) {
|
|
554
|
+
if (options.strict && options.requireStagedChanges) {
|
|
555
|
+
throw new Error(
|
|
556
|
+
`Sync made no staged changes for ignored paths: ${relativePaths.join(", ")}`
|
|
557
|
+
);
|
|
558
|
+
}
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
if (syncablePaths.length > 0) {
|
|
562
|
+
await runPlanningGit(["add", ...syncablePaths], { cwd: projectRoot });
|
|
563
|
+
}
|
|
564
|
+
stagingState.pathsStagedByThisSync = [
|
|
565
|
+
...pathsThisSyncWillStage,
|
|
566
|
+
...generatedCacheUntrackedPaths
|
|
567
|
+
];
|
|
568
|
+
const diffResult = await runPlanningGit(
|
|
569
|
+
canCommitAllStaged ? ["diff", "--cached", "--quiet"] : ["diff", "--cached", "--quiet", "--", ...commitPaths],
|
|
570
|
+
{
|
|
571
|
+
cwd: projectRoot,
|
|
572
|
+
reject: false
|
|
573
|
+
}
|
|
574
|
+
);
|
|
575
|
+
if (diffResult.exitCode === 0) {
|
|
576
|
+
if (options.strict && options.requireStagedChanges) {
|
|
577
|
+
throw new Error(`Sync made no staged changes for: ${commitPaths.join(", ")}`);
|
|
578
|
+
}
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
const branchResult = await runPlanningGit(["rev-parse", "--abbrev-ref", "HEAD"], {
|
|
582
|
+
cwd: projectRoot,
|
|
583
|
+
reject: false
|
|
584
|
+
});
|
|
585
|
+
const branch = branchResult.exitCode === 0 ? branchResult.stdout.trim() : "";
|
|
586
|
+
if (!branch || branch === "HEAD") {
|
|
587
|
+
const detachedCommit = await commitManagedPaths();
|
|
588
|
+
if (detachedCommit.exitCode === 0) {
|
|
589
|
+
warnOrThrowRemoteSync("Committed locally (detached HEAD - skipped push)");
|
|
590
|
+
} else {
|
|
591
|
+
warnOrThrow(
|
|
592
|
+
`Commit failed (detached HEAD): ${detachedCommit.stderr?.split("\n")[0] ?? detachedCommit.stdout?.split("\n")[0] ?? "unknown"}`
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
await assertManagedSyncBranch(projectRoot, branch);
|
|
598
|
+
const upstreamResult = await runPlanningGit(
|
|
599
|
+
["rev-parse", "--abbrev-ref", `${branch}@{upstream}`],
|
|
600
|
+
{ cwd: projectRoot, reject: false }
|
|
601
|
+
);
|
|
602
|
+
let remote = "origin";
|
|
603
|
+
let remoteBranch = branch;
|
|
604
|
+
const hasUpstream = upstreamResult.exitCode === 0;
|
|
605
|
+
if (hasUpstream) {
|
|
606
|
+
const upstream = upstreamResult.stdout.trim();
|
|
607
|
+
const slashIdx = upstream.indexOf("/");
|
|
608
|
+
if (slashIdx > 0) {
|
|
609
|
+
remote = upstream.slice(0, slashIdx);
|
|
610
|
+
remoteBranch = upstream.slice(slashIdx + 1);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
if (!isSafeGitRemoteAndRef(remote, remoteBranch)) {
|
|
614
|
+
const unsafeCommit = await commitManagedPaths();
|
|
615
|
+
if (unsafeCommit.exitCode !== 0) {
|
|
616
|
+
warnOrThrow(`Commit failed: ${unsafeCommit.stderr?.split("\n")[0] ?? "unknown"}`);
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
warnOrThrowRemoteSync(
|
|
620
|
+
"Committed locally but upstream remote or branch name is not a safe git identifier - push skipped"
|
|
621
|
+
);
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
const preSyncHeadResult = await runPlanningGit(["rev-parse", "HEAD"], {
|
|
625
|
+
cwd: projectRoot,
|
|
626
|
+
reject: false
|
|
627
|
+
});
|
|
628
|
+
const preSyncHeadSha = preSyncHeadResult.exitCode === 0 ? preSyncHeadResult.stdout.trim() : "";
|
|
629
|
+
const remoteBranchResult = await runPlanningGit(
|
|
630
|
+
["ls-remote", "--heads", "--", remote, remoteBranch],
|
|
631
|
+
{
|
|
632
|
+
cwd: projectRoot,
|
|
633
|
+
reject: false
|
|
634
|
+
}
|
|
635
|
+
);
|
|
636
|
+
const remoteBranchExists = remoteBranchResult.stdout.trim().length > 0;
|
|
637
|
+
if (remoteBranchResult.exitCode !== 0 && isMissingRemoteError(`${remoteBranchResult.stderr ?? ""}
|
|
638
|
+
${remoteBranchResult.stdout ?? ""}`)) {
|
|
639
|
+
const offlineCommit = await commitManagedPaths();
|
|
640
|
+
if (offlineCommit.exitCode !== 0) {
|
|
641
|
+
warnOrThrow(`Commit failed: ${offlineCommit.stderr?.split("\n")[0] ?? "unknown"}`);
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
warnOrThrowRemoteSync("Committed locally; no remote repository configured - push skipped");
|
|
645
|
+
return;
|
|
646
|
+
}
|
|
647
|
+
const pushBoundary = await verifyManagedSyncPushBoundary(
|
|
648
|
+
projectRoot,
|
|
649
|
+
remote,
|
|
650
|
+
remoteBranch,
|
|
651
|
+
preSyncHeadSha,
|
|
652
|
+
remoteBranchExists
|
|
653
|
+
);
|
|
654
|
+
if (!pushBoundary.ok && pushBoundary.kind === "unpublished-base") {
|
|
655
|
+
warnOrThrowRemoteSync(
|
|
656
|
+
`Not committed: ${pushBoundary.reason} - managed changes left staged, push skipped`
|
|
657
|
+
);
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
const commitResult = await commitManagedPaths();
|
|
661
|
+
if (commitResult.exitCode !== 0) {
|
|
662
|
+
warnOrThrow(`Commit failed: ${commitResult.stderr?.split("\n")[0] ?? "unknown"}`);
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
if (!pushBoundary.ok) {
|
|
666
|
+
warnOrThrowRemoteSync(`Committed locally but ${pushBoundary.reason} - push skipped`);
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
const refspecTopology = isRefspecPushTopology(branch, remoteBranch);
|
|
670
|
+
const maxSyncAttempts = refspecTopology ? 1 : 3;
|
|
671
|
+
for (let attempt = 1; attempt <= maxSyncAttempts; attempt++) {
|
|
672
|
+
let expectedParentSha = preSyncHeadSha;
|
|
673
|
+
if (remoteBranchExists && !refspecTopology) {
|
|
674
|
+
const remoteHeadResult = await runPlanningGit(["rev-parse", "FETCH_HEAD"], {
|
|
675
|
+
cwd: projectRoot,
|
|
676
|
+
reject: false
|
|
677
|
+
});
|
|
678
|
+
expectedParentSha = remoteHeadResult.exitCode === 0 ? remoteHeadResult.stdout.trim() : "";
|
|
679
|
+
const rebaseResult = await runPlanningGit(["rebase", "FETCH_HEAD"], {
|
|
680
|
+
cwd: projectRoot,
|
|
681
|
+
reject: false
|
|
682
|
+
});
|
|
683
|
+
if (rebaseResult.exitCode !== 0) {
|
|
684
|
+
const rebaseStderr = rebaseResult.stderr ?? "";
|
|
685
|
+
const rebaseStdout = rebaseResult.stdout ?? "";
|
|
686
|
+
const rebaseOutputCombined = `${rebaseStderr}
|
|
687
|
+
${rebaseStdout}`.toLowerCase();
|
|
688
|
+
const isConflict = rebaseOutputCombined.includes("conflict") || rebaseOutputCombined.includes("could not apply");
|
|
689
|
+
await runPlanningGit(["rebase", "--abort"], { cwd: projectRoot, reject: false });
|
|
690
|
+
const reason = isConflict ? "rebase conflicted (aborted rebase)" : `rebase failed: ${firstGitLine(rebaseStderr || rebaseStdout)}`;
|
|
691
|
+
warnOrThrowRemoteSync(`Committed locally but ${reason} - push skipped`);
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
const candidate = await resolveManagedSyncPushCandidate(
|
|
696
|
+
projectRoot,
|
|
697
|
+
expectedParentSha,
|
|
698
|
+
commitPaths
|
|
699
|
+
);
|
|
700
|
+
if (!candidate.ok) {
|
|
701
|
+
warnOrThrowRemoteSync(`Committed locally but ${candidate.reason} - push skipped`);
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
const shouldSetUpstream = !hasUpstream || !remoteBranchExists;
|
|
705
|
+
const pushArgs = shouldSetUpstream ? ["push", "-u", "--", remote, `${candidate.sha}:refs/heads/${remoteBranch}`] : ["push", "--", remote, `${candidate.sha}:${remoteBranch}`];
|
|
706
|
+
const pushResult = await runPlanningGit(pushArgs, {
|
|
707
|
+
cwd: projectRoot,
|
|
708
|
+
reject: false
|
|
709
|
+
});
|
|
710
|
+
if (pushResult.exitCode === 0) {
|
|
711
|
+
const verifyResult = await verifyRemoteSyncPush({
|
|
712
|
+
projectRoot,
|
|
713
|
+
remote,
|
|
714
|
+
remoteBranch,
|
|
715
|
+
relativePaths: await filterExistingRelativePaths(projectRoot, syncablePaths),
|
|
716
|
+
expectedCommitSha: candidate.sha
|
|
717
|
+
});
|
|
718
|
+
if (verifyResult.ok) {
|
|
719
|
+
if (!options.silent) {
|
|
720
|
+
console.log(chalk.gray(" Synced to remote"));
|
|
721
|
+
}
|
|
722
|
+
return;
|
|
723
|
+
}
|
|
724
|
+
warnOrThrowRemoteSync(
|
|
725
|
+
`Committed locally but remote verification failed: ${verifyResult.reason} - treat push as failed`
|
|
726
|
+
);
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
const pushOutput = `${pushResult.stderr ?? ""}
|
|
730
|
+
${pushResult.stdout ?? ""}`;
|
|
731
|
+
const pushError = pushOutput.toLowerCase();
|
|
732
|
+
const isNonFastForward = pushError.includes("non-fast-forward") || pushError.includes("fetch first") || pushError.includes("failed to push some refs");
|
|
733
|
+
if (!isNonFastForward || attempt === maxSyncAttempts) {
|
|
734
|
+
if (isMissingRemoteError(pushOutput)) {
|
|
735
|
+
warnOrThrowRemoteSync(
|
|
736
|
+
"Committed locally; no remote repository configured - push skipped"
|
|
737
|
+
);
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
warnOrThrowRemoteSync(
|
|
741
|
+
`Committed locally but push failed: ${firstGitLine(pushResult.stderr ?? pushResult.stdout)}`
|
|
742
|
+
);
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
const refreshedBoundary = await verifyManagedSyncPushBoundary(
|
|
746
|
+
projectRoot,
|
|
747
|
+
remote,
|
|
748
|
+
remoteBranch,
|
|
749
|
+
preSyncHeadSha,
|
|
750
|
+
true
|
|
751
|
+
);
|
|
752
|
+
if (!refreshedBoundary.ok) {
|
|
753
|
+
warnOrThrowRemoteSync(`Committed locally but ${refreshedBoundary.reason} - push skipped`);
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
} catch (error) {
|
|
758
|
+
if (isManagedSyncBranchError(error)) {
|
|
759
|
+
await abandonManagedSyncStaging(projectRoot, stagingState);
|
|
760
|
+
throw error;
|
|
761
|
+
}
|
|
762
|
+
if (options.strict) {
|
|
763
|
+
throw error;
|
|
764
|
+
}
|
|
765
|
+
if (!options.silent) {
|
|
766
|
+
console.log(
|
|
767
|
+
chalk.yellow(
|
|
768
|
+
` Auto-sync failed: ${error.message?.split("\n")[0] ?? "unknown error"}`
|
|
769
|
+
)
|
|
770
|
+
);
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
async function syncManagedItemFiles(projectRoot, filePaths, commitMessage, options = {}) {
|
|
775
|
+
if (options.sync === false) {
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
778
|
+
if (isDeferSyncEnabled()) {
|
|
779
|
+
return;
|
|
780
|
+
}
|
|
781
|
+
await syncPlanningFiles(projectRoot, filePaths, commitMessage, {
|
|
782
|
+
silent: options.silent ?? false
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
// src/planning/team-visibility-read-model.ts
|
|
787
|
+
import * as path2 from "path";
|
|
788
|
+
function unavailable(reason) {
|
|
789
|
+
return { status: "unavailable", reason };
|
|
790
|
+
}
|
|
791
|
+
function available(value) {
|
|
792
|
+
return { status: "available", value };
|
|
793
|
+
}
|
|
794
|
+
function projectUpdateAge(updatedAt, nowMs) {
|
|
795
|
+
const updatedAtMs = Date.parse(updatedAt);
|
|
796
|
+
if (!Number.isFinite(updatedAtMs)) {
|
|
797
|
+
return unavailable("Task update timestamp is invalid");
|
|
798
|
+
}
|
|
799
|
+
if (updatedAtMs > nowMs) {
|
|
800
|
+
return unavailable("Task update timestamp is in the future");
|
|
801
|
+
}
|
|
802
|
+
return available(nowMs - updatedAtMs);
|
|
803
|
+
}
|
|
804
|
+
function projectActiveTeamWork(tasks, options = {}) {
|
|
805
|
+
const nowMs = (options.now ?? /* @__PURE__ */ new Date()).getTime();
|
|
806
|
+
const branchesByTaskId = new Map(
|
|
807
|
+
(options.branches ?? []).filter((entry) => entry.branch.trim().length > 0).map((entry) => [entry.taskId, entry.branch.trim()])
|
|
808
|
+
);
|
|
809
|
+
return tasks.filter((task) => task.status === "in_progress").map((task) => {
|
|
810
|
+
const assignee = task.assignee?.trim();
|
|
811
|
+
const branch = branchesByTaskId.get(task.id);
|
|
812
|
+
return {
|
|
813
|
+
id: task.id,
|
|
814
|
+
title: task.title,
|
|
815
|
+
status: task.status,
|
|
816
|
+
assignee: assignee ? available(assignee) : unavailable("Task has no assignee"),
|
|
817
|
+
branch: branch ? available(branch) : unavailable("No branch evidence is associated with this task"),
|
|
818
|
+
updatedAt: task.updated_at,
|
|
819
|
+
updateAgeMs: projectUpdateAge(task.updated_at, nowMs)
|
|
820
|
+
};
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
function planningPathspecs(repoRoot) {
|
|
824
|
+
return Array.from(
|
|
825
|
+
new Set(
|
|
826
|
+
listEnabledBuckets(repoRoot).flatMap((bucket) => [
|
|
827
|
+
getBucketPathByKind(bucket.name, repoRoot),
|
|
828
|
+
getBucketArchivePathByKind(bucket.name, repoRoot)
|
|
829
|
+
]).map((bucketPath) => path2.relative(repoRoot, bucketPath).replace(/\\/g, "/")).filter((bucketPath) => bucketPath.length > 0 && !bucketPath.startsWith("..")).sort()
|
|
830
|
+
)
|
|
831
|
+
);
|
|
832
|
+
}
|
|
833
|
+
async function queryUnpushedPlanningCommits(repoRoot, git) {
|
|
834
|
+
let pathspecs;
|
|
835
|
+
try {
|
|
836
|
+
pathspecs = planningPathspecs(repoRoot);
|
|
837
|
+
} catch (error) {
|
|
838
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
839
|
+
return unavailable(`Planning bucket paths are unavailable: ${message}`);
|
|
840
|
+
}
|
|
841
|
+
if (pathspecs.length === 0) {
|
|
842
|
+
return unavailable("No enabled planning bucket paths are configured");
|
|
843
|
+
}
|
|
844
|
+
try {
|
|
845
|
+
const upstream = await git(
|
|
846
|
+
["rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}"],
|
|
847
|
+
{ cwd: repoRoot }
|
|
848
|
+
);
|
|
849
|
+
const upstreamRef = upstream.stdout.trim();
|
|
850
|
+
if (upstream.exitCode !== 0 || upstreamRef.length === 0) {
|
|
851
|
+
return unavailable("Current branch has no available upstream tracking ref");
|
|
852
|
+
}
|
|
853
|
+
const countResult = await git(
|
|
854
|
+
["rev-list", "--count", `${upstreamRef}..HEAD`, "--", ...pathspecs],
|
|
855
|
+
{ cwd: repoRoot }
|
|
856
|
+
);
|
|
857
|
+
const countText = countResult.stdout.trim();
|
|
858
|
+
const count = Number.parseInt(countText, 10);
|
|
859
|
+
if (countResult.exitCode !== 0 || !/^\d+$/.test(countText) || !Number.isSafeInteger(count) || count < 0) {
|
|
860
|
+
return unavailable("Git could not determine the unpushed planning commit count");
|
|
861
|
+
}
|
|
862
|
+
return available(count);
|
|
863
|
+
} catch (error) {
|
|
864
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
865
|
+
return unavailable(`Git evidence is unavailable: ${message}`);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
async function queryPlanningSyncHealth(options) {
|
|
869
|
+
const lastSyncFailure = options.lastSyncFailure;
|
|
870
|
+
const failureMessage = lastSyncFailure?.message.trim();
|
|
871
|
+
return {
|
|
872
|
+
advisory: true,
|
|
873
|
+
deferSyncActive: options.deferSyncEnabled ?? isDeferSyncEnabled(),
|
|
874
|
+
unpushedPlanningCommits: await queryUnpushedPlanningCommits(
|
|
875
|
+
options.repoRoot,
|
|
876
|
+
options.git ?? execGit
|
|
877
|
+
),
|
|
878
|
+
lastSyncFailure: lastSyncFailure && failureMessage ? available({ ...lastSyncFailure, message: failureMessage }) : unavailable("Planning sync failures are not persisted by the current sync path")
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
async function queryTeamVisibility(options) {
|
|
882
|
+
const now = options.now ?? /* @__PURE__ */ new Date();
|
|
883
|
+
const [work, syncHealth] = await Promise.all([
|
|
884
|
+
Promise.resolve(projectActiveTeamWork(options.tasks, { branches: options.branches, now })),
|
|
885
|
+
queryPlanningSyncHealth(options)
|
|
886
|
+
]);
|
|
887
|
+
return { observedAt: now.toISOString(), work, syncHealth };
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
// src/planning/planning-workspace-envelope.ts
|
|
891
|
+
var PLANNING_WORKSPACE_ENVELOPE_VERSION = "1.0.0";
|
|
892
|
+
function unavailable2(error) {
|
|
893
|
+
return { state: "unavailable", reason: error instanceof Error ? error.message : String(error) };
|
|
894
|
+
}
|
|
895
|
+
async function defaultTeamVisibility() {
|
|
896
|
+
const tasks = await getAllTasks();
|
|
897
|
+
return queryTeamVisibility({
|
|
898
|
+
repoRoot: getPlanningRoot(),
|
|
899
|
+
tasks: tasks.map((task) => task.yaml)
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
async function buildPlanningWorkspaceEnvelopeV1(readers = {}) {
|
|
903
|
+
const [canonicalResult, visibilityResult] = await Promise.allSettled([
|
|
904
|
+
(readers.queryCanonical ?? queryCanonicalPlanningProjection)(),
|
|
905
|
+
(readers.queryTeamVisibility ?? defaultTeamVisibility)()
|
|
906
|
+
]);
|
|
907
|
+
return {
|
|
908
|
+
schemaVersion: PLANNING_WORKSPACE_ENVELOPE_VERSION,
|
|
909
|
+
canonical: canonicalResult.status === "fulfilled" ? {
|
|
910
|
+
state: "available",
|
|
911
|
+
value: {
|
|
912
|
+
activeSprint: canonicalResult.value.activeSprint,
|
|
913
|
+
tasks: canonicalResult.value.tasks,
|
|
914
|
+
// Preserve Poetic order and whyIncluded; BB must not re-rank.
|
|
915
|
+
nextCandidates: canonicalResult.value.nextCandidates
|
|
916
|
+
}
|
|
917
|
+
} : unavailable2(canonicalResult.reason),
|
|
918
|
+
teamVisibility: visibilityResult.status === "fulfilled" ? { state: "available", value: visibilityResult.value } : unavailable2(visibilityResult.reason)
|
|
919
|
+
};
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
// src/planning/sprint-status-read-model.ts
|
|
923
|
+
async function querySprintStatus(sprintId) {
|
|
924
|
+
let targetSprintId = sprintId;
|
|
925
|
+
if (!targetSprintId) {
|
|
926
|
+
const current = await getCurrentSprint();
|
|
927
|
+
if (!current) return null;
|
|
928
|
+
targetSprintId = current.yaml.id;
|
|
929
|
+
}
|
|
930
|
+
const [capacity, allTasks, activeSprints, archivedSprints, repositoryTasks] = await Promise.all([
|
|
931
|
+
calculateCapacity(targetSprintId),
|
|
932
|
+
listTasksInSprint(targetSprintId),
|
|
933
|
+
listSprints(false),
|
|
934
|
+
listSprints(true),
|
|
935
|
+
getAllTasks({ includeArchive: true })
|
|
936
|
+
]);
|
|
937
|
+
const activeSprint = activeSprints.find((s) => s.id === targetSprintId);
|
|
938
|
+
const archivedSprint = archivedSprints.find((s) => s.id === targetSprintId);
|
|
939
|
+
const sprint = activeSprint ?? archivedSprint;
|
|
940
|
+
const archived = !activeSprint && Boolean(archivedSprint);
|
|
941
|
+
const missingTaskIds = allTasks.filter((t) => t.missing === true).map((t) => t.id);
|
|
942
|
+
const tasks = allTasks.filter((t) => t.missing !== true);
|
|
943
|
+
const tasksByStatus = {
|
|
944
|
+
todo: tasks.filter((t) => t.status === "todo"),
|
|
945
|
+
in_progress: tasks.filter((t) => t.status === "in_progress"),
|
|
946
|
+
review: tasks.filter((t) => t.status === "review"),
|
|
947
|
+
done: tasks.filter((t) => t.status === "done"),
|
|
948
|
+
blocked: tasks.filter((t) => t.status === "blocked"),
|
|
949
|
+
cancelled: tasks.filter((t) => t.status === "cancelled")
|
|
950
|
+
};
|
|
951
|
+
const activeDoneHours = tasksByStatus.done.reduce((sum, task) => sum + task.estimatedHours, 0);
|
|
952
|
+
const archivedDoneTasks = repositoryTasks.filter((result) => result.isArchived).map((result) => result.yaml).filter((task) => task.status === "done" && task.originalSprintId === targetSprintId);
|
|
953
|
+
const archivedDoneHours = archivedDoneTasks.reduce((sum, task) => sum + task.estimatedHours, 0);
|
|
954
|
+
const allDone = tasks.length > 0 && tasksByStatus.done.length === tasks.length;
|
|
955
|
+
const allTerminal = tasks.length > 0 && tasksByStatus.done.length + tasksByStatus.blocked.length + tasksByStatus.cancelled.length === tasks.length;
|
|
956
|
+
const readiness = computeSprintTerminalReadiness(allTasks);
|
|
957
|
+
const integrityClean = readiness.missingTaskIds.length === 0;
|
|
958
|
+
const closable = sprint?.status === "active" && readiness.ready;
|
|
959
|
+
return {
|
|
960
|
+
sprintId: targetSprintId,
|
|
961
|
+
name: sprint?.name ?? targetSprintId,
|
|
962
|
+
status: sprint?.status ?? "unknown",
|
|
963
|
+
archived,
|
|
964
|
+
startDate: sprint?.startDate,
|
|
965
|
+
endDate: sprint?.endDate,
|
|
966
|
+
goal: sprint?.goal,
|
|
967
|
+
capacity: {
|
|
968
|
+
allocatedHours: capacity.allocatedHours,
|
|
969
|
+
totalHours: capacity.totalHours,
|
|
970
|
+
utilizationPercent: capacity.utilizationPercent
|
|
971
|
+
},
|
|
972
|
+
completedCapacity: {
|
|
973
|
+
activeDoneHours,
|
|
974
|
+
archivedDoneHours,
|
|
975
|
+
totalDoneHours: activeDoneHours + archivedDoneHours,
|
|
976
|
+
archivedTaskCount: archivedDoneTasks.length
|
|
977
|
+
},
|
|
978
|
+
progress: {
|
|
979
|
+
todo: tasksByStatus.todo.length,
|
|
980
|
+
in_progress: tasksByStatus.in_progress.length,
|
|
981
|
+
review: tasksByStatus.review.length,
|
|
982
|
+
done: tasksByStatus.done.length,
|
|
983
|
+
blocked: tasksByStatus.blocked.length,
|
|
984
|
+
cancelled: tasksByStatus.cancelled.length,
|
|
985
|
+
total: tasks.length,
|
|
986
|
+
allDone,
|
|
987
|
+
allTerminal,
|
|
988
|
+
integrityClean,
|
|
989
|
+
closable
|
|
990
|
+
},
|
|
991
|
+
tasks: tasks.map((t) => ({
|
|
992
|
+
id: t.id,
|
|
993
|
+
title: t.title,
|
|
994
|
+
status: t.status,
|
|
995
|
+
estimatedHours: t.estimatedHours,
|
|
996
|
+
...typeof t.expectedRuntimeMinutes === "number" && t.expectedRuntimeMinutes > 0 ? { expectedRuntimeMinutes: t.expectedRuntimeMinutes } : {},
|
|
997
|
+
resultArtifactPath: t.resultArtifactPath
|
|
998
|
+
})),
|
|
999
|
+
missingTaskIds
|
|
1000
|
+
};
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
export {
|
|
1004
|
+
runPlanningGit,
|
|
1005
|
+
verifyRemoteSyncPush,
|
|
1006
|
+
isRefspecPushTopology,
|
|
1007
|
+
filterExistingRelativePaths,
|
|
1008
|
+
isDeferSyncEnabled,
|
|
1009
|
+
isMissingRemoteError,
|
|
1010
|
+
ManagedSyncBranchError,
|
|
1011
|
+
formatManagedSyncBranchError,
|
|
1012
|
+
isManagedSyncBranchError,
|
|
1013
|
+
assertManagedSyncBranch,
|
|
1014
|
+
hasStagedChanges,
|
|
1015
|
+
abandonManagedSyncStaging,
|
|
1016
|
+
stageManagedSyncPaths,
|
|
1017
|
+
verifyManagedSyncPushBoundary,
|
|
1018
|
+
resolveManagedSyncPushCandidate,
|
|
1019
|
+
syncPlanningFiles,
|
|
1020
|
+
syncManagedItemFiles,
|
|
1021
|
+
buildPlanningWorkspaceEnvelopeV1,
|
|
1022
|
+
querySprintStatus
|
|
1023
|
+
};
|
|
1024
|
+
//# sourceMappingURL=chunk-F23DIWNN.js.map
|