@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,775 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Isolated sprint-composition service (BPAU-03).
|
|
3
|
+
*
|
|
4
|
+
* BPAU-07A owns executable resolution, live RPC registration, and rendering.
|
|
5
|
+
* This module accepts only an injected runner and always sends one fixed argv
|
|
6
|
+
* with a false shell flag: callers cannot supply argv, env, cwd, paths, URLs, or
|
|
7
|
+
* an executable, and no caller-controlled `--json`, `--force`, `--no-sync`,
|
|
8
|
+
* `--dry-run`, `--split`, `--splitter`, `--provider`, `--model`, or `--hint`
|
|
9
|
+
* token can reach the child process.
|
|
10
|
+
*
|
|
11
|
+
* Authority order is fixed for every mutation: the BPAU-00B structured outcome
|
|
12
|
+
* outranks the fresh canonical reread, which outranks the exit code. An exit code
|
|
13
|
+
* is evidence of what Poetic reported, never evidence of what changed. Nothing is
|
|
14
|
+
* retried (`attempts: 1`). Poetic's managed sync stays on, so
|
|
15
|
+
* `remoteSyncConfirmedByExitCode` is a literal false.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { z } from 'zod';
|
|
19
|
+
import { parsePlanningWorkspaceV1 } from './planning-readback.js';
|
|
20
|
+
import type { PlanningWorkspaceProjection } from './planning-service.js';
|
|
21
|
+
import { mapPlanningWorkspace } from './planning-service.js';
|
|
22
|
+
import { repositorySchema } from './repository-schema.js';
|
|
23
|
+
import {
|
|
24
|
+
decideAddSprintWorkEffect,
|
|
25
|
+
decideCreateSprintEffect,
|
|
26
|
+
decideMigrateSprintTaskEffect,
|
|
27
|
+
decideRemoveSprintTaskEffect,
|
|
28
|
+
decideRenameSprintEffect,
|
|
29
|
+
membershipDrifted,
|
|
30
|
+
ProcessLocalSprintCompositionAdmission,
|
|
31
|
+
SPRINT_COMPOSITION_DISCLOSURE,
|
|
32
|
+
SPRINT_COMPOSITION_MAX_OUTPUT_BYTES,
|
|
33
|
+
SPRINT_COMPOSITION_MUTATION_TIMEOUT_MS,
|
|
34
|
+
SPRINT_COMPOSITION_READ_TIMEOUT_MS,
|
|
35
|
+
type SprintCompositionEffectDecision,
|
|
36
|
+
type SprintCompositionInvocationFacts,
|
|
37
|
+
sprintCompositionAdmissionIdentity,
|
|
38
|
+
sprintCompositionArgv,
|
|
39
|
+
sprintCompositionRequestedIdentities,
|
|
40
|
+
sprintCompositionSyncEvidence,
|
|
41
|
+
sprintCompositionSyncWarnings,
|
|
42
|
+
truncateDiagnostics,
|
|
43
|
+
} from './sprint-composition-model.js';
|
|
44
|
+
import {
|
|
45
|
+
parseBacklogIdentity,
|
|
46
|
+
parseSprintAddTaskIdentity,
|
|
47
|
+
parseSprintCompositionJson,
|
|
48
|
+
parseSprintCreateIdentity,
|
|
49
|
+
parseSprintList,
|
|
50
|
+
parseSprintStatus,
|
|
51
|
+
parseTaskDetailEnvelope,
|
|
52
|
+
type SprintMembershipState,
|
|
53
|
+
sprintIntegrityNotes,
|
|
54
|
+
sprintMembershipIds,
|
|
55
|
+
sprintMembershipState,
|
|
56
|
+
} from './sprint-composition-readback.js';
|
|
57
|
+
import {
|
|
58
|
+
type ApplySprintCompositionInput,
|
|
59
|
+
type ApplySprintCompositionOutput,
|
|
60
|
+
applySprintCompositionInputSchema,
|
|
61
|
+
type GetSprintOutput,
|
|
62
|
+
getSprintInputSchema,
|
|
63
|
+
type ListSprintsOutput,
|
|
64
|
+
listSprintsInputSchema,
|
|
65
|
+
SPRINT_COMPOSITION_OUTCOME_VERSION,
|
|
66
|
+
type SprintCompositionEvidence,
|
|
67
|
+
type SprintCompositionIdentityOutcome,
|
|
68
|
+
type SprintCompositionRereads,
|
|
69
|
+
type SprintListEnvelope,
|
|
70
|
+
type SprintStatusEnvelope,
|
|
71
|
+
} from './sprint-composition-schema.js';
|
|
72
|
+
import type { GetTaskDetailOutput } from './task-detail-schema.js';
|
|
73
|
+
|
|
74
|
+
type Repository = z.infer<typeof repositorySchema>;
|
|
75
|
+
|
|
76
|
+
export interface SprintCompositionCommand {
|
|
77
|
+
file: 'poetic';
|
|
78
|
+
args: readonly string[];
|
|
79
|
+
cwd: string;
|
|
80
|
+
timeoutMs:
|
|
81
|
+
| typeof SPRINT_COMPOSITION_READ_TIMEOUT_MS
|
|
82
|
+
| typeof SPRINT_COMPOSITION_MUTATION_TIMEOUT_MS;
|
|
83
|
+
shell: false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface SprintCompositionCommandResult {
|
|
87
|
+
stdout: string;
|
|
88
|
+
stderr: string;
|
|
89
|
+
exitCode: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type SprintCompositionRunner = (
|
|
93
|
+
command: SprintCompositionCommand
|
|
94
|
+
) => Promise<SprintCompositionCommandResult>;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* A request that cannot become an outcome: it names no accepted action, so there
|
|
98
|
+
* is nothing to report an effect phase about. Thrown before any spawn exists.
|
|
99
|
+
*/
|
|
100
|
+
export class SprintCompositionRequestError extends Error {
|
|
101
|
+
constructor(message: string) {
|
|
102
|
+
super(message);
|
|
103
|
+
this.name = 'SprintCompositionRequestError';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function unavailable<T>(reason: string): SprintCompositionEvidence<T> {
|
|
108
|
+
return { state: 'unavailable', reason };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function timedOutError(error: unknown): boolean {
|
|
112
|
+
if (!error || typeof error !== 'object') return false;
|
|
113
|
+
const value = error as { code?: unknown; name?: unknown; timedOut?: unknown };
|
|
114
|
+
return value.timedOut === true || value.code === 'ETIMEDOUT' || value.name === 'TimeoutError';
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Cap captured output per invocation before anything parses or reports it. */
|
|
118
|
+
function capOutput(value: string): string {
|
|
119
|
+
if (Buffer.byteLength(value, 'utf8') <= SPRINT_COMPOSITION_MAX_OUTPUT_BYTES) return value;
|
|
120
|
+
return Buffer.from(value, 'utf8')
|
|
121
|
+
.subarray(0, SPRINT_COMPOSITION_MAX_OUTPUT_BYTES)
|
|
122
|
+
.toString('utf8');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function membershipOf(
|
|
126
|
+
sprint: SprintCompositionEvidence<SprintStatusEnvelope>,
|
|
127
|
+
taskId: string
|
|
128
|
+
): SprintMembershipState | null {
|
|
129
|
+
return sprint.state === 'available' ? sprintMembershipState(sprint.value, taskId) : null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function notesOf(sprint: SprintCompositionEvidence<SprintStatusEnvelope>): string[] {
|
|
133
|
+
return sprint.state === 'available' ? sprintIntegrityNotes(sprint.value) : [];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export class SprintCompositionService {
|
|
137
|
+
constructor(
|
|
138
|
+
private readonly run: SprintCompositionRunner,
|
|
139
|
+
private readonly admission = new ProcessLocalSprintCompositionAdmission()
|
|
140
|
+
) {}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Read-only multi-sprint enumeration. Current and archived sprint identities
|
|
144
|
+
* come from Poetic's own list payload; nothing is merged, re-sorted, or
|
|
145
|
+
* recomputed here.
|
|
146
|
+
*/
|
|
147
|
+
async listSprints(repositoryValue: unknown, inputValue: unknown): Promise<ListSprintsOutput> {
|
|
148
|
+
const repository = repositorySchema.parse(repositoryValue);
|
|
149
|
+
const input = listSprintsInputSchema.safeParse(inputValue);
|
|
150
|
+
if (!input.success) {
|
|
151
|
+
throw new SprintCompositionRequestError('Invalid sprint list request.');
|
|
152
|
+
}
|
|
153
|
+
const scope = input.data.scope ?? 'all';
|
|
154
|
+
if (!this.identifiesRepository(repository, input.data)) {
|
|
155
|
+
return {
|
|
156
|
+
repository,
|
|
157
|
+
scope,
|
|
158
|
+
sprints: unavailable('The request does not identify the selected repository.'),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const args = ['plan', 'sprint', 'list'];
|
|
162
|
+
if (scope === 'current') args.push('--current');
|
|
163
|
+
if (scope === 'archived') args.push('--archived');
|
|
164
|
+
args.push('--json');
|
|
165
|
+
|
|
166
|
+
const json = await this.read(repository, args);
|
|
167
|
+
if (json.state !== 'available') return { repository, scope, sprints: json };
|
|
168
|
+
const parsed = parseSprintList(json.value);
|
|
169
|
+
if (parsed.state === 'available' && parsed.value.scope !== scope) {
|
|
170
|
+
return {
|
|
171
|
+
repository,
|
|
172
|
+
scope,
|
|
173
|
+
sprints: unavailable('Poetic returned a sprint list for a different scope.'),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return { repository, scope, sprints: parsed };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Read-only single-sprint projection, always with an explicit sprint id.
|
|
181
|
+
* Membership, capacity, readiness, and integrity are carried verbatim; there is
|
|
182
|
+
* no capacity command here because `sprint capacity` has no `--json` and
|
|
183
|
+
* parsing human output is forbidden.
|
|
184
|
+
*/
|
|
185
|
+
async getSprint(repositoryValue: unknown, inputValue: unknown): Promise<GetSprintOutput> {
|
|
186
|
+
const repository = repositorySchema.parse(repositoryValue);
|
|
187
|
+
const input = getSprintInputSchema.safeParse(inputValue);
|
|
188
|
+
if (!input.success) {
|
|
189
|
+
throw new SprintCompositionRequestError('Invalid sprint status request.');
|
|
190
|
+
}
|
|
191
|
+
if (!this.identifiesRepository(repository, input.data)) {
|
|
192
|
+
return {
|
|
193
|
+
repository,
|
|
194
|
+
sprintId: input.data.sprintId,
|
|
195
|
+
sprint: unavailable('The request does not identify the selected repository.'),
|
|
196
|
+
integrityNotes: [],
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const sprint = await this.readSprintStatus(repository, input.data.sprintId);
|
|
200
|
+
return {
|
|
201
|
+
repository,
|
|
202
|
+
sprintId: input.data.sprintId,
|
|
203
|
+
sprint,
|
|
204
|
+
integrityNotes: notesOf(sprint),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Run one sprint-composition mutation exactly once and report the authoritative
|
|
210
|
+
* outcome. Every terminal path releases process-local admission, including
|
|
211
|
+
* refusal and reread failure.
|
|
212
|
+
*/
|
|
213
|
+
async apply(
|
|
214
|
+
repositoryValue: unknown,
|
|
215
|
+
requestValue: unknown
|
|
216
|
+
): Promise<ApplySprintCompositionOutput> {
|
|
217
|
+
const repository = repositorySchema.parse(repositoryValue);
|
|
218
|
+
const parsedRequest = applySprintCompositionInputSchema.safeParse(requestValue);
|
|
219
|
+
if (!parsedRequest.success) {
|
|
220
|
+
throw new SprintCompositionRequestError(
|
|
221
|
+
'Invalid sprint composition request: only the closed sprint-composition vocabulary and its declared fields are accepted.'
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
const request = parsedRequest.data;
|
|
225
|
+
|
|
226
|
+
const targetRefusal = this.repositoryRefusal(repository, request);
|
|
227
|
+
if (targetRefusal !== null) {
|
|
228
|
+
return this.refusedBeforeLaunch(repository, request, targetRefusal);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
let release: () => void;
|
|
232
|
+
try {
|
|
233
|
+
release = this.admission.claim({
|
|
234
|
+
repositoryPath: repository.path,
|
|
235
|
+
identity: sprintCompositionAdmissionIdentity(request),
|
|
236
|
+
family: 'sprint-composition',
|
|
237
|
+
});
|
|
238
|
+
} catch (error) {
|
|
239
|
+
return this.refusedBeforeLaunch(
|
|
240
|
+
repository,
|
|
241
|
+
request,
|
|
242
|
+
error instanceof Error ? error.message : String(error)
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
try {
|
|
247
|
+
const admission = await this.admissionEvidence(repository, request);
|
|
248
|
+
if (admission.refusal !== null) {
|
|
249
|
+
return this.refusedBeforeLaunch(repository, request, admission.refusal);
|
|
250
|
+
}
|
|
251
|
+
return await this.launchAndReread(repository, request);
|
|
252
|
+
} finally {
|
|
253
|
+
release();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private identifiesRepository(
|
|
258
|
+
repository: Repository,
|
|
259
|
+
input: { projectId: string; sourceId: string }
|
|
260
|
+
): boolean {
|
|
261
|
+
return input.projectId === repository.projectId && input.sourceId === repository.sourceId;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Fresh repository and branch gate, re-checked immediately before spawn so a
|
|
266
|
+
* moved checkout or a switched branch is refused rather than mutated blind.
|
|
267
|
+
*/
|
|
268
|
+
private repositoryRefusal(
|
|
269
|
+
repository: Repository,
|
|
270
|
+
request: ApplySprintCompositionInput
|
|
271
|
+
): string | null {
|
|
272
|
+
if (!this.identifiesRepository(repository, request)) {
|
|
273
|
+
return 'The request does not identify the selected repository.';
|
|
274
|
+
}
|
|
275
|
+
if (request.expected.repositoryPath !== repository.path) {
|
|
276
|
+
return 'The selected repository path changed since this request was built, so no command ran.';
|
|
277
|
+
}
|
|
278
|
+
if (request.expected.branch !== repository.branch) {
|
|
279
|
+
return 'The selected branch changed since this request was built, so no command ran.';
|
|
280
|
+
}
|
|
281
|
+
if (repository.state === 'blocked') {
|
|
282
|
+
return 'Poetic reports the selected repository as blocked, so no command ran.';
|
|
283
|
+
}
|
|
284
|
+
if (repository.branchState !== 'ready') {
|
|
285
|
+
return `Poetic reports the selected branch as ${repository.branchState}, so no command ran.`;
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Revalidate entity identity against fresh canonical evidence before spawning.
|
|
292
|
+
*
|
|
293
|
+
* For migrate this is the load-bearing admission gate: `migrateToNextSprint`
|
|
294
|
+
* does not enforce non-terminal status and would reset a done task to todo, so
|
|
295
|
+
* BB admits the migration only when a fresh task read shows a live,
|
|
296
|
+
* non-archived task whose status is neither done nor cancelled and whose
|
|
297
|
+
* membership in the declared source sprint is confirmed.
|
|
298
|
+
*/
|
|
299
|
+
private async admissionEvidence(
|
|
300
|
+
repository: Repository,
|
|
301
|
+
request: ApplySprintCompositionInput
|
|
302
|
+
): Promise<{ refusal: string | null }> {
|
|
303
|
+
switch (request.action) {
|
|
304
|
+
case 'createSprint':
|
|
305
|
+
return { refusal: null };
|
|
306
|
+
case 'renameSprint':
|
|
307
|
+
case 'addSprintWorkFromBacklog': {
|
|
308
|
+
const sprint = await this.readSprintStatus(repository, request.input.sprintId);
|
|
309
|
+
if (sprint.state !== 'available') {
|
|
310
|
+
return {
|
|
311
|
+
refusal: `Poetic could not describe sprint ${request.input.sprintId}, so no command ran: ${sprint.reason}`,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
if (sprint.value.status === 'completed' || sprint.value.archived) {
|
|
315
|
+
return {
|
|
316
|
+
refusal: `Poetic reports sprint ${request.input.sprintId} as ${sprint.value.archived ? 'archived' : 'completed'} and read-only, so no command ran.`,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
return { refusal: null };
|
|
320
|
+
}
|
|
321
|
+
case 'removeSprintTask': {
|
|
322
|
+
const sprint = await this.readSprintStatus(repository, request.input.sprintId);
|
|
323
|
+
if (sprint.state !== 'available') {
|
|
324
|
+
return {
|
|
325
|
+
refusal: `Poetic could not describe sprint ${request.input.sprintId}, so no command ran: ${sprint.reason}`,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
if (sprint.value.status === 'completed' || sprint.value.archived) {
|
|
329
|
+
return {
|
|
330
|
+
refusal: `Poetic reports sprint ${request.input.sprintId} as ${sprint.value.archived ? 'archived' : 'completed'} and read-only, so no command ran.`,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const membership = sprintMembershipState(sprint.value, request.input.taskId);
|
|
334
|
+
if (membership !== 'present') {
|
|
335
|
+
return {
|
|
336
|
+
refusal:
|
|
337
|
+
membership === 'missing-reference'
|
|
338
|
+
? `Sprint ${request.input.sprintId} references task ${request.input.taskId} as a task id with no resolvable task file, so no command ran.`
|
|
339
|
+
: `Poetic does not list task ${request.input.taskId} as a member of sprint ${request.input.sprintId}, so no command ran.`,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
if (
|
|
343
|
+
membershipDrifted(request.expected.observedMembership, sprintMembershipIds(sprint.value))
|
|
344
|
+
) {
|
|
345
|
+
return {
|
|
346
|
+
refusal: `Sprint ${request.input.sprintId} membership changed since this request was built, so no command ran.`,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
return { refusal: null };
|
|
350
|
+
}
|
|
351
|
+
case 'migrateSprintTask': {
|
|
352
|
+
const [task, source, target] = await Promise.all([
|
|
353
|
+
this.readTaskDetail(repository, request.input.taskId),
|
|
354
|
+
this.readSprintStatus(repository, request.input.sourceSprintId),
|
|
355
|
+
this.readSprintStatus(repository, request.input.targetSprintId),
|
|
356
|
+
]);
|
|
357
|
+
if (task.task.state !== 'available') {
|
|
358
|
+
return {
|
|
359
|
+
refusal:
|
|
360
|
+
task.task.state === 'missing'
|
|
361
|
+
? `Poetic reports no managed task ${request.input.taskId}, so no command ran.`
|
|
362
|
+
: `Poetic could not describe task ${request.input.taskId}, so no command ran.`,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
const facts = task.task.value;
|
|
366
|
+
if (facts.location === 'archive' || facts.archived !== null) {
|
|
367
|
+
return {
|
|
368
|
+
refusal: `Poetic reports task ${request.input.taskId} as archived, so no command ran.`,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
if (facts.status === 'done' || facts.status === 'cancelled') {
|
|
372
|
+
return {
|
|
373
|
+
refusal: `Poetic reports task ${request.input.taskId} as ${facts.status}. Migration would reset it to todo, so no command ran.`,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
if (source.state !== 'available') {
|
|
377
|
+
return {
|
|
378
|
+
refusal: `Poetic could not describe source sprint ${request.input.sourceSprintId}, so no command ran: ${source.reason}`,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
if (target.state !== 'available') {
|
|
382
|
+
return {
|
|
383
|
+
refusal: `Poetic could not describe target sprint ${request.input.targetSprintId}, so no command ran: ${target.reason}`,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
if (target.value.status === 'completed' || target.value.archived) {
|
|
387
|
+
return {
|
|
388
|
+
refusal: `Poetic reports target sprint ${request.input.targetSprintId} as ${target.value.archived ? 'archived' : 'completed'} and read-only, so no command ran.`,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
if (sprintMembershipState(source.value, request.input.taskId) !== 'present') {
|
|
392
|
+
return {
|
|
393
|
+
refusal: `Poetic does not list task ${request.input.taskId} as a member of the declared source sprint ${request.input.sourceSprintId}, so no command ran.`,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
if (
|
|
397
|
+
membershipDrifted(request.expected.observedMembership, sprintMembershipIds(source.value))
|
|
398
|
+
) {
|
|
399
|
+
return {
|
|
400
|
+
refusal: `Source sprint ${request.input.sourceSprintId} membership changed since this request was built, so no command ran.`,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
return { refusal: null };
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/** Spawn the fixed argv once, then perform the action's authoritative rereads. */
|
|
409
|
+
private async launchAndReread(
|
|
410
|
+
repository: Repository,
|
|
411
|
+
request: ApplySprintCompositionInput
|
|
412
|
+
): Promise<ApplySprintCompositionOutput> {
|
|
413
|
+
const argv = sprintCompositionArgv(request);
|
|
414
|
+
let stdout = '';
|
|
415
|
+
let diagnostics: string | null = null;
|
|
416
|
+
let exitCode: number | null = null;
|
|
417
|
+
let timedOut = false;
|
|
418
|
+
try {
|
|
419
|
+
const result = await this.run({
|
|
420
|
+
file: 'poetic',
|
|
421
|
+
args: argv,
|
|
422
|
+
cwd: repository.path,
|
|
423
|
+
timeoutMs: SPRINT_COMPOSITION_MUTATION_TIMEOUT_MS,
|
|
424
|
+
shell: false,
|
|
425
|
+
});
|
|
426
|
+
stdout = capOutput(result.stdout);
|
|
427
|
+
diagnostics = truncateDiagnostics(capOutput(result.stderr));
|
|
428
|
+
exitCode = result.exitCode;
|
|
429
|
+
} catch (error) {
|
|
430
|
+
timedOut = timedOutError(error);
|
|
431
|
+
diagnostics = truncateDiagnostics(error instanceof Error ? error.message : String(error));
|
|
432
|
+
}
|
|
433
|
+
const facts: SprintCompositionInvocationFacts = { timedOut, exitCode };
|
|
434
|
+
|
|
435
|
+
const { identityOutcome, ambiguous, identityNotes } = this.identityEvidence(
|
|
436
|
+
request,
|
|
437
|
+
stdout,
|
|
438
|
+
facts
|
|
439
|
+
);
|
|
440
|
+
const { rereads, decision } = await this.rereadAndDecide(
|
|
441
|
+
repository,
|
|
442
|
+
request,
|
|
443
|
+
facts,
|
|
444
|
+
identityOutcome
|
|
445
|
+
);
|
|
446
|
+
|
|
447
|
+
const workspace = await this.readWorkspace(repository);
|
|
448
|
+
const commandState = timedOut
|
|
449
|
+
? 'timed_out'
|
|
450
|
+
: ambiguous
|
|
451
|
+
? 'ambiguous'
|
|
452
|
+
: exitCode === 0
|
|
453
|
+
? 'succeeded'
|
|
454
|
+
: 'failed';
|
|
455
|
+
|
|
456
|
+
return {
|
|
457
|
+
outcomeVersion: SPRINT_COMPOSITION_OUTCOME_VERSION,
|
|
458
|
+
repository,
|
|
459
|
+
disclosure: SPRINT_COMPOSITION_DISCLOSURE,
|
|
460
|
+
action: request.action,
|
|
461
|
+
requestedIdentities: sprintCompositionRequestedIdentities(request),
|
|
462
|
+
command: {
|
|
463
|
+
state: commandState,
|
|
464
|
+
attempts: 1,
|
|
465
|
+
argv,
|
|
466
|
+
exitCode,
|
|
467
|
+
diagnostics,
|
|
468
|
+
remoteSyncConfirmedByExitCode: false,
|
|
469
|
+
},
|
|
470
|
+
identityOutcome,
|
|
471
|
+
effect: {
|
|
472
|
+
phase: decision.phase,
|
|
473
|
+
createdIdentities: decision.createdIdentities,
|
|
474
|
+
affectedIdentities: decision.affectedIdentities,
|
|
475
|
+
},
|
|
476
|
+
sync: sprintCompositionSyncEvidence(true, workspace),
|
|
477
|
+
syncWarnings: sprintCompositionSyncWarnings(workspace),
|
|
478
|
+
integrityNotes: [
|
|
479
|
+
...new Set([...identityNotes, ...decision.integrityNotes, ...this.rereadNotes(rereads)]),
|
|
480
|
+
],
|
|
481
|
+
canonicalRereads: rereads,
|
|
482
|
+
workspace,
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Validate the BPAU-00B identity envelope for the two minting actions.
|
|
488
|
+
*
|
|
489
|
+
* A missing, malformed, or internally inconsistent envelope is refused and the
|
|
490
|
+
* invocation is reported as `ambiguous`: the newest list row is never
|
|
491
|
+
* substituted for a returned id.
|
|
492
|
+
*/
|
|
493
|
+
private identityEvidence(
|
|
494
|
+
request: ApplySprintCompositionInput,
|
|
495
|
+
stdout: string,
|
|
496
|
+
facts: SprintCompositionInvocationFacts
|
|
497
|
+
): {
|
|
498
|
+
identityOutcome: SprintCompositionIdentityOutcome;
|
|
499
|
+
ambiguous: boolean;
|
|
500
|
+
identityNotes: string[];
|
|
501
|
+
} {
|
|
502
|
+
if (request.action !== 'createSprint' && request.action !== 'addSprintWorkFromBacklog') {
|
|
503
|
+
return { identityOutcome: null, ambiguous: false, identityNotes: [] };
|
|
504
|
+
}
|
|
505
|
+
if (facts.timedOut) {
|
|
506
|
+
return {
|
|
507
|
+
identityOutcome: null,
|
|
508
|
+
ambiguous: false,
|
|
509
|
+
identityNotes: ['Poetic produced no identity evidence before the timeout.'],
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
const json = parseSprintCompositionJson(stdout);
|
|
513
|
+
if (json.state !== 'available') {
|
|
514
|
+
return { identityOutcome: null, ambiguous: true, identityNotes: [json.reason] };
|
|
515
|
+
}
|
|
516
|
+
if (request.action === 'createSprint') {
|
|
517
|
+
const identity = parseSprintCreateIdentity(json.value, {
|
|
518
|
+
name: request.input.name,
|
|
519
|
+
start: request.input.start,
|
|
520
|
+
end: request.input.end,
|
|
521
|
+
});
|
|
522
|
+
return identity.state === 'available'
|
|
523
|
+
? {
|
|
524
|
+
identityOutcome: { kind: 'sprintCreateV1', value: identity.value },
|
|
525
|
+
ambiguous: false,
|
|
526
|
+
identityNotes: [],
|
|
527
|
+
}
|
|
528
|
+
: { identityOutcome: null, ambiguous: true, identityNotes: [identity.reason] };
|
|
529
|
+
}
|
|
530
|
+
const identity = parseSprintAddTaskIdentity(json.value, {
|
|
531
|
+
sprintId: request.input.sprintId,
|
|
532
|
+
backlogItemId: request.input.backlogItemId,
|
|
533
|
+
});
|
|
534
|
+
return identity.state === 'available'
|
|
535
|
+
? {
|
|
536
|
+
identityOutcome: { kind: 'sprintAddTaskV1', value: identity.value },
|
|
537
|
+
ambiguous: false,
|
|
538
|
+
identityNotes: [],
|
|
539
|
+
}
|
|
540
|
+
: { identityOutcome: null, ambiguous: true, identityNotes: [identity.reason] };
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/** Perform the action's frozen reread set, then decide the effect phase. */
|
|
544
|
+
private async rereadAndDecide(
|
|
545
|
+
repository: Repository,
|
|
546
|
+
request: ApplySprintCompositionInput,
|
|
547
|
+
facts: SprintCompositionInvocationFacts,
|
|
548
|
+
identityOutcome: SprintCompositionIdentityOutcome
|
|
549
|
+
): Promise<{ rereads: SprintCompositionRereads; decision: SprintCompositionEffectDecision }> {
|
|
550
|
+
switch (request.action) {
|
|
551
|
+
case 'createSprint': {
|
|
552
|
+
const created =
|
|
553
|
+
identityOutcome?.kind === 'sprintCreateV1' ? identityOutcome.value.sprintId : null;
|
|
554
|
+
const sprints = await this.readSprintList(repository);
|
|
555
|
+
const sprint =
|
|
556
|
+
created === null ? undefined : await this.readSprintStatus(repository, created);
|
|
557
|
+
return {
|
|
558
|
+
rereads: sprint === undefined ? { sprints } : { sprints, sprint },
|
|
559
|
+
decision: decideCreateSprintEffect(
|
|
560
|
+
identityOutcome?.kind === 'sprintCreateV1' ? identityOutcome.value : null,
|
|
561
|
+
facts
|
|
562
|
+
),
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
case 'renameSprint': {
|
|
566
|
+
const [sprints, sprint] = await Promise.all([
|
|
567
|
+
this.readSprintList(repository),
|
|
568
|
+
this.readSprintStatus(repository, request.input.sprintId),
|
|
569
|
+
]);
|
|
570
|
+
const renamed =
|
|
571
|
+
sprint.state === 'available' ? sprint.value.name === request.input.name : null;
|
|
572
|
+
return {
|
|
573
|
+
rereads: { sprints, sprint },
|
|
574
|
+
decision: decideRenameSprintEffect(request.input.sprintId, facts, renamed),
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
case 'addSprintWorkFromBacklog': {
|
|
578
|
+
const identity = identityOutcome?.kind === 'sprintAddTaskV1' ? identityOutcome.value : null;
|
|
579
|
+
const [sprint, backlogItem] = await Promise.all([
|
|
580
|
+
this.readSprintStatus(repository, request.input.sprintId),
|
|
581
|
+
this.readBacklogItem(repository, request.input.backlogItemId),
|
|
582
|
+
]);
|
|
583
|
+
const newTaskId = identity?.taskId ?? null;
|
|
584
|
+
const task =
|
|
585
|
+
newTaskId === null ? undefined : await this.readTaskEvidence(repository, newTaskId);
|
|
586
|
+
const membership = newTaskId === null ? null : membershipOf(sprint, newTaskId);
|
|
587
|
+
return {
|
|
588
|
+
rereads: task === undefined ? { sprint, backlogItem } : { sprint, task, backlogItem },
|
|
589
|
+
decision: decideAddSprintWorkEffect(identity, facts, membership),
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
case 'removeSprintTask': {
|
|
593
|
+
const [sprint, task] = await Promise.all([
|
|
594
|
+
this.readSprintStatus(repository, request.input.sprintId),
|
|
595
|
+
this.readTaskEvidence(repository, request.input.taskId),
|
|
596
|
+
]);
|
|
597
|
+
return {
|
|
598
|
+
rereads: { sprint, task },
|
|
599
|
+
decision: decideRemoveSprintTaskEffect(
|
|
600
|
+
request.input.sprintId,
|
|
601
|
+
request.input.taskId,
|
|
602
|
+
facts,
|
|
603
|
+
membershipOf(sprint, request.input.taskId)
|
|
604
|
+
),
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
case 'migrateSprintTask': {
|
|
608
|
+
const [sourceSprint, targetSprint, task] = await Promise.all([
|
|
609
|
+
this.readSprintStatus(repository, request.input.sourceSprintId),
|
|
610
|
+
this.readSprintStatus(repository, request.input.targetSprintId),
|
|
611
|
+
this.readTaskEvidence(repository, request.input.taskId),
|
|
612
|
+
]);
|
|
613
|
+
return {
|
|
614
|
+
rereads: { sourceSprint, targetSprint, task },
|
|
615
|
+
decision: decideMigrateSprintTaskEffect(
|
|
616
|
+
{
|
|
617
|
+
taskId: request.input.taskId,
|
|
618
|
+
sourceSprintId: request.input.sourceSprintId,
|
|
619
|
+
targetSprintId: request.input.targetSprintId,
|
|
620
|
+
},
|
|
621
|
+
facts,
|
|
622
|
+
{
|
|
623
|
+
source: membershipOf(sourceSprint, request.input.taskId),
|
|
624
|
+
target: membershipOf(targetSprint, request.input.taskId),
|
|
625
|
+
}
|
|
626
|
+
),
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/** Poetic-reported integrity notes from whichever sprints this action reread. */
|
|
633
|
+
private rereadNotes(rereads: SprintCompositionRereads): string[] {
|
|
634
|
+
const notes: string[] = [];
|
|
635
|
+
for (const sprint of [rereads.sprint, rereads.sourceSprint, rereads.targetSprint]) {
|
|
636
|
+
if (sprint !== undefined) notes.push(...notesOf(sprint));
|
|
637
|
+
}
|
|
638
|
+
return notes;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
private refusedBeforeLaunch(
|
|
642
|
+
repository: Repository,
|
|
643
|
+
request: ApplySprintCompositionInput,
|
|
644
|
+
reason: string
|
|
645
|
+
): ApplySprintCompositionOutput {
|
|
646
|
+
const workspace = unavailable<PlanningWorkspaceProjection>(
|
|
647
|
+
'No Poetic command ran, so BB did not reread the planning workspace.'
|
|
648
|
+
);
|
|
649
|
+
return {
|
|
650
|
+
outcomeVersion: SPRINT_COMPOSITION_OUTCOME_VERSION,
|
|
651
|
+
repository,
|
|
652
|
+
disclosure: SPRINT_COMPOSITION_DISCLOSURE,
|
|
653
|
+
action: request.action,
|
|
654
|
+
requestedIdentities: sprintCompositionRequestedIdentities(request),
|
|
655
|
+
command: {
|
|
656
|
+
state: 'failed',
|
|
657
|
+
attempts: 1,
|
|
658
|
+
argv: [],
|
|
659
|
+
exitCode: null,
|
|
660
|
+
diagnostics: reason,
|
|
661
|
+
remoteSyncConfirmedByExitCode: false,
|
|
662
|
+
},
|
|
663
|
+
identityOutcome: null,
|
|
664
|
+
effect: { phase: 'refused-before-launch', createdIdentities: [], affectedIdentities: [] },
|
|
665
|
+
sync: sprintCompositionSyncEvidence(false, workspace),
|
|
666
|
+
syncWarnings: [],
|
|
667
|
+
integrityNotes: [reason],
|
|
668
|
+
canonicalRereads: {},
|
|
669
|
+
workspace,
|
|
670
|
+
};
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
/** One fixed read. A nonzero exit or unparseable stdout is unavailable evidence. */
|
|
674
|
+
private async read(
|
|
675
|
+
repository: Repository,
|
|
676
|
+
args: readonly string[]
|
|
677
|
+
): Promise<SprintCompositionEvidence<unknown>> {
|
|
678
|
+
let result: SprintCompositionCommandResult;
|
|
679
|
+
try {
|
|
680
|
+
result = await this.run({
|
|
681
|
+
file: 'poetic',
|
|
682
|
+
args,
|
|
683
|
+
cwd: repository.path,
|
|
684
|
+
timeoutMs: SPRINT_COMPOSITION_READ_TIMEOUT_MS,
|
|
685
|
+
shell: false,
|
|
686
|
+
});
|
|
687
|
+
} catch (error) {
|
|
688
|
+
return unavailable(
|
|
689
|
+
timedOutError(error) ? 'Poetic read timed out.' : 'Poetic read failed to run.'
|
|
690
|
+
);
|
|
691
|
+
}
|
|
692
|
+
if (result.exitCode !== 0) {
|
|
693
|
+
return unavailable('Poetic reported a failed read.');
|
|
694
|
+
}
|
|
695
|
+
return parseSprintCompositionJson(capOutput(result.stdout));
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
private async readSprintList(
|
|
699
|
+
repository: Repository
|
|
700
|
+
): Promise<SprintCompositionEvidence<SprintListEnvelope>> {
|
|
701
|
+
const json = await this.read(repository, ['plan', 'sprint', 'list', '--json']);
|
|
702
|
+
return json.state === 'available' ? parseSprintList(json.value) : json;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
private async readSprintStatus(
|
|
706
|
+
repository: Repository,
|
|
707
|
+
sprintId: string
|
|
708
|
+
): Promise<SprintCompositionEvidence<SprintStatusEnvelope>> {
|
|
709
|
+
const json = await this.read(repository, ['plan', 'sprint', 'status', sprintId, '--json']);
|
|
710
|
+
return json.state === 'available' ? parseSprintStatus(json.value, sprintId) : json;
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
private async readBacklogItem(
|
|
714
|
+
repository: Repository,
|
|
715
|
+
backlogItemId: string
|
|
716
|
+
): Promise<SprintCompositionEvidence<{ id: string }>> {
|
|
717
|
+
const json = await this.read(repository, ['plan', 'backlog', 'show', backlogItemId, '--json']);
|
|
718
|
+
return json.state === 'available' ? parseBacklogIdentity(json.value, backlogItemId) : json;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
private async readTaskDetail(
|
|
722
|
+
repository: Repository,
|
|
723
|
+
taskId: string
|
|
724
|
+
): Promise<GetTaskDetailOutput> {
|
|
725
|
+
const json = await this.read(repository, [
|
|
726
|
+
'plan',
|
|
727
|
+
'task',
|
|
728
|
+
'status',
|
|
729
|
+
taskId,
|
|
730
|
+
'--json',
|
|
731
|
+
'--detail',
|
|
732
|
+
]);
|
|
733
|
+
return json.state === 'available'
|
|
734
|
+
? parseTaskDetailEnvelope(json.value)
|
|
735
|
+
: { schemaVersion: null, task: { state: 'unavailable' as const, reason: json.reason } };
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
/** The task reread as it appears in `canonicalRereads`. */
|
|
739
|
+
private async readTaskEvidence(
|
|
740
|
+
repository: Repository,
|
|
741
|
+
taskId: string
|
|
742
|
+
): Promise<SprintCompositionEvidence<GetTaskDetailOutput>> {
|
|
743
|
+
const detail = await this.readTaskDetail(repository, taskId);
|
|
744
|
+
if (detail.task.state === 'available') {
|
|
745
|
+
return { state: 'available', value: detail };
|
|
746
|
+
}
|
|
747
|
+
return unavailable(
|
|
748
|
+
detail.task.state === 'missing'
|
|
749
|
+
? `Poetic reports no managed task ${taskId}.`
|
|
750
|
+
: detail.task.reason
|
|
751
|
+
);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/**
|
|
755
|
+
* The planning workspace projection: the only source of sync health, taken from
|
|
756
|
+
* the bare `plan sprint status --json` form that injects `planningWorkspaceV1`.
|
|
757
|
+
*/
|
|
758
|
+
private async readWorkspace(
|
|
759
|
+
repository: Repository
|
|
760
|
+
): Promise<SprintCompositionEvidence<PlanningWorkspaceProjection>> {
|
|
761
|
+
const json = await this.read(repository, ['plan', 'sprint', 'status', '--json']);
|
|
762
|
+
if (json.state !== 'available') return json;
|
|
763
|
+
if (
|
|
764
|
+
json.value === null ||
|
|
765
|
+
typeof json.value !== 'object' ||
|
|
766
|
+
!('planningWorkspaceV1' in json.value)
|
|
767
|
+
) {
|
|
768
|
+
return unavailable('Poetic returned no planning workspace projection.');
|
|
769
|
+
}
|
|
770
|
+
const readback = parsePlanningWorkspaceV1(
|
|
771
|
+
(json.value as { planningWorkspaceV1: unknown }).planningWorkspaceV1
|
|
772
|
+
);
|
|
773
|
+
return { state: 'available', value: mapPlanningWorkspace(readback) };
|
|
774
|
+
}
|
|
775
|
+
}
|