@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,1270 @@
|
|
|
1
|
+
import {
|
|
2
|
+
listFindings,
|
|
3
|
+
listIssues,
|
|
4
|
+
loadIssuePolicy,
|
|
5
|
+
severityToPriority
|
|
6
|
+
} from "./chunk-BZU2O43F.js";
|
|
7
|
+
import {
|
|
8
|
+
estimateRuntime
|
|
9
|
+
} from "./chunk-LDCF2MKN.js";
|
|
10
|
+
import {
|
|
11
|
+
isBacklogExecutionProvenanceActivelyExecuting,
|
|
12
|
+
loadBacklogExecutionProvenance
|
|
13
|
+
} from "./chunk-NM6PMYY4.js";
|
|
14
|
+
import {
|
|
15
|
+
buildGraphBlockersView,
|
|
16
|
+
loadWorkGraphContext
|
|
17
|
+
} from "./chunk-YVORHQ2S.js";
|
|
18
|
+
import {
|
|
19
|
+
listActive
|
|
20
|
+
} from "./chunk-O47UOKU3.js";
|
|
21
|
+
import {
|
|
22
|
+
findBacklogItem,
|
|
23
|
+
listBacklogItems,
|
|
24
|
+
validateDebtItem
|
|
25
|
+
} from "./chunk-LH5QY22X.js";
|
|
26
|
+
import {
|
|
27
|
+
getArchivedFilePath
|
|
28
|
+
} from "./chunk-OYZYO7TV.js";
|
|
29
|
+
import {
|
|
30
|
+
generateId
|
|
31
|
+
} from "./chunk-VNSYKC25.js";
|
|
32
|
+
import {
|
|
33
|
+
getPlanningRoot,
|
|
34
|
+
withIndexRegeneration
|
|
35
|
+
} from "./chunk-OPYFYTWQ.js";
|
|
36
|
+
import {
|
|
37
|
+
generateIndexes
|
|
38
|
+
} from "./chunk-DSFM56OA.js";
|
|
39
|
+
import {
|
|
40
|
+
getBucketArchivePathByKind,
|
|
41
|
+
getBucketByName,
|
|
42
|
+
getBucketPathByKind
|
|
43
|
+
} from "./chunk-HOYBYAOA.js";
|
|
44
|
+
import {
|
|
45
|
+
listMarkdownFiles,
|
|
46
|
+
listMarkdownFilesRecursive,
|
|
47
|
+
parseMarkdownFile,
|
|
48
|
+
readMarkdownFile
|
|
49
|
+
} from "./chunk-OIS7J26S.js";
|
|
50
|
+
import {
|
|
51
|
+
emitWarning
|
|
52
|
+
} from "./chunk-EJGCZGUF.js";
|
|
53
|
+
|
|
54
|
+
// src/core/read-models/next.ts
|
|
55
|
+
import * as fs2 from "fs/promises";
|
|
56
|
+
import * as path2 from "path";
|
|
57
|
+
import { execa } from "execa";
|
|
58
|
+
|
|
59
|
+
// src/planning/tech-debt-manager.ts
|
|
60
|
+
import * as fsSync from "fs";
|
|
61
|
+
import * as fs from "fs/promises";
|
|
62
|
+
import * as path from "path";
|
|
63
|
+
import * as yaml from "js-yaml";
|
|
64
|
+
var severityImpactDefaults = {
|
|
65
|
+
critical: 9,
|
|
66
|
+
high: 7,
|
|
67
|
+
medium: 5,
|
|
68
|
+
low: 3
|
|
69
|
+
};
|
|
70
|
+
var EFFORT_TO_HOURS = {
|
|
71
|
+
low: 2,
|
|
72
|
+
medium: 6,
|
|
73
|
+
high: 12
|
|
74
|
+
};
|
|
75
|
+
var EFFORT_TO_AI_BASE_MINUTES = {
|
|
76
|
+
low: 5,
|
|
77
|
+
medium: 20,
|
|
78
|
+
high: 90
|
|
79
|
+
};
|
|
80
|
+
var EFFORT_TO_COMPLEXITY = {
|
|
81
|
+
low: 0.3,
|
|
82
|
+
medium: 0.5,
|
|
83
|
+
high: 0.7
|
|
84
|
+
};
|
|
85
|
+
function effortToNominalHours(effort) {
|
|
86
|
+
return EFFORT_TO_HOURS[effort];
|
|
87
|
+
}
|
|
88
|
+
function effortToNominalComplexity(effort) {
|
|
89
|
+
return EFFORT_TO_COMPLEXITY[effort];
|
|
90
|
+
}
|
|
91
|
+
function resolveDebtRuntimeEstimate(effort, explicitMinutes) {
|
|
92
|
+
if (typeof explicitMinutes === "number" && Number.isFinite(explicitMinutes)) {
|
|
93
|
+
if (explicitMinutes <= 0) return {};
|
|
94
|
+
return {
|
|
95
|
+
// Clamp to [1, 1440]: sub-minute values persist as a valid minute rather
|
|
96
|
+
// than rounding to 0, and programmatic callers (createDebtItemAsync /
|
|
97
|
+
// updateDebtItemAsync are exported) cannot persist values above the
|
|
98
|
+
// shared ExpectedRuntimeMinutesSchema ceiling that the CLI enforces.
|
|
99
|
+
expectedRuntimeMinutes: Math.min(1440, Math.max(1, Math.round(explicitMinutes))),
|
|
100
|
+
runtimeEstimateProvenance: "explicit",
|
|
101
|
+
runtimeEstimateConfidence: "medium"
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const estimate = estimateRuntime({
|
|
105
|
+
baseExpectedRuntimeMs: EFFORT_TO_AI_BASE_MINUTES[effort] * 6e4
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
expectedRuntimeMinutes: Math.round(estimate.expectedRuntimeMs / 6e4),
|
|
109
|
+
runtimeEstimateProvenance: estimate.provenance,
|
|
110
|
+
runtimeEstimateConfidence: estimate.confidence
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function coerceDebtRuntimeEstimate(raw) {
|
|
114
|
+
const result = {};
|
|
115
|
+
const rawMinutes = raw.expectedRuntimeMinutes;
|
|
116
|
+
const minutes = typeof rawMinutes === "number" ? rawMinutes : typeof rawMinutes === "string" && rawMinutes.trim() !== "" ? Number(rawMinutes) : void 0;
|
|
117
|
+
if (typeof minutes === "number" && Number.isFinite(minutes) && minutes > 0) {
|
|
118
|
+
result.expectedRuntimeMinutes = minutes;
|
|
119
|
+
}
|
|
120
|
+
const provenance = raw.runtimeEstimateProvenance;
|
|
121
|
+
if (provenance === "heuristic" || provenance === "telemetry" || provenance === "blended" || provenance === "explicit") {
|
|
122
|
+
result.runtimeEstimateProvenance = provenance;
|
|
123
|
+
}
|
|
124
|
+
const confidence = raw.runtimeEstimateConfidence;
|
|
125
|
+
if (confidence === "low" || confidence === "medium" || confidence === "high") {
|
|
126
|
+
result.runtimeEstimateConfidence = confidence;
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
var legacyImpactLabels = {
|
|
131
|
+
critical: severityImpactDefaults.critical,
|
|
132
|
+
high: severityImpactDefaults.high,
|
|
133
|
+
medium: severityImpactDefaults.medium,
|
|
134
|
+
low: severityImpactDefaults.low
|
|
135
|
+
};
|
|
136
|
+
function defaultImpactForSeverity(severity) {
|
|
137
|
+
return severityImpactDefaults[severity ?? "medium"];
|
|
138
|
+
}
|
|
139
|
+
function coerceImpact(value, severity) {
|
|
140
|
+
let parsed;
|
|
141
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
142
|
+
parsed = value;
|
|
143
|
+
} else if (typeof value === "string") {
|
|
144
|
+
const trimmed = value.trim().toLowerCase();
|
|
145
|
+
const numericMatch = trimmed.match(/\d+(?:\.\d+)?/);
|
|
146
|
+
if (numericMatch) {
|
|
147
|
+
parsed = Number(numericMatch[0]);
|
|
148
|
+
} else if (trimmed in legacyImpactLabels) {
|
|
149
|
+
parsed = legacyImpactLabels[trimmed];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const impact = parsed ?? defaultImpactForSeverity(severity);
|
|
153
|
+
return Math.min(10, Math.max(1, Math.round(impact)));
|
|
154
|
+
}
|
|
155
|
+
function normalizeDebtItem(raw) {
|
|
156
|
+
const severity = raw.severity ?? "medium";
|
|
157
|
+
const effort = raw.effort ?? "medium";
|
|
158
|
+
const normalized = {
|
|
159
|
+
id: raw.id ?? "",
|
|
160
|
+
kind: "tech-debt",
|
|
161
|
+
title: raw.title ?? raw.id ?? "Untitled tech debt",
|
|
162
|
+
domain: raw.domain ?? "architecture",
|
|
163
|
+
severity,
|
|
164
|
+
effort,
|
|
165
|
+
impact: coerceImpact(raw.impact, severity),
|
|
166
|
+
status: raw.status ?? "pending",
|
|
167
|
+
estimatedComplexity: raw.estimatedComplexity ?? effortToNominalComplexity(effort),
|
|
168
|
+
estimatedHours: raw.estimatedHours ?? effortToNominalHours(effort),
|
|
169
|
+
// AI-era estimate: read-through only — legacy items round-trip byte-clean
|
|
170
|
+
// with no fabricated AI fields (matches task-manager's honesty pattern).
|
|
171
|
+
...coerceDebtRuntimeEstimate(raw),
|
|
172
|
+
rootCause: raw.rootCause ?? "To be documented",
|
|
173
|
+
blocking: raw.blocking ?? severity === "critical",
|
|
174
|
+
parallelizable: raw.parallelizable ?? severity !== "critical",
|
|
175
|
+
executeBy: raw.executeBy,
|
|
176
|
+
createdAt: raw.createdAt,
|
|
177
|
+
updatedAt: raw.updatedAt,
|
|
178
|
+
createdDate: raw.createdDate,
|
|
179
|
+
targetCompleteDate: raw.targetCompleteDate,
|
|
180
|
+
completedAt: raw.completedAt,
|
|
181
|
+
archivedAt: raw.archivedAt
|
|
182
|
+
};
|
|
183
|
+
if (!normalized.createdAt && normalized.createdDate) {
|
|
184
|
+
normalized.createdAt = `${normalized.createdDate}T00:00:00.000Z`;
|
|
185
|
+
}
|
|
186
|
+
return normalized;
|
|
187
|
+
}
|
|
188
|
+
function parseMarkdownContent(content, filePath) {
|
|
189
|
+
const match = content.match(/^---\n([\s\S]+?)\n---\n([\s\S]*)$/);
|
|
190
|
+
if (!match) {
|
|
191
|
+
throw new Error(`Invalid markdown format in ${filePath}: missing YAML front matter`);
|
|
192
|
+
}
|
|
193
|
+
const rawMetadata = yaml.load(match[1] ?? "", { schema: yaml.JSON_SCHEMA });
|
|
194
|
+
const body = (match[2] ?? "").trim();
|
|
195
|
+
return { metadata: normalizeDebtItem(rawMetadata), body };
|
|
196
|
+
}
|
|
197
|
+
function buildDebtItem(title, severity, effort, options = {}) {
|
|
198
|
+
const id = generateId(/* @__PURE__ */ new Date());
|
|
199
|
+
const debtItem = {
|
|
200
|
+
id,
|
|
201
|
+
kind: "tech-debt",
|
|
202
|
+
title,
|
|
203
|
+
domain: options.domain || "architecture",
|
|
204
|
+
severity,
|
|
205
|
+
effort,
|
|
206
|
+
impact: coerceImpact(options.impact, severity),
|
|
207
|
+
status: "pending",
|
|
208
|
+
// Advisory nominal derived from the explicit effort level (see EFFORT_TO_HOURS).
|
|
209
|
+
estimatedComplexity: options.estimatedComplexity ?? effortToNominalComplexity(effort),
|
|
210
|
+
estimatedHours: options.estimatedHours ?? effortToNominalHours(effort),
|
|
211
|
+
// AI-era primary estimate (advisory, [B5]): explicit minutes win, else
|
|
212
|
+
// effort-derived via the canonical estimator.
|
|
213
|
+
...resolveDebtRuntimeEstimate(effort, options.expectedRuntimeMinutes),
|
|
214
|
+
rootCause: options.rootCause || "To be documented",
|
|
215
|
+
blocking: options.blocking !== void 0 ? options.blocking : severity === "critical",
|
|
216
|
+
parallelizable: options.parallelizable !== void 0 ? options.parallelizable : severity !== "critical",
|
|
217
|
+
executeBy: options.executeBy,
|
|
218
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
219
|
+
targetCompleteDate: options.targetCompleteDate
|
|
220
|
+
};
|
|
221
|
+
const body = `# ${title}
|
|
222
|
+
|
|
223
|
+
## Problem
|
|
224
|
+
|
|
225
|
+
${options.rootCause || "To be documented"}
|
|
226
|
+
|
|
227
|
+
## Impact
|
|
228
|
+
|
|
229
|
+
- Severity: ${severity}
|
|
230
|
+
- Estimated effort: ${effort}${debtItem.expectedRuntimeMinutes ? ` (~${debtItem.expectedRuntimeMinutes}m AI est)` : ` (${debtItem.estimatedHours}h)`}
|
|
231
|
+
- Impact score: ${debtItem.impact}/10
|
|
232
|
+
- Blocks production: ${debtItem.blocking ? "Yes" : "No"}
|
|
233
|
+
- Can run in parallel: ${debtItem.parallelizable ? "Yes" : "No"}
|
|
234
|
+
|
|
235
|
+
## Scheduling Recommendation
|
|
236
|
+
|
|
237
|
+
${getSchedulingRecommendation(debtItem)}
|
|
238
|
+
|
|
239
|
+
## Solution
|
|
240
|
+
|
|
241
|
+
To be documented when assigned.
|
|
242
|
+
|
|
243
|
+
## Success Criteria
|
|
244
|
+
|
|
245
|
+
- [ ] Root cause addressed
|
|
246
|
+
- [ ] Tests passing
|
|
247
|
+
- [ ] Documentation updated
|
|
248
|
+
- [ ] No regressions introduced
|
|
249
|
+
`;
|
|
250
|
+
return { debtItem, body };
|
|
251
|
+
}
|
|
252
|
+
function regenerateIndexesAfterCreate(basePath) {
|
|
253
|
+
generateIndexes(basePath).catch((error) => {
|
|
254
|
+
if (error?.code === "ENOENT") return;
|
|
255
|
+
emitWarning(
|
|
256
|
+
"CFG-002",
|
|
257
|
+
{
|
|
258
|
+
taskId: "tech-debt-manager",
|
|
259
|
+
subsystem: "planning",
|
|
260
|
+
executionPhase: "cleanup"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
severity: "INFO" /* INFO */,
|
|
264
|
+
metadata: {
|
|
265
|
+
error: error instanceof Error ? error.message : String(error),
|
|
266
|
+
operation: "regenerate-indexes-after-create"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
async function parseMarkdownFile2(filePath) {
|
|
273
|
+
const content = await fs.readFile(filePath, "utf8");
|
|
274
|
+
return parseMarkdownContent(content, filePath);
|
|
275
|
+
}
|
|
276
|
+
async function getDebtItemAsync(itemId) {
|
|
277
|
+
const basePath = getPlanningRoot();
|
|
278
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
279
|
+
const filePath = path.join(currentPath, `${itemId}.md`);
|
|
280
|
+
try {
|
|
281
|
+
await fs.access(filePath);
|
|
282
|
+
} catch {
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
return parseMarkdownFile2(filePath);
|
|
286
|
+
}
|
|
287
|
+
async function writeMarkdownFile(filePath, metadata, body) {
|
|
288
|
+
const yamlStr = yaml.dump(metadata, { lineWidth: -1 });
|
|
289
|
+
const content = `---
|
|
290
|
+
${yamlStr}---
|
|
291
|
+
|
|
292
|
+
${body}`;
|
|
293
|
+
const tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
294
|
+
const handle = await fs.open(tempPath, "w");
|
|
295
|
+
try {
|
|
296
|
+
await handle.writeFile(content, "utf8");
|
|
297
|
+
await handle.sync();
|
|
298
|
+
await handle.close();
|
|
299
|
+
await fs.rename(tempPath, filePath);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
try {
|
|
302
|
+
await handle.close();
|
|
303
|
+
} catch {
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
await fs.unlink(tempPath);
|
|
307
|
+
} catch {
|
|
308
|
+
}
|
|
309
|
+
throw error;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async function createDebtItemAsync(title, severity, effort, options = {}) {
|
|
313
|
+
const basePath = getPlanningRoot();
|
|
314
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
315
|
+
await fs.mkdir(currentPath, { recursive: true });
|
|
316
|
+
const { debtItem, body } = buildDebtItem(title, severity, effort, options);
|
|
317
|
+
const filePath = path.join(currentPath, `${debtItem.id}.md`);
|
|
318
|
+
await writeMarkdownFile(filePath, debtItem, body);
|
|
319
|
+
regenerateIndexesAfterCreate(basePath);
|
|
320
|
+
return debtItem;
|
|
321
|
+
}
|
|
322
|
+
async function updateDebtItemAsync(itemId, fields) {
|
|
323
|
+
const basePath = getPlanningRoot();
|
|
324
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
325
|
+
const filePath = path.join(currentPath, `${itemId}.md`);
|
|
326
|
+
return withIndexRegeneration(basePath, async () => {
|
|
327
|
+
const loaded = await getDebtItemAsync(itemId);
|
|
328
|
+
if (!loaded) {
|
|
329
|
+
throw new Error(`Debt item not found: ${itemId}`);
|
|
330
|
+
}
|
|
331
|
+
const { metadata: existing, body: existingBody } = loaded;
|
|
332
|
+
const { yaml: rawFrontmatter } = await parseMarkdownFile(filePath);
|
|
333
|
+
const rawUpdated = { ...rawFrontmatter };
|
|
334
|
+
let changed = false;
|
|
335
|
+
const applyScalar = (key, value) => {
|
|
336
|
+
if (value === void 0) return;
|
|
337
|
+
if (rawUpdated[key] !== value) {
|
|
338
|
+
rawUpdated[key] = value;
|
|
339
|
+
changed = true;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
applyScalar("title", fields.title);
|
|
343
|
+
applyScalar("severity", fields.severity);
|
|
344
|
+
applyScalar("effort", fields.effort);
|
|
345
|
+
applyScalar("impact", fields.impact);
|
|
346
|
+
applyScalar("blocking", fields.blocking);
|
|
347
|
+
applyScalar("parallelizable", fields.parallelizable);
|
|
348
|
+
applyScalar("domain", fields.domain);
|
|
349
|
+
applyScalar("rootCause", fields.rootCause);
|
|
350
|
+
applyScalar("executeBy", fields.executeBy);
|
|
351
|
+
applyScalar("targetCompleteDate", fields.targetCompleteDate);
|
|
352
|
+
applyScalar("estimatedHours", fields.estimatedHours);
|
|
353
|
+
applyScalar("estimatedComplexity", fields.estimatedComplexity);
|
|
354
|
+
if (fields.expectedRuntimeMinutes !== void 0) {
|
|
355
|
+
const explicit = resolveDebtRuntimeEstimate(
|
|
356
|
+
rawUpdated.effort ?? "medium",
|
|
357
|
+
fields.expectedRuntimeMinutes
|
|
358
|
+
);
|
|
359
|
+
applyScalar("expectedRuntimeMinutes", explicit.expectedRuntimeMinutes);
|
|
360
|
+
applyScalar("runtimeEstimateProvenance", explicit.runtimeEstimateProvenance);
|
|
361
|
+
applyScalar("runtimeEstimateConfidence", explicit.runtimeEstimateConfidence);
|
|
362
|
+
} else if (fields.effort !== void 0 && rawUpdated.runtimeEstimateProvenance !== "explicit" && rawUpdated.runtimeEstimateProvenance !== "telemetry" && rawUpdated.expectedRuntimeMinutes !== void 0) {
|
|
363
|
+
const rederived = resolveDebtRuntimeEstimate(fields.effort);
|
|
364
|
+
applyScalar("expectedRuntimeMinutes", rederived.expectedRuntimeMinutes);
|
|
365
|
+
applyScalar("runtimeEstimateProvenance", rederived.runtimeEstimateProvenance);
|
|
366
|
+
applyScalar("runtimeEstimateConfidence", rederived.runtimeEstimateConfidence);
|
|
367
|
+
}
|
|
368
|
+
if (typeof rawUpdated.expectedRuntimeMinutes === "string") {
|
|
369
|
+
const repaired = Number(rawUpdated.expectedRuntimeMinutes);
|
|
370
|
+
if (Number.isFinite(repaired)) {
|
|
371
|
+
rawUpdated.expectedRuntimeMinutes = repaired;
|
|
372
|
+
changed = true;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
let nextBody = existingBody;
|
|
376
|
+
if (fields.body !== void 0 && fields.body !== existingBody) {
|
|
377
|
+
nextBody = fields.body;
|
|
378
|
+
changed = true;
|
|
379
|
+
}
|
|
380
|
+
if (!changed) {
|
|
381
|
+
return { item: existing, filePath, changed: false };
|
|
382
|
+
}
|
|
383
|
+
rawUpdated.id = itemId;
|
|
384
|
+
rawUpdated.kind = "tech-debt";
|
|
385
|
+
rawUpdated.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
386
|
+
const validation = validateDebtItem(rawUpdated);
|
|
387
|
+
if (!validation.valid) {
|
|
388
|
+
const detail = validation.errors.map((error) => `${error.field}: ${error.message}`).join("; ");
|
|
389
|
+
throw new Error(`Invalid debt item after update (${itemId}): ${detail}`);
|
|
390
|
+
}
|
|
391
|
+
await writeMarkdownFile(filePath, rawUpdated, nextBody);
|
|
392
|
+
const { metadata: normalizedUpdated } = parseMarkdownContent(
|
|
393
|
+
`---
|
|
394
|
+
${yaml.dump(rawUpdated, { lineWidth: -1 })}---
|
|
395
|
+
${nextBody}`,
|
|
396
|
+
filePath
|
|
397
|
+
);
|
|
398
|
+
return { item: normalizedUpdated, filePath, changed: true };
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
function getSchedulingRecommendation(item) {
|
|
402
|
+
if (item.severity === "critical" && item.blocking) {
|
|
403
|
+
return "Execute immediately - halt sprint if necessary";
|
|
404
|
+
}
|
|
405
|
+
if (item.severity === "critical" && !item.blocking) {
|
|
406
|
+
return "Execute in parallel with current sprint";
|
|
407
|
+
}
|
|
408
|
+
if (item.severity === "high" && item.blocking) {
|
|
409
|
+
return "Add to current sprint - adjust capacity";
|
|
410
|
+
}
|
|
411
|
+
if (item.severity === "high" && !item.blocking) {
|
|
412
|
+
return "Schedule for next sprint";
|
|
413
|
+
}
|
|
414
|
+
if (item.severity === "medium") {
|
|
415
|
+
return "Opportunistic execution when capacity available";
|
|
416
|
+
}
|
|
417
|
+
return "Backlog for future sprints";
|
|
418
|
+
}
|
|
419
|
+
async function listByBlockingAsync() {
|
|
420
|
+
const basePath = getPlanningRoot();
|
|
421
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
422
|
+
const files = await listMarkdownFileNames(currentPath);
|
|
423
|
+
const debtItems = [];
|
|
424
|
+
for (const file of files) {
|
|
425
|
+
const filePath = path.join(currentPath, file);
|
|
426
|
+
try {
|
|
427
|
+
const { metadata } = await parseMarkdownFile2(filePath);
|
|
428
|
+
if (metadata.blocking) {
|
|
429
|
+
debtItems.push(metadata);
|
|
430
|
+
}
|
|
431
|
+
} catch (error) {
|
|
432
|
+
warnDebtReadError(error, file, "list-blocking-debt");
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return sortBySeverityThenImpact(debtItems);
|
|
436
|
+
}
|
|
437
|
+
async function listByParallelizableAsync() {
|
|
438
|
+
const basePath = getPlanningRoot();
|
|
439
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
440
|
+
const files = await listMarkdownFileNames(currentPath);
|
|
441
|
+
const debtItems = [];
|
|
442
|
+
for (const file of files) {
|
|
443
|
+
const filePath = path.join(currentPath, file);
|
|
444
|
+
try {
|
|
445
|
+
const { metadata } = await parseMarkdownFile2(filePath);
|
|
446
|
+
if (metadata.parallelizable) {
|
|
447
|
+
debtItems.push(metadata);
|
|
448
|
+
}
|
|
449
|
+
} catch (error) {
|
|
450
|
+
warnDebtReadError(error, file, "list-parallelizable-debt");
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return sortBySeverityThenHours(debtItems);
|
|
454
|
+
}
|
|
455
|
+
async function scheduleDebtAsync(itemId, when) {
|
|
456
|
+
const basePath = getPlanningRoot();
|
|
457
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
458
|
+
const filePath = path.join(currentPath, `${itemId}.md`);
|
|
459
|
+
try {
|
|
460
|
+
await fs.access(filePath);
|
|
461
|
+
} catch {
|
|
462
|
+
throw new Error(`Debt item not found: ${itemId}`);
|
|
463
|
+
}
|
|
464
|
+
const { metadata, body } = await parseMarkdownFile2(filePath);
|
|
465
|
+
applyDebtSchedule(metadata, when);
|
|
466
|
+
await writeMarkdownFile(filePath, metadata, body);
|
|
467
|
+
return metadata;
|
|
468
|
+
}
|
|
469
|
+
async function completeDebtAsync(itemId) {
|
|
470
|
+
const basePath = getPlanningRoot();
|
|
471
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
472
|
+
const bucket = getBucketByName("tech-debt", basePath);
|
|
473
|
+
if (!bucket) {
|
|
474
|
+
throw new Error("Bucket not configured: tech-debt");
|
|
475
|
+
}
|
|
476
|
+
const currentFile = path.join(currentPath, `${itemId}.md`);
|
|
477
|
+
try {
|
|
478
|
+
await fs.access(currentFile);
|
|
479
|
+
} catch {
|
|
480
|
+
throw new Error(`Debt item not found: ${itemId}`);
|
|
481
|
+
}
|
|
482
|
+
const { metadata, body } = await parseMarkdownFile2(currentFile);
|
|
483
|
+
markDebtComplete(metadata);
|
|
484
|
+
const archivedAt = metadata.archivedAt;
|
|
485
|
+
const archivedFile = getArchivedFilePath(bucket, itemId, archivedAt, basePath);
|
|
486
|
+
await fs.mkdir(path.dirname(archivedFile), { recursive: true });
|
|
487
|
+
await writeMarkdownFile(archivedFile, metadata, body);
|
|
488
|
+
await fs.unlink(currentFile);
|
|
489
|
+
return metadata;
|
|
490
|
+
}
|
|
491
|
+
async function listAllDebtAsync(includeArchived = false, rootDir) {
|
|
492
|
+
const basePath = rootDir ?? getPlanningRoot();
|
|
493
|
+
const currentPath = getBucketPathByKind("tech-debt", basePath);
|
|
494
|
+
const archivedPath = getBucketArchivePathByKind("tech-debt", basePath);
|
|
495
|
+
const items = [];
|
|
496
|
+
for (const file of await listMarkdownFileNames(currentPath)) {
|
|
497
|
+
try {
|
|
498
|
+
const { metadata } = await parseMarkdownFile2(path.join(currentPath, file));
|
|
499
|
+
items.push(metadata);
|
|
500
|
+
} catch (error) {
|
|
501
|
+
warnDebtReadError(error, file, "list-all-debt-current");
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (includeArchived) {
|
|
505
|
+
const files = await listMarkdownFilesRecursive2(archivedPath);
|
|
506
|
+
for (const file of files) {
|
|
507
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
try {
|
|
511
|
+
const { metadata } = await parseMarkdownFile2(file);
|
|
512
|
+
items.push(metadata);
|
|
513
|
+
} catch (error) {
|
|
514
|
+
warnDebtReadError(error, path.relative(basePath, file), "list-all-debt-archived");
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
return items;
|
|
519
|
+
}
|
|
520
|
+
async function listMarkdownFileNames(directory) {
|
|
521
|
+
let entries;
|
|
522
|
+
try {
|
|
523
|
+
entries = await fs.readdir(directory, { withFileTypes: true });
|
|
524
|
+
} catch {
|
|
525
|
+
return [];
|
|
526
|
+
}
|
|
527
|
+
return entries.filter(
|
|
528
|
+
(entry) => entry.isFile() && entry.name.endsWith(".md") && entry.name.toLowerCase() !== "readme.md"
|
|
529
|
+
).map((entry) => entry.name);
|
|
530
|
+
}
|
|
531
|
+
async function listMarkdownFilesRecursive2(directory) {
|
|
532
|
+
const results = [];
|
|
533
|
+
let entries;
|
|
534
|
+
try {
|
|
535
|
+
entries = await fs.readdir(directory, { withFileTypes: true });
|
|
536
|
+
} catch {
|
|
537
|
+
return results;
|
|
538
|
+
}
|
|
539
|
+
for (const entry of entries) {
|
|
540
|
+
const fullPath = path.join(directory, entry.name);
|
|
541
|
+
if (entry.isDirectory()) {
|
|
542
|
+
results.push(...await listMarkdownFilesRecursive2(fullPath));
|
|
543
|
+
} else if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
544
|
+
results.push(fullPath);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return results;
|
|
548
|
+
}
|
|
549
|
+
function sortBySeverityThenImpact(items) {
|
|
550
|
+
return items.sort((a, b) => {
|
|
551
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
552
|
+
const sevCompare = severityOrder[a.severity] - severityOrder[b.severity];
|
|
553
|
+
return sevCompare !== 0 ? sevCompare : b.impact - a.impact;
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
function sortBySeverityThenHours(items) {
|
|
557
|
+
const tiebreakMinutes = (item) => item.expectedRuntimeMinutes ?? item.estimatedHours * 60;
|
|
558
|
+
return items.sort((a, b) => {
|
|
559
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
560
|
+
const sevCompare = severityOrder[a.severity] - severityOrder[b.severity];
|
|
561
|
+
return sevCompare !== 0 ? sevCompare : tiebreakMinutes(a) - tiebreakMinutes(b);
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
function applyDebtSchedule(metadata, when) {
|
|
565
|
+
const now = /* @__PURE__ */ new Date();
|
|
566
|
+
switch (when) {
|
|
567
|
+
case "immediate":
|
|
568
|
+
metadata.executeBy = now.toISOString().split("T")[0];
|
|
569
|
+
metadata.status = "in-progress";
|
|
570
|
+
break;
|
|
571
|
+
case "current-sprint": {
|
|
572
|
+
const currentSprintEnd = new Date(now);
|
|
573
|
+
currentSprintEnd.setDate(currentSprintEnd.getDate() + 7);
|
|
574
|
+
metadata.targetCompleteDate = currentSprintEnd.toISOString().split("T")[0];
|
|
575
|
+
break;
|
|
576
|
+
}
|
|
577
|
+
case "next-sprint": {
|
|
578
|
+
const nextSprintEnd = new Date(now);
|
|
579
|
+
nextSprintEnd.setDate(nextSprintEnd.getDate() + 14);
|
|
580
|
+
metadata.targetCompleteDate = nextSprintEnd.toISOString().split("T")[0];
|
|
581
|
+
break;
|
|
582
|
+
}
|
|
583
|
+
case "backlog":
|
|
584
|
+
delete metadata.executeBy;
|
|
585
|
+
delete metadata.targetCompleteDate;
|
|
586
|
+
break;
|
|
587
|
+
}
|
|
588
|
+
metadata.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
589
|
+
}
|
|
590
|
+
function markDebtComplete(metadata) {
|
|
591
|
+
metadata.status = "completed";
|
|
592
|
+
metadata.completedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
593
|
+
metadata.archivedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
594
|
+
metadata.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
595
|
+
}
|
|
596
|
+
function warnDebtReadError(error, file, operation) {
|
|
597
|
+
emitWarning(
|
|
598
|
+
"WS-002G",
|
|
599
|
+
{
|
|
600
|
+
taskId: "tech-debt-manager",
|
|
601
|
+
subsystem: "planning",
|
|
602
|
+
executionPhase: "execution"
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
severity: "WARN" /* WARN */,
|
|
606
|
+
skipConsole: true,
|
|
607
|
+
metadata: {
|
|
608
|
+
error: error instanceof Error ? error.message : String(error),
|
|
609
|
+
file,
|
|
610
|
+
operation
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// src/core/read-models/next.ts
|
|
617
|
+
async function tryGetGitHeadSha(cwd) {
|
|
618
|
+
try {
|
|
619
|
+
const result = await execa("git", ["rev-parse", "HEAD"], { cwd });
|
|
620
|
+
const sha = result.stdout.trim();
|
|
621
|
+
return sha.length > 0 ? sha : void 0;
|
|
622
|
+
} catch {
|
|
623
|
+
return void 0;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
var GIT_DIFF_CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
627
|
+
var GIT_DIFF_CACHE_MAX_ENTRIES = 500;
|
|
628
|
+
var gitDiffCache = /* @__PURE__ */ new Map();
|
|
629
|
+
function pruneGitDiffCache(now) {
|
|
630
|
+
for (const [key, value] of gitDiffCache.entries()) {
|
|
631
|
+
if (now - value.cachedAt > GIT_DIFF_CACHE_TTL_MS) {
|
|
632
|
+
gitDiffCache.delete(key);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
if (gitDiffCache.size <= GIT_DIFF_CACHE_MAX_ENTRIES) {
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
const entriesByAge = [...gitDiffCache.entries()].sort((a, b) => a[1].cachedAt - b[1].cachedAt);
|
|
639
|
+
const overflowCount = gitDiffCache.size - GIT_DIFF_CACHE_MAX_ENTRIES;
|
|
640
|
+
for (const [key] of entriesByAge.slice(0, overflowCount)) {
|
|
641
|
+
gitDiffCache.delete(key);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
async function getChangedFiles(cwd, fromSha, toSha, files) {
|
|
645
|
+
if (files.length === 0) return [];
|
|
646
|
+
const sortedFiles = [...files].sort();
|
|
647
|
+
const cacheKey = `${fromSha}..${toSha}:${sortedFiles.join(",")}`;
|
|
648
|
+
const now = Date.now();
|
|
649
|
+
pruneGitDiffCache(now);
|
|
650
|
+
const cached = gitDiffCache.get(cacheKey);
|
|
651
|
+
if (cached !== void 0 && now - cached.cachedAt <= GIT_DIFF_CACHE_TTL_MS) {
|
|
652
|
+
return cached.changedFiles;
|
|
653
|
+
}
|
|
654
|
+
try {
|
|
655
|
+
const result = await execa(
|
|
656
|
+
"git",
|
|
657
|
+
["diff", "--name-only", `${fromSha}..${toSha}`, "--", ...files],
|
|
658
|
+
{
|
|
659
|
+
cwd,
|
|
660
|
+
reject: false
|
|
661
|
+
}
|
|
662
|
+
);
|
|
663
|
+
const changedFiles = result.exitCode === 0 ? result.stdout.split("\n").map((f) => f.trim()).filter((f) => f.length > 0) : [];
|
|
664
|
+
gitDiffCache.set(cacheKey, { changedFiles, cachedAt: now });
|
|
665
|
+
pruneGitDiffCache(now);
|
|
666
|
+
return changedFiles;
|
|
667
|
+
} catch {
|
|
668
|
+
return [];
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
function normalizeTitle(title) {
|
|
672
|
+
return title.normalize("NFD").replace(/[\u0300-\u036f]/g, "").normalize("NFKC").toLowerCase().replace(/[^\w\s]/g, "").replace(/\s+/g, " ").trim();
|
|
673
|
+
}
|
|
674
|
+
var STOP_WORDS = /* @__PURE__ */ new Set(["the", "and", "for", "with", "from", "that", "this", "then"]);
|
|
675
|
+
var COMMON_VERBS = /* @__PURE__ */ new Set([
|
|
676
|
+
"add",
|
|
677
|
+
"fix",
|
|
678
|
+
"implement",
|
|
679
|
+
"update",
|
|
680
|
+
"remove",
|
|
681
|
+
"delete",
|
|
682
|
+
"change",
|
|
683
|
+
"support",
|
|
684
|
+
"show",
|
|
685
|
+
"list",
|
|
686
|
+
"create",
|
|
687
|
+
"enable",
|
|
688
|
+
"disable",
|
|
689
|
+
"allow",
|
|
690
|
+
"ensure"
|
|
691
|
+
]);
|
|
692
|
+
function areNearDuplicates(title1, title2) {
|
|
693
|
+
const norm1 = normalizeTitle(title1);
|
|
694
|
+
const norm2 = normalizeTitle(title2);
|
|
695
|
+
if (norm1 === norm2) return true;
|
|
696
|
+
const phrase1 = ` ${norm1} `;
|
|
697
|
+
const phrase2 = ` ${norm2} `;
|
|
698
|
+
if (phrase1.includes(phrase2) || phrase2.includes(phrase1)) {
|
|
699
|
+
const words1 = norm1.split(" ");
|
|
700
|
+
const words2 = norm2.split(" ");
|
|
701
|
+
if (Math.min(words1.length, words2.length) >= 3) return true;
|
|
702
|
+
}
|
|
703
|
+
const tokens1 = norm1.split(" ").filter((t) => t.length > 2);
|
|
704
|
+
const tokens2 = norm2.split(" ").filter((t) => t.length > 2);
|
|
705
|
+
if (tokens1.length === 0 || tokens2.length === 0) return false;
|
|
706
|
+
const filtered1 = tokens1.filter((t) => !STOP_WORDS.has(t) && !COMMON_VERBS.has(t));
|
|
707
|
+
const filtered2 = tokens2.filter((t) => !STOP_WORDS.has(t) && !COMMON_VERBS.has(t));
|
|
708
|
+
if (filtered1.length === 0 || filtered2.length === 0) return false;
|
|
709
|
+
const set1 = new Set(filtered1);
|
|
710
|
+
const set2 = new Set(filtered2);
|
|
711
|
+
const intersection = [...set1].filter((t) => set2.has(t));
|
|
712
|
+
const smallerSize = Math.min(set1.size, set2.size);
|
|
713
|
+
const unionSize = (/* @__PURE__ */ new Set([...set1, ...set2])).size;
|
|
714
|
+
if (smallerSize === 0) return false;
|
|
715
|
+
const overlapRatio = intersection.length / smallerSize;
|
|
716
|
+
const jaccardRatio = intersection.length / unionSize;
|
|
717
|
+
if (smallerSize <= 2) {
|
|
718
|
+
return overlapRatio >= 0.85 && jaccardRatio >= 0.5;
|
|
719
|
+
}
|
|
720
|
+
return overlapRatio >= 0.75 && jaccardRatio >= 0.4;
|
|
721
|
+
}
|
|
722
|
+
function normalizeTaskStatus(rawStatus) {
|
|
723
|
+
const statusMap = {
|
|
724
|
+
todo: "todo",
|
|
725
|
+
in_progress: "in_progress",
|
|
726
|
+
review: "review",
|
|
727
|
+
done: "done",
|
|
728
|
+
blocked: "blocked",
|
|
729
|
+
cancelled: "cancelled",
|
|
730
|
+
canceled: "cancelled",
|
|
731
|
+
pending: "todo",
|
|
732
|
+
"in-progress": "in_progress",
|
|
733
|
+
completed: "done",
|
|
734
|
+
archived: "done"
|
|
735
|
+
};
|
|
736
|
+
if (typeof rawStatus !== "string") return "todo";
|
|
737
|
+
return statusMap[rawStatus] ?? "todo";
|
|
738
|
+
}
|
|
739
|
+
async function getLinkedBacklogEligibility(rootDir) {
|
|
740
|
+
const linkedCompletedIds = /* @__PURE__ */ new Set();
|
|
741
|
+
const linkedBlockedIds = /* @__PURE__ */ new Set();
|
|
742
|
+
const linkedUnsatisfiedDependencyIds = /* @__PURE__ */ new Set();
|
|
743
|
+
try {
|
|
744
|
+
const tasksDir = getBucketPathByKind("task", rootDir);
|
|
745
|
+
const archiveDir = path2.join(tasksDir, "archive");
|
|
746
|
+
const taskStatuses = /* @__PURE__ */ new Map();
|
|
747
|
+
const activeTasks = [];
|
|
748
|
+
const taskFiles = await listMarkdownFiles(tasksDir);
|
|
749
|
+
for (const file of taskFiles) {
|
|
750
|
+
try {
|
|
751
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
752
|
+
const taskId = typeof frontMatter.id === "string" ? frontMatter.id : void 0;
|
|
753
|
+
const status = normalizeTaskStatus(frontMatter.status);
|
|
754
|
+
if (taskId) {
|
|
755
|
+
taskStatuses.set(taskId, { status, archived: false });
|
|
756
|
+
}
|
|
757
|
+
if (taskId && typeof frontMatter.backlogItemId === "string" && frontMatter.backlogItemId.length > 0) {
|
|
758
|
+
activeTasks.push({
|
|
759
|
+
id: taskId,
|
|
760
|
+
backlogItemId: frontMatter.backlogItemId,
|
|
761
|
+
status,
|
|
762
|
+
dependencies: Array.isArray(frontMatter.dependencies) ? frontMatter.dependencies.filter((dep) => typeof dep === "string") : []
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
} catch {
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
const archivedTaskFiles = await listMarkdownFilesRecursive(archiveDir).catch(() => []);
|
|
769
|
+
for (const file of archivedTaskFiles) {
|
|
770
|
+
try {
|
|
771
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
772
|
+
const taskId = typeof frontMatter.id === "string" ? frontMatter.id : void 0;
|
|
773
|
+
const status = normalizeTaskStatus(frontMatter.status);
|
|
774
|
+
if (taskId && !taskStatuses.has(taskId)) {
|
|
775
|
+
taskStatuses.set(taskId, { status, archived: true });
|
|
776
|
+
}
|
|
777
|
+
if (typeof frontMatter.backlogItemId === "string" && frontMatter.backlogItemId.length > 0 && (status === "done" || status === "review")) {
|
|
778
|
+
linkedCompletedIds.add(frontMatter.backlogItemId);
|
|
779
|
+
}
|
|
780
|
+
} catch {
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
for (const task of activeTasks) {
|
|
784
|
+
if (task.status === "done" || task.status === "review") {
|
|
785
|
+
linkedCompletedIds.add(task.backlogItemId);
|
|
786
|
+
continue;
|
|
787
|
+
}
|
|
788
|
+
if (task.status === "blocked") {
|
|
789
|
+
linkedBlockedIds.add(task.backlogItemId);
|
|
790
|
+
continue;
|
|
791
|
+
}
|
|
792
|
+
if (task.dependencies.length === 0) {
|
|
793
|
+
continue;
|
|
794
|
+
}
|
|
795
|
+
const hasUnsatisfiedDependency = task.dependencies.some((dependencyId) => {
|
|
796
|
+
const depStatus = taskStatuses.get(dependencyId);
|
|
797
|
+
if (!depStatus) return true;
|
|
798
|
+
return depStatus.status !== "done";
|
|
799
|
+
});
|
|
800
|
+
if (hasUnsatisfiedDependency) {
|
|
801
|
+
linkedUnsatisfiedDependencyIds.add(task.backlogItemId);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
} catch {
|
|
805
|
+
}
|
|
806
|
+
return {
|
|
807
|
+
linkedCompletedIds,
|
|
808
|
+
linkedBlockedIds,
|
|
809
|
+
linkedUnsatisfiedDependencyIds
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
async function getGraphBlockedBacklogItems(rootDir) {
|
|
813
|
+
const blocked = /* @__PURE__ */ new Map();
|
|
814
|
+
try {
|
|
815
|
+
const context = await loadWorkGraphContext(rootDir);
|
|
816
|
+
const isSatisfied = (blockerId) => {
|
|
817
|
+
const blocker = context.itemsById.get(blockerId);
|
|
818
|
+
if (!blocker) return true;
|
|
819
|
+
const rawStatus = blocker.frontMatter.status;
|
|
820
|
+
const status = typeof rawStatus === "string" ? rawStatus : "";
|
|
821
|
+
return status === "done" || status === "archived" || status === "completed";
|
|
822
|
+
};
|
|
823
|
+
for (const [itemId, item] of context.itemsById) {
|
|
824
|
+
if (item.frontMatter.kind !== "backlog") continue;
|
|
825
|
+
const view = buildGraphBlockersView(context, itemId);
|
|
826
|
+
if (!view || view.blockers.length === 0) continue;
|
|
827
|
+
const unresolved = [];
|
|
828
|
+
const seen = /* @__PURE__ */ new Set();
|
|
829
|
+
for (const blocker of view.blockers) {
|
|
830
|
+
if (seen.has(blocker.id)) continue;
|
|
831
|
+
seen.add(blocker.id);
|
|
832
|
+
if (!isSatisfied(blocker.id)) {
|
|
833
|
+
unresolved.push({ id: blocker.id, title: blocker.title });
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
if (unresolved.length > 0) {
|
|
837
|
+
blocked.set(itemId, unresolved);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
} catch {
|
|
841
|
+
}
|
|
842
|
+
return blocked;
|
|
843
|
+
}
|
|
844
|
+
async function getArchivedBacklogTitles(rootDir) {
|
|
845
|
+
const titles = /* @__PURE__ */ new Map();
|
|
846
|
+
try {
|
|
847
|
+
const archiveDir = path2.join(getBucketPathByKind("backlog", rootDir), "archive");
|
|
848
|
+
const files = await listMarkdownFilesRecursive(archiveDir);
|
|
849
|
+
for (const file of files) {
|
|
850
|
+
try {
|
|
851
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
852
|
+
if (frontMatter.title && typeof frontMatter.title === "string") {
|
|
853
|
+
const normalized = normalizeTitle(frontMatter.title);
|
|
854
|
+
titles.set(normalized, {
|
|
855
|
+
id: frontMatter.id,
|
|
856
|
+
title: frontMatter.title
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
} catch {
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
} catch {
|
|
863
|
+
}
|
|
864
|
+
return titles;
|
|
865
|
+
}
|
|
866
|
+
function extractBodyPreview(body, maxChars = 300) {
|
|
867
|
+
const withoutTitle = body.replace(/^\s*#[^\n]*\n?/, "").trim();
|
|
868
|
+
if (withoutTitle.length === 0) return "";
|
|
869
|
+
const lines = withoutTitle.split(/\r?\n/);
|
|
870
|
+
while (lines.length > 0) {
|
|
871
|
+
const firstLine = (lines[0] ?? "").trim();
|
|
872
|
+
if (firstLine.length === 0 || /^#{1,6}\s+/.test(firstLine)) {
|
|
873
|
+
lines.shift();
|
|
874
|
+
continue;
|
|
875
|
+
}
|
|
876
|
+
break;
|
|
877
|
+
}
|
|
878
|
+
const stripped = lines.join("\n").trim();
|
|
879
|
+
if (stripped.length === 0) return "";
|
|
880
|
+
if (stripped.length <= maxChars) return stripped;
|
|
881
|
+
const truncated = stripped.slice(0, maxChars);
|
|
882
|
+
const lastSpace = truncated.lastIndexOf(" ");
|
|
883
|
+
const cutPoint = lastSpace > maxChars * 0.5 ? lastSpace : maxChars;
|
|
884
|
+
return `${truncated.slice(0, cutPoint)}...`;
|
|
885
|
+
}
|
|
886
|
+
function extractAcceptanceCriteria(body) {
|
|
887
|
+
const lines = body.split(/\r?\n/);
|
|
888
|
+
const criteria = [];
|
|
889
|
+
let inAcceptanceCriteria = false;
|
|
890
|
+
let inExampleBlock = false;
|
|
891
|
+
for (const rawLine of lines) {
|
|
892
|
+
const headingMatch = rawLine.match(/^\s{0,3}#{1,6}\s+(.+?)\s*$/);
|
|
893
|
+
if (headingMatch) {
|
|
894
|
+
const heading = headingMatch[1]?.replace(/:\s*$/, "").trim().toLowerCase();
|
|
895
|
+
if (!inAcceptanceCriteria) {
|
|
896
|
+
inAcceptanceCriteria = heading === "acceptance criteria";
|
|
897
|
+
continue;
|
|
898
|
+
}
|
|
899
|
+
break;
|
|
900
|
+
}
|
|
901
|
+
if (!inAcceptanceCriteria) continue;
|
|
902
|
+
const line = rawLine.trim();
|
|
903
|
+
if (line.length === 0) continue;
|
|
904
|
+
if (/^example\s*:?\s*$/i.test(line)) {
|
|
905
|
+
inExampleBlock = true;
|
|
906
|
+
continue;
|
|
907
|
+
}
|
|
908
|
+
if (inExampleBlock) continue;
|
|
909
|
+
const checkboxMatch = line.match(/^- \[(?: |x|X)\]\s+(.+)$/);
|
|
910
|
+
if (!checkboxMatch) continue;
|
|
911
|
+
const content = checkboxMatch[1]?.trim() ?? "";
|
|
912
|
+
if (content.length === 0) continue;
|
|
913
|
+
if (content.includes("<<<") || content.includes(">>>")) continue;
|
|
914
|
+
criteria.push(content);
|
|
915
|
+
}
|
|
916
|
+
return criteria;
|
|
917
|
+
}
|
|
918
|
+
async function queryNextItems(options) {
|
|
919
|
+
const { rootDir } = options;
|
|
920
|
+
const backlogDir = getBucketPathByKind("backlog", rootDir);
|
|
921
|
+
const requestedKinds = options.kinds ?? [];
|
|
922
|
+
const shouldQueryBacklog = requestedKinds.length === 0 || requestedKinds.includes("backlog");
|
|
923
|
+
const backlogExists = shouldQueryBacklog ? await fs2.stat(backlogDir).then(() => true).catch(() => false) : false;
|
|
924
|
+
if (!backlogExists && !options.includeFindings && requestedKinds.length === 0) {
|
|
925
|
+
return [];
|
|
926
|
+
}
|
|
927
|
+
const inboxItems = backlogExists ? await listBacklogItems(backlogDir, "inbox") : [];
|
|
928
|
+
const reviewedItems = backlogExists ? await listBacklogItems(backlogDir, "reviewed") : [];
|
|
929
|
+
const linkedEligibility = backlogExists ? await getLinkedBacklogEligibility(rootDir) : {
|
|
930
|
+
linkedCompletedIds: /* @__PURE__ */ new Set(),
|
|
931
|
+
linkedBlockedIds: /* @__PURE__ */ new Set(),
|
|
932
|
+
linkedUnsatisfiedDependencyIds: /* @__PURE__ */ new Set()
|
|
933
|
+
};
|
|
934
|
+
const graphBlockedItems = backlogExists ? await getGraphBlockedBacklogItems(rootDir) : /* @__PURE__ */ new Map();
|
|
935
|
+
const archivedTitles = backlogExists ? await getArchivedBacklogTitles(rootDir) : /* @__PURE__ */ new Map();
|
|
936
|
+
const activeProvenanceStatuses = /* @__PURE__ */ new Set([
|
|
937
|
+
"pr-open",
|
|
938
|
+
"archive-sync-pending",
|
|
939
|
+
"delivered-local",
|
|
940
|
+
"merged",
|
|
941
|
+
"archived"
|
|
942
|
+
]);
|
|
943
|
+
const provenanceSuppressedIds = /* @__PURE__ */ new Set();
|
|
944
|
+
const blockedProvenanceReasons = /* @__PURE__ */ new Map();
|
|
945
|
+
if (backlogExists) {
|
|
946
|
+
const allCandidateIds = [...inboxItems, ...reviewedItems].map((item) => item.id);
|
|
947
|
+
await Promise.all(
|
|
948
|
+
allCandidateIds.map(async (id) => {
|
|
949
|
+
try {
|
|
950
|
+
const provenance = await loadBacklogExecutionProvenance(rootDir, id, {
|
|
951
|
+
cleanupTerminalLocks: false
|
|
952
|
+
});
|
|
953
|
+
if (provenance?.status === "executing" && await isBacklogExecutionProvenanceActivelyExecuting(rootDir, provenance)) {
|
|
954
|
+
provenanceSuppressedIds.add(id);
|
|
955
|
+
} else if (provenance && activeProvenanceStatuses.has(provenance.status)) {
|
|
956
|
+
provenanceSuppressedIds.add(id);
|
|
957
|
+
} else if (provenance?.status === "blocked") {
|
|
958
|
+
const blockedReason = provenance.errorMessage?.trim();
|
|
959
|
+
if (blockedReason) {
|
|
960
|
+
blockedProvenanceReasons.set(id, blockedReason);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
} catch {
|
|
964
|
+
}
|
|
965
|
+
})
|
|
966
|
+
);
|
|
967
|
+
}
|
|
968
|
+
const candidates = [];
|
|
969
|
+
let headSha;
|
|
970
|
+
const ensureHeadSha = async () => {
|
|
971
|
+
if (headSha) return headSha;
|
|
972
|
+
headSha = await tryGetGitHeadSha(rootDir);
|
|
973
|
+
return headSha;
|
|
974
|
+
};
|
|
975
|
+
const processItem = (item, statusLabel) => {
|
|
976
|
+
if (linkedEligibility.linkedCompletedIds.has(item.id)) {
|
|
977
|
+
return null;
|
|
978
|
+
}
|
|
979
|
+
if (linkedEligibility.linkedBlockedIds.has(item.id)) {
|
|
980
|
+
return null;
|
|
981
|
+
}
|
|
982
|
+
if (linkedEligibility.linkedUnsatisfiedDependencyIds.has(item.id)) {
|
|
983
|
+
return null;
|
|
984
|
+
}
|
|
985
|
+
const openBlockers = graphBlockedItems.get(item.id);
|
|
986
|
+
if (openBlockers && openBlockers.length > 0 && !options.includeBlocked) {
|
|
987
|
+
return null;
|
|
988
|
+
}
|
|
989
|
+
if (provenanceSuppressedIds.has(item.id)) {
|
|
990
|
+
return null;
|
|
991
|
+
}
|
|
992
|
+
let isDuplicate = false;
|
|
993
|
+
let duplicateOf;
|
|
994
|
+
for (const [, archived] of archivedTitles) {
|
|
995
|
+
if (areNearDuplicates(item.title, archived.title)) {
|
|
996
|
+
isDuplicate = true;
|
|
997
|
+
duplicateOf = archived.id;
|
|
998
|
+
break;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
if (isDuplicate && !options.includeDuplicates) {
|
|
1002
|
+
return null;
|
|
1003
|
+
}
|
|
1004
|
+
const reviewedHeadSha = typeof item.reviewedHeadSha === "string" && item.reviewedHeadSha.length > 0 ? item.reviewedHeadSha : void 0;
|
|
1005
|
+
const reviewedAt = typeof item.reviewedAt === "string" && item.reviewedAt.length > 0 ? item.reviewedAt : void 0;
|
|
1006
|
+
const reviewedFiles = Array.isArray(item.reviewedFiles) && item.reviewedFiles.length > 0 ? item.reviewedFiles : void 0;
|
|
1007
|
+
const blockedReason = blockedProvenanceReasons.get(item.id);
|
|
1008
|
+
const needsRefinement = item.needsRefinement;
|
|
1009
|
+
return {
|
|
1010
|
+
id: item.id,
|
|
1011
|
+
kind: "backlog",
|
|
1012
|
+
title: item.title,
|
|
1013
|
+
priority: item.priority,
|
|
1014
|
+
status: item.status,
|
|
1015
|
+
filePath: path2.join("backlog", `${item.id}.md`),
|
|
1016
|
+
domain: item.domain ?? void 0,
|
|
1017
|
+
complexity: item.complexity ?? void 0,
|
|
1018
|
+
whyIncluded: `${statusLabel} backlog item${item.priority ? ` (${item.priority})` : ""}`,
|
|
1019
|
+
createdAt: item.createdAt ?? void 0,
|
|
1020
|
+
reviewedAt,
|
|
1021
|
+
reviewedHeadSha,
|
|
1022
|
+
reviewedFiles,
|
|
1023
|
+
isDuplicate,
|
|
1024
|
+
duplicateOf,
|
|
1025
|
+
blockedReason,
|
|
1026
|
+
blockedAnswerHint: blockedReason ? `poetic plan backlog execute ${item.id} --answer blockerId=value` : void 0,
|
|
1027
|
+
blockedByOpen: openBlockers && openBlockers.length > 0 ? openBlockers.map((b) => ({ id: b.id, title: b.title })) : void 0,
|
|
1028
|
+
needsRefinement
|
|
1029
|
+
};
|
|
1030
|
+
};
|
|
1031
|
+
for (const item of reviewedItems) {
|
|
1032
|
+
const candidate = processItem(item, "Reviewed");
|
|
1033
|
+
if (candidate) candidates.push(candidate);
|
|
1034
|
+
}
|
|
1035
|
+
for (const item of inboxItems) {
|
|
1036
|
+
const candidate = processItem(item, "Inbox");
|
|
1037
|
+
if (candidate) candidates.push(candidate);
|
|
1038
|
+
}
|
|
1039
|
+
if (options.includeFindings) {
|
|
1040
|
+
const policy = loadIssuePolicy(rootDir);
|
|
1041
|
+
try {
|
|
1042
|
+
const actionableFindings = await listFindings(rootDir, "open");
|
|
1043
|
+
const findingDir = getBucketPathByKind("finding", rootDir);
|
|
1044
|
+
const findingDirRel = path2.relative(rootDir, findingDir);
|
|
1045
|
+
for (const f of actionableFindings) {
|
|
1046
|
+
const priority = severityToPriority(f.severity, policy);
|
|
1047
|
+
candidates.push({
|
|
1048
|
+
id: f.id,
|
|
1049
|
+
kind: "finding",
|
|
1050
|
+
title: f.title,
|
|
1051
|
+
priority,
|
|
1052
|
+
status: f.status,
|
|
1053
|
+
filePath: path2.join(findingDirRel, `${f.id}.md`),
|
|
1054
|
+
whyIncluded: `${f.status} finding (${f.category}${f.severity ? `/${f.severity}` : ""})`
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
} catch {
|
|
1058
|
+
}
|
|
1059
|
+
try {
|
|
1060
|
+
const actionableIssues = [
|
|
1061
|
+
...await listIssues(rootDir, "open"),
|
|
1062
|
+
...await listIssues(rootDir, "claimed")
|
|
1063
|
+
];
|
|
1064
|
+
const issueDir = getBucketPathByKind("issue", rootDir);
|
|
1065
|
+
const issueDirRel = path2.relative(rootDir, issueDir);
|
|
1066
|
+
for (const issue of actionableIssues) {
|
|
1067
|
+
const priority = severityToPriority(issue.severity, policy);
|
|
1068
|
+
candidates.push({
|
|
1069
|
+
id: issue.id,
|
|
1070
|
+
kind: "issue",
|
|
1071
|
+
title: issue.title,
|
|
1072
|
+
priority,
|
|
1073
|
+
status: issue.status,
|
|
1074
|
+
filePath: path2.join(issueDirRel, `${issue.id}.md`),
|
|
1075
|
+
whyIncluded: `${issue.status} issue (${issue.category}/${issue.severity})`
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
} catch {
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
const includeDebt = requestedKinds.includes("debt");
|
|
1082
|
+
const includeParking = requestedKinds.includes("parking");
|
|
1083
|
+
if (includeDebt) {
|
|
1084
|
+
try {
|
|
1085
|
+
const debtDir = getBucketPathByKind("tech-debt", rootDir);
|
|
1086
|
+
const debtExists = await fs2.stat(debtDir).then(() => true).catch(() => false);
|
|
1087
|
+
if (debtExists) {
|
|
1088
|
+
const debtItems = await listAllDebtAsync(false, rootDir);
|
|
1089
|
+
const debtDirRel = path2.relative(rootDir, debtDir);
|
|
1090
|
+
for (const item of debtItems) {
|
|
1091
|
+
if (item.status === "completed") continue;
|
|
1092
|
+
candidates.push({
|
|
1093
|
+
id: item.id,
|
|
1094
|
+
kind: "debt",
|
|
1095
|
+
title: item.title,
|
|
1096
|
+
priority: null,
|
|
1097
|
+
status: item.status,
|
|
1098
|
+
filePath: path2.join(debtDirRel, `${item.id}.md`),
|
|
1099
|
+
domain: item.domain,
|
|
1100
|
+
complexity: item.estimatedComplexity,
|
|
1101
|
+
whyIncluded: `Tech debt (${item.severity}${item.blocking ? ", blocking" : ""})`,
|
|
1102
|
+
createdAt: item.createdAt ?? item.createdDate,
|
|
1103
|
+
severity: item.severity,
|
|
1104
|
+
blocking: item.blocking,
|
|
1105
|
+
effort: item.effort
|
|
1106
|
+
});
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
} catch {
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
if (includeParking) {
|
|
1113
|
+
try {
|
|
1114
|
+
const parkingDir = getBucketPathByKind("parking-lot", rootDir);
|
|
1115
|
+
const parkingExists = await fs2.stat(parkingDir).then(() => true).catch(() => false);
|
|
1116
|
+
if (parkingExists) {
|
|
1117
|
+
const parkingItems = await listActive(parkingDir);
|
|
1118
|
+
const parkingDirRel = path2.relative(rootDir, parkingDir);
|
|
1119
|
+
const now = /* @__PURE__ */ new Date();
|
|
1120
|
+
for (const item of parkingItems) {
|
|
1121
|
+
const isOverdue = typeof item.reconsiderDate === "string" && item.reconsiderDate.length > 0 ? new Date(item.reconsiderDate) <= now : false;
|
|
1122
|
+
candidates.push({
|
|
1123
|
+
id: item.id,
|
|
1124
|
+
kind: "parking",
|
|
1125
|
+
title: item.title,
|
|
1126
|
+
priority: null,
|
|
1127
|
+
status: item.status,
|
|
1128
|
+
filePath: path2.join(parkingDirRel, `${item.id}.md`),
|
|
1129
|
+
whyIncluded: `Parked item${isOverdue ? " (overdue for reconsideration)" : ""}`,
|
|
1130
|
+
createdAt: item.createdAt,
|
|
1131
|
+
deferralReason: item.deferralReason,
|
|
1132
|
+
reconsiderDate: item.reconsiderDate ?? null,
|
|
1133
|
+
isOverdue
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
} catch {
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
const isCrossEntity = requestedKinds.length > 0;
|
|
1141
|
+
const priorityOrder = { P0: 0, P1: 1, P2: 2, P3: 3 };
|
|
1142
|
+
const debtSeverityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
1143
|
+
function crossEntityBucket(c) {
|
|
1144
|
+
if (c.kind === "backlog" || c.kind === "task" || c.kind === "finding" || c.kind === "issue") {
|
|
1145
|
+
const p = c.priority ? priorityOrder[c.priority] ?? 4 : 4;
|
|
1146
|
+
return p <= 1 ? 0 : 3;
|
|
1147
|
+
}
|
|
1148
|
+
if (c.kind === "debt") {
|
|
1149
|
+
const sev = c.severity ?? "low";
|
|
1150
|
+
if ((sev === "critical" || sev === "high") && c.blocking) return 1;
|
|
1151
|
+
if (sev === "high") return 2;
|
|
1152
|
+
return 4;
|
|
1153
|
+
}
|
|
1154
|
+
return 5;
|
|
1155
|
+
}
|
|
1156
|
+
candidates.sort((a, b) => {
|
|
1157
|
+
if (isCrossEntity) {
|
|
1158
|
+
const aBucket = crossEntityBucket(a);
|
|
1159
|
+
const bBucket = crossEntityBucket(b);
|
|
1160
|
+
if (aBucket !== bBucket) return aBucket - bBucket;
|
|
1161
|
+
if (aBucket === 5) {
|
|
1162
|
+
const aDate = a.reconsiderDate ?? "9999-12-31";
|
|
1163
|
+
const bDate = b.reconsiderDate ?? "9999-12-31";
|
|
1164
|
+
if (aDate !== bDate) return aDate.localeCompare(bDate);
|
|
1165
|
+
return a.id.localeCompare(b.id);
|
|
1166
|
+
}
|
|
1167
|
+
if (aBucket === 1 || aBucket === 2 || aBucket === 4) {
|
|
1168
|
+
const aSev = debtSeverityOrder[a.severity ?? "low"] ?? 3;
|
|
1169
|
+
const bSev = debtSeverityOrder[b.severity ?? "low"] ?? 3;
|
|
1170
|
+
if (aSev !== bSev) return aSev - bSev;
|
|
1171
|
+
return a.id.localeCompare(b.id);
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
const aPriority = a.priority ? priorityOrder[a.priority] ?? 4 : 4;
|
|
1175
|
+
const bPriority = b.priority ? priorityOrder[b.priority] ?? 4 : 4;
|
|
1176
|
+
if (aPriority !== bPriority) return aPriority - bPriority;
|
|
1177
|
+
const statusOrder = { reviewed: 0, inbox: 1 };
|
|
1178
|
+
const aStatus = statusOrder[a.status] ?? 2;
|
|
1179
|
+
const bStatus = statusOrder[b.status] ?? 2;
|
|
1180
|
+
if (aStatus !== bStatus) return aStatus - bStatus;
|
|
1181
|
+
const aCreatedAt = a.createdAt ? Date.parse(a.createdAt) : Number.NaN;
|
|
1182
|
+
const bCreatedAt = b.createdAt ? Date.parse(b.createdAt) : Number.NaN;
|
|
1183
|
+
const aHasCreatedAt = Number.isFinite(aCreatedAt);
|
|
1184
|
+
const bHasCreatedAt = Number.isFinite(bCreatedAt);
|
|
1185
|
+
if (aHasCreatedAt && bHasCreatedAt && aCreatedAt !== bCreatedAt) {
|
|
1186
|
+
return aCreatedAt - bCreatedAt;
|
|
1187
|
+
}
|
|
1188
|
+
if (aHasCreatedAt !== bHasCreatedAt) {
|
|
1189
|
+
return aHasCreatedAt ? -1 : 1;
|
|
1190
|
+
}
|
|
1191
|
+
return a.id.localeCompare(b.id);
|
|
1192
|
+
});
|
|
1193
|
+
const limitedCandidates = options.limit ? candidates.slice(0, options.limit) : candidates;
|
|
1194
|
+
const candidatesWithSha = limitedCandidates.filter((c) => c.reviewedHeadSha);
|
|
1195
|
+
if (candidatesWithSha.length > 0) {
|
|
1196
|
+
const currentHead = await ensureHeadSha();
|
|
1197
|
+
if (currentHead) {
|
|
1198
|
+
for (const candidate of candidatesWithSha) {
|
|
1199
|
+
if (!candidate.reviewedHeadSha) continue;
|
|
1200
|
+
if (candidate.reviewedHeadSha === currentHead) {
|
|
1201
|
+
continue;
|
|
1202
|
+
}
|
|
1203
|
+
if (candidate.reviewedFiles && candidate.reviewedFiles.length > 0) {
|
|
1204
|
+
const changedFiles = await getChangedFiles(
|
|
1205
|
+
rootDir,
|
|
1206
|
+
candidate.reviewedHeadSha,
|
|
1207
|
+
currentHead,
|
|
1208
|
+
candidate.reviewedFiles
|
|
1209
|
+
);
|
|
1210
|
+
if (changedFiles.length > 0) {
|
|
1211
|
+
candidate.isStaleReview = true;
|
|
1212
|
+
candidate.staleReason = "files_changed";
|
|
1213
|
+
candidate.whyIncluded = `${candidate.whyIncluded} (needs re-review: ${changedFiles.length} file(s) changed)`;
|
|
1214
|
+
}
|
|
1215
|
+
} else {
|
|
1216
|
+
candidate.isStaleReview = true;
|
|
1217
|
+
candidate.staleReason = "head_changed";
|
|
1218
|
+
candidate.whyIncluded = `${candidate.whyIncluded} (needs re-review)`;
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
if (options.context) {
|
|
1224
|
+
for (const candidate of limitedCandidates) {
|
|
1225
|
+
if (candidate.kind !== "backlog") continue;
|
|
1226
|
+
try {
|
|
1227
|
+
const item = await findBacklogItem(backlogDir, candidate.id);
|
|
1228
|
+
if (item?.body) {
|
|
1229
|
+
candidate.bodyPreview = extractBodyPreview(item.body);
|
|
1230
|
+
const criteria = extractAcceptanceCriteria(item.body);
|
|
1231
|
+
if (criteria.length > 0) {
|
|
1232
|
+
candidate.acceptanceCriteria = criteria;
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
} catch {
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
return limitedCandidates;
|
|
1240
|
+
}
|
|
1241
|
+
function parseKindOption(raw) {
|
|
1242
|
+
if (!raw) return [];
|
|
1243
|
+
const validKinds = /* @__PURE__ */ new Set(["backlog", "debt", "parking", "all"]);
|
|
1244
|
+
const parts = raw.split(",").map((s) => s.trim().toLowerCase()).filter((s) => s.length > 0);
|
|
1245
|
+
const invalidKinds = parts.filter((kind) => !validKinds.has(kind));
|
|
1246
|
+
if (invalidKinds.length > 0) {
|
|
1247
|
+
throw new Error(`Unknown --kind value(s): ${invalidKinds.join(", ")}`);
|
|
1248
|
+
}
|
|
1249
|
+
if (parts.includes("all")) {
|
|
1250
|
+
return ["backlog", "debt", "parking"];
|
|
1251
|
+
}
|
|
1252
|
+
return [...new Set(parts)];
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
export {
|
|
1256
|
+
getDebtItemAsync,
|
|
1257
|
+
createDebtItemAsync,
|
|
1258
|
+
updateDebtItemAsync,
|
|
1259
|
+
listByBlockingAsync,
|
|
1260
|
+
listByParallelizableAsync,
|
|
1261
|
+
scheduleDebtAsync,
|
|
1262
|
+
completeDebtAsync,
|
|
1263
|
+
listAllDebtAsync,
|
|
1264
|
+
areNearDuplicates,
|
|
1265
|
+
extractBodyPreview,
|
|
1266
|
+
extractAcceptanceCriteria,
|
|
1267
|
+
queryNextItems,
|
|
1268
|
+
parseKindOption
|
|
1269
|
+
};
|
|
1270
|
+
//# sourceMappingURL=chunk-NRNE225N.js.map
|